
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/


!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).echarts={})}(this,function(t){"use strict";var i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function l(t,e){function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var h=function(){return(h=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function a(){for(var t=0,e=0,n=arguments.length;e<n;e++)t+=arguments[e].length;for(var i=Array(t),r=0,e=0;e<n;e++)for(var o=arguments[e],a=0,s=o.length;a<s;a++,r++)i[r]=o[a];return i}var e=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.weChat=!1},w=new function(){this.browser=new e,this.node=!1,this.wxa=!1,this.worker=!1,this.canvasSupported=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(w.wxa=!0,w.canvasSupported=!0,w.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?(w.worker=!0,w.canvasSupported=!0):"undefined"==typeof navigator?(w.node=!0,w.canvasSupported=!0,w.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),t=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1]);t&&(n.weChat=!0);e.canvasSupported=!!document.createElement("canvas").getContext,e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&11<=+n.version),e.domSupported="undefined"!=typeof document}(navigator.userAgent,w);var s={"[object Function]":!0,"[object RegExp]":!0,"[object Date]":!0,"[object Error]":!0,"[object CanvasGradient]":!0,"[object CanvasPattern]":!0,"[object Image]":!0,"[object Canvas]":!0},u={"[object Int8Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Int16Array]":!0,"[object Uint16Array]":!0,"[object Int32Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0},c=Object.prototype.toString,n=Array.prototype,p=n.forEach,d=n.filter,r=n.slice,f=n.map,o=function(){}.constructor,g=o?o.prototype:null,y={};function m(t,e){y[t]=e}var v=2311;function _(){return v++}function x(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];"undefined"!=typeof console&&console.error.apply(console,t)}function I(t){if(null==t||"object"!=typeof t)return t;var e=t,n=c.call(t);if("[object Array]"===n){if(!st(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=I(t[i])}}else if(u[n]){if(!st(t)){var o=t.constructor;if(o.from)e=o.from(t);else{e=new o(t.length);for(i=0,r=t.length;i<r;i++)e[i]=I(t[i])}}}else if(!s[n]&&!st(t)&&!Z(t))for(var a in e={},t)t.hasOwnProperty(a)&&(e[a]=I(t[a]));return e}function b(t,e,n){if(!U(e)||!U(t))return n?I(e):t;for(var i in e){var r,o;e.hasOwnProperty(i)&&(r=t[i],!U(o=e[i])||!U(r)||V(o)||V(r)||Z(o)||Z(r)||X(o)||X(r)||st(o)||st(r)?!n&&i in t||(t[i]=I(e[i])):b(r,o,n))}return t}function S(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=b(n,t[i],e);return n}function A(t,e){if(Object.assign)Object.assign(t,e);else for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function D(t,e,n){for(var i=N(e),r=0;r<i.length;r++){var o=i[r];(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}return t}var k=function(){return y.createCanvas()};function L(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function M(t,e){var n,i=t.prototype;function r(){}for(n in r.prototype=e.prototype,t.prototype=new r,i)i.hasOwnProperty(n)&&(t.prototype[n]=i[n]);(t.prototype.constructor=t).superClass=e}function T(t,e,n){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames)for(var i=Object.getOwnPropertyNames(e),r=0;r<i.length;r++){var o=i[r];"constructor"!==o&&(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}else D(t,e,n)}function P(t){return!!t&&("string"!=typeof t&&"number"==typeof t.length)}function E(t,e,n){if(t&&e)if(t.forEach&&t.forEach===p)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function O(t,e,n){if(!t)return[];if(!e)return et(t);if(t.map&&t.map===f)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}function C(t,e,n,i){if(t&&e){for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function R(t,e,n){if(!t)return[];if(!e)return et(t);if(t.filter&&t.filter===d)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}function N(t){if(!t)return[];if(Object.keys)return Object.keys(t);var e,n=[];for(e in t)t.hasOwnProperty(e)&&n.push(e);return n}y.createCanvas=function(){return document.createElement("canvas")};var z=g&&F(g.bind)?g.call.bind(g.bind):function(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return function(){return t.apply(e,n.concat(r.call(arguments)))}};function B(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return function(){return t.apply(this,e.concat(r.call(arguments)))}}function V(t){return Array.isArray?Array.isArray(t):"[object Array]"===c.call(t)}function F(t){return"function"==typeof t}function H(t){return"string"==typeof t}function G(t){return"[object String]"===c.call(t)}function W(t){return"number"==typeof t}function U(t){var e=typeof t;return"function"==e||!!t&&"object"==e}function X(t){return!!s[c.call(t)]}function Y(t){return!!u[c.call(t)]}function Z(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function j(t){return null!=t.colorStops}function q(t){return null!=t.image}function K(t){return"[object RegExp]"===c.call(t)}function $(t){return t!=t}function J(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(var n=0,i=t.length;n<i;n++)if(null!=t[n])return t[n]}function Q(t,e){return null!=t?t:e}function tt(t,e,n){return null!=t?t:null!=e?e:n}function et(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return r.apply(t,e)}function nt(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function it(t,e){if(!t)throw new Error(e)}function rt(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}var ot="__ec_primitive__";function at(t){t[ot]=!0}function st(t){return t[ot]}var lt=(ut.prototype.get=function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},ut.prototype.set=function(t,e){return this.data[t]=e},ut.prototype.each=function(t,e){for(var n in this.data)this.data.hasOwnProperty(n)&&t.call(e,this.data[n],n)},ut.prototype.keys=function(){return N(this.data)},ut.prototype.removeKey=function(t){delete this.data[t]},ut);function ut(t){this.data={};var n=V(t);this.data={};var i=this;function e(t,e){n?i.set(t,e):i.set(e,t)}t instanceof ut?t.each(e):t&&E(t,e)}function ht(t){return new lt(t)}function ct(t,e){var n=Object.create?Object.create(t):((n=function(){}).prototype=t,new n);return e&&A(n,e),n}function pt(t,e){return t.hasOwnProperty(e)}function dt(){}var ft=Object.freeze({__proto__:null,$override:m,guid:_,logError:x,clone:I,merge:b,mergeAll:S,extend:A,defaults:D,createCanvas:k,indexOf:L,inherits:M,mixin:T,isArrayLike:P,each:E,map:O,reduce:C,filter:R,find:function(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]},keys:N,bind:z,curry:B,isArray:V,isFunction:F,isString:H,isStringSafe:G,isNumber:W,isObject:U,isBuiltInObject:X,isTypedArray:Y,isDom:Z,isGradientObject:j,isPatternObject:q,isRegExp:K,eqNaN:$,retrieve:J,retrieve2:Q,retrieve3:tt,slice:et,normalizeCssArray:nt,assert:it,trim:rt,setAsPrimitive:at,isPrimitive:st,HashMap:lt,createHashMap:ht,concatArray:function(t,e){for(var n=new t.constructor(t.length+e.length),i=0;i<t.length;i++)n[i]=t[i];for(var r=t.length,i=0;i<e.length;i++)n[i+r]=e[i];return n},createObject:ct,hasOwn:pt,noop:dt});function gt(t,e){return null==t&&(t=0),null==e&&(e=0),[t,e]}function yt(t){return[t[0],t[1]]}function mt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function vt(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function _t(t){return Math.sqrt(xt(t))}function xt(t){return t[0]*t[0]+t[1]*t[1]}function bt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function wt(t,e){var n=_t(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function St(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var Mt=St;function Tt(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}var Ct=Tt;function It(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t}function At(t,e,n){var i=e[0],e=e[1];return t[0]=n[0]*i+n[2]*e+n[4],t[1]=n[1]*i+n[3]*e+n[5],t}function Dt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function kt(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}var Lt=Object.freeze({__proto__:null,create:gt,copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:yt,set:function(t,e,n){return t[0]=e,t[1]=n,t},add:mt,scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:vt,len:_t,length:_t,lenSquare:xt,lengthSquare:xt,mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:bt,normalize:wt,distance:St,dist:Mt,distanceSquare:Tt,distSquare:Ct,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:It,applyTransform:At,min:Dt,max:kt}),Pt=function(t,e){this.target=t,this.topTarget=e&&e.topTarget},Ot=(Rt.prototype._dragStart=function(t){for(var e=t.target;e&&!e.draggable;)e=e.parent;e&&((this._draggingTarget=e).dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.handler.dispatchToElement(new Pt(e,t),"dragstart",t.event))},Rt.prototype._drag=function(t){var e,n,i,r,o=this._draggingTarget;o&&(i=t.offsetX,r=t.offsetY,e=i-this._x,n=r-this._y,this._x=i,this._y=r,o.drift(e,n,t),this.handler.dispatchToElement(new Pt(o,t),"drag",t.event),i=this.handler.findHover(i,r,o).target,r=this._dropTarget,o!==(this._dropTarget=i)&&(r&&i!==r&&this.handler.dispatchToElement(new Pt(r,t),"dragleave",t.event),i&&i!==r&&this.handler.dispatchToElement(new Pt(i,t),"dragenter",t.event)))},Rt.prototype._dragEnd=function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.handler.dispatchToElement(new Pt(e,t),"dragend",t.event),this._dropTarget&&this.handler.dispatchToElement(new Pt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null},Rt);function Rt(t){(this.handler=t).on("mousedown",this._dragStart,this),t.on("mousemove",this._drag,this),t.on("mouseup",this._dragEnd,this)}var Et=(Nt.prototype.on=function(t,e,n,i){this._$handlers||(this._$handlers={});var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;var o=this._$eventProcessor;null!=e&&o&&o.normalizeQuery&&(e=o.normalizeQuery(e)),r[t]||(r[t]=[]);for(var a=0;a<r[t].length;a++)if(r[t][a].h===n)return this;o={h:n,query:e,ctx:i||this,callAtLast:n.zrEventfulCallAtLast},e=r[t].length-1,i=r[t][e];return i&&i.callAtLast?r[t].splice(e,0,o):r[t].push(o),this},Nt.prototype.isSilent=function(t){var e=this._$handlers;return!e||!e[t]||!e[t].length},Nt.prototype.off=function(t,e){var n=this._$handlers;if(!n)return this;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},Nt.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var o=e.length,a=i.length,s=0;s<a;s++){var l=i[s];if(!r||!r.filter||null==l.query||r.filter(t,l.query))switch(o){case 0:l.h.call(l.ctx);break;case 1:l.h.call(l.ctx,e[0]);break;case 2:l.h.call(l.ctx,e[0],e[1]);break;default:l.h.apply(l.ctx,e)}}return r&&r.afterTrigger&&r.afterTrigger(t),this},Nt.prototype.triggerWithContext=function(t){if(!this._$handlers)return this;var e=this._$handlers[t],n=this._$eventProcessor;if(e)for(var i=arguments,r=i.length,o=i[r-1],a=e.length,s=0;s<a;s++){var l=e[s];if(!n||!n.filter||null==l.query||n.filter(t,l.query))switch(r){case 0:l.h.call(o);break;case 1:l.h.call(o,i[0]);break;case 2:l.h.call(o,i[0],i[1]);break;default:l.h.apply(o,i.slice(1,r-1))}}return n&&n.afterTrigger&&n.afterTrigger(t),this},Nt);function Nt(t){t&&(this._$eventProcessor=t)}var zt=Math.log(2);function Bt(t,e,n,i,r,o){var a=i+"-"+r,s=t.length;if(o.hasOwnProperty(a))return o[a];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/zt);return t[n][l]}for(var u=i|1<<n,h=n+1;i&1<<h;)h++;for(var c=0,p=0,d=0;p<s;p++){var f=1<<p;f&r||(c+=(d%2?-1:1)*t[n][p]*Bt(t,e-1,h,u,r|f,o),d++)}return o[a]=c}function Vt(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=Bt(n,8,0,0,0,i);if(0!==r){for(var o=[],a=0;a<8;a++)for(var s=0;s<8;s++)null==o[s]&&(o[s]=0),o[s]+=((a+s)%2?-1:1)*Bt(n,7,0===a?1:0,1<<a,1<<s,i)/r*e[a];return function(t,e,n){var i=e*o[6]+n*o[7]+1;t[0]=(e*o[0]+n*o[1]+o[2])/i,t[1]=(e*o[3]+n*o[4]+o[5])/i}}}var Ft="___zrEVENTSAVED",Ht=[];function Gt(t,e,n,i,r){if(e.getBoundingClientRect&&w.domSupported&&!Wt(e)){var o=e[Ft]||(e[Ft]={}),r=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,h=h.top;a.push(p,h),l=l&&o&&p===o[c]&&h===o[1+c],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?Vt(s,a):Vt(a,s))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],o=0;o<4;o++){var a=document.createElement("div"),s=a.style,l=o%2,u=(o>>1)%2;s.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[l]+":0",r[u]+":0",i[1-l]+":auto",r[1-u]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,o),o,r);if(r)return r(t,n,i),!0}return!1}function Wt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Ut="undefined"!=typeof window&&!!window.addEventListener,Xt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Yt=[];function Zt(t,e,n,i){return n=n||{},i||!w.canvasSupported?jt(t,e,n):w.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):jt(t,e,n),n}function jt(t,e,n){if(w.domSupported&&t.getBoundingClientRect){var i=e.clientX,r=e.clientY;if(Wt(t)){e=t.getBoundingClientRect();return n.zrX=i-e.left,void(n.zrY=r-e.top)}if(Gt(Yt,t,i,r))return n.zrX=Yt[0],void(n.zrY=Yt[1])}n.zrX=n.zrY=0}function qt(t){return t||window.event}function Kt(t,e,n){if(null!=(e=qt(e)).zrX)return e;var i=e.type;i&&0<=i.indexOf("touch")?(i=("touchend"!==i?e.targetTouches:e.changedTouches)[0])&&Zt(t,i,e,n):(Zt(t,e,e,n),r=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,t=t.deltaY;return null!=n&&null!=t?3*(0!==t?Math.abs(t):Math.abs(n))*(0<t||!(t<0)&&0<n?-1:1):e}(e),e.zrDelta=r?r/120:-(e.detail||0)/3);var r=e.button;return null==e.which&&void 0!==r&&Xt.test(e.type)&&(e.which=1&r?1:2&r?3:4&r?2:0),e}function $t(t,e,n,i){Ut?t.addEventListener(e,n,i):t.attachEvent("on"+e,n)}var Jt=Ut?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Qt(t){return 2===t.which||3===t.which}var te=(ee.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},ee.prototype.clear=function(){return this._track.length=0,this},ee.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o<a;o++){var s=i[o],l=Zt(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},ee.prototype._recognize=function(t){for(var e in ie)if(ie.hasOwnProperty(e)){var n=ie[e](this._track,t);if(n)return n}},ee);function ee(){this._track=[]}function ne(t){var e=t[1][0]-t[0][0],t=t[1][1]-t[0][1];return Math.sqrt(e*e+t*t)}var ie={pinch:function(t,e){var n=t.length;if(n){var i=(t[n-1]||{}).points,n=(t[n-2]||{}).points||i;if(n&&1<n.length&&i&&1<i.length){n=ne(i)/ne(n);isFinite(n)||(n=1),e.pinchScale=n;i=[((i=i)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=i[0],e.pinchY=i[1],{type:"pinch",target:t[0].target,event:e}}}}},re="silent";function oe(){Jt(this.event)}var ae,se=(l(le,ae=Et),le.prototype.dispose=function(){},le.prototype.setCursor=function(){},le);function le(){var t=null!==ae&&ae.apply(this,arguments)||this;return t.handler=null,t}var ue,he=function(t,e){this.x=t,this.y=e},ce=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],pe=(l(de,ue=Et),de.prototype.setHandlerProxy=function(e){this.proxy&&this.proxy.dispose(),e&&(E(ce,function(t){e.on&&e.on(t,this[t],this)},this),e.handler=this),this.proxy=e},de.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=fe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);i=this._hovered=i?new he(e,n):this.findHover(e,n),e=i.target,n=this.proxy;n.setCursor&&n.setCursor(e?e.cursor:"default"),o&&e!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(i,"mousemove",t),e&&e!==o&&this.dispatchToElement(i,"mouseover",t)},de.prototype.mouseout=function(t){var e=t.zrEventControl,n=t.zrIsToLocalDOM;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&(n||this.trigger("globalout",{type:"globalout",event:t}))},de.prototype.resize=function(){this._hovered=new he(0,0)},de.prototype.dispatch=function(t,e){t=this[t];t&&t.call(this,e)},de.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},de.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},de.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o={type:e,event:n=n,target:(t=t).target,topTarget:t.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:oe};i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget||i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))}},de.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new he(t,e),o=i.length-1;0<=o;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=function(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}a=i.__hostTarget;i=a||i.parent}return!r||re}return!1}(i[o],t,e))&&(r.topTarget||(r.topTarget=i[o]),a!==re)){r.target=i[o];break}}return r},de.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new te);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);"end"===e&&n.clear(),i&&(n=i.type,t.gestureEvent=n,(t=new he).target=i.target,this.dispatchToElement(t,n,i.event))},de);function de(t,e,n,i){var r=ue.call(this)||this;return r._hovered=new he(0,0),r.storage=t,r.painter=e,r.painterRoot=i,n=n||new se,r.proxy=null,r.setHandlerProxy(n),r._draggingMgr=new Ot(r),r}function fe(t,e,n){t=t.painter;return e<0||e>t.getWidth()||n<0||n>t.getHeight()}function ge(){return[1,0,0,1,0,0]}function ye(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function me(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function ve(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],e=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=e,t}function _e(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function xe(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],e=Math.sin(n),n=Math.cos(n);return t[0]=i*n+a*e,t[1]=-i*e+a*n,t[2]=r*n+s*e,t[3]=-r*e+n*s,t[4]=n*o+e*l,t[5]=n*l-e*o,t}function be(t,e,n){var i=n[0],n=n[1];return t[0]=e[0]*i,t[1]=e[1]*n,t[2]=e[2]*i,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*n,t}function we(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],e=n*a-o*i;return e?(e=1/e,t[0]=a*e,t[1]=-o*e,t[2]=-i*e,t[3]=n*e,t[4]=(i*s-a*r)*e,t[5]=(o*r-n*s)*e,t):null}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(a){pe.prototype[a]=function(t){var e,n,i=t.zrX,r=t.zrY,o=fe(this,i,r);if("mouseup"===a&&o||(n=(e=this.findHover(i,r)).target),"mousedown"===a)this._downEl=n,this._downPoint=[t.zrX,t.zrY],this._upEl=n;else if("mouseup"===a)this._upEl=n;else if("click"===a){if(this._downEl!==this._upEl||!this._downPoint||4<Mt(this._downPoint,[t.zrX,t.zrY]))return;this._downPoint=null}this.dispatchToElement(e,a,t)}});var Se=Object.freeze({__proto__:null,create:ge,identity:ye,copy:me,mul:ve,translate:_e,rotate:xe,scale:be,invert:we,clone:function(t){var e=ge();return me(e,t),e}}),Me=ye;function Te(t){return 5e-5<t||t<-5e-5}var Ce=[],Ie=[],Ae=ge(),De=Math.abs,ke=(Le.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},Le.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},Le.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},Le.prototype.needLocalTransform=function(){return Te(this.rotation)||Te(this.x)||Te(this.y)||Te(this.scaleX-1)||Te(this.scaleY-1)},Le.prototype.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;n||e?(i=i||ge(),n?this.getLocalTransform(i):Me(i),e&&(n?ve(i,t.transform,i):me(i,t.transform)),this.transform=i,this._resolveGlobalScaleRatio(i)):i&&Me(i)},Le.prototype._resolveGlobalScaleRatio=function(t){var e,n,i=this.globalScaleRatio;null!=i&&1!==i&&(this.getGlobalScale(Ce),e=((Ce[0]-(n=Ce[0]<0?-1:1))*i+n)/Ce[0]||0,n=((Ce[1]-(n=Ce[1]<0?-1:1))*i+n)/Ce[1]||0,t[0]*=e,t[1]*=e,t[2]*=n,t[3]*=n),this.invTransform=this.invTransform||ge(),we(this.invTransform,t)},Le.prototype.getLocalTransform=function(t){return Le.getLocalTransform(this,t)},Le.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},Le.prototype.setLocalTransform=function(t){var e,n;t&&(e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],Te(e-1)&&(e=Math.sqrt(e)),Te(n-1)&&(n=Math.sqrt(n)),t[0]<0&&(e=-e),t[3]<0&&(n=-n),this.rotation=Math.atan2(-t[1]/n,t[0]/e),e<0&&n<0&&(this.rotation+=Math.PI,e=-e,n=-n),this.x=t[4],this.y=t[5],this.scaleX=e,this.scaleY=n)},Le.prototype.decomposeTransform=function(){var t,e,n;this.transform&&(n=this.parent,t=this.transform,n&&n.transform&&(ve(Ie,n.invTransform,t),t=Ie),e=this.originX,n=this.originY,(e||n)&&(Ae[4]=e,Ae[5]=n,ve(Ie,t,Ae),Ie[4]-=e,Ie[5]-=n,t=Ie),this.setLocalTransform(t))},Le.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1])):(t[0]=1,t[1]=1),t},Le.prototype.transformCoordToLocal=function(t,e){t=[t,e],e=this.invTransform;return e&&At(t,t,e),t},Le.prototype.transformCoordToGlobal=function(t,e){t=[t,e],e=this.transform;return e&&At(t,t,e),t},Le.prototype.getLineScale=function(){var t=this.transform;return t&&1e-10<De(t[0]-1)&&1e-10<De(t[3]-1)?Math.sqrt(De(t[0]*t[3]-t[2]*t[1])):1},Le.getLocalTransform=function(t,e){Me(e=e||[]);var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.rotation||0,s=t.x,t=t.y;return e[4]-=n,e[5]-=i,e[0]*=r,e[1]*=o,e[2]*=r,e[3]*=o,e[4]*=r,e[5]*=o,a&&xe(e,e,a),e[4]+=n,e[5]+=i,e[4]+=s,e[5]+=t,e},Le.initDefaultProps=((Yh=Le.prototype).x=0,Yh.y=0,Yh.scaleX=1,Yh.scaleY=1,Yh.originX=0,Yh.originY=0,Yh.rotation=0,void(Yh.globalScaleRatio=1)),Le);function Le(){}var Pe={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*--t)*Math.sin((t-e)*(2*Math.PI)/.4)))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*--t)*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*--t)*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){return t*t*(2.70158*t-1.70158)},backOut:function(t){return--t*t*(2.70158*t+1.70158)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((1+e)*t-e)*.5:.5*((t-=2)*t*((1+e)*t+e)+2)},bounceIn:function(t){return 1-Pe.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Pe.bounceIn(2*t):.5*Pe.bounceOut(2*t-1)+.5}},Oe=(Re.prototype.step=function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),!this._paused){var n=(t-this._startTime-this._pausedTime)/this._life;n<0&&(n=0),n=Math.min(n,1);var i=this.easing,i="string"==typeof i?Pe[i]:i,i="function"==typeof i?i(n):n;if(this.onframe&&this.onframe(i),1===n){if(!this.loop)return!0;this._restart(t),this.onrestart&&this.onrestart()}return!1}this._pausedTime+=e},Re.prototype._restart=function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0},Re.prototype.pause=function(){this._paused=!0},Re.prototype.resume=function(){this._paused=!1},Re);function Re(t){this._initialized=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var Ee=function(t){this.value=t},Ne=(ze.prototype.insert=function(t){t=new Ee(t);return this.insertEntry(t),t},ze.prototype.insertEntry=function(t){this.head?((this.tail.next=t).prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},ze.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},ze.prototype.len=function(){return this._len},ze.prototype.clear=function(){this.head=this.tail=null,this._len=0},ze);function ze(){this._len=0}var Be=(Ve.prototype.put=function(t,e){var n,i,r=this._list,o=this._map,a=null;return null==o[t]&&(i=r.len(),n=this._lastRemovedEntry,i>=this._maxSize&&0<i&&(i=r.head,r.remove(i),delete o[i.key],a=i.value,this._lastRemovedEntry=i),n?n.value=e:n=new Ee(e),n.key=t,r.insertEntry(n),o[t]=n),a},Ve.prototype.get=function(t){var e=this._map[t],t=this._list;if(null!=e)return e!==t.tail&&(t.remove(e),t.insertEntry(e)),e.value},Ve.prototype.clear=function(){this._list.clear(),this._map={}},Ve.prototype.len=function(){return this._list.len()},Ve);function Ve(t){this._list=new Ne,this._maxSize=10,this._map={},this._maxSize=t}var Fe={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function He(t){return(t=Math.round(t))<0?0:255<t?255:t}function Ge(t){return t<0?0:1<t?1:t}function We(t){return t.length&&"%"===t.charAt(t.length-1)?He(parseFloat(t)/100*255):He(parseInt(t,10))}function Ue(t){return t.length&&"%"===t.charAt(t.length-1)?Ge(parseFloat(t)/100):Ge(parseFloat(t))}function Xe(t,e,n){return n<0?n+=1:1<n&&--n,6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Ye(t,e,n){return t+(e-t)*n}function Ze(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function je(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var qe=new Be(20),Ke=null;function $e(t,e){Ke&&je(Ke,e),Ke=qe.put(t,Ke||e.slice())}function Je(t,e){if(t){e=e||[];var n=qe.get(t);if(n)return je(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Fe)return je(e,Fe[i]),$e(t,e),e;var r=i.length;if("#"===i.charAt(0))return 4===r||5===r?0<=(o=parseInt(i.slice(1,4),16))&&o<=4095?(Ze(e,(3840&o)>>4|(3840&o)>>8,240&o|(240&o)>>4,15&o|(15&o)<<4,5===r?parseInt(i.slice(4),16)/15:1),$e(t,e),e):void Ze(e,0,0,0,1):7===r||9===r?0<=(o=parseInt(i.slice(1,7),16))&&o<=16777215?(Ze(e,(16711680&o)>>16,(65280&o)>>8,255&o,9===r?parseInt(i.slice(7),16)/255:1),$e(t,e),e):void Ze(e,0,0,0,1):void 0;var n=i.indexOf("("),o=i.indexOf(")");if(-1!==n&&o+1===r){r=i.substr(0,n),o=i.substr(n+1,o-(n+1)).split(","),n=1;switch(r){case"rgba":if(4!==o.length)return 3===o.length?Ze(e,+o[0],+o[1],+o[2],1):Ze(e,0,0,0,1);n=Ue(o.pop());case"rgb":return 3!==o.length?void Ze(e,0,0,0,1):(Ze(e,We(o[0]),We(o[1]),We(o[2]),n),$e(t,e),e);case"hsla":return 4!==o.length?void Ze(e,0,0,0,1):(o[3]=Ue(o[3]),Qe(o,e),$e(t,e),e);case"hsl":return 3!==o.length?void Ze(e,0,0,0,1):(Qe(o,e),$e(t,e),e);default:return}}Ze(e,0,0,0,1)}}function Qe(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Ue(t[1]),r=Ue(t[2]),i=r<=.5?r*(i+1):r+i-r*i,r=2*r-i;return Ze(e=e||[],He(255*Xe(r,i,n+1/3)),He(255*Xe(r,i,n)),He(255*Xe(r,i,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function tn(t,e){var n=Je(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,255<n[i]?n[i]=255:n[i]<0&&(n[i]=0);return an(n,4===n.length?"rgba":"rgb")}}function en(t){t=Je(t);if(t)return((1<<24)+(t[0]<<16)+(t[1]<<8)+ +t[2]).toString(16).slice(1)}function nn(t,e,n){if(e&&e.length&&0<=t&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),t=e[r],o=e[o],r=i-r;return n[0]=He(Ye(t[0],o[0],r)),n[1]=He(Ye(t[1],o[1],r)),n[2]=He(Ye(t[2],o[2],r)),n[3]=Ge(Ye(t[3],o[3],r)),n}}function rn(t,e,n){if(e&&e.length&&0<=t&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=Je(e[r]),t=Je(e[o]),e=i-r,e=an([He(Ye(a[0],t[0],e)),He(Ye(a[1],t[1],e)),He(Ye(a[2],t[2],e)),Ge(Ye(a[3],t[3],e))],"rgba");return n?{color:e,leftIndex:r,rightIndex:o,value:i}:e}}function on(t,e){t=Je(t);if(t&&null!=e)return t[3]=Ge(e),an(t,"rgba")}function an(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function sn(t,e){t=Je(t);return t?(.299*t[0]+.587*t[1]+.114*t[2])*t[3]/255+(1-t[3])*e:0}var ln=Object.freeze({__proto__:null,parse:Je,lift:tn,toHex:en,fastLerp:nn,fastMapToColor:nn,lerp:rn,mapToColor:rn,modifyHSL:function(t,e,n,i){var r=Je(t);if(t)return r=function(t){if(t){var e,n,i,r=t[0]/255,o=t[1]/255,a=t[2]/255,s=Math.min(r,o,a),l=Math.max(r,o,a),u=l-s,h=(l+s)/2;0==u?n=e=0:(n=h<.5?u/(l+s):u/(2-l-s),i=((l-r)/6+u/2)/u,s=((l-o)/6+u/2)/u,u=((l-a)/6+u/2)/u,r===l?e=u-s:o===l?e=1/3+i-u:a===l&&(e=2/3+s-i),e<0&&(e+=1),1<e&&--e);h=[360*e,n,h];return null!=t[3]&&h.push(t[3]),h}}(r),null!=e&&(r[0]=(e=e,(e=Math.round(e))<0?0:360<e?360:e)),null!=n&&(r[1]=Ue(n)),null!=i&&(r[2]=Ue(i)),an(Qe(r),"rgba")},modifyAlpha:on,stringify:an,lum:sn,random:function(){return"rgb("+Math.round(255*Math.random())+","+Math.round(255*Math.random())+","+Math.round(255*Math.random())+")"}}),un=Array.prototype.slice;function hn(t,e,n){return(e-t)*n+t}function cn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=hn(e[o],n[o],i)}function pn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=e[o]+n[o]*i;return t}function dn(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=e[a][s]+n[a][s]*i}return t}function fn(t,e){var n=t.length;if(n===e.length){for(var i=0;i<n;i++)if(t[i]!==e[i])return;return 1}}function gn(t,e,n,i,r,o,a){t=.5*(n-t),i=.5*(i-e);return(2*(e-n)+t+i)*a+(-3*(e-n)-2*t-i)*o+t*r+e}function yn(t,e,n,i,r,o,a,s){for(var l=e.length,u=0;u<l;u++)t[u]=gn(e[u],n[u],i[u],r[u],o,a,s)}function mn(t){if(P(t)){var e=t.length;if(P(t[0])){for(var n=[],i=0;i<e;i++)n.push(un.call(t[i]));return n}return un.call(t)}return t}function vn(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}var _n=[0,0,0,0],xn=(bn.prototype.isFinished=function(){return this._finished},bn.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},bn.prototype.needsAnimate=function(){return!this._isAllValueEqual&&2<=this.keyframes.length&&this.interpolable},bn.prototype.getAdditiveTrack=function(){return this._additiveTrack},bn.prototype.addKeyframe=function(t,e){t>=this.maxTime?this.maxTime=t:this._needsSort=!0;var n=this.keyframes,i=n.length;if(this.interpolable)if(P(e)){var r,o=P((o=e)&&o[0])?2:1;if(0<i&&this.arrDim!==o)return void(this.interpolable=!1);if(1==o&&"number"!=typeof e[0]||2==o&&"number"!=typeof e[0][0])return void(this.interpolable=!1);0<i&&(r=n[i-1],this._isAllValueEqual&&(1==o&&fn(e,r.value)||(this._isAllValueEqual=!1))),this.arrDim=o}else{if(0<this.arrDim)return void(this.interpolable=!1);if("string"==typeof e){o=Je(e);o?(e=o,this.isValueColor=!0):this.interpolable=!1}else if("number"!=typeof e)return void(this.interpolable=!1);this._isAllValueEqual&&0<i&&(r=n[i-1],(this.isValueColor&&!fn(r.value,e)||r.value!==e)&&(this._isAllValueEqual=!1))}e={time:t,value:e,percent:0};return this.keyframes.push(e),e},bn.prototype.prepare=function(t){var e=this.keyframes;this._needsSort&&e.sort(function(t,e){return t.time-e.time});for(var n=this.arrDim,i=e.length,r=e[i-1],o=0;o<i;o++)e[o].percent=e[o].time/this.maxTime,0<n&&o!==i-1&&function(t,e,n){var i=t,r=e;if(i.push&&r.push){var e=i.length,o=r.length;if(e!==o)if(o<e)i.length=o;else for(var a=e;a<o;a++)i.push(1===n?r[a]:un.call(r[a]));for(var s=i[0]&&i[0].length,a=0;a<i.length;a++)if(1===n)isNaN(i[a])&&(i[a]=r[a]);else for(var l=0;l<s;l++)isNaN(i[a][l])&&(i[a][l]=r[a][l])}}(e[o].value,r.value,n);if(t&&this.needsAnimate()&&t.needsAnimate()&&n===t.arrDim&&this.isValueColor===t.isValueColor&&!t._finished){this._additiveTrack=t;for(var a=e[0].value,o=0;o<i;o++)0===n?this.isValueColor?e[o].additiveValue=pn([],e[o].value,a,-1):e[o].additiveValue=e[o].value-a:1===n?e[o].additiveValue=pn([],e[o].value,a,-1):2===n&&(e[o].additiveValue=dn([],e[o].value,a,-1))}},bn.prototype.step=function(t,e){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var n=null!=this._additiveTrack,i=n?"additiveValue":"value",r=this.keyframes,o=this.keyframes.length,a=this.propName,s=this.arrDim,l=this.isValueColor;if(e<0)u=0;else if(e<this._lastFramePercent){for(var u=Math.min(this._lastFrame+1,o-1);0<=u&&!(r[u].percent<=e);u--);u=Math.min(u,o-2)}else{for(u=this._lastFrame;u<o&&!(r[u].percent>e);u++);u=Math.min(u-1,o-2)}var h,c,p,d,f,g,y,m=r[u+1],v=r[u];v&&m&&(this._lastFrame=u,this._lastFramePercent=e,0!=(g=m.percent-v.percent)&&(h=(e-v.percent)/g,c=n?this._additiveValue:l?_n:t[a],(0<s||l)&&!c&&(c=this._additiveValue=[]),this.useSpline?(p=r[u][i],d=r[0===u?u:u-1][i],f=r[o-2<u?o-1:u+1][i],g=r[o-3<u?o-1:u+2][i],0<s?(1===s?yn:function(t,e,n,i,r,o,a,s){for(var l=e.length,u=e[0].length,h=0;h<l;h++){t[h]||(t[1]=[]);for(var c=0;c<u;c++)t[h][c]=gn(e[h][c],n[h][c],i[h][c],r[h][c],o,a,s)}})(c,d,p,f,g,h,h*h,h*h*h):l?(yn(c,d,p,f,g,h,h*h,h*h*h),n||(t[a]=vn(c))):(y=void 0,y=this.interpolable?gn(d,p,f,g,h,h*h,h*h*h):f,n?this._additiveValue=y:t[a]=y)):0<s?(1===s?cn:function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=hn(e[a][s],n[a][s],i)}})(c,v[i],m[i],h):l?(cn(c,v[i],m[i],h),n||(t[a]=vn(c))):(y=void 0,y=this.interpolable?hn(v[i],m[i],h):(v=v[i],i=m[i],.5<h?i:v),n?this._additiveValue=y:t[a]=y),n&&this._addToTarget(t)))}},bn.prototype._addToTarget=function(t){var e=this.arrDim,n=this.propName,i=this._additiveValue;0===e?this.isValueColor?(Je(t[n],_n),pn(_n,_n,i,1),t[n]=vn(_n)):t[n]=t[n]+i:1===e?pn(t[n],t[n],i,1):2===e&&dn(t[n],t[n],i,1)},bn);function bn(t){this.keyframes=[],this.maxTime=0,this.arrDim=0,this.interpolable=!0,this._needsSort=!1,this._isAllValueEqual=!0,this._lastFrame=0,this._lastFramePercent=0,this.propName=t}var wn=(Sn.prototype.getTarget=function(){return this._target},Sn.prototype.changeTarget=function(t){this._target=t},Sn.prototype.when=function(t,e){return this.whenWithKeys(t,e,N(e))},Sn.prototype.whenWithKeys=function(t,e,n){for(var i=this._tracks,r=0;r<n.length;r++){var o=n[r],a=i[o];if(!a){a=i[o]=new xn(o);var s,l=void 0,u=this._getAdditiveTrack(o);if(u?(l=(s=u.keyframes[u.keyframes.length-1])&&s.value,u.isValueColor&&l&&(l=vn(l))):l=this._target[o],null==l)continue;0!==t&&a.addKeyframe(0,mn(l)),this._trackKeys.push(o)}a.addKeyframe(t,mn(e[o]))}return this._maxTime=Math.max(this._maxTime,t),this},Sn.prototype.pause=function(){this._clip.pause(),this._paused=!0},Sn.prototype.resume=function(){this._clip.resume(),this._paused=!1},Sn.prototype.isPaused=function(){return!!this._paused},Sn.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneList;if(t)for(var e=t.length,n=0;n<e;n++)t[n].call(this)},Sn.prototype._abortedCallback=function(){this._setTracksFinished();var t=this.animation,e=this._abortedList;if(t&&t.removeClip(this._clip),this._clip=null,e)for(var n=0;n<e.length;n++)e[n].call(this)},Sn.prototype._setTracksFinished=function(){for(var t=this._tracks,e=this._trackKeys,n=0;n<e.length;n++)t[e[n]].setFinished()},Sn.prototype._getAdditiveTrack=function(t){var e,n=this._additiveAnimators;if(n)for(var i=0;i<n.length;i++){var r=n[i].getTrack(t);r&&(e=r)}return e},Sn.prototype.start=function(t,e){if(!(0<this._started)){this._started=1;for(var o=this,a=[],n=0;n<this._trackKeys.length;n++){var i=this._trackKeys[n],r=this._tracks[i],s=this._getAdditiveTrack(i),i=r.keyframes;r.prepare(s),r.needsAnimate()?a.push(r):r.interpolable||(i=i[i.length-1])&&(o._target[r.propName]=i.value)}return a.length||e?(e=new Oe({life:this._maxTime,loop:this._loop,delay:this._delay,onframe:function(t){o._started=2;var e=o._additiveAnimators;if(e){for(var n=!1,i=0;i<e.length;i++)if(e[i]._clip){n=!0;break}n||(o._additiveAnimators=null)}for(i=0;i<a.length;i++)a[i].step(o._target,t);var r=o._onframeList;if(r)for(i=0;i<r.length;i++)r[i](o._target,t)},ondestroy:function(){o._doneCallback()}}),this._clip=e,this.animation&&this.animation.addClip(e),t&&"spline"!==t&&(e.easing=t)):this._doneCallback(),this}},Sn.prototype.stop=function(t){var e;this._clip&&(e=this._clip,t&&e.onframe(1),this._abortedCallback())},Sn.prototype.delay=function(t){return this._delay=t,this},Sn.prototype.during=function(t){return t&&(this._onframeList||(this._onframeList=[]),this._onframeList.push(t)),this},Sn.prototype.done=function(t){return t&&(this._doneList||(this._doneList=[]),this._doneList.push(t)),this},Sn.prototype.aborted=function(t){return t&&(this._abortedList||(this._abortedList=[]),this._abortedList.push(t)),this},Sn.prototype.getClip=function(){return this._clip},Sn.prototype.getTrack=function(t){return this._tracks[t]},Sn.prototype.stopTracks=function(t,e){if(!t.length||!this._clip)return!0;for(var n=this._tracks,i=this._trackKeys,r=0;r<t.length;r++){var o=n[t[r]];o&&(e?o.step(this._target,1):1===this._started&&o.step(this._target,0),o.setFinished())}for(var a=!0,r=0;r<i.length;r++)if(!n[i[r]].isFinished()){a=!1;break}return a&&this._abortedCallback(),a},Sn.prototype.saveFinalToTarget=function(t,e){if(t){e=e||this._trackKeys;for(var n=0;n<e.length;n++){var i,r=e[n],o=this._tracks[r];o&&!o.isFinished()&&((i=(i=o.keyframes)[i.length-1])&&(i=mn(i.value),o.isValueColor&&(i=vn(i)),t[r]=i))}}},Sn.prototype.__changeFinalValue=function(t,e){e=e||N(t);for(var n=0;n<e.length;n++){var i,r=e[n],o=this._tracks[r];o&&(1<(i=o.keyframes).length&&(i=i.pop(),o.addKeyframe(i.time,t[r]),o.prepare(o.getAdditiveTrack())))}},Sn);function Sn(t,e,n){this._tracks={},this._trackKeys=[],this._delay=0,this._maxTime=0,this._paused=!1,this._started=0,this._clip=null,this._target=t,(this._loop=e)&&n?x("Can' use additive animation on looped animation."):this._additiveAnimators=n}var Mn=(Tn.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},Tn.prototype.clone=function(){return new Tn(this.x,this.y)},Tn.prototype.set=function(t,e){return this.x=t,this.y=e,this},Tn.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},Tn.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},Tn.prototype.scale=function(t){this.x*=t,this.y*=t},Tn.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},Tn.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},Tn.prototype.dot=function(t){return this.x*t.x+this.y*t.y},Tn.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},Tn.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},Tn.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},Tn.prototype.distance=function(t){var e=this.x-t.x,t=this.y-t.y;return Math.sqrt(e*e+t*t)},Tn.prototype.distanceSquare=function(t){var e=this.x-t.x,t=this.y-t.y;return e*e+t*t},Tn.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},Tn.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},Tn.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},Tn.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},Tn.set=function(t,e,n){t.x=e,t.y=n},Tn.copy=function(t,e){t.x=e.x,t.y=e.y},Tn.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},Tn.lenSquare=function(t){return t.x*t.x+t.y*t.y},Tn.dot=function(t,e){return t.x*e.x+t.y*e.y},Tn.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},Tn.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},Tn.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},Tn.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},Tn.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},Tn);function Tn(t,e){this.x=t||0,this.y=e||0}var Cn=Math.min,In=Math.max,An=new Mn,Dn=new Mn,kn=new Mn,Ln=new Mn,Pn=new Mn,On=new Mn,Rn=(En.prototype.union=function(t){var e=Cn(t.x,this.x),n=Cn(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=In(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=In(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},En.prototype.applyTransform=function(t){En.applyTransform(this,this,t)},En.prototype.calculateTransform=function(t){var e=t.width/this.width,n=t.height/this.height,i=ge();return _e(i,i,[-this.x,-this.y]),be(i,i,[e,n]),_e(i,i,[t.x,t.y]),i},En.prototype.intersect=function(t,e){if(!t)return!1;t instanceof En||(t=En.create(t));var n,i,r,o,a,s,l=this,u=l.x,h=l.x+l.width,c=l.y,p=l.y+l.height,d=t.x,f=t.x+t.width,g=t.y,y=t.y+t.height,m=!(h<d||f<u||p<g||y<c);return e&&(n=1/0,i=0,r=Math.abs(h-d),o=Math.abs(f-u),a=Math.abs(p-g),s=Math.abs(y-c),l=Math.min(r,o),t=Math.min(a,s),h<d||f<u?i<l&&(i=l,r<o?Mn.set(On,-r,0):Mn.set(On,o,0)):l<n&&(n=l,r<o?Mn.set(Pn,r,0):Mn.set(Pn,-o,0)),p<g||y<c?i<t&&(i=t,a<s?Mn.set(On,0,-a):Mn.set(On,0,s)):l<n&&(n=l,a<s?Mn.set(Pn,0,a):Mn.set(Pn,0,-s))),e&&Mn.copy(e,m?Pn:On),m},En.prototype.contain=function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},En.prototype.clone=function(){return new En(this.x,this.y,this.width,this.height)},En.prototype.copy=function(t){En.copy(this,t)},En.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},En.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},En.prototype.isZero=function(){return 0===this.width||0===this.height},En.create=function(t){return new En(t.x,t.y,t.width,t.height)},En.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},En.applyTransform=function(t,e,n){if(n){if(n[1]<1e-5&&-1e-5<n[1]&&n[2]<1e-5&&-1e-5<n[2]){var i=n[0],r=n[3],o=n[4],a=n[5];return t.x=e.x*i+o,t.y=e.y*r+a,t.width=e.width*i,t.height=e.height*r,t.width<0&&(t.x+=t.width,t.width=-t.width),void(t.height<0&&(t.y+=t.height,t.height=-t.height))}An.x=kn.x=e.x,An.y=Ln.y=e.y,Dn.x=Ln.x=e.x+e.width,Dn.y=kn.y=e.y+e.height,An.transform(n),Ln.transform(n),Dn.transform(n),kn.transform(n),t.x=Cn(An.x,Dn.x,kn.x,Ln.x),t.y=Cn(An.y,Dn.y,kn.y,Ln.y);r=In(An.x,Dn.x,kn.x,Ln.x),n=In(An.y,Dn.y,kn.y,Ln.y);t.width=r-t.x,t.height=n-t.y}else t!==e&&En.copy(t,e)},En);function En(t,e,n,i){n<0&&isFinite(n)&&(t+=n,n=-n),i<0&&isFinite(i)&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}var Nn,zn,Bn={},Vn="12px sans-serif";var Fn={measureText:function(t,e){return Nn=Nn||k().getContext("2d"),zn!==e&&(zn=Nn.font=e||Vn),Nn.measureText(t)}};function Hn(t,e){var n=Bn[e=e||Vn],i=(n=n||(Bn[e]=new Be(500))).get(t);return null==i&&(i=Fn.measureText(t,e).width,n.put(t,i)),i}function Gn(t,e,n,i){t=Hn(t,e),e=Yn(e),n=Un(0,t,n),i=Xn(0,e,i);return new Rn(n,i,t,e)}function Wn(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return Gn(r[0],e,n,i);for(var o=new Rn(0,0,0,0),a=0;a<r.length;a++){var s=Gn(r[a],e,n,i);0===a?o.copy(s):o.union(s)}return o}function Un(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function Xn(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function Yn(t){return Hn("国",t)}function Zn(t,e){return"string"==typeof t?0<=t.lastIndexOf("%")?parseFloat(t)/100*e:parseFloat(t):t}function jn(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",e="top";if(i instanceof Array)l+=Zn(i[0],n.width),u+=Zn(i[1],n.height),e=h=null;else switch(i){case"left":l-=r,u+=s,h="right",e="middle";break;case"right":l+=r+a,u+=s,e="middle";break;case"top":l+=a/2,u-=r,h="center",e="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",e="middle";break;case"insideLeft":l+=r,u+=s,e="middle";break;case"insideRight":l+=a-r,u+=s,h="right",e="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",e="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,e="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",e="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=e,t}var qn=1;"undefined"!=typeof window&&(qn=Math.max(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Kn=qn,$n="#333",Jn="#ccc",Qn="__zr_normal__",ti=["x","y","scaleX","scaleY","originX","originY","rotation","ignore"],ei={x:!0,y:!0,scaleX:!0,scaleY:!0,originX:!0,originY:!0,rotation:!0,ignore:!1},ni={},ii=new Rn(0,0,0,0),ri=(oi.prototype._init=function(t){this.attr(t)},oi.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;(i=i||(this.transform=[1,0,0,1,0,0]))[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},oi.prototype.beforeUpdate=function(){},oi.prototype.afterUpdate=function(){},oi.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},oi.prototype.updateInnerText=function(t){var e,n,i,r,o,a,s,l,u,h,c=this._textContent;!c||c.ignore&&!t||(this.textConfig||(this.textConfig={}),a=(e=this.textConfig).local,i=n=void 0,r=!1,(u=c.attachedTransform).parent=a?this:null,l=!1,u.x=c.x,u.y=c.y,u.originX=c.originX,u.originY=c.originY,u.rotation=c.rotation,u.scaleX=c.scaleX,u.scaleY=c.scaleY,null!=e.position&&(s=ii,e.layoutRect?s.copy(e.layoutRect):s.copy(this.getBoundingRect()),a||s.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(ni,e,s):jn(ni,e,s),u.x=ni.x,u.y=ni.y,n=ni.align,i=ni.verticalAlign,(o=e.origin)&&null!=e.rotation&&(h=t=void 0,h="center"===o?(t=.5*s.width,.5*s.height):(t=Zn(o[0],s.width),Zn(o[1],s.height)),l=!0,u.originX=-u.x+t+(a?0:s.x),u.originY=-u.y+h+(a?0:s.y))),null!=e.rotation&&(u.rotation=e.rotation),(h=e.offset)&&(u.x+=h[0],u.y+=h[1],l||(u.originX=-h[0],u.originY=-h[1])),a=null==e.inside?"string"==typeof e.position&&0<=e.position.indexOf("inside"):e.inside,s=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),h=u=l=void 0,a&&this.canBeInsideText()?(l=e.insideFill,u=e.insideStroke,null!=l&&"auto"!==l||(l=this.getInsideTextFill()),null!=u&&"auto"!==u||(u=this.getInsideTextStroke(l),h=!0)):(l=e.outsideFill,u=e.outsideStroke,null!=l&&"auto"!==l||(l=this.getOutsideFill()),null!=u&&"auto"!==u||(u=this.getOutsideStroke(l),h=!0)),(l=l||"#000")===s.fill&&u===s.stroke&&h===s.autoStroke&&n===s.align&&i===s.verticalAlign||(r=!0,s.fill=l,s.stroke=u,s.autoStroke=h,s.align=n,s.verticalAlign=i,c.setDefaultTextStyle(s)),r&&c.dirtyStyle(),c.markRedraw())},oi.prototype.canBeInsideText=function(){return!0},oi.prototype.getInsideTextFill=function(){return"#fff"},oi.prototype.getInsideTextStroke=function(t){return"#000"},oi.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Jn:$n},oi.prototype.getOutsideStroke=function(t){for(var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&Je(e),i=(n=n||[255,255,255,1])[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,an(n,"rgba")},oi.prototype.traverse=function(t,e){},oi.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},oi.prototype.hide=function(){this.ignore=!0,this.markRedraw()},oi.prototype.show=function(){this.ignore=!1,this.markRedraw()},oi.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(U(t))for(var n=N(t),i=0;i<n.length;i++){var r=n[i];this.attrKV(r,t[r])}return this.markRedraw(),this},oi.prototype.saveCurrentToNormalState=function(t){this._innerSaveToNormal(t);for(var e=this._normalState,n=0;n<this.animators.length;n++){var i=this.animators[n],r=i.__fromStateTransition;r&&r!==Qn||(r=(r=i.targetName)?e[r]:e,i.saveFinalToTarget(r))}},oi.prototype._innerSaveToNormal=function(t){var e=(e=this._normalState)||(this._normalState={});t.textConfig&&!e.textConfig&&(e.textConfig=this.textConfig),this._savePrimaryToNormal(t,e,ti)},oi.prototype._savePrimaryToNormal=function(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null==t[r]||r in e||(e[r]=this[r])}},oi.prototype.hasState=function(){return 0<this.currentStates.length},oi.prototype.getState=function(t){return this.states[t]},oi.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},oi.prototype.clearStates=function(t){this.useState(Qn,!1,t)},oi.prototype.useState=function(t,e,n){var i=t===Qn;if(this.hasState()||!i){var r,o=this.currentStates,a=this.stateTransition;if(!(0<=L(o,t))||!e&&1!==o.length){if(this.stateProxy&&!i&&(r=this.stateProxy(t)),(r=r||this.states&&this.states[t])||i){i||this.saveCurrentToNormalState(r);o=!(!r||!r.hoverLayer);return o&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,r,this._normalState,e,!n&&!this.__inHover&&a&&0<a.duration,a),this._textContent&&this._textContent.useState(t,e),this._textGuide&&this._textGuide.useState(t,e),i?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!o&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~oi.REDARAW_BIT),r}x("State "+t+" not exists.")}}},oi.prototype.useStates=function(t,e){if(t.length){var n=[],i=this.currentStates,r=t.length,o=r===i.length;if(o)for(var a=0;a<r;a++)if(t[a]!==i[a]){o=!1;break}if(!o){for(a=0;a<r;a++){var s=t[a],l=void 0;this.stateProxy&&(l=this.stateProxy(s,t)),(l=l||this.states[s])&&n.push(l)}var u=!(!n[r-1]||!n[r-1].hoverLayer);u&&this._toggleHoverLayerFlag(!0);var h=this._mergeStates(n),c=this.stateTransition;this.saveCurrentToNormalState(h),this._applyStateObj(t.join(","),h,this._normalState,!1,!e&&!this.__inHover&&c&&0<c.duration,c),this._textContent&&this._textContent.useStates(t),this._textGuide&&this._textGuide.useStates(t),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!u&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~oi.REDARAW_BIT)}}else this.clearStates()},oi.prototype._updateAnimationTargets=function(){for(var t=0;t<this.animators.length;t++){var e=this.animators[t];e.targetName&&e.changeTarget(this[e.targetName])}},oi.prototype.removeState=function(t){var e=L(this.currentStates,t);0<=e&&((t=this.currentStates.slice()).splice(e,1),this.useStates(t))},oi.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=L(i,t),t=0<=L(i,e);0<=r?t?i.splice(r,1):i[r]=e:n&&!t&&i.push(e),this.useStates(i)},oi.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},oi.prototype._mergeStates=function(t){for(var e,n={},i=0;i<t.length;i++){var r=t[i];A(n,r),r.textConfig&&A(e=e||{},r.textConfig)}return e&&(n.textConfig=e),n},oi.prototype._applyStateObj=function(t,e,n,i,r,o){var a=!(e&&i);e&&e.textConfig?(this.textConfig=A({},(i?this:n).textConfig),A(this.textConfig,e.textConfig)):a&&n.textConfig&&(this.textConfig=n.textConfig);for(var s={},l=!1,u=0;u<ti.length;u++){var h=ti[u],c=r&&ei[h];e&&null!=e[h]?c?(l=!0,s[h]=e[h]):this[h]=e[h]:a&&null!=n[h]&&(c?(l=!0,s[h]=n[h]):this[h]=n[h])}if(!r)for(u=0;u<this.animators.length;u++){var p=this.animators[u],d=p.targetName;p.__changeFinalValue(d?(e||n)[d]:e||n)}l&&this._transitionState(t,s,o)},oi.prototype._attachComponent=function(t){if(t.__zr&&!t.__hostTarget)throw new Error("Text element has been added to zrender.");if(t===this)throw new Error("Recursive component attachment.");var e=this.__zr;e&&t.addSelfToZr(e),t.__zr=e,t.__hostTarget=this},oi.prototype._detachComponent=function(t){t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__hostTarget=null},oi.prototype.getClipPath=function(){return this._clipPath},oi.prototype.setClipPath=function(t){this._clipPath&&this._clipPath!==t&&this.removeClipPath(),this._attachComponent(t),this._clipPath=t,this.markRedraw()},oi.prototype.removeClipPath=function(){var t=this._clipPath;t&&(this._detachComponent(t),this._clipPath=null,this.markRedraw())},oi.prototype.getTextContent=function(){return this._textContent},oi.prototype.setTextContent=function(t){var e=this._textContent;if(e!==t){if(e&&e!==t&&this.removeTextContent(),t.__zr&&!t.__hostTarget)throw new Error("Text element has been added to zrender.");t.attachedTransform=new ke,this._attachComponent(t),this._textContent=t,this.markRedraw()}},oi.prototype.setTextConfig=function(t){this.textConfig||(this.textConfig={}),A(this.textConfig,t),this.markRedraw()},oi.prototype.removeTextContent=function(){var t=this._textContent;t&&(t.attachedTransform=null,this._detachComponent(t),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},oi.prototype.getTextGuideLine=function(){return this._textGuide},oi.prototype.setTextGuideLine=function(t){this._textGuide&&this._textGuide!==t&&this.removeTextGuideLine(),this._attachComponent(t),this._textGuide=t,this.markRedraw()},oi.prototype.removeTextGuideLine=function(){var t=this._textGuide;t&&(this._detachComponent(t),this._textGuide=null,this.markRedraw())},oi.prototype.markRedraw=function(){this.__dirty|=oi.REDARAW_BIT;var t=this.__zr;t&&(this.__inHover?t.refreshHover():t.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},oi.prototype.dirty=function(){this.markRedraw()},oi.prototype._toggleHoverLayerFlag=function(t){this.__inHover=t;var e=this._textContent,n=this._textGuide;e&&(e.__inHover=t),n&&(n.__inHover=t)},oi.prototype.addSelfToZr=function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this._clipPath&&this._clipPath.addSelfToZr(t),this._textContent&&this._textContent.addSelfToZr(t),this._textGuide&&this._textGuide.addSelfToZr(t)},oi.prototype.removeSelfFromZr=function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this._clipPath&&this._clipPath.removeSelfFromZr(t),this._textContent&&this._textContent.removeSelfFromZr(t),this._textGuide&&this._textGuide.removeSelfFromZr(t)},oi.prototype.animate=function(t,e){var n=t?this[t]:this;if(n){e=new wn(n,e);return this.addAnimator(e,t),e}x('Property "'+t+'" is not existed in element '+this.id)},oi.prototype.addAnimator=function(n,t){var e=this.__zr,i=this;n.during(function(){i.updateDuringAnimation(t)}).done(function(){var t=i.animators,e=L(t,n);0<=e&&t.splice(e,1)}),this.animators.push(n),e&&e.animation.addAnimator(n),e&&e.wakeUp()},oi.prototype.updateDuringAnimation=function(t){this.markRedraw()},oi.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o<i;o++){var a=n[o];t&&t!==a.scope?r.push(a):a.stop(e)}return this.animators=r,this},oi.prototype.animateTo=function(t,e,n){ai(this,t,e,n)},oi.prototype.animateFrom=function(t,e,n){ai(this,t,e,n,!0)},oi.prototype._transitionState=function(t,e,n,i){for(var r=ai(this,e,n,i),o=0;o<r.length;o++)r[o].__fromStateTransition=t},oi.prototype.getBoundingRect=function(){return null},oi.prototype.getPaintRect=function(){return null},oi.REDARAW_BIT=1,oi.initDefaultProps=function(){var t=oi.prototype;t.type="element",t.name="",t.ignore=!1,t.silent=!1,t.isGroup=!1,t.draggable=!1,t.dragging=!1,t.ignoreClip=!1,t.__inHover=!1,t.__dirty=oi.REDARAW_BIT;var i={};function a(t,e,n){i[t+e+n]||(console.warn("DEPRECATED: '"+t+"' has been deprecated. use '"+e+"', '"+n+"' instead"),i[t+e+n]=!0)}function e(e,n,i,r){function o(e,t){Object.defineProperty(t,0,{get:function(){return e[i]},set:function(t){e[i]=t}}),Object.defineProperty(t,1,{get:function(){return e[r]},set:function(t){e[r]=t}})}Object.defineProperty(t,e,{get:function(){var t;return a(e,i,r),this[n]||(t=this[n]=[],o(this,t)),this[n]},set:function(t){a(e,i,r),this[i]=t[0],this[r]=t[1],this[n]=t,o(this,t)}})}Object.defineProperty&&(!w.browser.ie||8<w.browser.version)&&(e("position","_legacyPos","x","y"),e("scale","_legacyScale","scaleX","scaleY"),e("origin","_legacyOrigin","originX","originY"))}(),oi);function oi(t){this.id=v++,this.animators=[],this.currentStates=[],this.states={},this._init(t)}function ai(t,e,n,i,r){var o=[];!function t(e,n,i,r,o,a,s,l){var u=[];var h=[];var c=N(r);var p=o.duration;var d=o.delay;var f=o.additive;var g=o.setToFinal;var y=!U(a);for(var m=0;m<c.length;m++){var v=c[m];null!=i[v]&&null!=r[v]&&(y||a[v])?U(r[v])&&!P(r[v])?n?l||(i[v]=r[v],e.updateDuringAnimation(n)):t(e,v,i[v],r[v],o,a&&a[v],s,l):(u.push(v),h.push(v)):l||(i[v]=r[v],e.updateDuringAnimation(n),h.push(v))}var _=u.length;if(0<_||o.force&&!s.length){for(var x=e.animators,b=[],w=0;w<x.length;w++)x[w].targetName===n&&b.push(x[w]);if(!f&&b.length)for(var w=0;w<b.length;w++){var S=b[w].stopTracks(h);S&&(S=L(x,b[w]),x.splice(S,1))}var M=void 0,T=void 0,C=void 0;if(l){T={},g&&(M={});for(var w=0;w<_;w++){var v=u[w];T[v]=i[v],g?M[v]=r[v]:i[v]=r[v]}}else if(g){C={};for(var w=0;w<_;w++){var v=u[w];C[v]=mn(i[v]),li(i,r,v)}}var f=new wn(i,!1,f?b:null);f.targetName=n,o.scope&&(f.scope=o.scope),g&&M&&f.whenWithKeys(0,M,u),C&&f.whenWithKeys(0,C,u),f.whenWithKeys(null==p?500:p,l?T:r,u).delay(d||0),e.addAnimator(f,n),s.push(f)}}(t,"",t,e,n=n||{},i,o,r);function a(){u=!0,--l<=0&&(u?h&&h():c&&c())}function s(){--l<=0&&(u?h&&h():c&&c())}var l=o.length,u=!1,h=n.done,c=n.aborted;l||h&&h(),0<o.length&&n.during&&o[0].during(function(t,e){n.during(e)});for(var p=0;p<o.length;p++){var d=o[p];d.done(a),d.aborted(s),d.start(n.easing,n.force)}return o}function si(t,e,n){for(var i=0;i<n;i++)t[i]=e[i]}function li(t,e,n){if(P(e[n]))if(P(t[n])||(t[n]=[]),Y(e[n])){var i=e[n].length;t[n].length!==i&&(t[n]=new e[n].constructor(i),si(t[n],e[n],i))}else{var r=e[n],o=t[n],a=r.length;if(P(r[0]))for(var s=r[0].length,l=0;l<a;l++)o[l]?si(o[l],r[l],s):o[l]=Array.prototype.slice.call(r[l]);else si(o,r,a);o.length=r.length}else t[n]=e[n]}T(ri,Et),T(ri,ke);var ui=32,hi=7;function ci(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&0<=i(t[r],t[r-1]);)r++;return r-e}function pi(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)r(a,t[o=s+l>>>1])<0?l=o:s=1+o;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0<u;)t[s+u]=t[s+u-1],u--}t[s]=a}}function di(t,e,n,i,r,o){var a=0,s=0,l=1;if(0<o(t,e[n+r])){for(s=i-r;l<s&&0<o(t,e[n+r+l]);)(l=1+((a=l)<<1))<=0&&(l=s);s<l&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)(l=1+((a=l)<<1))<=0&&(l=s);s<l&&(l=s);i=a,a=r-l,l=r-i}for(a++;a<l;){var u=a+(l-a>>>1);0<o(t,e[n+u])?a=u+1:l=u}return l}function fi(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)(l=1+((a=l)<<1))<=0&&(l=s);s<l&&(l=s);var u=a,a=r-l,l=r-u}else{for(s=i-r;l<s&&0<=o(t,e[n+r+l]);)(l=1+((a=l)<<1))<=0&&(l=s);s<l&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function gi(f,g){var o,a,y=hi,s=0,m=(f.length,[]);function e(t){var e=o[t],n=a[t],i=o[t+1],r=a[t+1];a[t]=n+r,t===s-3&&(o[t+1]=o[t+2],a[t+1]=a[t+2]),s--;t=fi(f[i],f,e,n,0,g);e+=t,0!=(n-=t)&&0!==(r=di(f[e+n-1],f,i,r,r-1,g))&&(n<=r?function(t,e,n,i){var r=0;for(r=0;r<e;r++)m[r]=f[t+r];var o=0,a=n,s=t;if(f[s++]=f[a++],0==--i){for(r=0;r<e;r++)f[s+r]=m[o+r];return}if(1===e){for(r=0;r<i;r++)f[s+r]=f[a+r];return f[s+i]=m[o]}var l,u,h,c=y;for(;;){u=l=0,h=!1;do{if(g(f[a],m[o])<0){if(f[s++]=f[a++],u++,(l=0)==--i){h=!0;break}}else if(f[s++]=m[o++],l++,u=0,1==--e){h=!0;break}}while((l|u)<c);if(h)break;do{if(0!==(l=fi(f[a],m,o,e,0,g))){for(r=0;r<l;r++)f[s+r]=m[o+r];if(s+=l,o+=l,(e-=l)<=1){h=!0;break}}if(f[s++]=f[a++],0==--i){h=!0;break}if(0!==(u=di(m[o],f,a,i,0,g))){for(r=0;r<u;r++)f[s+r]=f[a+r];if(s+=u,a+=u,0===(i-=u)){h=!0;break}}if(f[s++]=m[o++],1==--e){h=!0;break}}while(c--,hi<=l||hi<=u);if(h)break;c<0&&(c=0),c+=2}if((y=c)<1&&(y=1),1===e){for(r=0;r<i;r++)f[s+r]=f[a+r];f[s+i]=m[o]}else{if(0===e)throw new Error;for(r=0;r<e;r++)f[s+r]=m[o+r]}}:function(t,e,n,i){var r=0;for(r=0;r<i;r++)m[r]=f[n+r];var o=t+e-1,a=i-1,s=n+i-1,l=0,u=0;if(f[s--]=f[o--],0==--e){for(l=s-(i-1),r=0;r<i;r++)f[l+r]=m[r];return}if(1===i){for(u=(s-=e)+1,l=(o-=e)+1,r=e-1;0<=r;r--)f[u+r]=f[l+r];return f[s]=m[a]}var h=y;for(;;){var c=0,p=0,d=!1;do{if(g(m[a],f[o])<0){if(f[s--]=f[o--],c++,(p=0)==--e){d=!0;break}}else if(f[s--]=m[a--],p++,c=0,1==--i){d=!0;break}}while((c|p)<h);if(d)break;do{if(0!==(c=e-fi(m[a],f,t,e,e-1,g))){for(e-=c,u=(s-=c)+1,l=(o-=c)+1,r=c-1;0<=r;r--)f[u+r]=f[l+r];if(0===e){d=!0;break}}if(f[s--]=m[a--],1==--i){d=!0;break}if(0!==(p=i-di(f[o],m,0,i,i-1,g))){for(i-=p,u=(s-=p)+1,l=(a-=p)+1,r=0;r<p;r++)f[u+r]=m[l+r];if(i<=1){d=!0;break}}if(f[s--]=f[o--],0==--e){d=!0;break}}while(h--,hi<=c||hi<=p);if(d)break;h<0&&(h=0),h+=2}(y=h)<1&&(y=1);if(1===i){for(u=(s-=e)+1,l=(o-=e)+1,r=e-1;0<=r;r--)f[u+r]=f[l+r];f[s]=m[a]}else{if(0===i)throw new Error;for(l=s-(i-1),r=0;r<i;r++)f[l+r]=m[r]}})(e,n,i,r)}return o=[],a=[],{mergeRuns:function(){for(;1<s;){var t=s-2;if(1<=t&&a[t-1]<=a[t]+a[t+1]||2<=t&&a[t-2]<=a[t]+a[t-1])a[t-1]<a[t+1]&&t--;else if(a[t]>a[t+1])break;e(t)}},forceMergeRuns:function(){for(;1<s;){var t=s-2;0<t&&a[t-1]<a[t+1]&&t--,e(t)}},pushRun:function(t,e){o[s]=t,a[s]=e,s+=1}}}function yi(t,e,n,i){n=n||0;var r=(i=i||t.length)-n;if(!(r<2)){var o=0;if(r<ui)pi(t,n,i,n+(o=ci(t,n,i,e)),e);else{var a,s=gi(t,e),l=function(t){for(var e=0;ui<=t;)e|=1&t,t>>=1;return t+e}(r);do{}while((o=ci(t,n,i,e))<l&&(l<(a=r)&&(a=l),pi(t,n,n+a,n+o,e),o=a),s.pushRun(n,o),s.mergeRuns(),n+=o,0!==(r-=o));s.forceMergeRuns()}}}var mi=!1;function vi(){mi||(mi=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function _i(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var xi=(bi.prototype.traverse=function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},bi.prototype.getDisplayList=function(t,e){e=e||!1;var n=this._displayList;return!t&&n.length||this.updateDisplayList(e),n},bi.prototype.updateDisplayList=function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,w.canvasSupported&&yi(n,_i)},bi.prototype._updateAndAddDisplayable=function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.getClipPath();if(t.ignoreClip)e=null;else if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),r=(o=r).getClipPath()}if(t.childrenRef){for(var a=t.childrenRef(),s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty|=ri.REDARAW_BIT),this._updateAndAddDisplayable(l,e,n)}t.__dirty=0}else{var u=t;e&&e.length?u.__clipPaths=e:u.__clipPaths&&0<u.__clipPaths.length&&(u.__clipPaths=[]),isNaN(u.z)&&(vi(),u.z=0),isNaN(u.z2)&&(vi(),u.z2=0),isNaN(u.zlevel)&&(vi(),u.zlevel=0),this._displayList[this._displayListLen++]=u}u=t.getDecalElement&&t.getDecalElement();u&&this._updateAndAddDisplayable(u,e,n);u=t.getTextGuideLine();u&&this._updateAndAddDisplayable(u,e,n);u=t.getTextContent();u&&this._updateAndAddDisplayable(u,e,n)}},bi.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},bi.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var i=L(this._roots,t);0<=i&&this._roots.splice(i,1)}},bi.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},bi.prototype.getRoots=function(){return this._roots},bi.prototype.dispose=function(){this._displayList=null,this._roots=null},bi);function bi(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=_i}var wi,Si="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Mi=(l(Ti,wi=Et),Ti.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._clipsHead?((this._clipsTail.next=t).prev=this._clipsTail,t.next=null,this._clipsTail=t):this._clipsHead=this._clipsTail=t,t.animation=this},Ti.prototype.addAnimator=function(t){t.animation=this;t=t.getClip();t&&this.addClip(t)},Ti.prototype.removeClip=function(t){var e,n;t.animation&&(e=t.prev,n=t.next,e?e.next=n:this._clipsHead=n,n?n.prev=e:this._clipsTail=e,t.next=t.prev=t.animation=null)},Ti.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},Ti.prototype.update=function(t){for(var e=(new Date).getTime()-this._pausedTime,n=e-this._time,i=this._clipsHead;i;)var r=i.next,i=(i.step(e,n)&&(i.ondestroy&&i.ondestroy(),this.removeClip(i)),r);this._time=e,t||(this.onframe(n),this.trigger("frame",n),this.stage.update&&this.stage.update())},Ti.prototype._startLoop=function(){var e=this;this._running=!0,Si(function t(){e._running&&(Si(t),e._paused||e.update())})},Ti.prototype.start=function(){this._running||(this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop())},Ti.prototype.stop=function(){this._running=!1},Ti.prototype.pause=function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},Ti.prototype.resume=function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},Ti.prototype.clear=function(){for(var t=this._clipsHead;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._clipsHead=this._clipsTail=null},Ti.prototype.isFinished=function(){return null==this._clipsHead},Ti.prototype.animate=function(t,e){e=e||{},this.start();e=new wn(t,e.loop);return this.addAnimator(e),e},Ti);function Ti(t){var e=wi.call(this)||this;return e._running=!1,e._time=0,e._pausedTime=0,e._pauseStart=0,e._paused=!1,t=t||{},e.stage=t.stage||{},e.onframe=t.onframe||function(){},e}var Ci,Ii=w.domSupported,Ai=(Ci={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:Tc=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:O(Tc,function(t){var e=t.replace("mouse","pointer");return Ci.hasOwnProperty(e)?e:t})}),Di=["mousemove","mouseup"],ki=["pointermove","pointerup"],Li=!1;function Pi(t){t=t.pointerType;return"pen"===t||"touch"===t}function Oi(t){t&&(t.zrByTouch=!0)}function Ri(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var Ei=function(t,e){this.stopPropagation=dt,this.stopImmediatePropagation=dt,this.preventDefault=dt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},Ni={mousedown:function(t){t=Kt(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=Kt(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=Kt(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){var e;t.target===this.dom&&(t=Kt(this.dom,t),this.__pointerCapturing&&(t.zrEventControl="no_globalout"),e=t.toElement||t.relatedTarget,t.zrIsToLocalDOM=Ri(this,e),this.trigger("mouseout",t))},wheel:function(t){Li=!0,t=Kt(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){Li||(t=Kt(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){Oi(t=Kt(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),Ni.mousemove.call(this,t),Ni.mousedown.call(this,t)},touchmove:function(t){Oi(t=Kt(this.dom,t)),this.handler.processGesture(t,"change"),Ni.mousemove.call(this,t)},touchend:function(t){Oi(t=Kt(this.dom,t)),this.handler.processGesture(t,"end"),Ni.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&Ni.click.call(this,t)},pointerdown:function(t){Ni.mousedown.call(this,t)},pointermove:function(t){Pi(t)||Ni.mousemove.call(this,t)},pointerup:function(t){Ni.mouseup.call(this,t)},pointerout:function(t){Pi(t)||Ni.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],function(e){Ni[e]=function(t){t=Kt(this.dom,t),this.trigger(e,t)}});var zi={pointermove:function(t){Pi(t)||zi.mousemove.call(this,t)},pointerup:function(t){zi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function Bi(i,r){var o=r.domHandlers;w.pointerEventsSupported?E(Ai.pointer,function(e){Fi(r,e,function(t){o[e].call(i,t)})}):(w.touchEventsSupported&&E(Ai.touch,function(n){Fi(r,n,function(t){var e;o[n].call(i,t),(e=r).touching=!0,null!=e.touchTimer&&(clearTimeout(e.touchTimer),e.touchTimer=null),e.touchTimer=setTimeout(function(){e.touching=!1,e.touchTimer=null},700)})}),E(Ai.mouse,function(e){Fi(r,e,function(t){t=qt(t),r.touching||o[e].call(i,t)})}))}function Vi(r,o){function t(i){Fi(o,i,function(t){var e,n;t=qt(t),Ri(r,t.target)||(n=t,t=Kt((e=r).dom,new Ei(e,n),!0),o.domHandlers[i].call(r,t))},{capture:!0})}w.pointerEventsSupported?E(ki,t):w.touchEventsSupported||E(Di,t)}function Fi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,$t(t.domTarget,e,n,i)}function Hi(t){var e,n,i,r,o,a=t.mounted;for(e in a)a.hasOwnProperty(e)&&(n=t.domTarget,r=a[i=e],o=t.listenerOpts[e],Ut?n.removeEventListener(i,r,o):n.detachEvent("on"+i,r));t.mounted={}}var Gi,Wi=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ui=(l(Xi,Gi=Et),Xi.prototype.dispose=function(){Hi(this._localHandlerScope),Ii&&Hi(this._globalHandlerScope)},Xi.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},Xi.prototype.__togglePointerCapture=function(t){var e;this.__mayPointerCapture=null,Ii&&+this.__pointerCapturing^+t&&(this.__pointerCapturing=t,e=this._globalHandlerScope,t?Vi(this,e):Hi(e))},Xi);function Xi(t,e){var n=Gi.call(this)||this;return n.__pointerCapturing=!1,n.dom=t,n.painterRoot=e,n._localHandlerScope=new Wi(t,Ni),Ii&&(n._globalHandlerScope=new Wi(document,zi)),Bi(n,n._localHandlerScope),n}var Yi="__zr_style_"+Math.round(10*Math.random()),Zi={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ji={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};Zi[Yi]=!0;var qi,Ki=["z","z2","invisible"],$i=(l(Ji,qi=ri),Ji.prototype._init=function(t){for(var e=N(t),n=0;n<e.length;n++){var i=e[n];"style"===i?this.useStyle(t[i]):qi.prototype.attrKV.call(this,i,t[i])}this.style||this.useStyle({})},Ji.prototype.beforeBrush=function(){},Ji.prototype.afterBrush=function(){},Ji.prototype.innerBeforeBrush=function(){},Ji.prototype.innerAfterBrush=function(){},Ji.prototype.shouldBePainted=function(t,e,n,i){var r=this.transform;if(this.ignore||this.invisible||0===this.style.opacity||this.culling&&function(t,e,n){Qi.copy(t.getBoundingRect()),t.transform&&Qi.applyTransform(t.transform);return tr.width=e,tr.height=n,!Qi.intersect(tr)}(this,t,e)||r&&!r[0]&&!r[3])return!1;if(n&&this.__clipPaths)for(var o=0;o<this.__clipPaths.length;++o)if(this.__clipPaths[o].isZeroArea())return!1;if(i&&this.parent)for(var a=this.parent;a;){if(a.ignore)return!1;a=a.parent}return!0},Ji.prototype.contain=function(t,e){return this.rectContain(t,e)},Ji.prototype.traverse=function(t,e){t.call(e,this)},Ji.prototype.rectContain=function(t,e){e=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(e[0],e[1])},Ji.prototype.getPaintRect=function(){var t,e,n,i,r,o=this._paintRect;return this._paintRect&&!this.__dirty||(t=this.transform,e=this.getBoundingRect(),r=(i=this.style).shadowBlur||0,n=i.shadowOffsetX||0,i=i.shadowOffsetY||0,o=this._paintRect||(this._paintRect=new Rn(0,0,0,0)),t?Rn.applyTransform(o,e,t):o.copy(e),(r||n||i)&&(o.width+=2*r+Math.abs(n),o.height+=2*r+Math.abs(i),o.x=Math.min(o.x,o.x+n-r),o.y=Math.min(o.y,o.y+i-r)),r=this.dirtyRectTolerance,o.isZero()||(o.x=Math.floor(o.x-r),o.y=Math.floor(o.y-r),o.width=Math.ceil(o.width+1+2*r),o.height=Math.ceil(o.height+1+2*r))),o},Ji.prototype.setPrevPaintRect=function(t){t?(this._prevPaintRect=this._prevPaintRect||new Rn(0,0,0,0),this._prevPaintRect.copy(t)):this._prevPaintRect=null},Ji.prototype.getPrevPaintRect=function(){return this._prevPaintRect},Ji.prototype.animateStyle=function(t){return this.animate("style",t)},Ji.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():this.markRedraw()},Ji.prototype.attrKV=function(t,e){"style"!==t?qi.prototype.attrKV.call(this,t,e):this.style?this.setStyle(e):this.useStyle(e)},Ji.prototype.setStyle=function(t,e){return"string"==typeof t?this.style[t]=e:A(this.style,t),this.dirtyStyle(),this},Ji.prototype.dirtyStyle=function(){this.markRedraw(),this.__dirty|=Ji.STYLE_CHANGED_BIT,this._rect&&(this._rect=null)},Ji.prototype.dirty=function(){this.dirtyStyle()},Ji.prototype.styleChanged=function(){return!!(this.__dirty&Ji.STYLE_CHANGED_BIT)},Ji.prototype.styleUpdated=function(){this.__dirty&=~Ji.STYLE_CHANGED_BIT},Ji.prototype.createStyle=function(t){return ct(Zi,t)},Ji.prototype.useStyle=function(t){t[Yi]||(t=this.createStyle(t)),this.__inHover?this.__hoverStyle=t:this.style=t,this.dirtyStyle()},Ji.prototype.isStyleObject=function(t){return t[Yi]},Ji.prototype._innerSaveToNormal=function(t){qi.prototype._innerSaveToNormal.call(this,t);var e=this._normalState;t.style&&!e.style&&(e.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(t,e,Ki)},Ji.prototype._applyStateObj=function(t,e,n,i,r,o){qi.prototype._applyStateObj.call(this,t,e,n,i,r,o);var a,s=!(e&&i);if(e&&e.style?r?i?a=e.style:(a=this._mergeStyle(this.createStyle(),n.style),this._mergeStyle(a,e.style)):(a=this._mergeStyle(this.createStyle(),(i?this:n).style),this._mergeStyle(a,e.style)):s&&(a=n.style),a)if(r){var l=this.style;if(this.style=this.createStyle(s?{}:l),s)for(var u=N(l),h=0;h<u.length;h++){(p=u[h])in a&&(a[p]=a[p],this.style[p]=l[p])}for(var c=N(a),h=0;h<c.length;h++){var p=c[h];this.style[p]=this.style[p]}this._transitionState(t,{style:a},o,this.getAnimationStyleProps())}else this.useStyle(a);for(h=0;h<Ki.length;h++){p=Ki[h];e&&null!=e[p]?this[p]=e[p]:s&&null!=n[p]&&(this[p]=n[p])}},Ji.prototype._mergeStates=function(t){for(var e,n=qi.prototype._mergeStates.call(this,t),i=0;i<t.length;i++){var r=t[i];r.style&&(e=e||{},this._mergeStyle(e,r.style))}return e&&(n.style=e),n},Ji.prototype._mergeStyle=function(t,e){return A(t,e),t},Ji.prototype.getAnimationStyleProps=function(){return ji},Ji.STYLE_CHANGED_BIT=2,Ji.initDefaultProps=((Ic=Ji.prototype).type="displayable",Ic.invisible=!1,Ic.z=0,Ic.z2=0,Ic.zlevel=0,Ic.culling=!1,Ic.cursor="pointer",Ic.rectHover=!1,Ic.incremental=!1,Ic._rect=null,Ic.dirtyRectTolerance=0,void(Ic.__dirty=ri.REDARAW_BIT|Ji.STYLE_CHANGED_BIT)),Ji);function Ji(t){return qi.call(this,t)||this}var Qi=new Rn(0,0,0,0),tr=new Rn(0,0,0,0);var er=Math.pow,nr=Math.sqrt,ir=1e-8,rr=1e-4,or=nr(3),ar=1/3,sr=gt(),lr=gt(),ur=gt();function hr(t){return-ir<t&&t<ir}function cr(t){return ir<t||t<-ir}function pr(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function dr(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function fr(t,e,n,i,r,o){var a,s,l,u=i+3*(e-n)-t,h=3*(n-2*e+t),i=3*(e-t),n=t-r,e=h*h-3*u*i,t=h*i-9*u*n,r=i*i-3*h*n,n=0;return hr(e)&&hr(t)?hr(h)?o[0]=0:0<=(s=-i/h)&&s<=1&&(o[n++]=s):hr(i=t*t-4*e*r)?(l=-(r=t/e)/2,0<=(s=-h/u+r)&&s<=1&&(o[n++]=s),0<=l&&l<=1&&(o[n++]=l)):0<i?(a=e*h+1.5*u*(-t-(i=nr(i))),0<=(s=(-h-((i=(i=e*h+1.5*u*(-t+i))<0?-er(-i,ar):er(i,ar))+(a=a<0?-er(-a,ar):er(a,ar))))/(3*u))&&s<=1&&(o[n++]=s)):(a=(2*e*h-3*u*t)/(2*nr(e*e*e)),t=Math.acos(a)/3,s=(-h-2*(a=nr(e))*(e=Math.cos(t)))/(3*u),l=(-h+a*(e+or*Math.sin(t)))/(3*u),u=(-h+a*(e-or*Math.sin(t)))/(3*u),0<=s&&s<=1&&(o[n++]=s),0<=l&&l<=1&&(o[n++]=l),0<=u&&u<=1&&(o[n++]=u)),n}function gr(t,e,n,i,r){var o,a=6*n-12*e+6*t,i=9*e+3*i-3*t-9*n,n=3*e-3*t,e=0;return hr(i)?cr(a)&&0<=(o=-n/a)&&o<=1&&(r[e++]=o):hr(t=a*a-4*i*n)?r[0]=-a/(2*i):0<t&&(t=(-a-(n=nr(t)))/(2*i),0<=(o=(-a+n)/(2*i))&&o<=1&&(r[e++]=o),0<=t&&t<=1&&(r[e++]=t)),e}function yr(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,e=(i-n)*r+n,n=(s-a)*r+a,s=(e-s)*r+s,r=(s-n)*r+n;o[0]=t,o[1]=a,o[2]=n,o[3]=r,o[4]=r,o[5]=s,o[6]=e,o[7]=i}function mr(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g=.005,y=1/0;sr[0]=l,sr[1]=u;for(var m=0;m<1;m+=.05)lr[0]=pr(t,n,r,a,m),lr[1]=pr(e,i,o,s,m),(d=Ct(sr,lr))<y&&(c=m,y=d);y=1/0;for(var v=0;v<32&&!(g<rr);v++)f=c-g,p=c+g,lr[0]=pr(t,n,r,a,f),lr[1]=pr(e,i,o,s,f),d=Ct(lr,sr),0<=f&&d<y?(c=f,y=d):(ur[0]=pr(t,n,r,a,p),ur[1]=pr(e,i,o,s,p),f=Ct(ur,sr),p<=1&&f<y?(c=p,y=f):g*=.5);return h&&(h[0]=pr(t,n,r,a,c),h[1]=pr(e,i,o,s,c)),nr(y)}function vr(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function _r(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function xr(t,e,n){n=t+n-2*e;return 0==n?.5:(t-e)/n}function br(t,e,n,i,r){var o=(e-t)*i+t,e=(n-e)*i+e,i=(e-o)*i+o;r[0]=t,r[1]=o,r[2]=i,r[3]=i,r[4]=e,r[5]=n}function wr(t,e,n,i,r,o,a,s,l){var u,h=.005,c=1/0;sr[0]=a,sr[1]=s;for(var p=0;p<1;p+=.05){lr[0]=vr(t,n,r,p),lr[1]=vr(e,i,o,p),(y=Ct(sr,lr))<c&&(u=p,c=y)}c=1/0;for(var d=0;d<32&&!(h<rr);d++){var f=u-h,g=u+h;lr[0]=vr(t,n,r,f),lr[1]=vr(e,i,o,f);var y=Ct(lr,sr);0<=f&&y<c?(u=f,c=y):(ur[0]=vr(t,n,r,g),ur[1]=vr(e,i,o,g),f=Ct(ur,sr),g<=1&&f<c?(u=g,c=f):h*=.5)}return l&&(l[0]=vr(t,n,r,u),l[1]=vr(e,i,o,u)),nr(c)}var Sr=Math.min,Mr=Math.max,Tr=Math.sin,Cr=Math.cos,Ir=2*Math.PI,Ar=gt(),Dr=gt(),kr=gt();function Lr(t,e,n,i,r,o){r[0]=Sr(t,n),r[1]=Sr(e,i),o[0]=Mr(t,n),o[1]=Mr(e,i)}var Pr=[],Or=[];var Rr={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Er=[],Nr=[],zr=[],Br=[],Vr=[],Fr=[],Hr=Math.min,Gr=Math.max,Wr=Math.cos,Ur=Math.sin,Xr=Math.sqrt,Yr=Math.abs,Zr=Math.PI,jr=2*Zr,qr="undefined"!=typeof Float32Array,Kr=[];function $r(t){return Math.round(t/Zr*1e8)/1e8%2*Zr}function Jr(t,e){var n=$r(t[0]);n<0&&(n+=jr);var i=n-t[0],r=t[1];r+=i,!e&&jr<=r-n?r=n+jr:e&&jr<=n-r?r=n-jr:!e&&r<n?r=n+(jr-$r(n-r)):e&&n<r&&(r=n-(jr-$r(r-n))),t[0]=n,t[1]=r}var Qr=(to.prototype.increaseVersion=function(){this._version++},to.prototype.getVersion=function(){return this._version},to.prototype.setScale=function(t,e,n){0<(n=n||0)&&(this._ux=Yr(n/Kn/t)||0,this._uy=Yr(n/Kn/e)||0)},to.prototype.setDPR=function(t){this.dpr=t},to.prototype.setContext=function(t){this._ctx=t},to.prototype.getContext=function(){return this._ctx},to.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},to.prototype.reset=function(){this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},to.prototype.moveTo=function(t,e){return this.addData(Rr.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},to.prototype.lineTo=function(t,e){var n=Yr(t-this._xi)>this._ux||Yr(e-this._yi)>this._uy||this._len<5;return this.addData(Rr.L,t,e),this._ctx&&n&&(this._needsDash?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},to.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this.addData(Rr.C,t,e,n,i,r,o),this._ctx&&(this._needsDash?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},to.prototype.quadraticCurveTo=function(t,e,n,i){return this.addData(Rr.Q,t,e,n,i),this._ctx&&(this._needsDash?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},to.prototype.arc=function(t,e,n,i,r,o){Kr[0]=i,Kr[1]=r,Jr(Kr,o),i=Kr[0];var a=(r=Kr[1])-i;return this.addData(Rr.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Wr(r)*n+t,this._yi=Ur(r)*n+e,this},to.prototype.arcTo=function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},to.prototype.rect=function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Rr.R,t,e,n,i),this},to.prototype.closePath=function(){this.addData(Rr.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},to.prototype.fill=function(t){t&&t.fill(),this.toStatic()},to.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},to.prototype.setLineDash=function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e,this._needsDash=!0}else this._lineDash=null,this._needsDash=!1;return this},to.prototype.setLineDashOffset=function(t){return this._dashOffset=t,this},to.prototype.len=function(){return this._len},to.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!qr||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},to.prototype.appendPath=function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();qr&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},to.prototype.addData=function(t,e,n,i,r,o,a,s,l){if(this._saveData){var u=this.data;this._len+arguments.length>u.length&&(this._expandData(),u=this.data);for(var h=0;h<arguments.length;h++)u[this._len++]=arguments[h]}},to.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},to.prototype._dashedLineTo=function(t,e){var n,i,r=this._dashSum,o=this._lineDash,a=this._ctx,s=this._dashOffset,l=this._xi,u=this._yi,h=t-l,c=e-u,p=Xr(h*h+c*c),d=l,f=u,g=o.length;for(s<0&&(s=r+s),d-=(s%=r)*(h/=p),f-=s*(c/=p);0<h&&d<=t||h<0&&t<=d||0===h&&(0<c&&f<=e||c<0&&e<=f);)d+=h*(n=o[i=this._dashIdx]),f+=c*n,this._dashIdx=(i+1)%g,0<h&&d<l||h<0&&l<d||0<c&&f<u||c<0&&u<f||a[i%2?"moveTo":"lineTo"]((0<=h?Hr:Gr)(d,t),(0<=c?Hr:Gr)(f,e));h=d-t,c=f-e,this._dashOffset=-Xr(h*h+c*c)},to.prototype._dashedBezierTo=function(t,e,n,i,r,o){var a,s,l,u,h,c=this._ctx,p=this._dashSum,d=this._dashOffset,f=this._lineDash,g=this._xi,y=this._yi,m=0,v=this._dashIdx,_=f.length,x=0;for(d<0&&(d=p+d),d%=p,a=0;a<1;a+=.1)s=pr(g,t,n,r,a+.1)-pr(g,t,n,r,a),l=pr(y,e,i,o,a+.1)-pr(y,e,i,o,a),m+=Xr(s*s+l*l);for(;v<_&&!(d<(x+=f[v]));v++);for(a=(x-d)/m;a<=1;)u=pr(g,t,n,r,a),h=pr(y,e,i,o,a),v%2?c.moveTo(u,h):c.lineTo(u,h),a+=f[v]/m,v=(v+1)%_;v%2!=0&&c.lineTo(r,o),s=r-u,l=o-h,this._dashOffset=-Xr(s*s+l*l)},to.prototype._dashedQuadraticTo=function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},to.prototype.toStatic=function(){var t;!this._saveData||(t=this.data)instanceof Array&&(t.length=this._len,qr&&11<this._len&&(this.data=new Float32Array(t)))},to.prototype.getBoundingRect=function(){zr[0]=zr[1]=Vr[0]=Vr[1]=Number.MAX_VALUE,Br[0]=Br[1]=Fr[0]=Fr[1]=-Number.MAX_VALUE;for(var t,e,n,i=this.data,r=0,o=0,a=0,s=0,l=0;l<this._len;){var u=i[l++],h=1===l;switch(h&&(a=r=i[l],s=o=i[l+1]),u){case Rr.M:r=a=i[l++],o=s=i[l++],Vr[0]=a,Vr[1]=s,Fr[0]=a,Fr[1]=s;break;case Rr.L:Lr(r,o,i[l],i[l+1],Vr,Fr),r=i[l++],o=i[l++];break;case Rr.C:!function(t,e,n,i,r,o,a,s,l,u){var h=gr,c=pr,p=h(t,n,r,a,Pr);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var d=0;d<p;d++){var f=c(t,n,r,a,Pr[d]);l[0]=Sr(f,l[0]),u[0]=Mr(f,u[0])}for(p=h(e,i,o,s,Or),d=0;d<p;d++){var g=c(e,i,o,s,Or[d]);l[1]=Sr(g,l[1]),u[1]=Mr(g,u[1])}l[0]=Sr(t,l[0]),u[0]=Mr(t,u[0]),l[0]=Sr(a,l[0]),u[0]=Mr(a,u[0]),l[1]=Sr(e,l[1]),u[1]=Mr(e,u[1]),l[1]=Sr(s,l[1]),u[1]=Mr(s,u[1])}(r,o,i[l++],i[l++],i[l++],i[l++],i[l],i[l+1],Vr,Fr),r=i[l++],o=i[l++];break;case Rr.Q:c=r,g=o,t=i[l++],e=i[l++],p=i[l],y=i[l+1],n=Vr,f=Fr,m=d=m=d=u=void 0,u=vr,d=Mr(Sr((m=xr)(c,t,p),1),0),m=Mr(Sr(m(g,e,y),1),0),d=u(c,t,p,d),m=u(g,e,y,m),n[0]=Sr(c,p,d),n[1]=Sr(g,y,m),f[0]=Mr(c,p,d),f[1]=Mr(g,y,m),r=i[l++],o=i[l++];break;case Rr.A:var c=i[l++],p=i[l++],d=i[l++],f=i[l++],g=i[l++],y=i[l++]+g;l+=1;var m=!i[l++];h&&(a=Wr(g)*d+c,s=Ur(g)*f+p),function(t,e,n,i,r,o,a,s,l){var u=Dt,h=kt,c=Math.abs(r-o);if(c%Ir<1e-4&&1e-4<c)return s[0]=t-n,s[1]=e-i,l[0]=t+n,l[1]=e+i;Ar[0]=Cr(r)*n+t,Ar[1]=Tr(r)*i+e,Dr[0]=Cr(o)*n+t,Dr[1]=Tr(o)*i+e,u(s,Ar,Dr),h(l,Ar,Dr),(r%=Ir)<0&&(r+=Ir),(o%=Ir)<0&&(o+=Ir),o<r&&!a?o+=Ir:r<o&&a&&(r+=Ir),a&&(a=o,o=r,r=a);for(var p=0;p<o;p+=Math.PI/2)r<p&&(kr[0]=Cr(p)*n+t,kr[1]=Tr(p)*i+e,u(s,kr,s),h(l,kr,l))}(c,p,d,f,g,y,m,Vr,Fr),r=Wr(y)*d+c,o=Ur(y)*f+p;break;case Rr.R:Lr(a=r=i[l++],s=o=i[l++],a+i[l++],s+i[l++],Vr,Fr);break;case Rr.Z:r=a,o=s}Dt(zr,zr,Vr),kt(Br,Br,Fr)}return 0===l&&(zr[0]=zr[1]=Br[0]=Br[1]=0),new Rn(zr[0],zr[1],Br[0]-zr[0],Br[1]-zr[1])},to.prototype._calculateLength=function(){var t=this.data,e=this._len,n=this._ux,i=this._uy,r=0,o=0,a=0,s=0;this._pathSegLen||(this._pathSegLen=[]);for(var l=this._pathSegLen,u=0,h=0,c=0;c<e;){var p=t[c++],d=1===c;d&&(a=r=t[c],s=o=t[c+1]);var f=-1;switch(p){case Rr.M:r=a=t[c++],o=s=t[c++];break;case Rr.L:var g=t[c++],y=(_=t[c++])-o;(Yr(C=g-r)>n||Yr(y)>i||c===e-1)&&(f=Math.sqrt(C*C+y*y),r=g,o=_);break;case Rr.C:var m=t[c++],v=t[c++],g=t[c++],_=t[c++],x=t[c++],b=t[c++],f=function(t,e,n,i,r,o,a,s,l){for(var u=t,h=e,c=0,p=1/l,d=1;d<=l;d++){var f=d*p,g=pr(t,n,r,a,f),y=pr(e,i,o,s,f),m=g-u,f=y-h;c+=Math.sqrt(m*m+f*f),u=g,h=y}return c}(r,o,m,v,g,_,x,b,10),r=x,o=b;break;case Rr.Q:f=function(t,e,n,i,r,o,a){for(var s=t,l=e,u=0,h=1/a,c=1;c<=a;c++){var p=c*h,d=vr(t,n,r,p),f=vr(e,i,o,p),g=d-s,p=f-l;u+=Math.sqrt(g*g+p*p),s=d,l=f}return u}(r,o,m=t[c++],v=t[c++],g=t[c++],_=t[c++],10),r=g,o=_;break;case Rr.A:var w=t[c++],S=t[c++],M=t[c++],T=t[c++],p=t[c++],x=t[c++],b=x+p;c+=1;t[c++];d&&(a=Wr(p)*M+w,s=Ur(p)*T+S),f=Gr(M,T)*Hr(jr,Math.abs(x)),r=Wr(b)*M+w,o=Ur(b)*T+S;break;case Rr.R:a=r=t[c++],s=o=t[c++];f=2*t[c++]+2*t[c++];break;case Rr.Z:var C=a-r,y=s-o;f=Math.sqrt(C*C+y*y),r=a,o=s}0<=f&&(u+=l[h++]=f)}return this._pathLen=u},to.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h=this.data,c=this._ux,p=this._uy,d=this._len,f=e<1,g=0,y=0;if(!f||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var m=0;m<d;){var v=h[m++],_=1===m;switch(_&&(n=r=h[m],i=o=h[m+1]),v){case Rr.M:n=r=h[m++],i=o=h[m++],t.moveTo(r,o);break;case Rr.L:if(a=h[m++],s=h[m++],Yr(a-r)>c||Yr(s-o)>p||m===d-1){if(f){if(u<g+(N=l[y++])){var x=(u-g)/N;t.lineTo(r*(1-x)+a*x,o*(1-x)+s*x);break t}g+=N}t.lineTo(a,s),r=a,o=s}break;case Rr.C:var b=h[m++],w=h[m++],S=h[m++],M=h[m++],T=h[m++],C=h[m++];if(f){if(u<g+(N=l[y++])){yr(r,b,S,T,x=(u-g)/N,Er),yr(o,w,M,C,x,Nr),t.bezierCurveTo(Er[1],Nr[1],Er[2],Nr[2],Er[3],Nr[3]);break t}g+=N}t.bezierCurveTo(b,w,S,M,T,C),r=T,o=C;break;case Rr.Q:b=h[m++],w=h[m++],S=h[m++],M=h[m++];if(f){if(u<g+(N=l[y++])){br(r,b,S,x=(u-g)/N,Er),br(o,w,M,x,Nr),t.quadraticCurveTo(Er[1],Nr[1],Er[2],Nr[2]);break t}g+=N}t.quadraticCurveTo(b,w,S,M),r=S,o=M;break;case Rr.A:var I=h[m++],A=h[m++],D=h[m++],k=h[m++],L=h[m++],P=h[m++],O=h[m++],R=!h[m++],v=k<D?D:k,T=.001<Yr(D-k),E=L+P,C=!1;if(f&&(u<g+(N=l[y++])&&(E=L+P*(u-g)/N,C=!0),g+=N),T&&t.ellipse?t.ellipse(I,A,D,k,O,L,E,R):t.arc(I,A,v,L,E,R),C)break t;_&&(n=Wr(L)*D+I,i=Ur(L)*k+A),r=Wr(E)*D+I,o=Ur(E)*k+A;break;case Rr.R:n=r=h[m],i=o=h[m+1],a=h[m++],s=h[m++];var N,E=h[m++],k=h[m++];if(f){if(u<g+(N=l[y++])){A=u-g;t.moveTo(a,s),t.lineTo(a+Hr(A,E),s),0<(A-=E)&&t.lineTo(a+E,s+Hr(A,k)),0<(A-=k)&&t.lineTo(a+Gr(E-A,0),s+k),0<(A-=E)&&t.lineTo(a,s+Gr(k-A,0));break t}g+=N}t.rect(a,s,E,k);break;case Rr.Z:if(f){if(u<g+(N=l[y++])){x=(u-g)/N;t.lineTo(r*(1-x)+n*x,o*(1-x)+i*x);break t}g+=N}t.closePath(),r=n,o=i}}},to.CMD=Rr,to.initDefaultProps=((Dc=to.prototype)._saveData=!0,Dc._needsDash=!1,Dc._dashOffset=0,Dc._dashIdx=0,Dc._dashSum=0,Dc._ux=0,void(Dc._uy=0)),to);function to(t){this.dpr=1,this._version=0,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}function eo(t,e,n,i,r,o,a){if(0!==r){var s=r,r=0;if(!(e+s<a&&i+s<a||a<e-s&&a<i-s||t+s<o&&n+s<o||o<t-s&&o<n-s)){if(t===n)return Math.abs(o-t)<=s/2;n=(r=(e-i)/(t-n))*o-a+(t*i-n*e)/(t-n);return n*n/(r*r+1)<=s/2*s/2}}}var no=2*Math.PI;function io(t){return(t%=no)<0&&(t+=no),t}var ro=2*Math.PI;function oo(t,e,n,i,r,o){if(e<o&&i<o||o<e&&o<i)return 0;if(i===e)return 0;var a=(o-e)/(i-e),o=i<e?1:-1;1!=a&&0!=a||(o=i<e?.5:-.5);t=a*(n-t)+t;return t===r?1/0:r<t?o:0}var ao=Qr.CMD,so=2*Math.PI,lo=1e-4;var uo=[-1,-1,-1],ho=[-1,-1];function co(t,e,n,i,r,o,a,s,l,u){if(e<u&&i<u&&o<u&&s<u||u<e&&u<i&&u<o&&u<s)return 0;var h=fr(e,i,o,s,u,uo);if(0===h)return 0;for(var c,p=0,d=-1,f=void 0,g=void 0,y=0;y<h;y++){var m=uo[y],v=0===m||1===m?.5:1;pr(t,n,r,a,m)<l||(d<0&&(d=gr(e,i,o,s,ho),ho[1]<ho[0]&&1<d&&(c=void 0,c=ho[0],ho[0]=ho[1],ho[1]=c),f=pr(e,i,o,s,ho[0]),1<d&&(g=pr(e,i,o,s,ho[1]))),2===d?m<ho[0]?p+=f<e?v:-v:m<ho[1]?p+=g<f?v:-v:p+=s<g?v:-v:m<ho[0]?p+=f<e?v:-v:p+=s<f?v:-v)}return p}function po(t,e,n,i,r,o,a,s){if(e<s&&i<s&&o<s||s<e&&s<i&&s<o)return 0;var l,u,h,c,p,d,f=(c=uo,d=(l=e)-2*(u=i)+(h=o),h=2*(u-l),u=l-(s=s),l=0,hr(d)?cr(h)&&0<=(p=-u/h)&&p<=1&&(c[l++]=p):hr(s=h*h-4*d*u)?0<=(p=-h/(2*d))&&p<=1&&(c[l++]=p):0<s&&(s=(-h-(u=nr(s)))/(2*d),0<=(p=(-h+u)/(2*d))&&p<=1&&(c[l++]=p),0<=s&&s<=1&&(c[l++]=s)),l);if(0===f)return 0;var g=xr(e,i,o);if(0<=g&&g<=1){for(var y=0,m=vr(e,i,o,g),v=0;v<f;v++){var _=0===uo[v]||1===uo[v]?.5:1;vr(t,n,r,uo[v])<a||(uo[v]<g?y+=m<e?_:-_:y+=o<m?_:-_)}return y}_=0===uo[0]||1===uo[0]?.5:1;return vr(t,n,r,uo[0])<a?0:o<e?_:-_}function fo(t,e,n,i,r){for(var o,a=t.data,s=t.len(),l=0,u=0,h=0,c=0,p=0,d=0;d<s;){var f=a[d++],g=1===d;switch(f===ao.M&&1<d&&(n||(l+=oo(u,h,c,p,i,r))),g&&(c=u=a[d],p=h=a[d+1]),f){case ao.M:u=c=a[d++],h=p=a[d++];break;case ao.L:if(n){if(eo(u,h,a[d],a[d+1],e,i,r))return!0}else l+=oo(u,h,a[d],a[d+1],i,r)||0;u=a[d++],h=a[d++];break;case ao.C:if(n){if(function(t,e,n,i,r,o,a,s,l,u,h){if(0!==l){l=l;return e+l<h&&i+l<h&&o+l<h&&s+l<h||h<e-l&&h<i-l&&h<o-l&&h<s-l||t+l<u&&n+l<u&&r+l<u&&a+l<u||u<t-l&&u<n-l&&u<r-l&&u<a-l?void 0:mr(t,e,n,i,r,o,a,s,u,h,null)<=l/2}}(u,h,a[d++],a[d++],a[d++],a[d++],a[d],a[d+1],e,i,r))return!0}else l+=co(u,h,a[d++],a[d++],a[d++],a[d++],a[d],a[d+1],i,r)||0;u=a[d++],h=a[d++];break;case ao.Q:if(n){if(function(t,e,n,i,r,o,a,s,l){if(0!==a){a=a;return e+a<l&&i+a<l&&o+a<l||l<e-a&&l<i-a&&l<o-a||t+a<s&&n+a<s&&r+a<s||s<t-a&&s<n-a&&s<r-a?void 0:wr(t,e,n,i,r,o,s,l,null)<=a/2}}(u,h,a[d++],a[d++],a[d],a[d+1],e,i,r))return!0}else l+=po(u,h,a[d++],a[d++],a[d],a[d+1],i,r)||0;u=a[d++],h=a[d++];break;case ao.A:var y=a[d++],m=a[d++],v=a[d++],_=a[d++],x=a[d++],b=a[d++];d+=1;var f=!!(1-a[d++]),w=Math.cos(x)*v+y,S=Math.sin(x)*_+m;g?(c=w,p=S):l+=oo(u,h,w,S,i,r);g=(i-y)*_/v+y;if(n){if(function(t,e,n,i,r,o,a,s,l){if(0!==a){a=a;s-=t,l-=e;e=Math.sqrt(s*s+l*l);if(!(n<e-a||e+a<n)){if(Math.abs(i-r)%ro<1e-4)return 1;(r=o?(o=i,i=io(r),io(o)):(i=io(i),io(r)))<i&&(r+=ro);s=Math.atan2(l,s);return s<0&&(s+=ro),i<=s&&s<=r||i<=s+ro&&s+ro<=r}}}(y,m,_,x,x+b,f,e,g,r))return!0}else l+=function(t,e,n,i,r,o,a,s){if(n<(s-=e)||s<-n)return 0;if(n=Math.sqrt(n*n-s*s),uo[0]=-n,uo[1]=n,(n=Math.abs(i-r))<1e-4)return 0;if(so-1e-4<=n){r=so;var l=o?1:-1;return a>=uo[i=0]+t&&a<=uo[1]+t?l:0}r<i&&(n=i,i=r,r=n),i<0&&(i+=so,r+=so);for(var u=0,h=0;h<2;h++){var c=uo[h];a<c+t&&(l=o?1:-1,(c=Math.atan2(s,c))<0&&(c=so+c),(i<=c&&c<=r||i<=c+so&&c+so<=r)&&(c>Math.PI/2&&c<1.5*Math.PI&&(l=-l),u+=l))}return u}(y,m,_,x,x+b,f,g,r);u=Math.cos(x+b)*v+y,h=Math.sin(x+b)*_+m;break;case ao.R:c=u=a[d++],p=h=a[d++];if(w=c+a[d++],S=p+a[d++],n){if(eo(c,p,w,p,e,i,r)||eo(w,p,w,S,e,i,r)||eo(w,S,c,S,e,i,r)||eo(c,S,c,p,e,i,r))return!0}else l+=oo(w,p,w,S,i,r),l+=oo(c,S,c,p,i,r);break;case ao.Z:if(n){if(eo(u,h,c,p,e,i,r))return!0}else l+=oo(u,h,c,p,i,r);u=c,h=p}}return n||(o=h,t=p,Math.abs(o-t)<lo)||(l+=oo(u,h,c,p,i,r)||0),0!==l}var go,yo=D({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},Zi),mo={style:D({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ji.style)},vo=["x","y","rotation","scaleX","scaleY","originX","originY","invisible","culling","z","z2","zlevel","parent"],_o=(l(xo,go=$i),xo.prototype.update=function(){var e=this;go.prototype.update.call(this);var t=this.style;if(t.decal){var n=this._decalEl=this._decalEl||new xo;n.buildPath===xo.prototype.buildPath&&(n.buildPath=function(t){e.buildPath(t,e.shape)}),n.silent=!0;var i,r=n.style;for(i in t)r[i]!==t[i]&&(r[i]=t[i]);r.fill=t.fill?t.decal:null,r.decal=null,r.shadowColor=null,t.strokeFirst&&(r.stroke=null);for(var o=0;o<vo.length;++o)n[vo[o]]=this[vo[o]];n.__dirty|=ri.REDARAW_BIT}else this._decalEl&&(this._decalEl=null)},xo.prototype.getDecalElement=function(){return this._decalEl},xo.prototype._init=function(t){var e=N(t);this.shape=this.getDefaultShape();var n=this.getDefaultStyle();n&&this.useStyle(n);for(var i=0;i<e.length;i++){var r=e[i],o=t[r];"style"===r?this.style?A(this.style,o):this.useStyle(o):"shape"===r?A(this.shape,o):go.prototype.attrKV.call(this,r,o)}this.style||this.useStyle({})},xo.prototype.getDefaultStyle=function(){return null},xo.prototype.getDefaultShape=function(){return{}},xo.prototype.canBeInsideText=function(){return this.hasFill()},xo.prototype.getInsideTextFill=function(){var t=this.style.fill;if("none"!==t){if(H(t)){var e=sn(t,0);return.5<e?$n:.2<e?"#eee":Jn}if(t)return Jn}return $n},xo.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(H(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())==sn(t,0)<.4)return e}},xo.prototype.buildPath=function(t,e,n){},xo.prototype.pathUpdated=function(){this.__dirty&=~xo.SHAPE_CHANGED_BIT},xo.prototype.createPathProxy=function(){this.path=new Qr(!1)},xo.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(0<t.lineWidth))},xo.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},xo.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n&&(r=!1,this.path||(r=!0,this.createPathProxy()),i=this.path,(r||this.__dirty&xo.SHAPE_CHANGED_BIT)&&(i.beginPath(),this.buildPath(i,this.shape,!1),this.pathUpdated()),t=i.getBoundingRect()),this._rect=t,this.hasStroke()&&this.path&&0<this.path.len()){var i,r=this._rectWithStroke||(this._rectWithStroke=t.clone());return(this.__dirty||n)&&(r.copy(t),i=e.strokeNoScale?this.getLineScale():1,n=e.lineWidth,this.hasFill()||(e=this.strokeContainThreshold,n=Math.max(n,null==e?4:e)),1e-10<i&&(r.width+=n/i,r.height+=n/i,r.x-=n/i/2,r.y-=n/i/2)),r}return t},xo.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){n=this.path;if(this.hasStroke()){i=r.lineWidth,r=r.strokeNoScale?this.getLineScale():1;if(1e-10<r&&(this.hasFill()||(i=Math.max(i,this.strokeContainThreshold)),fo(n,i/r,!0,t,e)))return!0}if(this.hasFill())return fo(n,0,!1,t,e)}return!1},xo.prototype.dirtyShape=function(){this.__dirty|=xo.SHAPE_CHANGED_BIT,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},xo.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},xo.prototype.animateShape=function(t){return this.animate("shape",t)},xo.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},xo.prototype.attrKV=function(t,e){"shape"===t?this.setShape(e):go.prototype.attrKV.call(this,t,e)},xo.prototype.setShape=function(t,e){var n=(n=this.shape)||(this.shape={});return"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},xo.prototype.shapeChanged=function(){return!!(this.__dirty&xo.SHAPE_CHANGED_BIT)},xo.prototype.createStyle=function(t){return ct(yo,t)},xo.prototype._innerSaveToNormal=function(t){go.prototype._innerSaveToNormal.call(this,t);var e=this._normalState;t.shape&&!e.shape&&(e.shape=A({},this.shape))},xo.prototype._applyStateObj=function(t,e,n,i,r,o){go.prototype._applyStateObj.call(this,t,e,n,i,r,o);var a,s=!(e&&i);if(e&&e.shape?r?i?a=e.shape:(a=A({},n.shape),A(a,e.shape)):(a=A({},(i?this:n).shape),A(a,e.shape)):s&&(a=n.shape),a)if(r){this.shape=A({},this.shape);for(var l={},u=N(a),h=0;h<u.length;h++){var c=u[h];"object"==typeof a[c]?this.shape[c]=a[c]:l[c]=a[c]}this._transitionState(t,{shape:l},o)}else this.shape=a,this.dirtyShape()},xo.prototype._mergeStates=function(t){for(var e,n=go.prototype._mergeStates.call(this,t),i=0;i<t.length;i++){var r=t[i];r.shape&&(e=e||{},this._mergeStyle(e,r.shape))}return e&&(n.shape=e),n},xo.prototype.getAnimationStyleProps=function(){return mo},xo.prototype.isZeroArea=function(){return!1},xo.extend=function(n){var i,t,e=(l(r,i=xo),r.prototype.getDefaultStyle=function(){return I(n.style)},r.prototype.getDefaultShape=function(){return I(n.shape)},r);function r(t){var e=i.call(this,t)||this;return n.init&&n.init.call(e,t),e}for(t in n)"function"==typeof n[t]&&(e.prototype[t]=n[t]);return e},xo.SHAPE_CHANGED_BIT=4,xo.initDefaultProps=((Lc=xo.prototype).type="path",Lc.strokeContainThreshold=5,Lc.segmentIgnoreThreshold=0,Lc.subPixelOptimize=!1,Lc.autoBatch=!1,void(Lc.__dirty=ri.REDARAW_BIT|$i.STYLE_CHANGED_BIT|xo.SHAPE_CHANGED_BIT)),xo);function xo(t){return go.call(this,t)||this}var bo=Qr.CMD,wo=[[],[],[]],So=Math.sqrt,Mo=Math.atan2;var To=Math.sqrt,Co=Math.sin,Io=Math.cos,Ao=Math.PI;function Do(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function ko(t,e){return(t[0]*e[0]+t[1]*e[1])/(Do(t)*Do(e))}function Lo(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(ko(t,e))}function Po(t,e,n,i,r,o,a,s,l,u,h){var c=l*(Ao/180),p=Io(c)*(t-n)/2+Co(c)*(e-i)/2,d=-1*Co(c)*(t-n)/2+Io(c)*(e-i)/2,l=p*p/(a*a)+d*d/(s*s);1<l&&(a*=To(l),s*=To(l));l=(r===o?-1:1)*To((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,r=l*a*d/s,l=l*-s*p/a,t=(t+n)/2+Io(c)*r-Co(c)*l,n=(e+i)/2+Co(c)*r+Io(c)*l,e=Lo([1,0],[(p-r)/a,(d-l)/s]),i=[(p-r)/a,(d-l)/s],d=[(-1*p-r)/a,(-1*d-l)/s],l=Lo(i,d);ko(i,d)<=-1&&(l=Ao),1<=ko(i,d)&&(l=0),l<0&&(d=Math.round(l/Ao*1e6)/1e6,l=2*Ao+d%2*Ao),h.addData(u,t,n,a,s,e,l,c,o)}var Oo=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,Ro=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var Eo,No=(l(zo,Eo=_o),zo.prototype.applyTransform=function(t){},zo);function zo(){return null!==Eo&&Eo.apply(this,arguments)||this}function Bo(t){return null!=t.setData}function Vo(t,e){var n=function(t){if(!t)return new Qr;for(var e,n=0,i=0,r=n,o=i,a=new Qr,s=Qr.CMD,l=t.match(Oo),u=0;u<l.length;u++){for(var h=l[u],c=h.charAt(0),p=void 0,d=h.match(Ro)||[],f=d.length,g=0;g<f;g++)d[g]=parseFloat(d[g]);for(var y=0;y<f;){var m=void 0,v=void 0,_=void 0,x=void 0,b=void 0,w=void 0,S=void 0,M=n,T=i,C=void 0,I=void 0;switch(c){case"l":n+=d[y++],i+=d[y++],p=s.L,a.addData(p,n,i);break;case"L":n=d[y++],i=d[y++],p=s.L,a.addData(p,n,i);break;case"m":n+=d[y++],i+=d[y++],p=s.M,a.addData(p,n,i),r=n,o=i,c="l";break;case"M":n=d[y++],i=d[y++],p=s.M,a.addData(p,n,i),r=n,o=i,c="L";break;case"h":n+=d[y++],p=s.L,a.addData(p,n,i);break;case"H":n=d[y++],p=s.L,a.addData(p,n,i);break;case"v":i+=d[y++],p=s.L,a.addData(p,n,i);break;case"V":i=d[y++],p=s.L,a.addData(p,n,i);break;case"C":p=s.C,a.addData(p,d[y++],d[y++],d[y++],d[y++],d[y++],d[y++]),n=d[y-2],i=d[y-1];break;case"c":p=s.C,a.addData(p,d[y++]+n,d[y++]+i,d[y++]+n,d[y++]+i,d[y++]+n,d[y++]+i),n+=d[y-2],i+=d[y-1];break;case"S":m=n,v=i,C=a.len(),I=a.data,e===s.C&&(m+=n-I[C-4],v+=i-I[C-3]),p=s.C,M=d[y++],T=d[y++],n=d[y++],i=d[y++],a.addData(p,m,v,M,T,n,i);break;case"s":m=n,v=i,C=a.len(),I=a.data,e===s.C&&(m+=n-I[C-4],v+=i-I[C-3]),p=s.C,M=n+d[y++],T=i+d[y++],n+=d[y++],i+=d[y++],a.addData(p,m,v,M,T,n,i);break;case"Q":M=d[y++],T=d[y++],n=d[y++],i=d[y++],p=s.Q,a.addData(p,M,T,n,i);break;case"q":M=d[y++]+n,T=d[y++]+i,n+=d[y++],i+=d[y++],p=s.Q,a.addData(p,M,T,n,i);break;case"T":m=n,v=i,C=a.len(),I=a.data,e===s.Q&&(m+=n-I[C-4],v+=i-I[C-3]),n=d[y++],i=d[y++],p=s.Q,a.addData(p,m,v,n,i);break;case"t":m=n,v=i,C=a.len(),I=a.data,e===s.Q&&(m+=n-I[C-4],v+=i-I[C-3]),n+=d[y++],i+=d[y++],p=s.Q,a.addData(p,m,v,n,i);break;case"A":_=d[y++],x=d[y++],b=d[y++],w=d[y++],S=d[y++],Po(M=n,T=i,n=d[y++],i=d[y++],w,S,_,x,b,p=s.A,a);break;case"a":_=d[y++],x=d[y++],b=d[y++],w=d[y++],S=d[y++],Po(M=n,T=i,n+=d[y++],i+=d[y++],w,S,_,x,b,p=s.A,a)}}"z"!==c&&"Z"!==c||(p=s.Z,a.addData(p),n=r,i=o),e=p}return a.toStatic(),a}(t),e=A({},e);return e.buildPath=function(t){var e;Bo(t)?(t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e,1)):(e=t,n.rebuildPath(e,1))},e.applyTransform=function(t){!function(t,e){for(var n,i,r,o=t.data,a=t.len(),s=bo.M,l=bo.C,u=bo.L,h=bo.R,c=bo.A,p=bo.Q,d=0,f=0;d<a;){switch(_=o[d++],f=d,n=0,_){case s:case u:n=1;break;case l:n=3;break;case p:n=2;break;case c:var g=e[4],y=e[5],m=So(e[0]*e[0]+e[1]*e[1]),v=So(e[2]*e[2]+e[3]*e[3]),_=Mo(-e[1]/v,e[0]/m);o[d]*=m,o[d++]+=g,o[d]*=v,o[d++]+=y,o[d++]*=m,o[d++]*=v,o[d++]+=_,o[d++]+=_,f=d+=2;break;case h:r[0]=o[d++],r[1]=o[d++],At(r,r,e),o[f++]=r[0],o[f++]=r[1],r[0]+=o[d++],r[1]+=o[d++],At(r,r,e),o[f++]=r[0],o[f++]=r[1]}for(i=0;i<n;i++){var x=wo[i];x[0]=o[d++],x[1]=o[d++],At(x,x,e),o[f++]=x[0],o[f++]=x[1]}}t.increaseVersion()}(n,t),this.dirtyShape()},e}var Fo,Ho=(l(Go,Fo=ri),Go.prototype.childrenRef=function(){return this._children},Go.prototype.children=function(){return this._children.slice()},Go.prototype.childAt=function(t){return this._children[t]},Go.prototype.childOfName=function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},Go.prototype.childCount=function(){return this._children.length},Go.prototype.add=function(t){if(t&&(t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),t.__hostTarget))throw"This elemenet has been used as an attachment";return this},Go.prototype.addBefore=function(t,e){var n;return t&&t!==this&&t.parent!==this&&e&&e.parent===this&&(0<=(e=(n=this._children).indexOf(e))&&(n.splice(e,0,t),this._doAdd(t))),this},Go.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];return t&&t!==this&&t.parent!==this&&t!==i&&(n[e]=t,i.parent=null,(e=this.__zr)&&i.removeSelfFromZr(e),this._doAdd(t)),this},Go.prototype._doAdd=function(t){t.parent&&t.parent.remove(t);var e=(t.parent=this).__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},Go.prototype.remove=function(t){var e=this.__zr,n=this._children,i=L(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},Go.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n<t.length;n++){var i=t[n];e&&i.removeSelfFromZr(e),i.parent=null}return t.length=0,this},Go.prototype.eachChild=function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},Go.prototype.traverse=function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n],r=t.call(e,i);i.isGroup&&!r&&i.traverse(t,e)}return this},Go.prototype.addSelfToZr=function(t){Fo.prototype.addSelfToZr.call(this,t);for(var e=0;e<this._children.length;e++){this._children[e].addSelfToZr(t)}},Go.prototype.removeSelfFromZr=function(t){Fo.prototype.removeSelfFromZr.call(this,t);for(var e=0;e<this._children.length;e++){this._children[e].removeSelfFromZr(t)}},Go.prototype.getBoundingRect=function(t){for(var e=new Rn(0,0,0,0),n=t||this._children,i=[],r=null,o=0;o<n.length;o++){var a,s=n[o];s.ignore||s.invisible||(a=s.getBoundingRect(),(s=s.getLocalTransform(i))?(Rn.applyTransform(e,a,s),(r=r||e.clone()).union(e)):(r=r||a.clone()).union(a))}return r||e},Go);function Go(t){var e=Fo.call(this)||this;return e.isGroup=!0,e._children=[],e.attr(t),e}Ho.prototype.type="group";var Wo=D({x:0,y:0},Zi),Uo={style:D({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ji.style)};var Xo,Yo=(l(Zo,Xo=$i),Zo.prototype.createStyle=function(t){return ct(Wo,t)},Zo.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;n=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!n)return 0;var i="width"===t?"height":"width",e=e[i];return null==e?n[t]:n[t]/n[i]*e},Zo.prototype.getWidth=function(){return this._getSize("width")},Zo.prototype.getHeight=function(){return this._getSize("height")},Zo.prototype.getAnimationStyleProps=function(){return Uo},Zo.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new Rn(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},Zo);function Zo(){return null!==Xo&&Xo.apply(this,arguments)||this}Yo.prototype.type="image";var jo,qo=function(){this.cx=0,this.cy=0,this.r=0},Ko=(l($o,jo=_o),$o.prototype.getDefaultShape=function(){return new qo},$o.prototype.buildPath=function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI)},$o);function $o(t){return jo.call(this,t)||this}Ko.prototype.type="circle";var Jo=Math.round;function Qo(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,e=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=e;n=n&&n.lineWidth;return n?(Jo(2*i)===Jo(2*r)&&(t.x1=t.x2=ea(i,n,!0)),Jo(2*o)===Jo(2*e)&&(t.y1=t.y2=ea(o,n,!0)),t):t}}function ta(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,e=e.height;t.x=i,t.y=r,t.width=o,t.height=e;n=n&&n.lineWidth;return n?(t.x=ea(i,n,!0),t.y=ea(r,n,!0),t.width=Math.max(ea(i+o,n,!1)-t.x,0===o?0:1),t.height=Math.max(ea(r+e,n,!1)-t.y,0===e?0:1),t):t}}function ea(t,e,n){if(!e)return t;t=Jo(2*t);return(t+Jo(e))%2==0?t/2:(t+(n?1:-1))/2}var na,ia=function(){this.x=0,this.y=0,this.width=0,this.height=0},ra={},oa=(l(aa,na=_o),aa.prototype.getDefaultShape=function(){return new ia},aa.prototype.buildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p,d,f,g;this.subPixelOptimize?(n=(g=ta(ra,e,this.style)).x,i=g.y,r=g.width,o=g.height,g.r=e.r,e=g):(n=e.x,i=e.y,r=e.width,o=e.height),e.r?(a=t,d=(s=e).x,f=s.y,g=s.width,e=s.height,s=s.r,g<0&&(d+=g,g=-g),e<0&&(f+=e,e=-e),"number"==typeof s?l=u=h=c=s:s instanceof Array?1===s.length?l=u=h=c=s[0]:2===s.length?(l=h=s[0],u=c=s[1]):3===s.length?(l=s[0],u=c=s[1],h=s[2]):(l=s[0],u=s[1],h=s[2],c=s[3]):l=u=h=c=0,g<l+u&&(l*=g/(p=l+u),u*=g/p),g<h+c&&(h*=g/(p=h+c),c*=g/p),e<u+h&&(u*=e/(p=u+h),h*=e/p),e<l+c&&(l*=e/(p=l+c),c*=e/p),a.moveTo(d+l,f),a.lineTo(d+g-u,f),0!==u&&a.arc(d+g-u,f+u,u,-Math.PI/2,0),a.lineTo(d+g,f+e-h),0!==h&&a.arc(d+g-h,f+e-h,h,0,Math.PI/2),a.lineTo(d+c,f+e),0!==c&&a.arc(d+c,f+e-c,c,Math.PI/2,Math.PI),a.lineTo(d,f+l),0!==l&&a.arc(d+l,f+l,l,Math.PI,1.5*Math.PI)):t.rect(n,i,r,o)},aa.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},aa);function aa(t){return na.call(this,t)||this}oa.prototype.type="rect";var sa,la=function(){this.cx=0,this.cy=0,this.rx=0,this.ry=0},ua=(l(ha,sa=_o),ha.prototype.getDefaultShape=function(){return new la},ha.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=e.rx,o=e.ry,a=.5522848*r,e=.5522848*o;t.moveTo(n-r,i),t.bezierCurveTo(n-r,i-e,n-a,i-o,n,i-o),t.bezierCurveTo(n+a,i-o,n+r,i-e,n+r,i),t.bezierCurveTo(n+r,i+e,n+a,i+o,n,i+o),t.bezierCurveTo(n-a,i+o,n-r,i+e,n-r,i),t.closePath()},ha);function ha(t){return sa.call(this,t)||this}ua.prototype.type="ellipse";var ca,pa={},da=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1},fa=(l(ga,ca=_o),ga.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},ga.prototype.getDefaultShape=function(){return new da},ga.prototype.buildPath=function(t,e){var n,i,r,o;o=this.subPixelOptimize?(n=(o=Qo(pa,e,this.style)).x1,i=o.y1,r=o.x2,o.y2):(n=e.x1,i=e.y1,r=e.x2,e.y2);e=e.percent;0!==e&&(t.moveTo(n,i),e<1&&(r=n*(1-e)+r*e,o=i*(1-e)+o*e),t.lineTo(r,o))},ga.prototype.pointAt=function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]},ga);function ga(t){return ca.call(this,t)||this}function ya(t,e,n,i,r,o,a){t=.5*(n-t),i=.5*(i-e);return(2*(e-n)+t+i)*a+(-3*(e-n)-2*t-i)*o+t*r+e}function ma(t,e,n){var i=e.smooth,r=e.points;if(r&&2<=r.length){if(i&&"spline"!==i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;p<d;p++)Dt(a,a,t[p]),kt(s,s,t[p]);Dt(a,a,i[0]),kt(s,s,i[1])}for(p=0,d=t.length;p<d;p++){var f=t[p];if(n)r=t[p?p-1:d-1],o=t[(p+1)%d];else{if(0===p||p===d-1){l.push(yt(t[p]));continue}r=t[p-1],o=t[p+1]}vt(u,o,r),bt(u,u,e);var g=St(f,r),y=St(f,o),m=g+y;0!==m&&(g/=m,y/=m),bt(h,u,-g),bt(c,u,y);y=mt([],f,h),f=mt([],f,c);i&&(kt(y,y,a),Dt(y,y,s),kt(f,f,a),Dt(f,f,s)),l.push(y),l.push(f)}return n&&l.push(l.shift()),l}(r,i,n,e.smoothConstraint);t.moveTo(r[0][0],r[0][1]);for(var a=r.length,s=0;s<(n?a:a-1);s++){var l=o[2*s],u=o[2*s+1],h=r[(s+1)%a];t.bezierCurveTo(l[0],l[1],u[0],u[1],h[0],h[1])}}else{"spline"===i&&(r=function(t,e){for(var n=t.length,i=[],r=0,o=1;o<n;o++)r+=St(t[o-1],t[o]);for(var a=(a=r/2)<n?n:a,o=0;o<a;o++){var s=o/(a-1)*(e?n:n-1),l=Math.floor(s),u=s-l,h=void 0,c=t[l%n],p=void 0,d=void 0,d=e?(h=t[(l-1+n)%n],p=t[(l+1)%n],t[(l+2)%n]):(h=t[0===l?l:l-1],p=t[n-2<l?n-1:l+1],t[n-3<l?n-1:l+2]),s=u*u,l=u*s;i.push([ya(h[0],c[0],p[0],d[0],u,s,l),ya(h[1],c[1],p[1],d[1],u,s,l)])}return i}(r,n)),t.moveTo(r[0][0],r[0][1]);for(var s=1,c=r.length;s<c;s++)t.lineTo(r[s][0],r[s][1])}n&&t.closePath()}}fa.prototype.type="line";var va,_a=function(){this.points=null,this.smooth=0,this.smoothConstraint=null},xa=(l(ba,va=_o),ba.prototype.getDefaultShape=function(){return new _a},ba.prototype.buildPath=function(t,e){ma(t,e,!0)},ba);function ba(t){return va.call(this,t)||this}xa.prototype.type="polygon";var wa,Sa=function(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null},Ma=(l(Ta,wa=_o),Ta.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},Ta.prototype.getDefaultShape=function(){return new Sa},Ta.prototype.buildPath=function(t,e){ma(t,e,!1)},Ta);function Ta(t){return wa.call(this,t)||this}Ma.prototype.type="polyline";var Ca=(Ia.prototype.addColorStop=function(t,e){this.colorStops.push({offset:t,color:e})},Ia);function Ia(t){this.colorStops=t||[]}var Aa,Da=(l(ka,Aa=Ca),ka);function ka(t,e,n,i,r,o){r=Aa.call(this,r)||this;return r.x=null==t?0:t,r.y=null==e?0:e,r.x2=null==n?1:n,r.y2=null==i?0:i,r.type="linear",r.global=o||!1,r}var La,Pa=D({strokeFirst:!0,font:Vn,x:0,y:0,textAlign:"left",textBaseline:"top",miterLimit:2},yo),Oa=(l(Ra,La=$i),Ra.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return null!=e&&"none"!==e&&0<t.lineWidth},Ra.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},Ra.prototype.createStyle=function(t){return ct(Pa,t)},Ra.prototype.setBoundingRect=function(t){this._rect=t},Ra.prototype.getBoundingRect=function(){var t,e=this.style;return this._rect||(null!=(t=e.text)?t+="":t="",(t=Wn(t,e.font,e.textAlign,e.textBaseline)).x+=e.x||0,t.y+=e.y||0,this.hasStroke()&&(e=e.lineWidth,t.x-=e/2,t.y-=e/2,t.width+=e,t.height+=e),this._rect=t),this._rect},Ra.initDefaultProps=void(Ra.prototype.dirtyRectTolerance=10),Ra);function Ra(){return null!==La&&La.apply(this,arguments)||this}Oa.prototype.type="tspan";var Ea=Math.PI,Na=2*Ea,za=Math.sin,Ba=Math.cos,Va=Math.acos,Fa=Math.atan2,Ha=Math.abs,Ga=Math.sqrt,Wa=Math.max,Ua=Math.min,Xa=1e-4;function Ya(t,e,n,i,r,o,a){var s=t-n,l=e-i,u=(a?o:-o)/Ga(s*s+l*l),h=u*l,c=-u*s,p=t+h,d=e+c,a=n+h,l=i+c,u=(p+a)/2,s=(d+l)/2,t=a-p,e=l-d,n=t*t+e*e,i=r-o,o=p*l-a*d,p=(e<0?-1:1)*Ga(Wa(0,i*i*n-o*o)),l=(o*e-t*p)/n,a=(-o*t-e*p)/n,d=(o*e+t*p)/n,e=(-o*t+e*p)/n,p=l-u,n=a-s,u=d-u,s=e-s;return u*u+s*s<p*p+n*n&&(l=d,a=e),{cx:l,cy:a,x01:-h,y01:-c,x11:l*(r/i-1),y11:a*(r/i-1)}}function Za(t,e){var n,i,r,o,a,s,l,u,h,c,p,d,f,g,y,m,v,_,x,b,w,S,M,T=Wa(e.r,0),C=Wa(e.r0||0,0),I=0<T;(I||0<C)&&(I||(T=C,C=0),T<C&&(w=T,T=C,C=w),n=!!e.clockwise,Jr(m=[i=e.startAngle,r=e.endAngle],!n),o=Ha(m[0]-m[1]),a=e.cx,s=e.cy,f=e.cornerRadius||0,y=e.innerCornerRadius||0,Xa<T?Na-Xa<o?(t.moveTo(a+T*Ba(i),s+T*za(i)),t.arc(a,s,T,i,r,!n),Xa<C&&(t.moveTo(a+C*Ba(r),s+C*za(r)),t.arc(a,s,C,r,i,n))):(g=Ha(T-C)/2,l=Ua(g,f),v=u=Ua(g,y),_=l,h=T*Ba(i),c=T*za(i),p=C*Ba(r),d=C*za(r),w=I=b=x=void 0,(Xa<l||Xa<u)&&(x=T*Ba(r),b=T*za(r),I=C*Ba(i),w=C*za(i),o<Ea&&((m=function(t,e,n,i,r,o,a,s){var l=n-t,n=i-e,i=a-r;if(!((s=(a=s-o)*l-i*n)*s<Xa))return[t+(s=(i*(e-o)-a*(t-r))/s)*l,e+s*n]}(h,c,I,w,x,b,p,d))&&(e=h-m[0],f=c-m[1],g=x-m[0],y=b-m[1],y=1/za(Va((e*g+f*y)/(Ga(e*e+f*f)*Ga(g*g+y*y)))/2),m=Ga(m[0]*m[0]+m[1]*m[1]),v=Ua(u,(C-m)/(y-1)),_=Ua(l,(T-m)/(1+y))))),Xa<o?Xa<_?(S=Ya(I,w,h,c,T,_,n),M=Ya(x,b,p,d,T,_,n),t.moveTo(a+S.cx+S.x01,s+S.cy+S.y01),_<l?t.arc(a+S.cx,s+S.cy,_,Fa(S.y01,S.x01),Fa(M.y01,M.x01),!n):(t.arc(a+S.cx,s+S.cy,_,Fa(S.y01,S.x01),Fa(S.y11,S.x11),!n),t.arc(a,s,T,Fa(S.cy+S.y11,S.cx+S.x11),Fa(M.cy+M.y11,M.cx+M.x11),!n),t.arc(a+M.cx,s+M.cy,_,Fa(M.y11,M.x11),Fa(M.y01,M.x01),!n))):(t.moveTo(a+h,s+c),t.arc(a,s,T,i,r,!n)):t.moveTo(a+h,s+c),Xa<C&&Xa<o?Xa<v?(S=Ya(p,d,x,b,C,-v,n),M=Ya(h,c,I,w,C,-v,n),t.lineTo(a+S.cx+S.x01,s+S.cy+S.y01),v<u?t.arc(a+S.cx,s+S.cy,v,Fa(S.y01,S.x01),Fa(M.y01,M.x01),!n):(t.arc(a+S.cx,s+S.cy,v,Fa(S.y01,S.x01),Fa(S.y11,S.x11),!n),t.arc(a,s,C,Fa(S.cy+S.y11,S.cx+S.x11),Fa(M.cy+M.y11,M.cx+M.x11),n),t.arc(a+M.cx,s+M.cy,v,Fa(M.y11,M.x11),Fa(M.y01,M.x01),!n))):(t.lineTo(a+p,s+d),t.arc(a,s,C,r,i,n)):t.lineTo(a+p,s+d)):t.moveTo(a,s),t.closePath())}var ja,qa=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0,this.innerCornerRadius=0},Ka=(l($a,ja=_o),$a.prototype.getDefaultShape=function(){return new qa},$a.prototype.buildPath=function(t,e){Za(t,e)},$a.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},$a);function $a(t){return ja.call(this,t)||this}Ka.prototype.type="sector";var Ja,Qa=(l(ts,Ja=_o),ts.prototype._updatePathDirty=function(){for(var t=this.shape.paths,e=this.shapeChanged(),n=0;n<t.length;n++)e=e||t[n].shapeChanged();e&&this.dirtyShape()},ts.prototype.beforeBrush=function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},ts.prototype.buildPath=function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},ts.prototype.afterBrush=function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].pathUpdated()},ts.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),_o.prototype.getBoundingRect.call(this)},ts);function ts(){var t=null!==Ja&&Ja.apply(this,arguments)||this;return t.type="compound",t}var es,ns=[],is=(l(rs,es=$i),rs.prototype.traverse=function(t,e){t.call(e,this)},rs.prototype.useStyle=function(){this.style={}},rs.prototype.getCursor=function(){return this._cursor},rs.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},rs.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},rs.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},rs.prototype.addDisplayable=function(t,e){(e?this._temporaryDisplayables:this._displayables).push(t),this.markRedraw()},rs.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},rs.prototype.getDisplayables=function(){return this._displayables},rs.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},rs.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},rs.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(var e,t=0;t<this._temporaryDisplayables.length;t++){(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},rs.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new Rn(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(ns)),t.union(i)}this._rect=t}return this._rect},rs.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},rs);function rs(){var t=null!==es&&es.apply(this,arguments)||this;return t.notClear=!0,t.incremental=!0,t._displayables=[],t._temporaryDisplayables=[],t._cursor=0,t}var os=new Be(50);function as(t,e,n,i,r){if(t){if("string"!=typeof t)return t;if(e&&e.__zrImageSrc===t||!n)return e;var o=os.get(t),r={hostEl:n,cb:i,cbPayload:r};return o?ls(e=o.image)||o.pending.push(r):((e=new Image).onload=e.onerror=ss,os.put(t,e.__cachedImgObj={image:e,pending:[r]}),e.src=e.__zrImageSrc=t),e}return e}function ss(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function ls(t){return t&&t.width&&t.height}var us=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;function hs(t,e,n,i,r){if(!e)return"";var o=(t+"").split("\n");r=cs(e,n,i,r);for(var a=0,s=o.length;a<s;a++)o[a]=ps(o[a],r);return o.join("\n")}function cs(t,e,n,i){var r=A({},i=i||{});r.font=e,n=Q(n,"..."),r.maxIterations=Q(i.maxIterations,2);var o=r.minChar=Q(i.minChar,0);r.cnCharWidth=Hn("国",e);var a=r.ascCharWidth=Hn("a",e);r.placeholder=Q(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<o&&a<=s;l++)s-=a;e=Hn(n,e);return s<e&&(n="",e=0),s=t-e,r.ellipsis=n,r.ellipsisWidth=e,r.contentWidth=s,r.containerWidth=t,r}function ps(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";if((s=Hn(t,i))<=n)return t;for(var o=0;;o++){if(s<=r||o>=e.maxIterations){t+=e.ellipsis;break}var a=0===o?function(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}(t,r,e.ascCharWidth,e.cnCharWidth):0<s?Math.floor(t.length*r/s):0,s=Hn(t=t.substr(0,a),i)}return""===t&&(t=e.placeholder),t}var ds=function(){},fs=function(t){this.tokens=[],t&&(this.tokens=t)},gs=function(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]};function ys(t,e){var n=new gs;if(null!=t&&(t+=""),!t)return n;for(var i,r=e.width,o=e.height,a=e.overflow,s="break"!==a&&"breakAll"!==a||null==r?null:{width:r,accumWidth:0,breakAll:"breakAll"===a},l=us.lastIndex=0;null!=(i=us.exec(t));){var u=i.index;l<u&&ms(n,t.substring(l,u),e,s),ms(n,i[2],e,s,i[1]),l=us.lastIndex}l<t.length&&ms(n,t.substring(l,t.length),e,s);var h=[],c=0,p=0,d=e.padding,f="truncate"===a,g="truncate"===e.lineOverflow;function y(t,e,n){t.width=e,t.lineHeight=n,c+=n,p=Math.max(p,e)}t:for(var m=0;m<n.lines.length;m++){for(var v=n.lines[m],_=0,x=0,b=0;b<v.tokens.length;b++){var w=(D=v.tokens[b]).styleName&&e.rich[D.styleName]||{},S=D.textPadding=w.padding,M=S?S[1]+S[3]:0,T=D.font=w.font||e.font;D.contentHeight=Yn(T);var C=Q(w.height,D.contentHeight);if(D.innerHeight=C,S&&(C+=S[0]+S[2]),D.height=C,D.lineHeight=tt(w.lineHeight,e.lineHeight,C),D.align=w&&w.align||e.align,D.verticalAlign=w&&w.verticalAlign||"middle",g&&null!=o&&c+D.lineHeight>o){0<b?(v.tokens=v.tokens.slice(0,b),y(v,x,_),n.lines=n.lines.slice(0,m+1)):n.lines=n.lines.slice(0,m);break t}var I,A=w.width,S=null==A||"auto"===A;"string"==typeof A&&"%"===A.charAt(A.length-1)?(D.percentWidth=A,h.push(D),D.contentWidth=Hn(D.text,T)):(!S||(I=(A=w.backgroundColor)&&A.image)&&ls(I="string"!=typeof(A=I)?A:(A=os.get(A))&&A.image)&&(D.width=Math.max(D.width,I.width*C/I.height)),null!=(I=f&&null!=r?r-x:null)&&I<D.width?!S||I<M?(D.text="",D.width=D.contentWidth=0):(D.text=hs(D.text,I-M,T,e.ellipsis,{minChar:e.truncateMinChar}),D.width=D.contentWidth=Hn(D.text,T)):D.contentWidth=Hn(D.text,T)),D.width+=M,x+=D.width,w&&(_=Math.max(_,D.lineHeight))}y(v,x,_)}n.outerWidth=n.width=Q(r,p),n.outerHeight=n.height=Q(o,c),n.contentHeight=c,n.contentWidth=p,d&&(n.outerWidth+=d[1]+d[3],n.outerHeight+=d[0]+d[2]);for(m=0;m<h.length;m++){var D,k=(D=h[m]).percentWidth;D.width=parseInt(k,10)/100*n.width}return n}function ms(t,e,n,i,r){var o,a,s,l=""===e,u=r&&n.rich[r]||{},h=t.lines,c=u.font||n.font,p=!1;i?(n=(n=u.padding)?n[1]+n[3]:0,null!=u.width&&"auto"!==u.width?(s=function(t,e){if("string"!=typeof t)return t;if(0<=t.lastIndexOf("%"))return parseFloat(t)/100*e;return parseFloat(t)}(u.width,i.width)+n,0<h.length&&s+i.accumWidth>i.width&&(o=e.split("\n"),p=!0),i.accumWidth=s):(s=_s(e,c,i.width,i.breakAll,i.accumWidth),i.accumWidth=s.accumWidth+n,a=s.linesWidths,o=s.lines)):o=e.split("\n");for(var d=0;d<o.length;d++){var f,g,y=o[d],m=new ds;m.styleName=r,m.text=y,m.isLineHolder=!y&&!l,m.width="number"==typeof u.width?u.width:a?a[d]:Hn(y,c),d||p?h.push(new fs([m])):1===(g=(f=(h[h.length-1]||(h[0]=new fs)).tokens).length)&&f[0].isLineHolder?f[0]=m:!y&&g&&!l||f.push(m)}}var vs=C(",&?/;] ".split(""),function(t,e){return t[e]=!0,t},{});function _s(t,e,n,i,r){for(var o,a=[],s=[],l="",u="",h=0,c=0,p=0;p<t.length;p++){var d,f,g=t.charAt(p);"\n"!==g?(d=Hn(g,e),f=!i&&(o=void 0,!(!(33<=(o=(o=f=g).charCodeAt(0))&&o<=255)||!!vs[f])),(a.length?n<c+d:n<r+c+d)?c?(l||u)&&(c=f?(l||(l=u,u="",c=h=0),a.push(l),s.push(c-h),u+=g,l="",h+=d):(u&&(l+=u,c+=h,u="",h=0),a.push(l),s.push(c),l=g,d)):f?(a.push(u),s.push(h),u=g,h=d):(a.push(g),s.push(d)):(c+=d,f?(u+=g,h+=d):(u&&(l+=u,u="",h=0),l+=g))):(u&&(l+=u,c+=h),a.push(l),s.push(c),u=l="",c=h=0)}return a.length||l||(l=t,u="",h=0),u&&(l+=u),l&&(a.push(l),s.push(c)),1===a.length&&(c+=r),{accumWidth:c,lines:a,linesWidths:s}}var xs,bs={fill:"#000"},ws={style:D({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ji.style)},Ss=(l(Ms,xs=$i),Ms.prototype.childrenRef=function(){return this._children},Ms.prototype.update=function(){this.styleChanged()&&this._updateSubTexts();for(var t=0;t<this._children.length;t++){var e=this._children[t];e.zlevel=this.zlevel,e.z=this.z,e.z2=this.z2,e.culling=this.culling,e.cursor=this.cursor,e.invisible=this.invisible}var n=this.attachedTransform;n?(n.updateTransform(),(n=n.transform)?(this.transform=this.transform||[],me(this.transform,n)):this.transform=null):xs.prototype.update.call(this)},Ms.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),this.attachedTransform?this.attachedTransform.getComputedTransform():xs.prototype.getComputedTransform.call(this)},Ms.prototype._updateSubTexts=function(){var t;this._childCursor=0,Is(t=this.style),E(t.rich,Is),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},Ms.prototype.addSelfToZr=function(t){xs.prototype.addSelfToZr.call(this,t);for(var e=0;e<this._children.length;e++)this._children[e].__zr=t},Ms.prototype.removeSelfFromZr=function(t){xs.prototype.removeSelfFromZr.call(this,t);for(var e=0;e<this._children.length;e++)this._children[e].__zr=null},Ms.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var t=new Rn(0,0,0,0),e=this._children,n=[],i=null,r=0;r<e.length;r++){var o=e[r],a=o.getBoundingRect(),o=o.getLocalTransform(n);o?(t.copy(a),t.applyTransform(o),(i=i||t.clone()).union(t)):(i=i||a.clone()).union(a)}this._rect=i||t}return this._rect},Ms.prototype.setDefaultTextStyle=function(t){this._defaultStyle=t||bs},Ms.prototype.setTextContent=function(t){throw new Error("Can't attach text on another text")},Ms.prototype._mergeStyle=function(t,e){if(!e)return t;var n=e.rich,i=t.rich||n&&{};return A(t,e),n&&i?(this._mergeRich(i,n),t.rich=i):i&&(t.rich=i),t},Ms.prototype._mergeRich=function(t,e){for(var n=N(e),i=0;i<n.length;i++){var r=n[i];t[r]=t[r]||{},A(t[r],e[r])}},Ms.prototype.getAnimationStyleProps=function(){return ws},Ms.prototype._getOrCreateChild=function(t){var e=this._children[this._childCursor];return e&&e instanceof t||(e=new t),(this._children[this._childCursor++]=e).__zr=this.__zr,e.parent=this,e},Ms.prototype._updatePlainTexts=function(){var t,e,n=this.style,i=n.font||Vn,r=n.padding,o=function(t,e){null!=t&&(t+="");var n,i=e.overflow,r=e.padding,o=e.font,a="truncate"===i,s=Yn(o),l=Q(e.lineHeight,s),u="truncate"===e.lineOverflow,h=e.width,c=(n=null!=h&&"break"===i||"breakAll"===i?t?_s(t,e.font,h,"breakAll"===i,0).lines:[]:t?t.split("\n"):[]).length*l;(i=Q(e.height,c))<c&&u&&(p=Math.floor(i/l),n=n.slice(0,p));var u=i,p=h;if(r&&(u+=r[0]+r[2],null!=p&&(p+=r[1]+r[3])),t&&a&&null!=p)for(var d=cs(h,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),f=0;f<n.length;f++)n[f]=ps(n[f],d);if(null==h){for(var g=0,f=0;f<n.length;f++)g=Math.max(Hn(n[f],o),g);h=g}return{lines:n,height:i,outerHeight:u,lineHeight:l,calculatedLineHeight:s,contentHeight:c,width:h}}(ks(n),n),a=Ls(n),s=!!n.backgroundColor,l=o.outerHeight,u=o.lines,h=o.lineHeight,c=this._defaultStyle,p=n.x||0,d=n.y||0,f=n.align||c.align||"left",g=n.verticalAlign||c.verticalAlign||"top",y=p,m=Xn(d,o.contentHeight,g);(a||r)&&(t=o.width,r&&(t+=r[1]+r[3]),e=Un(p,t,f),d=Xn(d,l,g),a&&this._renderBackground(n,n,e,d,t,l)),m+=h/2,r&&(y=Ds(p,f,r),"top"===g?m+=r[0]:"bottom"===g&&(m-=r[2]));for(var v=0,g=!1,_=(null==(r="fill"in n?n.fill:(g=!0,c.fill))||"none"===r?null:r.image||r.colorStops?"#000":r),x=(As("stroke"in n?n.stroke:s||c.autoStroke&&!g?null:(v=2,c.stroke))),b=0<n.textShadowBlur,w=null!=n.width&&("truncate"===n.overflow||"break"===n.overflow||"breakAll"===n.overflow),S=o.calculatedLineHeight,M=0;M<u.length;M++){var T=this._getOrCreateChild(Oa),C=T.createStyle();T.useStyle(C),C.text=u[M],C.x=y,C.y=m,f&&(C.textAlign=f),C.textBaseline="middle",C.opacity=n.opacity,C.strokeFirst=!0,b&&(C.shadowBlur=n.textShadowBlur||0,C.shadowColor=n.textShadowColor||"transparent",C.shadowOffsetX=n.textShadowOffsetX||0,C.shadowOffsetY=n.textShadowOffsetY||0),x&&(C.stroke=x,C.lineWidth=n.lineWidth||v,C.lineDash=n.lineDash,C.lineDashOffset=n.lineDashOffset||0),_&&(C.fill=_),C.font=i,m+=h,w&&T.setBoundingRect(new Rn(Un(C.x,n.width,C.textAlign),Xn(C.y,S,C.textBaseline),n.width,S))}},Ms.prototype._updateRichTexts=function(){var t=this.style,e=ys(ks(t),t),n=e.width,i=e.outerWidth,r=e.outerHeight,o=t.padding,a=t.x||0,s=t.y||0,l=this._defaultStyle,u=t.align||l.align,l=t.verticalAlign||l.verticalAlign,u=Un(a,i,u),l=Xn(s,r,l),h=u,c=l;o&&(h+=o[3],c+=o[0]);var p=h+n;Ls(t)&&this._renderBackground(t,t,u,l,i,r);for(var d=!!t.backgroundColor,f=0;f<e.lines.length;f++){for(var g=e.lines[f],y=g.tokens,m=y.length,v=g.lineHeight,_=g.width,x=0,b=h,w=p,S=m-1,M=void 0;x<m&&(!(M=y[x]).align||"left"===M.align);)this._placeToken(M,t,v,c,b,"left",d),_-=M.width,b+=M.width,x++;for(;0<=S&&"right"===(M=y[S]).align;)this._placeToken(M,t,v,c,w,"right",d),_-=M.width,w-=M.width,S--;for(b+=(n-(b-h)-(p-w)-_)/2;x<=S;)M=y[x],this._placeToken(M,t,v,c,b+M.width/2,"center",d),b+=M.width,x++;c+=v}},Ms.prototype._placeToken=function(t,e,n,i,r,o,a){var s=e.rich[t.styleName]||{};s.text=t.text;var l=t.verticalAlign,u=i+n/2;"top"===l?u=i+t.height/2:"bottom"===l&&(u=i+n-t.height/2),!t.isLineHolder&&Ls(s)&&this._renderBackground(s,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,u-t.height/2,t.width,t.height);var h=!!s.backgroundColor,c=t.textPadding;c&&(r=Ds(r,o,c),u-=t.height/2-c[0]-t.innerHeight/2);var p=this._getOrCreateChild(Oa),d=p.createStyle();p.useStyle(d);l=this._defaultStyle,i=!1,n=0,c=As("fill"in s?s.fill:"fill"in e?e.fill:(i=!0,l.fill)),i=As("stroke"in s?s.stroke:"stroke"in e?e.stroke:h||a||l.autoStroke&&!i?null:(n=2,l.stroke)),l=0<s.textShadowBlur||0<e.textShadowBlur;d.text=t.text,d.x=r,d.y=u,l&&(d.shadowBlur=s.textShadowBlur||e.textShadowBlur||0,d.shadowColor=s.textShadowColor||e.textShadowColor||"transparent",d.shadowOffsetX=s.textShadowOffsetX||e.textShadowOffsetX||0,d.shadowOffsetY=s.textShadowOffsetY||e.textShadowOffsetY||0),d.textAlign=o,d.textBaseline="middle",d.font=t.font||Vn,d.opacity=tt(s.opacity,e.opacity,1),i&&(d.lineWidth=tt(s.lineWidth,e.lineWidth,n),d.lineDash=Q(s.lineDash,e.lineDash),d.lineDashOffset=e.lineDashOffset||0,d.stroke=i),c&&(d.fill=c);c=t.contentWidth,t=t.contentHeight;p.setBoundingRect(new Rn(Un(d.x,c,d.textAlign),Xn(d.y,t,d.textBaseline),c,t))},Ms.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=H(u),d=t.borderRadius,f=this;(p||h&&c)&&((a=this._getOrCreateChild(oa)).useStyle(a.createStyle()),a.style.fill=null,(s=a.shape).x=n,s.y=i,s.width=r,s.height=o,s.r=d,a.dirtyShape()),p?((l=a.style).fill=u||null,l.fillOpacity=Q(t.fillOpacity,1)):u&&u.image&&((g=this._getOrCreateChild(Yo)).onload=function(){f.dirtyStyle()},(p=g.style).image=u.image,p.x=n,p.y=i,p.width=r,p.height=o),h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=Q(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var g=(a||g).style;g.shadowBlur=t.shadowBlur||0,g.shadowColor=t.shadowColor||"transparent",g.shadowOffsetX=t.shadowOffsetX||0,g.shadowOffsetY=t.shadowOffsetY||0,g.opacity=tt(t.opacity,e.opacity,1)},Ms.makeFont=function(t){var e,n="";return(t.fontSize||t.fontFamily||t.fontWeight)&&(e="",e="string"!=typeof t.fontSize||-1===t.fontSize.indexOf("px")&&-1===t.fontSize.indexOf("rem")&&-1===t.fontSize.indexOf("em")?isNaN(+t.fontSize)?"12px":t.fontSize+"px":t.fontSize,n=[t.fontStyle,t.fontWeight,e,t.fontFamily||"sans-serif"].join(" ")),n&&rt(n)||t.textFont||t.font},Ms);function Ms(t){var e=xs.call(this)||this;return e.type="text",e._children=[],e._defaultStyle=bs,e.attr(t),e}var Ts={left:!0,right:1,center:1},Cs={top:1,bottom:1,middle:1};function Is(t){var e;t&&(t.font=Ss.makeFont(t),"middle"===(e=t.align)&&(e="center"),t.align=null==e||Ts[e]?e:"left","center"===(e=t.verticalAlign)&&(e="middle"),t.verticalAlign=null==e||Cs[e]?e:"top",t.padding&&(t.padding=nt(t.padding)))}function As(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Ds(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function ks(t){t=t.text;return null!=t&&(t+=""),t}function Ls(t){return!!(t.backgroundColor||t.borderWidth&&t.borderColor)}var Ps,Os=function(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},Rs=(l(Es,Ps=_o),Es.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},Es.prototype.getDefaultShape=function(){return new Os},Es.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),e=Math.sin(o);t.moveTo(l*r+n,e*r+i),t.arc(n,i,r,o,a,!s)},Es);function Es(t){return Ps.call(this,t)||this}Rs.prototype.type="arc";var Ns=[],zs=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1};function Bs(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?dr:pr)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?dr:pr)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?_r:vr)(t.x1,t.cpx1,t.x2,e),(n?_r:vr)(t.y1,t.cpy1,t.y2,e)]}var Vs,Fs=(l(Hs,Vs=_o),Hs.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},Hs.prototype.getDefaultShape=function(){return new zs},Hs.prototype.buildPath=function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.cpx1,s=e.cpy1,l=e.cpx2,u=e.cpy2,e=e.percent;0!==e&&(t.moveTo(n,i),null==l||null==u?(e<1&&(br(n,a,r,e,Ns),a=Ns[1],r=Ns[2],br(i,s,o,e,Ns),s=Ns[1],o=Ns[2]),t.quadraticCurveTo(a,s,r,o)):(e<1&&(yr(n,a,l,r,e,Ns),a=Ns[1],l=Ns[2],r=Ns[3],yr(i,s,u,o,e,Ns),s=Ns[1],u=Ns[2],o=Ns[3]),t.bezierCurveTo(a,s,l,u,r,o)))},Hs.prototype.pointAt=function(t){return Bs(this.shape,t,!1)},Hs.prototype.tangentAt=function(t){t=Bs(this.shape,t,!0);return wt(t,t)},Hs);function Hs(t){return Vs.call(this,t)||this}Fs.prototype.type="bezier-curve";var Gs,Ws=function(){this.cx=0,this.cy=0,this.width=0,this.height=0};function Us(t){return Gs.call(this,t)||this}(l(Us,Gs=_o),Us.prototype.getDefaultShape=function(){return new Ws},Us.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=e.width,e=e.height;t.moveTo(n,i+r),t.bezierCurveTo(n+r,i+r,n+3*r/2,i-r/3,n,i-e),t.bezierCurveTo(n-3*r/2,i-r/3,n-r,i+r,n,i+r),t.closePath()},Us).prototype.type="droplet";var Xs,Ys=function(){this.cx=0,this.cy=0,this.width=0,this.height=0};function Zs(t){return Xs.call(this,t)||this}(l(Zs,Xs=_o),Zs.prototype.getDefaultShape=function(){return new Ys},Zs.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=e.width,e=e.height;t.moveTo(n,i),t.bezierCurveTo(n+r/2,i-2*e/3,n+2*r,i+e/3,n,i+e),t.bezierCurveTo(n-2*r,i+e/3,n-r/2,i-2*e/3,n,i)},Zs).prototype.type="heart";var js,qs=Math.PI,Ks=Math.sin,$s=Math.cos,Js=function(){this.x=0,this.y=0,this.r=0,this.n=0};function Qs(t){return js.call(this,t)||this}(l(Qs,js=_o),Qs.prototype.getDefaultShape=function(){return new Js},Qs.prototype.buildPath=function(t,e){var n=e.n;if(n&&!(n<2)){var i=e.x,r=e.y,o=e.r,a=2*qs/n,s=-qs/2;t.moveTo(i+o*$s(s),r+o*Ks(s));for(var l=0,u=n-1;l<u;l++)s+=a,t.lineTo(i+o*$s(s),r+o*Ks(s));t.closePath()}},Qs).prototype.type="isogon";var tl,el=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},nl=(l(il,tl=_o),il.prototype.getDefaultShape=function(){return new el},il.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},il);function il(t){return tl.call(this,t)||this}nl.prototype.type="ring";var rl,ol=Math.sin,al=Math.cos,sl=Math.PI/180,ll=function(){this.cx=0,this.cy=0,this.r=[],this.k=0,this.n=1};function ul(t){return rl.call(this,t)||this}(l(ul,rl=_o),ul.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},ul.prototype.getDefaultShape=function(){return new ll},ul.prototype.buildPath=function(t,e){var n,i,r,o=e.r,a=e.k,s=e.n,l=e.cx,u=e.cy;t.moveTo(l,u);for(var h=0,c=o.length;h<c;h++){r=o[h];for(var p=0;p<=360*s;p++)n=r*ol(a/s*p%360*sl)*al(p*sl)+l,i=r*ol(a/s*p%360*sl)*ol(p*sl)+u,t.lineTo(n,i)}},ul).prototype.type="rose";var hl,cl=Math.PI,pl=Math.cos,dl=Math.sin,fl=function(){this.cx=0,this.cy=0,this.n=3,this.r=0};function gl(t){return hl.call(this,t)||this}(l(gl,hl=_o),gl.prototype.getDefaultShape=function(){return new fl},gl.prototype.buildPath=function(t,e){var n=e.n;if(n&&!(n<2)){var i=e.cx,r=e.cy,o=e.r,a=e.r0;null==a&&(a=4<n?o*pl(2*cl/n)/pl(cl/n):o/3);var s=cl/n,l=-cl/2,u=i+o*pl(l),e=r+o*dl(l);l+=s,t.moveTo(u,e);for(var h,c=0,p=2*n-1;c<p;c++)h=c%2==0?a:o,t.lineTo(i+h*pl(l),r+h*dl(l)),l+=s;t.closePath()}},gl).prototype.type="star";var yl,ml=Math.cos,vl=Math.sin,_l=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0,this.d=0,this.location="out"};function xl(t){return yl.call(this,t)||this}(l(xl,yl=_o),xl.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},xl.prototype.getDefaultShape=function(){return new _l},xl.prototype.buildPath=function(t,e){var n,i=e.r,r=e.r0,o=e.d,a=e.cx,s=e.cy,l="out"===e.location?1:-1;if(!(e.location&&i<=r)){var u,h=0,c=1,p=(i+l*r)*ml(0)-l*o*ml(0)+a,e=(i+l*r)*vl(0)-o*vl(0)+s;for(t.moveTo(p,e);r*++h%(i+l*r)!=0;);for(;u=Math.PI/180*c,n=(i+l*r)*ml(u)-l*o*ml((i/r+l)*u)+a,u=(i+l*r)*vl(u)-o*vl((i/r+l)*u)+s,t.lineTo(n,u),++c<=r*h/(i+l*r)*360;);}},xl).prototype.type="trochoid";var bl,wl=(l(Sl,bl=Ca),Sl);function Sl(t,e,n,i,r){i=bl.call(this,i)||this;return i.x=null==t?.5:t,i.y=null==e?.5:e,i.r=null==n?.5:n,i.type="radial",i.global=r||!1,i}var Ml=[0,0],Tl=[0,0],Cl=new Mn,Il=new Mn,Al=(Dl.prototype.fromBoundingRect=function(t,e){var n=this._corners,i=this._axes,r=t.x,o=t.y,a=r+t.width,t=o+t.height;if(n[0].set(r,o),n[1].set(a,o),n[2].set(a,t),n[3].set(r,t),e)for(var s=0;s<4;s++)n[s].transform(e);Mn.sub(i[0],n[1],n[0]),Mn.sub(i[1],n[3],n[0]),i[0].normalize(),i[1].normalize();for(s=0;s<2;s++)this._origin[s]=i[s].dot(n[0])},Dl.prototype.intersect=function(t,e){var n=!0,i=!e;return Cl.set(1/0,1/0),Il.set(0,0),!this._intersectCheckOneSide(this,t,Cl,Il,i,1)&&(n=!1,i)||!this._intersectCheckOneSide(t,this,Cl,Il,i,-1)&&(n=!1,i)||i||Mn.copy(e,n?Cl:Il),n},Dl.prototype._intersectCheckOneSide=function(t,e,n,i,r,o){for(var a=!0,s=0;s<2;s++){var l=this._axes[s];if(this._getProjMinMaxOnAxis(s,t._corners,Ml),this._getProjMinMaxOnAxis(s,e._corners,Tl),Ml[1]<Tl[0]||Tl[1]<Ml[0]){if(a=!1,r)return a;var u=Math.abs(Tl[0]-Ml[1]),h=Math.abs(Ml[0]-Tl[1]);Math.min(u,h)>i.len()&&(u<h?Mn.scale(i,l,-u*o):Mn.scale(i,l,h*o))}else{n&&(u=Math.abs(Tl[0]-Ml[1]),h=Math.abs(Ml[0]-Tl[1]),Math.min(u,h)<n.len()&&(u<h?Mn.scale(n,l,u*o):Mn.scale(n,l,-h*o)))}}return a},Dl.prototype._getProjMinMaxOnAxis=function(t,e,n){for(var i=this._axes[t],r=this._origin,o=e[0].dot(i)+r[t],a=o,s=o,l=1;l<e.length;l++)var u=e[l].dot(i)+r[t],a=Math.min(u,a),s=Math.max(u,s);n[0]=a,n[1]=s},Dl);function Dl(t,e){this._corners=[],this._axes=[],this._origin=[0,0];for(var n=0;n<4;n++)this._corners[n]=new Mn;for(n=0;n<2;n++)this._axes[n]=new Mn;t&&this.fromBoundingRect(t,e)}var kl=!w.canvasSupported,Ll={},Pl={};var Ol=(Rl.prototype.add=function(t){t&&(this.storage.addRoot(t),t.addSelfToZr(this),this.refresh())},Rl.prototype.remove=function(t){t&&(this.storage.delRoot(t),t.removeSelfFromZr(this),this.refresh())},Rl.prototype.configLayer=function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this.refresh()},Rl.prototype.setBackgroundColor=function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this.refresh(),this._backgroundColor=t,this._darkMode=function(t){if(!t)return!1;if("string"==typeof t)return sn(t,1)<.4;if(t.colorStops){for(var e=t.colorStops,n=0,i=e.length,r=0;r<i;r++)n+=sn(e[r].color,1);return(n/=i)<.4}return!1}(t)},Rl.prototype.getBackgroundColor=function(){return this._backgroundColor},Rl.prototype.setDarkMode=function(t){this._darkMode=t},Rl.prototype.isDarkMode=function(){return this._darkMode},Rl.prototype.refreshImmediately=function(t){t||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},Rl.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},Rl.prototype.flush=function(){this._flush(!1)},Rl.prototype._flush=function(t){var e,n=(new Date).getTime();this._needsRefresh&&(e=!0,this.refreshImmediately(t)),this._needsRefreshHover&&(e=!0,this.refreshHoverImmediately());t=(new Date).getTime();e?(this._stillFrameAccum=0,this.trigger("rendered",{elapsedTime:t-n})):0<this._sleepAfterStill&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},Rl.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},Rl.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},Rl.prototype.addHover=function(t){},Rl.prototype.removeHover=function(t){},Rl.prototype.clearHover=function(){},Rl.prototype.refreshHover=function(){this._needsRefreshHover=!0},Rl.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},Rl.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},Rl.prototype.clearAnimation=function(){this.animation.clear()},Rl.prototype.getWidth=function(){return this.painter.getWidth()},Rl.prototype.getHeight=function(){return this.painter.getHeight()},Rl.prototype.pathToImage=function(t,e){if(this.painter.pathToImage)return this.painter.pathToImage(t,e)},Rl.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},Rl.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},Rl.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},Rl.prototype.off=function(t,e){this.handler.off(t,e)},Rl.prototype.trigger=function(t,e){this.handler.trigger(t,e)},Rl.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e<t.length;e++)t[e]instanceof Ho&&t[e].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},Rl.prototype.dispose=function(){var t;this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,t=this.id,delete Pl[t]},Rl);function Rl(t,e,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=e,this.id=t;var r=new xi,o=n.renderer;if(kl){if(!Ll.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");o="vml"}else o=o||"canvas";if(!Ll[o])throw new Error("Renderer '"+o+"' is not imported. Please import it first.");n.useDirtyRect=null!=n.useDirtyRect&&n.useDirtyRect;n=new Ll[o](e,r,n,t);this.storage=r,this.painter=n;t=w.node||w.worker?null:new Ui(n.getViewportRoot(),n.root);this.handler=new pe(r,n,t,n.root),this.animation=new Mi({stage:{update:function(){return i._flush(!0)}}}),this.animation.start()}function El(t,e){e=new Ol(v++,t,e);return Pl[e.id]=e}function Nl(t,e){Ll[t]=e}var n=Object.freeze({__proto__:null,init:El,dispose:function(t){t.dispose()},disposeAll:function(){for(var t in Pl)Pl.hasOwnProperty(t)&&Pl[t].dispose();Pl={}},getInstance:function(t){return Pl[t]},registerPainter:Nl,version:"5.0.1"}),zl=1e-4;function Bl(t,e,n,i){var r=e[1]-e[0],o=n[1]-n[0];if(0==r)return 0==o?n[0]:(n[0]+n[1])/2;if(i)if(0<r){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*o+n[0]}function Vl(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?t.replace(/^\s+|\s+$/g,"").match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function Fl(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Hl(t){return t.sort(function(t,e){return t-e}),t}function Gl(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}function Wl(t){var e=t.toString(),t=e.indexOf("e");if(0<t){var n=+e.slice(t+1);return n<0?-n:0}n=e.indexOf(".");return n<0?0:e.length-1-n}function Ul(t,e){var n=Math.log,i=Math.LN10,t=Math.floor(n(t[1]-t[0])/i),i=Math.round(n(Math.abs(e[1]-e[0]))/i),i=Math.min(Math.max(-t+i,0),20);return isFinite(i)?i:20}function Xl(t,e,n){if(!t[e])return 0;var i=C(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),t=O(t,function(t){return(isNaN(t)?0:t)/i*r*100}),o=100*r,a=O(t,function(t){return Math.floor(t)}),s=C(a,function(t,e){return t+e},0),l=O(t,function(t,e){return t-a[e]});s<o;){for(var u=Number.NEGATIVE_INFINITY,h=null,c=0,p=l.length;c<p;++c)l[c]>u&&(u=l[c],h=c);++a[h],l[h]=0,++s}return a[e]/r}function Yl(t){var e=2*Math.PI;return(t%e+e)%e}function Zl(t){return-zl<t&&t<zl}var jl=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function ql(t){if(t instanceof Date)return t;if("string"!=typeof t)return null==t?new Date(NaN):new Date(Math.round(t));var e=jl.exec(t);if(!e)return new Date(NaN);if(e[8]){t=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(t-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,t,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}function Kl(t){return Math.pow(10,$l(t))}function $l(t){if(0===t)return 0;var e=Math.floor(Math.log(t)/Math.LN10);return 10<=t/Math.pow(10,e)&&e++,e}function Jl(t,e){var n=$l(t),i=Math.pow(10,n),r=t/i,r=e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10;return t=r*i,-20<=n?+t.toFixed(n<0?-n:0):t}function Ql(t){var e=parseFloat(t);return e==t&&(0!==e||"string"!=typeof t||t.indexOf("x")<=0)?e:NaN}function tu(t){return!isNaN(Ql(t))}function eu(){return Math.round(9*Math.random())}function nu(t,e){return 0===e?t:nu(e,t%e)}function iu(t,e){return null==t?e:null==e?t:t*e/nu(t,e)}var ru=Object.freeze({__proto__:null,linearMap:Bl,parsePercent:Vl,round:Fl,asc:Hl,getPrecision:Gl,getPrecisionSafe:Wl,getPixelPrecision:Ul,getPercentWithPrecision:Xl,MAX_SAFE_INTEGER:9007199254740991,remRadian:Yl,isRadianAroundZero:Zl,parseDate:ql,quantity:Kl,quantityExponent:$l,nice:Jl,quantile:function(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),e=+t[i-1];return(n=n-i)?e+n*(t[i]-e):e},reformIntervals:function(t){t.sort(function(t,e){return function t(e,n,i){return e.interval[i]<n.interval[i]||e.interval[i]===n.interval[i]&&(e.close[i]-n.close[i]==(i?-1:1)||!i&&t(e,n,1))}(t,e,0)?-1:1});for(var e=-1/0,n=1,i=0;i<t.length;){for(var r=t[i].interval,o=t[i].close,a=0;a<2;a++)r[a]<=e&&(r[a]=e,o[a]=a?1:1-n),e=r[a],n=o[a];r[0]===r[1]&&o[0]*o[1]!=1?t.splice(i,1):i++}return t},numericToNumber:Ql,isNumeric:tu,getRandomIdBase:eu,getGreatestCommonDividor:nu,getLeastCommonMultiple:iu});function ou(){0}function au(t){throw new Error(t)}var su="series\0",lu="\0_ec_\0";function uu(t){return t instanceof Array?t:null==t?[]:[t]}function hu(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var o=n[i];!t.emphasis[e].hasOwnProperty(o)&&t[e].hasOwnProperty(o)&&(t.emphasis[e][o]=t[e][o])}}}var cu=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function pu(t){return!U(t)||V(t)||t instanceof Date?t:t.value}function du(t,n,e){var i="normalMerge"===e,r="replaceMerge"===e,o="replaceAll"===e;t=t||[],n=(n||[]).slice();var a=ht();E(n,function(t,e){U(t)||(n[e]=null)});var s,l,u,h,c,p,d,f,g,y,e=function(t,e,n){var i=[];if("replaceAll"===n)return i;for(var r=0;r<t.length;r++){var o=t[r];o&&null!=o.id&&e.set(o.id,r),i.push({existing:"replaceMerge"===n||vu(o)?null:o,newOption:null,keyInfo:null,brandNew:null})}return i}(t,a,e);return(i||r)&&(s=e,l=t,u=a,E(h=n,function(t,e){var n,i,r;t&&null!=t.id&&(n=gu(t.id),null!=(i=u.get(n))&&(it(!(r=s[i]).newOption,'Duplicated option on id "'+n+'".'),r.newOption=t,r.existing=l[i],h[e]=null))})),i&&(c=e,E(p=n,function(t,e){if(t&&null!=t.name)for(var n=0;n<c.length;n++){var i=c[n].existing;if(!c[n].newOption&&i&&(null==i.id||null==t.id)&&!vu(t)&&!vu(i)&&fu("name",i,t))return c[n].newOption=t,void(p[e]=null)}})),i||r?(f=e,g=r,E(n,function(t){if(t){for(var e,n=0;(e=f[n])&&(e.newOption||vu(e.existing)||e.existing&&null!=t.id&&!fu("id",t,e.existing));)n++;e?(e.newOption=t,e.brandNew=g):f.push({newOption:t,brandNew:g,existing:null,keyInfo:null}),n++}})):o&&(d=e,E(n,function(t){d.push({newOption:t,brandNew:!0,existing:null,keyInfo:null})})),o=e,y=ht(),E(o,function(t){var e=t.existing;e&&y.set(e.id,t)}),E(o,function(t){var e=t.newOption;it(!e||null==e.id||!y.get(e.id)||y.get(e.id)===t,"id duplicates: "+(e&&e.id)),e&&null!=e.id&&y.set(e.id,t),t.keyInfo||(t.keyInfo={})}),E(o,function(t,e){var n=t.existing,i=t.newOption,r=t.keyInfo;if(U(i)){if(r.name=null!=i.name?gu(i.name):n?n.name:su+e,n)r.id=gu(n.id);else if(null!=i.id)r.id=gu(i.id);else for(var o=0;r.id="\0"+r.name+"\0"+o++,y.get(r.id););y.set(r.id,t)}}),e}function fu(t,e,n){e=yu(e[t],null),t=yu(n[t],null);return null!=e&&null!=t&&e===t}function gu(t){return yu(t,"")}function yu(t,e){if(null==t)return e;var n=typeof t;return"string"==n?t:"number"==n||G(t)?t+"":e}function mu(t){t=t.name;return!(!t||!t.indexOf(su))}function vu(t){return t&&null!=t.id&&0===gu(t.id).indexOf(lu)}function _u(t,r,o){E(t,function(t){var e,n,i=t.newOption;U(i)&&(t.keyInfo.mainType=r,t.keyInfo.subType=(e=r,n=i,i=t.existing,t=o,n.type||(i?i.subType:t.determineSubType(e,n))))})}function xu(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?V(t.dataIndex)?O(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?V(t.name)?O(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function bu(){var e="__ec_inner_"+wu++;return function(t){return t[e]||(t[e]={})}}var wu=eu();function Su(n,t,r){var e,t=H(t)?((e={})[t+"Index"]=0,e):t,o=ht(),a={},s=!1;E(t,function(t,e){var n,i;"dataIndex"!==e&&"dataIndexInside"!==e?(n=(i=e.match(/^(\w+)(Index|Id|Name)$/)||[])[1],i=(i[2]||"").toLowerCase(),!n||!i||r&&r.includeMainTypes&&L(r.includeMainTypes,n)<0||(s=s||!!n,(o.get(n)||o.set(n,{}))[i]=t)):a[e]=t});var i=r?r.defaultMainType:null;return!s&&i&&o.set(i,{}),o.each(function(t,e){t=Cu(n,e,t,{useDefault:i===e,enableAll:!r||null==r.enableAll||r.enableAll,enableNone:!r||null==r.enableNone||r.enableNone});a[e+"Models"]=t.models,a[e+"Model"]=t.models[0]}),a}var Mu={useDefault:!0,enableAll:!1,enableNone:!1},Tu={useDefault:!1,enableAll:!0,enableNone:!0};function Cu(t,e,n,i){i=i||Mu;var r=n.index,o=n.id,a=n.name,n={models:null,specified:null!=r||null!=o||null!=a};if(n.specified)return"none"===r||!1===r?(it(i.enableNone,'`"none"` or `false` is not a valid value on index option.'),n.models=[]):("all"===r&&(it(i.enableAll,'`"all"` is not a valid value on index option.'),r=o=a=null),n.models=t.queryComponents({mainType:e,index:r,id:o,name:a})),n;a=void 0;return n.models=i.useDefault&&(a=t.getComponent(e))?[a]:[],n}function Iu(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function Au(t,e,n,i,r){var o=null==e||"auto"===e;if(null==i)return i;if("number"==typeof i)return Fl(l=hn(n||0,i,r),o?Math.max(Wl(n||0),Wl(i)):e);if("string"==typeof i)return r<1?n:i;for(var a,s,l,u=[],h=n||[],c=i,p=Math.max(h.length,c.length),d=0;d<p;++d){"ordinal"===t.getDimensionInfo(d).type?u[d]=(r<1?h:c)[d]:(a=h&&h[d]?h[d]:0,s=c[d],l=null==h?i[d]:hn(a,s,r),u[d]=Fl(l,o?Math.max(Wl(a),Wl(s)):e))}return u}var Du=".",ku="___EC__COMPONENT__CONTAINER___",Lu="___EC__EXTENDED_CLASS___";function Pu(t){var e={main:"",sub:""};return t&&(t=t.split(Du),e.main=t[0]||"",e.sub=t[1]||""),e}function Ou(t){(t.$constructor=t).extend=function(i){var r=this;function o(){for(var t,e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(i.$constructor)i.$constructor.apply(this,arguments);else{if("function"==typeof(t=r)&&/^class\s/.test(Function.prototype.toString.call(t)))return ct(o.prototype,new(r.bind.apply(r,a([void 0],e))));r.apply(this,arguments)}}return o[Lu]=!0,A(o.prototype,i),o.extend=this.extend,o.superCall=Nu,o.superApply=zu,M(o,this),o.superClass=r,o}}function Ru(t,e){t.extend=e.extend}var Eu=Math.round(10*Math.random());function Nu(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return this.superClass.prototype[e].apply(t,n)}function zu(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Bu(e,t){t=t||{};var n,r={};e.registerClass=function(t){var e,n=t.type||t.prototype.type;return n&&(it(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(e=n),'componentType "'+e+'" illegal'),(n=Pu(t.prototype.type=n)).sub?n.sub!==ku&&(function(t){var e=r[t.main];e&&e[ku]||((e=r[t.main]={})[ku]=!0);return e}(n)[n.sub]=t):r[n.main]=t),t},e.getClass=function(t,e,n){var i=r[t];if(i&&i[ku]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},e.getClassesByMainType=function(t){var t=Pu(t),n=[],t=r[t.main];return t&&t[ku]?E(t,function(t,e){e!==ku&&n.push(t)}):n.push(t),n},e.hasClass=function(t){t=Pu(t);return!!r[t.main]},e.getAllClassMainTypes=function(){var n=[];return E(r,function(t,e){n.push(e)}),n},e.hasSubTypes=function(t){t=Pu(t),t=r[t.main];return t&&t[ku]},!t.registerWhenExtend||(n=e.extend)&&(e.extend=function(t){t=n.call(this,t);return e.registerClass(t)})}function Vu(a,s){for(var t=0;t<a.length;t++)a[t][1]||(a[t][1]=a[t][0]);return s=s||!1,function(t,e,n){for(var i={},r=0;r<a.length;r++){var o=a[r][1];e&&0<=L(e,o)||n&&L(n,o)<0||null!=(o=t.getShallow(o,s))&&(i[a[r][0]]=o)}return i}}var Fu=Vu([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),o=(Hu.prototype.getAreaStyle=function(t,e){return Fu(this,t,e)},Hu);function Hu(){}var Gu=bu(),Wu=1,Uu={},Xu=bu(),Yu=0,Zu=1,ju=2,qu=["emphasis","blur","select"],Ku=["normal","emphasis","blur","select"],$u=10,Ju=9,Qu="highlight",th="downplay",eh="select",nh="unselect",ih="toggleSelect";function rh(t){return null!=t&&"none"!==t}var oh=new Be(100);function ah(t){if("string"!=typeof t)return t;var e=oh.get(t);return e||(e=tn(t,-.1),oh.put(t,e)),e}function sh(t,e,n){t.onHoverStateChange&&(t.hoverState||0)!==n&&t.onHoverStateChange(e),t.hoverState=n}function lh(t){sh(t,"emphasis",ju)}function uh(t){t.hoverState===ju&&sh(t,"normal",Yu)}function hh(t){sh(t,"blur",Zu)}function ch(t){t.hoverState===Zu&&sh(t,"normal",Yu)}function ph(t){t.selected=!0}function dh(t){t.selected=!1}function fh(t,e,n){e(t,n)}function gh(t,e,n){fh(t,e,n),t.isGroup&&t.traverse(function(t){fh(t,e,n)})}function yh(t,e){switch(e){case"emphasis":t.hoverState=ju;break;case"normal":t.hoverState=Yu;break;case"blur":t.hoverState=Zu;break;case"select":t.selected=!0}}function mh(t,e,n){var i=0<=L(t.currentStates,e),r=t.style.opacity,t=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a<e.length;a++){var s=e[a],l=r[s];o[s]=null==l?i&&i[s]:l}for(a=0;a<t.animators.length;a++){var u=t.animators[a];u.__fromStateTransition&&u.__fromStateTransition.indexOf(n)<0&&"style"===u.targetName&&u.saveFinalToTarget(o,e)}return o}(t,["opacity"],e,{opacity:1}),e=(n=n||{}).style||{};return null==e.opacity&&(n=A({},n),e=A({opacity:i?r:.1*t.opacity},e),n.style=e),n}function vh(t,e){var n,i,r,o,a,s=this.states[t];if(this.style){if("emphasis"===t)return n=this,r=s,o=(i=e)&&0<=L(i,"select"),a=!1,n instanceof _o&&(e=Xu(n),i=o&&e.selectFill||e.normalFill,o=o&&e.selectStroke||e.normalStroke,(rh(i)||rh(o))&&(!rh((e=(r=r||{}).style||{}).fill)&&rh(i)?(a=!0,r=A({},r),(e=A({},e)).fill=ah(i)):!rh(e.stroke)&&rh(o)&&(a||(r=A({},r),e=A({},e)),e.stroke=ah(o)),r.style=e)),r&&null==r.z2&&(a||(r=A({},r)),a=n.z2EmphasisLift,r.z2=n.z2+(null!=a?a:$u)),r;if("blur"===t)return mh(this,t,s);if("select"===t)return a=this,(r=s)&&null==r.z2&&(r=A({},r),t=a.z2SelectLift,r.z2=a.z2+(null!=t?t:Ju)),r}return s}function _h(t){t.stateProxy=vh;var e=t.getTextContent(),t=t.getTextGuideLine();e&&(e.stateProxy=vh),t&&(t.stateProxy=vh)}function xh(t,e){t.__highByOuter|=1<<(e||0),gh(t,lh)}function bh(t,e){(t.__highByOuter&=~(1<<(e||0)))||gh(t,uh)}function wh(t){gh(t,hh)}function Sh(t){gh(t,ch)}function Mh(t){gh(t,ph)}function Th(t){gh(t,dh)}function Ch(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function Ih(t,o,a,s,e){var n,l,u,h,i=s.getModel();function c(t,e){for(var n=0;n<e.length;n++){var i=t.getItemGraphicEl(e[n]);i&&Sh(i)}}a=a||"coordinateSystem",e?null!=t&&o&&"none"!==o&&(l=i.getSeriesByIndex(t),(u=l.coordinateSystem)&&u.master&&(u=u.master),h=[],i.eachSeries(function(t){var e=l===t,n=t.coordinateSystem;if(n&&n.master&&(n=n.master),!("series"===a&&!e||"coordinateSystem"===a&&!(n&&u?n===u:e)||"series"===o&&e)){if(s.getViewOfSeriesModel(t).group.traverse(function(t){hh(t)}),P(o))c(t.getData(),o);else if(U(o))for(var i=N(o),r=0;r<i.length;r++)c(t.getData(i[r]),o[i[r]]);h.push(t)}}),i.eachComponent(function(t,e){"series"===t||(e=s.getViewOfComponentModel(e))&&e.blurSeries&&e.blurSeries(h,i)})):(n=s).getModel().eachComponent(function(t,e){("series"===t?n.getViewOfSeriesModel(e):n.getViewOfComponentModel(e)).group.traverse(function(t){ch(t)})})}function Ah(i){E(i.getAllData(),function(t){var e=t.data,n=t.type;e.eachItemGraphicEl(function(t,e){(i.isSelected(e,n)?Mh:Th)(t)})})}function Dh(t,e,n){!function(t,e){var n=!1===e,e=t;t.highDownSilentOnTouch&&(e.__highDownSilentOnTouch=t.highDownSilentOnTouch);n&&!e.__highDownDispatcher||(e.__highByOuter=e.__highByOuter||0,e.__highDownDispatcher=!n)}(t,!0),gh(t,_h),function(t,e,n){t=Gu(t);null!=e?(t.focus=e,t.blurScope=n):t.focus&&(t.focus=null)}(t,e,n)}var kh=["emphasis","blur","select"],Lh={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Ph(t,e,n,i){n=n||"itemStyle";for(var r=0;r<kh.length;r++){var o=kh[r],a=e.getModel([o,n]);t.ensureState(o).style=i?i(a):a[Lh[n]]()}}function Oh(t){return!(!t||!t.__highDownDispatcher)}function Rh(t){t=t.type;return t===eh||t===nh||t===ih}function Eh(t){t=t.type;return t===Qu||t===th}var Nh=Math.max,zh=Math.min,Bh={};var Vh=function(t,e){var n,i=Vo(t,e);function r(t){t=n.call(this,t)||this;return t.applyTransform=i.applyTransform,t.buildPath=i.buildPath,t}return l(r,n=No),r};function Fh(t,e){Bh[t]=e}function Hh(t){if(Bh.hasOwnProperty(t))return Bh[t]}function Gh(t,e,n,i){e=new No(Vo(t,e));return n&&("center"===i&&(n=Uh(n,e.getBoundingRect())),Xh(e,n)),e}function Wh(t,e,n){var i=new Yo({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){"center"===n&&(t={width:t.width,height:t.height},i.setStyle(Uh(e,t)))}});return i}function Uh(t,e){var n=e.width/e.height,e=t.height*n,n=e<=t.width?t.height:(e=t.width)/n;return{x:t.x+t.width/2-e/2,y:t.y+t.height/2-n/2,width:e,height:n}}g=function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];o.path||o.createPathProxy(),o.shapeChanged()&&o.buildPath(o.path,o.shape,!0),n.push(o.path)}return(e=new _o(e)).createPathProxy(),e.buildPath=function(t){var e;Bo(t)&&(t.appendPath(n),(e=t.getContext())&&t.rebuildPath(e,1))},e};function Xh(t,e){t.applyTransform&&(e=t.getBoundingRect().calculateTransform(e),t.applyTransform(e))}var Yh=ea;function Zh(t,e,n,i,r,o,a){var s,l=!1;"function"==typeof r?(a=o,o=r,r=null):U(r)&&(o=r.cb,a=r.during,l=r.isFrom,s=r.removeOpt,r=r.dataIndex);var u,h="update"===t,c="remove"===t;i&&i.ecModel&&(u=(d=i.ecModel.getUpdatePayload())&&d.animation);var p,d,f=i&&i.isAnimationEnabled();c||e.stopAnimation("remove"),f?(f=d=p=void 0,"function"==typeof(f=u?(p=u.duration||0,d=u.easing||"cubicOut",u.delay||0):c?(p=Q((s=s||{}).duration,200),d=Q(s.easing,"cubicOut"),0):(p=i.getShallow(h?"animationDurationUpdate":"animationDuration"),d=i.getShallow(h?"animationEasingUpdate":"animationEasing"),i.getShallow(h?"animationDelayUpdate":"animationDelay")))&&(f=f(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof p&&(p=p(r)),0<p?l?e.animateFrom(n,{duration:p,delay:f||0,easing:d,done:o,force:!!o||!!a,scope:t,during:a}):e.animateTo(n,{duration:p,delay:f||0,easing:d,done:o,force:!!o||!!a,setToFinal:!0,scope:t,during:a}):(e.stopAnimation(),l||e.attr(n),o&&o())):(e.stopAnimation(),l||e.attr(n),a&&a(1),o&&o())}function jh(t,e,n,i,r,o){Zh("update",t,e,n,i,r,o)}function qh(t,e,n,i,r,o){Zh("init",t,e,n,i,r,o)}function Kh(t,e,n,i,r,o){Qh(t)||Zh("remove",t,e,n,i,r,o)}function $h(t,e,n,i){t.removeTextContent(),t.removeTextGuideLine(),Kh(t,{style:{opacity:0}},e,n,i)}function Jh(t,e,n){function i(){t.parent&&t.parent.remove(t)}t.isGroup?t.traverse(function(t){t.isGroup||$h(t,e,n,i)}):$h(t,e,n,i)}function Qh(t){if(!t.__zr)return!0;for(var e=0;e<t.animators.length;e++){if("remove"===t.animators[e].scope)return!0}return!1}function tc(t,e){for(var n=ye([]);t&&t!==e;)ve(n,t.getLocalTransform(),n),t=t.parent;return n}function ec(t,e,n){return e&&!P(e)&&(e=ke.getLocalTransform(e)),n&&(e=we([],e)),At([],t,e)}function nc(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),r=ec(r=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0],e,n);return Math.abs(r[0])>Math.abs(r[1])?0<r[0]?"right":"left":0<r[1]?"bottom":"top"}function ic(t){return!t.isGroup}function rc(t,e,i){var r,n;function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return null!=t.shape&&(e.shape=A({},t.shape)),e}t&&e&&(n={},t.traverse(function(t){ic(t)&&t.anid&&(n[t.anid]=t)}),r=n,e.traverse(function(t){var e,n;ic(t)&&t.anid&&((e=r[t.anid])&&(n=o(t),t.attr(o(e)),jh(t,n,i,Gu(t).dataIndex)))}))}function oc(t,n){return O(t,function(t){var e=t[0],e=Nh(e,n.x);e=zh(e,n.x+n.width);t=t[1],t=Nh(t,n.y);return[e,t=zh(t,n.y+n.height)]})}function ac(t,e,n){var i=A({rectHover:!0},e),e=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(e.image=t.slice(8),D(e,n),new Yo(i)):Gh(t.replace("path://",""),i,n,"center")}function sc(t,e,n,i,r,o,a,s){var l=n-t,u=i-e,n=a-r,i=s-o,a=n*u-l*i;if((s=a)<=1e-6&&-1e-6<=s)return!1;r=t-r,o=e-o,l=(r*u-l*o)/a;if(l<0||1<l)return!1;a=(r*i-n*o)/a;return!(a<0||1<a)}Fh("circle",Ko),Fh("ellipse",ua),Fh("sector",Ka),Fh("ring",nl),Fh("polygon",xa),Fh("polyline",Ma),Fh("rect",oa),Fh("line",fa),Fh("bezierCurve",Fs),Fh("arc",Rs);var lc=Object.freeze({__proto__:null,extendShape:function(t){return _o.extend(t)},extendPath:function(t,e){return Vh(t,e)},registerShape:Fh,getShapeClass:Hh,makePath:Gh,makeImage:Wh,mergePath:g,resizePath:Xh,subPixelOptimizeLine:function(t){return Qo(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return ta(t.shape,t.shape,t.style),t},subPixelOptimize:Yh,updateProps:jh,initProps:qh,removeElement:Kh,removeElementWithFadeOut:Jh,isElementRemoved:Qh,getTransform:tc,applyTransform:ec,transformDirection:nc,groupTransition:rc,clipPointsByRect:oc,clipRectByRect:function(t,e){var n=Nh(t.x,e.x),i=zh(t.x+t.width,e.x+e.width),r=Nh(t.y,e.y),e=zh(t.y+t.height,e.y+e.height);if(n<=i&&r<=e)return{x:n,y:r,width:i-n,height:e-r}},createIcon:ac,linePolygonIntersect:function(t,e,n,i,r){for(var o=0,a=r[r.length-1];o<r.length;o++){var s=r[o];if(sc(t,e,n,i,s[0],s[1],a[0],a[1]))return!0;a=s}},lineLineIntersect:sc,Group:Ho,Image:Yo,Text:Ss,Circle:Ko,Ellipse:ua,Sector:Ka,Ring:nl,Polygon:xa,Polyline:Ma,Rect:oa,Line:fa,BezierCurve:Fs,Arc:Rs,IncrementalDisplayable:is,CompoundPath:Qa,LinearGradient:Da,RadialGradient:wl,BoundingRect:Rn,OrientedBoundingRect:Al,Point:Mn,Path:_o}),uc={};function hc(t,e){for(var n=0;n<qu.length;n++){var i=qu[n],r=e[i],i=t.ensureState(i);i.style=i.style||{},i.style.text=r}var o=t.currentStates.slice();t.clearStates(!0),t.setStyle({text:e.normal}),t.useStates(o,!0)}function cc(t,e,n){var i,r=t.labelFetcher,o=t.labelDataIndex,a=t.labelDimIndex,s=e.normal;r&&(i=r.getFormattedLabel(o,"normal",null,a,s&&s.get("formatter"),null!=n?{value:n}:null)),null==i&&(i=F(t.defaultText)?t.defaultText(o,t,n):t.defaultText);for(var l={normal:i},u=0;u<qu.length;u++){var h=qu[u],c=e[h];l[h]=Q(r?r.getFormattedLabel(o,h,null,a,c&&c.get("formatter")):null,i)}return l}function pc(t,e,n,i){n=n||uc;for(var r=t instanceof Ss,o=!1,a=0;a<Ku.length;a++){if((p=e[Ku[a]])&&p.getShallow("show")){o=!0;break}}var s=r?t:t.getTextContent();if(o){r||(s||(s=new Ss,t.setTextContent(s)),t.stateProxy&&(s.stateProxy=t.stateProxy));var l=cc(n,e),u=e.normal,h=!!u.getShallow("show"),c=fc(u,i&&i.normal,n,!1,!r);c.text=l.normal,r||t.setTextConfig(gc(u,n,!1));for(a=0;a<qu.length;a++){var p,d,f,g=qu[a];(p=e[g])&&(d=s.ensureState(g),(f=!!Q(p.getShallow("show"),h))!=h&&(d.ignore=!f),d.style=fc(p,i&&i[g],n,!0,!r),d.style.text=l[g],r||(t.ensureState(g).textConfig=gc(p,n,!0)))}s.silent=!!u.getShallow("silent"),null!=s.style.x&&(c.x=s.style.x),null!=s.style.y&&(c.y=s.style.y),s.ignore=!h,s.useStyle(c),s.dirty(),n.enableTextSetter&&(xc(s).setLabelText=function(t){t=cc(n,e,t);hc(s,t)})}else s&&(s.ignore=!0);t.dirty()}function dc(t,e){e=e||"label";for(var n={normal:t.getModel(e)},i=0;i<qu.length;i++){var r=qu[i];n[r]=t.getModel([r,e])}return n}function fc(t,e,n,i,r){var o={};return function(t,e,n,i,r){n=n||uc;var o,a=e.ecModel,s=a&&a.option.textStyle,l=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||uc).rich;if(n){e=e||{};for(var i=N(n),r=0;r<i.length;r++){var o=i[r];e[o]=1}}t=t.parentModel}return e}(e);if(l)for(var u in o={},l){var h;l.hasOwnProperty(u)&&(h=e.getModel(["rich",u]),_c(o[u]={},h,s,n,i,r,!1,!0))}o&&(t.rich=o);a=e.get("overflow");a&&(t.overflow=a);a=e.get("minMargin");null!=a&&(t.margin=a);_c(t,e,s,n,i,r,!0,!1)}(o,t,n,i,r),e&&A(o,e),o}function gc(t,e,n){e=e||{};var i={},r=t.getShallow("rotate"),o=Q(t.getShallow("distance"),n?null:5),a=t.getShallow("offset"),n=t.getShallow("position")||(n?null:"inside");return"outside"===n&&(n=e.defaultOutsidePosition||"top"),null!=n&&(i.position=n),null!=a&&(i.offset=a),null!=r&&(r*=Math.PI/180,i.rotation=r),null!=o&&(i.distance=o),i.outsideFill="inherit"===t.get("color")?e.inheritColor||null:"auto",i}var yc=["fontStyle","fontWeight","fontSize","fontFamily","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY"],mc=["align","lineHeight","width","height","tag","verticalAlign"],vc=["padding","borderWidth","borderRadius","borderDashOffset","backgroundColor","borderColor","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];function _c(t,e,n,i,r,o,a,s){n=!r&&n||uc;var l=i&&i.inheritColor,u=e.getShallow("color"),h=e.getShallow("textBorderColor"),c=Q(e.getShallow("opacity"),n.opacity);"inherit"!==u&&"auto"!==u||(u=l||null),"inherit"!==h&&"auto"!==h||(h=l||null),o||(u=u||n.color,h=h||n.textBorderColor),null!=u&&(t.fill=u),null!=h&&(t.stroke=h);h=Q(e.getShallow("textBorderWidth"),n.textBorderWidth);null!=h&&(t.lineWidth=h);h=Q(e.getShallow("textBorderType"),n.textBorderType);null!=h&&(t.lineDash=h);h=Q(e.getShallow("textBorderDashOffset"),n.textBorderDashOffset);null!=h&&(t.lineDashOffset=h),r||null!=c||s||(c=i&&i.defaultOpacity),null!=c&&(t.opacity=c),r||o||null==t.fill&&i.inheritColor&&(t.fill=i.inheritColor);for(var p=0;p<yc.length;p++){var d=yc[p];null!=(f=Q(e.getShallow(d),n[d]))&&(t[d]=f)}for(p=0;p<mc.length;p++){d=mc[p];null!=(f=e.getShallow(d))&&(t[d]=f)}if(null!=t.verticalAlign||null!=(o=e.getShallow("baseline"))&&(t.verticalAlign=o),!a||!i.disableBox){for(p=0;p<vc.length;p++){var f,d=vc[p];null!=(f=e.getShallow(d))&&(t[d]=f)}i=e.getShallow("borderType");null!=i&&(t.borderDash=i),"auto"!==t.backgroundColor&&"inherit"!==t.backgroundColor||!l||(t.backgroundColor=l),"auto"!==t.borderColor&&"inherit"!==t.borderColor||!l||(t.borderColor=l)}}var xc=bu();function bc(e,n,i,t){var r,o,a,s=xc(e);s.valueAnimation&&(r=s.defaultInterpolatedText,o=s.prevValue,a=s.value,(null==o?qh:jh)(e,{},t,n,null,function(t){t=Au(i,s.precision,o,a,t),t=cc({labelDataIndex:n,defaultText:r?r(t):t+""},s.statesModels,t),hc(e,t)}))}var wc=["textStyle","color"],Sc=new Ss,qn=(Mc.prototype.getTextColor=function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(wc):null)},Mc.prototype.getFont=function(){return t={fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},e=(e=this.ecModel)&&e.getModel("textStyle"),rt([t.fontStyle||e&&e.getShallow("fontStyle")||"",t.fontWeight||e&&e.getShallow("fontWeight")||"",(t.fontSize||e&&e.getShallow("fontSize")||12)+"px",t.fontFamily||e&&e.getShallow("fontFamily")||"sans-serif"].join(" "));var t,e},Mc.prototype.getTextRect=function(t){return Sc.useStyle({text:t,fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily"),verticalAlign:this.getShallow("verticalAlign")||this.getShallow("baseline"),padding:this.getShallow("padding"),lineHeight:this.getShallow("lineHeight"),rich:this.getShallow("rich")}),Sc.update(),Sc.getBoundingRect()},Mc);function Mc(){}var Tc=[["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","type"],["lineDashOffset","dashOffset"],["lineCap","cap"],["lineJoin","join"],["miterLimit"]],Cc=Vu(Tc),Ic=(Ac.prototype.getLineStyle=function(t){return Cc(this,t)},Ac);function Ac(){}var Dc=[["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","borderType"],["lineDashOffset","borderDashOffset"],["lineCap","borderCap"],["lineJoin","borderJoin"],["miterLimit","borderMiterLimit"]],kc=Vu(Dc),Lc=(Pc.prototype.getItemStyle=function(t,e){return kc(this,t,e)},Pc);function Pc(){}var Oc,Rc,Ec=(Nc.prototype.init=function(t,e,n){for(var i=[],r=3;r<arguments.length;r++)i[r-3]=arguments[r]},Nc.prototype.mergeOption=function(t,e){b(this.option,t,!0)},Nc.prototype.get=function(t,e){return null==t?this.option:this._doGet(this.parsePath(t),!e&&this.parentModel)},Nc.prototype.getShallow=function(t,e){var n=this.option,n=null==n?n:n[t];return null!=n||e||(e=this.parentModel)&&(n=e.getShallow(t)),n},Nc.prototype.getModel=function(t,e){var n=null!=t,t=n?this.parsePath(t):null;return new Nc(n?this._doGet(t):this.option,e=e||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(t)),this.ecModel)},Nc.prototype.isEmpty=function(){return null==this.option},Nc.prototype.restoreData=function(){},Nc.prototype.clone=function(){return new this.constructor(I(this.option))},Nc.prototype.parsePath=function(t){return"string"==typeof t?t.split("."):t},Nc.prototype.resolveParentPath=function(t){return t},Nc.prototype.isAnimationEnabled=function(){if(!w.node&&this.option)return null!=this.option.animation?!!this.option.animation:this.parentModel?this.parentModel.isAnimationEnabled():void 0},Nc.prototype._doGet=function(t,e){var n=this.option;if(!t)return n;for(var i=0;i<t.length&&(!t[i]||null!=(n=n&&"object"==typeof n?n[t[i]]:null));i++);return null==n&&e&&(n=e._doGet(this.resolveParentPath(t),e.parentModel)),n},Nc);function Nc(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}Ou(Ec),Oc=Ec,Rc=["__\0is_clz",Eu++].join("_"),Oc.prototype[Rc]=!0,Oc.isInstance=function(t){return!(!t||!t[Rc])},T(Ec,Ic),T(Ec,Lc),T(Ec,o),T(Ec,qn);var zc=Math.round(10*Math.random());function Bc(t){return[t||"",zc++].join("_")}function Vc(t,e){return b(b({},t,!0),e,!0)}var Fc="ZH",Hc="EN",Gc=Hc,Wc={},Uc={},Xc=w.domSupported&&-1<(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase().indexOf(Fc)?Fc:Gc;function Yc(t,e){t=t.toUpperCase(),Uc[t]=new Ec(e),Wc[t]=e}Yc(Hc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Guage",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Yc(Fc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表，"},series:{single:{prefix:"",withName:"图表类型是{seriesType}，表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType}，",withoutName:"第{seriesId}个系列是一个{seriesType}，",separator:{middle:"；",end:"。"}}},data:{allData:"其数据是——",partialData:"其中，前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:"，",end:""}}}});var Zc=1e3,jc=60*Zc,qc=60*jc,Kc=24*qc,$i=365*Kc,$c={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{hh}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}"},Ca="{yyyy}-{MM}-{dd}",Jc={year:"{yyyy}",month:"{yyyy}-{MM}",day:Ca,hour:Ca+" "+$c.hour,minute:Ca+" "+$c.minute,second:Ca+" "+$c.second,millisecond:$c.none},Qc=["year","month","day","hour","minute","second","millisecond"],tp=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function ep(t,e){return"0000".substr(0,e-(t+="").length)+t}function np(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function ip(t,e,n,i){var r=ql(t),o=r[ap(n)](),a=r[sp(n)]()+1,s=Math.floor((a-1)/4)+1,l=r[lp(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[up(n)](),c=(h-1)%12+1,p=r[hp(n)](),d=r[cp(n)](),f=r[pp(n)](),t=(i instanceof Ec?i:Uc[i||Xc]||Uc[Gc]).getModel("time"),r=t.get("month"),n=t.get("monthAbbr"),i=t.get("dayOfWeek"),t=t.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,r[a-1]).replace(/{MMM}/g,n[a-1]).replace(/{MM}/g,ep(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,ep(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,i[u]).replace(/{ee}/g,t[u]).replace(/{e}/g,u+"").replace(/{HH}/g,ep(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,ep(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,ep(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,ep(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,ep(f,3)).replace(/{S}/g,f+"")}function rp(t,e){var n=ql(t),i=n[sp(e)]()+1,r=n[lp(e)](),o=n[up(e)](),a=n[hp(e)](),t=n[cp(e)](),e=0===n[pp(e)](),t=e&&0===t,a=t&&0===a,o=a&&0===o,r=o&&1===r;return r&&1===i?"year":r?"month":o?"day":a?"hour":t?"minute":e?"second":"millisecond"}function op(t,e,n){var i="number"==typeof t?ql(t):t;switch(e=e||rp(t,n)){case"year":return i[ap(n)]();case"half-year":return 6<=i[sp(n)]()?1:0;case"quarter":return Math.floor((i[sp(n)]()+1)/4);case"month":return i[sp(n)]();case"day":return i[lp(n)]();case"half-day":return i[up(n)]()/24;case"hour":return i[up(n)]();case"minute":return i[hp(n)]();case"second":return i[cp(n)]();case"millisecond":return i[pp(n)]()}}function ap(t){return t?"getUTCFullYear":"getFullYear"}function sp(t){return t?"getUTCMonth":"getMonth"}function lp(t){return t?"getUTCDate":"getDate"}function up(t){return t?"getUTCHours":"getHours"}function hp(t){return t?"getUTCMinutes":"getMinutes"}function cp(t){return t?"getUTCSeconds":"getSeconds"}function pp(t){return t?"getUTCSeconds":"getSeconds"}function dp(t){return t?"setUTCMonth":"setMonth"}function fp(t){return t?"setUTCDate":"setDate"}function gp(t){return t?"setUTCHours":"setHours"}function yp(t){return t?"setUTCMinutes":"setMinutes"}function mp(t){return t?"setUTCSeconds":"setSeconds"}function vp(t){return t?"setUTCSeconds":"setSeconds"}function _p(t){if(!tu(t))return H(t)?t:"-";t=(t+"").split(".");return t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(1<t.length?"."+t[1]:"")}function xp(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var bp=nt,wp=/([&<>"'])/g,Sp={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function Mp(t){return null==t?"":(t+"").replace(wp,function(t,e){return Sp[e]})}function Tp(t,e,n){function i(t){return t&&rt(t)?t:"-"}function r(t){return null!=t&&!isNaN(t)&&isFinite(t)}var o="time"===e,a=t instanceof Date;if(o||a){o=o?ql(t):t;if(!isNaN(+o))return ip(o,"yyyy-MM-dd hh:mm:ss",n);if(a)return"-"}if("ordinal"===e)return G(t)?i(t):W(t)&&r(t)?t+"":"-";e=Ql(t);return r(e)?_p(e):G(t)?i(t):"-"}function Cp(t,e){return"{"+t+(null==e?"":e)+"}"}var Ip=["a","b","c","d","e","f","g"];function Ap(t,e,n){V(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o<r.length;o++){var a=Ip[o];t=t.replace(Cp(a),Cp(a,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var u=e[s][r[l]];t=t.replace(Cp(Ip[l],s),n?Mp(u):u)}return t}function Dp(t,e){var n=H(t)?{color:t,extraCssText:e}:t||{},i=n.color,r=n.type;e=n.extraCssText;t=n.renderMode||"html";return i?"html"===t?"subItem"===r?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Mp(i)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+Mp(i)+";"+(e||"")+'"></span>':{renderMode:t,content:"{"+(n.markerId||"markerX")+"|}  ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function kp(t,e){return e=e||"transparent",H(t)?t:U(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function Lp(t,e){var n;"_blank"===e||"blank"===e?((n=window.open()).opener=null,n.location.href=t):window.open(t,e)}var Pp=Object.freeze({__proto__:null,addCommas:_p,toCamelCase:xp,normalizeCssArray:bp,encodeHTML:Mp,makeValueReadable:Tp,formatTpl:Ap,formatTplSimple:function(n,t,i){return E(t,function(t,e){n=n.replace("{"+e+"}",i?Mp(t):t)}),n},getTooltipMarker:Dp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=ql(e),r=i["get"+(l=n?"UTC":"")+"FullYear"](),o=i["get"+l+"Month"]()+1,a=i["get"+l+"Date"](),s=i["get"+l+"Hours"](),e=i["get"+l+"Minutes"](),n=i["get"+l+"Seconds"](),l=i["get"+l+"Milliseconds"]();return t=t.replace("MM",ep(o,2)).replace("M",o).replace("yyyy",r).replace("yy",r%100+"").replace("dd",ep(a,2)).replace("d",a).replace("hh",ep(s,2)).replace("h",s).replace("mm",ep(e,2)).replace("m",e).replace("ss",ep(n,2)).replace("s",n).replace("SSS",ep(l,3))},capitalFirst:function(t){return t&&t.charAt(0).toUpperCase()+t.substr(1)},convertToColorString:kp,windowOpen:Lp,truncateText:hs,getTextRect:function(t,e,n,i,r,o,a,s){return ou(),new Ss({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),Op=E,Rp=["left","right","top","bottom","width","height"],Ep=[["width","left","right"],["height","top","bottom"]];function Np(a,s,l,u,h){var c=0,p=0;null==u&&(u=1/0),null==h&&(h=1/0);var d=0;s.eachChild(function(t,e){var n,i,r=t.getBoundingRect(),o=s.childAt(e+1),e=o&&o.getBoundingRect();d="horizontal"===a?(o=r.width+(e?-e.x+r.x:0),u<(n=c+o)||t.newline?(c=0,n=o,p+=d+l,r.height):Math.max(d,r.height)):(e=r.height+(e?-e.y+r.y:0),h<(i=p+e)||t.newline?(c+=d+l,p=0,i=e,r.width):Math.max(d,r.width)),t.newline||(t.x=c,t.y=p,t.markRedraw(),"horizontal"===a?c=n+l:p=i+l)})}var zp=Np;B(Np,"vertical"),B(Np,"horizontal");function Bp(t,e,n){n=bp(n||0);var i=e.width,r=e.height,o=Vl(t.left,i),a=Vl(t.top,r),s=Vl(t.right,i),l=Vl(t.bottom,r),u=Vl(t.width,i),h=Vl(t.height,r),c=n[2]+n[0],p=n[1]+n[3],e=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=e&&(isNaN(u)&&isNaN(h)&&(i/r<e?u=.8*i:h=.8*r),isNaN(u)&&(u=e*h),isNaN(h)&&(h=u/e)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));h=new Rn(o+n[3],a+n[0],u,h);return h.margin=n,h}function Vp(t,e,n,i,r){var o,a=!r||!r.hv||r.hv[0],s=!r||!r.hv||r.hv[1],l=r&&r.boundingMode||"all";(a||s)&&("raw"===l?o="group"===t.type?new Rn(0,0,+e.width||0,+e.height||0):t.getBoundingRect():(o=t.getBoundingRect(),t.needLocalTransform()&&(r=t.getLocalTransform(),(o=o.clone()).applyTransform(r))),i=Bp(D({width:o.width,height:o.height},e),n,i),a=a?i.x-o.x:0,o=s?i.y-o.y:0,"raw"===l?(t.x=a,t.y=o):(t.x+=a,t.y+=o),t.markRedraw())}function Fp(t){t=t.layoutMode||t.constructor.layoutMode;return U(t)?t:t?{type:t}:null}function Hp(l,u,t){var h=t&&t.ignoreSize;V(h)||(h=[h,h]);var e=n(Ep[0],0),t=n(Ep[1],1);function n(t,e){var n={},i=0,r={},o=0;if(Op(t,function(t){r[t]=l[t]}),Op(t,function(t){c(u,t)&&(n[t]=r[t]=u[t]),p(n,t)&&i++,p(r,t)&&o++}),h[e])return p(u,t[1])?r[t[2]]=null:p(u,t[2])&&(r[t[1]]=null),r;if(2!==o&&i){if(2<=i)return n;for(var a=0;a<t.length;a++){var s=t[a];if(!c(n,s)&&c(l,s)){n[s]=l[s];break}}return n}return r}function c(t,e){return t.hasOwnProperty(e)}function p(t,e){return null!=t[e]&&"auto"!==t[e]}function i(t,e,n){Op(t,function(t){e[t]=n[t]})}i(Ep[0],l,e),i(Ep[1],l,t)}function Gp(t){return Wp({},t)}function Wp(e,n){return n&&e&&Op(Rp,function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e}var Up,Xp,Yp,Zp,jp=bu(),qp=(l(Kp,Up=Ec),Kp.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},Kp.prototype.mergeDefaultAndTheme=function(t,e){var n=Fp(this),i=n?Gp(t):{};b(t,e.getTheme().get(this.mainType)),b(t,this.getDefaultOption()),n&&Hp(t,i,n)},Kp.prototype.mergeOption=function(t,e){b(this.option,t,!0);var n=Fp(this);n&&Hp(this.option,t,n)},Kp.prototype.optionUpdated=function(t,e){},Kp.prototype.getDefaultOption=function(){var t=this.constructor;if(!(e=t)||!e[Lu])return t.defaultOption;var e=jp(this);if(!e.defaultOption){for(var n=[],i=t;i;){var r=i.prototype.defaultOption;r&&n.push(r),i=i.superClass}for(var o={},a=n.length-1;0<=a;a--)o=b(o,n[a],!0);e.defaultOption=o}return e.defaultOption},Kp.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Cu(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},Kp.prototype.getBoxLayoutParams=function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}},Kp.protoInitialize=((g=Kp.prototype).type="component",g.id="",g.name="",g.mainType="",g.subType="",void(g.componentIndex=0)),Kp);function Kp(t,e,n){n=Up.call(this,t,e,n)||this;return n.uid=Bc("ec_cpt_model"),n}function $p(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}Ru(qp,Ec),Bu(qp,{registerWhenExtend:!0}),Yp={},(Xp=qp).registerSubTypeDefaulter=function(t,e){t=Pu(t);Yp[t.main]=e},Xp.determineSubType=function(t,e){var n,i=e.type;return i||(n=Pu(t).main,Xp.hasSubTypes(t)&&Yp[n]&&(i=Yp[n](e))),i},Zp=function(t){var e=[];E(qp.getClassesByMainType(t),function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])}),e=O(e,function(t){return Pu(t).main}),"dataset"!==t&&L(e,"dataset")<=0&&e.unshift("dataset");return e},qp.topologicalTravel=function(t,e,n,i){if(t.length){var o,a,s,e=(a={},s=[],E(o=e,function(n){var e,i,r=$p(a,n),t=r.originalDeps=Zp(n),t=(e=o,i=[],E(t,function(t){0<=L(e,t)&&i.push(t)}),i);r.entryCount=t.length,0===r.entryCount&&s.push(n),E(t,function(t){L(r.predecessor,t)<0&&r.predecessor.push(t);var e=$p(a,t);L(e.successor,t)<0&&e.successor.push(n)})}),{graph:a,noEntryList:s}),r=e.graph,l=e.noEntryList,u={};for(E(t,function(t){u[t]=!0});l.length;){var h=l.pop(),c=r[h],p=!!u[h];p&&(n.call(i,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,function(){var t="";throw new Error(t)})}function d(t){r[t].entryCount--,0===r[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}};Yh="";"undefined"!=typeof navigator&&(Yh=navigator.platform||"");var ua="rgba(0, 0, 0, 0.2)",Jp={darkMode:"auto",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:ua,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:ua,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:ua,dashArrayX:[1,0],dashArrayY:[4,3],dashLineOffset:0,rotation:-Math.PI/4},{color:ua,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:ua,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:ua,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Yh.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Qp=ht(["tooltip","label","itemName","itemId","seriesName"]),td="original",ed="arrayRows",nd="objectRows",id="keyedColumns",rd="typedArray",od="unknown",ad="column",sd="row",ld={Must:1,Might:2,Not:3},ud=bu();function hd(t,e){var n=t?t.metaRawOption:null;return{seriesLayoutBy:Q(e.seriesLayoutBy,n?n.seriesLayoutBy:null),sourceHeader:Q(e.sourceHeader,t?t.startIndex:null),dimensions:Q(e.dimensions,t?t.dimensionsDefine:null)}}function cd(n,t,e){var r={},i=dd(t);if(!i||!n)return r;var o,a,s=[],l=[],t=t.ecModel,t=ud(t).datasetMap,e=i.uid+"_"+e.seriesLayoutBy;E(n=n.slice(),function(t,e){t=U(t)?t:n[e]={name:t};"ordinal"===t.type&&null==o&&(o=e,a=c(t)),r[t.name]=[]});var u=t.get(e)||t.set(e,{categoryWayDim:a,valueWayDim:0});function h(t,e,n){for(var i=0;i<n;i++)t.push(e+i)}function c(t){t=t.dimsDef;return t?t.length:1}return E(n,function(t,e){var n,i=t.name,t=c(t);null==o?(n=u.valueWayDim,h(r[i],n,t),h(l,n,t),u.valueWayDim+=t):o===e?(h(r[i],0,t),h(s,0,t)):(n=u.categoryWayDim,h(r[i],n,t),h(l,n,t),u.categoryWayDim+=t)}),s.length&&(r.itemName=s),l.length&&(r.seriesName=l),r}function pd(t,l,u){var e={};if(!dd(t))return e;var h,c=l.sourceFormat,p=l.dimensionsDefine;c!==nd&&c!==id||E(p,function(t,e){"name"===(U(t)?t.name:t)&&(h=e)});t=function(){for(var t={},e={},n=[],i=0,r=Math.min(5,u);i<r;i++){var o=fd(l.data,c,l.seriesLayoutBy,p,l.startIndex,i);n.push(o);var a=o===ld.Not;if(a&&null==t.v&&i!==h&&(t.v=i),null!=t.n&&t.n!==t.v&&(a||n[t.n]!==ld.Not)||(t.n=i),s(t)&&n[t.n]!==ld.Not)return t;a||(o===ld.Might&&null==e.v&&i!==h&&(e.v=i),null!=e.n&&e.n!==e.v||(e.n=i))}function s(t){return null!=t.v&&null!=t.n}return s(t)?t:s(e)?e:null}();return t&&(e.value=[t.v],t=null!=h?h:t.n,e.itemName=[t],e.seriesName=[t]),e}function dd(t){if(!t.get("data",!0))return Cu(t.ecModel,"dataset",{index:t.get("datasetIndex",!0),id:t.get("datasetId",!0)},Mu).models[0]}function fd(t,e,n,i,r,o){var a,s,l;if(Y(t))return ld.Not;if(i&&(U(i=i[o])?(s=i.name,l=i.type):H(i)&&(s=i)),null!=l)return"ordinal"===l?ld.Must:ld.Not;if(e===ed){var u=t;if(n===sd){for(var h=u[o],c=0;c<(h||[]).length&&c<5;c++)if(null!=(a=m(h[r+c])))return a}else for(c=0;c<u.length&&c<5;c++){var p=u[r+c];if(p&&null!=(a=m(p[o])))return a}}else if(e===nd){var d=t;if(!s)return ld.Not;for(c=0;c<d.length&&c<5;c++){if((g=d[c])&&null!=(a=m(g[s])))return a}}else if(e===id){if(!s)return ld.Not;if(!(h=t[s])||Y(h))return ld.Not;for(c=0;c<h.length&&c<5;c++)if(null!=(a=m(h[c])))return a}else if(e===td)for(var f=t,c=0;c<f.length&&c<5;c++){var g,y=pu(g=f[c]);if(!V(y))return ld.Not;if(null!=(a=m(y[o])))return a}function m(t){var e=H(t);return null!=t&&isFinite(t)&&""!==t?e?ld.Might:ld.Not:e&&"-"!==t?ld.Must:void 0}return ld.Not}var gd=ht();var yd,md,vd,_d=bu(),xd=bu(),bd=(wd.prototype.getColorFromPalette=function(t,e,n){var i=uu(this.get("color",!0)),r=this.get("colorLayer",!0);return Md(this,_d,i,r,t,e,n)},wd.prototype.clearColorPalette=function(){var t,e;(e=_d)(t=this).paletteIdx=0,e(t).paletteNameMap={}},wd);function wd(){}function Sd(t,e,n,i){var r=uu(t.get(["aria","decal","decals"]));return Md(t,xd,r,null,e,n,i)}function Md(t,e,n,i,r,o,a){e=e(o=o||t),t=e.paletteIdx||0,o=e.paletteNameMap=e.paletteNameMap||{};if(o.hasOwnProperty(r))return o[r];a=null!=a&&i?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(i,a):n;if((a=a||n)&&a.length){n=a[t];return r&&(o[r]=n),e.paletteIdx=(t+1)%a.length,n}}var Td,Cd="\0_ec_inner",Id=(l(Ad,Td=Ec),Ad.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new Ec(i),this._locale=new Ec(r),this._optionManager=o},Ad.prototype.setOption=function(t,e,n){it(!(Cd in t),"please use chart.getOption()");e=Ld(e);this._optionManager.setOption(t,n,e),this._resetOption(null,e)},Ad.prototype.resetOption=function(t,e){return this._resetOption(t,Ld(e))},Ad.prototype._resetOption=function(t,e){var n,i=!1,r=this._optionManager;return t&&"recreate"!==t||(n=r.mountOption("recreate"===t),this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(n,e)):vd(this,n),i=!0),"timeline"!==t&&"media"!==t||this.restoreData(),t&&"recreate"!==t&&"timeline"!==t||(n=r.getTimelineOption(this))&&(i=!0,this._mergeOption(n,e)),t&&"recreate"!==t&&"media"!==t||(r=r.getMediaOption(this)).length&&E(r,function(t){i=!0,this._mergeOption(t,e)},this),i},Ad.prototype.mergeOption=function(t){this._mergeOption(t,null)},Ad.prototype._mergeOption=function(i,t){var r=this.option,u=this._componentsMap,h=this._componentsCount,n=[],o=ht(),c=t&&t.replaceMergeMainTypeMap;ud(this).datasetMap=ht(),E(i,function(t,e){null!=t&&(qp.hasClass(e)?e&&(n.push(e),o.set(e,!0)):r[e]=null==r[e]?I(t):b(r[e],t,!0))}),c&&c.each(function(t,e){qp.hasClass(e)&&!o.get(e)&&(n.push(e),o.set(e,!0))}),qp.topologicalTravel(n,qp.getAllClassMainTypes(),function(o){var t=function(t,e,n){return(e=gd.get(e))&&(t=e(t))?n.concat(t):n}(this,o,uu(i[o])),e=u.get(o),n=e?c&&c.get(o)?"replaceMerge":"normalMerge":"replaceAll",n=du(e,t,n);_u(n,o,qp),r[o]=null,u.set(o,null),h.set(o,0);var a=[],s=[],l=0;E(n,function(t,e){var n,i=t.existing,r=t.newOption;r?(n=qp.getClass(o,t.keyInfo.subType,!0),i&&i.constructor===n?(i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1)):(e=A({componentIndex:e},t.keyInfo),A(i=new n(r,this,this,e),e),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0))):i&&(i.mergeOption({},this),i.optionUpdated({},!1)),i?(a.push(i.option),s.push(i),l++):(a.push(void 0),s.push(void 0))},this),r[o]=a,u.set(o,s),h.set(o,l),"series"===o&&yd(this)},this),this._seriesIndices||yd(this)},Ad.prototype.getOption=function(){var a=I(this.option);return E(a,function(t,e){if(qp.hasClass(e)){for(var n=uu(t),i=n.length,r=!1,o=i-1;0<=o;o--)n[o]&&!vu(n[o])?r=!0:(n[o]=null,r||i--);n.length=i,a[e]=n}}),delete a[Cd],a},Ad.prototype.getTheme=function(){return this._theme},Ad.prototype.getLocaleModel=function(){return this._locale},Ad.prototype.getLocale=function(t){return this.getLocaleModel().get(t)},Ad.prototype.setUpdatePayload=function(t){this._payload=t},Ad.prototype.getUpdatePayload=function(){return this._payload},Ad.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){t=n[e||0];if(t)return t;if(null==e)for(var i=0;i<n.length;i++)if(n[i])return n[i]}},Ad.prototype.queryComponents=function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,o=t.name,a=this._componentsMap.get(e);return a&&a.length?(null!=i?(n=[],E(uu(i),function(t){a[t]&&n.push(a[t])})):n=null!=r?Dd("id",r,a):null!=o?Dd("name",o,a):R(a,function(t){return!!t}),kd(n,t)):[]},Ad.prototype.findComponents=function(t){var e,n,i,r,o,a=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=a)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),l=l?this.queryComponents(l):R(this._componentsMap.get(s),function(t){return!!t});return o=kd(l,t),t.filter?R(o,t.filter):o},Ad.prototype.eachComponent=function(t,e,n){var i=this._componentsMap;if(F(t)){var r=e,o=t;i.each(function(t,e){for(var n=0;t&&n<t.length;n++){var i=t[n];i&&o.call(r,e,i,i.componentIndex)}})}else for(var a=H(t)?i.get(t):U(t)?this.findComponents(t):null,s=0;a&&s<a.length;s++){var l=a[s];l&&e.call(n,l,l.componentIndex)}},Ad.prototype.getSeriesByName=function(t){var e=yu(t,null);return R(this._componentsMap.get("series"),function(t){return!!t&&null!=e&&t.name===e})},Ad.prototype.getSeriesByIndex=function(t){return this._componentsMap.get("series")[t]},Ad.prototype.getSeriesByType=function(e){return R(this._componentsMap.get("series"),function(t){return!!t&&t.subType===e})},Ad.prototype.getSeries=function(){return R(this._componentsMap.get("series").slice(),function(t){return!!t})},Ad.prototype.getSeriesCount=function(){return this._componentsCount.get("series")},Ad.prototype.eachSeries=function(n,i){md(this),E(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];n.call(i,e,t)},this)},Ad.prototype.eachRawSeries=function(e,n){E(this._componentsMap.get("series"),function(t){t&&e.call(n,t,t.componentIndex)})},Ad.prototype.eachSeriesByType=function(n,i,r){md(this),E(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];e.subType===n&&i.call(r,e,t)},this)},Ad.prototype.eachRawSeriesByType=function(t,e,n){return E(this.getSeriesByType(t),e,n)},Ad.prototype.isSeriesFiltered=function(t){return md(this),null==this._seriesIndicesMap.get(t.componentIndex)},Ad.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},Ad.prototype.filterSeries=function(n,i){md(this);var r=[];E(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];n.call(i,e,t)&&r.push(t)},this),this._seriesIndices=r,this._seriesIndicesMap=ht(r)},Ad.prototype.restoreData=function(n){yd(this);var t=this._componentsMap,i=[];t.each(function(t,e){qp.hasClass(e)&&i.push(e)}),qp.topologicalTravel(i,qp.getAllClassMainTypes(),function(e){E(t.get(e),function(t){!t||"series"===e&&function(t,e){if(e){var n=e.seriesIndex,i=e.seriesId,e=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=e&&t.name!==e}}(t,n)||t.restoreData()})})},Ad.internalField=(yd=function(t){var e=t._seriesIndices=[];E(t._componentsMap.get("series"),function(t){t&&e.push(t.componentIndex)}),t._seriesIndicesMap=ht(e)},md=function(t){0},void(vd=function(t,e){t.option={},t.option[Cd]=1,t._componentsMap=ht({series:[]}),t._componentsCount=ht();var n,i,r=e.aria;U(r)&&null==r.enabled&&(r.enabled=!0),n=e,r=t._theme.option,i=n.color&&!n.colorLayer,E(r,function(t,e){"colorLayer"===e&&i||qp.hasClass(e)||("object"==typeof t?n[e]=n[e]?b(n[e],t,!1):I(t):null==n[e]&&(n[e]=t))}),b(e,Jp,!1),t._mergeOption(e,null)})),Ad);function Ad(){return null!==Td&&Td.apply(this,arguments)||this}function Dd(e,t,n){if(V(t)){var i=ht();return E(t,function(t){null!=t&&null!=yu(t,null)&&i.set(t,!0)}),R(n,function(t){return t&&i.get(t[e])})}var r=yu(t,null);return R(n,function(t){return t&&null!=r&&t[e]===r})}function kd(t,e){return e.hasOwnProperty("subType")?R(t,function(t){return t&&t.subType===e.subType}):t}function Ld(t){var e=ht();return t&&E(uu(t.replaceMerge),function(t){e.set(t,!0)}),{replaceMergeMainTypeMap:e}}T(Id,bd);function Pd(e){E(Od,function(t){this[t]=z(e[t],e)},this)}var Od=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getOption","getId","updateLabelLayout"],Rd={},Ed=(Nd.prototype.create=function(n,i){var r=[];E(Rd,function(t,e){t=t.create(n,i);r=r.concat(t||[])}),this._coordinateSystems=r},Nd.prototype.update=function(e,n){E(this._coordinateSystems,function(t){t.update&&t.update(e,n)})},Nd.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},Nd.register=function(t,e){Rd[t]=e},Nd.get=function(t){return Rd[t]},Nd);function Nd(){this._coordinateSystems=[]}var zd=/^(min|max)?(.+)$/,Bd=(Vd.prototype.setOption=function(t,e,n){t&&(E(uu(t.series),function(t){t&&t.data&&Y(t.data)&&at(t.data)}),E(uu(t.dataset),function(t){t&&t.source&&Y(t.source)&&at(t.source)})),t=I(t);var i=this._optionBackup,e=function(t,n,i){var e,r,o=[],a=t.baseOption,s=t.timeline,l=t.options,u=t.media,h=!!t.media,c=!!(l||s||a&&a.timeline);a?(r=a).timeline||(r.timeline=s):((c||h)&&(t.options=t.media=null),r=t);h&&V(u)&&E(u,function(t){t&&t.option&&(t.query?o.push(t):e=e||t)});function p(e){E(n,function(t){t(e,i)})}return p(r),E(l,p),E(o,function(t){return p(t.option)}),{baseOption:r,timelineOptions:l||[],mediaDefault:e,mediaList:o}}(t,e,!i);this._newBaseOption=e.baseOption,i?(e.timelineOptions.length&&(i.timelineOptions=e.timelineOptions),e.mediaList.length&&(i.mediaList=e.mediaList),e.mediaDefault&&(i.mediaDefault=e.mediaDefault)):this._optionBackup=e},Vd.prototype.mountOption=function(t){var e=this._optionBackup;return this._timelineOptions=e.timelineOptions,this._mediaList=e.mediaList,this._mediaDefault=e.mediaDefault,this._currentMediaIndices=[],I(t?e.baseOption:this._newBaseOption)},Vd.prototype.getTimelineOption=function(t){var e,n=this._timelineOptions;return!n.length||(t=t.getComponent("timeline"))&&(e=I(n[t.getCurrentIndex()])),e},Vd.prototype.getMediaOption=function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],a=[];if(!i.length&&!r)return a;for(var s,l,u=0,h=i.length;u<h;u++)!function(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return E(t,function(t,e){var n=e.match(zd);n&&n[1]&&n[2]&&(e=n[1],n=n[2].toLowerCase(),n=i[n],t=t,("min"===(e=e)?t<=n:"max"===e?n<=t:n===t)||(r=!1))}),r}(i[u].query,e,n)||o.push(u);return!o.length&&r&&(o=[-1]),o.length&&(s=o,l=this._currentMediaIndices,s.join(",")!==l.join(","))&&(a=O(o,function(t){return I((-1===t?r:i[t]).option)})),this._currentMediaIndices=o,a},Vd);function Vd(t){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=t}var Fd=E,Hd=U,Gd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Wd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Gd.length;n<i;n++){var r=Gd[n],o=e.normal,a=e.emphasis;o&&o[r]&&(t[r]=t[r]||{},t[r].normal?b(t[r].normal,o[r]):t[r].normal=o[r],o[r]=null),a&&a[r]&&(t[r]=t[r]||{},t[r].emphasis?b(t[r].emphasis,a[r]):t[r].emphasis=a[r],a[r]=null)}}function Ud(t,e,n){var i,r;t&&t[e]&&(t[e].normal||t[e].emphasis)&&(i=t[e].normal,r=t[e].emphasis,i&&(n?(t[e].normal=t[e].emphasis=null,D(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},(t.emphasis[e]=r).focus&&(t.emphasis.focus=r.focus),r.blurScope&&(t.emphasis.blurScope=r.blurScope)))}function Xd(t){Ud(t,"itemStyle"),Ud(t,"lineStyle"),Ud(t,"areaStyle"),Ud(t,"label"),Ud(t,"labelLine"),Ud(t,"upperLabel"),Ud(t,"edgeLabel")}function Yd(t,e){var n=Hd(t)&&t[e],i=Hd(n)&&n.textStyle;if(i){0;for(var r=0,o=cu.length;r<o;r++){var a=cu[r];i.hasOwnProperty(a)&&(n[a]=i[a])}}}function Zd(t){t&&(Xd(t),Yd(t,"label"),t.emphasis&&Yd(t.emphasis,"label"))}function jd(t){return V(t)?t:t?[t]:[]}function qd(t){return(V(t)?t[0]:t)||{}}function Kd(e,t){Fd(jd(e.series),function(t){Hd(t)&&function(t){if(Hd(t)){Wd(t),Xd(t),Yd(t,"label"),Yd(t,"upperLabel"),Yd(t,"edgeLabel"),t.emphasis&&(Yd(t.emphasis,"label"),Yd(t.emphasis,"upperLabel"),Yd(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(Wd(e),Zd(e));var n=t.markLine;n&&(Wd(n),Zd(n));var i=t.markArea;i&&Zd(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var o=t.links||t.edges;if(o&&!Y(o))for(var a=0;a<o.length;a++)Zd(o[a]);E(t.categories,function(t){Xd(t)})}if(r&&!Y(r))for(a=0;a<r.length;a++)Zd(r[a]);if((e=t.markPoint)&&e.data)for(var s=e.data,a=0;a<s.length;a++)Zd(s[a]);if((n=t.markLine)&&n.data)for(var l=n.data,a=0;a<l.length;a++)V(l[a])?(Zd(l[a][0]),Zd(l[a][1])):Zd(l[a]);"gauge"===t.type?(Yd(t,"axisLabel"),Yd(t,"title"),Yd(t,"detail")):"treemap"===t.type?(Ud(t.breadcrumb,"itemStyle"),E(t.levels,function(t){Xd(t)})):"tree"===t.type&&Xd(t.leaves)}}(t)});var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];t&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),Fd(n,function(t){Fd(jd(e[t]),function(t){t&&(Yd(t,"axisLabel"),Yd(t.axisPointer,"label"))})}),Fd(jd(e.parallel),function(t){t=t&&t.parallelAxisDefault;Yd(t,"axisLabel"),Yd(t&&t.axisPointer,"label")}),Fd(jd(e.calendar),function(t){Ud(t,"itemStyle"),Yd(t,"dayLabel"),Yd(t,"monthLabel"),Yd(t,"yearLabel")}),Fd(jd(e.radar),function(t){Yd(t,"name"),t.name&&null==t.axisName&&(t.axisName=t.name,delete t.name),null!=t.nameGap&&null==t.axisNameGap&&(t.axisNameGap=t.nameGap,delete t.nameGap)}),Fd(jd(e.geo),function(t){Hd(t)&&(Zd(t),Fd(jd(t.regions),function(t){Zd(t)}))}),Fd(jd(e.timeline),function(t){Zd(t),Ud(t,"label"),Ud(t,"itemStyle"),Ud(t,"controlStyle",!0);t=t.data;V(t)&&E(t,function(t){U(t)&&(Ud(t,"label"),Ud(t,"itemStyle"))})}),Fd(jd(e.toolbox),function(t){Ud(t,"iconStyle"),Fd(t.feature,function(t){Ud(t,"iconStyle")})}),Yd(qd(e.axisPointer),"label"),Yd(qd(e.tooltip).axisPointer,"label")}function $d(e){e&&E(Jd,function(t){t[0]in e&&!(t[1]in e)&&(e[t[1]]=e[t[0]])})}var Jd=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],Qd=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],tf=[["borderRadius","barBorderRadius"],["borderColor","barBorderColor"],["borderWidth","barBorderWidth"]];function ef(t){var e=t&&t.itemStyle;if(e)for(var n=0;n<tf.length;n++){var i=tf[n][1],r=tf[n][0];null!=e[i]&&(e[r]=e[i])}}function nf(t){t&&"edge"===t.alignTo&&null!=t.margin&&null==t.edgeDistance&&(t.edgeDistance=t.margin)}function rf(t){t&&t.downplay&&!t.blur&&(t.blur=t.downplay)}function of(e,t){Kd(e,t),e.series=uu(e.series),E(e.series,function(t){if(U(t)){var e,n,i=t.type;if("line"===i)null!=t.clipOverflow&&(t.clip=t.clipOverflow);else if("pie"===i||"gauge"===i){if(null!=t.clockWise&&(t.clockwise=t.clockWise),nf(t.label),(e=t.data)&&!Y(e))for(var r=0;r<e.length;r++)nf(e[r]);null!=t.hoverOffset&&(t.emphasis=t.emphasis||{},(t.emphasis.scaleSize=null)&&(t.emphasis.scaleSize=t.hoverOffset))}else if("gauge"===i){var o=function(t,e){for(var n=e.split(","),i=t,r=0;r<n.length&&null!=(i=i&&i[n[r]]);r++);return i}(t,"pointer.color");null!=o&&function(t,e,n,i){for(var r,o=e.split(","),a=t,s=0;s<o.length-1;s++)null==a[r=o[s]]&&(a[r]={}),a=a[r];!i&&null!=a[o[s]]||(a[o[s]]=n)}(t,"itemStyle.color",o)}else if("bar"===i){if(ef(t),ef(t.backgroundStyle),ef(t.emphasis),(e=t.data)&&!Y(e))for(r=0;r<e.length;r++)"object"==typeof e[r]&&(ef(e[r]),ef(e[r]&&e[r].emphasis))}else{"sunburst"===i?((n=t.highlightPolicy)&&(t.emphasis=t.emphasis||{},t.emphasis.focus||(t.emphasis.focus=n)),rf(t),function t(e,n){if(e)for(var i=0;i<e.length;i++)n(e[i]),e[i]&&t(e[i].children,n)}(t.data,rf)):"graph"===i||"sankey"===i?(n=t)&&null!=n.focusNodeAdjacency&&(n.emphasis=n.emphasis||{},null==n.emphasis.focus&&(n.emphasis.focus="adjacency")):"map"===i&&(t.mapType&&!t.map&&(t.map=t.mapType),t.mapLocation&&D(t,t.mapLocation))}null!=t.hoverAnimation&&(t.emphasis=t.emphasis||{},t.emphasis&&null==t.emphasis.scale&&(t.emphasis.scale=t.hoverAnimation)),$d(t)}}),e.dataRange&&(e.visualMap=e.dataRange),E(Qd,function(t){t=e[t];t&&(V(t)||(t=[t]),E(t,function(t){$d(t)}))})}function af(g){E(g,function(u,h){var c=[],p=[NaN,NaN],t=[u.stackResultDimension,u.stackedOverDimension],d=u.data,f=u.isStackedByIndex,t=d.map(t,function(t,e,n){var i,r,o=d.get(u.stackedDimension,n);if(isNaN(o))return p;f?r=d.getRawIndex(n):i=d.get(u.stackedByDimension,n);for(var a=NaN,s=h-1;0<=s;s--){var l=g[s];if(f||(r=l.data.rawIndexOf(l.stackedByDimension,i)),0<=r){l=l.data.getByRawIndex(l.stackResultDimension,r);if(0<=o&&0<l||o<=0&&l<0){o+=l,a=l;break}}}return c[0]=o,c[1]=a,c});d.hostModel.setData(t),u.data=t})}var sf,lf,uf=function(t){this.data=t.data||(t.sourceFormat===id?{}:[]),this.sourceFormat=t.sourceFormat||od,this.seriesLayoutBy=t.seriesLayoutBy||ad,this.startIndex=t.startIndex||0,this.dimensionsDefine=t.dimensionsDefine,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.encodeDefine=t.encodeDefine,this.metaRawOption=t.metaRawOption};function hf(t){return t instanceof uf}function cf(t,e,n,i){n=n||function(t){var e=od;if(Y(t))e=rd;else if(V(t)){0===t.length&&(e=ed);for(var n=0,i=t.length;n<i;n++){var r=t[n];if(null!=r){if(V(r)){e=ed;break}if(U(r)){e=nd;break}}}}else if(U(t)){for(var o in t)if(pt(t,o)&&P(t[o])){e=id;break}}else if(null!=t)throw new Error("Invalid data");return e}(t);var r=e.seriesLayoutBy,o=function(t,e,n,i,r){var o,a;if(!t)return{dimensionsDefine:ff(r),startIndex:a,dimensionsDetectedCount:o};{var s;e===ed?(s=t,"auto"===i||null==i?gf(function(t){null!=t&&"-"!==t&&(H(t)?null==a&&(a=1):a=0)},n,s,10):a=W(i)?i:i?1:0,r||1!==a||(r=[],gf(function(t,e){r[e]=null!=t?t+"":""},n,s,1/0)),o=r?r.length:n===sd?s.length:s[0]?s[0].length:null):e===nd?r=r||function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return E(e,function(t,e){i.push(e)}),i}}(t):e===id?r||(r=[],E(t,function(t,e){r.push(e)})):e===td&&(t=pu(t[0]),o=V(t)&&t.length||1)}return{startIndex:a,dimensionsDefine:ff(r),dimensionsDetectedCount:o}}(t,n,r,e.sourceHeader,e.dimensions);return new uf({data:t,sourceFormat:n,seriesLayoutBy:r,dimensionsDefine:o.dimensionsDefine,startIndex:o.startIndex,dimensionsDetectedCount:o.dimensionsDetectedCount,encodeDefine:df(i),metaRawOption:I(e)})}function pf(t){return new uf({data:t,sourceFormat:Y(t)?rd:td})}function df(t){return t?ht(t):null}function ff(t){if(t){var i=ht();return O(t,function(t,e){var n={name:(t=U(t)?t:{name:t}).name,displayName:t.displayName,type:t.type};if(null==name)return n;n.name+="",null==n.displayName&&(n.displayName=n.name);t=i.get(n.name);return t?n.name+="-"+t.count++:i.set(n.name,{count:1}),n})}}function gf(t,e,n,i){if(e===sd)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else for(var o=n[0]||[],r=0;r<o.length&&r<i;r++)t(o[r],r)}var yf=(mf.prototype.getSource=function(){return this._source},mf.prototype.count=function(){return 0},mf.prototype.getItem=function(t,e){},mf.prototype.appendData=function(t){},mf.prototype.clean=function(){},mf.protoInitialize=((nl=mf.prototype).pure=!1,void(nl.persistent=!0)),mf.internalField=function(){var t;lf=function(t,e,n){var i=n.sourceFormat,r=n.seriesLayoutBy,o=n.startIndex,a=n.dimensionsDefine,n=sf[Mf(i,r)];A(t,n),i===rd?(t.getItem=s,t.count=u,t.fillStorage=l):(n=_f(i,r),t.getItem=z(n,null,e,o,a),r=bf(i,r),t.count=z(r,null,e,o,a))};var s=function(t,e){t-=this._offset,e=e||[];for(var n=this._data,i=this._dimSize,r=i*t,o=0;o<i;o++)e[o]=n[r+o];return e},l=function(t,e,n,i){for(var r=this._data,o=this._dimSize,a=0;a<o;a++){for(var s=i[a],l=null==s[0]?1/0:s[0],u=null==s[1]?-1/0:s[1],h=e-t,c=n[a],p=0;p<h;p++){var d=r[(t+p)*o+a];(c[t+p]=d)<l&&(l=d),u<d&&(u=d)}s[0]=l,s[1]=u}},u=function(){return this._data?this._data.length/this._dimSize:0};function e(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}(t={})[ed+"_"+ad]={pure:!0,appendData:e},t[ed+"_"+sd]={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},t[nd]={pure:!0,appendData:e},t[id]={pure:!0,appendData:function(t){var r=this._data;E(t,function(t,e){for(var n=r[e]||(r[e]=[]),i=0;i<(t||[]).length;i++)n.push(t[i])})}},t[td]={appendData:e},t[rd]={persistent:!1,pure:!0,appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}},sf=t}(),mf);function mf(t,e){var n=hf(t)?t:pf(t);this._source=n;t=this._data=n.data;n.sourceFormat===rd&&(this._offset=0,this._dimSize=e,this._data=t),lf(this,t,n)}var Qa=function(t,e,n,i){return t[i]},vf=((wl={})[ed+"_"+ad]=function(t,e,n,i){return t[i+e]},wl[ed+"_"+sd]=function(t,e,n,i){i+=e;for(var r=[],o=t,a=0;a<o.length;a++){var s=o[a];r.push(s?s[i]:null)}return r},wl[nd]=Qa,wl[id]=function(t,e,n,i){for(var r=[],o=0;o<n.length;o++){var a=n[o].name;0;a=t[a];r.push(a?a[i]:null)}return r},wl[td]=Qa,wl);function _f(t,e){e=vf[Mf(t,e)];return e}var Ic=function(t,e,n){return t.length},xf=((Lc={})[ed+"_"+ad]=function(t,e,n){return Math.max(0,t.length-e)},Lc[ed+"_"+sd]=function(t,e,n){t=t[0];return t?Math.max(0,t.length-e):0},Lc[nd]=Ic,Lc[id]=function(t,e,n){n=n[0].name;n=t[n];return n?n.length:0},Lc[td]=Ic,Lc);function bf(t,e){e=xf[Mf(t,e)];return e}var o=function(t,e,n){return null!=e?t[e]:t},wf=((qn={})[ed]=o,qn[nd]=function(t,e,n){return null!=e?t[n]:t},qn[id]=o,qn[td]=function(t,e,n){t=pu(t);return null!=e&&t instanceof Array?t[e]:t},qn[rd]=o,qn);function Sf(t){t=wf[t];return t}function Mf(t,e){return t===ed?t+"_"+e:t}function Tf(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,o,e=t.getProvider().getSource().sourceFormat,n=t.getDimensionInfo(n);return n&&(r=n.name,o=n.index),Sf(e)(i,o,r)}}}var Cf=/\{@(.+?)\}/g,Ca=(If.prototype.getDataParams=function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),o=n.getName(t),a=n.getRawDataItem(t),s=n.getItemVisual(t,"style"),l=s&&s[n.getItemVisual(t,"drawType")||"fill"],u=s&&s.stroke,t=this.mainType,s="series"===t,n=n.userOutput;return{componentType:t,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:s?this.subType:null,seriesIndex:this.seriesIndex,seriesId:s?this.id:null,seriesName:s?this.name:null,name:o,dataIndex:r,data:a,dataType:e,value:i,color:l,borderColor:u,dimensionNames:n?n.dimensionNames:null,encode:n?n.encode:null,$vars:["seriesName","name","value"]}},If.prototype.getFormattedLabel=function(i,t,e,n,r,o){t=t||"normal";var a=this.getData(e),e=this.getDataParams(i,e);return o&&A(e,o),null!=n&&e.value instanceof Array&&(e.value=e.value[n]),"function"==typeof(r=r||a.getItemModel(i).get("normal"===t?["label","formatter"]:[t,"label","formatter"]))?(e.status=t,e.dimensionIndex=n,r(e)):"string"==typeof r?Ap(r,e).replace(Cf,function(t,e){var n=e.length;return"["===e.charAt(0)&&"]"===e.charAt(n-1)&&(e=+e.slice(1,n-1)),Tf(a,i,e)}):void 0},If.prototype.getRawValue=function(t,e){return Tf(this.getData(e),t)},If.prototype.formatTooltip=function(t,e,n){},If);function If(){}function Af(t){var e,n;return U(t)?t.type&&(n=t):e=t,{markupText:e,markupFragment:n}}function Df(t){return new kf(t)}var kf=(Lf.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;this._dirty&&n&&((o=this.context).data=o.outputData=n.context.outputData),this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var r=l(this._modBy),o=this._modDataCount||0,a=l(t&&t.modBy),s=t&&t.modDataCount||0;function l(t){return 1<=t||(t=1),t}r===a&&o===s||(e="reset"),!this._dirty&&"reset"!==e||(this._dirty=!1,d=this._doReset(i)),this._modBy=a,this._modDataCount=s;t=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var u=this._dueIndex,h=Math.min(null!=t?this._dueIndex+t:1/0,this._dueEnd);if(!i&&(d||u<h)){var c=this._progress;if(V(c))for(var p=0;p<c.length;p++)this._doProgress(c[p],u,h,a,s);else this._doProgress(c,u,h,a,s)}this._dueIndex=h;var d=null!=this._settedOutputEnd?this._settedOutputEnd:h;0,this._outputDueEnd=d}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},Lf.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},Lf.prototype._doProgress=function(t,e,n,i,r){Bf.reset(e,n,i,r),this._callingProgress=t,this._callingProgress({start:e,end:n,count:n-e,next:Bf.next},this.context)},Lf.prototype._doReset=function(t){var e;this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null,!t&&this._reset&&((n=this._reset(this.context))&&n.progress&&(e=n.forceFirstProgress,n=n.progress),V(n)&&!n.length&&(n=null)),this._progress=n,this._modBy=this._modDataCount=null;var n=this._downstream;return n&&n.dirty(),e},Lf.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},Lf.prototype.pipe=function(t){this._downstream===t&&!this._dirty||((this._downstream=t)._upstream=this,t.dirty())},Lf.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},Lf.prototype.getUpstream=function(){return this._upstream},Lf.prototype.getDownstream=function(){return this._downstream},Lf.prototype.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t},Lf);function Lf(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}var Pf,Of,Rf,Ef,Nf,zf,Bf=zf={reset:function(t,e,n,i){Of=t,Pf=e,Rf=n,Ef=i,Nf=Math.ceil(Ef/Rf),zf.next=1<Rf&&0<Ef?Ff:Vf}};function Vf(){return Of<Pf?Of++:null}function Ff(){var t=Of%Nf*Rf+Math.ceil(Of/Nf),t=Pf<=Of?null:t<Ef?t:Of;return Of++,t}function Hf(t,e){var n=e&&e.type;if("ordinal"!==n)return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+ql(t)),null==t||""===t?NaN:+t;e=e&&e.ordinalMeta;return e?e.parseAndCollect(t):t}ht({number:function(t){return parseFloat(t)},time:function(t){return+ql(t)},trim:function(t){return"string"==typeof t?rt(t):t}});var Gf=(Wf.prototype.evaluate=function(t,e){var n=typeof t,i=typeof e,r="number"==n?t:Ql(t),o="number"==i?e:Ql(e),a=isNaN(r),s=isNaN(o);return a&&(r=this._incomparable),s&&(o=this._incomparable),a&&s&&(i="string"==i,(n="string"==n)&&(r=i?t:0),i&&(o=n?e:0)),r<o?this._resultLT:o<r?-this._resultLT:0},Wf);function Wf(t,e){t="desc"===t;this._resultLT=t?1:-1,null==e&&(e=t?"min":"max"),this._incomparable="min"===e?-1/0:1/0}var Uf=(Xf.prototype.getRawData=function(){throw new Error("not supported")},Xf.prototype.getRawDataItem=function(t){throw new Error("not supported")},Xf.prototype.cloneRawData=function(){},Xf.prototype.getDimensionInfo=function(t){},Xf.prototype.cloneAllDimensionInfo=function(){},Xf.prototype.count=function(){},Xf.prototype.retrieveValue=function(t,e){},Xf.prototype.retrieveValueFromItem=function(t,e){},Xf.prototype.convertValue=Hf,Xf);function Xf(){}function Yf(t){var e=t.sourceFormat,n=t.data;if(e===ed||e===nd||!n||V(n)&&!n.length)return t.data;t="";au(t)}function Zf(t){var e=t.sourceFormat,n=t.data;if(!n)return n;if(V(n)&&!n.length)return[];if(e===ed){for(var i=[],r=0,o=n.length;r<o;r++)i.push(n[r].slice());return i}if(e===nd){for(i=[],r=0,o=n.length;r<o;r++)i.push(A({},n[r]));return i}}function jf(t,e,n){if(null!=n)return"number"==typeof n||!isNaN(n)&&!pt(e,n)?t[n]:pt(e,n)?e[n]:void 0}function qf(t){return I(t)}var Kf=ht();function $f(t,e){var n=uu(t),i=n.length,t="";i||au(t);for(var r=0,o=i;r<o;r++){e=function(t,i){var e="";i.length||au(e);U(t)||au(e);var n=t.type,r=Kf.get(n);r||au(e);e=O(i,function(t){return function(t,e){var n=new Uf,i=t.data,r=n.sourceFormat=t.sourceFormat,o=t.startIndex,a=[],s={},l=t.dimensionsDefine;if(l)E(l,function(t,e){var n=t.name,e={index:e,name:n,displayName:t.displayName};a.push(e),null!=n&&(t="",pt(s,n)&&au(t),s[n]=e)});else for(var u=0;u<t.dimensionsDetectedCount;u++)a.push({index:u});var h=_f(r,ad);e.__isBuiltIn&&(n.getRawDataItem=function(t){return h(i,o,a,t)},n.getRawData=z(Yf,null,t)),n.cloneRawData=z(Zf,null,t),e=bf(r,ad),n.count=z(e,null,i,o,a);var c=Sf(r);n.retrieveValue=function(t,e){t=h(i,o,a,t);return p(t,e)};var p=n.retrieveValueFromItem=function(t,e){if(null!=t){var n=a[e];return n?c(t,e,n.name):void 0}};return n.getDimensionInfo=z(jf,null,a,s),n.cloneAllDimensionInfo=z(qf,null,a),n}(t,r)}),t=uu(r.transform({upstream:e[0],upstreamList:e,config:I(t.config)}));{}return O(t,function(t){var e="";U(t)||au(e);var n=t.data;return null!=n?U(n)||P(n)||au(e):n=i[0].data,cf(n,hd(i[0],{seriesLayoutBy:ad,sourceHeader:0,dimensions:t.dimensions}),null,null)})}(n[r],e),r!==o-1&&(e.length=Math.max(e.length,1))}return e}var Jf=(Qf.prototype.dirty=function(){this._setLocalSource([],[])},Qf.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,9e10<this._versionSignBase&&(this._versionSignBase=0)},Qf.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},Qf.prototype.prepareSource=function(){this._isDirty()&&this._createSource()},Qf.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n,i,r,o=this._sourceHost,a=this._getUpstreamSourceManagers(),s=!!a.length;eg(o)?(r=o,n=e=t=void 0,i=s?((i=a[0]).prepareSource(),t=(n=i.getSource()).data,e=n.sourceFormat,[i._getVersionSign()]):(e=Y(t=r.get("data",!0))?rd:td,[]),r=[cf(t,hd(n,this._getSourceMetaRawOption()),e,r.get("encode",!0))]):(o=o,i=s?(r=(a=this._applyTransform(a)).sourceList,a.upstreamSignList):(r=[cf(o.get("source",!0),this._getSourceMetaRawOption(),null,null)],[])),this._setLocalSource(r,i)},Qf.prototype._applyTransform=function(t){var e,n,i=this._sourceHost,r=i.get("transform",!0),o=i.get("fromTransformResult",!0);null!=o&&(e="",1!==t.length&&ng(e));var a=[],s=[];return E(t,function(t){t.prepareSource();var e=t.getSource(o||0),n="";null==o||e||ng(n),a.push(e),s.push(t._getVersionSign())}),r?n=$f(r,a,i.componentIndex):null!=o&&(n=[(i=a[0],new uf({data:i.data,sourceFormat:i.sourceFormat,seriesLayoutBy:i.seriesLayoutBy,dimensionsDefine:I(i.dimensionsDefine),startIndex:i.startIndex,dimensionsDetectedCount:i.dimensionsDetectedCount,encodeDefine:df(i.encodeDefine)}))]),{sourceList:n,upstreamSignList:s}},Qf.prototype._isDirty=function(){if(!this._sourceList.length)return!0;for(var t=this._getUpstreamSourceManagers(),e=0;e<t.length;e++){var n=t[e];if(n._isDirty()||this._upstreamSignList[e]!==n._getVersionSign())return!0}},Qf.prototype.getSource=function(t){return this._sourceList[t||0]},Qf.prototype._getUpstreamSourceManagers=function(){var t=this._sourceHost;if(eg(t)){var e=dd(t);return e?[e.getSourceManager()]:[]}return O((t=t).get("transform",!0)||t.get("fromTransformResult",!0)?Cu(t.ecModel,"dataset",{index:t.get("fromDatasetIndex",!0),id:t.get("fromDatasetId",!0)},Mu).models:[],function(t){return t.getSourceManager()})},Qf.prototype._getSourceMetaRawOption=function(){var t,e,n,i=this._sourceHost;return eg(i)?(t=i.get("seriesLayoutBy",!0),e=i.get("sourceHeader",!0),n=i.get("dimensions",!0)):this._getUpstreamSourceManagers().length||(t=(i=i).get("seriesLayoutBy",!0),e=i.get("sourceHeader",!0),n=i.get("dimensions",!0)),{seriesLayoutBy:t,sourceHeader:e,dimensions:n}},Qf);function Qf(t){this._sourceList=[],this._upstreamSignList=[],this._versionSignBase=0,this._sourceHost=t}function tg(t){t.option.transform&&at(t.option.transform)}function eg(t){return"series"===t.mainType}function ng(t){throw new Error(t)}var ig="font-size:12px;color:#6e7079",rg={fontSize:12,fill:"#6e7079"},og={fontSize:14,fill:"#464646",fontWeight:900},ag="line-height:1",sg=[0,10,20,30],lg=["","\n","\n\n","\n\n\n"];function ug(t,e){return e.type=t,e}function hg(t){return pt(cg,t.type)&&cg[t.type]}var cg={section:{planLayout:function(t){var e=t.blocks.length,n=1<e||0<e&&!t.noHeader,i=0;E(t.blocks,function(t){hg(t).planLayout(t);var e=t.__gapLevelBetweenSubBlocks;i<=e&&(i=e+(!n||e&&("section"!==t.type||t.noHeader)?0:1))}),t.__gapLevelBetweenSubBlocks=i},build:function(t,e,n){var i=e.noHeader,r=dg(e),o=function(n,t,e){var i=[],r=t.blocks||[];it(!r||V(r)),r=r||[];var o=n.orderMode;{var a,s;t.sortBlocks&&o&&(r=r.slice(),pt(a={valueAsc:"asc",valueDesc:"desc"},o)?(s=new Gf(a[o],null),r.sort(function(t,e){return s.evaluate(t.sortParam,e.sortParam)})):"seriesDesc"===o&&r.reverse())}var l=dg(t);return E(r,function(t,e){e=hg(t).build(n,t,0<e?l.html:0);null!=e&&i.push(e)}),i.length?"richText"===n.renderMode?i.join(l.richText):fg(i.join(""),e):void 0}(t,e,i?n:r.html);if(i)return o;e=Tp(e.header,"ordinal",t.useUTC);return"richText"===t.renderMode?gg(t,e)+r.richText+o:fg('<div style="'+ig+";"+ag+';">'+Mp(e)+"</div>"+o,n)}},nameValue:{planLayout:function(t){t.__gapLevelBetweenSubBlocks=0},build:function(t,e,n){var i=t.renderMode,r=e.noName,o=e.noValue,a=!e.markerType,s=e.name,l=e.value,u=t.useUTC;if(!r||!o){var h=a?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",i),c=r?"":Tp(s,"ordinal",u),p=e.valueType,d=o?[]:V(l)?O(l,function(t,e){return Tp(t,V(p)?p[e]:p,u)}):[Tp(l,V(p)?p[0]:p,u)],f=!a||!r,s=!a&&r;return"richText"===i?(a?"":h)+(r?"":gg(t,c))+(o?"":(e=t,l=d,i=[og],t=(t=s)?10:20,f&&i.push({padding:[0,0,0,t],align:"right"}),e.markupStyleCreator.wrapRichTextStyle(l.join("  "),i))):fg((a?"":h)+(r?"":'<span style="'+ig+";"+(!a?"margin-left:2px":"")+'">'+Mp(c)+"</span>")+(o?"":function(t,e,n){n=n?"10px":"20px";return'<span style="'+(e?"float:right;margin-left:"+n:"")+';font-size:14px;color:#464646;font-weight:900">'+O(t,Mp).join("&nbsp;&nbsp;")+"</span>"}(d,f,s)),n)}}}};function pg(t,e,n,i,r){if(t){var o=hg(t);o.planLayout(t);e={useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e};return o.build(e,t,0)}}function dg(t){t=t.__gapLevelBetweenSubBlocks;return{html:sg[t],richText:lg[t]}}function fg(t,e){return'<div style="'+("margin: "+e+"px 0 0")+";"+ag+';">'+t+'<div style="clear:both"></div></div>'}function gg(t,e){return t.markupStyleCreator.wrapRichTextStyle(e,rg)}function yg(t,e){t=t.get("padding");return null!=t?t:"richText"===e?[8,10]:10}var mg=(vg.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},vg.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,n=Dp({color:e,type:t,renderMode:n,markerId:i});return H(n)?n:(this.richTextStyles[i]=n.style,n.content)},vg.prototype.wrapRichTextStyle=function(t,e){var n={};V(e)?E(e,function(t){return A(n,t)}):A(n,e);e=this._generateStyleName();return this.richTextStyles[e]=n,"{"+e+"|"+t+"}"},vg);function vg(){this.richTextStyles={},this._nextStyleNameId=eu()}function _g(t){var e,n,i,r,o,a,s,l,u,h,c,p,d=t.series,f=t.dataIndex,g=t.multipleSeries,y=d.getData(),m=y.mapDimensionsAll("defaultedTooltip"),v=m.length,_=d.getRawValue(f),x=V(_),t=(e=f,kp((t=d).getData().getItemVisual(e,"style")[t.visualDrawType]));function b(t,e){e=l.getDimensionInfo(e);e&&!1!==e.otherDims.tooltip&&(u?p.push(ug("nameValue",{markerType:"subItem",markerColor:s,name:e.displayName,value:t,valueType:e.type})):(h.push(t),c.push(e.type)))}1<v||x&&!v?(n=(i=(r=_,o=f,a=m,s=t,l=d.getData(),u=C(r,function(t,e,n){n=l.getDimensionInfo(n);return t||n&&!1!==n.tooltip&&null!=n.displayName},!1),h=[],c=[],p=[],a.length?E(a,function(t){b(Tf(l,o,t),t)}):E(r,b),{inlineValues:h,inlineValueTypes:c,blocks:p})).inlineValueTypes,a=i.blocks,i=(r=i.inlineValues)[0]):v?(v=y.getDimensionInfo(m[0]),i=r=Tf(y,f,m[0]),n=v.type):i=r=x?_[0]:_;_=mu(d),d=_&&d.name||"",f=y.getName(f),f=g?d:f;return ug("section",{header:d,noHeader:g||!_,sortParam:i,blocks:[ug("nameValue",{markerType:"item",markerColor:t,name:f,noName:!rt(f),value:r,valueType:n})].concat(a||[])})}var xg=bu();function bg(t,e){return t.getName(e)||t.getId(e)}var wg,Sg=(l(Mg,wg=qp),Mg.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=Df({count:Cg,reset:Ig}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(xg(this).sourceManager=new Jf(this)).prepareSource();n=this.getInitialData(t,n);Dg(n,this),this.dataTask.context.data=n,xg(this).dataBeforeProcessed=n,Tg(this),this._initSelectedMapFromData(n)},Mg.prototype.mergeDefaultAndTheme=function(t,e){var n=Fp(this),i=n?Gp(t):{},r=this.subType;qp.hasClass(r),b(t,e.getTheme().get(this.subType)),b(t,this.getDefaultOption()),hu(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Hp(t,i,n)},Mg.prototype.mergeOption=function(t,e){t=b(this.option,t,!0),this.fillDataTextStyle(t.data);var n=Fp(this);n&&Hp(this.option,t,n);n=xg(this).sourceManager;n.dirty(),n.prepareSource();e=this.getInitialData(t,e);Dg(e,this),this.dataTask.dirty(),this.dataTask.context.data=e,xg(this).dataBeforeProcessed=e,Tg(this),this._initSelectedMapFromData(e)},Mg.prototype.fillDataTextStyle=function(t){if(t&&!Y(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&hu(t[n],"label",e)},Mg.prototype.getInitialData=function(t,e){},Mg.prototype.appendData=function(t){this.getRawData().appendData(t.data)},Mg.prototype.getData=function(t){var e=Lg(this);if(e){e=e.context.data;return null==t?e:e.getLinkedData(t)}return xg(this).data},Mg.prototype.getAllData=function(){var t=this.getData();return t&&t.getLinkedDataAll?t.getLinkedDataAll():[{data:t}]},Mg.prototype.setData=function(t){var e,n=Lg(this);n&&((e=n.context).outputData=t,n!==this.dataTask&&(e.data=t)),xg(this).data=t},Mg.prototype.getSource=function(){return xg(this).sourceManager.getSource()},Mg.prototype.getRawData=function(){return xg(this).dataBeforeProcessed},Mg.prototype.getBaseAxis=function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},Mg.prototype.formatTooltip=function(t,e,n){return _g({series:this,dataIndex:t,multipleSeries:e})},Mg.prototype.isAnimationEnabled=function(){if(w.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),!!t},Mg.prototype.restoreData=function(){this.dataTask.dirty()},Mg.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel;return bd.prototype.getColorFromPalette.call(this,t,e,n)||i.getColorFromPalette(t,e,n)},Mg.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},Mg.prototype.getProgressive=function(){return this.get("progressive")},Mg.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},Mg.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},Mg.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n)for(var i=this.getData(e),r=0;r<t.length;r++){var o=bg(i,t[r]);n[o]=!1,this._selectedDataIndicesMap[o]=-1}},Mg.prototype.toggleSelect=function(t,e){for(var n=[],i=0;i<t.length;i++)n[0]=t[i],this.isSelected(t[i],e)?this.unselect(n,e):this.select(n,e)},Mg.prototype.getSelectedDataIndices=function(){for(var t=this._selectedDataIndicesMap,e=N(t),n=[],i=0;i<e.length;i++){var r=t[e[i]];0<=r&&n.push(r)}return n},Mg.prototype.isSelected=function(t,e){var n=this.option.selectedMap;return n&&n[bg(this.getData(e),t)]||!1},Mg.prototype._innerSelect=function(t,e){var n,i=this.option.selectedMode,r=e.length;if(i&&r)if("multiple"===i)for(var o=this.option.selectedMap||(this.option.selectedMap={}),a=0;a<r;a++){var s,l=e[a];o[s=bg(t,l)]=!0,this._selectedDataIndicesMap[s]=t.getRawIndex(l)}else"single"!==i&&!0!==i||(s=bg(t,n=e[r-1]),this.option.selectedMap=((i={})[s]=!0,i),this._selectedDataIndicesMap=((i={})[s]=t.getRawIndex(n),i))},Mg.prototype._initSelectedMapFromData=function(n){var i;this.option.selectedMap||(i=[],n.hasItemOption&&n.each(function(t){var e=n.getRawDataItem(t);"object"==typeof e&&e.selected&&i.push(t)}),0<i.length&&this._innerSelect(n,i))},Mg.registerClass=function(t){return qp.registerClass(t)},Mg.protoInitialize=((g=Mg.prototype).type="series.__base__",g.seriesIndex=0,g.useColorPaletteOnData=!1,g.ignoreStyleOnData=!1,g.hasSymbolVisual=!1,g.defaultSymbol="circle",g.visualStyleAccessPath="itemStyle",void(g.visualDrawType="fill")),Mg);function Mg(){var t=null!==wg&&wg.apply(this,arguments)||this;return t._selectedDataIndicesMap={},t}function Tg(t){var e,n,i=t.name;mu(t)||(t.name=(t=(e=(t=t).getRawData()).mapDimensionsAll("seriesName"),n=[],E(t,function(t){t=e.getDimensionInfo(t);t.displayName&&n.push(t.displayName)}),n.join(" ")||i))}function Cg(t){return t.model.getRawData().count()}function Ig(t){t=t.model;return t.setData(t.getRawData().cloneShallow()),Ag}function Ag(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Dg(e,n){E(a(e.CHANGABLE_METHODS,e.DOWNSAMPLE_METHODS),function(t){e.wrapMethod(t,B(kg,n))})}function kg(t,e){t=Lg(t);return t&&t.setOutputEnd((e||this).count()),e}function Lg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){e=n.currentTask;return!e||(n=e.agentStubMap)&&(e=n.get(t.uid)),e}}T(Sg,Ca),T(Sg,bd),Ru(Sg,qp);var Pg=(Og.prototype.init=function(t,e){},Og.prototype.render=function(t,e,n,i){},Og.prototype.dispose=function(t,e){},Og.prototype.updateView=function(t,e,n,i){},Og.prototype.updateLayout=function(t,e,n,i){},Og.prototype.updateVisual=function(t,e,n,i){},Og.prototype.blurSeries=function(t,e){},Og);function Og(){this.group=new Ho,this.uid=Bc("viewComponent")}function Rg(){var o=bu();return function(t){var e=o(t),n=t.pipelineContext,i=!!e.large,r=!!e.progressiveRender,t=e.large=!(!n||!n.large),n=e.progressiveRender=!(!n||!n.progressiveRender);return!(i==t&&r==n)&&"reset"}}Ou(Pg),Bu(Pg,{registerWhenExtend:!0});var Eg=bu(),Ng=Rg(),zg=(Bg.prototype.init=function(t,e){},Bg.prototype.render=function(t,e,n,i){},Bg.prototype.highlight=function(t,e,n,i){Fg(t.getData(),i,"emphasis")},Bg.prototype.downplay=function(t,e,n,i){Fg(t.getData(),i,"normal")},Bg.prototype.remove=function(t,e){this.group.removeAll()},Bg.prototype.dispose=function(t,e){},Bg.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},Bg.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},Bg.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},Bg.markUpdateMethod=function(t,e){Eg(t).updateMethod=e},Bg.protoInitialize=void(Bg.prototype.type="chart"),Bg);function Bg(){this.group=new Ho,this.uid=Bc("viewChart"),this.renderTask=Df({plan:Hg,reset:Gg}),this.renderTask.context={view:this}}function Vg(t,e,n){t&&("emphasis"===e?xh:bh)(t,n)}function Fg(e,t,n){var i,r=xu(e,t),o=t&&null!=t.highlightKey?(i=t.highlightKey,null==(t=Uu[i])&&Wu<=32&&(t=Uu[i]=Wu++),t):null;null!=r?E(uu(r),function(t){Vg(e.getItemGraphicEl(t),n,o)}):e.eachItemGraphicEl(function(t){Vg(t,n,o)})}function Hg(t){return Ng(t.model)}function Gg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,t=r&&Eg(r).updateMethod,t=o?"incrementalPrepareRender":t&&a[t]?t:"render";return"render"!==t&&a[t](e,n,i,r),Wg[t]}Ou(zg),Bu(zg,{registerWhenExtend:!0});var Wg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Ug="\0__throttleOriginMethod",Xg="\0__throttleRate",Yg="\0__throttleType";function Zg(t,r,o){var a,s,l,u,h,c=0,p=0,d=null;function f(){p=(new Date).getTime(),d=null,t.apply(l,u||[])}r=r||0;function e(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];a=(new Date).getTime(),l=this,u=t;var n=h||r,i=h||o;h=null,s=a-(i?c:p)-n,clearTimeout(d),i?d=setTimeout(f,n):0<=s?f():d=setTimeout(f,-s),c=a}return e.clear=function(){d&&(clearTimeout(d),d=null)},e.debounceNextCall=function(t){h=t},e}function jg(t,e,n,i){var r=t[e];if(r){var o=r[Ug]||r,a=r[Yg];if(r[Xg]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Zg(o,n,"debounce"===i))[Ug]=o,r[Yg]=i,r[Xg]=n}return r}}var qg=bu(),Kg={itemStyle:Vu(Dc,!0),lineStyle:Vu(Tc,!0)},$g={lineStyle:"stroke",itemStyle:"fill"};function Jg(t,e){t=t.visualStyleMapper||Kg[e];return t||(console.warn("Unkown style type '"+e+"'."),Kg.itemStyle)}function Qg(t,e){t=t.visualDrawType||$g[e];return t||(console.warn("Unkown style type '"+e+"'."),"fill")}var ua={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,t){var e=r.getData(),n=r.visualStyleAccessPath||"itemStyle",i=r.getModel(n),o=Jg(r,n)(i),i=i.getShallow("decal");i&&(e.setVisual("decal",i),i.dirty=!0);var a=Qg(r,n),n=o[a],s=F(n)?n:null;if(o[a]&&!s||(o[a]=r.getColorFromPalette(r.name,null,t.getSeriesCount()),e.setVisual("colorFromPalette",!0)),e.setVisual("style",o),e.setVisual("drawType",a),!t.isSeriesFiltered(r)&&s)return e.setVisual("colorFromPalette",!1),{dataEach:function(t,e){var n=r.getDataParams(e),i=A({},o);i[a]=s(n),t.setItemVisual(e,"style",i)}}}},ty=new Ec,Yh={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var e=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Jg(t,i),o=e.getVisual("drawType");return{dataEach:e.hasItemOption?function(t,e){var n=t.getRawDataItem(e);n&&n[i]&&(ty.option=n[i],n=r(ty),A(t.ensureUniqueItemVisual(e,"style"),n),ty.option.decal&&(t.setItemVisual(e,"decal",ty.option.decal),ty.option.decal.dirty=!0),o in n&&t.setItemVisual(e,"colorFromPalette",!1))}:null}}}},nl={performRawSeries:!0,overallReset:function(e){var n=ht();e.eachSeries(function(t){var e;t.useColorPaletteOnData&&((e=n.get(t.type))||(e={},n.set(t.type,e)),qg(t).scope=e)}),e.eachSeries(function(i){var r,o,a,s,t,l;i.useColorPaletteOnData&&!e.isSeriesFiltered(i)&&(r=i.getRawData(),o={},a=i.getData(),s=qg(i).scope,t=i.visualStyleAccessPath||"itemStyle",l=Qg(i,t),a.each(function(t){var e=a.getRawIndex(t);o[e]=t}),r.each(function(t){var e,n=o[t];a.getItemVisual(n,"colorFromPalette")&&(e=a.ensureUniqueItemVisual(n,"style"),n=r.getName(t)||t+"",t=r.count(),e[l]=i.getColorFromPalette(n,s,t))}))})}},ey=Math.PI;var ny=(iy.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each(function(t){t=t.overallTask;t&&t.dirty()})},iy.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,n=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,i=i&&i.modDataCount;return{step:n,modBy:null!=i?Math.ceil(i/n):null,modDataCount:i}}},iy.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},iy.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,e=t.get("large")&&i>=t.get("largeThreshold"),i="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:i,large:e}},iy.prototype.restorePipelines=function(t){var i=this,r=i._pipelineMap=ht();t.eachSeries(function(t){var e=t.getProgressive(),n=t.uid;r.set(n,{id:n,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),i._pipe(t,t.dataTask)})},iy.prototype.prepareStageTasks=function(){var i=this._stageTaskMap,r=this.api.getModel(),o=this.api;E(this._allHandlers,function(t){var e=i.get(t.uid)||i.set(t.uid,{}),n="";it(!(t.reset&&t.overallReset),n),t.reset&&this._createSeriesStageTask(t,e,r,o),t.overallReset&&this._createOverallStageTask(t,e,r,o)},this)},iy.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},iy.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},iy.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},iy.prototype._performStageTasks=function(t,s,l,u){u=u||{};var h=!1,c=this;function p(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,function(i,t){var e,n,r,o,a;u.visualType&&u.visualType!==i.visualType||(e=(o=c._stageTaskMap.get(i.uid)).seriesTaskMap,(n=o.overallTask)?((o=n.agentStubMap).each(function(t){p(u,t)&&(t.dirty(),r=!0)}),r&&n.dirty(),c.updatePayload(n,l),a=c.getPerformArgs(n,u.block),o.each(function(t){t.perform(a)}),n.perform(a)&&(h=!0)):e&&e.each(function(t,e){p(u,t)&&t.dirty();var n=c.getPerformArgs(t,u.block);n.skip=!i.performRawSeries&&s.isSeriesFiltered(t.context.model),c.updatePayload(t,l),t.perform(n)&&(h=!0)}))}),this.unfinished=h||this.unfinished},iy.prototype.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e=t.dataTask.perform()||e}),this.unfinished=e||this.unfinished},iy.prototype.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}}while(e=e.getUpstream())})},iy.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},iy.prototype._createSeriesStageTask=function(n,t,i,r){var o=this,a=t.seriesTaskMap,s=t.seriesTaskMap=ht(),e=n.seriesType,t=n.getTargetSeries;function l(t){var e=t.uid,e=s.set(e,a&&a.get(e)||Df({plan:ly,reset:uy,count:py}));e.context={model:t,ecModel:i,api:r,useClearVisual:n.isVisual&&!n.isLayout,plan:n.plan,reset:n.reset,scheduler:o},o._pipe(t,e)}n.createOnAllSeries?i.eachRawSeries(l):e?i.eachRawSeriesByType(e,l):t&&t(i,r).each(l)},iy.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||Df({reset:ry});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ht(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,e="";function p(t){var e=t.uid,e=s.set(e,a&&a.get(e)||(c=!0,Df({reset:oy,onDirty:sy})));e.context={model:t,overallProgress:h},e.agent=o,e.__block=h,r._pipe(t,e)}it(!t.createOnAllSeries,e),l?n.eachRawSeriesByType(l,p):u?u(n,i).each(p):(h=!1,E(n.getSeries(),p)),c&&o.dirty()},iy.prototype._pipe=function(t,e){t=t.uid,t=this._pipelineMap.get(t);t.head||(t.head=e),t.tail&&t.tail.pipe(e),(t.tail=e).__idxInPipeline=t.count++,e.__pipeline=t},iy.wrapStageHandler=function(t,e){return F(t)&&(t={overallReset:t,seriesType:function(t){dy=null;try{t(fy,gy)}catch(t){}return dy}(t)}),t.uid=Bc("stageHandler"),e&&(t.visualType=e),t},iy);function iy(t,e,n,i){this._stageTaskMap=ht(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}function ry(t){t.overallReset(t.ecModel,t.api,t.payload)}function oy(t){return t.overallProgress&&ay}function ay(){this.agent.dirty(),this.getDownstream().dirty()}function sy(){this.agent&&this.agent.dirty()}function ly(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function uy(t){t.useClearVisual&&t.data.clearAllVisual();t=t.resetDefines=uu(t.reset(t.model,t.ecModel,t.api,t.payload));return 1<t.length?O(t,function(t,e){return cy(e)}):hy}var hy=cy(0);function cy(o){return function(t,e){var n=e.data,i=e.resetDefines[o];if(i&&i.dataEach)for(var r=t.start;r<t.end;r++)i.dataEach(n,r);else i&&i.progress&&i.progress(t,n)}}function py(t){return t.data.count()}var dy,fy={},gy={};function yy(t,e){for(var n in e.prototype)t[n]=dt}yy(fy,Id),yy(gy,Pd),fy.eachSeriesByType=fy.eachRawSeriesByType=function(t){dy=t},fy.eachComponent=function(t){"series"===t.mainType&&t.subType&&(dy=t.subType)};var Qa=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],wl={color:Qa,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],Qa]},my="#B9B8CE",Ic="#100C2A",Lc=function(){return{axisLine:{lineStyle:{color:my}},splitLine:{lineStyle:{color:"#484753"}},splitArea:{areaStyle:{color:["rgba(255,255,255,0.02)","rgba(255,255,255,0.05)"]}},minorSplitLine:{lineStyle:{color:"#20203B"}}}},o=["#4992ff","#7cffb2","#fddd60","#ff6e76","#58d9f9","#05c091","#ff8a45","#8d48e3","#dd79ff"],qn={darkMode:!0,color:o,backgroundColor:Ic,axisPointer:{lineStyle:{color:"#817f91"},crossStyle:{color:"#817f91"},label:{color:"#fff"}},legend:{textStyle:{color:my}},textStyle:{color:my},title:{textStyle:{color:"#EEF1FA"},subtextStyle:{color:"#B9B8CE"}},toolbox:{iconStyle:{borderColor:my}},dataZoom:{borderColor:"#71708A",textStyle:{color:my},brushStyle:{color:"rgba(135,163,206,0.3)"},handleStyle:{color:"#353450",borderColor:"#C5CBE3"},moveHandleStyle:{color:"#B0B6C3",opacity:.3},fillerColor:"rgba(135,163,206,0.2)",emphasis:{handleStyle:{borderColor:"#91B7F2",color:"#4D587D"},moveHandleStyle:{color:"#636D9A",opacity:.7}},dataBackground:{lineStyle:{color:"#71708A",width:1},areaStyle:{color:"#71708A"}},selectedDataBackground:{lineStyle:{color:"#87A3CE"},areaStyle:{color:"#87A3CE"}}},visualMap:{textStyle:{color:my}},timeline:{lineStyle:{color:my},label:{color:my},controlStyle:{color:my,borderColor:my}},calendar:{itemStyle:{color:Ic},dayLabel:{color:my},monthLabel:{color:my},yearLabel:{color:my}},timeAxis:Lc(),logAxis:Lc(),valueAxis:Lc(),categoryAxis:Lc(),line:{symbol:"circle"},graph:{color:o},gauge:{title:{color:my},axisLine:{lineStyle:{color:[[1,"rgba(207,212,219,0.2)"]]}},axisLabel:{color:my},detail:{color:"#EEF1FA"}},candlestick:{itemStyle:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}};qn.categoryAxis.splitLine.show=!1;var vy,g=(l(_y,vy=qp),_y.prototype.init=function(t,e,n){vy.prototype.init.call(this,t,e,n),this._sourceManager=new Jf(this),tg(this)},_y.prototype.mergeOption=function(t,e){vy.prototype.mergeOption.call(this,t,e),tg(this)},_y.prototype.optionUpdated=function(){this._sourceManager.dirty()},_y.prototype.getSourceManager=function(){return this._sourceManager},_y.type="dataset",_y.defaultOption={seriesLayoutBy:ad},_y);function _y(){var t=null!==vy&&vy.apply(this,arguments)||this;return t.type="dataset",t}qp.registerClass(g);var xy,Dc=(l(by,xy=Pg),by.type="dataset",by);function by(){var t=null!==xy&&xy.apply(this,arguments)||this;return t.type="dataset",t}Pg.registerClass(Dc);var wy=ht(),Sy=function(t,e,n){var i,n=V(e)?e:e.svg?[{type:"svg",source:e.svg,specialAreas:e.specialAreas}]:((i=e.geoJson||e.geoJSON)&&!e.features&&(n=e.specialAreas,e=i),[{type:"geoJSON",source:e,specialAreas:n}]);return E(n,function(t){var e=t.type;"geoJson"===e&&(e=t.type="geoJSON");e=Ty[e];e(t)}),wy.set(t,n)},My=function(t){return wy.get(t)},Ty={geoJSON:function(t){var e=t.source;t.geoJSON=H(e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")():e},svg:function(t){t.svgXML=function(t){H(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}(t.source)}},Cy=(Iy.prototype.normalizeQuery=function(t){var e,a,s,l={},u={},h={};return H(t)?(e=Pu(t),l.mainType=e.main||null,l.subType=e.sub||null):(a=["Index","Name","Id"],s={name:1,dataIndex:1,dataType:1},E(t,function(t,e){for(var n=!1,i=0;i<a.length;i++){var r=a[i],o=e.lastIndexOf(r);0<o&&o===e.length-r.length&&("data"!==(o=e.slice(0,o))&&(l.mainType=o,l[r.toLowerCase()]=t,n=!0))}s.hasOwnProperty(e)&&(u[e]=t,n=!0),n||(h[e]=t)})),{cptQuery:l,dataQuery:u,otherQuery:h}},Iy.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,n=e.dataQuery;return l(s,o,"mainType")&&l(s,o,"subType")&&l(s,o,"index","componentIndex")&&l(s,o,"name")&&l(s,o,"id")&&l(n,r,"name")&&l(n,r,"dataIndex")&&l(n,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function l(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},Iy.prototype.afterTrigger=function(){this.eventInfo=null},Iy);function Iy(){}Tc={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,t){var e=r.getData();if(r.legendSymbol&&e.setVisual("legendSymbol",r.legendSymbol),r.hasSymbolVisual){var o=r.get("symbol"),a=r.get("symbolSize"),n=r.get("symbolKeepAspect"),s=r.get("symbolRotate"),l=F(o),u=F(a),h=F(s),i=l||u||h,c=!l&&o?o:r.defaultSymbol,p=u?null:a,d=h?null:s;if(e.setVisual({legendSymbol:r.legendSymbol||c,symbol:c,symbolSize:p,symbolKeepAspect:n,symbolRotate:d}),!t.isSeriesFiltered(r))return{dataEach:i?function(t,e){var n=r.getRawValue(e),i=r.getDataParams(e);l&&t.setItemVisual(e,"symbol",o(n,i)),u&&t.setItemVisual(e,"symbolSize",a(n,i)),h&&t.setItemVisual(e,"symbolRotate",s(n,i))}:null}}}},Qa={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(t.hasSymbolVisual&&!e.isSeriesFiltered(t))return{dataEach:t.getData().hasItemOption?function(t,e){var n=(o=t.getItemModel(e)).getShallow("symbol",!0),i=o.getShallow("symbolSize",!0),r=o.getShallow("symbolRotate",!0),o=o.getShallow("symbolKeepAspect",!0);null!=n&&t.setItemVisual(e,"symbol",n),null!=i&&t.setItemVisual(e,"symbolSize",i),null!=r&&t.setItemVisual(e,"symbolRotate",r),null!=o&&t.setItemVisual(e,"symbolKeepAspect",o)}:null}}};function Ay(t,e){switch(e){case"color":return t.getVisual("style")[t.getVisual("drawType")];case"opacity":return t.getVisual("style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getVisual(e);default:0}}var Dy=2*Math.PI,ky=Qr.CMD,Ly=["top","right","bottom","left"];function Py(t,e,n,i,r,o,a,s){var l=r-t,u=o-e,h=n-t,n=i-e,i=Math.sqrt(h*h+n*n),u=(l*(h/=i)+u*(n/=i))/i;s&&(u=Math.min(Math.max(u,0),1)),u*=i;h=a[0]=t+u*h,n=a[1]=e+u*n;return Math.sqrt((h-r)*(h-r)+(n-o)*(n-o))}function Oy(t,e,n,i,r,o,a){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i);n=t+n,i=e+i,n=a[0]=Math.min(Math.max(r,t),n),i=a[1]=Math.min(Math.max(o,e),i);return Math.sqrt((n-r)*(n-r)+(i-o)*(i-o))}var Ry=[];function Ey(t,e,n){for(var i=0,r=0,o=0,a=0,s=1/0,l=e.data,u=t.x,h=t.y,c=0;c<l.length;){var p=l[c++];1===c&&(o=i=l[c],a=r=l[c+1]);var d=s;switch(p){case ky.M:i=o=l[c++],r=a=l[c++];break;case ky.L:d=Py(i,r,l[c],l[c+1],u,h,Ry,!0),i=l[c++],r=l[c++];break;case ky.C:d=mr(i,r,l[c++],l[c++],l[c++],l[c++],l[c],l[c+1],u,h,Ry),i=l[c++],r=l[c++];break;case ky.Q:d=wr(i,r,l[c++],l[c++],l[c],l[c+1],u,h,Ry),i=l[c++],r=l[c++];break;case ky.A:var f=l[c++],g=l[c++],y=l[c++],m=l[c++],v=l[c++],_=l[c++];c+=1;var x=!!(1-l[c++]),b=Math.cos(v)*y+f,p=Math.sin(v)*m+g;c<=1&&(o=b,a=p);d=function(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%Dy<1e-4)return l[0]=h,l[1]=c,u-n;(r=o?(p=i,i=io(r),io(p)):(i=io(i),io(r)))<i&&(r+=Dy);var p=Math.atan2(s,a);return p<0&&(p+=Dy),i<=p&&p<=r||i<=p+Dy&&p+Dy<=r?(l[0]=h,l[1]=c,u-n):(u=n*Math.cos(i)+t,i=n*Math.sin(i)+e,t=n*Math.cos(r)+t,r=n*Math.sin(r)+e,(e=(u-a)*(u-a)+(i-s)*(i-s))<(s=(t-a)*(t-a)+(r-s)*(r-s))?(l[0]=u,l[1]=i,Math.sqrt(e)):(l[0]=t,l[1]=r,Math.sqrt(s)))}(f,g,m,v,v+_,x,(u-f)*m/y+f,h,Ry),i=Math.cos(v+_)*y+f,r=Math.sin(v+_)*m+g;break;case ky.R:d=Oy(o=i=l[c++],a=r=l[c++],l[c++],l[c++],u,h,Ry);break;case ky.Z:d=Py(i,r,o,a,u,h,Ry,!0),i=o,r=a}d<s&&(s=d,n.set(Ry[0],Ry[1]))}return s}var Ny=new Mn,zy=new Mn,By=new Mn,Vy=new Mn,Fy=new Mn;function Hy(t,e){if(t){var n=t.getTextGuideLine(),i=t.getTextContent();if(i&&n){var r=t.textGuideLineConfig||{},o=[[0,0],[0,0],[0,0]],a=r.candidates||Ly,s=i.getBoundingRect().clone();s.applyTransform(i.getComputedTransform());var l=1/0,u=r.anchor,h=t.getComputedTransform(),c=h&&we([],h),p=e.get("length2")||0;u&&By.copy(u);for(var d,f=0;f<a.length;f++){!function(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}(a[f],0,s,Ny,Vy),Mn.scaleAndAdd(zy,Ny,Vy,p),zy.transform(c);var g=t.getBoundingRect(),y=u?u.distance(zy):t instanceof _o?Ey(zy,t.path,By):(y=zy,d=By,y=Oy((g=g).x,g.y,g.width,g.height,y.x,y.y,Ry),d.set(Ry[0],Ry[1]),y);y<l&&(l=y,zy.transform(h),By.transform(h),By.toArray(o[0]),zy.toArray(o[1]),Ny.toArray(o[2]))}Uy(o,e.get("minTurnAngle")),n.setShape({points:o})}}}var Gy=[],Wy=new Mn;function Uy(t,e){var n,i;e<=180&&0<e&&(e=e/180*Math.PI,Ny.fromArray(t[0]),zy.fromArray(t[1]),By.fromArray(t[2]),Mn.sub(Vy,Ny,zy),Mn.sub(Fy,By,zy),n=Vy.len(),i=Fy.len(),n<.001||i<.001||(Vy.scale(1/n),Fy.scale(1/i),i=Vy.dot(Fy),Math.cos(e)<i&&(i=Py(zy.x,zy.y,By.x,By.y,Ny.x,Ny.y,Gy,!1),Wy.fromArray(Gy),Wy.scaleAndAdd(Fy,i/Math.tan(Math.PI-e)),e=By.x!==zy.x?(Wy.x-zy.x)/(By.x-zy.x):(Wy.y-zy.y)/(By.y-zy.y),isNaN(e)||(e<0?Mn.copy(Wy,zy):1<e&&Mn.copy(Wy,By),Wy.toArray(t[1])))))}function Xy(t,e,n,i){var r="normal"===n,n=r?t:t.ensureState(n);n.ignore=e;e=i.get("smooth");e&&!0===e&&(e=.3),n.shape=n.shape||{},0<e&&(n.shape.smooth=e);i=i.getModel("lineStyle").getLineStyle();r?t.useStyle(i):n.style=i}function Yy(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),0<n&&3<=i.length){var r=Mt(i[0],i[1]),e=Mt(i[1],i[2]);if(!r||!e)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);n=Math.min(r,e)*n,r=It([],i[1],i[0],n/r),n=It([],i[1],i[2],n/e),e=It([],r,n,.5);t.bezierCurveTo(r[0],r[1],r[0],r[1],e[0],e[1]),t.bezierCurveTo(n[0],n[1],n[0],n[1],i[2][0],i[2][1])}else for(var o=1;o<i.length;o++)t.lineTo(i[o][0],i[o][1])}function Zy(t,e,n){var i=t.getTextGuideLine(),r=t.getTextContent();if(r){for(var o=e.normal,a=o.get("show"),s=r.ignore,l=0;l<Ku.length;l++){var u,h=Ku[l],c=e[h],p="normal"===h;c&&(u=c.get("show"),!(p?s:Q(r.states[h]&&r.states[h].ignore,s))&&Q(u,a)?(i||(i=new Ma,t.setTextGuideLine(i),p||!s&&a||Xy(i,!0,"normal",e.normal),t.stateProxy&&(i.stateProxy=t.stateProxy)),Xy(i,!1,h,c)):(p=p?i:i&&i.states.normal)&&(p.ignore=!0))}i&&(D(i.style,n),i.style.fill=null,o=o.get("showAbove"),(t.textGuideLineConfig=t.textGuideLineConfig||{}).showAbove=o||!1,i.buildPath=Yy)}else i&&t.removeTextGuideLine()}function jy(t,e){e=e||"labelLine";for(var n={normal:t.getModel(e)},i=0;i<qu.length;i++){var r=qu[i];n[r]=t.getModel([r,e])}return n}function qy(s,l,u,t,e,n){var h=s.length;if(!(h<2)){s.sort(function(t,e){return t.rect[l]-e.rect[l]});for(var i=0,o=!1,r=0,a=0;a<h;a++){var c,p=s[a],d=p.rect;(c=d[l]-i)<0&&(d[l]-=c,p.label[l]-=c,o=!0),r+=Math.max(-c,0),i=d[l]+d[u]}0<r&&n&&x(-r/h,0,h);var f,g,y=s[0],m=s[h-1];return v(),f<0&&b(-f,.8),g<0&&b(g,.8),v(),_(f,g,1),_(g,f,-1),v(),f<0&&w(-f),g<0&&w(g),o}function v(){f=y.rect[l]-t,g=e-m.rect[l]-m.rect[u]}function _(t,e,n){t<0&&(0<(e=Math.min(e,-t))?(x(e*n,0,h),(e=e+t)<0&&b(-e*n,1)):b(-t*n,1))}function x(t,e,n){0!==t&&(o=!0);for(var i=e;i<n;i++){var r=s[i];r.rect[l]+=t,r.label[l]+=t}}function b(t,e){for(var n=[],i=0,r=1;r<h;r++){var o=s[r-1].rect,o=Math.max(s[r].rect[l]-o[l]-o[u],0);n.push(o),i+=o}if(i){var a=Math.min(Math.abs(t)/i,e);if(0<t)for(r=0;r<h-1;r++){x(n[r]*a,0,r+1)}else for(r=h-1;0<r;r--){x(-(n[r-1]*a),r,h)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(h-1)),i=0;i<h-1;i++)if(0<e?x(n,0,i+1):x(-n,h-i-1,h),(t-=n)<=0)return}}function Ky(t,e,n,i){return qy(t,"y","height",e,n,i)}function $y(t,e){var n=t.label,e=e&&e.getTextGuideLine();return{dataIndex:t.dataIndex,dataType:t.dataType,seriesIndex:t.seriesModel.seriesIndex,text:t.label.style.text,rect:t.hostRect,labelRect:t.rect,align:n.style.align,verticalAlign:n.style.verticalAlign,labelLinePoints:function(t){if(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n].slice());return e}}(e&&e.shape.points)}}var Jy=["align","verticalAlign","width","height","fontSize"],Qy=new ke,tm=bu(),em=bu();function nm(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null!=e[r]&&(t[r]=e[r])}}var im=["x","y","rotation"],rm=(om.prototype.clearLabels=function(){this._labelList=[],this._chartViewList=[]},om.prototype._addLabel=function(t,e,n,i,r){var o=i.style,a=i.__hostTarget.textConfig||{},s=i.getComputedTransform(),l=i.getBoundingRect().plain();Rn.applyTransform(l,l,s),s?Qy.setLocalTransform(s):(Qy.x=Qy.y=Qy.rotation=Qy.originX=Qy.originY=0,Qy.scaleX=Qy.scaleY=1);var u,h=i.__hostTarget;h&&(u=h.getBoundingRect().plain(),s=h.getComputedTransform(),Rn.applyTransform(u,u,s));h=u&&h.getTextGuideLine();this._labelList.push({label:i,labelLine:h,seriesModel:n,dataIndex:t,dataType:e,layoutOption:r,computedLayoutOption:null,rect:l,hostRect:u,priority:u?u.width*u.height:0,defaultAttr:{ignore:i.ignore,labelGuideIgnore:h&&h.ignore,x:Qy.x,y:Qy.y,rotation:Qy.rotation,style:{x:o.x,y:o.y,align:o.align,verticalAlign:o.verticalAlign,width:o.width,height:o.height,fontSize:o.fontSize},cursor:i.cursor,attachedPos:a.position,attachedRot:a.rotation}})},om.prototype.addLabelsOfSeries=function(t){var n=this;this._chartViewList.push(t);var i=t.__model,r=i.get("labelLayout");(F(r)||N(r).length)&&t.group.traverse(function(t){if(t.ignore)return!0;var e=t.getTextContent(),t=Gu(t);e&&!e.disableLabelLayout&&n._addLabel(t.dataIndex,t.dataType,i,e,r)})},om.prototype.updateLayoutConfig=function(t){var e=t.getWidth(),n=t.getHeight();for(var i=0;i<this._labelList.length;i++){var r=this._labelList[i],o=r.label,a=o.__hostTarget,s=r.defaultAttr,l=void 0;l=(l="function"==typeof r.layoutOption?r.layoutOption($y(r,a)):r.layoutOption)||{},r.computedLayoutOption=l;var u=Math.PI/180;a&&a.setTextConfig({local:!1,position:null!=l.x||null!=l.y?null:s.attachedPos,rotation:null!=l.rotate?l.rotate*u:s.attachedRot,offset:[l.dx||0,l.dy||0]});var h,c=!1;null!=l.x?(o.x=Vl(l.x,e),o.setStyle("x",0),c=!0):(o.x=s.x,o.setStyle("x",s.style.x)),null!=l.y?(o.y=Vl(l.y,n),o.setStyle("y",0),c=!0):(o.y=s.y,o.setStyle("y",s.style.y)),!l.labelLinePoints||(h=a.getTextGuideLine())&&(h.setShape({points:l.labelLinePoints}),c=!1),tm(o).needsUpdateLabelLine=c,o.rotation=null!=l.rotate?l.rotate*u:s.rotation;for(var p=0;p<Jy.length;p++){var d=Jy[p];o.setStyle(d,(null!=l[d]?l:s.style)[d])}l.draggable?(o.draggable=!0,o.cursor="move",a&&(u=r.seriesModel,null!=r.dataIndex&&(u=r.seriesModel.getData(r.dataType).getItemModel(r.dataIndex)),o.on("drag",function(t,e){return function(){Hy(t,e)}}(a,u.getModel("labelLine"))))):(o.off("drag"),o.cursor=s.cursor)}},om.prototype.layout=function(t){var e,n=t.getWidth(),i=t.getHeight(),r=function(t){for(var e=[],n=0;n<t.length;n++){var i,r,o,a,s,l,u=t[n];u.defaultAttr.ignore||(r=(i=u.label).getComputedTransform(),o=i.getBoundingRect(),a=!r||r[1]<1e-5&&r[2]<1e-5,l=i.style.margin||0,(s=o.clone()).applyTransform(r),s.x-=l/2,s.y-=l/2,s.width+=l,s.height+=l,l=a?new Al(o,r):null,e.push({label:i,labelLine:u.labelLine,rect:s,localRect:o,obb:l,priority:u.priority,defaultAttr:u.defaultAttr,layoutOption:u.computedLayoutOption,axisAligned:a,transform:r}))}return e}(this._labelList),o=R(r,function(t){return"shiftX"===t.layoutOption.moveOverlap}),t=R(r,function(t){return"shiftY"===t.layoutOption.moveOverlap});qy(o,"x","width",0,n,e),Ky(t,0,i),function(t){var e=[];t.sort(function(t,e){return e.priority-t.priority});var n=new Rn(0,0,0,0);function i(t){var e;t.ignore||null==(e=t.ensureState("emphasis")).ignore&&(e.ignore=!1),t.ignore=!0}for(var r=0;r<t.length;r++){var o=t[r],a=o.axisAligned,s=o.localRect,l=o.transform,u=o.label,h=o.labelLine;n.copy(o.rect),n.width-=.1,n.height-=.1,n.x+=.05,n.y+=.05;for(var c=o.obb,p=!1,d=0;d<e.length;d++){var f=e[d];if(n.intersect(f.rect)){if(a&&f.axisAligned){p=!0;break}if(f.obb||(f.obb=new Al(f.localRect,f.transform)),(c=c||new Al(s,l)).intersect(f.obb)){p=!0;break}}}p?(i(u),h&&i(h)):(u.attr("ignore",o.defaultAttr.ignore),h&&h.attr("ignore",o.defaultAttr.labelGuideIgnore),e.push(o))}}(R(r,function(t){return t.layoutOption.hideOverlap}))},om.prototype.processLabelsOverall=function(){var a=this;E(this._chartViewList,function(t){var i=t.__model,r=t.ignoreLabelLineUpdate,o=i.isAnimationEnabled();t.group.traverse(function(t){if(t.ignore)return!0;var e=!r,n=t.getTextContent();!e&&n&&(e=tm(n).needsUpdateLabelLine),e&&a._updateLabelLine(t,i),o&&a._animateLabels(t,i)})})},om.prototype._updateLabelLine=function(t,e){var n=t.getTextContent(),i=Gu(t),r=i.dataIndex;n&&null!=r&&(e=(n=e.getData(i.dataType)).getItemModel(r),i={},r=n.getItemVisual(r,"style"),n=n.getVisual("drawType"),i.stroke=r[n],n=e.getModel("labelLine"),Zy(t,jy(e),i),Hy(t,n))},om.prototype._animateLabels=function(t,e){var n,i,r,o,a,s,l,u=t.getTextContent(),h=t.getTextGuideLine();!u||u.ignore||u.invisible||t.disableLabelAnimation||Qh(t)||(s=(a=tm(u)).oldLayout,n=(l=Gu(t)).dataIndex,i={x:u.x,y:u.y,rotation:u.rotation},l=e.getData(l.dataType),s?(u.attr(s),(r=t.prevStates)&&(0<=L(r,"select")&&u.attr(a.oldLayoutSelect),0<=L(r,"emphasis")&&u.attr(a.oldLayoutEmphasis)),jh(u,i,e,n)):(u.attr(i),xc(u).valueAnimation||(r=Q(u.style.opacity,1),u.style.opacity=0,qh(u,{style:{opacity:r}},e,n))),a.oldLayout=i,u.states.select&&(nm(o=a.oldLayoutSelect={},i,im),nm(o,u.states.select,im)),u.states.emphasis&&(nm(o=a.oldLayoutEmphasis={},i,im),nm(o,u.states.emphasis,im)),bc(u,n,l,e)),!h||h.ignore||h.invisible||(s=(a=em(h)).oldLayout,l={points:h.shape.points},s?(h.attr({shape:s}),jh(h,{shape:l},e)):(h.setShape(l),h.style.strokePercent=0,qh(h,{style:{strokePercent:1}},e)),a.oldLayout=l)},om);function om(){this._labelList=[],this._chartViewList=[]}function am(t,e,a,n,s){var l=t+e;a.isSilent(l)||n.eachComponent({mainType:"series",subType:"pie"},function(t){for(var e,n,i=t.seriesIndex,r=s.selected,o=0;o<r.length;o++){r[o].seriesIndex===i&&(n=xu(e=t.getData(),s.fromActionPayload),a.trigger(l,{type:l,seriesId:t.id,name:V(n)?e.getName(n[0]):e.getName(n),selected:A({},t.option.selectedMap)}))}})}function sm(t,e,n){for(var i,r,o,a,s,l,u,h,c,p="radial"===e.type?(i=t,r=e,a=(o=n).width,s=o.height,l=Math.min(a,s),u=null==r.x?.5:r.x,h=null==r.y?.5:r.y,c=null==r.r?.5:r.r,r.global||(u=u*a+o.x,h=h*s+o.y,c*=l),i.createRadialGradient(u,h,0,u,h,c)):(l=t,i=n,h=null==(u=e).x?0:u.x,c=null==u.x2?1:u.x2,t=null==u.y?0:u.y,n=null==u.y2?0:u.y2,u.global||(h=h*i.width+i.x,c=c*i.width+i.x,t=t*i.height+i.y,n=n*i.height+i.y),h=isNaN(h)?0:h,c=isNaN(c)?1:c,t=isNaN(t)?0:t,n=isNaN(n)?0:n,l.createLinearGradient(h,t,c,n)),d=e.colorStops,f=0;f<d.length;f++)p.addColorStop(d[f].offset,d[f].color);return p}function lm(t,e){if(t!==e&&(t||e)){if(!t||!e||t.length!==e.length)return 1;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return 1}}function um(t,e){return t&&"solid"!==t&&0<e?(e=e||1,"dashed"===t?[4*e,2*e]:"dotted"===t?[e]:W(t)?[t]:V(t)?t:null):null}var hm=new Qr(!0);function cm(t){var e=t.stroke;return!(null==e||"none"===e||!(0<t.lineWidth))}function pm(t){t=t.fill;return null!=t&&"none"!==t}function dm(t,e){var n;null!=e.fillOpacity&&1!==e.fillOpacity?(n=t.globalAlpha,t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n):t.fill()}function fm(t,e){var n;null!=e.strokeOpacity&&1!==e.strokeOpacity?(n=t.globalAlpha,t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n):t.stroke()}function gm(t,e,n){n=as(e.image,e.__image,n);if(ls(n)){t=t.createPattern(n,e.repeat||"repeat");return"function"==typeof DOMMatrix&&((n=new DOMMatrix).rotateSelf(0,0,(e.rotation||0)/Math.PI*180),n.scaleSelf(e.scaleX||1,e.scaleY||1),n.translateSelf(e.x||0,e.y||0),t.setTransform(n)),t}}var ym=["shadowBlur","shadowOffsetX","shadowOffsetY"],mm=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function vm(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;!i&&e.opacity===n.opacity||(o||(Tm(t,r),o=!0),t.globalAlpha=(null==e.opacity?Zi:e).opacity),!i&&e.blend===n.blend||(o||(Tm(t,r),o=!0),t.globalCompositeOperation=e.blend||Zi.blend);for(var a=0;a<ym.length;a++){var s=ym[a];!i&&e[s]===n[s]||(o||(Tm(t,r),o=!0),t[s]=t.dpr*(e[s]||0))}return!i&&e.shadowColor===n.shadowColor||(o||(Tm(t,r),o=!0),t.shadowColor=e.shadowColor||Zi.shadowColor),o}function _m(t,e,n,i,r){var o=Cm(e,r.inHover),a=i?null:n&&Cm(n,r.inHover)||{};if(o!==a){var s=vm(t,o,a,i,r);!i&&o.fill===a.fill||(s||(Tm(t,r),s=!0),t.fillStyle=o.fill),!i&&o.stroke===a.stroke||(s||(Tm(t,r),s=!0),t.strokeStyle=o.stroke),!i&&o.opacity===a.opacity||(s||(Tm(t,r),s=!0),t.globalAlpha=null==o.opacity?1:o.opacity),e.hasStroke()&&(e=o.lineWidth/(o.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1),t.lineWidth!==e&&(s||(Tm(t,r),s=!0),t.lineWidth=e));for(var l=0;l<mm.length;l++){var u=mm[l],h=u[0];!i&&o[h]===a[h]||(s||(Tm(t,r),s=!0),t[h]=o[h]||u[1])}return s}}function xm(t,e){var n=e.transform,e=t.dpr||1;n?t.setTransform(e*n[0],e*n[1],e*n[2],e*n[3],e*n[4],e*n[5]):t.setTransform(e,0,0,e,0,0)}var bm=1,wm=2,Sm=3,Mm=4;function Tm(t,e){e.batchFill&&t.fill(),e.batchStroke&&t.stroke(),e.batchFill="",e.batchStroke=""}function Cm(t,e){return e&&t.__hoverStyle||t.style}function Im(t,e){Am(t,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function Am(t,e,n,i){var r=e.transform;if(!e.shouldBePainted(n.viewWidth,n.viewHeight,!1,!1))return e.__dirty&=~ri.REDARAW_BIT,void(e.__isRendered=!1);var o,a,s,l,u,h,c,p,d,f,g,y,m,v=e.__clipPaths,_=n.prevElClipPaths,x=!1,b=!1;_&&!lm(v,_)||(_&&_.length&&(Tm(t,n),t.restore(),b=x=!0,n.prevElClipPaths=null,n.allClipped=!1,n.prevEl=null),v&&v.length&&(Tm(t,n),t.save(),function(t,e,n){for(var i=!1,r=0;r<t.length;r++){var o=t[r],i=i||o.isZeroArea();xm(e,o),e.beginPath(),o.buildPath(e,o.shape),e.clip()}n.allClipped=i}(v,t,n),x=!0),n.prevElClipPaths=v),n.allClipped?e.__isRendered=!1:(e.beforeBrush&&e.beforeBrush(),e.innerBeforeBrush(),(u=n.prevEl)||(b=x=!0),o=e instanceof _o&&e.autoBatch&&(o=e.style,_=pm(o),v=cm(o),!(o.lineDash||!(+_^+v)||_&&"string"!=typeof o.fill||v&&"string"!=typeof o.stroke||o.strokePercent<1||o.strokeOpacity<1||o.fillOpacity<1)),x||(a=r,c=u.transform,a&&c?a[0]!==c[0]||a[1]!==c[1]||a[2]!==c[2]||a[3]!==c[3]||a[4]!==c[4]||a[5]!==c[5]:a||c)?(Tm(t,n),xm(t,e)):o||Tm(t,n),a=Cm(e,n.inHover),e instanceof _o?(n.lastDrawType!==bm&&(b=!0,n.lastDrawType=bm),_m(t,e,u,b,n),o&&(n.batchFill||n.batchStroke)||t.beginPath(),function(t,e,n,i){var r=cm(n),o=pm(n),a=n.strokePercent,s=a<1,l=!e.path;e.silent&&!s||!l||e.createPathProxy();var u,h,c,p,d,f,g,y=e.path||hm;i||(u=n.fill,h=n.stroke,c=o&&!!u.colorStops,v=r&&!!h.colorStops,p=o&&!!u.image,x=r&&!!h.image,g=b=f=_=d=void 0,(c||v)&&(g=e.getBoundingRect()),c&&(d=e.__dirty?sm(t,u,g):e.__canvasFillGradient,e.__canvasFillGradient=d),v&&(_=e.__dirty?sm(t,h,g):e.__canvasStrokeGradient,e.__canvasStrokeGradient=_),p&&(f=e.__dirty||!e.__canvasFillPattern?gm(t,u,e):e.__canvasFillPattern,e.__canvasFillPattern=f),x&&(b=e.__dirty||!e.__canvasStrokePattern?gm(t,h,e):e.__canvasStrokePattern,e.__canvasStrokePattern=f),c?t.fillStyle=d:p&&(f?t.fillStyle=f:o=!1),v?t.strokeStyle=_:x&&(b?t.strokeStyle=b:r=!1));var m,v=n.lineDash&&0<n.lineWidth&&um(n.lineDash,n.lineWidth),_=n.lineDashOffset,x=!!t.setLineDash,b=e.getGlobalScale();y.setScale(b[0],b[1],e.segmentIgnoreThreshold),!v||(m=n.strokeNoScale&&e.getLineScale?e.getLineScale():1)&&1!==m&&(v=O(v,function(t){return t/m}),_/=m),b=!0,(l||e.__dirty&_o.SHAPE_CHANGED_BIT||v&&!x&&r)&&(y.setDPR(t.dpr),s?y.setContext(null):(y.setContext(t),b=!1),y.reset(),v&&!x&&(y.setLineDash(v),y.setLineDashOffset(_)),e.buildPath(y,e.shape,i),y.toStatic(),e.pathUpdated()),b&&y.rebuildPath(t,s?a:1),v&&x&&(t.setLineDash(v),t.lineDashOffset=_),i||(n.strokeFirst?(r&&fm(t,n),o&&dm(t,n)):(o&&dm(t,n),r&&fm(t,n))),v&&x&&t.setLineDash([])}(t,e,a,o),o&&(n.batchFill=a.fill||"",n.batchStroke=a.stroke||"")):e instanceof Oa?(n.lastDrawType!==Sm&&(b=!0,n.lastDrawType=Sm),_m(t,e,u,b,n),h=t,c=e,null!=(m=(p=a).text)&&(m+=""),m&&(h.font=p.font||Vn,h.textAlign=p.textAlign,h.textBaseline=p.textBaseline,d=void 0,h.setLineDash&&(f=p.lineDash&&0<p.lineWidth&&um(p.lineDash,p.lineWidth),g=p.lineDashOffset,f&&((y=p.strokeNoScale&&c.getLineScale?c.getLineScale():1)&&1!==y&&(f=O(f,function(t){return t/y}),g/=y),h.setLineDash(f),h.lineDashOffset=g,d=!0)),p.strokeFirst?(cm(p)&&h.strokeText(m,p.x,p.y),pm(p)&&h.fillText(m,p.x,p.y)):(pm(p)&&h.fillText(m,p.x,p.y),cm(p)&&h.strokeText(m,p.x,p.y)),d&&h.setLineDash([]))):e instanceof Yo?(n.lastDrawType!==wm&&(b=!0,n.lastDrawType=wm),f=u,g=b,vm(t,Cm(e,(m=n).inHover),f&&Cm(f,m.inHover),g,m),p=t,d=a,(u=(h=e).__image=as(d.image,h.__image,h,h.onload))&&ls(u)&&(f=d.x||0,g=d.y||0,m=h.getWidth(),a=h.getHeight(),h=u.width/u.height,null==m&&null!=a?m=a*h:null==a&&null!=m?a=m/h:null==m&&null==a&&(m=u.width,a=u.height),d.sWidth&&d.sHeight?(s=d.sx||0,l=d.sy||0,p.drawImage(u,s,l,d.sWidth,d.sHeight,f,g,m,a)):d.sx&&d.sy?(h=m-(s=d.sx),d=a-(l=d.sy),p.drawImage(u,s,l,h,d,f,g,m,a)):p.drawImage(u,f,g,m,a))):e instanceof is&&(n.lastDrawType!==Mm&&(b=!0,n.lastDrawType=Mm),function(t,e,n){var i=e.getDisplayables(),r=e.getTemporalDisplayables();t.save();var o,a,s={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:n.viewWidth,viewHeight:n.viewHeight,inHover:n.inHover};for(o=e.getCursor(),a=i.length;o<a;o++){(h=i[o]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),Am(t,h,s,o===a-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}for(var l=0,u=r.length;l<u;l++){var h;(h=r[l]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),Am(t,h,s,l===u-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}e.clearTemporalDisplayables(),e.notClear=!0,t.restore()}(t,e,n)),o&&i&&Tm(t,n),e.innerAfterBrush(),e.afterBrush&&e.afterBrush(),(n.prevEl=e).__dirty=0,e.__isRendered=!0)}function Dm(){return!1}function km(t,e,n){var i=k(),r=e.getWidth(),o=e.getHeight(),e=i.style;return e&&(e.position="absolute",e.left="0",e.top="0",e.width=r+"px",e.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}var Lm,Pm=(l(Om,Lm=Et),Om.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},Om.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},Om.prototype.initContext=function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},Om.prototype.setUnpainted=function(){this.__firstTimePaint=!0},Om.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=km("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},Om.prototype.createRepaintRects=function(t,e,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var s=[],l=this.maxRepaintRectCount,u=!1,h=new Rn(0,0,0,0);function r(t){if(t.isFinite()&&!t.isZero())if(0===s.length){(e=new Rn(0,0,0,0)).copy(t),s.push(e)}else{for(var e,n=!1,i=0,r=0;r<s.length;++r){var o=s[r];if(o.intersect(t)){var a=new Rn(0,0,0,0);a.copy(o),a.union(t),s[r]=a,n=!0;break}u&&(h.copy(t),h.union(o),a=t.width*t.height,o=o.width*o.height,h.width*h.height-a-o<1/0&&(i=r))}u&&(s[i].union(t),n=!0),n||((e=new Rn(0,0,0,0)).copy(t),s.push(e)),u=u||s.length>=l}}for(var o,a=this.__startIndex;a<this.__endIndex;++a){(p=t[a])&&(f=p.shouldBePainted(n,i,!0,!0),(d=p.__isRendered&&(p.__dirty&ri.REDARAW_BIT||!f)?p.getPrevPaintRect():null)&&r(d),(o=f&&(p.__dirty&ri.REDARAW_BIT||!p.__isRendered)?p.getPaintRect():null)&&r(o))}for(var c,a=this.__prevStartIndex;a<this.__prevEndIndex;++a){var p,d,f=(p=e[a]).shouldBePainted(n,i,!0,!0);!p||f&&p.__zr||!p.__isRendered||(d=p.getPrevPaintRect())&&r(d)}do{c=!1;for(a=0;a<s.length;)if(s[a].isZero())s.splice(a,1);else{for(var g=a+1;g<s.length;)s[a].intersect(s[g])?(c=!0,s[a].union(s[g]),s.splice(g,1)):g++;a++}}while(c);return this._paintRects=s},Om.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},Om.prototype.resize=function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!==n&&this.ctxBack.scale(n,n))},Om.prototype.clear=function(t,o,e){var n=this.dom,a=this.ctx,i=n.width,r=n.height;o=o||this.clearColor;var s=this.motionBlur&&!t,l=this.lastFrameAlpha,u=this.dpr,h=this;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(n,0,0,i/u,r/u));var c=this.domBack;function p(t,e,n,i){var r;a.clearRect(t,e,n,i),o&&"transparent"!==o&&(r=void 0,j(o)?(r=o.__canvasGradient||sm(a,o,{x:0,y:0,width:n,height:i}),o.__canvasGradient=r):q(o)&&(r=gm(a,o,{dirty:function(){h.setUnpainted(),h.__painter.refresh()}})),a.save(),a.fillStyle=r||o,a.fillRect(t,e,n,i),a.restore()),s&&(a.save(),a.globalAlpha=l,a.drawImage(c,t,e,n,i),a.restore())}!e||s?p(0,0,i,r):e.length&&E(e,function(t){p(t.x*u,t.y*u,t.width*u,t.height*u)})},Om);function Om(t,e,n){var i,r=Lm.call(this)||this;r.motionBlur=!1,r.lastFrameAlpha=.7,r.dpr=1,r.virtual=!1,r.config={},r.incremental=!1,r.zlevel=0,r.maxRepaintRectCount=5,r.__dirty=!0,r.__firstTimePaint=!0,r.__used=!1,r.__drawIndex=0,r.__startIndex=0,r.__endIndex=0,r.__prevStartIndex=null,r.__prevEndIndex=null,n=n||Kn,"string"==typeof t?i=km(t,e,n):U(t)&&(t=(i=t).id),r.id=t;t=(r.dom=i).style;return t&&(i.onselectstart=Dm,t.webkitUserSelect="none",t.userSelect="none",t.webkitTapHighlightColor="rgba(0,0,0,0)",t["-webkit-touch-callout"]="none",t.padding="0",t.margin="0",t.borderWidth="0"),r.domBack=null,r.ctxBack=null,r.painter=e,r.config=null,r.dpr=n,r}var Rm=314159;function Em(t){return parseInt(t,10)}function Nm(t,e,n,i){this.type="canvas",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type="canvas";var r=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=A({},n||{}),this.dpr=n.devicePixelRatio||Kn,this._singleCanvas=r;var o=(this.root=t).style;o&&(o.webkitTapHighlightColor="transparent",o.webkitUserSelect="none",o.userSelect="none",o["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList;this._prevDisplayList=[];var s,o=this._layers;r?(e=(s=t).width,r=s.height,null!=n.width&&(e=n.width),null!=n.height&&(r=n.height),this.dpr=n.devicePixelRatio||1,s.width=e*this.dpr,s.height=r*this.dpr,this._width=e,this._height=r,(s=new Pm(s,this,this.dpr)).__builtin__=!0,s.initContext(),(o[Rm]=s).zlevel=Rm,a.push(Rm),this._domRoot=t):(this._width=this._getSize(0),this._height=this._getSize(1),a=this._domRoot=(o=this._width,s=this._height,(a=document.createElement("div")).style.cssText=["position:relative","width:"+o+"px","height:"+s+"px","padding:0","margin:0","border-width:0"].join(";")+";",a),t.appendChild(a))}function zm(t,e,n){for(var i;t&&(!e(t)||(i=t,!n));)t=t.__hostTarget||t.parent;return i}Nl("canvas",(Nm.prototype.getType=function(){return"canvas"},Nm.prototype.isSingleCanvas=function(){return this._singleCanvas},Nm.prototype.getViewportRoot=function(){return this._domRoot},Nm.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},Nm.prototype.refresh=function(t){var e=this.storage.getDisplayList(!0),n=this._prevDisplayList,i=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,n,t,this._redrawId);for(var r=0;r<i.length;r++){var o=i[r],a=this._layers[o];!a.__builtin__&&a.refresh&&(o=0===r?this._backgroundColor:null,a.refresh(o))}return this._opts.useDirtyRect&&(this._prevDisplayList=e.slice()),this},Nm.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},Nm.prototype._paintHoverList=function(t){var e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){for(var i,r={inHover:!0,viewWidth:this._width,viewHeight:this._height},o=0;o<e;o++){var a=t[o];a.__inHover&&(n=n||(this._hoverlayer=this.getLayer(1e5)),i||(i=n.ctx).save(),Am(i,a,r,o===e-1))}i&&i.restore()}},Nm.prototype.getHoverLayer=function(){return this.getLayer(1e5)},Nm.prototype.paintOne=function(t,e){Im(t,e)},Nm.prototype._paintList=function(t,e,n,i){var r,o,a;this._redrawId===i&&(n=n||!1,this._updateLayerStatus(t),r=(o=this._doPaintList(t,e,n)).finished,o=o.needsRefreshHover,this._needsManuallyCompositing&&this._compositeManually(),o&&this._paintHoverList(t),r?this.eachLayer(function(t){t.afterBrush&&t.afterBrush()}):(a=this,Si(function(){a._paintList(t,e,n,i)})))},Nm.prototype._compositeManually=function(){var e=this.getLayer(Rm).ctx,n=this._domRoot.width,i=this._domRoot.height;e.clearRect(0,0,n,i),this.eachBuiltinLayer(function(t){t.virtual&&e.drawImage(t.dom,0,0,n,i)})},Nm.prototype._doPaintList=function(d,f,g){for(var y=this,m=[],v=this._opts.useDirtyRect,t=0;t<this._zlevelList.length;t++){var e=this._zlevelList[t],e=this._layers[e];e.__builtin__&&e!==this._hoverlayer&&(e.__dirty||g)&&m.push(e)}for(var _=!0,x=!1,b=this,n=0;n<m.length;n++)!function(t){var i=m[t],r=i.ctx,e=v&&i.createRepaintRects(d,f,b._width,b._height);r.save();var o,a=g?i.__startIndex:i.__drawIndex,s=!g&&i.incremental&&Date.now,l=s&&Date.now(),n=i.zlevel===b._zlevelList[0]?b._backgroundColor:null;i.__startIndex===i.__endIndex?i.clear(!1,n,e):a===i.__startIndex&&((t=d[a]).incremental&&t.notClear&&!g||i.clear(!1,n,e)),-1===a&&(console.error("For some unknown reason. drawIndex is -1"),a=i.__startIndex);function u(t){var e={inHover:!1,allClipped:!1,prevEl:null,viewWidth:y._width,viewHeight:y._height};for(o=a;o<i.__endIndex;o++){var n=d[o];if(n.__inHover&&(x=!0),y._doPaintEl(n,i,v,t,e,o===i.__endIndex-1),s)if(15<Date.now()-l)break}e.prevElClipPaths&&r.restore()}if(e)if(0===e.length)o=i.__endIndex;else for(var h=b.dpr,c=0;c<e.length;++c){var p=e[c];r.save(),r.beginPath(),r.rect(p.x*h,p.y*h,p.width*h,p.height*h),r.clip(),u(p),r.restore()}else r.save(),u(),r.restore();i.__drawIndex=o,i.__drawIndex<i.__endIndex&&(_=!1)}(n);return w.wxa&&E(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),{finished:_,needsRefreshHover:x}},Nm.prototype._doPaintEl=function(t,e,n,i,r,o){e=e.ctx;n?(n=t.getPaintRect(),(!i||n&&n.intersect(i))&&(Am(e,t,r,o),t.setPrevPaintRect(n))):Am(e,t,r,o)},Nm.prototype.getLayer=function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=Rm);var n=this._layers[t];return n||((n=new Pm("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]?b(n,this._layerConfig[t],!0):this._layerConfig[t-.01]&&b(n,this._layerConfig[t-.01],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},Nm.prototype.insertLayer=function(t,e){var n,i=this._layers,r=this._zlevelList,o=r.length,a=this._domRoot,s=null,l=-1;if(i[t])x("ZLevel "+t+" has been used already");else if((n=e)&&(n.__builtin__||"function"==typeof n.resize&&"function"==typeof n.refresh)){if(0<o&&t>r[0]){for(l=0;l<o-1&&!(r[l]<t&&r[l+1]>t);l++);s=i[r[l]]}r.splice(l+1,0,t),(i[t]=e).virtual||(s?(s=s.dom).nextSibling?a.insertBefore(e.dom,s.nextSibling):a.appendChild(e.dom):a.firstChild?a.insertBefore(e.dom,a.firstChild):a.appendChild(e.dom)),e.__painter=this}else x("Layer of zlevel "+t+" is not valid")},Nm.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i];t.call(e,this._layers[r],r)}},Nm.prototype.eachBuiltinLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__&&t.call(e,o,r)}},Nm.prototype.eachOtherLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__||t.call(e,o,r)}},Nm.prototype.getLayers=function(){return this._layers},Nm.prototype._updateLayerStatus=function(t){function e(t){r&&(r.__endIndex!==t&&(r.__dirty=!0),r.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(var n=1;n<t.length;n++){if((s=t[n]).zlevel!==t[n-1].zlevel||s.incremental){this._needsManuallyCompositing=!0;break}}for(var i,r=null,o=0,a=0;a<t.length;a++){var s,l=(s=t[a]).zlevel,u=void 0;i!==l&&(i=l,o=0),s.incremental?((u=this.getLayer(l+.001,this._needsManuallyCompositing)).incremental=!0,o=1):u=this.getLayer(l+(0<o?.01:0),this._needsManuallyCompositing),u.__builtin__||x("ZLevel "+l+" has been used by unkown layer "+u.id),u!==r&&(u.__used=!0,u.__startIndex!==a&&(u.__dirty=!0),u.__startIndex=a,u.incremental?u.__drawIndex=-1:u.__drawIndex=a,e(a),r=u),s.__dirty&ri.REDARAW_BIT&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=a))}e(a),this.eachBuiltinLayer(function(t,e){!t.__used&&0<t.getElementCount()&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},Nm.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},Nm.prototype._clearLayer=function(t){t.clear()},Nm.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,function(t){t.setUnpainted()})},Nm.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?b(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];r!==t&&r!==t+.01||b(this._layers[r],n[t],!0)}}},Nm.prototype.delLayer=function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(L(n,t),1))},Nm.prototype.resize=function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!==t||e!==this._height){for(var r in n.style.width=t+"px",n.style.height=e+"px",this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(Rm).resize(t,e)}return this},Nm.prototype.clearLayer=function(t){t=this._layers[t];t&&t.clear()},Nm.prototype.dispose=function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},Nm.prototype.getRenderedCanvas=function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[Rm].dom;var e=new Pm("image",this,t.pixelRatio||this.dpr),n=e.ctx;if(e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor),t.pixelRatio<=this.dpr){this.refresh();var i=e.dom.width,r=e.dom.height,o=e.ctx;this.eachLayer(function(t){t.__builtin__?o.drawImage(t.dom,0,0,i,r):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var a={inHover:!1,viewWidth:this._width,viewHeight:this._height},s=this.storage.getDisplayList(!0),l=0,u=s.length;l<u;l++){Am(n,s[l],a,l===u-1)}return e.dom},Nm.prototype.getWidth=function(){return this._width},Nm.prototype.getHeight=function(){return this._height},Nm.prototype._getSize=function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);t=this.root,e=document.defaultView.getComputedStyle(t);return(t[i]||Em(e[n])||Em(t.style[n]))-(Em(e[r])||0)-(Em(e[o])||0)|0},Nm.prototype.pathToImage=function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),o=t.style,a=o.shadowBlur*e,s=o.shadowOffsetX*e,l=o.shadowOffsetY*e,u=t.hasStroke()?o.lineWidth:0,h=Math.max(u/2,a-s),o=Math.max(u/2,s+a),s=Math.max(u/2,a-l),a=Math.max(u/2,l+a),o=r.width+h+o,a=r.height+s+a;n.width=o*e,n.height=a*e,i.scale(e,e),i.clearRect(0,0,o,a),i.dpr=e;e={x:t.x,y:t.y,scaleX:t.scaleX,scaleY:t.scaleY,rotation:t.rotation,originX:t.originX,originY:t.originY};t.x=h-r.x,t.y=s-r.y,t.rotation=0,t.scaleX=1,t.scaleY=1,t.updateTransform(),t&&Am(i,t,{inHover:!1,viewWidth:this._width,viewHeight:this._height},!0);n=new Yo({style:{x:0,y:0,image:n}});return A(t,e),n},Nm));var Bm=Math.round(9*Math.random()),Ic=(Vm.prototype.get=function(t){return this._guard(t)[this._id]},Vm.prototype.set=function(t,e){t=this._guard(t);return"function"==typeof Object.defineProperty?Object.defineProperty(t,this._id,{value:e,enumerable:!1,configurable:!0}):t[this._id]=e,this},Vm.prototype.delete=function(t){return!!this.has(t)&&(delete this._guard(t)[this._id],!0)},Vm.prototype.has=function(t){return!!this._guard(t)[this._id]},Vm.prototype._guard=function(t){if(t!==Object(t))throw TypeError("Value of WeakMap is not a non-null object.");return t},Vm);function Vm(){this._id="__ec_inner_"+Bm++}var Lc=_o.extend({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,e=e.height/2;t.moveTo(n,i-e),t.lineTo(n+r,i+e),t.lineTo(n-r,i+e),t.closePath()}}),o=_o.extend({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,e=e.height/2;t.moveTo(n,i-e),t.lineTo(n+r,i),t.lineTo(n,i+e),t.lineTo(n-r,i),t.closePath()}}),g=_o.extend({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),e=Math.cos(u),r=.6*a,o=.7*a;t.moveTo(n-h,l+s),t.arc(n,l,a,Math.PI-u,2*Math.PI+u),t.bezierCurveTo(n+h-c*r,l+s+e*r,n,i-o,n,i),t.bezierCurveTo(n,i-o,n-h+c*r,l+s+e*r,n-h,l+s),t.closePath()}}),Dc=_o.extend({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,e=e.y,i=i/3*2;t.moveTo(r,e),t.lineTo(r+i,e+n),t.lineTo(r,e+n/4*3),t.lineTo(r-i,e+n),t.lineTo(r,e),t.closePath()}}),Fm={line:function(t,e,n,i,r){r.x=t,r.y=e+i/2-1,r.width=n,r.height=2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){i=Math.min(n,i);r.x=t,r.y=e,r.width=i,r.height=i},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Hm={};E({line:oa,rect:oa,roundRect:oa,square:oa,circle:Ko,diamond:o,pin:g,arrow:Dc,triangle:Lc},function(t,e){Hm[e]=new t});var Gm=_o.extend({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=jn(t,e,n),t=this.shape;return t&&"pin"===t.symbolType&&"inside"===e.position&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i,r=e.symbolType;"none"!==r&&(i=(i=Hm[r])||Hm[r="rect"],Fm[r](e.x,e.y,e.width,e.height,i.shape),i.buildPath(t,i.shape,n))}});function Wm(t,e){var n;"image"!==this.type&&(n=this.style,this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff",n.lineWidth=2):n.fill=t,this.markRedraw())}function Um(t,e,n,i,r,o,a){var s=0===t.indexOf("empty");return s&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(r=0===t.indexOf("image://")?Wh(t.slice(8),new Rn(e,n,i,r),a?"center":"cover"):0===t.indexOf("path://")?Gh(t.slice(7),{},new Rn(e,n,i,r),a?"center":"cover"):new Gm({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=s,r.setColor=Wm,o&&r.setColor(o),r}var Xm=new Ic,Ym=new Be(100),Zm=["symbol","symbolSize","symbolKeepAspect","color","backgroundColor","dashArrayX","dashArrayY","dashLineOffset","maxTileWidth","maxTileHeight"];function jm(t,e){if("none"===t)return null;var M=e.getDevicePixelRatio(),T=e.getZr(),C="svg"===T.painter.type;t.dirty&&Xm.delete(t);e=Xm.get(t);if(e)return e;var I=D(t,{symbol:"rect",symbolSize:1,symbolKeepAspect:!0,color:"rgba(0, 0, 0, 0.2)",backgroundColor:null,dashArrayX:5,dashArrayY:5,dashLineOffset:0,rotation:0,maxTileWidth:512,maxTileHeight:512});"none"===I.backgroundColor&&(I.backgroundColor=null);e={repeat:"repeat"};return function(t){for(var e,n=[M],i=!0,r=0;r<Zm.length;++r){var o=I[Zm[r]],a=typeof o;if(null!=o&&!V(o)&&"string"!=a&&"number"!=a&&"boolean"!=a){i=!1;break}n.push(o)}{var s;i&&(e=n.join(",")+(C?"-svg":""),(s=Ym.get(e))&&(C?t.svgElement=s:t.image=s))}var y,m=function t(e){if(!e||0===e.length)return[[0,0]];if("number"==typeof e){var n=Math.ceil(e);return[[n,n]]}var i=!0;for(var r=0;r<e.length;++r)if("number"!=typeof e[r]){i=!1;break}if(i)return t([e]);var o=[];for(var r=0;r<e.length;++r){"number"==typeof e[r]?(n=Math.ceil(e[r]),o.push([n,n])):(n=O(e[r],function(t){return Math.ceil(t)})).length%2==1?o.push(n.concat(n)):o.push(n)}return o}(I.dashArrayX),v=function(t){if(!t||"object"==typeof t&&0===t.length)return[0,0];if("number"==typeof t){var e=Math.ceil(t);return[e,e]}e=O(t,function(t){return Math.ceil(t)});return t.length%2?e.concat(e):e}(I.dashArrayY),_=function t(e){if(!e||0===e.length)return[["rect"]];if("string"==typeof e)return[[e]];var n=!0;for(var i=0;i<e.length;++i)if("string"!=typeof e[i]){n=!1;break}if(n)return t([e]);var r=[];for(var i=0;i<e.length;++i)"string"==typeof e[i]?r.push([e[i]]):r.push(e[i]);return r}(I.symbol),l=function(t){return O(t,qm)}(m),x=qm(v),b=!C&&k(),w=C&&T.painter.createSVGElement("g"),S=function(){for(var t=1,e=0,n=l.length;e<n;++e)t=iu(t,l[e]);for(var i=1,e=0,n=_.length;e<n;++e)i=iu(i,_[e].length);t*=i;var r=x*l.length*_.length;{}return{width:Math.max(1,Math.min(t,I.maxTileWidth)),height:Math.max(1,Math.min(r,I.maxTileHeight))}}();b&&(b.width=S.width*M,b.height=S.height*M,y=b.getContext("2d"));(function(){y&&(y.clearRect(0,0,b.width,b.height),I.backgroundColor&&(y.fillStyle=I.backgroundColor,y.fillRect(0,0,b.width,b.height)));for(var t=0,e=0;e<v.length;++e)t+=v[e];if(t<=0)return;var n=-x,i=0,r=0,o=0;for(;n<S.height;){if(i%2==0){for(var a=r/2%_.length,s=0,l=0,u=0;s<2*S.width;){for(var h,c,p,d,f,g=0,e=0;e<m[o].length;++e)g+=m[o][e];if(g<=0)break;l%2==0&&(f=.5*(1-I.symbolSize),h=s+m[o][l]*f,c=n+v[i]*f,p=m[o][l]*I.symbolSize,d=v[i]*I.symbolSize,f=u/2%_[a].length,function(t,e,n,i,r){var o=C?1:M,o=Um(r,t*o,e*o,n*o,i*o,I.color,I.symbolKeepAspect);C?w.appendChild(T.painter.paintOne(o)):Im(y,o)}(h,c,p,d,_[a][f])),s+=m[o][l],++u,++l===m[o].length&&(l=0)}++o===m.length&&(o=0)}n+=v[i],++r,++i===v.length&&(i=0)}})(),i&&Ym.put(e,b||w);t.image=b,t.svgElement=w,t.svgWidth=S.width,t.svgHeight=S.height}(e),e.rotation=I.rotation,e.scaleX=e.scaleY=C?1:1/M,Xm.set(t,e),t.dirty=!1,e}function qm(t){for(var e=0,n=0;n<t.length;++n)e+=t[n];return t.length%2==1?2*e:e}var Km=it,$m=E,Jm=F,Qm=U,g={PROCESSOR:{FILTER:1e3,SERIES_FILTER:800,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:2e3,CHART:3e3,POST_CHART_LAYOUT:4600,COMPONENT:4e3,BRUSH:5e3,CHART_ITEM:4500,ARIA:6e3,DECAL:7e3}},tv="__flagInMainProcess",ev="__optionUpdated",nv="__needsUpdateStatus",iv=/^[a-zA-Z0-9_]+$/,rv="__connectUpdateStatus";function ov(n){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];if(!this.isDisposed())return sv(this,n,t);Fv(this.id)}}function av(n){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return sv(this,n,t)}}function sv(t,e,n){return n[0]=n[0]&&n[0].toLowerCase(),Et.prototype[e].apply(t,n)}var lv,uv=(l(hv,lv=Et),hv);function hv(){return null!==lv&&lv.apply(this,arguments)||this}var cv,pv,dv,fv,gv,yv,mv,vv,_v,xv,bv,wv,Sv,Mv,Tv,Cv,Iv,Av,Dv,kv,Lv,Dc=uv.prototype;Dc.on=av("on"),Dc.off=av("off");var Pv,Ov=(l(Rv,Pv=Et),Rv.prototype._onframe=function(){if(!this._disposed){Lv(this);var t=this._scheduler;if(this[ev]){var e=this[ev].silent;this[tv]=!0,cv(this),fv.update.call(this),this._zr.flush(),this[tv]=!1,this[ev]=!1,vv.call(this,e),_v.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var o=+new Date}while(t.performSeriesTasks(i),t.performDataProcessorTasks(i),yv(this,i),t.performVisualTasks(i),Tv(this,this._model,r,"remain"),0<(n-=+new Date-o)&&t.unfinished);t.unfinished||this._zr.flush()}}},Rv.prototype.getDom=function(){return this._dom},Rv.prototype.getId=function(){return this.id},Rv.prototype.getZr=function(){return this._zr},Rv.prototype.setOption=function(t,e,n){var i,r,o,a,s;this._disposed?Fv(this.id):(Qm(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this[tv]=!0,this._model&&!e||(a=new Bd(this._api),s=this._theme,(e=this._model=new Id).scheduler=this._scheduler,e.init(null,null,null,s,this._locale,a)),this._model.setOption(t,{replaceMerge:r},Uv),Dv(this,o),n?(this[ev]={silent:i},this[tv]=!1,this.getZr().wakeUp()):(cv(this),fv.update.call(this),this._zr.flush(),this[ev]=!1,this[tv]=!1,vv.call(this,i),_v.call(this,i)))},Rv.prototype.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},Rv.prototype.getModel=function(){return this._model},Rv.prototype.getOption=function(){return this._model&&this._model.getOption()},Rv.prototype.getWidth=function(){return this._zr.getWidth()},Rv.prototype.getHeight=function(){return this._zr.getHeight()},Rv.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},Rv.prototype.getRenderedCanvas=function(t){if(w.canvasSupported)return(t=A({},t||{})).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor"),this._zr.painter.getRenderedCanvas(t)},Rv.prototype.getSvgDataURL=function(){if(w.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),function(t){t.stopAnimation(null,!0)}),t.painter.toDataURL()}},Rv.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;$m(e,function(t){n.eachComponent({mainType:t},function(t){t=r._componentsMap[t.__viewId];t.group.ignore||(i.push(t),t.group.ignore=!0)})});t="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return $m(i,function(t){t.group.ignore=!1}),t}Fv(this.id)},Rv.prototype.getConnectedDataURL=function(i){if(this._disposed)Fv(this.id);else if(w.canvasSupported){var r="svg"===i.type,o=this.group,a=Math.min,s=Math.max;if($v[o]){var l=1/0,u=1/0,h=-1/0,c=-1/0,p=[],e=i&&i.pixelRatio||1;E(Kv,function(t,e){var n;t.group===o&&(n=r?t.getZr().painter.getSvgDom().innerHTML:t.getRenderedCanvas(I(i)),t=t.getDom().getBoundingClientRect(),l=a(t.left,l),u=a(t.top,u),h=s(t.right,h),c=s(t.bottom,c),p.push({dom:n,left:t.left,top:t.top}))});var t=(h*=e)-(l*=e),n=(c*=e)-(u*=e),d=k(),f=El(d,{renderer:r?"svg":"canvas"});if(f.resize({width:t,height:n}),r){var g="";return $m(p,function(t){var e=t.left-l,n=t.top-u;g+='<g transform="translate('+e+","+n+')">'+t.dom+"</g>"}),f.painter.getSvgRoot().innerHTML=g,i.connectedBackgroundColor&&f.painter.setBackgroundColor(i.connectedBackgroundColor),f.refreshImmediately(),f.painter.toDataURL()}return i.connectedBackgroundColor&&f.add(new oa({shape:{x:0,y:0,width:t,height:n},style:{fill:i.connectedBackgroundColor}})),$m(p,function(t){t=new Yo({style:{x:t.left*e-l,y:t.top*e-u,image:t.dom}});f.add(t)}),f.refreshImmediately(),d.toDataURL("image/"+(i&&i.type||"png"))}return this.getDataURL(i)}},Rv.prototype.convertToPixel=function(t,e){return gv(this,"convertToPixel",t,e)},Rv.prototype.convertFromPixel=function(t,e){return gv(this,"convertFromPixel",t,e)},Rv.prototype.containPixel=function(t,r){var o;if(!this._disposed)return E(Su(this._model,t),function(t,i){0<=i.indexOf("Models")&&E(t,function(t){var e,n=t.coordinateSystem;n&&n.containPoint?o=o||!!n.containPoint(r):"seriesModels"===i&&(e=this._chartsMap[t.__viewId])&&e.containPoint&&(o=o||e.containPoint(r,t))},this)},this),!!o;Fv(this.id)},Rv.prototype.getVisual=function(t,e){var n=Su(this._model,t,{defaultMainType:"series"}),t=n.seriesModel;t=t.getData(),n=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?t.indexOfRawIndex(n.dataIndex):null;return null!=n?function(t,e,n){switch(n){case"color":return t.getItemVisual(e,"style")[t.getVisual("drawType")];case"opacity":return t.getItemVisual(e,"style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getItemVisual(e,n);default:0}}(t,n,e):Ay(t,e)},Rv.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},Rv.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},Rv.prototype._initEvents=function(){var t,e,n,s=this;$m(Vv,function(a){function t(t){var n,e,i=s.getModel(),r=t.target,o="globalout"===a;o?n={}:r&&zm(r,function(t){var e=Gu(t);if(e&&null!=e.dataIndex){t=e.dataModel||i.getSeriesByIndex(e.seriesIndex);return n=t&&t.getDataParams(e.dataIndex,e.dataType)||{},1}return e.eventData&&(n=A({},e.eventData),1)},!0),n&&(e=n.componentType,o=n.componentIndex,"markLine"!==e&&"markPoint"!==e&&"markArea"!==e||(e="series",o=n.seriesIndex),o=(e=e&&null!=o&&i.getComponent(e,o))&&s["series"===e.mainType?"_chartsMap":"_componentsMap"][e.__viewId],n.event=t,n.type=a,s._$eventProcessor.eventInfo={targetEl:r,packedEvent:n,model:e,view:o},s.trigger(a,n))}t.zrEventfulCallAtLast=!0,s._zr.on(a,t,s)}),$m(Gv,function(t,e){s._messageCenter.on(e,function(t){this.trigger(e,t)},s)}),$m(["selectchanged"],function(e){s._messageCenter.on(e,function(t){this.trigger(e,t)},s)}),t=this._messageCenter,n=(e=this)._model,t.on("selectchanged",function(t){t.isFromClick?(am("map","selectchanged",e,n,t),am("pie","selectchanged",e,n,t)):"select"===t.fromAction?(am("map","selected",e,n,t),am("pie","selected",e,n,t)):"unselect"===t.fromAction&&(am("map","unselected",e,n,t),am("pie","unselected",e,n,t))})},Rv.prototype.isDisposed=function(){return this._disposed},Rv.prototype.clear=function(){this._disposed?Fv(this.id):this.setOption({series:[]},!0)},Rv.prototype.dispose=function(){var e,n;this._disposed?Fv(this.id):(this._disposed=!0,Iu(this.getDom(),t_,""),e=this._api,n=this._model,$m(this._componentsViews,function(t){t.dispose(n,e)}),$m(this._chartsViews,function(t){t.dispose(n,e)}),this._zr.dispose(),delete Kv[this.id])},Rv.prototype.resize=function(t){var e;this._disposed?Fv(this.id):(this._zr.resize(t),e=this._model,this._loadingFX&&this._loadingFX.resize(),e&&(e=e.resetOption("media"),t=t&&t.silent,this[tv]=!0,e&&cv(this),fv.update.call(this,{type:"resize",animation:{duration:0}}),this[tv]=!1,vv.call(this,t),_v.call(this,t)))},Rv.prototype.showLoading=function(t,e){this._disposed?Fv(this.id):(Qm(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),qv[t]&&(t=qv[t](this._api,e),e=this._zr,this._loadingFX=t,e.add(t)))},Rv.prototype.hideLoading=function(){this._disposed?Fv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},Rv.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Gv[t.type],e},Rv.prototype.dispatchAction=function(t,e){var n;this._disposed?Fv(this.id):(Qm(e)||(e={silent:!!e}),Hv[t.type]&&this._model&&(this[tv]?this._pendingActions.push(t):(n=e.silent,mv.call(this,t,n),(e=e.flush)?this._zr.flush():!1!==e&&w.browser.weChat&&this._throttledZrFlush(),vv.call(this,n),_v.call(this,n))))},Rv.prototype.updateLabelLayout=function(){var t=this._labelManager;t.updateLayoutConfig(this._api),t.layout(this._api),t.processLabelsOverall()},Rv.prototype.appendData=function(t){var e;this._disposed?Fv(this.id):(e=t.seriesIndex,this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp())},Rv.internalField=(cv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),pv(t,!0),pv(t,!1),e.plan()},pv=function(t,r){for(var o=t._model,a=t._scheduler,s=r?t._componentsViews:t._chartsViews,l=r?t._componentsMap:t._chartsMap,u=t._zr,h=t._api,e=0;e<s.length;e++)s[e].__alive=!1;function n(t){var e=t.__requireNewView;t.__requireNewView=!1;var n="_ec_"+t.id+"_"+t.type,i=!e&&l[n];i||(e=Pu(t.type),(i=new(r?Pg.getClass(e.main,e.sub):zg.getClass(e.sub))).init(o,h),l[n]=i,s.push(i),u.add(i.group)),t.__viewId=i.__id=n,i.__alive=!0,i.__model=t,i.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},r||a.prepareView(i,t,o,h)}r?o.eachComponent(function(t,e){"series"!==t&&n(e)}):o.eachSeries(n);for(e=0;e<s.length;){var i=s[e];i.__alive?e++:(r||i.renderTask.dispose(),u.remove(i.group),i.dispose(o,h),s.splice(e,1),l[i.__id]===i&&delete l[i.__id],i.__id=i.group.__ecComponentInfo=null)}},dv=function(o,e,a,s,t){var n,l,i=o._model;function u(t){t&&t.__alive&&t[e]&&t[e](t.__model,i,o._api,a)}i.setUpdatePayload(a),s?((n={})[s+"Id"]=a[s+"Id"],n[s+"Index"]=a[s+"Index"],n[s+"Name"]=a[s+"Name"],n={mainType:s,query:n},t&&(n.subType=t),null!=(t=a.excludeSeriesId)&&(l=ht(),$m(uu(t),function(t){t=yu(t,null);null!=t&&l.set(t,!0)})),i&&i.eachComponent(n,function(t){var e,n,i,r;l&&null!=l.get(t.id)||(Eh(a)&&!a.notBlur?t instanceof Sg&&function(t,e,n){if(Eh(e)){var i,r=e.type===Qu,o=t.seriesIndex,a=t.getData(e.dataType),e=(V(e=xu(a,e))?e[0]:e)||0,s=a.getItemGraphicEl(e);if(!s)for(var l=a.count(),u=0;!s&&u<l;)s=a.getItemGraphicEl(u++);s?Ih(o,(i=Gu(s)).focus,i.blurScope,n,r):(i=t.get(["emphasis","focus"]),t=t.get(["emphasis","blurScope"]),null!=i&&Ih(o,i,t,n,r))}}(t,a,o._api):Rh(a)&&t instanceof Sg&&(e=t,n=a,o._api,Rh(n)&&(i=n.dataType,V(r=xu(e.getData(i),n))||(r=[r]),e[n.type===ih?"toggleSelect":n.type===eh?"select":"unselect"](r,i)),Ah(t),kv(o)),u(o["series"===s?"_chartsMap":"_componentsMap"][t.__viewId]))},o)):$m([].concat(o._componentsViews).concat(o._chartsViews),u)},fv={prepareAndUpdate:function(t){cv(this),fv.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,o=this._scheduler;e&&(e.setUpdatePayload(t),o.restoreData(e,t),o.performSeriesTasks(e),r.create(e,n),o.performDataProcessorTasks(e,t),yv(this,e),r.update(e,n),wv(e),o.performVisualTasks(e,t),Sv(this,e,n,t),o=e.get("backgroundColor")||"transparent",t=e.get("darkMode"),w.canvasSupported?(i.setBackgroundColor(o),null!=t&&"auto"!==t&&i.setDarkMode(t)):(o=an(t=Je(o),"rgb"),0===t[3]&&(o="transparent")),Cv(e,n))},updateTransform:function(n){var i,r,o=this,a=this._model,s=this._api;a&&(a.setUpdatePayload(n),i=[],a.eachComponent(function(t,e){"series"===t||(t=o.getViewOfComponentModel(e))&&t.__alive&&(!t.updateTransform||(e=t.updateTransform(e,a,s,n))&&e.update)&&i.push(t)}),r=ht(),a.eachSeries(function(t){var e=o._chartsMap[t.__viewId];(!e.updateTransform||(e=e.updateTransform(t,a,s,n))&&e.update)&&r.set(t.uid,1)}),wv(a),this._scheduler.performVisualTasks(a,n,{setDirty:!0,dirtyMap:r}),Tv(this,a,s,n,r),Cv(a,this._api))},updateView:function(t){var e=this._model;e&&(e.setUpdatePayload(t),zg.markUpdateMethod(t,"updateView"),wv(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),Sv(this,this._model,this._api,t),Cv(e,this._api))},updateVisual:function(n){var i=this,r=this._model;r&&(r.setUpdatePayload(n),r.eachSeries(function(t){t.getData().clearAllVisual()}),zg.markUpdateMethod(n,"updateVisual"),wv(r),this._scheduler.performVisualTasks(r,n,{visualType:"visual",setDirty:!0}),r.eachComponent(function(t,e){"series"===t||(t=i.getViewOfComponentModel(e))&&t.__alive&&t.updateVisual(e,r,i._api,n)}),r.eachSeries(function(t){i._chartsMap[t.__viewId].updateVisual(t,r,i._api,n)}),Cv(r,this._api))},updateLayout:function(t){fv.update.call(this,t)}},gv=function(t,e,n,i){if(t._disposed)Fv(t.id);else{for(var r,o=t._model,a=t._coordSysMgr.getCoordinateSystems(),s=Su(o,n),l=0;l<a.length;l++){var u=a[l];if(u[e]&&null!=(r=u[e](o,s,i)))return r}0}},yv=function(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries(function(t){i.updateStreamModes(t,n[t.__viewId])})},mv=function(e,t){var n=this,i=this.getModel(),r=e.type,o=e.escapeConnect,a=Hv[r],s=a.actionInfo,l=(s.update||"update").split(":"),u=l.pop(),h=null!=l[0]&&Pu(l[0]);this[tv]=!0;var c=[e],p=!1;e.batch&&(p=!0,c=O(e.batch,function(t){return(t=D(A({},t),e)).batch=null,t}));var d,f,g=[],l=Rh(e),y=Eh(e)||l;$m(c,function(t){(d=(d=a.action(t,n._model,n._api))||A({},t)).type=s.event||d.type,g.push(d),y?(dv(n,u,t,"series"),kv(n)):h&&dv(n,u,t,h.main,h.sub)}),"none"===u||y||h||(this[ev]?(cv(this),fv.update.call(this,e),this[ev]=!1):fv[u].call(this,e)),d=p?{type:s.event||r,escapeConnect:o,batch:g}:g[0],this[tv]=!1,t||((t=this._messageCenter).trigger(d.type,d),l&&(i={type:"selectchanged",escapeConnect:o,selected:(f=[],i.eachSeries(function(n){E(n.getAllData(),function(t){t.data;var e=t.type,t=n.getSelectedDataIndices();0<t.length&&(t={dataIndex:t,seriesIndex:n.seriesIndex},null!=e&&(t.dataType=e),f.push(t))})}),f),isFromClick:e.isFromClick||!1,fromAction:e.type,fromActionPayload:e},t.trigger(i.type,i)))},vv=function(t){for(var e=this._pendingActions;e.length;){var n=e.shift();mv.call(this,n,t)}},_v=function(t){t||this.trigger("updated")},xv=function(e,n){e.on("rendered",function(t){n.trigger("rendered",t),!e.animation.isFinished()||n[ev]||n._scheduler.unfinished||n._pendingActions.length||n.trigger("finished")})},bv=function(t,i){t.on("mouseover",function(t){var e,n=zm(t.target,Oh);n&&(Ih((e=Gu(n)).seriesIndex,e.focus,e.blurScope,i._api,!0),Ch(n=n,t)||n.__highByOuter||gh(n,lh),kv(i))}).on("mouseout",function(t){var e,n=zm(t.target,Oh);n&&(Ih((e=Gu(n)).seriesIndex,e.focus,e.blurScope,i._api,!1),Ch(n=n,t)||n.__highByOuter||gh(n,uh),kv(i))}).on("click",function(t){var e=zm(t.target,function(t){return null!=Gu(t).dataIndex},!0);e&&(t=e.selected?"unselect":"select",e=Gu(e),i._api.dispatchAction({type:t,dataType:e.dataType,dataIndexInside:e.dataIndex,seriesIndex:e.seriesIndex,isFromClick:!0}))})},wv=function(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})},Sv=function(t,e,n,i){Mv(t,e,n,i),$m(t._chartsViews,function(t){t.__alive=!1}),Tv(t,e,n,i),$m(t._chartsViews,function(t){t.__alive||t.remove(e,n)})},Mv=function(t,n,i,r,e){$m(e||t._componentsViews,function(t){var e=t.__model;zv(0,t),t.render(e,n,i,r),Nv(e,t),Bv(e,t)})},Tv=function(i,t,e,r,o){var a=i._scheduler,s=i._labelManager;s.clearLabels();var n,l,u=!1;t.eachSeries(function(t){var e=i._chartsMap[t.__viewId];e.__alive=!0;var n=e.renderTask;a.updatePayload(n,r),zv(0,e),o&&o.get(t.uid)&&n.dirty(),n.perform(a.getPerformArgs(n))&&(u=!0),t.__transientTransitionOpt=null,e.group.silent=!!t.get("silent"),function(t,e){var n=t.get("blendMode")||null;0;e.group.traverse(function(t){t.isGroup||(t.style.blend=n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.style.blend=n})})}(t,e),Ah(t),s.addLabelsOfSeries(e)}),a.unfinished=u||a.unfinished,s.updateLayoutConfig(e),s.layout(e),s.processLabelsOverall(),t.eachSeries(function(t){var e=i._chartsMap[t.__viewId];Nv(t,e),Bv(t,e)}),e=t,t=(n=i)._zr.storage,l=0,t.traverse(function(t){t.isGroup||l++}),l>e.get("hoverLayerThreshold")&&!w.node&&!w.worker&&e.eachSeries(function(t){t.preventUsingHoverLayer||(t=n._chartsMap[t.__viewId]).__alive&&t.group.traverse(function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)})})},Cv=function(e,n){$m(Yv,function(t){t(e,n)})},kv=function(t){t[nv]=!0,t.getZr().wakeUp()},Lv=function(t){t[nv]&&(t.getZr().storage.traverse(function(t){Qh(t)||Ev(t)}),t[nv]=!1)},Iv=function(n){return l(t,e=Pd),t.prototype.getCoordinateSystems=function(){return n._coordSysMgr.getCoordinateSystems()},t.prototype.getComponentByElement=function(t){for(;t;){var e=t.__ecComponentInfo;if(null!=e)return n._model.getComponent(e.mainType,e.index);t=t.parent}},t.prototype.enterEmphasis=function(t,e){xh(t,e),kv(n)},t.prototype.leaveEmphasis=function(t,e){bh(t,e),kv(n)},t.prototype.enterBlur=function(t){wh(t),kv(n)},t.prototype.leaveBlur=function(t){Sh(t),kv(n)},t.prototype.enterSelect=function(t){Mh(t),kv(n)},t.prototype.leaveSelect=function(t){Th(t),kv(n)},t.prototype.getModel=function(){return n.getModel()},t.prototype.getViewOfComponentModel=function(t){return n.getViewOfComponentModel(t)},t.prototype.getViewOfSeriesModel=function(t){return n.getViewOfSeriesModel(t)},new t(n);function t(){return null!==e&&e.apply(this,arguments)||this}var e},Av=function(i){function r(t,e){for(var n=0;n<t.length;n++){t[n][rv]=e}}$m(Gv,function(t,e){i._messageCenter.on(e,function(t){var e,n;$v[i.group]&&0!==i[rv]&&(t&&t.escapeConnect||(e=i.makeActionFromEvent(t),n=[],$m(Kv,function(t){t!==i&&t.group===i.group&&n.push(t)}),r(n,0),$m(n,function(t){1!==t[rv]&&t.dispatchAction(e)}),r(n,2)))})})},void(Dv=function(t,e){var a=t._model;E(uu(e),function(t){var e,n=t.from,i=t.to;null==i&&au(e);var r={includeMainTypes:["series"],enableAll:!1,enableNone:!1},o=n?Su(a,n,r):null,r=Su(a,i,r).seriesModel;null==r&&(e=""),o&&o.seriesModel!==r&&(e=""),null!=e&&au(e),r.__transientTransitionOpt={from:n?n.dimension:null,to:i.dimension,dividingMethod:t.dividingMethod}})})),Rv);function Rv(t,e,n){var i=Pv.call(this,new Cy)||this;i._chartsViews=[],i._chartsMap={},i._componentsViews=[],i._componentsMap={},i._pendingActions=[],n=n||{},"string"==typeof e&&(e=jv[e]),i._dom=t;"undefined"==typeof window&&global;var r="canvas",o=!1,o=i._zr=El(t,{renderer:n.renderer||r,devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height,useDirtyRect:null==n.useDirtyRect?o:n.useDirtyRect});i._throttledZrFlush=Zg(z(o.flush,o),17),(e=I(e))&&of(e,!0),i._theme=e,i._locale=function(t){if(H(t)){var e=Wc[t.toUpperCase()]||{};return t===Fc||t===Hc?I(e):b(I(e),I(Wc[Gc]),!1)}return b(I(t),I(Wc[Gc]),!1)}(n.locale||Xc),i._coordSysMgr=new Ed;n=i._api=Iv(i);function a(t,e){return t.__prio-e.__prio}return yi(Zv,a),yi(Wv,a),i._scheduler=new ny(i,n,Wv,Zv),i._messageCenter=new uv,i._labelManager=new rm,i._initEvents(),i.resize=z(i.resize,i),o.animation.on("frame",i._onframe,i),xv(o,i),bv(o,i),at(i),i}function Ev(t){for(var e=[],n=t.currentStates,i=0;i<n.length;i++){var r=n[i];"emphasis"!==r&&"blur"!==r&&"select"!==r&&e.push(r)}t.selected&&t.states.select&&e.push("select"),t.hoverState===ju&&t.states.emphasis?e.push("emphasis"):t.hoverState===Zu&&t.states.blur&&e.push("blur"),t.useStates(e)}function Nv(t,e){var i,r;t.preventAutoZ||(i=t.get("z"),r=t.get("zlevel"),e.group.traverse(function(t){var e,n;t.isGroup||(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),n=t.getTextContent(),e=t.getTextGuideLine(),n&&(n.z=t.z,n.zlevel=t.zlevel,n.z2=t.z2+2),e&&(n=t.textGuideLineConfig&&t.textGuideLineConfig.showAbove,e.z=t.z,e.zlevel=t.zlevel,e.z2=t.z2+(n?1:-1)))}))}function zv(t,e){e.group.traverse(function(t){var e,n;Qh(t)||(e=t.getTextContent(),n=t.getTextGuideLine(),t.stateTransition&&(t.stateTransition=null),e&&e.stateTransition&&(e.stateTransition=null),n&&n.stateTransition&&(n.stateTransition=null),t.hasState()?(t.prevStates=t.currentStates,t.clearStates()):t.prevStates&&(t.prevStates=null))})}function Bv(t,e){var n=t.getModel("stateAnimation"),r=t.isAnimationEnabled(),t=n.get("duration"),o=0<t?{duration:t,delay:n.get("delay"),easing:n.get("easing")}:null;e.group.traverse(function(t){var e,n,i;t.states&&t.states.emphasis&&(Qh(t)||(t instanceof _o&&((i=Xu(n=t)).normalFill=n.style.fill,i.normalStroke=n.style.stroke,n=n.states.select||{},i.selectFill=n.style&&n.style.fill||null,i.selectStroke=n.style&&n.style.stroke||null),!t.__dirty||(e=t.prevStates)&&t.useStates(e),r&&(t.stateTransition=o,n=t.getTextContent(),e=t.getTextGuideLine(),n&&(n.stateTransition=o),e&&(e.stateTransition=o)),t.__dirty&&Ev(t)))})}Lc=Ov.prototype;Lc.on=ov("on"),Lc.off=ov("off"),Lc.one=function(i,r,t){var o=this;ou(),this.on.call(this,i,function t(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];r&&r.apply&&r.apply(this,e),o.off(i,t)},t)};var Vv=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function Fv(){0}var Hv={},Gv={},Wv=[],Uv=[],Xv=[],Yv=[],Zv=[],jv={},qv={},Kv={},$v={},Jv=+new Date,Qv=+new Date,t_="_echarts_instance_";function e_(t){$v[t]=!1}Dc=e_;function n_(t){return Kv[e=t_,(t=t).getAttribute?t.getAttribute(e):t[e]];var e}function i_(t,e){jv[t]=e}function r_(t){Uv.push(t)}function o_(t,e){u_(Wv,t,e,2e3)}function a_(t,e,n){"function"==typeof e&&(n=e,e="");var i=Qm(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Km(iv.test(i)&&iv.test(e)),Hv[i]||(Hv[i]={action:n,actionInfo:t}),Gv[e]=i}function s_(t,e){u_(Zv,t,e,1e3,"layout")}function l_(t,e){u_(Zv,t,e,3e3,"visual")}function u_(t,e,n,i,r){(Jm(e)||Qm(e))&&(n=e,e=i);r=ny.wrapStageHandler(n,r);r.__prio=e,r.__raw=n,t.push(r)}function h_(t,e){qv[t]=e}Lc=function(t){var e=(t=I(t)).type,n="";e||au(n);var i=e.split(":");2!==i.length&&au(n),n=!1,"echarts"===i[0]&&(e=i[1],n=!0),t.__isBuiltIn=n,Kf.set(e,t)};l_(2e3,ua),l_(4500,Yh),l_(4500,nl),l_(2e3,Tc),l_(4500,Qa),l_(7e3,function(e,i){e.eachRawSeries(function(t){var n;e.isSeriesFiltered(t)||((n=t.getData()).hasItemVisual()&&n.each(function(t){var e=n.getItemVisual(t,"decal");e&&(n.ensureUniqueItemVisual(t,"style").decal=jm(e,i))}),(t=n.getVisual("decal"))&&(n.getVisual("style").decal=jm(t,i)))})}),r_(of),o_(900,function(t){var i=ht();t.eachSeries(function(t){var e,n=t.get("stack");n&&(e=i.get(n)||i.set(n,[]),(t={stackResultDimension:(n=t.getData()).getCalculationInfo("stackResultDimension"),stackedOverDimension:n.getCalculationInfo("stackedOverDimension"),stackedDimension:n.getCalculationInfo("stackedDimension"),stackedByDimension:n.getCalculationInfo("stackedByDimension"),isStackedByIndex:n.getCalculationInfo("isStackedByIndex"),data:n,seriesModel:t}).stackedDimension&&(t.isStackedByIndex||t.stackedByDimension)&&(e.length&&n.setCalculationInfo("stackedOnSeries",e[e.length-1].seriesModel),e.push(t)))}),i.each(af)}),h_("default",function(i,r){D(r=r||{},{text:"loading",textColor:"#000",fontSize:"12px",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var t=new Ho,o=new oa({style:{fill:r.maskColor},zlevel:r.zlevel,z:1e4});t.add(o);var a,s=r.fontSize+" sans-serif",l=new oa({style:{fill:"none"},textContent:new Ss({style:{text:r.text,fill:r.textColor,font:s}}),textConfig:{position:"right",distance:10},zlevel:r.zlevel,z:10001});return t.add(l),r.showSpinner&&((a=new Rs({shape:{startAngle:-ey/2,endAngle:-ey/2+.1,r:r.spinnerRadius},style:{stroke:r.color,lineCap:"round",lineWidth:r.lineWidth},zlevel:r.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*ey/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*ey/2}).delay(300).start("circularInOut"),t.add(a)),t.resize=function(){var t=Hn(r.text,s),e=r.showSpinner?r.spinnerRadius:0,n=(i.getWidth()-2*e-(r.showSpinner&&t?10:0)-t)/2-(r.showSpinner?0:t/2),t=i.getHeight()/2;r.showSpinner&&a.setShape({cx:n,cy:t}),l.setShape({x:n-e,y:t-e,width:2*e,height:2*e}),o.setShape({x:0,y:0,width:i.getWidth(),height:i.getHeight()})},t.resize(),t}),a_({type:Qu,event:Qu,update:Qu},dt),a_({type:th,event:th,update:th},dt),a_({type:eh,event:eh,update:eh},dt),a_({type:nh,event:nh,update:nh},dt),a_({type:ih,event:ih,update:ih},dt),i_("light",wl),i_("dark",qn);function c_(t){return null==t?0:t.length||1}function p_(t){return t}var d_=(f_.prototype.add=function(t){return this._add=t,this},f_.prototype.update=function(t){return this._update=t,this},f_.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},f_.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},f_.prototype.remove=function(t){return this._remove=t,this},f_.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},f_.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o<t.length;o++){var a,s=i[o],l=n[s],u=c_(l);1<u?(a=l.shift(),1===l.length&&(n[s]=l[0]),this._update&&this._update(a,o)):1===u?(n[s]=null,this._update&&this._update(l,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},f_.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a<r.length;a++){var s=r[a],l=n[s],u=i[s],h=c_(l),c=c_(u);if(1<h&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&1<c)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(1<h)for(var p=0;p<h;p++)this._remove&&this._remove(l[p]);else this._remove&&this._remove(l)}this._performRestAdd(o,i)},f_.prototype._performRestAdd=function(t,e){for(var n=0;n<t.length;n++){var i=t[n],r=e[i],o=c_(r);if(1<o)for(var a=0;a<o;a++)this._add&&this._add(r[a]);else 1===o&&this._add&&this._add(r);e[i]=null}},f_.prototype._initIndexMap=function(t,e,n,i){for(var r=this._diffModeMultiple,o=0;o<t.length;o++){var a,s,l="_ec_"+this[i](t[o],o);r||(n[o]=l),e&&(0===(s=c_(a=e[l]))?(e[l]=o,r&&n.push(l)):1===s?e[l]=[a,o]:a.push(o))}},f_);function f_(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||p_,this._newKeyGetter=i||p_,this.context=r,this._diffModeMultiple="multiple"===o}function g_(o){var t={},a=t.encode={},s=ht(),l=[],u=[],h=t.userOutput={dimensionNames:o.dimensions.slice(),encode:{}};E(o.dimensions,function(t){var e,n,i=o.getDimensionInfo(t),r=i.coordDim;r&&(e=i.coordDimIndex,y_(a,r)[e]=t,i.isExtraCoord||(s.set(r,1),"ordinal"===(n=i.type)||"time"===n||(l[0]=t),y_(h.encode,r)[e]=i.index),i.defaultTooltip&&u.push(t)),Qp.each(function(t,e){var n=y_(a,e),e=i.otherDims[e];null!=e&&!1!==e&&(n[e]=i.name)})});var i=[],r={};s.each(function(t,e){var n=a[e];r[e]=n[0],i=i.concat(n)}),t.dataDimsOnCoord=i,t.encodeFirstDimNotExtra=r;var e=a.label;e&&e.length&&(l=e.slice());e=a.tooltip;return e&&e.length?u=e.slice():u.length||(u=l.slice()),a.defaultedLabel=l,a.defaultedTooltip=u,t}function y_(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}var m_,v_,__,x_,b_,w_,S_,M_,T_,C_,I_,A_,D_,k_,L_=function(t){this.otherDims={},null!=t&&A(this,t)},P_=Math.floor,O_=U,R_=O,ua="undefined",E_={float:typeof Float64Array==ua?Array:Float64Array,int:typeof Int32Array==ua?Array:Int32Array,ordinal:Array,number:Array,time:Array},N_=typeof Uint32Array==ua?Array:Uint32Array,z_=typeof Int32Array==ua?Array:Int32Array,B_=typeof Uint16Array==ua?Array:Uint16Array,V_=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx","_nameRepeatCount"],F_=["_extent","_approximateExtent","_rawExtent"],H_=(G_.prototype.getDimension=function(t){return"number"!=typeof t&&(isNaN(t)||this._dimensionInfos.hasOwnProperty(t))||(t=this.dimensions[t]),t},G_.prototype.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},G_.prototype.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},G_.prototype.mapDimension=function(t,e){var n=this._dimensionsSummary;if(null==e)return n.encodeFirstDimNotExtra[t];t=n.encode[t];return t?t[e]:null},G_.prototype.mapDimensionsAll=function(t){return(this._dimensionsSummary.encode[t]||[]).slice()},G_.prototype.initData=function(t,e,n){var i=hf(t)||P(t),i=i?new yf(t,this.dimensions.length):t;t=(this._rawData=i).getSource().sourceFormat;this._storage={},this._indices=null,this._dontMakeIdFromName=null!=this._idDimIdx||t===rd||!!i.fillStorage,this._nameList=(e||[]).slice(),this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=m_[t],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._dimValueGetterArrayRows=m_.arrayRows,this._rawExtent={},this._initDataFromProvider(0,i.count()),i.pure&&(this.hasItemOption=!1)},G_.prototype.getProvider=function(){return this._rawData},G_.prototype.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);t=e.count();e.persistent||(t+=n),this._initDataFromProvider(n,t,!0)},G_.prototype.appendValues=function(t,e){for(var n=this._storage,i=this.dimensions,r=i.length,o=this._rawExtent,a=this.count(),s=a+Math.max(t.length,e?e.length:0),l=0;l<r;l++){var u=i[l];o[u]||(o[u]=A_()),x_(n,this._dimensionInfos[u],s,!0)}for(var h=R_(i,function(t){return o[t]}),c=this._storageArr=R_(i,function(t){return n[t]}),p=[],d=a;d<s;d++){for(var f=d-a,g=0;g<r;g++){var u=i[g],y=this._dimValueGetterArrayRows(t[f]||p,u,f,g);c[g][d]=y;var m=h[g];y<m[0]&&(m[0]=y),y>m[1]&&(m[1]=y)}e&&(this._nameList[d]=e[f],this._dontMakeIdFromName||T_(this,d))}this._rawCount=this._count=s,this._extent={},v_(this)},G_.prototype._initDataFromProvider=function(t,e,n){if(!(e<=t)){for(var i=this._rawData,r=this._storage,o=this.dimensions,a=o.length,s=this._dimensionInfos,l=this._nameList,u=this._idList,h=this._rawExtent,c=i.getSource().sourceFormat===td,p=0;p<a;p++){var d=o[p];h[d]||(h[d]=A_()),x_(r,s[d],e,n)}var f=this._storageArr=R_(o,function(t){return r[t]}),g=R_(o,function(t){return h[t]});if(i.fillStorage)i.fillStorage(t,e,f,g);else for(var y=[],m=t;m<e;m++){y=i.getItem(m,y);for(var v,_=0;_<a;_++){var d=o[_],x=f[_],b=this._dimValueGetter(y,d,m,_);x[m]=b;x=g[_];b<x[0]&&(x[0]=b),b>x[1]&&(x[1]=b)}c&&!i.pure&&y&&(v=y.name,null==l[m]&&null!=v&&(l[m]=yu(v,null)),v=y.id,null==u[m]&&null!=v&&(u[m]=yu(v,null))),this._dontMakeIdFromName||T_(this,m)}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent={},v_(this)}},G_.prototype.count=function(){return this._count},G_.prototype.getIndices=function(){var t=this._indices;if(t){var e=t.constructor,n=this._count;if(e===Array){r=new e(n);for(var i=0;i<n;i++)r[i]=t[i]}else r=new e(t.buffer,0,n)}else for(var r=new(e=__(this))(this.count()),i=0;i<r.length;i++)r[i]=i;return r},G_.prototype.getByDimIdx=function(t,e){if(!(0<=e&&e<this._count))return NaN;t=this._storageArr[t];return t?t[this.getRawIndex(e)]:NaN},G_.prototype.get=function(t,e){if(!(0<=e&&e<this._count))return NaN;t=this._storage[t];return t?t[this.getRawIndex(e)]:NaN},G_.prototype.getByRawIndex=function(t,e){if(!(0<=e&&e<this._rawCount))return NaN;t=this._storage[t];return t?t[e]:NaN},G_.prototype.getValues=function(t,e){var n=[];V(t)||(e=t,t=this.dimensions);for(var i=0,r=t.length;i<r;i++)n.push(this.get(t[i],e));return n},G_.prototype.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this.get(e[n],t)))return!1;return!0},G_.prototype.getDataExtent=function(t){t=this.getDimension(t);var e=this._storage[t],n=A_();if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var o=(i=n)[0],a=i[1],s=0;s<r;s++){var l=e[this.getRawIndex(s)];l<o&&(o=l),a<l&&(a=l)}return i=[o,a],this._extent[t]=i},G_.prototype.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},G_.prototype.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},G_.prototype.getCalculationInfo=function(t){return this._calculationInfo[t]},G_.prototype.setCalculationInfo=function(t,e){O_(t)?A(this._calculationInfo,t):this._calculationInfo[t]=e},G_.prototype.getSum=function(t){var e=0;if(this._storage[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},G_.prototype.getMedian=function(t){var e=[];this.each(t,function(t){isNaN(t)||e.push(t)});var n=e.sort(function(t,e){return t-e}),t=this.count();return 0===t?0:t%2==1?n[(t-1)/2]:(n[t/2]+n[t/2-1])/2},G_.prototype.rawIndexOf=function(t,e){t=t&&this._invertedIndicesMap[t];e=t[e];return null==e||isNaN(e)?-1:e},G_.prototype.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},G_.prototype.indexOfRawIndex=function(t){if(t>=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=1+o;else{if(!(e[o]>t))return o;r=o-1}}return-1},G_.prototype.indicesOfNearest=function(t,e,n){var i=this._storage[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l<u;l++){var h=e-i[this.getRawIndex(l)],c=Math.abs(h);c<=n&&((c<o||c===o&&0<=h&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},G_.prototype.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},G_.prototype.getName=function(t){var e=this.getRawIndex(t),t=this._nameList[e];return null==t&&null!=this._nameDimIdx&&(t=M_(this,this._nameDimIdx,this._nameOrdinalMeta,e)),null==t&&(t=""),t},G_.prototype.getId=function(t){return S_(this,this.getRawIndex(t))},G_.prototype.each=function(t,e,n,i){var r=this;if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var o=n||i||this,t=R_(C_(t),this.getDimension,this);0;for(var a=t.length,s=R_(t,function(t){return r._dimensionInfos[t].index}),l=this._storageArr,u=0,h=this.count();u<h;u++){var c=this.getRawIndex(u);switch(a){case 0:e.call(o,u);break;case 1:e.call(o,l[s[0]][c],u);break;case 2:e.call(o,l[s[0]][c],l[s[1]][c],u);break;default:for(var p=0,d=[];p<a;p++)d[p]=l[s[p]][c];d[p]=u,e.apply(o,d)}}}},G_.prototype.filterSelf=function(t,e,n,i){var r=this;if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var o=n||i||this,t=R_(C_(t),this.getDimension,this);0;for(var a=this.count(),s=new(__(this))(a),l=[],u=t.length,h=0,c=R_(t,function(t){return r._dimensionInfos[t].index}),p=c[0],d=this._storageArr,f=0;f<a;f++){var g=void 0,y=this.getRawIndex(f);if(0===u)g=e.call(o,f);else if(1===u)var m=d[p][y],g=e.call(o,m,f);else{for(var v=0;v<u;v++)l[v]=d[c[v]][y];l[v]=f,g=e.apply(o,l)}g&&(s[h++]=y)}return h<a&&(this._indices=s),this._count=h,this._extent={},this.getRawIndex=this._indices?w_:b_,this}},G_.prototype.selectRange=function(t){var e=this,n=this._count;if(n){var i,r=[];for(i in t)t.hasOwnProperty(i)&&r.push(i);0;var o=r.length;if(o){var a=this.count(),s=new(__(this))(a),l=0,u=r[0],h=R_(r,function(t){return e._dimensionInfos[t].index}),c=t[u][0],p=t[u][1],d=this._storageArr,u=!1;if(!this._indices){var f=0;if(1===o){for(var g=d[h[0]],y=0;y<n;y++){(c<=(x=g[y])&&x<=p||isNaN(x))&&(s[l++]=f),f++}u=!0}else if(2===o){for(var g=d[h[0]],m=d[h[1]],v=t[r[1]][0],_=t[r[1]][1],y=0;y<n;y++){var x=g[y],b=m[y];(c<=x&&x<=p||isNaN(x))&&(v<=b&&b<=_||isNaN(b))&&(s[l++]=f),f++}u=!0}}if(!u)if(1===o)for(y=0;y<a;y++){var w=this.getRawIndex(y);(c<=(x=d[h[0]][w])&&x<=p||isNaN(x))&&(s[l++]=w)}else for(y=0;y<a;y++){for(var S=!0,w=this.getRawIndex(y),M=0;M<o;M++){var T=r[M];((x=d[h[M]][w])<t[T][0]||x>t[T][1])&&(S=!1)}S&&(s[l++]=this.getRawIndex(y))}return l<a&&(this._indices=s),this._count=l,this._extent={},this.getRawIndex=this._indices?w_:b_,this}}},G_.prototype.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n),r},G_.prototype.map=function(t,e,n,i){var r=n||i||this,o=R_(C_(t),this.getDimension,this);var t=I_(this,o),a=t._storage;t._indices=this._indices,t.getRawIndex=t._indices?w_:b_;for(var s=[],l=o.length,u=this.count(),h=[],c=t._rawExtent,p=0;p<u;p++){for(var d=0;d<l;d++)h[d]=this.get(o[d],p);h[l]=p;var f=e&&e.apply(r,h);if(null!=f){"object"!=typeof f&&(s[0]=f,f=s);for(var g=this.getRawIndex(p),y=0;y<f.length;y++){var m=o[y],v=f[y],_=c[m],m=a[m];m&&(m[g]=v),v<_[0]&&(_[0]=v),v>_[1]&&(_[1]=v)}}}return t},G_.prototype.downSample=function(t,e,n,i){for(var r=I_(this,[t]),o=r._storage,a=[],s=P_(1/e),l=o[t],u=this.count(),h=r._rawExtent[t],c=new(__(this))(u),p=0,d=0;d<u;d+=s){u-d<s&&(s=u-d,a.length=s);for(var f=0;f<s;f++){var g=this.getRawIndex(d+f);a[f]=l[g]}var y=n(a),m=this.getRawIndex(Math.min(d+i(a,y)||0,u-1));(l[m]=y)<h[0]&&(h[0]=y),y>h[1]&&(h[1]=y),c[p++]=m}return r._count=p,r._indices=c,r.getRawIndex=w_,r},G_.prototype.lttbDownSample=function(t,e){var n,i=I_(this,[]),r=i._storage[t],o=this.count(),a=new(__(this))(o),s=0,l=P_(1/e),u=this.getRawIndex(0);a[s++]=u;for(var h=1;h<o-1;h+=l){for(var c=Math.min(h+l,o-1),p=Math.min(h+2*l,o),d=(p+c)/2,f=0,g=c;g<p;g++){var y=r[w=this.getRawIndex(g)];isNaN(y)||(f+=y)}f/=p-c;for(var c=h,m=Math.min(h+l,o),v=h-1,_=r[u],x=-1,b=c,g=c;g<m;g++){var w,y=r[w=this.getRawIndex(g)];isNaN(y)||x<(n=Math.abs((v-d)*(y-_)-(v-g)*(f-_)))&&(x=n,b=w)}u=a[s++]=b}return a[s++]=this.getRawIndex(o-1),i._count=s,i._indices=a,i.getRawIndex=w_,i},G_.prototype.getItemModel=function(t){var e=this.hostModel,t=this.getRawDataItem(t);return new Ec(t,e,e&&e.ecModel)},G_.prototype.diff=function(e){var n=this;return new d_(e?e.getIndices():[],this.getIndices(),function(t){return S_(e,t)},function(t){return S_(n,t)})},G_.prototype.getVisual=function(t){var e=this._visual;return e&&e[t]},G_.prototype.setVisual=function(t,e){this._visual=this._visual||{},O_(t)?A(this._visual,t):this._visual[t]=e},G_.prototype.getItemVisual=function(t,e){t=this._itemVisuals[t],t=t&&t[e];return null==t?this.getVisual(e):t},G_.prototype.hasItemVisual=function(){return 0<this._itemVisuals.length},G_.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t],t=(i=i||(n[t]={}))[e];return null==t&&(V(t=this.getVisual(e))?t=t.slice():O_(t)&&(t=A({},t)),i[e]=t),t},G_.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,O_(e)?A(i,e):i[e]=n},G_.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},G_.prototype.setLayout=function(t,e){if(O_(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},G_.prototype.getLayout=function(t){return this._layout[t]},G_.prototype.getItemLayout=function(t){return this._itemLayouts[t]},G_.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},G_.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},G_.prototype.setItemGraphicEl=function(t,e){var n,i=this.hostModel;e&&((n=Gu(e)).dataIndex=t,n.dataType=this.dataType,n.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(D_,e)),this._graphicEls[t]=e},G_.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},G_.prototype.eachItemGraphicEl=function(n,i){E(this._graphicEls,function(t,e){t&&n&&n.call(i,t,e)})},G_.prototype.cloneShallow=function(t){if((t=t||new G_(R_(this.dimensions,this.getDimensionInfo,this),this.hostModel))._storage=this._storage,t._storageArr=this._storageArr,k_(t,this),this._indices){var e=this._indices.constructor;if(e===Array){var n=this._indices.length;t._indices=new e(n);for(var i=0;i<n;i++)t._indices[i]=this._indices[i]}else t._indices=new e(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?w_:b_,t},G_.prototype.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(et(arguments)))})},G_.internalField=(m_={arrayRows:W_,objectRows:function(t,e,n,i){return Hf(t[e],this._dimensionInfos[e])},keyedColumns:W_,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return this._rawData.pure||(!U(t=t)||t instanceof Array)||(this.hasItemOption=!0),Hf(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}},v_=function(r){var o=r._invertedIndicesMap;E(o,function(t,e){var n=r._dimensionInfos[e].ordinalMeta;if(n){t=o[e]=new z_(n.categories.length);for(var i=0;i<t.length;i++)t[i]=-1;for(i=0;i<r._count;i++)t[r.get(e,i)]=i}})},M_=function(t,e,n,i){var r,e=t._storageArr[e];return e&&(r=e[i],n&&n.categories.length&&(r=n.categories[r])),yu(r,null)},__=function(t){return 65535<t._rawCount?N_:B_},x_=function(t,e,n,i){var r=E_[e.type],e=e.name;if(i){var o=t[e],a=o&&o.length;if(a!==n){for(var s=new r(n),l=0;l<a;l++)s[l]=o[l];t[e]=s}}else t[e]=new r(n)},b_=function(t){return t},w_=function(t){return t<this._count&&0<=t?this._indices[t]:-1},S_=function(t,e){var n=t._idList[e];return null==n&&null!=t._idDimIdx&&(n=M_(t,t._idDimIdx,t._idOrdinalMeta,e)),null==n&&(n="e\0\0"+e),n},C_=function(t){return V(t)||(t=null!=t?[t]:[]),t},I_=function(t,e){var n=t.dimensions,i=new G_(R_(n,t.getDimensionInfo,t),t.hostModel);k_(i,t);for(var r,o,a=i._storage={},s=t._storage,l=i._storageArr=[],u=0;u<n.length;u++){var h=n[u];s[h]&&(0<=L(e,h)?(a[h]=(r=s[h],o=void 0,(o=r.constructor)===Array?r.slice():new o(r)),i._rawExtent[h]=A_(),i._extent[h]=null):a[h]=s[h],l.push(a[h]))}return i},A_=function(){return[1/0,-1/0]},D_=function(t){var e=Gu(t),t=Gu(this);e.seriesIndex=t.seriesIndex,e.dataIndex=t.dataIndex,e.dataType=t.dataType},k_=function(e,n){E(V_.concat(n.__wrappedMethods||[]),function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e.__wrappedMethods=n.__wrappedMethods,E(F_,function(t){e[t]=I(n[t])}),e._calculationInfo=A({},n._calculationInfo)},void(T_=function(t,e){var n=t._nameList,i=t._idList,r=t._nameDimIdx,o=t._idDimIdx,a=n[e],s=i[e];null==a&&null!=r&&(n[e]=a=M_(t,r,t._nameOrdinalMeta,e)),null==s&&null!=o&&(i[e]=s=M_(t,o,t._idOrdinalMeta,e)),null==s&&null!=a&&(s=a,1<(a=(t=t._nameRepeatCount)[a]=(t[a]||0)+1)&&(s+="__ec__"+a),i[e]=s)})),G_);function G_(t,e){this.type="list",this._count=0,this._rawCount=0,this._storage={},this._storageArr=[],this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawExtent={},this._extent={},this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!0,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"],this.getRawIndex=b_,t=t||["x","y"];for(var n={},i=[],r={},o=0;o<t.length;o++){var a=t[o],s=H(a)?new L_({name:a}):a instanceof L_?a:new L_(a),l=s.name;s.type=s.type||"float",s.coordDim||(s.coordDim=l,s.coordDimIndex=0);a=s.otherDims=s.otherDims||{};i.push(l),(n[l]=s).index=o,s.createInvertedIndices&&(r[l]=[]),0===a.itemName&&(this._nameDimIdx=o,this._nameOrdinalMeta=s.ordinalMeta),0===a.itemId&&(this._idDimIdx=o,this._idOrdinalMeta=s.ordinalMeta)}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this._dimensionsSummary=g_(this),this._invertedIndicesMap=r,this.userOutput=this._dimensionsSummary.userOutput}function W_(t,e,n,i){return Hf(t[i],this._dimensionInfos[e])}function U_(t,e,n){hf(e)||(e=pf(e)),n=n||{},t=(t||[]).slice();for(var i,r,o,a,s=(n.dimsDef||[]).slice(),l=ht(),u=ht(),h=[],c=(i=e,y=t,r=s,o=n.dimCount,a=Math.max(i.dimensionsDetectedCount||1,y.length,r.length,o||0),E(y,function(t){var e;U(t)&&(e=t.dimsDef)&&(a=Math.max(a,e.length))}),a),p=0;p<c;p++){var d=s[p],f=s[p]=A({},U(d)?d:{name:d}),d=f.name,g=h[p]=new L_;null!=d&&null==l.get(d)&&(g.name=g.displayName=d,l.set(d,p)),null!=f.type&&(g.type=f.type),null!=f.displayName&&(g.displayName=f.displayName)}var y=n.encodeDef;!y&&n.encodeDefaulter&&(y=n.encodeDefaulter(e,c));var m=ht(y);m.each(function(t,n){var i,t=uu(t).slice();1===t.length&&!H(t[0])&&t[0]<0?m.set(n,!1):(i=m.set(n,[]),E(t,function(t,e){t=H(t)?l.get(t):t;null!=t&&t<c&&(i[e]=t,_(h[t],n,e))}))});var v=0;function _(t,e,n){null!=Qp.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,u.set(e,!0))}E(t,function(t){var n,i,r,o;H(t)?(n=t,o={}):(n=(o=t).name,t=o.ordinalMeta,o.ordinalMeta=null,(o=I(o)).ordinalMeta=t,i=o.dimsDef,r=o.otherDims,o.name=o.coordDim=o.coordDimIndex=o.dimsDef=o.otherDims=null);var e=m.get(n);if(!1!==e){if(!(e=uu(e)).length)for(var a=0;a<(i&&i.length||1);a++){for(;v<h.length&&null!=h[v].coordDim;)v++;v<h.length&&e.push(v++)}E(e,function(t,e){t=h[t];_(D(t,o),n,e),null==t.name&&i&&(U(e=i[e])||(e={name:e}),t.name=t.displayName=e.name,t.defaultTooltip=e.defaultTooltip),r&&D(t.otherDims,r)})}});for(var x,b,w=n.generateCoord,S=null!=(M=n.generateCoordCount),M=w?M||1:0,T=w||"value",C=0;C<c;C++){null==(g=h[C]=h[C]||new L_).coordDim&&(g.coordDim=X_(T,u,S),g.coordDimIndex=0,(!w||M<=0)&&(g.isExtraCoord=!0),M--),null==g.name&&(g.name=X_(g.coordDim,l,!1)),null==g.type&&(b=C,fd((x=e).data,x.sourceFormat,x.seriesLayoutBy,x.dimensionsDefine,x.startIndex,b)===ld.Must||g.isExtraCoord&&(null!=g.otherDims.itemName||null!=g.otherDims.seriesName))&&(g.type="ordinal")}return h}function X_(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}function Y_(t,e){return U_((e=e||{}).coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,encodeDefaulter:e.encodeDefaulter,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})}var Z_=function(t){this.coordSysDims=[],this.axisMap=ht(),this.categoryAxisMap=ht(),this.coordSysName=t};var j_={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Mu).models[0],t=t.getReferringComponents("yAxis",Mu).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",t),q_(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),q_(t)&&(i.set("y",t),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){t=t.getReferringComponents("singleAxis",Mu).models[0];e.coordSysDims=["single"],n.set("single",t),q_(t)&&(i.set("single",t),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Mu).models[0],t=r.findAxisModel("radiusAxis"),r=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",t),n.set("angle",r),q_(t)&&(i.set("radius",t),e.firstCategoryDimIndex=0),q_(r)&&(i.set("angle",r),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,i,r,o){var a=t.ecModel,t=a.getComponent("parallel",t.get("parallelIndex")),s=i.coordSysDims=t.dimensions.slice();E(t.parallelAxisIndex,function(t,e){var n=a.getComponent("parallelAxis",t),t=s[e];r.set(t,n),q_(n)&&(o.set(t,n),null==i.firstCategoryDimIndex&&(i.firstCategoryDimIndex=e))})}};function q_(t){return"category"===t.get("type")}function K_(t,n,e){var i,r,o,a,s,l,u=(e=e||{}).byIndex,h=e.stackedCoordDimension,c=!(!t||!t.get("stack"));return E(n,function(t,e){H(t)&&(n[e]=t={name:t}),c&&!t.isExtraCoord&&(u||i||!t.ordinalMeta||(i=t),r||"ordinal"===t.type||"time"===t.type||h&&h!==t.coordDim||(r=t))}),!r||u||i||(u=!0),r&&(o="__\0ecstackresult",a="__\0ecstackedover",i&&(i.createInvertedIndices=!0),s=r.coordDim,t=r.type,l=0,E(n,function(t){t.coordDim===s&&l++}),n.push({name:o,coordDim:s,coordDimIndex:l,type:t,isExtraCoord:!0,isCalculationCoord:!0}),l++,n.push({name:a,coordDim:a,coordDimIndex:l,type:t,isExtraCoord:!0,isCalculationCoord:!0})),{stackedDimension:r&&r.name,stackedByDimension:i&&i.name,isStackedByIndex:u,stackedOverDimension:a,stackResultDimension:o}}function $_(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function J_(t,e){return $_(t,e)?t.getCalculationInfo("stackResultDimension"):e}function Q_(t,e,n){n=n||{},hf(t)||(t=pf(t));var i=e.get("coordinateSystem"),i=Ed.get(i),r=function(t){var e=t.get("coordinateSystem"),n=new Z_(e);if(e=j_[e])return e(t,n,n.axisMap,n.categoryAxisMap),n}(e);r&&r.coordSysDims&&(s=O(r.coordSysDims,function(t){var e={name:t},t=r.axisMap.get(t);return t&&(t=t.get("type"),e.type="category"===(t=t)?"ordinal":"time"===t?"time":"float"),e})),s=s||(i&&(i.getDimensionsInfo?i.getDimensionsInfo():i.dimensions.slice())||["x","y"]);var o,a,i=n.useEncodeDefaulter,i=Y_(t,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefaulter:F(i)?i:i?B(cd,s,e):null});r&&E(i,function(t,e){var n=t.coordDim,n=r.categoryAxisMap.get(n);n&&(null==o&&(o=e),t.ordinalMeta=n.getOrdinalMeta()),null!=t.otherDims.itemName&&(a=!0)}),a||null==o||(i[o].otherDims.itemName=0);var s=K_(e,i),e=new H_(i,e);e.setCalculationInfo(s);s=null!=o&&function(t){if(t.sourceFormat===td){t=function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[]);return null!=t&&!V(pu(t))}}(t)?function(t,e,n,i){return i===o?n:this.defaultDimValueGetter(t,e,n,i)}:null;return e.hasItemOption=!1,e.initData(t,null,s),e}var tx=(ex.prototype.getSetting=function(t){return this._setting[t]},ex.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},ex.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},ex.prototype.getExtent=function(){return this._extent.slice()},ex.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},ex.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},ex.prototype.isBlank=function(){return this._isBlank},ex.prototype.setBlank=function(t){this._isBlank=t},ex);function ex(t){this._setting=t||{},this._extent=[1/0,-1/0]}Bu(tx,{registerWhenExtend:!0});var nx=(ix.createByAxisModel=function(t){var e=t.option,t=e.data,t=t&&O(t,rx);return new ix({categories:t,needCollect:!t,deduplication:!1!==e.dedplication})},ix.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},ix.prototype.parseAndCollect=function(t){var e=this._needCollect;if("string"!=typeof t&&!e)return t;if(e&&!this._deduplication)return n=this.categories.length,this.categories[n]=t,n;var n,i=this._getOrCreateMap();return null==(n=i.get(t))&&(e?(n=this.categories.length,this.categories[n]=t,i.set(t,n)):n=NaN),n},ix.prototype._getOrCreateMap=function(){return this._map||(this._map=ht(this.categories))},ix);function ix(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication}function rx(t){return U(t)&&null!=t.value?t.value:t+""}var ox=Fl;function ax(t,e,n,i){var r={},o=t[1]-t[0],e=r.interval=Jl(o/e,!0);null!=n&&e<n&&(e=r.interval=n),null!=i&&i<e&&(e=r.interval=i);i=r.intervalPrecision=sx(e),i=r.niceTickExtent=[ox(Math.ceil(t[0]/e)*e,i),ox(Math.floor(t[1]/e)*e,i)];return i=i,t=t,isFinite(i[0])||(i[0]=t[0]),isFinite(i[1])||(i[1]=t[1]),lx(i,0,t),lx(i,1,t),i[0]>i[1]&&(i[0]=i[1]),r}function sx(t){return Wl(t)+2}function lx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function ux(t,e){return t>=e[0]&&t<=e[1]}function hx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function cx(t,e){return t*(e[1]-e[0])+e[0]}var px,dx=(l(fx,px=tx),fx.prototype.parse=function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},fx.prototype.contain=function(t){return ux(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},fx.prototype.normalize=function(t){return hx(t=this.getCategoryIndex(this.parse(t)),this._extent)},fx.prototype.scale=function(t){return t=this.getCategoryIndex(t),Math.round(cx(t,this._extent))},fx.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:this.getCategoryIndex(n)}),n++;return t},fx.prototype.getMinorTicks=function(t){},fx.prototype.setCategorySortInfo=function(t){this._categorySortInfo=t},fx.prototype.getCategorySortInfo=function(){return this._categorySortInfo},fx.prototype.getCategoryIndex=function(t){return this._categorySortInfo.length?this._categorySortInfo[t].beforeSortIndex:t},fx.prototype.getRawIndex=function(t){return this._categorySortInfo.length?this._categorySortInfo[t].ordinalNumber:t},fx.prototype.getLabel=function(t){if(!this.isBlank()){t=this.getRawIndex(t.value),t=this._ordinalMeta.categories[t];return null==t?"":t+""}},fx.prototype.count=function(){return this._extent[1]-this._extent[0]+1},fx.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},fx.prototype.isInExtentRange=function(t){return t=this.getCategoryIndex(t),this._extent[0]<=t&&this._extent[1]>=t},fx.prototype.getOrdinalMeta=function(){return this._ordinalMeta},fx.prototype.niceTicks=function(){},fx.prototype.niceExtent=function(){},fx.type="ordinal",fx);function fx(t){var e=px.call(this,t)||this;e.type="ordinal";t=e.getSetting("ordinalMeta");return V(t=t||new nx({}))&&(t=new nx({categories:O(t,function(t){return U(t)?t.value:t})})),e._ordinalMeta=t,e._categorySortInfo=[],e._extent=e.getSetting("extent")||[0,t.categories.length-1],e}tx.registerClass(dx);var gx,yx=Fl,mx=(l(vx,gx=tx),vx.prototype.parse=function(t){return t},vx.prototype.contain=function(t){return ux(t,this._extent)},vx.prototype.normalize=function(t){return hx(t,this._extent)},vx.prototype.scale=function(t){return cx(t,this._extent)},vx.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},vx.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},vx.prototype.getInterval=function(){return this._interval},vx.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=sx(t)},vx.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]<i[0]&&(t?o.push({value:yx(i[0]-e,r)}):o.push({value:n[0]}));for(var a=i[0];a<=i[1]&&(o.push({value:a}),(a=yx(a+e,r))!==o[o.length-1].value);)if(1e4<o.length)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:yx(s+e,r)}):o.push({value:n[1]})),o},vx.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;r<e.length;r++){for(var o=e[r],a=e[r-1],s=0,l=[],u=(o.value-a.value)/t;s<t-1;){var h=yx(a.value+(s+1)*u);h>i[0]&&h<i[1]&&l.push(h),s++}n.push(l)}return n},vx.prototype.getLabel=function(t,e){if(null==t)return"";e=e&&e.precision;return null==e?e=Wl(t.value)||0:"auto"===e&&(e=this._intervalPrecision),_p(yx(t.value,e,!0))},vx.prototype.niceTicks=function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];isFinite(r)&&(r<0&&i.reverse(),n=ax(i,t,e,n),this._intervalPrecision=n.intervalPrecision,this._interval=n.interval,this._niceExtent=n.niceTickExtent)},vx.prototype.niceExtent=function(t){var e=this._extent;e[0]===e[1]&&(0!==e[0]?(n=e[0],t.fixMax||(e[1]+=n/2),e[0]-=n/2):e[1]=1);var n=e[1]-e[0];isFinite(n)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);n=this._interval;t.fixMin||(e[0]=yx(Math.floor(e[0]/n)*n)),t.fixMax||(e[1]=yx(Math.ceil(e[1]/n)*n))},vx.type="interval",vx);function vx(){var t=null!==gx&&gx.apply(this,arguments)||this;return t.type="interval",t._interval=0,t._intervalPrecision=2,t}tx.registerClass(mx);var _x="__ec_stack_",xx="undefined"!=typeof Float32Array?Float32Array:Array;function bx(t){return t.get("stack")||_x+t.seriesIndex}function Sx(t){return t.dim+t.index}function Mx(t,e){var n=[];return e.eachSeriesByType(t,function(t){Ix(t)&&!Ax(t)&&n.push(t)}),n}function Tx(t){var l=function(t){var l={};E(t,function(t){var e=t.coordinateSystem.getBaseAxis();if("time"===e.type||"value"===e.type)for(var n=t.getData(),i=e.dim+"_"+e.index,r=n.mapDimension(e.dim),o=0,a=n.count();o<a;++o){var s=n.get(r,o);l[i]?l[i].push(s):l[i]=[s]}});var e,n={};for(e in l)if(l.hasOwnProperty(e)){var i=l[e];if(i){i.sort(function(t,e){return t-e});for(var r=null,o=1;o<i.length;++o){var a=i[o]-i[o-1];0<a&&(r=null===r?a:Math.min(r,a))}n[e]=r}}return n}(t),u=[];return E(t,function(t){var e,n=t.coordinateSystem.getBaseAxis(),i=n.getExtent();e="category"===n.type?n.getBandWidth():"value"===n.type||"time"===n.type?(r=n.dim+"_"+n.index,o=l[r],a=Math.abs(i[1]-i[0]),e=n.scale.getExtent(),r=Math.abs(e[1]-e[0]),o?a/r*o:a):(s=t.getData(),Math.abs(i[1]-i[0])/s.count());var r=Vl(t.get("barWidth"),e),o=Vl(t.get("barMaxWidth"),e),a=Vl(t.get("barMinWidth")||1,e),i=t.get("barGap"),s=t.get("barCategoryGap");u.push({bandWidth:e,barWidth:r,barMaxWidth:o,barMinWidth:a,barGap:i,barCategoryGap:s,axisKey:Sx(n),stackId:bx(t)})}),function(t){var a={};E(t,function(t,e){var n=t.axisKey,i=t.bandWidth,r=a[n]||{bandWidth:i,remainedWidth:i,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},o=r.stacks;a[n]=r;i=t.stackId;o[i]||r.autoWidthCount++,o[i]=o[i]||{width:0,maxWidth:0};n=t.barWidth;n&&!o[i].width&&(o[i].width=n,n=Math.min(r.remainedWidth,n),r.remainedWidth-=n);n=t.barMaxWidth;n&&(o[i].maxWidth=n);n=t.barMinWidth;n&&(o[i].minWidth=n);n=t.barGap;null!=n&&(r.gap=n);t=t.barCategoryGap;null!=t&&(r.categoryGap=t)});var d={};return E(a,function(t,n){d[n]={};var e,i=t.stacks,r=t.bandWidth,o=t.categoryGap;null==o&&(e=N(i).length,o=Math.max(35-4*e,15)+"%");var o=Vl(o,r),a=Vl(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,u=(s-o)/(l+(l-1)*a),u=Math.max(u,0);E(i,function(t){var e,n=t.maxWidth,i=t.minWidth;t.width?(e=t.width,n&&(e=Math.min(e,n)),i&&(e=Math.max(e,i)),t.width=e,s-=e+a*e,l--):(e=u,n&&n<e&&(e=Math.min(n,s)),i&&e<i&&(e=i),e!==u&&(t.width=e,s-=e+a*e,l--))}),u=(s-o)/(l+(l-1)*a),u=Math.max(u,0);var h,c=0;E(i,function(t,e){t.width||(t.width=u),c+=(h=t).width*(1+a)}),h&&(c-=h.width*a);var p=-c/2;E(i,function(t,e){d[n][e]=d[n][e]||{bandWidth:r,offset:p,width:t.width},p+=t.width*(1+a)})}),d}(u)}function Cx(t,e,n){if(t&&e){e=t[Sx(e)];return null!=e&&null!=n?e[bx(n)]:e}}Yh={seriesType:"bar",plan:Rg(),reset:function(t){if(Ix(t)&&Ax(t)){var e=t.getData(),c=t.coordinateSystem,p=c.master.getRect(),n=c.getBaseAxis(),d=c.getOtherAxis(n),f=e.mapDimension(d.dim),g=e.mapDimension(n.dim),y=d.isHorizontal(),m=y?0:1,v=Cx(Tx([t]),n,t).width;return.5<v||(v=.5),{progress:function(t,e){for(var n,i=t.count,r=new xx(2*i),o=new xx(2*i),a=new xx(i),s=[],l=[],u=0,h=0;null!=(n=t.next());)l[m]=e.get(f,n),l[1-m]=e.get(g,n),s=c.dataToPoint(l,null,s),o[u]=y?p.x+p.width:s[0],r[u++]=s[0],o[u]=y?s[1]:p.y+p.height,r[u++]=s[1],a[h++]=n;e.setLayout({largePoints:r,largeDataIndices:a,largeBackgroundPoints:o,barWidth:v,valueAxisStart:Dx(0,d),backgroundStart:y?p.x:p.y,valueAxisHorizontal:y})}}}}};function Ix(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function Ax(t){return t.pipelineContext&&t.pipelineContext.large}function Dx(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}var kx,Lx=(l(Px,kx=mx),Px.prototype.getLabel=function(t){var e=this.getSetting("useUTC");return ip(t.value,Jc[function(t){switch(t){case"year":case"month":return"day";case"millisecond":return"millisecond";default:return"second"}}(np(this._minLevelUnit))]||Jc.second,e,this.getSetting("locale"))},Px.prototype.getFormattedLabel=function(t,e,n){var i=this.getSetting("useUTC");return function(t,e,n,i,r){var o=null;if("string"==typeof n)o=n;else if("function"==typeof n)o=n(t.value,e,{level:t.level});else{var a=A({},$c);if(0<t.level)for(var s=0;s<Qc.length;++s)a[Qc[s]]="{primary|"+a[Qc[s]]+"}";var l=n?!1===n.inherit?n:D(n,a):a,u=rp(t.value,r);if(l[u])o=l[u];else if(l.inherit){for(s=tp.indexOf(u)-1;0<=s;--s)if(l[u]){o=l[u];break}o=o||a.none}V(o)&&(n=null==t.level?0:0<=t.level?t.level:o.length+t.level,o=o[n=Math.min(n,o.length-1)])}return ip(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},Px.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=[];if(!e)return i;i.push({value:n[0],level:0});e=this.getSetting("useUTC"),e=function(t,d,f,g){var e=tp,n=0;function i(t,e,n){var i=[],r=!e.length;if(!function(t,e,n,i){function r(t){return op(c,t,i)===op(p,t,i)}function o(){return r("year")}function a(){return o()&&r("month")}function s(){return a()&&r("day")}function l(){return s()&&r("hour")}function u(){return l()&&r("minute")}function h(){return u()&&r("second")}var c=ql(e),p=ql(n);switch(t){case"year":return o();case"month":return a();case"day":return s();case"hour":return l();case"minute":return u();case"second":return h();case"millisecond":return h()&&r("millisecond")}}(np(t),g[0],g[1],f)){r&&(e=[{value:function(t,e,n){t=new Date(t);switch(np(e)){case"year":case"month":t[dp(n)](0);case"day":t[fp(n)](1);case"hour":t[gp(n)](0);case"minute":t[yp(n)](0);case"second":t[mp(n)](0),t[vp(n)](0)}return t.getTime()}(new Date(g[0]),t,f)},{value:g[1]}]);for(var o,a,s=0;s<e.length-1;s++){var l=e[s].value,u=e[s+1].value;if(l!==u){var h=void 0,c=void 0,p=void 0;switch(t){case"year":h=Math.max(1,Math.round(d/Kc/365)),c=ap(f),p=f?"setUTCFullYear":"setFullYear";break;case"half-year":case"quarter":case"month":a=d,h=6<(a/=30*Kc)?6:3<a?3:2<a?2:1,c=sp(f),p=dp(f);break;case"week":case"half-week":case"day":o=d,h=16<(o/=Kc)?16:7.5<o?7:3.5<o?4:1.5<o?2:1,c=lp(f),p=fp(f),0;break;case"half-day":case"quarter-day":case"hour":o=d,h=12<(o/=qc)?12:6<o?6:3.5<o?4:2<o?2:1,c=up(f),p=gp(f);break;case"minute":h=Rx(d,!0),c=hp(f),p=yp(f);break;case"second":h=Rx(d,!1),c=cp(f),p=mp(f);break;case"millisecond":h=Jl(d,!0),c=pp(f),p=vp(f)}!function(t,e,n,i,r,o){for(var a=new Date(e),s=e,l=a[i]();s<n&&s<=g[1];)o.push({value:s}),l+=t,a[r](l),s=a.getTime();o.push({value:s,notAdd:!0})}(h,l,u,c,p,i),"year"===t&&1<n.length&&0===s&&n.unshift({value:n[0].value-h})}}for(s=0;s<i.length;s++)n.push(i[s]);return 1}}for(var r=[],o=[],a=0,s=0,l=0;l<e.length&&n++<1e4;++l){var u=np(e[l]);if(function(t){return t===np(t)}(e[l])){i(e[l],r[r.length-1]||[],o);var h=e[l+1]?np(e[l+1]):null;if(u!==h){if(o.length){s=a,o.sort(function(t,e){return t.value-e.value});for(var c=[],p=0;p<o.length;++p){var y=o[p].value;0!==p&&o[p-1].value===y||(c.push(o[p]),y>=g[0]&&y<=g[1]&&a++)}h=(g[1]-g[0])/d;if(1.5*h<a&&h/1.5<s)break;if(r.push(c),h<a||t===e[l])break}o=[]}}}0;for(var m=R(O(r,function(t){return R(t,function(t){return t.value>=g[0]&&t.value<=g[1]&&!t.notAdd})}),function(t){return 0<t.length}),v=[],_=m.length-1,l=0;l<m.length;++l)for(var x=m[l],b=0;b<x.length;++b)v.push({value:x[b].value,level:_-l});v.sort(function(t,e){return t.value-e.value});for(var w=[],l=0;l<v.length;++l)0!==l&&v[l].value===v[l-1].value||w.push(v[l]);return w}(this._minLevelUnit,this._approxInterval,e,n);return(i=i.concat(e)).push({value:n[1],level:0}),i},Px.prototype.niceExtent=function(t){var e,n=this._extent;n[0]===n[1]&&(n[0]-=Kc,n[1]+=Kc),n[1]===-1/0&&n[0]===1/0&&(e=new Date,n[1]=+new Date(e.getFullYear(),e.getMonth(),e.getDate()),n[0]=n[1]-Kc),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval)},Px.prototype.niceTicks=function(t,e,n){t=t||10;var i=this._extent,i=i[1]-i[0];this._approxInterval=i/t,null!=e&&this._approxInterval<e&&(this._approxInterval=e),null!=n&&this._approxInterval>n&&(this._approxInterval=n);n=Ox.length,n=Math.min(function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=1+r:i=r}return n}(Ox,this._approxInterval,0,n),n-1);this._interval=Ox[n][1],this._minLevelUnit=Ox[Math.max(n-1,0)][0]},Px.prototype.parse=function(t){return"number"==typeof t?t:+ql(t)},Px.prototype.contain=function(t){return ux(this.parse(t),this._extent)},Px.prototype.normalize=function(t){return hx(this.parse(t),this._extent)},Px.prototype.scale=function(t){return cx(t,this._extent)},Px.type="time",Px);function Px(t){t=kx.call(this,t)||this;return t.type="time",t}var Ox=[["second",Zc],["minute",jc],["hour",qc],["quarter-day",6*qc],["half-day",12*qc],["day",1.2*Kc],["half-week",3.5*Kc],["week",7*Kc],["month",31*Kc],["quarter",95*Kc],["half-year",$i/2],["year",$i]];function Rx(t,e){return 30<(t/=e?jc:Zc)?30:20<t?20:15<t?15:10<t?10:5<t?5:2<t?2:1}tx.registerClass(Lx);var Ex,Nx=tx.prototype,zx=mx.prototype,Bx=Wl,Vx=Fl,Fx=Math.floor,Hx=Math.ceil,Gx=Math.pow,Wx=Math.log,Ux=(l(Xx,Ex=tx),Xx.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return O(zx.getTicks.call(this,t),function(t){var e=t.value,t=Fl(Gx(this.base,e)),t=e===n[0]&&this._fixMin?Yx(t,i[0]):t;return{value:t=e===n[1]&&this._fixMax?Yx(t,i[1]):t}},this)},Xx.prototype.setExtent=function(t,e){var n=this.base;t=Wx(t)/Wx(n),e=Wx(e)/Wx(n),zx.setExtent.call(this,t,e)},Xx.prototype.getExtent=function(){var t=this.base,e=Nx.getExtent.call(this);e[0]=Gx(t,e[0]),e[1]=Gx(t,e[1]);t=this._originalScale.getExtent();return this._fixMin&&(e[0]=Yx(e[0],t[0])),this._fixMax&&(e[1]=Yx(e[1],t[1])),e},Xx.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Wx(t[0])/Wx(e),t[1]=Wx(t[1])/Wx(e),Nx.unionExtent.call(this,t)},Xx.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},Xx.prototype.niceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n==1/0||n<=0)){var i=Kl(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&0<Math.abs(i);)i*=10;e=[Fl(Hx(e[0]/i)*i),Fl(Fx(e[1]/i)*i)];this._interval=i,this._niceExtent=e}},Xx.prototype.niceExtent=function(t){zx.niceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},Xx.prototype.parse=function(t){return t},Xx.prototype.contain=function(t){return ux(t=Wx(t)/Wx(this.base),this._extent)},Xx.prototype.normalize=function(t){return hx(t=Wx(t)/Wx(this.base),this._extent)},Xx.prototype.scale=function(t){return t=cx(t,this._extent),Gx(this.base,t)},Xx.type="log",Xx);function Xx(){var t=null!==Ex&&Ex.apply(this,arguments)||this;return t.type="log",t.base=10,t._originalScale=new mx,t._interval=0,t}nl=Ux.prototype;function Yx(t,e){return Vx(t,Bx(e))}nl.getMinorTicks=zx.getMinorTicks,nl.getLabel=zx.getLabel,tx.registerClass(Ux);var Zx=(jx.prototype._prepareParams=function(t,e,n){n[1]<n[0]&&(n=[NaN,NaN]),this._dataMin=n[0],this._dataMax=n[1];var i=this._isOrdinal="ordinal"===t.type;this._needCrossZero=e.getNeedCrossZero&&e.getNeedCrossZero();var r=this._modelMinRaw=e.get("min",!0);F(r)?this._modelMinNum=Jx(t,r({min:n[0],max:n[1]})):"dataMin"!==r&&(this._modelMinNum=Jx(t,r));r=this._modelMaxRaw=e.get("max",!0);F(r)?this._modelMaxNum=Jx(t,r({min:n[0],max:n[1]})):"dataMax"!==r&&(this._modelMaxNum=Jx(t,r)),i?this._axisDataLen=e.getCategories().length:"boolean"==typeof(e=V(e=e.get("boundaryGap"))?e:[e||0,e||0])[0]||"boolean"==typeof e[1]?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[Zn(e[0],1),Zn(e[1],1)]},jx.prototype.calculate=function(){var t=this._isOrdinal,e=this._dataMin,n=this._dataMax,i=this._axisDataLen,r=this._boundaryGapInner,o=t?null:n-e||Math.abs(e),a="dataMin"===this._modelMinRaw?e:this._modelMinNum,s="dataMax"===this._modelMaxRaw?n:this._modelMaxNum,l=null!=a,u=null!=s;null==a&&(a=t?i?0:NaN:e-r[0]*o),null==s&&(s=t?i?i-1:NaN:n+r[1]*o),null!=a&&isFinite(a)||(a=NaN),null!=s&&isFinite(s)||(s=NaN),s<a&&(s=a=NaN);o=$(a)||$(s)||t&&!i;this._needCrossZero&&(0<a&&0<s&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));t=this._determinedMin,i=this._determinedMax;return null!=t&&(a=t,l=!0),null!=i&&(s=i,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:o}},jx.prototype.modifyDataMinMax=function(t,e){this[Kx[t]]=e},jx.prototype.setDeterminedMinMax=function(t,e){t=qx[t];this[t]=e},jx.prototype.freeze=function(){this.frozen=!0},jx);function jx(t,e,n){this._prepareParams(t,e,n)}var qx={min:"_determinedMin",max:"_determinedMax"},Kx={min:"_dataMin",max:"_dataMax"};function $x(t,e,n){var i=t.rawExtentInfo;return i||(i=new Zx(t,e,n),t.rawExtentInfo=i)}function Jx(t,e){return null==e?null:$(e)?NaN:t.parse(e)}function Qx(t,e){var n=t.type,i=$x(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r,o=i.min,a=i.max,t=e.ecModel;return t&&"time"===n&&(t=Mx("bar",t),r=!1,E(t,function(t){r=r||t.getBaseAxis()===e.axis}),r&&(t=Tx(t),o=(t=function(t,e,n,i){var r=n.axis.getExtent(),r=r[1]-r[0],i=Cx(i,n.axis);if(void 0===i)return{min:t,max:e};var o=1/0;E(i,function(t){o=Math.min(t.offset,o)});var a=-1/0;E(i,function(t){a=Math.max(t.offset+t.width,a)}),o=Math.abs(o),a=Math.abs(a);n=o+a,i=e-t,i=i/(1-(o+a)/r)-i;return{min:t-=o/n*i,max:e+=a/n*i}}(o,a,e,t)).min,a=t.max)),{extent:[o,a],fixMin:i.minFixed,fixMax:i.maxFixed}}function tb(t,e){var n=Qx(t,e),i=n.extent,r=e.get("splitNumber");t instanceof Ux&&(t.base=e.get("logBase"));var o=t.type;t.setExtent(i[0],i[1]),t.niceExtent({splitNumber:r,fixMin:n.fixMin,fixMax:n.fixMax,minInterval:"interval"===o||"time"===o?e.get("minInterval"):null,maxInterval:"interval"===o||"time"===o?e.get("maxInterval"):null});e=e.get("interval");null!=e&&t.setInterval&&t.setInterval(e)}function eb(t,e){if(e=e||t.get("type"))switch(e){case"category":return new dx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Lx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(tx.getClass(e)||mx)}}function nb(n){var i,e,r,t=n.getLabelModel().get("formatter"),o="category"===n.type?n.scale.getExtent()[0]:null;return"time"===n.scale.type?(r=t,function(t,e){return n.scale.getFormattedLabel(t,e,r)}):"string"==typeof t?(e=t,function(t){t=n.scale.getLabel(t);return e.replace("{value}",null!=t?t:"")}):"function"==typeof t?(i=t,function(t,e){return null!=o&&(e=t.value-o),i(ib(n,t),e,null!=t.level?{level:t.level}:null)}):function(t){return n.scale.getLabel(t)}}function ib(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function rb(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent(),a=n instanceof dx?n.count():(i=n.getTicks()).length,s=t.getLabelModel(),l=nb(t),u=1;40<a&&(u=Math.ceil(a/40));for(var h,c,p=0;p<a;p+=u){var d=l(i?i[p]:{value:o[0]+p},p),f=s.getTextRect(d),g=(h=f,c=s.get("rotate")||0,g=f=d=g=void 0,g=c*Math.PI/180,d=h.width,f=h.height,c=d*Math.abs(Math.cos(g))+Math.abs(f*Math.sin(g)),g=d*Math.abs(Math.sin(g))+Math.abs(f*Math.cos(g)),new Rn(h.x,h.y,c,g));r?r.union(g):r=g}return r}}function ob(t){t=t.get("interval");return null==t?"auto":t}function ab(t){return"category"===t.type&&0===ob(t.getLabelModel())}function sb(e,t){var n={};return E(e.mapDimensionsAll(t),function(t){n[J_(e,t)]=!0}),N(n)}function lb(e,n,t){n&&E(sb(n,t),function(t){t=n.getApproximateExtent(t);t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])})}var ub=(hb.prototype.getNeedCrossZero=function(){return!this.option.scale},hb.prototype.getCoordSysModel=function(){},hb);function hb(){}Tc={isDimensionStacked:$_,enableDataStack:K_,getStackedDimension:J_};var Qa=Object.freeze({__proto__:null,createList:function(t){return Q_(t.getSource(),t)},getLayoutRect:Bp,dataStack:Tc,createScale:function(t,e){var n=e;return e instanceof Ec||(n=new Ec(e)),(e=eb(n)).setExtent(t[0],t[1]),tb(e,n),e},mixinAxisModelCommonMethods:function(t){T(t,ub)},getECData:Gu,createDimensions:Y_,createSymbol:Um}),cb=1e-8;function pb(t,e){return Math.abs(t-e)<cb}function db(t,e,n){var i=0,r=t[0];if(r){for(var o=1;o<t.length;o++){var a=t[o];i+=oo(r[0],r[1],a[0],a[1],e,n),r=a}var s=t[0];return pb(r[0],s[0])&&pb(r[1],s[1])||(i+=oo(r[0],r[1],s[0],s[1],e,n)),0!==i}}var fb=(gb.prototype.getBoundingRect=function(){var t=this._rect;if(t)return t;for(var t=Number.MAX_VALUE,e=[t,t],n=[-t,-t],i=[],r=[],o=this.geometries,a=0;a<o.length;a++){"polygon"===o[a].type&&(function(t,e,n){if(0!==t.length){for(var i=t[0],r=i[0],o=i[0],a=i[1],s=i[1],l=1;l<t.length;l++)i=t[l],r=Sr(r,i[0]),o=Mr(o,i[0]),a=Sr(a,i[1]),s=Mr(s,i[1]);e[0]=r,e[1]=a,n[0]=o,n[1]=s}}(o[a].exterior,i,r),Dt(e,e,i),kt(n,n,r))}return 0===a&&(e[0]=e[1]=n[0]=n[1]=0),this._rect=new Rn(e[0],e[1],n[0]-e[0],n[1]-e[1])},gb.prototype.contain=function(t){var e=this.getBoundingRect(),n=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var i=0,r=n.length;i<r;i++)if("polygon"===n[i].type){var o=n[i].exterior,a=n[i].interiors;if(db(o,t[0],t[1])){for(var s=0;s<(a?a.length:0);s++)if(db(a[s],t[0],t[1]))continue t;return!0}}return!1},gb.prototype.transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=r.width/r.height;n?i=i||n/o:n=o*i;for(var i=new Rn(t,e,n,i),a=r.calculateTransform(i),s=this.geometries,l=0;l<s.length;l++)if("polygon"===s[l].type){for(var u=s[l].exterior,h=s[l].interiors,c=0;c<u.length;c++)At(u[c],u[c],a);for(var p=0;p<(h?h.length:0);p++)for(c=0;c<h[p].length;c++)At(h[p][c],h[p][c],a)}(r=this._rect).copy(i),this.center=[r.x+r.width/2,r.y+r.height/2]},gb.prototype.cloneShallow=function(t){null==t&&(t=this.name);t=new gb(t,this.geometries,this.center);return t._rect=this._rect,t.transformTo=null,t},gb);function gb(t,e,n){this.name=t,this.geometries=e,n=n?[n[0],n[1]]:[(e=this.getBoundingRect()).x+e.width/2,e.y+e.height/2],this.center=n}function yb(t,e,n){for(var i=[],r=e[0],o=e[1],a=0;a<t.length;a+=2){var s=(s=t.charCodeAt(a)-64)>>1^-(1&s),l=(l=t.charCodeAt(a+1)-64)>>1^-(1&l),r=s+=r,o=l+=o;i.push([s/n,l/n])}return i}function mb(t,r){return O(R((t=function(t){if(!t.UTF8Encoding)return t;var e=(t=t).UTF8Scale;null==e&&(e=1024);for(var n=t.features,i=0;i<n.length;i++){var r=n[i].geometry;if("Polygon"===r.type)for(var o=r.coordinates,a=0;a<o.length;a++)o[a]=yb(o[a],r.encodeOffsets[a],e);else if("MultiPolygon"===r.type)for(o=r.coordinates,a=0;a<o.length;a++)for(var s=o[a],l=0;l<s.length;l++)s[l]=yb(s[l],r.encodeOffsets[a][l],e)}return t.UTF8Encoding=!1,t}(t)).features,function(t){return t.geometry&&t.properties&&0<t.geometry.coordinates.length}),function(t){var e=t.properties,t=t.geometry,n=[];"Polygon"===t.type&&(i=t.coordinates,n.push({type:"polygon",exterior:i[0],interiors:i.slice(1)})),"MultiPolygon"===t.type&&E(i=t.coordinates,function(t){t[0]&&n.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var i=new fb(e[r||"name"],n,e.cp);return i.properties=e,i})}var vb=bu();function _b(t){return"category"===t.type?(r=(e=t).getLabelModel(),o=bb(e,r),!r.get("show")||e.scale.isBlank()?{labels:[],labelCategoryInterval:o.labelCategoryInterval}:o):(t=(n=t).scale.getTicks(),i=nb(n),{labels:O(t,function(t,e){return{formattedLabel:i(t,e),rawLabel:n.scale.getLabel(t),tickValue:t.value}})});var n,i,e,r,o}function xb(t,e){return"category"===t.type?function(t,e){var n,i,r=wb(t,"ticks"),o=ob(e),a=Sb(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);{n=F(o)?Cb(t,o,!0):"auto"===o?(e=bb(t,t.getLabelModel()),i=e.labelCategoryInterval,O(e.labels,function(t){return t.tickValue})):Tb(t,i=o,!0)}return Mb(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:O(t.scale.getTicks(),function(t){return t.value})}}function bb(t,e){var n,i=wb(t,"labels"),r=ob(e),e=Sb(i,r);return e||Mb(i,r,{labels:F(r)?Cb(t,r):Tb(t,n="auto"===r?null!=(t=vb(n=t).autoInterval)?t:vb(n).autoInterval=n.calculateCategoryInterval():r),labelCategoryInterval:n})}function wb(t,e){return vb(t)[e]||(vb(t)[e]=[])}function Sb(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function Mb(t,e,n){return t.push({key:e,value:n}),n}function Tb(t,e,n){var i=nb(t),r=t.scale,o=r.getExtent(),a=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),u=o[0],e=r.count();0!==u&&1<l&&2<e/l&&(u=Math.round(Math.ceil(u/l)*l));e=ab(t),t=a.get("showMinLabel")||e,e=a.get("showMaxLabel")||e;t&&u!==o[0]&&c(o[0]);for(var h=u;h<=o[1];h+=l)c(h);function c(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return e&&h-l!==o[1]&&c(o[1]),s}function Cb(t,i,r){var o=t.scale,a=nb(t),s=[];return E(o.getTicks(),function(t){var e=o.getLabel(t),n=t.value;i(t.value,e)&&s.push(r?n:{formattedLabel:a(t),rawLabel:e,tickValue:n})}),s}var Ib=[0,1],wl=(Ab.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),e=Math.max(e[0],e[1]);return n<=t&&t<=e},Ab.prototype.containData=function(t){return this.scale.contain(t)},Ab.prototype.getExtent=function(){return this._extent.slice()},Ab.prototype.getPixelPrecision=function(t){return Ul(t||this.scale.getExtent(),this._extent)},Ab.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},Ab.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Db(n=n.slice(),i.count()),Bl(t,Ib,n,e)},Ab.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Db(n=n.slice(),i.count());e=Bl(t,n,Ib,e);return this.scale.scale(e)},Ab.prototype.pointToData=function(t,e){},Ab.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=O(xb(this,e).ticks,function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawIndex(t):t),tickValue:t}},this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a=t.getExtent();{var s;1===r?(e[0].coord=a[0],o=e[1]={coord:a[0]}):(n=e[r-1].tickValue-e[0].tickValue,s=(e[r-1].coord-e[0].coord)/n,E(e,function(t){t.coord-=s/2}),t=t.scale.getExtent(),t=1+t[1]-e[r-1].tickValue,o={coord:e[r-1].coord+s*t},e.push(o))}var l=a[0]>a[1];u(e[0].coord,a[0])&&(i?e[0].coord=a[0]:e.shift());i&&u(a[0],e[0].coord)&&e.unshift({coord:a[0]});u(a[1],o.coord)&&(i?o.coord=a[1]:e.pop());i&&u(o.coord,a[1])&&e.push({coord:a[1]});function u(t,e){return t=Fl(t),e=Fl(e),l?e<t:t<e}}(this,n,e.get("alignWithLabel"),t.clamp),n},Ab.prototype.getMinorTicksCoords=function(){if("ordinal"===this.scale.type)return[];var t=this.model.getModel("minorTick").get("splitNumber");return 0<t&&t<100||(t=5),O(this.scale.getMinorTicks(t),function(t){return O(t,function(t){return{coord:this.dataToCoord(t),tickValue:t}},this)},this)},Ab.prototype.getViewLabels=function(){return _b(this).labels},Ab.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},Ab.prototype.getTickModel=function(){return this.model.getModel("axisTick")},Ab.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),e=e[1]-e[0]+(this.onBand?1:0);0===e&&(e=1);t=Math.abs(t[1]-t[0]);return Math.abs(t)/e},Ab.prototype.calculateCategoryInterval=function(){return function(t){var e=(u=(l=t).getLabelModel(),{axisRotate:l.getRotate?l.getRotate():l.isHorizontal&&!l.isHorizontal()?90:0,labelRotate:u.get("rotate")||0,font:u.getFont()}),n=nb(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=(h=t.scale).getExtent(),o=h.count();if(r[1]-r[0]<1)return 0;var a=1;40<o&&(a=Math.max(1,Math.floor(o/40)));for(var s=r[0],l=t.dataToCoord(s+1)-t.dataToCoord(s),u=Math.abs(l*Math.cos(i)),h=Math.abs(l*Math.sin(i)),c=0,p=0;s<=r[1];s+=a)var d=Wn(n({value:s}),e.font,"center","top"),f=1.3*d.width,d=1.3*d.height,c=Math.max(c,f,7),p=Math.max(p,d,7);return l=c/u,i=p/h,isNaN(l)&&(l=1/0),isNaN(i)&&(i=1/0),u=Math.max(0,Math.floor(Math.min(l,i))),h=vb(t.model),l=t.getExtent(),i=h.lastAutoInterval,t=h.lastTickCount,null!=i&&null!=t&&Math.abs(i-u)<=1&&Math.abs(t-o)<=1&&u<i&&h.axisExtent0===l[0]&&h.axisExtent1===l[1]?u=i:(h.lastTickCount=o,h.lastAutoInterval=u,h.axisExtent0=l[0],h.axisExtent1=l[1]),u}(this)},Ab);function Ab(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}function Db(t,e){e=(t[1]-t[0])/e/2;t[0]+=e,t[1]-=e}var qn=mb,kb={};E(["linearMap","round","asc","getPrecision","getPrecisionSafe","getPixelPrecision","getPercentWithPrecision","MAX_SAFE_INTEGER","remRadian","isRadianAroundZero","parseDate","quantity","quantityExponent","nice","quantile","reformIntervals","isNumeric","numericToNumber"],function(t){kb[t]=ru[t]});var Lb={};E(["addCommas","toCamelCase","normalizeCssArray","encodeHTML","formatTpl","getTooltipMarker","formatTime","capitalFirst","truncateText","getTextRect"],function(t){Lb[t]=Pp[t]});var ua={parse:ql,format:ip},Pb={};E(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){Pb[t]=ft[t]});var Ob={};E(["extendShape","extendPath","makePath","makeImage","mergePath","resizePath","createIcon","updateProps","initProps","getTransform","clipPointsByRect","clipRectByRect","registerShape","getShapeClass","Group","Image","Text","Circle","Ellipse","Sector","Ring","Polygon","Polyline","Rect","Line","BezierCurve","Arc","IncrementalDisplayable","CompoundPath","LinearGradient","RadialGradient","BoundingRect"],function(t){Ob[t]=lc[t]});var Rb,$i=(l(Eb,Rb=Sg),Eb.prototype.getInitialData=function(t){return Q_(this.getSource(),this,{useEncodeDefaulter:!0})},Eb.type="series.line",Eb.dependencies=["grid","polar"],Eb.defaultOption={zlevel:0,z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0,lineStyle:{width:"bolder"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0},Eb);function Eb(){var t=null!==Rb&&Rb.apply(this,arguments)||this;return t.type=Eb.type,t.hasSymbolVisual=!0,t.legendSymbol="line",t}function Nb(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i)return Tf(t,e,n[0]);if(i){for(var r=[],o=0;o<n.length;o++)r.push(Tf(t,e,n[o]));return r.join(" ")}}function zb(t,e){var n=t.mapDimensionsAll("defaultedLabel");if(!V(e))return e+"";for(var i=[],r=0;r<n.length;r++){var o=t.getDimensionInfo(n[r]);o&&i.push(e[o.index])}return i.join(" ")}Sg.registerClass($i);var Bb,Vb=(l(Fb,Bb=Ho),Fb.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();r=Um(t,-1,-1,2,2,null,r);r.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),r.drift=Hb,this._symbolType=t,this.add(r)},Fb.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},Fb.prototype.getSymbolPath=function(){return this.childAt(0)},Fb.prototype.highlight=function(){xh(this.childAt(0))},Fb.prototype.downplay=function(){bh(this.childAt(0))},Fb.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},Fb.prototype.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},Fb.prototype.updateData=function(t,e,n,i){this.silent=!1;var r,o,a,s=t.getItemVisual(e,"symbol")||"circle",l=t.hostModel,u=Fb.getSymbolSize(t,e),h=s!==this._symbolType,c=i&&i.disableAnimation;h?(r=t.getItemVisual(e,"symbolKeepAspect"),this._createSymbol(s,t,e,u,r)):((o=this.childAt(0)).silent=!1,a={scaleX:u[0]/2,scaleY:u[1]/2},c?o.attr(a):jh(o,a,l,e)),this._updateCommon(t,e,u,n,i),h&&(o=this.childAt(0),c||(a={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:o.style.opacity}},o.scaleX=o.scaleY=0,o.style.opacity=0,qh(o,a,l,e))),c&&this.childAt(0).stopAnimation("remove"),this._seriesModel=l},Fb.prototype._updateCommon=function(e,t,n,i,r){var o,a,s,l,u,h,c=this.childAt(0),p=e.hostModel;i&&(o=i.emphasisItemStyle,s=i.blurItemStyle,a=i.selectItemStyle,l=i.focus,u=i.blurScope,f=i.symbolOffset,h=i.labelStatesModels,v=i.hoverScale,g=i.cursorStyle),i&&!e.hasItemOption||(o=(i=(d=i&&i.itemModel?i.itemModel:e.getItemModel(t)).getModel("emphasis")).getModel("itemStyle").getItemStyle(),a=d.getModel(["select","itemStyle"]).getItemStyle(),s=d.getModel(["blur","itemStyle"]).getItemStyle(),l=i.get("focus"),u=i.get("blurScope"),f=d.getShallow("symbolOffset"),h=dc(d),v=i.getShallow("scale"),g=d.getShallow("cursor"));var d=e.getItemVisual(t,"symbolRotate");c.attr("rotation",(d||0)*Math.PI/180||0),f&&(c.x=Vl(f[0],n[0]),c.y=Vl(f[1],n[1])),g&&c.attr("cursor",g);var d=e.getItemVisual(t,"style"),f=d.fill;c instanceof Yo?(y=c.style,c.useStyle(A({image:y.image,x:y.x,y:y.y,width:y.width,height:y.height},d))):(c.__isEmptyBrush?c.useStyle(A({},d)):c.useStyle(d),c.style.decal=null,c.setColor(f,r&&r.symbolInnerColor),c.style.strokeNoScale=!0);var g=e.getItemVisual(t,"liftZ"),y=this._z2;null!=g?null==y&&(this._z2=c.z2,c.z2+=g):null!=y&&(c.z2=y,this._z2=null);var m=r&&r.useNameLabel;pc(c,h,{labelFetcher:p,labelDataIndex:t,defaultText:function(t){return m?e.getName(t):Nb(e,t)},inheritColor:f,defaultOpacity:d.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var v,n=c.ensureState("emphasis");n.style=o,c.ensureState("select").style=a,c.ensureState("blur").style=s,v&&(v=Math.max(1.1,3/this._sizeY),n.scaleX=this._sizeX*v,n.scaleY=this._sizeY*v),this.setSymbolScale(1),Dh(this,l,u)},Fb.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},Fb.prototype.fadeOut=function(t,e){var n=this.childAt(0),i=this._seriesModel,r=Gu(this).dataIndex,o=e&&e.animation;this.silent=n.silent=!0,e&&e.fadeLabel?(e=n.getTextContent())&&Kh(e,{style:{opacity:0}},i,{dataIndex:r,removeOpt:o,cb:function(){n.removeTextContent()}}):n.removeTextContent(),Kh(n,{style:{opacity:0},scaleX:0,scaleY:0},i,{dataIndex:r,cb:t,removeOpt:o})},Fb.getSymbolSize=function(t,e){e=t.getItemVisual(e,"symbolSize");return e instanceof Array?e.slice():[+e,+e]},Fb);function Fb(t,e,n,i){var r=Bb.call(this)||this;return r.updateData(t,e,n,i),r}function Hb(t,e){this.parent.drift(t,e)}function Gb(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&(!i.isIgnore||!i.isIgnore(n))&&(!i.clipShape||i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Wb(t){return null==t||U(t)||(t={isIgnore:t}),t||{}}function Ub(t){var e=t.hostModel,t=e.getModel("emphasis");return{emphasisItemStyle:t.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:t.get("focus"),blurScope:t.get("blurScope"),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverScale:t.get("scale"),labelStatesModels:dc(e),cursorStyle:e.get("cursor")}}var Xb=(Yb.prototype.updateData=function(r,o){o=Wb(o);var a=this.group,s=r.hostModel,l=this._data,u=this._SymbolCtor,h=o.disableAnimation,c=Ub(r),p={disableAnimation:h},d=o.getSymbolPoint||function(t){return r.getItemLayout(t)};l||a.removeAll(),r.diff(l).add(function(t){var e,n=d(t);Gb(r,n,t,o)&&((e=new u(r,t,c,p)).setPosition(n),r.setItemGraphicEl(t,e),a.add(e))}).update(function(t,e){var n=l.getItemGraphicEl(e),i=d(t);Gb(r,i,t,o)?(n?(n.updateData(r,t,c,p),e={x:i[0],y:i[1]},h?n.attr(e):jh(n,e,s)):(n=new u(r,t)).setPosition(i),a.add(n),r.setItemGraphicEl(t,n)):a.remove(n)}).remove(function(t){var e=l.getItemGraphicEl(t);e&&e.fadeOut(function(){a.remove(e)})}).execute(),this._getSymbolPoint=d,this._data=r},Yb.prototype.isPersistent=function(){return!0},Yb.prototype.updateLayout=function(){var n=this,t=this._data;t&&t.eachItemGraphicEl(function(t,e){e=n._getSymbolPoint(e);t.setPosition(e),t.markRedraw()})},Yb.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=Ub(t),this._data=null,this.group.removeAll()},Yb.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}n=Wb(n);for(var r=t.start;r<t.end;r++){var o,a=e.getItemLayout(r);Gb(e,a,r,n)&&((o=new this._SymbolCtor(e,r,this._seriesScope)).traverse(i),o.setPosition(a),this.group.add(o),e.setItemGraphicEl(r,o))}},Yb.prototype.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll()},Yb);function Yb(t){this.group=new Ho,this._SymbolCtor=t||Vb}function Zb(t,e,n){var i=t.getBaseAxis(),r=t.getOtherAxis(i),o=function(t,e){var n=0,t=t.scale.getExtent();"start"===e?n=t[0]:"end"===e?n=t[1]:0<t[0]?n=t[0]:t[1]<0&&(n=t[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),n="x"===s||"radius"===s?1:0,i=O(t.dimensions,function(t){return e.mapDimension(t)}),r=!1,t=e.getCalculationInfo("stackResultDimension");return $_(e,i[0])&&(r=!0,i[0]=t),$_(e,i[1])&&(r=!0,i[1]=t),{dataDimsForPoint:i,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!r,valueDim:l,baseDim:u,baseDataOffset:n,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function jb(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var qb="undefined"!=typeof Float32Array,Kb=qb?Float32Array:Array;function $b(t){return V(t)?qb?new Float32Array(t):t:new Kb(t)}var Jb=Math.min,Qb=Math.max;function tw(t,e){return isNaN(t)||isNaN(e)}function ew(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y<i;y++){var m=e[2*g],v=e[2*g+1];if(r<=g||g<0)break;if(tw(m,v)){if(l){g+=o;continue}break}if(g===n)t[0<o?"moveTo":"lineTo"](m,v),c=m,p=v;else{var _=m-u,x=v-h;if(_*_+x*x<.5){g+=o;continue}if(0<a){var b=g+o,w=e[2*b],S=e[2*b+1],M=y+1;if(l)for(;tw(w,S)&&M<i;)M++,w=e[2*(b+=o)],S=e[2*b+1];var T,C,I,A,D,k,L,P=void 0,O=void 0;i<=M||tw(w,S)?(d=m,f=v):(C=w-u,I=S-h,A=m-u,D=w-m,k=v-h,L=S-v,x=_=void 0,O="x"===s?(_=Math.abs(A),x=Math.abs(D),d=m-_*a,P=m+_*a,f=v):"y"===s?(_=Math.abs(k),x=Math.abs(L),f=v-_*a,P=d=m,v+_*a):(_=Math.sqrt(A*A+k*k),d=m-C*a*(1-(T=(x=Math.sqrt(D*D+L*L))/(x+_))),f=v-I*a*(1-T),O=v+I*a*T,P=Jb(P=m+C*a*T,Qb(w,m)),O=Jb(O,Qb(S,v)),P=Qb(P,Jb(w,m)),f=v-((O=Qb(O,Jb(S,v)))-v)*_/x,d=Jb(d=m-(P-m)*_/x,Qb(u,m)),f=Jb(f,Qb(h,v)),P=m+(m-(d=Qb(d,Jb(u,m))))*x/_,v+(v-(f=Qb(f,Jb(h,v))))*x/_)),t.bezierCurveTo(c,p,d,f,m,v),c=P,p=O}else t.lineTo(m,v)}u=m,h=v,g+=o}return y}var nw,iw=function(){this.smooth=0,this.smoothConstraint=!0},rw=(l(ow,nw=_o),ow.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},ow.prototype.getDefaultShape=function(){return new iw},ow.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;0<r&&tw(n[2*r-2],n[2*r-1]);r--);for(;i<r&&tw(n[2*i],n[2*i+1]);i++);}for(;i<r;)i+=ew(t,n,i,r,r,1,e.smooth,e.smoothMonotone,e.connectNulls)+1},ow.prototype.getPointOn=function(t,e){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var n,i,r=this.path.data,o=Qr.CMD,a="x"===e,s=[],l=0;l<r.length;){var u,h,c,p,d,f=void 0,g=void 0;switch(r[l++]){case o.M:n=r[l++],i=r[l++];break;case o.L:if(f=r[l++],g=r[l++],(d=a?(t-n)/(f-n):(t-i)/(g-i))<=1&&0<=d){var y=a?(g-i)*d+i:(f-n)*d+n;return a?[t,y]:[y,t]}n=f,i=g;break;case o.C:f=r[l++],g=r[l++],u=r[l++],h=r[l++],c=r[l++],p=r[l++];var m=a?fr(n,f,u,c,t,s):fr(i,g,h,p,t,s);if(0<m)for(var v=0;v<m;v++){var _=s[v];if(_<=1&&0<=_){y=a?pr(i,g,h,p,_):pr(n,f,u,c,_);return a?[t,y]:[y,t]}}n=c,i=p}}},ow);function ow(t){t=nw.call(this,t)||this;return t.type="ec-polyline",t}var aw,sw=(l(lw,aw=iw),lw);function lw(){return null!==aw&&aw.apply(this,arguments)||this}var uw,hw=(l(cw,uw=_o),cw.prototype.getDefaultShape=function(){return new sw},cw.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;0<o&&tw(n[2*o-2],n[2*o-1]);o--);for(;r<o&&tw(n[2*r],n[2*r+1]);r++);}for(;r<o;){var s=ew(t,n,r,o,o,1,e.smooth,a,e.connectNulls);ew(t,i,r+s-1,s,o,-1,e.stackedOnSmooth,a,e.connectNulls),r+=s+1,t.closePath()}},cw);function cw(t){t=uw.call(this,t)||this;return t.type="ec-polygon",t}function pw(t,e,n,i,r){var o=t.getArea(),a=o.x,s=o.y,l=o.width,u=o.height,o=n.get(["lineStyle","width"])||2;a-=o/2,s-=o/2,l+=o,u+=o,a=Math.floor(a),l=Math.round(l);var h=new oa({shape:{x:a,y:s,width:l,height:u}});return e&&(t=(e=t.getBaseAxis()).isHorizontal(),e=e.inverse,t?(e&&(h.shape.x+=l),h.shape.width=0):(e||(h.shape.y+=u),h.shape.height=0),qh(h,{shape:{width:l,height:u,x:a,y:s}},n,null,i,"function"==typeof r?function(t){r(t,h)}:null)),h}function dw(t,e,n){var i=t.getArea(),r=Fl(i.r0,1),o=Fl(i.r,1),a=new Ka({shape:{cx:Fl(t.cx,1),cy:Fl(t.cy,1),r0:r,r:o,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}});return e&&("angle"===t.getBaseAxis().dim?a.shape.endAngle=i.startAngle:a.shape.r=r,qh(a,{shape:{endAngle:i.endAngle,r:o}},n)),a}function fw(t,e){return t.type===e}function gw(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++)if(t[n]!==e[n])return;return 1}}function yw(t){for(var e=1/0,n=1/0,i=-1/0,r=-1/0,o=0;o<t.length;){var a=t[o++],s=t[o++];isNaN(a)||(e=Math.min(a,e),i=Math.max(a,i)),isNaN(s)||(n=Math.min(s,n),r=Math.max(s,r))}return[[e,n],[i,r]]}function mw(t,e){var n=yw(t),i=n[0],t=n[1],n=yw(e),e=n[0],n=n[1];return Math.max(Math.abs(i[0]-e[0]),Math.abs(i[1]-e[1]),Math.abs(t[0]-n[0]),Math.abs(t[1]-n[1]))}function vw(t){return"number"==typeof t?t:t?.5:0}function _w(t,e,n){for(var e=e.getBaseAxis(),i="x"===e.dim||"radius"===e.dim?0:1,r=[],o=0,a=[],s=[],l=[];o<t.length-2;o+=2)switch(l[0]=t[o+2],l[1]=t[o+3],s[0]=t[o],s[1]=t[o+1],r.push(s[0],s[1]),n){case"end":a[i]=l[i],a[1-i]=s[1-i],r.push(a[0],a[1]);break;case"middle":var u=(s[i]+l[i])/2,h=[];a[i]=h[i]=u,a[1-i]=s[1-i],h[1-i]=l[1-i],r.push(a[0],a[1]),r.push(h[0],h[1]);break;default:a[i]=s[i],a[1-i]=l[1-i],r.push(a[0],a[1])}return r.push(t[o++],t[o++]),r}function xw(t,e,n){var i=t.get("showAllSymbol"),t="auto"===i;if(!i||t){n=n.getAxesByScale("ordinal")[0];if(n&&(!t||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;a<r;a+=o)if(1.5*Vb.getSymbolSize(e,a)[t.isHorizontal()?1:0]>i)return!1;return!0}(n,e))){var r=e.mapDimension(n.dim),o={};return E(n.getViewLabels(),function(t){o[t.tickValue]=1}),function(t){return!o.hasOwnProperty(e.get(r,t))}}}}function bw(t){for(var e,n,i=t.length/2;0<i&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}function ww(t,e){return[t[2*e],t[2*e+1]]}function Sw(n,i,e,t){if(fw(i,"cartesian2d")){var r,o=t.getModel("endLabel"),a=o.get("show"),s=o.get("valueAnimation"),l=t.getData(),u={lastFrameIndex:0},h=a?function(t,e){n._endLabelOnDuring(t,e,l,u,s,o,i)}:null,c=i.getBaseAxis().isHorizontal(),p=pw(i,e,t,function(){var t=n._endLabel;t&&e&&null!=u.originalX&&t.attr({x:u.originalX,y:u.originalY})},h);return t.get("clip",!0)||(r=p.shape,a=Math.max(r.width,r.height),c?(r.y-=a,r.height+=2*a):(r.x-=a,r.width+=2*a)),h&&h(1,p),p}return dw(i,e,t)}var Mw,nl=(l(Tw,Mw=zg),Tw.prototype.init=function(){var t=new Ho,e=new Xb;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},Tw.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem,o=this.group,a=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),u=a.getLayout("points")||[],h="polar"===r.type,c=this._coordSys,p=this._symbolDraw,d=this._polyline,f=this._polygon,g=this._lineGroup,y=t.get("animation"),m=!l.isEmpty(),v=l.get("origin"),_=Zb(r,a,v),x=m&&function(t,e,n){if(!n.valueDim)return[];for(var i=e.count(),r=$b(2*i),o=0;o<i;o++){var a=jb(n,t,e,o);r[2*o]=a[0],r[2*o+1]=a[1]}return r}(r,a,_),b=t.get("showSymbol"),w=b&&!h&&xw(t,a,r),S=this._data;S&&S.eachItemGraphicEl(function(t,e){t.__temp&&(o.remove(t),S.setItemGraphicEl(e,null))}),b||p.remove(),o.add(g);_=!h&&t.get("step");r&&r.getArea&&t.get("clip",!0)&&(null!=(M=r.getArea()).width?(M.x-=.1,M.y-=.1,M.width+=.2,M.height+=.2):M.r0&&(M.r0-=.5,M.r+=.5)),this._clipShapeForSymbol=M,d&&c.type===r.type&&_===this._step?(m&&!f?f=this._newPolygon(u,x):f&&!m&&(g.remove(f),f=this._polygon=null),h||this._initOrUpdateEndLabel(t,r),g.setClipPath(Sw(this,r,!1,t)),b&&p.updateData(a,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),gw(this._stackedOnPoints,x)&&gw(this._points,u)||(y?this._doUpdateAnimation(a,x,r,n,_,v):(_&&(u=_w(u,r,_),x=x&&_w(x,r,_)),d.setShape({points:u}),f&&f.setShape({points:u,stackedOnPoints:x})))):(b&&p.updateData(a,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),y&&this._initSymbolLabelAnimation(a,r,M),_&&(u=_w(u,r,_),x=x&&_w(x,r,_)),d=this._newPolyline(u),m&&(f=this._newPolygon(u,x)),h||this._initOrUpdateEndLabel(t,r),g.setClipPath(Sw(this,r,!0,t)));var w=function(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()&&"cartesian2d"===e.type){for(var i,r=n.length-1;0<=r;r--){var o,a=n[r].dimension,a=t.dimensions[a],a=t.getDimensionInfo(a);if("x"===(o=a&&a.coordDim)||"y"===o){i=n[r];break}}if(i){var s=e.getAxis(o),l=O(i.stops,function(t){return{offset:0,coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),u=l.length,h=i.outerColors.slice();u&&l[0].coord>l[u-1].coord&&(l.reverse(),h.reverse());var c=l[0].coord-10,e=l[u-1].coord+10,p=e-c;if(p<.001)return"transparent";E(l,function(t){t.offset=(t.coord-c)/p}),l.push({offset:u?l[u-1].offset:.5,color:h[1]||"transparent"}),l.unshift({offset:u?l[0].offset:.5,color:h[0]||"transparent"});l=new Da(0,0,0,0,l,!0);return l[o]=c,l[o+"2"]=e,l}}}(a,r)||a.getVisual("style")[a.getVisual("drawType")],y=t.get(["emphasis","focus"]),M=t.get(["emphasis","blurScope"]);d.useStyle(D(s.getLineStyle(),{fill:"none",stroke:w,lineJoin:"bevel"})),Ph(d,t,"lineStyle"),0<d.style.lineWidth&&"bolder"===t.get(["emphasis","lineStyle","width"])&&(d.getState("emphasis").style.lineWidth=d.style.lineWidth+1),Gu(d).seriesIndex=t.seriesIndex,Dh(d,y,M);m=vw(t.get("smooth")),h=t.get("smoothMonotone"),g=t.get("connectNulls");d.setShape({smooth:m,smoothMonotone:h,connectNulls:g}),f&&(s=a.getCalculationInfo("stackedOnSeries"),d=0,f.useStyle(D(l.getAreaStyle(),{fill:w,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),s&&(d=vw(s.get("smooth"))),f.setShape({smooth:m,stackedOnSmooth:d,smoothMonotone:h,connectNulls:g}),Ph(f,t,"areaStyle"),Gu(f).seriesIndex=t.seriesIndex,Dh(f,y,M));function T(t){i._changePolyState(t)}a.eachItemGraphicEl(function(t){t&&(t.onHoverStateChange=T)}),this._polyline.onHoverStateChange=T,this._data=a,this._coordSys=r,this._stackedOnPoints=x,this._points=u,this._step=_,this._valueOrigin=v},Tw.prototype.dispose=function(){},Tw.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=xu(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&0<=o){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],a=a[2*o+1];if(isNaN(l)||isNaN(a))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,a))return;(s=new Vb(r,o)).x=l,s.y=a,s.setZ(t.get("zlevel"),t.get("z")),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else zg.prototype.highlight.call(this,t,e,n,i)},Tw.prototype.downplay=function(t,e,n,i){var r,o=t.getData(),a=xu(o,i);this._changePolyState("normal"),null!=a&&0<=a?(r=o.getItemGraphicEl(a))&&(r.__temp?(o.setItemGraphicEl(a,null),this.group.remove(r)):r.downplay()):zg.prototype.downplay.call(this,t,e,n,i)},Tw.prototype._changePolyState=function(t){var e=this._polygon;yh(this._polyline,t),e&&yh(e,t)},Tw.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new rw({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e},Tw.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new hw({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n},Tw.prototype._initSymbolLabelAnimation=function(t,l,u){var h,c,e=l.getBaseAxis(),p=e.inverse;"cartesian2d"===l.type?(h=e.isHorizontal(),c=!1):"polar"===l.type&&(h="angle"===e.dim,c=!0);var e=t.hostModel,d=e.get("animationDuration");"function"==typeof d&&(d=d(null));var f=e.get("animationDelay")||0,g="function"==typeof f?f(null):f;t.eachItemGraphicEl(function(t,e){var n,i,r,o,a,s=t;s&&(i=[t.x,t.y],r=a=o=void 0,r=c?(n=u,i=l.pointToCoord(i),h?(o=n.startAngle,a=n.endAngle,-i[1]/180*Math.PI):(o=n.r0,a=n.r,i[0])):h?(o=u.x,a=u.x+u.width,t.x):(o=u.y+u.height,a=u.y,t.y),a=a===o?0:(r-o)/(a-o),p&&(a=1-a),o="function"==typeof f?f(e):d*a+g,a=(e=s.getSymbolPath()).getTextContent(),s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,delay:o}),a&&a.animateFrom({style:{opacity:0}},{duration:300,delay:o}),e.disableLabelAnimation=!0)})},Tw.prototype._initOrUpdateEndLabel=function(t,e){var i,n,r,o=t.getModel("endLabel");o.get("show")?(i=t.getData(),r=this._polyline,(n=this._endLabel)||((n=this._endLabel=new Ss({z2:200})).ignoreClip=!0,r.setTextContent(this._endLabel),r.disableLabelAnimation=!0),0<=(r=bw(i.getLayout("points")))&&pc(n,dc(t,"endLabel"),{labelFetcher:t,labelDataIndex:r,defaultText:function(t,e,n){return n?zb(i,n):Nb(i,t)},enableTextSetter:!0},(t=o,e=(o=(r=e).getBaseAxis()).isHorizontal(),r=o.inverse,o=e?r?"right":"left":"center",r=e?"middle":r?"top":"bottom",{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||r,padding:t.get("distance")||0}}))):this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},Tw.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s,l,u,h,c,p,d,f,g=this._endLabel,y=this._polyline;g&&(t<1&&null==i.originalX&&(i.originalX=g.x,i.originalY=g.y),s=n.getLayout("points"),u=(l=n.hostModel).get("connectNulls"),h=o.get("precision"),p=(d=a.getBaseAxis()).isHorizontal(),c=d.inverse,o=e.shape,a=void 0,1<=(p=(o=(c=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u<o;u++)if(r=t[2*u+a],!isNaN(r)&&!isNaN(t[2*u+1-a]))if(0!==u){if(i<=e&&e<=r||e<=i&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(s,d=c?p?o.x:o.y+o.height:p?o.x+o.width:o.y,e=p?"x":"y")).range)[1]-o[0])?(1<p&&!u?(f=ww(s,o[0]),g.attr({x:f[0],y:f[1]}),r&&(a=l.getRawValue(o[0]))):((f=y.getPointOn(d,e))&&g.attr({x:f[0],y:f[1]}),d=l.getRawValue(o[0]),e=l.getRawValue(o[1]),r&&(a=Au(n,h,d,e,c.t))),i.lastFrameIndex=o[0]):(f=ww(s,o=1===t||0<i.lastFrameIndex?o[0]:0),r&&(a=l.getRawValue(o)),g.attr({x:f[0],y:f[1]})),r&&xc(g).setLabelText(a))},Tw.prototype._doUpdateAnimation=function(t,e,n,i,r,o){var a=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,n,i,r,o,a,s){for(var l,u,h=(l=t,u=[],e.diff(l).add(function(t){u.push({cmd:"+",idx:t})}).update(function(t,e){u.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){u.push({cmd:"-",idx:t})}).execute(),u),c=[],p=[],d=[],f=[],g=[],y=[],m=[],v=Zb(r,e,a),_=Zb(o,t,s),x=t.getLayout("points")||[],b=e.getLayout("points")||[],w=0;w<h.length;w++){var S=h[w],M=!0,T=void 0,C=void 0;switch(S.cmd){case"=":T=2*S.idx,C=2*S.idx1;var I=x[T],A=x[T+1],D=b[C],k=b[C+1];(isNaN(I)||isNaN(A))&&(I=D,A=k),c.push(I,A),p.push(D,k),d.push(n[T],n[T+1]),f.push(i[C],i[C+1]),m.push(e.getRawIndex(S.idx1));break;case"+":var L=S.idx,P=v.dataDimsForPoint,P=r.dataToPoint([e.get(P[0],L),e.get(P[1],L)]),C=2*L;c.push(P[0],P[1]),p.push(b[C],b[C+1]);P=jb(v,r,e,L);d.push(P[0],P[1]),f.push(i[C],i[C+1]),m.push(e.getRawIndex(L));break;case"-":P=S.idx,C=t.getRawIndex(P),L=_.dataDimsForPoint,T=2*P;C!==P?(L=o.dataToPoint([t.get(L[0],P),t.get(L[1],P)]),P=jb(_,o,t,P),c.push(x[T],x[T+1]),p.push(L[0],L[1]),d.push(n[T],n[T+1]),f.push(P[0],P[1]),m.push(C)):M=!1}M&&(g.push(S),y.push(y.length))}y.sort(function(t,e){return m[t]-m[e]});for(var O=$b(s=c.length),R=$b(s),E=$b(s),N=$b(s),z=[],w=0;w<y.length;w++){var B=y[w],V=2*w,F=2*B;O[V]=c[F],O[1+V]=c[1+F],R[V]=p[F],R[1+V]=p[1+F],E[V]=d[F],E[1+V]=d[1+F],N[V]=f[F],N[1+V]=f[1+F],z[w]=g[B]}return{current:O,next:R,stackedOnCurrent:E,stackedOnNext:N,status:z}}(this._data,t,this._stackedOnPoints,e,this._coordSys,n,this._valueOrigin,o),h=u.current,c=u.stackedOnCurrent,e=u.next,o=u.stackedOnNext;if(r&&(h=_w(u.current,n,r),c=_w(u.stackedOnCurrent,n,r),e=_w(u.next,n,r),o=_w(u.stackedOnNext,n,r)),3e3<mw(h,e)||s&&3e3<mw(c,o))return a.setShape({points:e}),void(s&&s.setShape({points:e,stackedOnPoints:o}));a.shape.__points=u.current,a.shape.points=h;e={shape:{points:e}};u.current!==h&&(e.shape.__points=u.next),a.stopAnimation(),jh(a,e,l),s&&(s.setShape({points:h,stackedOnPoints:c}),s.stopAnimation(),jh(s,{shape:{stackedOnPoints:o}},l),a.shape.points!==s.shape.points&&(s.shape.points=a.shape.points));for(var p,d=[],f=u.status,g=0;g<f.length;g++){"="!==f[g].cmd||(p=t.getItemGraphicEl(f[g].idx1))&&d.push({el:p,ptIdx:g})}a.animators&&a.animators.length&&a.animators[0].during(function(){s&&s.dirtyShape();for(var t=a.shape.__points,e=0;e<d.length;e++){var n=d[e].el,i=2*d[e].ptIdx;n.x=t[i],n.y=t[1+i],n.markRedraw()}})},Tw.prototype.remove=function(t){var n=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,e){t.__temp&&(n.remove(t),i.setItemGraphicEl(e,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},Tw.type="line",Tw);function Tw(){return null!==Mw&&Mw.apply(this,arguments)||this}function Cw(t,i){return{seriesType:t,plan:Rg(),reset:function(t){var e=t.getData(),h=t.coordinateSystem,n=t.pipelineContext,c=i||n.large;if(h){var t=O(h.dimensions,function(t){return e.mapDimension(t)}).slice(0,2),p=t.length,n=e.getCalculationInfo("stackResultDimension");$_(e,t[0])&&(t[0]=n),$_(e,t[1])&&(t[1]=n);var n=e.getDimensionInfo(t[0]),t=e.getDimensionInfo(t[1]),d=n&&n.index,f=t&&t.index;return p&&{progress:function(t,e){for(var n=t.end-t.start,i=c&&$b(n*p),r=[],o=[],a=t.start,s=0;a<t.end;a++){var l,u=void 0;u=1===p?(l=e.getByDimIdx(d,a),h.dataToPoint(l,null,o)):(r[0]=e.getByDimIdx(d,a),r[1]=e.getByDimIdx(f,a),h.dataToPoint(r,null,o)),c?(i[s++]=u[0],i[s++]=u[1]):e.setItemLayout(a,u.slice())}c&&e.setLayout("points",i)}}}}}}zg.registerClass(nl);function Iw(t){return Math.round(t.length/2)}var Aw={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}};function Dw(t){return{seriesType:t,reset:function(t,e,n){var i,r=t.getData(),o=t.get("sampling"),a=t.coordinateSystem,s=r.count();10<s&&"cartesian2d"===a.type&&o&&(i=a.getBaseAxis(),a=a.getOtherAxis(i),i=i.getExtent(),n=n.getDevicePixelRatio(),n=Math.abs(i[1]-i[0])*(n||1),1<(s=Math.round(s/n))&&("lttb"===o&&t.setData(r.lttbDownSample(r.mapDimension(a.dim),1/s)),n=void 0,"string"==typeof o?n=Aw[o]:"function"==typeof o&&(n=o),n&&t.setData(r.downSample(r.mapDimension(a.dim),1/s,n,Iw))))}}}var Tc={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},$i=b({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Tc),nl=b({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},Tc),kw={category:$i,value:nl,time:b({scale:!0,splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},nl),log:D({scale:!0,logBase:10},nl)},Lw={value:1,category:1,time:1,log:1};function Pw(o,a,s){E(Lw,function(t,r){var i,e=b(b({},kw[r],!0),s,!0),e=(l(n,i=a),n.prototype.mergeDefaultAndTheme=function(t,e){var n=Fp(this),i=n?Gp(t):{};b(t,e.getTheme().get(r+"Axis")),b(t,this.getDefaultOption()),t.type=Ow(t),n&&Hp(t,i,n)},n.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=nx.createByAxisModel(this))},n.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},n.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},n.type=o+"Axis."+r,n.defaultOption=e,n);function n(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=i.apply(this,t)||this;return n.type=o+"Axis."+r,n}qp.registerClass(e)}),qp.registerSubTypeDefaulter(o+"Axis",Ow)}function Ow(t){return t.type||(t.data?"category":"value")}var Rw,Tc=(l(Ew,Rw=qp),Ew.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Mu).models[0]},Ew.type="cartesian2dAxis",Ew);function Ew(){return null!==Rw&&Rw.apply(this,arguments)||this}T(Tc,ub);$i={offset:0,categorySortInfo:[]};Pw("x",Tc,$i),Pw("y",Tc,$i);var Nw=Math.PI,zw=(Bw.prototype.hasBuilder=function(t){return!!Vw[t]},Bw.prototype.add=function(t){Vw[t](this.opt,this.axisModel,this.group,this._transformGroup)},Bw.prototype.getGroup=function(){return this.group},Bw.innerTextLayout=function(t,e,n){var i,t=Yl(e-t),n=Zl(t)?(i=0<n?"top":"bottom","center"):Zl(t-Nw)?(i=0<n?"bottom":"top","center"):(i="middle",0<t&&t<Nw?0<n?"right":"left":0<n?"left":"right");return{rotation:t,textAlign:n,textVerticalAlign:i}},Bw.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},Bw.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},Bw);function Bw(t,e){this.group=new Ho,this.opt=e,this.axisModel=t,D(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});e=new Ho({x:e.position[0],y:e.position[1],rotation:e.rotation});e.updateTransform(),this._transformGroup=e}var Vw={axisLine:function(i,t,r,e){var o,a,s,l,u,n=t.get(["axisLine","show"]);"auto"===n&&i.handleAutoShown&&(n=i.handleAutoShown("axisLine")),n&&(n=t.axis.getExtent(),e=e.transform,o=[n[0],0],n=[n[1],0],e&&(At(o,o,e),At(n,n,e)),a=A({lineCap:"round"},t.getModel(["axisLine","lineStyle"]).getLineStyle()),(e=new fa({subPixelOptimize:!0,shape:{x1:o[0],y1:o[1],x2:n[0],y2:n[1]},style:a,strokeContainThreshold:i.strokeContainThreshold||5,silent:!0,z2:1})).anid="line",r.add(e),s=t.get(["axisLine","symbol"]),e=t.get(["axisLine","symbolSize"]),"number"==typeof(t=t.get(["axisLine","symbolOffset"])||0)&&(t=[t,t]),null!=s&&("string"==typeof s&&(s=[s,s]),"string"!=typeof e&&"number"!=typeof e||(e=[e,e]),l=e[0],u=e[1],E([{rotate:i.rotation+Math.PI/2,offset:t[0],r:0},{rotate:i.rotation-Math.PI/2,offset:t[1],r:Math.sqrt((o[0]-n[0])*(o[0]-n[0])+(o[1]-n[1])*(o[1]-n[1]))}],function(t,e){var n;"none"!==s[e]&&null!=s[e]&&(n=Um(s[e],-l/2,-u/2,l,u,a.stroke,!0),e=t.r+t.offset,n.attr({rotation:t.rotate,x:o[0]+e*Math.cos(i.rotation),y:o[1]-e*Math.sin(i.rotation),silent:!0,z2:11}),r.add(n))})))},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var a=o.getModel("lineStyle"),o=i.tickDirection*o.get("length"),s=Ww(r.getTicksCoords(),e.transform,o,D(a.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),l=0;l<s.length;l++)t.add(s[l]);return s}(n,i,e,t);!function(t,e,n){if(ab(t.axis))return;var i=t.get(["axisLabel","showMinLabel"]),r=t.get(["axisLabel","showMaxLabel"]);n=n||[];var o=(e=e||[])[0],a=e[1],s=e[e.length-1],l=e[e.length-2],u=n[0],t=n[1],e=n[n.length-1],n=n[n.length-2];!1===i?(Fw(o),Fw(u)):Hw(o,a)&&(i?(Fw(a),Fw(t)):(Fw(o),Fw(u)));!1===r?(Fw(s),Fw(e)):Hw(l,s)&&(r?(Fw(l),Fw(n)):(Fw(s),Fw(e)))}(e,function(s,l,u,h){var c=u.axis;if(!J(h.axisLabelShow,u.get(["axisLabel","show"]))||c.scale.isBlank())return;var p=u.getModel("axisLabel"),d=p.get("margin"),t=c.getViewLabels(),e=(J(h.labelRotate,p.get("rotate"))||0)*Nw/180,f=zw.innerTextLayout(h.rotation,e,h.labelDirection),g=u.getCategories&&u.getCategories(!0),y=[],m=zw.isLabelSilent(u),v=u.get("triggerEvent");return E(t,function(t,e){var n="ordinal"===c.scale.type?c.scale.getRawIndex(t.tickValue):t.tickValue,i=t.formattedLabel,r=t.rawLabel,o=p;g&&g[n]&&(U(a=g[n])&&a.textStyle&&(o=new Ec(a.textStyle,p,u.ecModel)));var t=o.getTextColor()||u.get(["axisLine","lineStyle","color"]),a=c.dataToCoord(n),t=new Ss({x:a,y:h.labelOffset+h.labelDirection*d,rotation:f.rotation,silent:m,z2:10,style:fc(o,{text:i,align:o.getShallow("align",!0)||f.textAlign,verticalAlign:o.getShallow("verticalAlign",!0)||o.getShallow("baseline",!0)||f.textVerticalAlign,fill:"function"==typeof t?t("category"===c.type?r:"value"===c.type?n+"":n,e):t})});t.anid="label_"+n,v&&((n=zw.makeAxisEventDataBase(u)).targetType="axisLabel",n.value=r,Gu(t).eventData=n),l.add(t),t.updateTransform(),y.push(t),s.add(t),t.decomposeTransform()}),y}(n,i,e,t),r),function(t,e,n,i){var r=n.axis,o=n.getModel("minorTick");if(!o.get("show")||r.scale.isBlank())return;var a=r.getMinorTicksCoords();if(!a.length)return;for(var r=o.getModel("lineStyle"),s=i*o.get("length"),l=D(r.getLineStyle(),D(n.getModel("axisTick").getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])})),u=0;u<a.length;u++)for(var h=Ww(a[u],e.transform,s,l,"minorticks_"+u),c=0;c<h.length;c++)t.add(h[c])}(n,i,e,t.tickDirection)},axisName:function(t,e,n,i){var r,o,a,s,l,u,h,c,p=J(t.axisName,e.get("name"));p&&(u=e.get("nameLocation"),a=t.nameDirection,r=e.getModel("nameTextStyle"),s=e.get("nameGap")||0,o=(l=e.axis.getExtent())[0]>l[1]?-1:1,o=["start"===u?l[0]-o*s:"end"===u?l[1]+o*s:(l[0]+l[1])/2,Gw(u)?t.labelOffset+a*s:0],null!=(s=e.get("nameRotate"))&&(s=s*Nw/180),Gw(u)?c=zw.innerTextLayout(t.rotation,null!=s?s:t.rotation,a):(c=function(t,e,n,i){var r,t=Yl(n-t),i=i[0]>i[1],i="start"===e&&!i||"start"!==e&&i;i=Zl(t-Nw/2)?(r=i?"bottom":"top","center"):Zl(t-1.5*Nw)?(r=i?"top":"bottom","center"):(r="middle",t<1.5*Nw&&Nw/2<t?i?"left":"right":i?"right":"left");return{rotation:t,textAlign:i,textVerticalAlign:r}}(t.rotation,u,s||0,l),null!=(h=t.axisNameAvailableWidth)&&(h=Math.abs(h/Math.sin(c.rotation)),isFinite(h)||(h=null))),a=r.getFont(),s=(u=e.get("nameTruncate",!0)||{}).ellipsis,l=J(t.nameTruncateMaxWidth,u.maxWidth,h),t=e.get("tooltip",!0),(h={componentType:u=e.mainType,name:p,$vars:["name"]})[u+"Index"]=e.componentIndex,(c=new Ss({x:o[0],y:o[1],rotation:c.rotation,silent:zw.isLabelSilent(e),style:fc(r,{text:p,font:a,overflow:"truncate",width:l,ellipsis:s,fill:r.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:r.get("align")||c.textAlign,verticalAlign:r.get("verticalAlign")||c.textVerticalAlign}),z2:1})).tooltip=t&&t.show?A({content:p,formatter:function(){return p},formatterParams:h},t):null,c.__fullText=p,c.anid="name",e.get("triggerEvent")&&((e=zw.makeAxisEventDataBase(e)).targetType="axisName",e.name=p,Gu(c).eventData=e),i.add(c),c.updateTransform(),n.add(c),c.decomposeTransform())}};function Fw(t){t&&(t.ignore=!0)}function Hw(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=ye([]);return xe(r,r,-t.rotation),n.applyTransform(ve([],r,t.getLocalTransform())),i.applyTransform(ve([],r,e.getLocalTransform())),n.intersect(i)}}function Gw(t){return"middle"===t||"center"===t}function Ww(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l<t.length;l++){var u=t[l].coord;a[0]=u,s[a[1]=0]=u,s[1]=n,e&&(At(a,a,e),At(s,s,e));u=new fa({subPixelOptimize:!0,shape:{x1:a[0],y1:a[1],x2:s[0],y2:s[1]},style:i,z2:2,autoBatch:!0,silent:!0});u.anid=r+"_"+t[l].tickValue,o.push(u)}return o}function Uw(t,e){var u,h,r,c,p,d,o,n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return u=n,e=e,r=(h=t).getComponent("tooltip"),c=h.getComponent("axisPointer"),p=c.get("link",!0)||[],d=[],E(e.getCoordinateSystems(),function(a){var s,l,t,e,n;function i(t,e,n){var i,r=n.model.getModel("axisPointer",c),o=r.get("show");o&&("auto"!==o||t||Zw(r))&&(null==e&&(e=r.get("triggerTooltip")),i=(r=t?function(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};E(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=I(a.get(t))}),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");e=s.label||(s.label={});{null==e.show&&(e.show=!1),"cross"===r&&(r=a.get(["label","show"]),e.show=null==r||r,o||(o=s.lineStyle=a.get("crossStyle"))&&D(e,o.textStyle))}return t.model.getModel("axisPointer",new Ec(s,n,i))}(n,l,c,h,t,e):r).get("snap"),o=jw(n.model),t=e||i||"category"===n.type,r=u.axesInfo[o]={key:o,axis:n,coordSys:a,axisPointerModel:r,triggerTooltip:e,involveSeries:t,snap:i,useHandle:Zw(r),seriesModels:[],linkGroup:null},s[o]=r,u.seriesInvolved=u.seriesInvolved||t,null!=(t=function(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(Xw(o[i+"AxisId"],n.id)||Xw(o[i+"AxisIndex"],n.componentIndex)||Xw(o[i+"AxisName"],n.name))return r}}(p,n))&&((n=d[t]||(d[t]={axesInfo:{}})).axesInfo[o]=r,n.mapper=p[t].mapper,r.linkGroup=n))}a.axisPointerEnabled&&(n=jw(a.model),s=u.coordSysAxesInfo[n]={},l=(u.coordSysMap[n]=a).model.getModel("tooltip",r),E(a.getAxes(),B(i,!1,null)),a.getTooltipAxes&&r&&l.get("show")&&(t="axis"===l.get("trigger"),e="cross"===l.get(["axisPointer","type"]),n=a.getTooltipAxes(l.get(["axisPointer","axis"])),(t||e)&&E(n.baseAxes,B(i,!e||"cross",t)),e&&E(n.otherAxes,B(i,"cross",!1))))}),n.seriesInvolved&&(o=n,t.eachSeries(function(n){var i=n.coordinateSystem,t=n.get(["tooltip","trigger"],!0),e=n.get(["tooltip","show"],!0);i&&"none"!==t&&!1!==t&&"item"!==t&&!1!==e&&!1!==n.get(["axisPointer","show"],!0)&&E(o.coordSysAxesInfo[jw(i.model)],function(t){var e=t.axis;i.getAxis(e.dim)===e&&(t.seriesModels.push(n),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=n.getData().count())})})),n}function Xw(t,e){return"all"===t||V(t)&&0<=L(t,e)||t===e}function Yw(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[jw(t)]}function Zw(t){return!!t.get(["handle","show"])}function jw(t){return t.type+"||"+t.id}var qw,Kw={},nl=(l($w,qw=Pg),$w.prototype.render=function(t,e,n,i){var r,o,a,s,l,u;!this.axisPointerClass||(u=Yw(r=t))&&(s=u.axisPointerModel,l=u.axis.scale,o=s.option,a=s.get("status"),null!=(r=s.get("value"))&&(r=l.parse(r)),s=Zw(s),null==a&&(o.status=s?"show":"hide"),(l=l.getExtent().slice())[0]>l[1]&&l.reverse(),(null==r||r>l[1])&&(r=l[1]),r<l[0]&&(r=l[0]),o.value=r,s&&(o.status=u.axis.scale.isBlank()?"hide":"show")),qw.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(t,n,!0)},$w.prototype.updateAxisPointer=function(t,e,n,i){this._doUpdateAxisPointerClass(t,n,!1)},$w.prototype.remove=function(t,e){var n=this._axisPointer;n&&n.remove(e)},$w.prototype.dispose=function(t,e){this._disposeAxisPointer(e),qw.prototype.dispose.apply(this,arguments)},$w.prototype._doUpdateAxisPointerClass=function(t,e,n){var i,r=$w.getAxisPointerClass(this.axisPointerClass);r&&((i=(i=Yw(i=t))&&i.axisPointerModel)?(this._axisPointer||(this._axisPointer=new r)).render(t,i,e,n):this._disposeAxisPointer(e))},$w.prototype._disposeAxisPointer=function(t){this._axisPointer&&this._axisPointer.dispose(t),this._axisPointer=null},$w.registerAxisPointerClass=function(t,e){Kw[t]=e},$w.getAxisPointerClass=function(t){return t&&Kw[t]},$w.type="axis",$w);function $w(){var t=null!==qw&&qw.apply(this,arguments)||this;return t.type=$w.type,t}function Jw(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),t=[h.x,h.x+h.width,h.y,h.y+h.height],r={left:0,right:1,top:0,bottom:1,onZero:2},i=e.get("offset")||0,h="x"===u?[t[2]-i,t[3]+i]:[t[0]-i,t[1]+i];a&&(i=a.toGlobalCoord(a.dataToCoord(0)),h[r.onZero]=Math.max(Math.min(i,h[1]),h[0])),o.position=["y"===u?h[r[l]]:t[0],"x"===u?h[r[l]]:t[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?h[r[s]]-h[r.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),J(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);e=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-e:e,o.z2=1,o}function Qw(t){return"cartesian2d"===t.get("coordinateSystem")}function tS(i){var r={xAxisModel:null,yAxisModel:null};return E(r,function(t,e){var n=e.replace(/Model$/,""),n=i.getReferringComponents(n,Mu).models[0];r[e]=n}),r}var eS=bu();var nS,iS=["axisLine","axisTickLabel","axisName"],rS=["splitArea","splitLine","minorSplitLine"],Tc=(l(oS,nS=nl),oS.prototype.render=function(r,t,e,n){this.group.removeAll();var o,i,a=this._axisGroup;this._axisGroup=new Ho,this.group.add(this._axisGroup),r.get("show")&&(i=Jw(o=r.getCoordSysModel(),r),i=new zw(r,A({handleAutoShown:function(t){for(var e=o.coordinateSystem.getCartesians(),n=0;n<e.length;n++){var i=e[n].getOtherAxis(r.axis).type;if("value"===i||"log"===i)return!0}return!1}},i)),E(iS,i.add,i),this._axisGroup.add(i.getGroup()),E(rS,function(t){r.get([t,"show"])&&sS[t](this,this._axisGroup,r,o)},this),rc(a,this._axisGroup,r),nS.prototype.render.call(this,r,t,e,n))},oS.prototype.remove=function(){eS(this).splitAreaColors=null},oS.type="cartesianAxis",oS);function oS(){var t=null!==nS&&nS.apply(this,arguments)||this;return t.type=oS.type,t.axisPointerClass="CartesianAxisPointer",t}var aS,sS={splitLine:function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank())for(var o=n.getModel("splitLine"),n=o.getModel("lineStyle"),a=V(a=n.get("color"))?a:[a],s=i.coordinateSystem.getRect(),l=r.isHorizontal(),u=0,h=r.getTicksCoords({tickModel:o}),c=[],p=[],d=n.getLineStyle(),f=0;f<h.length;f++){var g=r.toGlobalCoord(h[f].coord);l?(c[0]=g,c[1]=s.y,p[0]=g,p[1]=s.y+s.height):(c[0]=s.x,c[1]=g,p[0]=s.x+s.width,p[1]=g);var y=u++%a.length,g=h[f].tickValue;e.add(new fa({anid:null!=g?"line_"+h[f].tickValue:null,subPixelOptimize:!0,autoBatch:!0,shape:{x1:c[0],y1:c[1],x2:p[0],y2:p[1]},style:D({stroke:a[y]},d),silent:!0}))}},minorSplitLine:function(t,e,n,i){var r=n.axis,n=n.getModel("minorSplitLine").getModel("lineStyle"),o=i.coordinateSystem.getRect(),a=r.isHorizontal(),s=r.getMinorTicksCoords();if(s.length)for(var l=[],u=[],h=n.getLineStyle(),c=0;c<s.length;c++)for(var p=0;p<s[c].length;p++){var d=r.toGlobalCoord(s[c][p].coord);a?(l[0]=d,l[1]=o.y,u[0]=d,u[1]=o.y+o.height):(l[0]=o.x,l[1]=d,u[0]=o.x+o.width,u[1]=d),e.add(new fa({anid:"minor_line_"+s[c][p].tickValue,subPixelOptimize:!0,autoBatch:!0,shape:{x1:l[0],y1:l[1],x2:u[0],y2:u[1]},style:h,silent:!0}))}},splitArea:function(t,e,n,i){!function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var o=n.getModel("splitArea"),n=o.getModel("areaStyle"),a=n.get("color"),s=i.coordinateSystem.getRect(),l=r.getTicksCoords({tickModel:o,clamp:!0});if(l.length){var u=a.length,h=eS(t).splitAreaColors,c=ht(),p=0;if(h)for(var d=0;d<l.length;d++){var f=h.get(l[d].tickValue);if(null!=f){p=(f+(u-1)*d)%u;break}}for(var g=r.toGlobalCoord(l[0].coord),y=n.getAreaStyle(),a=V(a)?a:[a],d=1;d<l.length;d++){var m=r.toGlobalCoord(l[d].coord),v=void 0,_=void 0,x=void 0,b=void 0,g=r.isHorizontal()?(v=g,_=s.y,x=m-v,b=s.height,v+x):(v=s.x,_=g,x=s.width,_+(b=m-_)),m=l[d-1].tickValue;null!=m&&c.set(m,p),e.add(new oa({anid:null!=m?"area_"+m:null,shape:{x:v,y:_,width:x,height:b},style:D({fill:a[p]},y),autoBatch:!0,silent:!0})),p=(p+1)%u}eS(t).splitAreaColors=c}}}(t,e,n,i)}},lS=(l(uS,aS=Tc),uS.type="xAxis",uS);function uS(){var t=null!==aS&&aS.apply(this,arguments)||this;return t.type=uS.type,t}var hS,$i=(l(cS,hS=Tc),cS.type="yAxis",cS);function cS(){var t=null!==hS&&hS.apply(this,arguments)||this;return t.type=lS.type,t}function pS(t,e){return t.get(e.uid)||t.set(e.uid,{condExtent:dS()})}function dS(){return[1/0,-1/0]}function fS(t,e){e<t[0]&&(t[0]=e),e>t[1]&&(t[1]=e)}Pg.registerClass(lS),Pg.registerClass($i),o_(g.PROCESSOR.FILTER+10,{getTargetSeries:function(t){var e=ht();return t.eachSeries(function(t){Qw(t)&&e.set(t.uid,t)}),e},overallReset:function(t,e){var l,u,C,n=[],i=ht();l=i,u=n,t.eachSeries(function(t){var e,n,i,r,o,a,s;Qw(t)&&(e=(s=tS(t)).xAxisModel,n=s.yAxisModel,i=e.axis,r=n.axis,o=i.scale.rawExtentInfo,a=r.scale.rawExtentInfo,s=t.getData(),o&&o.frozen||a&&a.frozen||(u.push({seriesModel:t,xAxisModel:e,yAxisModel:n}),lb(pS(l,e).condExtent,s,i.dim),lb(pS(l,n).condExtent,s,r.dim)))}),C=i,E(n,function(t){var e=t.xAxisModel,n=t.yAxisModel,i=e.axis,r=n.axis,o=pS(C,e),a=pS(C,n);o.rawExtentInfo=$x(i.scale,e,o.condExtent),a.rawExtentInfo=$x(r.scale,n,a.condExtent),o.rawExtentResult=o.rawExtentInfo.calculate(),a.rawExtentResult=a.rawExtentInfo.calculate();var s,l,u=t.seriesModel.getData(),h={},c={};function p(e,t){var n=t.condExtent,t=t.rawExtentResult;"category"===e.type&&(n[0]<t.min||t.max<n[1])&&E(sb(u,e.dim),function(t){pt(h,t)||(h[t]=!0,s=e)})}function d(t,e){var n=e.rawExtentResult;"category"===t.type||n.minFixed&&n.maxFixed||E(sb(u,t.dim),function(t){pt(h,t)||pt(c,t)||(c[t]=!0,l=e)})}p(i,o),p(r,a),d(i,o),d(r,a);var f=N(h),g=N(c),y=O(g,dS),m=f.length,v=g.length;if(m&&v){var _=1===m?f[0]:null,x=1===v?g[0]:null,b=u.count();if(_&&x)for(var w=0;w<b;w++){var S=u.get(_,w);s.scale.isInExtentRange(S)&&fS(y[0],u.get(x,w))}else for(w=0;w<b;w++)for(var M=0;M<m;M++){S=u.get(f[M],w);if(s.scale.isInExtentRange(S)){for(var T=0;T<v;T++)fS(y[T],u.get(g[T],w));break}}E(y,function(t,e){e=g[e];u.setApproximateExtent(t,e);e=l.tarExtent=l.tarExtent||dS();fS(e,t[0]),fS(e,t[1])})}}),i.each(function(t){var e,n=t.tarExtent;n&&(e=t.rawExtentResult,t=t.rawExtentInfo,!e.minFixed&&n[0]>e.min&&t.modifyDataMinMax("min",n[0]),!e.maxFixed&&n[1]<e.max&&t.modifyDataMinMax("max",n[1]))})}});var gS,Tc=(l(yS,gS=qp),yS.type="grid",yS.dependencies=["xAxis","yAxis"],yS.layoutMode="box",yS.defaultOption={show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},yS);function yS(){return null!==gS&&gS.apply(this,arguments)||this}var mS,$i=(l(vS,mS=Pg),vS.prototype.render=function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new oa({shape:t.coordinateSystem.getRect(),style:D({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))},vS.type="grid",vS);function vS(){var t=null!==mS&&mS.apply(this,arguments)||this;return t.type="grid",t}Pg.registerClass($i),qp.registerClass(Tc),r_(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),s_(Cw("line",!0)),o_(g.PROCESSOR.STATISTIC,Dw("line"));_S.prototype.getAxis=function(t){return this._axes[t]},_S.prototype.getAxes=function(){return O(this._dimList,function(t){return this._axes[t]},this)},_S.prototype.getAxesByScale=function(e){return e=e.toLowerCase(),R(this.getAxes(),function(t){return t.scale.type===e})},_S.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},Tc=_S;function _S(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}var xS=["x","y"];function bS(t){return"interval"===t.type||"time"===t.type}var wS,SS=(l(MS,wS=Tc),MS.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t,e,n,i,r=this.getAxis("x").scale,o=this.getAxis("y").scale;bS(r)&&bS(o)&&(n=r.getExtent(),i=o.getExtent(),t=this.dataToPoint([n[0],i[0]]),e=this.dataToPoint([n[1],i[1]]),r=n[1]-n[0],o=i[1]-i[0],r&&o&&(r=(e[0]-t[0])/r,o=(e[1]-t[1])/o,n=t[0]-n[0]*r,i=t[1]-i[0]*o,i=this._transform=[r,0,0,o,n,i],this._invTransform=we([],i)))},MS.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},MS.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},MS.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},MS.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return At(n,t,this._transform);var o=this.getAxis("x"),t=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i)),n[1]=t.toGlobalCoord(t.dataToCoord(r)),n},MS.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),n=n.parse(t[0]),t=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),n),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),t),Math.max(o[0],o[1])),e},MS.prototype.pointToData=function(t,e){if(e=e||[],this._invTransform)return At(e,t,this._invTransform);var n=this.getAxis("x"),i=this.getAxis("y");return e[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},MS.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},MS.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),t=Math.max(t[0],t[1])-n,e=Math.max(e[0],e[1])-i;return new Rn(n,i,t,e)},MS);function MS(){var t=null!==wS&&wS.apply(this,arguments)||this;return t.type="cartesian2d",t.dimensions=xS,t}var TS,CS=(l(IS,TS=wl),IS.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},IS.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},IS.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},IS.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setCategorySortInfo(t)},IS);function IS(t,e,n,i,r){n=TS.call(this,t,e,n)||this;return n.index=0,n.type=i||"value",n.position=r||"bottom",n}AS.prototype.getRect=function(){return this._rect},AS.prototype.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),E(n.x,function(t){tb(t.scale,t.model)}),E(n.y,function(t){tb(t.scale,t.model)});var i={};E(n.x,function(t){kS(n,"y",t,i)}),E(n.y,function(t){kS(n,"x",t,i)}),this.resize(this.model,e)},AS.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),t=!n&&t.get("containLabel"),a=Bp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=a;var r=this._axesList;function o(){E(r,function(t){var e,n,i=t.isHorizontal(),r=i?[0,a.width]:[0,a.height],o=t.inverse?1:0;t.setExtent(r[o],r[1-o]),t=t,e=i?a.x:a.y,i=t.getExtent(),n=i[0]+i[1],t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}})}o(),t&&(E(r,function(t){var e,n,i;t.model.get(["axisLabel","inside"])||(e=rb(t))&&(n=t.isHorizontal()?"height":"width",i=t.model.get(["axisLabel","margin"]),a[n]-=e[n]+i,"top"===t.position?a.y+=e.height+i:"left"===t.position&&(a.x+=e.width+i))}),o()),E(this._coordsList,function(t){t.calcAffineTransform()})},AS.prototype.getAxis=function(t,e){t=this._axesMap[t];if(null!=t)return t[e||0]},AS.prototype.getAxes=function(){return this._axesList.slice()},AS.prototype.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}U(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},AS.prototype.getCartesians=function(){return this._coordsList.slice()},AS.prototype.convertToPixel=function(t,e,n){e=this._findConvertTarget(e);return e.cartesian?e.cartesian.dataToPoint(n):e.axis?e.axis.toGlobalCoord(e.axis.dataToCoord(n)):null},AS.prototype.convertFromPixel=function(t,e,n){e=this._findConvertTarget(e);return e.cartesian?e.cartesian.pointToData(n):e.axis?e.axis.coordToData(e.axis.toLocalCoord(n)):null},AS.prototype._findConvertTarget=function(t){var e,n,i=t.seriesModel,r=t.xAxisModel||i&&i.getReferringComponents("xAxis",Mu).models[0],o=t.yAxisModel||i&&i.getReferringComponents("yAxis",Mu).models[0],a=t.gridModel,t=this._coordsList;return i?L(t,e=i.coordinateSystem)<0&&(e=null):r&&o?e=this.getCartesian(r.componentIndex,o.componentIndex):r?n=this.getAxis("x",r.componentIndex):o?n=this.getAxis("y",o.componentIndex):a&&a.coordinateSystem===this&&(e=this._coordsList[0]),{cartesian:e,axis:n}},AS.prototype.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},AS.prototype._initCartesian=function(o,t,e){var a=this,s=this,l={left:!1,right:!1,top:!1,bottom:!1},u={x:{},y:{}},h={x:0,y:0};if(t.eachComponent("xAxis",n("x"),this),t.eachComponent("yAxis",n("y"),this),!h.x||!h.y)return this._axesMap={},void(this._axesList=[]);function n(r){return function(t,e){var n,i;DS(t,o)&&(i=t.get("position"),"x"===r?"top"!==i&&"bottom"!==i&&(i=l.bottom?"top":"bottom"):"left"!==i&&"right"!==i&&(i=l.left?"right":"left"),l[i]=!0,i="category"===(n=new CS(r,eb(t),[0,0],t.get("type"),i)).type,n.onBand=i&&t.get("boundaryGap"),n.inverse=t.get("inverse"),(t.axis=n).model=t,n.grid=s,n.index=e,s._axesList.push(n),u[r][e]=n,h[r]++)}}E((this._axesMap=u).x,function(i,r){E(u.y,function(t,e){var n="x"+r+"y"+e,e=new SS(n);e.master=a,e.model=o,a._coordsMap[n]=e,a._coordsList.push(e),e.addAxis(i),e.addAxis(t)})})},AS.prototype._updateScale=function(t,i){function r(e,n){E(sb(e,n.dim),function(t){n.scale.unionExtentFromData(e,t)})}E(this._axesList,function(t){var e;t.scale.setExtent(1/0,-1/0),"category"===t.type&&(e=t.model.get("categorySortInfo"),t.scale.setCategorySortInfo(e))}),t.eachSeries(function(t){var e,n;Qw(t)&&(n=(e=tS(t)).xAxisModel,e=e.yAxisModel,DS(n,i)&&DS(e,i)&&(n=this.getCartesian(n.componentIndex,e.componentIndex),e=t.getData(),t=n.getAxis("x"),n=n.getAxis("y"),"list"===e.type&&(r(e,t),r(e,n))))},this)},AS.prototype.getTooltipAxes=function(n){var i=[],r=[];return E(this.getCartesians(),function(t){var e=null!=n&&"auto"!==n?t.getAxis(n):t.getBaseAxis(),t=t.getOtherAxis(e);L(i,e)<0&&i.push(e),L(r,t)<0&&r.push(t)}),{baseAxes:i,otherAxes:r}},AS.create=function(i,r){var o=[];return i.eachComponent("grid",function(t,e){var n=new AS(t,i,r);n.name="grid_"+e,n.resize(t,r,!0),t.coordinateSystem=n,o.push(n)}),i.eachSeries(function(t){var e,n,i;Qw(t)&&(e=(i=tS(t)).xAxisModel,n=i.yAxisModel,i=e.getCoordSysModel().coordinateSystem,t.coordinateSystem=i.getCartesian(e.componentIndex,n.componentIndex))}),o},AS.dimensions=xS,Tc=AS;function AS(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=xS,this._initCartesian(t,e,n),this.model=t}function DS(t,e){return t.getCoordSysModel()===e}function kS(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,o=t[e],e=n.model,n=e.get(["axisLine","onZero"]),e=e.get(["axisLine","onZeroAxisIndex"]);if(n){if(null!=e)LS(o[e])&&(r=o[e]);else for(var a in o)if(o.hasOwnProperty(a)&&LS(o[a])&&!i[s(o[a])]){r=o[a];break}r&&(i[s(r)]=!0)}function s(t){return t.dim+"_"+t.index}}function LS(t){return t&&"category"!==t.type&&"time"!==t.type&&(e=(t=(e=t).scale.getExtent())[0],t=t[1],!(0<e&&0<t||e<0&&t<0));var e}Ed.register("cartesian2d",Tc);var PS,Tc=(l(OS,PS=Sg),OS.prototype.getInitialData=function(t,e){return Q_(this.getSource(),this,{useEncodeDefaulter:!0})},OS.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),t=i.getLayout("offset"),i=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=t+i/2,n}return[NaN,NaN]},OS.type="series.__base_bar__",OS.defaultOption={zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},OS);function OS(){var t=null!==PS&&PS.apply(this,arguments)||this;return t.type=OS.type,t}Sg.registerClass(Tc);var RS,Tc=(l(ES,RS=Tc),ES.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},ES.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return t<e&&(t=e),t},ES.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},ES.type="series.bar",ES.dependencies=["grid","polar"],ES.defaultOption=Vc(Tc.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),ES);function ES(){var t=null!==RS&&RS.apply(this,arguments)||this;return t.type=ES.type,t}Sg.registerClass(Tc);var NS,zS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},BS=(l(VS,NS=_o),VS.prototype.getDefaultShape=function(){return new zS},VS.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=Math.cos(l),p=Math.sin(l),d=Math.cos(u),e=Math.sin(u);(h?u-l<2*Math.PI:l-u<2*Math.PI)&&(t.moveTo(c*r+n,p*r+i),t.arc(c*s+n,p*s+i,a,-Math.PI+l,l,!h)),t.arc(n,i,o,l,u,!h),t.moveTo(d*o+n,e*o+i),t.arc(d*s+n,e*s+i,a,u-2*Math.PI,u-Math.PI,!h),0!==r&&(t.arc(n,i,r,u,l,h),t.moveTo(c*r+n,e*r+i)),t.closePath()},VS);function VS(t){t=NS.call(this,t)||this;return t.type="sausage",t}var FS=["itemStyle","borderWidth"],HS=["itemStyle","borderRadius"],GS=[0,0],WS=Math.max,US=Math.min;var XS,Tc=(l(YS,XS=zg),YS.prototype.render=function(t,e,n,i){this._model=t,this.removeOnRenderedListener(n),this._updateDrawMode(t);var r=t.get("coordinateSystem");"cartesian2d"!==r&&"polar"!==r||(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n,i))},YS.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},YS.prototype.incrementalRender=function(t,e){this._incrementalRenderLarge(t,e)},YS.prototype._updateDrawMode=function(t){t=t.pipelineContext.large;null!=this._isLargeDraw&&t===this._isLargeDraw||(this._isLargeDraw=t,this._clear())},YS.prototype._renderNormal=function(a,t,e,n){var s,i=this,l=this.group,u=a.getData(),h=this._data,c=a.coordinateSystem,p=c.getBaseAxis();"cartesian2d"===c.type?s=p.isHorizontal():"polar"===c.type&&(s="angle"===p.dim);var d=a.isAnimationEnabled()?a:null,f=p.model,g=a.get("realtimeSort");if(g&&u.count()){if(this._isFirstFrame)return this._initSort(u,s,p,e),void(this._isFirstFrame=!1);this._onRendered=function(){i._updateSort(u,function(t){t=u.getItemGraphicEl(t);if(t){t=t.shape;return(s?t.y+t.height:t.x+t.width)||0}return 0},p,e)},e.getZr().on("rendered",this._onRendered)}var r,o,y,m=a.get("clip",!0)||g,v=(o=u,y=(r=c).getArea&&r.getArea(),fw(r,"cartesian2d")&&("category"===(r=r.getBaseAxis()).type&&r.onBand||(o=o.getLayout("bandWidth"),r.isHorizontal()?(y.x-=o,y.width+=2*o):(y.y-=o,y.height+=2*o))),y);l.removeClipPath();var _=a.get("roundCap",!0),x=a.get("showBackground",!0),b=a.getModel("backgroundStyle"),w=b.get("borderRadius")||0,S=[],M=this._backgroundEls,T=n&&n.isInitSort,C=n&&"changeAxisOrder"===n.type;function I(t){var e,n,i=KS[c.type](u,t),i=(e=s,n=i,new("polar"===(i=c).type?Ka:oa)({shape:rM(e,n,i),silent:!0,z2:0}));return i.useStyle(b.getItemStyle()),"cartesian2d"===c.type&&i.setShape("r",w),S[t]=i}u.diff(h).add(function(t){var e,n,i=u.getItemModel(t),r=KS[c.type](u,t,i);x&&I(t),u.hasValue(t)&&(e=!1,m&&(e=ZS[c.type](v,r)),$S(n=jS[c.type](a,u,t,r,s,d,p.model,!1,_),u,t,i,r,a,s,"polar"===c.type),T?n.attr({shape:r}):g?qS(a,f,d,n,r,t,s,!1,!1):qh(n,{shape:r},a,t),u.setItemGraphicEl(t,n),l.add(n),n.ignore=e)}).update(function(t,e){var n,i=u.getItemModel(t),r=KS[c.type](u,t,i);x&&(n=void 0,0===M.length?n=I(e):((n=M[e]).useStyle(b.getItemStyle()),"cartesian2d"===c.type&&n.setShape("r",w),S[t]=n),o=KS[c.type](u,t),jh(n,{shape:rM(s,o,c)},d,t));var o=h.getItemGraphicEl(e);if(!u.hasValue(t))return l.remove(o),void(o=null);e=!1;m&&(e=ZS[c.type](v,r))&&l.remove(o),o=o||jS[c.type](a,u,t,r,s,d,p.model,!!o,_),C||$S(o,u,t,i,r,a,s,"polar"===c.type),T?o.attr({shape:r}):g?qS(a,f,d,o,r,t,s,!0,C):jh(o,{shape:r},a,t,null),u.setItemGraphicEl(t,o),o.ignore=e,l.add(o)}).remove(function(t){var e=h.getItemGraphicEl(t);e&&Jh(e,a,t)}).execute();var A=this._backgroundGroup||(this._backgroundGroup=new Ho);A.removeAll();for(var D=0;D<S.length;++D)A.add(S[D]);l.add(A),this._backgroundEls=S,this._data=u},YS.prototype._renderLarge=function(t,e,n){this._clear(),nM(t,this.group),this._updateLargeClip(t)},YS.prototype._incrementalRenderLarge=function(t,e){this._removeBackground(),nM(e,this.group,!0)},YS.prototype._updateLargeClip=function(t){var e,n,i,r,r=t.get("clip",!0)?(e=t.coordinateSystem,n=!1,t=t,e?"polar"===e.type?dw(e,n,t):"cartesian2d"===e.type?pw(e,n,t,i,r):null:null):null;r?this.group.setClipPath(r):this.group.removeClipPath()},YS.prototype._dataSort=function(t,e){var n=[];t.each(function(t){n.push({mappedValue:e(t),ordinalNumber:t,beforeSortIndex:null})}),n.sort(function(t,e){return e.mappedValue-t.mappedValue});for(var i=0;i<n.length;++i)n[n[i].ordinalNumber].beforeSortIndex=i;return O(n,function(t){return{ordinalNumber:t.ordinalNumber,beforeSortIndex:t.beforeSortIndex}})},YS.prototype._isDataOrderChanged=function(t,e,n){if((n?n.length:0)!==t.count())return!0;for(var i=Number.MAX_VALUE,r=0;r<n.length;++r){var o=e(n[r].ordinalNumber);if(i<o)return!0;i=o}return!1},YS.prototype._updateSort=function(t,e,n,i){var r=n.scale.getCategorySortInfo();if(this._isDataOrderChanged(t,e,r))for(var o=this._dataSort(t,e),a=n.scale.getExtent(),s=a[0];s<a[1];++s)if(!r[s]||r[s].ordinalNumber!==o[s].ordinalNumber){this.removeOnRenderedListener(i);var l={type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:o};i.dispatchAction(l);break}},YS.prototype._initSort=function(e,n,t,i){t={type:"changeAxisOrder",componentType:t.dim+"Axis",isInitSort:!0,axisId:t.index,sortInfo:this._dataSort(e,function(t){return parseFloat(e.get(n?"y":"x",t))||0})};i.dispatchAction(t)},YS.prototype.remove=function(t,e){this._clear(this._model),this.removeOnRenderedListener(e)},YS.prototype.dispose=function(t,e){this.removeOnRenderedListener(e)},YS.prototype.removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},YS.prototype._clear=function(e){var t=this.group,n=this._data;e&&e.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl(function(t){Jh(t,e,Gu(t).dataIndex)})):t.removeAll(),this._data=null,this._isFirstFrame=!0},YS.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},YS.type="bar",YS);function YS(){var t=XS.call(this)||this;return t.type=YS.type,t._isFirstFrame=!0,t}var ZS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=WS(e.x,t.x),o=US(e.x+e.width,t.x+t.width),a=WS(e.y,t.y),t=US(e.y+e.height,t.y+t.height);e.x=r,e.y=a,e.width=o-r,e.height=t-a;a=e.width<0||e.height<0;return n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),a},polar:function(t,e){var n=e.r0<=e.r?1:-1;n<0&&(i=e.r,e.r=e.r0,e.r0=i);var i,r=US(e.r,t.r),t=WS(e.r0,t.r0),t=(e.r=r)-(e.r0=t)<0;return n<0&&(i=e.r,e.r=e.r0,e.r0=i),t}},jS={cartesian2d:function(t,e,n,i,r,o,a,s,l){i=new oa({shape:A({},i),z2:1});return i.__dataIndex=n,i.name="item",o&&(i.shape[r?"height":"width"]=0),i},polar:function(t,e,n,i,r,o,a,s,l){var u=i.startAngle<i.endAngle,h=new(!r&&l?BS:Ka)({shape:D({clockwise:u},i),z2:1});return h.name="item",o&&(l=r?"r":"endAngle",u={},h.shape[l]=r?0:i.startAngle,u[l]=i[l],(s?jh:qh)(h,{shape:u},o)),h}};function qS(t,e,n,i,r,o,a,s,l){var u;(n||e)&&(n=u=void 0,u=a?(n={x:r.x,width:r.width},{y:r.y,height:r.height}):(n={y:r.y,height:r.height},{x:r.x,width:r.width}),l||(s?jh:qh)(i,{shape:u},t,o,null),(s?jh:qh)(i,{shape:n},e,o))}var KS={cartesian2d:function(t,e,n){var i,e=t.getItemLayout(e),i=n?(o=e,i=(r=n).get(FS)||0,r=isNaN(o.width)?Number.MAX_VALUE:Math.abs(o.width),o=isNaN(o.height)?Number.MAX_VALUE:Math.abs(o.height),Math.min(i,r,o)):0,r=0<e.width?1:-1,o=0<e.height?1:-1;return{x:e.x+r*i/2,y:e.y+o*i/2,width:e.width-r*i,height:e.height-o*i}},polar:function(t,e,n){e=t.getItemLayout(e);return{cx:e.cx,cy:e.cy,r0:e.r0,r:e.r,startAngle:e.startAngle,endAngle:e.endAngle}}};function $S(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(HS)||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u),s||(a=a?0<r.height?"bottom":"top":0<r.width?"left":"right",pc(t,h=dc(i),{labelFetcher:o,labelDataIndex:n,defaultText:Nb(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:a}),a=t.getTextContent(),a=a,h=h,o=o.getRawValue(n),n=function(t){return zb(e,t)},a&&((a=xc(a)).prevValue=a.value,a.value=o,o=h.normal,a.valueAnimation=o.get("valueAnimation"),a.valueAnimation&&(a.precision=o.get("precision"),a.defaultInterpolatedText=n,a.statesModels=h)));var h=i.getModel(["emphasis"]);Dh(t,h.get("focus"),h.get("blurScope")),Ph(t,i),null!=(r=r).startAngle&&null!=r.endAngle&&r.startAngle===r.endAngle&&(t.style.fill="none",t.style.stroke="none",E(t.states,function(t){t.style&&(t.style.fill=t.style.stroke="none")}))}var JS,QS=function(){},tM=(l(eM,JS=_o),eM.prototype.getDefaultShape=function(){return new QS},eM.prototype.buildPath=function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__baseDimIdx,o=0;o<n.length;o+=2)i[r]=n[o+r],t.moveTo(i[0],i[1]),t.lineTo(n[o],n[o+1])},eM);function eM(t){t=JS.call(this,t)||this;return t.type="largeBar",t}function nM(t,e,n){var i=t.getData(),r=[],o=i.getLayout("valueAxisHorizontal")?1:0;r[1-o]=i.getLayout("valueAxisStart");var a,s,l,u,h=i.getLayout("largeDataIndices"),c=i.getLayout("barWidth"),p=t.getModel("backgroundStyle");t.get("showBackground",!0)&&(u=i.getLayout("largeBackgroundPoints"),(l=[])[1-o]=i.getLayout("backgroundStart"),(a=new tM({shape:{points:u},incremental:!!n,silent:!0,z2:0})).__startPoint=l,a.__baseDimIdx=o,a.__largeDataIndices=h,a.__barWidth=c,s=a,u=i,p=(l=p).get("borderColor")||l.get("color"),l=l.getItemStyle(),s.useStyle(l),s.style.fill=null,s.style.stroke=p,s.style.lineWidth=u.getLayout("barWidth"),e.add(a));n=new tM({shape:{points:i.getLayout("largePoints")},incremental:!!n});n.__startPoint=r,n.__baseDimIdx=o,n.__largeDataIndices=h,n.__barWidth=c,e.add(n),c=n,i=(e=i).getVisual("style"),c.useStyle(A({},i)),c.style.fill=null,c.style.stroke=i.fill,c.style.lineWidth=e.getLayout("barWidth"),Gu(n).seriesIndex=t.seriesIndex,t.get("silent")||(n.on("mousedown",iM),n.on("mousemove",iM))}var iM=Zg(function(t){t=function(t,e,n){var i=t.__baseDimIdx,r=1-i,o=t.shape.points,a=t.__largeDataIndices,s=Math.abs(t.__barWidth/2),l=t.__startPoint[r];GS[0]=e,GS[1]=n;for(var n=GS[i],u=GS[1-i],h=n-s,c=n+s,p=0,d=o.length/2;p<d;p++){var f=2*p,g=o[f+i],f=o[f+r];if(h<=g&&g<=c&&(l<=f?l<=u&&u<=f:f<=u&&u<=l))return a[p]}return-1}(this,t.offsetX,t.offsetY);Gu(this).dataIndex=0<=t?t:null},30,!1);function rM(t,e,n){if(fw(n,"cartesian2d")){var i=e,r=n.getArea();return{x:(t?i:r).x,y:(t?r:i).y,width:(t?i:r).width,height:(t?r:i).height}}return{cx:(r=n.getArea()).cx,cy:r.cy,r0:(t?r:e).r0,r:(t?r:e).r,startAngle:t?e.startAngle:0,endAngle:t?e.endAngle:2*Math.PI}}zg.registerClass(Tc),a_({type:"changeAxisOrder",event:"changeAxisOrder",update:"update"},function(e,t){var n=e.componentType||"series";t.eachComponent({mainType:n,query:e},function(t){e.sortInfo&&t.axis.setCategorySortInfo(e.sortInfo)})}),s_(g.VISUAL.LAYOUT,B(function(t,e){var C=Tx(e=Mx(t,e)),I={};E(e,function(t){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=bx(t),o=C[Sx(i)][r],a=o.offset,s=o.width,l=n.getOtherAxis(i),u=t.get("barMinHeight")||0;I[r]=I[r]||[],e.setLayout({bandWidth:o.bandWidth,offset:a,size:s});for(var h=e.mapDimension(l.dim),c=e.mapDimension(i.dim),p=$_(e,h),d=l.isHorizontal(),f=Dx(0,l),g=0,y=e.count();g<y;g++){var m=e.get(h,g),v=e.get(c,g),_=0<=m?"p":"n",x=f;p&&(I[r][v]||(I[r][v]={p:f,n:f}),x=I[r][v][_]);var b,w=void 0,S=void 0,M=void 0,T=void 0;d?(w=x,S=(b=n.dataToPoint([m,v]))[1]+a,M=b[0]-f,T=s,Math.abs(M)<u&&(M=(M<0?-1:1)*u),isNaN(M)||p&&(I[r][v][_]+=M)):(w=(b=n.dataToPoint([v,m]))[0]+a,S=x,M=s,T=b[1]-f,Math.abs(T)<u&&(T=(T<=0?-1:1)*u),isNaN(T)||p&&(I[r][v][_]+=T)),e.setItemLayout(g,{x:w,y:S,width:M,height:T})}})},"bar")),s_(g.VISUAL.PROGRESSIVE_LAYOUT,Yh),l_({seriesType:"bar",reset:function(t){t.getData().setVisual("legendSymbol","roundRect")}}),o_(g.PROCESSOR.STATISTIC,Dw("bar"));var oM=(aM.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},aM.prototype.containName=function(t){return 0<=this._getRawData().indexOfName(t)},aM.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},aM.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},aM);function aM(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}var sM,Yh=(l(lM,sM=Sg),lM.prototype.init=function(t){sM.prototype.init.apply(this,arguments),this.legendVisualProvider=new oM(z(this.getData,this),z(this.getRawData,this)),this._defaultLabelLine(t)},lM.prototype.mergeOption=function(){sM.prototype.mergeOption.apply(this,arguments)},lM.prototype.getInitialData=function(){return function(t,e,n){e=V(e)?{coordDimensions:e}:A({},e);var i=t.getSource(),e=Y_(i,e);return(t=new H_(e,t)).initData(i,n),t}(this,{coordDimensions:["value"],encodeDefaulter:B(pd,this)})},lM.prototype.getDataParams=function(t){var e=this.getData(),n=sM.prototype.getDataParams.call(this,t),i=[];return e.each(e.mapDimension("value"),function(t){i.push(t)}),n.percent=Xl(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},lM.prototype._defaultLabelLine=function(t){hu(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},lM.type="series.pie",lM.defaultOption={zlevel:0,z:2,legendHoverLink:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},lM);function lM(){var t=null!==sM&&sM.apply(this,arguments)||this;return t.useColorPaletteOnData=!0,t}Sg.registerClass(Yh);var uM=Math.PI/180;function hM(t,u,h,c,p,e,n,i,r,o){if(!(t.length<2)){for(var a,s=t.length,l=0;l<s;l++){"outer"===t[l].position&&"labelLine"===t[l].labelAlignTo&&(a=t[l].label.x-o,t[l].linePoints[1][0]+=a,t[l].label.x=o)}Ky(t,r,r+n)&&function(t){for(var e,n,i,r,o,a={list:[],maxY:0},s={list:[],maxY:0},l=0;l<t.length;l++){"none"===t[l].labelAlignTo&&(n=(e=t[l]).label.y>h?s:a,(i=Math.abs(e.label.y-h))>n.maxY&&(o=(r=e.label.x-u-e.len2*p)<(o=c+e.len)?Math.sqrt(i*i/(1-r*r/o/o)):o,n.rB=o,n.maxY=i),n.list.push(e))}d(a),d(s)}(t)}function d(t){for(var e=t.rB,n=e*e,i=0;i<t.list.length;i++){var r=t.list[i],o=Math.abs(r.label.y-h),a=c+r.len,a=a*a,a=Math.sqrt((1-Math.abs(o*o/n))*a);r.label.x=u+(a+r.len2)*p}}}function cM(t){return"center"===t.position}function pM(t){var T,C,I=t.getData(),A=[],D=!1,k=(t.get("minShowLabelAngle")||0)*uM,e=I.getLayout("viewRect"),L=I.getLayout("r"),P=e.width,O=e.x,n=e.y,e=e.height;function R(t){t.ignore=!0}I.each(function(t){var e,n,i,r,o,a,s,l,u,h,c=I.getItemGraphicEl(t),p=c.shape,d=c.getTextContent(),f=c.getTextGuideLine(),g=I.getItemModel(t),y=g.getModel("label"),m=y.get("position")||g.get(["emphasis","label","position"]),v=y.get("distanceToLabelLine"),_=y.get("alignTo"),x=Vl(y.get("edgeDistance"),P),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=Vl(S=w.get("length"),P),M=Vl(M=w.get("length2"),P);if(Math.abs(p.endAngle-p.startAngle)<k)return E(d.states,R),void(d.ignore=!0);!function(t){if(!t.ignore)return 1;for(var e in t.states)if(!1===t.states[e].ignore)return 1}(d)||(h=(p.startAngle+p.endAngle)/2,e=Math.cos(h),n=Math.sin(h),T=p.cx,C=p.cy,i="inside"===m||"inner"===m,l="center"===m?(o=p.cx,a=p.cy,"center"):(o=(r=(i?(p.r+p.r0)/2*e:p.r*e)+T)+3*e,a=(t=(i?(p.r+p.r0)/2*n:p.r*n)+C)+3*n,i||(g=r+e*(S+L-p.r),l=t+n*(S+L-p.r),s=g+(e<0?-1:1)*M,o="edge"===_?e<0?O+x:O+P-x:s+(e<0?-v:v),s=[[r,t],[g,a=l],[s,l]]),i?"center":"edge"===_?0<e?"right":"left":0<e?"left":"right"),h="number"==typeof(y=y.get("rotate"))?y*(Math.PI/180):y?e<0?-h+Math.PI:-h:0,D=!!h,d.x=o,d.y=a,d.rotation=h,d.setStyle({verticalAlign:"middle"}),i?(d.setStyle({align:l}),(u=d.states.select)&&(u.x+=d.x,u.y+=d.y)):((h=d.getBoundingRect().clone()).applyTransform(d.getComputedTransform()),u=(d.style.margin||0)+2.1,h.y-=u/2,h.height+=u,A.push({label:d,labelLine:f,position:m,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Mn(e,n),linePoints:s,textAlign:l,labelDistance:v,labelAlignTo:_,edgeDistance:x,bleedMargin:b,rect:h})),c.setTextConfig({inside:i}))}),!D&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p<t.length;p++){var d=t[p].label;cM(t[p])||(d.x<e?(h=Math.min(h,d.x),l.push(t[p])):(c=Math.max(c,d.x),u.push(t[p])))}for(hM(u,e,n,i,1,0,o,0,s,c),hM(l,e,n,i,-1,0,o,0,s,h),p=0;p<t.length;p++){var f,g,y,m,v=t[p],d=v.label;cM(v)||(f=v.linePoints)&&(g="edge"===v.labelAlignTo,y=v.rect.width,m=void 0,(m=g?d.x<e?f[2][0]-v.labelDistance-a-v.edgeDistance:a+r-v.edgeDistance-f[2][0]-v.labelDistance:d.x<e?d.x-a-v.bleedMargin:a+r-d.x-v.bleedMargin)<v.rect.width&&(v.label.style.width=m,"edge"===v.labelAlignTo&&(y=m)),m=f[1][0]-f[2][0],g?d.x<e?f[2][0]=a+v.edgeDistance+y+v.labelDistance:f[2][0]=a+r-v.edgeDistance-y-v.labelDistance:(d.x<e?f[2][0]=d.x+v.labelDistance:f[2][0]=d.x-v.labelDistance,f[1][0]=f[2][0]+m),f[1][1]=f[2][1]=d.y)}}(A,T,C,L,P,e,O,n);for(var i=0;i<A.length;i++){var r,o=A[i],a=o.label,s=o.labelLine,l=isNaN(a.x)||isNaN(a.y);a&&(a.setStyle({align:o.textAlign}),l&&(E(a.states,R),a.ignore=!0),(r=a.states.select)&&(r.x+=a.x,r.y+=a.y)),s&&(r=o.linePoints,l||!r?(E(s.states,R),s.ignore=!0):(Uy(r,o.minTurnAngle),function(t,e,n){if(n<=180&&0<n){n=n/180*Math.PI,Ny.fromArray(t[0]),zy.fromArray(t[1]),By.fromArray(t[2]),Mn.sub(Vy,zy,Ny),Mn.sub(Fy,By,zy);var i=Vy.len(),r=Fy.len();if(!(i<.001||r<.001))if(Vy.scale(1/i),Fy.scale(1/r),Vy.dot(e)<Math.cos(n)){i=Py(zy.x,zy.y,By.x,By.y,Ny.x,Ny.y,Gy,!1);Wy.fromArray(Gy);r=Math.PI/2,n=r+Math.acos(Fy.dot(e))-n;if(r<=n)Mn.copy(Wy,By);else{Wy.scaleAndAdd(Fy,i/Math.tan(Math.PI/2-n));n=By.x!==zy.x?(Wy.x-zy.x)/(By.x-zy.x):(Wy.y-zy.y)/(By.y-zy.y);if(isNaN(n))return;n<0?Mn.copy(Wy,zy):1<n&&Mn.copy(Wy,By)}Wy.toArray(t[1])}}}(r,o.surfaceNormal,o.maxSurfaceAngle),s.setShape({points:r}),a.__hostTarget.textGuideLineConfig={anchor:new Mn(r[0][0],r[0][1])}))}}function dM(t,e){t=t.get("borderRadius");return null==t?null:(V(t)||(t=[t,t]),{innerCornerRadius:Zn(t[0],e.r0),cornerRadius:Zn(t[1],e.r)})}var fM,gM=(l(yM,fM=Ka),yM.prototype.updateData=function(t,e,n,i){var r=this,o=t.hostModel,a=t.getItemModel(e),s=a.getModel("emphasis"),l=t.getItemLayout(e),u=A(dM(a.getModel("itemStyle"),l)||{},l);i?(r.setShape(u),"scale"===o.getShallow("animationType")?(r.shape.r=l.r0,qh(r,{shape:{r:l.r}},o,e)):null!=n?(r.setShape({startAngle:n,endAngle:n}),qh(r,{shape:{startAngle:l.startAngle,endAngle:l.endAngle}},o,e)):(r.shape.endAngle=l.startAngle,jh(r,{shape:{endAngle:l.endAngle}},o,e))):jh(r,{shape:u},o,e),r.useStyle(t.getItemVisual(e,"style")),Ph(r,a);i=(l.startAngle+l.endAngle)/2,n=o.get("selectedOffset"),u=Math.cos(i)*n,i=Math.sin(i)*n,n=a.getShallow("cursor");n&&r.attr("cursor",n),this._updateLabel(o,t,e),r.ensureState("emphasis").shape=h({r:l.r+(s.get("scale")&&s.get("scaleSize")||0)},dM(s.getModel("itemStyle"),l)),A(r.ensureState("select"),{x:u,y:i,shape:dM(a.getModel(["select","itemStyle"]),l)}),A(r.ensureState("blur"),{shape:dM(a.getModel(["blur","itemStyle"]),l)});l=r.getTextGuideLine(),r=r.getTextContent();A(l.ensureState("select"),{x:u,y:i}),A(r.ensureState("select"),{x:u,y:i}),Dh(this,s.get("focus"),s.get("blurScope"))},yM.prototype._updateLabel=function(t,e,n){var i=e.getItemModel(n),r=i.getModel("labelLine"),o=e.getItemVisual(n,"style"),a=o&&o.fill,o=o&&o.opacity;pc(this,dc(i),{labelFetcher:e.hostModel,labelDataIndex:n,inheritColor:a,defaultOpacity:o,defaultText:t.getFormattedLabel(n,"normal")||e.getName(n)});n=this.getTextContent();this.setTextConfig({position:null,rotation:null}),n.attr({z2:10}),Zy(this,jy(i),{stroke:a,opacity:tt(r.get(["lineStyle","opacity"]),o,1)})},yM);function yM(t,e,n){var i=fM.call(this)||this;i.z2=2;var r=new Ma,o=new Ss;return i.setTextGuideLine(r),i.setTextContent(o),i.updateData(t,e,n,!0),i}var mM,Yh=(l(vM,mM=zg),vM.prototype.init=function(){var t=new Ho;this._sectorGroup=t},vM.prototype.render=function(e,t,n,i){var r,o=e.getData(),a=this._data,s=this.group;if(!a&&0<o.count()){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u<o.count();++u)l=o.getItemLayout(u);l&&(r=l.startAngle)}o.diff(a).add(function(t){var e=new gM(o,t,r);o.setItemGraphicEl(t,e),s.add(e)}).update(function(t,e){e=a.getItemGraphicEl(e);e.updateData(o,t,r),e.off("click"),s.add(e),o.setItemGraphicEl(t,e)}).remove(function(t){Jh(a.getItemGraphicEl(t),e,t)}).execute(),pM(e),"expansion"!==e.get("animationTypeUpdate")&&(this._data=o)},vM.prototype.dispose=function(){},vM.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){e=t[0]-n.cx,t=t[1]-n.cy,t=Math.sqrt(e*e+t*t);return t<=n.r&&t>=n.r0}},vM.type="pie",vM);function vM(){var t=null!==mM&&mM.apply(this,arguments)||this;return t.ignoreLabelLineUpdate=!0,t}zg.registerClass(Yh);var _M,xM,bM=2*Math.PI,wM=Math.PI/180;xM=a_,E([[(_M="pie")+"ToggleSelect","toggleSelect"],[_M+"Select","select"],[_M+"UnSelect","unselect"]],function(r){xM(r[0],function(t,e,n){var i;t=A({},t),n.dispatchAction(A(t,{type:r[1],seriesIndex:(t=t,i=[],e.eachComponent({mainType:"series",subType:_M,query:t},function(t){i.push(t.seriesIndex)}),i)}))})}),s_(B(function(t,e,I){e.eachSeriesByType(t,function(t){var r=t.getData(),e=r.mapDimension("value"),n=(l=I,Bp(t.getBoxLayoutParams(),{width:l.getWidth(),height:l.getHeight()})),i=t.get("center"),o=t.get("radius");V(o)||(o=[0,o]),V(i)||(i=[i,i]);var a=Vl(n.width,I.getWidth()),s=Vl(n.height,I.getHeight()),l=Math.min(a,s),u=Vl(i[0],a)+n.x,h=Vl(i[1],s)+n.y,c=Vl(o[0],l/2),p=Vl(o[1],l/2),d=-t.get("startAngle")*wM,f=t.get("minAngle")*wM,g=0;r.each(e,function(t){isNaN(t)||g++});var y=r.getSum(e),m=Math.PI/(y||g)*2,v=t.get("clockwise"),_=t.get("roseType"),x=t.get("stillShowZeroSum"),b=r.getDataExtent(e);b[0]=0;var w,S=bM,M=0,T=d,C=v?1:-1;r.setLayout({viewRect:n,r:p}),r.each(e,function(t,e){var n,i;isNaN(t)?r.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:v,cx:u,cy:h,r0:c,r:_?NaN:p}):((n="area"!==_?0===y&&x?m:t*m:bM/g)<f?S-=n=f:M+=t,i=T+C*n,r.setItemLayout(e,{angle:n,startAngle:T,endAngle:i,clockwise:v,cx:u,cy:h,r0:c,r:_?Bl(t,b,[c,p]):p}),T=i)}),S<bM&&g&&(S<=.001?(w=bM/g,r.each(e,function(t,e){isNaN(t)||((t=r.getItemLayout(e)).angle=w,t.startAngle=d+C*e*w,t.endAngle=d+C*(e+1)*w)})):(m=S/M,T=d,r.each(e,function(t,e){isNaN(t)||(t=(e=r.getItemLayout(e)).angle===f?f:t*m,e.startAngle=T,e.endAngle=T+C*t,T+=C*t)})))})},"pie")),o_({seriesType:"pie",reset:function(t,e){var i,r=e.findComponents({mainType:"legend"});r&&r.length&&(i=t.getData()).filterSelf(function(t){for(var e=i.getName(t),n=0;n<r.length;n++)if(!r[n].isSelected(e))return!1;return!0})}});var SM,Yh=(l(MM,SM=Sg),MM.prototype.getInitialData=function(t,e){return Q_(this.getSource(),this,{useEncodeDefaulter:!0})},MM.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},MM.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},MM.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},MM.type="series.scatter",MM.dependencies=["grid","polar","geo","singleAxis","calendar"],MM.defaultOption={coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}}},MM);function MM(){var t=null!==SM&&SM.apply(this,arguments)||this;return t.type=MM.type,t.hasSymbolVisual=!0,t}Sg.registerClass(Yh);var TM,CM=function(){},IM=(l(AM,TM=_o),AM.prototype.getDefaultShape=function(){return new CM},AM.prototype.buildPath=function(t,e){var n=e.points,i=e.size,r=this.symbolProxy,o=r.shape,e=t.getContext?t.getContext():t;if(e&&i[0]<4)this._ctx=e;else{this._ctx=null;for(var a=0;a<n.length;){var s=n[a++],l=n[a++];isNaN(s)||isNaN(l)||this.softClipShape&&!this.softClipShape.contain(s,l)||(o.x=s-i[0]/2,o.y=l-i[1]/2,o.width=i[0],o.height=i[1],r.buildPath(t,o,!0))}}},AM.prototype.afterBrush=function(){var t=this.shape,e=t.points,n=t.size,i=this._ctx;if(i)for(var r=0;r<e.length;){var o=e[r++],a=e[r++];isNaN(o)||isNaN(a)||this.softClipShape&&!this.softClipShape.contain(o,a)||i.fillRect(o-n[0]/2,a-n[1]/2,n[0],n[1])}},AM.prototype.findDataIndex=function(t,e){for(var n=this.shape,i=n.points,n=n.size,r=Math.max(n[0],4),o=Math.max(n[1],4),a=i.length/2-1;0<=a;a--){var s=2*a,l=i[s]-r/2,s=i[1+s]-o/2;if(l<=t&&s<=e&&t<=l+r&&e<=s+o)return a}return-1},AM);function AM(t){return TM.call(this,t)||this}var DM=(kM.prototype.isPersistent=function(){return!this._incremental},kM.prototype.updateData=function(t,e){this.group.removeAll();var n=new IM({rectHover:!0,cursor:"default"});n.setShape({points:t.getLayout("points")}),this._setCommon(n,t,!1,e),this.group.add(n),this._incremental=null},kM.prototype.updateLayout=function(t){var i;this._incremental||(i=t.getLayout("points"),this.group.eachChild(function(t){var e,n;null!=t.startIndex&&(e=2*(t.endIndex-t.startIndex),n=4*t.startIndex*2,i=new Float32Array(i.buffer,n,e)),t.setShape("points",i)}))},kM.prototype.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),2e6<t.count()?(this._incremental||(this._incremental=new is({silent:!0})),this.group.add(this._incremental)):this._incremental=null},kM.prototype.incrementalUpdate=function(t,e,n){var i;this._incremental?(i=new IM,this._incremental.addDisplayable(i,!0)):((i=new IM({rectHover:!0,cursor:"default",startIndex:t.start,endIndex:t.end})).incremental=!0,this.group.add(i)),i.setShape({points:e.getLayout("points")}),this._setCommon(i,e,!!this._incremental,n)},kM.prototype._setCommon=function(e,t,n,i){var r=t.hostModel;i=i||{};var o=t.getVisual("symbolSize");e.setShape("size",o instanceof Array?o:[o,o]),e.softClipShape=i.clipShape||null,e.symbolProxy=Um(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor;i=e.shape.size[0]<4;e.useStyle(r.getModel("itemStyle").getItemStyle(i?["color","shadowBlur","shadowColor"]:["color"]));var a,t=t.getVisual("style"),t=t&&t.fill;t&&e.setColor(t),n||((a=Gu(e)).seriesIndex=r.seriesIndex,e.on("mousemove",function(t){a.dataIndex=null;t=e.findDataIndex(t.offsetX,t.offsetY);0<=t&&(a.dataIndex=t+(e.startIndex||0))}))},kM.prototype.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},kM.prototype._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},kM);function kM(){this.group=new Ho}var LM,Yh=(l(PM,LM=zg),PM.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},PM.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},PM.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},PM.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||1e4<i.count()||!this._symbolDraw.isPersistent())return{update:!0};n=Cw("").reset(t,e,n);n.progress&&n.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},PM.prototype._getClipShape=function(t){var e=t.coordinateSystem,e=e&&e.getArea&&e.getArea();return t.get("clip",!0)?e:null},PM.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,e=e.pipelineContext.large;return n&&e===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=new(e?DM:Xb),this._isLargeDraw=e,this.group.removeAll()),this.group.add(n.group),n},PM.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},PM.prototype.dispose=function(){},PM.type="scatter",PM);function PM(){var t=null!==LM&&LM.apply(this,arguments)||this;return t.type=PM.type,t}function OM(t,e){e&&(e.font=e.textFont||e.font,pt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),pt(e,"textAlign")&&(t.align=e.textAlign),pt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),pt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),pt(e,"textWidth")&&(t.width=e.textWidth),pt(e,"textHeight")&&(t.height=e.textHeight),pt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),pt(e,"textPadding")&&(t.padding=e.textPadding),pt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),pt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),pt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),pt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),pt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),pt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),pt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}zg.registerClass(Yh),s_(Cw("scatter"));var RM=bu(),EM={path:null,compoundPath:null,group:Ho,image:Yo,text:Ss};r_(function(t){var e=t.graphic;V(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var NM,Yh=(l(zM,NM=qp),zM.prototype.mergeOption=function(t,e){var n=this.option.elements;this.option.elements=null,NM.prototype.mergeOption.call(this,t,e),this.option.elements=n},zM.prototype.optionUpdated=function(t,e){var n=this.option,t=(e?n:t).elements,i=n.elements=e?[]:n.elements,n=[];this._flatten(t,n,null);var n=du(i,n,"normalMerge"),r=this._elOptionsToUpdate=[];E(n,function(t,e){var n=t.newOption;n&&(r.push(n),function(t,e){var n=t.existing;{e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId&&((t=e.parentOption)?e.parentId=t.id:n&&(e.parentId=n.parentId))}e.parentOption=null}(t,n),function(t,e,n){var i=A({},n),r=t[e],o=n.$action||"merge";{"merge"===o?r?(b(r,i,!0),Hp(r,i,{ignoreSize:!0}),Wp(n,r)):t[e]=i:"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}}(i,e,n),function(t,e){if(!t)return;{t.hv=e.hv=[GM(e,["left","right"]),GM(e,["top","bottom"])],"group"===t.type&&(e=e,null==(t=t).width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0))}}(i[e],n))},this);for(var o=i.length-1;0<=o;o--)null==i[o]?i.splice(o,1):delete i[o].$action},zM.prototype._flatten=function(t,n,i){E(t,function(t){var e;t&&(i&&(t.parentOption=i),n.push(t),e=t.children,"group"===t.type&&e&&this._flatten(e,n,t),delete t.children)},this)},zM.prototype.useElOptionsToUpdate=function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t},zM.type="graphic",zM.defaultOption={elements:[]},zM);function zM(){var t=null!==NM&&NM.apply(this,arguments)||this;return t.type=zM.type,t}qp.registerClass(Yh);var BM,Yh=(l(VM,BM=Pg),VM.prototype.init=function(){this._elMap=ht()},VM.prototype.render=function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},VM.prototype._updateElements=function(y){var m,v,t=y.useElOptionsToUpdate();t&&(m=this._elMap,v=this.group,E(t,function(t){var e=yu(t.id,null),n=null!=e?m.get(e):null,i=yu(t.parentId,null),r=null!=i?m.get(i):v,o=t.type,a=t.style;"text"===o&&a&&t.hv&&t.hv[1]&&(a.textVerticalAlign=a.textBaseline=a.verticalAlign=a.align=null);var s,l,u,h,c,p=t.textContent,d=t.textConfig;a&&(h=o,c=!!d,i=!!p,(u=a)&&(u.legacy||!1!==u.legacy&&!c&&!i&&"tspan"!==h&&("text"===h||pt(u,"text"))))&&(h=!0,a=u=a,"text"===(o=o)?l=a:(l={},pt(a,"text")&&(l.text=a.text),pt(a,"rich")&&(l.rich=a.rich),pt(a,"textFill")&&(l.fill=a.textFill),pt(a,"textStroke")&&(l.stroke=a.textStroke),g={type:"text",style:l,silent:!0},s={},o=pt(a,"textPosition"),h?s.position=o?a.textPosition:"inside":o&&(s.position=a.textPosition),pt(a,"textPosition")&&(s.position=a.textPosition),pt(a,"textOffset")&&(s.offset=a.textOffset),pt(a,"textRotation")&&(s.rotation=a.textRotation),pt(a,"textDistance")&&(s.distance=a.textDistance)),OM(l,u),E(l.rich,function(t){OM(t,t)}),g={textConfig:s,textContent:g},!d&&g.textConfig&&(d=t.textConfig=g.textConfig),!p&&g.textContent&&(p=g.textContent));var f,d=(f=A({},f=t),E(["id","parentId","$action","hv","bounding","textContent"].concat(Rp),function(t){delete f[t]}),f);var g=t.$action||"merge";"merge"===g?n?n.attr(d):FM(e,r,d,m):"replace"===g?(HM(n,m),FM(e,r,d,m)):"remove"===g&&HM(n,m);n=m.get(e);n&&p&&("merge"===g?(e=n.getTextContent())?e.attr(p):n.setTextContent(new Ss(p)):"replace"===g&&n.setTextContent(new Ss(p))),n&&((p=RM(n)).__ecGraphicWidthOption=t.width,p.__ecGraphicHeightOption=t.height,function(t,e,n){var i=Gu(t).eventData;t.silent||t.ignore||i||(i=Gu(t).eventData={componentType:"graphic",componentIndex:e.componentIndex,name:t.name});i&&(i.info=n.info)}(n,y,t))}))},VM.prototype._relocate=function(t,e){for(var n,i,r=t.option.elements,o=this.group,a=this._elMap,s=e.getWidth(),l=e.getHeight(),u=0;u<r.length;u++){(p=null!=(c=yu((h=r[u]).id,null))?a.get(c):null)&&p.isGroup&&(n=(d=p.parent)===o,i=RM(p),f=RM(d),i.__ecGraphicWidth=Vl(i.__ecGraphicWidthOption,n?s:f.__ecGraphicWidth)||0,i.__ecGraphicHeight=Vl(i.__ecGraphicHeightOption,n?l:f.__ecGraphicHeight)||0)}for(var h,c,p,d,f,u=r.length-1;0<=u;u--){(p=null!=(c=yu((h=r[u]).id,null))?a.get(c):null)&&(d=p.parent,f=RM(d),Vp(p,h,d===o?{width:s,height:l}:{width:f.__ecGraphicWidth,height:f.__ecGraphicHeight},null,{hv:h.hv,boundingMode:h.bounding}))}},VM.prototype._clear=function(){var e=this._elMap;e.each(function(t){HM(t,e)}),this._elMap=ht()},VM.prototype.dispose=function(){this._clear()},VM.type="graphic",VM);function VM(){var t=null!==BM&&BM.apply(this,arguments)||this;return t.type=VM.type,t}function FM(t,e,n,i){var r=n.type;r=pt(EM,r)?EM[r]:Hh(r);n=new r(n);e.add(n),i.set(t,n),RM(n).__ecGraphicId=t}function HM(t,e){var n=t&&t.parent;n&&("group"===t.type&&t.traverse(function(t){HM(t,e)}),e.removeKey(RM(t).__ecGraphicId),n.remove(t))}function GM(e,t){var n;return E(t,function(t){null!=e[t]&&"auto"!==e[t]&&(n=!0)}),n}function WM(t,e){var n=[],i=t.seriesIndex;if(null==i||!(a=e.getSeriesByIndex(i)))return{point:[]};var r=a.getData(),o=xu(r,t);if(null==o||o<0||V(o))return{point:[]};var a,s=r.getItemGraphicEl(o),e=a.coordinateSystem;return a.getTooltipPosition?n=a.getTooltipPosition(o)||[]:e&&e.dataToPoint?n=t.isStacked?(i=e.getBaseAxis(),a=e.getOtherAxis(i).dim,t=i.dim,i="x"===a||"radius"===a?1:0,a=r.mapDimension(t),(t=[])[i]=r.get(a,o),t[1-i]=r.get(r.getCalculationInfo("stackResultDimension"),o),e.dataToPoint(t)||[]):e.dataToPoint(r.getValues(O(e.dimensions,function(t){return r.mapDimension(t)}),o))||[]:s&&((o=s.getBoundingRect().clone()).applyTransform(s.transform),n=[o.x+o.width/2,o.y+o.height/2]),{point:n,el:s}}Pg.registerClass(Yh);var UM=bu();function XM(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f,g=t.axis;!g.scale.isBlank()&&g.containData(e)&&(t.involveSeries?(f=(o=(a=e,s=(d=t).axis,l=s.dim,u=a,h=[],c=Number.MAX_VALUE,p=-1,E(d.seriesModels,function(e,t){var n=e.getData().mapDimensionsAll(l);if(e.getAxisTooltipData)var i=e.getAxisTooltipData(n,a,s),r=i.dataIndices,o=i.nestestValue;else{if(!(r=e.getData().indicesOfNearest(n[0],a,"category"===s.type?.5:null)).length)return;o=e.getData().get(n[0],r[0])}null!=o&&isFinite(o)&&(i=a-o,(n=Math.abs(i))<=c&&((n<c||0<=i&&p<0)&&(c=n,p=i,u=o,h.length=0),E(r,function(t){h.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}),{payloadBatch:h,snapToValue:u})).snapToValue,(d=o.payloadBatch)[0]&&null==r.seriesIndex&&A(r,d[0]),!i&&t.snap&&g.containData(f)&&null!=f&&(e=f),n.showPointer(t,e,d),n.showTooltip(t,o,f)):n.showPointer(t,e))}function YM(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function ZM(t,e,n,i){var r,o=n.payloadBatch,a=e.axis,s=a.model,l=e.axisPointerModel;e.triggerTooltip&&o.length&&(n=jw(r=e.coordSys.model),(e=t.map[n])||(e=t.map[n]={coordSysId:r.id,coordSysIndex:r.componentIndex,coordSysType:r.type,coordSysMainType:r.mainType,dataByAxis:[]},t.list.push(e)),e.dataByAxis.push({axisDim:a.dim,axisIndex:s.componentIndex,axisType:s.type,axisId:s.id,value:i,valueLabelOpt:{precision:l.get(["label","precision"]),formatter:l.get(["label","formatter"])},seriesDataIndices:o.slice()}))}function jM(t){var e=t.axis.model,n={},t=n.axisDim=t.axis.dim;return n.axisIndex=n[t+"AxisIndex"]=e.componentIndex,n.axisName=n[t+"AxisName"]=e.name,n.axisId=n[t+"AxisId"]=e.id,n}function qM(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}var KM=bu(),$M=E;function JM(t,e,n){var i;w.node||(i=e.getZr(),KM(i).records||(KM(i).records={}),function(s,l){if(KM(s).initialized)return;function t(t,a){s.on(t,function(e){var n,i,r,o=(n=l,{dispatchAction:r=function(t){var e=i[t.type];e?e.push(t):(t.dispatchAction=r,n.dispatchAction(t))},pendings:i={showTip:[],hideTip:[]}});$M(KM(s).records,function(t){t&&a(t,e,o.dispatchAction)}),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(o.pendings,l)})}KM(s).initialized=!0,t("click",B(tT,"click")),t("mousemove",B(tT,"mousemove")),t("globalout",QM)}(i,e),(KM(i).records[t]||(KM(i).records[t]={})).handler=n)}function QM(t,e,n){t.handler("leave",null,n)}function tT(t,e,n,i){e.handler(t,n,i)}function eT(t,e){w.node||(e=e.getZr(),(KM(e).records||{})[t]&&(KM(e).records[t]=null))}var nT,Yh=(l(iT,nT=Pg),iT.prototype.render=function(t,e,n){var e=e.getComponent("tooltip"),i=t.get("triggerOn")||e&&e.get("triggerOn")||"mousemove|click";JM("axisPointer",n,function(t,e,n){"none"!==i&&("leave"===t||0<=i.indexOf(t))&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},iT.prototype.remove=function(t,e){eT("axisPointer",e)},iT.prototype.dispose=function(t,e){eT("axisPointer",e)},iT.type="axisPointer",iT);function iT(){var t=null!==nT&&nT.apply(this,arguments)||this;return t.type=iT.type,t}Pg.registerClass(Yh);var rT=bu(),oT=I,aT=z,Yh=(sT.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,i=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(i&&i.hide());a&&a.show(),i&&i.show();o={};this.makeElOption(o,r,t,e,n);i=o.graphicKey;i!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=i;i=this._moveAnimation=this.determineAnimation(t,e);a?(i=B(lT,e,i),this.updatePointerEl(a,o,i),this.updateLabelEl(a,o,i,e)):(a=this._group=new Ho,this.createPointerEl(a,o,t,e),this.createLabelEl(a,o,t,e),n.getZr().add(a)),cT(a,e,!0),this._renderHandle(r)}},sT.prototype.remove=function(t){this.clear(t)},sT.prototype.dispose=function(t){this.clear(t)},sT.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,e=e.get("snap");if(!e&&!r)return!1;if("auto"!==n&&null!=n)return!0===n;n=this.animationThreshold;if(r&&i.getBandWidth()>n)return!0;if(e){t=Yw(t).seriesDataCount,i=i.getExtent();return Math.abs(i[0]-i[1])/t>n}return!1},sT.prototype.makeElOption=function(t,e,n,i,r){},sT.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;r&&(e=rT(t).pointerEl=new lc[r.type](oT(e.pointer)),t.add(e))},sT.prototype.createLabelEl=function(t,e,n,i){e.label&&(e=rT(t).labelEl=new Ss(oT(e.label)),t.add(e),uT(e,i))},sT.prototype.updatePointerEl=function(t,e,n){t=rT(t).pointerEl;t&&e.pointer&&(t.setStyle(e.pointer.style),n(t,{shape:e.pointer.shape}))},sT.prototype.updateLabelEl=function(t,e,n,i){t=rT(t).labelEl;t&&(t.setStyle(e.label.style),n(t,{x:e.label.x,y:e.label.y}),uT(t,i))},sT.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=ac(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){Jt(t.event)},onmousedown:aT(this._onHandleDragMove,this,0,0),drift:aT(this._onHandleDragMove,this),ondragend:aT(this._onHandleDragEnd,this)}),i.add(r)),cT(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));n=o.get("size");V(n)||(n=[n,n]),r.scaleX=n[0]/2,r.scaleY=n[1]/2,jg(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},sT.prototype._moveHandleToValue=function(t,e){lT(this._axisPointerModel,!e&&this._moveAnimation,this._handle,hT(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},sT.prototype._onHandleDragMove=function(t,e){var n=this._handle;n&&(this._dragging=!0,e=this.updateHandleTransform(hT(n),[t,e],this._axisModel,this._axisPointerModel),this._payloadInfo=e,n.stopAnimation(),n.attr(hT(e)),rT(n).lastProp=null,this._doDispatchAxisPointer())},sT.prototype._doDispatchAxisPointer=function(){var t,e;this._handle&&(t=this._payloadInfo,e=this._axisModel,this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]}))},sT.prototype._onHandleDragEnd=function(){var t;this._dragging=!1,this._handle&&(t=this._axisPointerModel.get("value"),this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"}))},sT.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,t=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),t&&e.remove(t),this._group=null,this._handle=null,this._payloadInfo=null)},sT.prototype.doClear=function(){},sT.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},sT);function sT(){this._dragging=!1,this.animationThreshold=15}function lT(t,e,n,i){!function n(i,t){{if(U(i)&&U(t)){var r=!0;return E(t,function(t,e){r=r&&n(i[e],t)}),!!r}return i===t}}(rT(n).lastProp,i)&&(rT(n).lastProp=i,e?jh(n,i,t):(n.stopAnimation(),n.attr(i)))}function uT(t,e){t[e.get(["label","show"])?"show":"hide"]()}function hT(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function cT(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)})}function pT(t,e,n,i,r){var o=dT(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=bp(a.get("padding")||0),l=a.getFont(),u=Wn(o,l),h=r.position,c=u.width+s[1]+s[3],n=u.height+s[0]+s[2],u=r.align;"right"===u&&(h[0]-=c),"center"===u&&(h[0]-=c/2);u=r.verticalAlign;"bottom"===u&&(h[1]-=n),"middle"===u&&(h[1]-=n/2),r=h,u=c,c=n,i=(n=i).getWidth(),n=n.getHeight(),r[0]=Math.min(r[0]+u,i)-u,r[1]=Math.min(r[1]+c,n)-c,r[0]=Math.max(r[0],0),r[1]=Math.max(r[1],0);r=a.get("backgroundColor");r&&"auto"!==r||(r=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:fc(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:r}),z2:10}}function dT(t,e,n,i,r){t=e.scale.parse(t);var o,a=e.scale.getLabel({value:t},{precision:r.precision}),r=r.formatter;return r&&(o={value:ib(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]},E(i,function(t){var e=n.getSeriesByIndex(t.seriesIndex),t=t.dataIndexInside,t=e&&e.getDataParams(t);t&&o.seriesData.push(t)}),H(r)?a=r.replace("{value}",a):F(r)&&(a=r(o))),a}function fT(t,e,n){var i=ge();return xe(i,i,n.rotation),_e(i,i,n.position),ec([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}var gT,Yh=(l(yT,gT=Yh),yT.prototype.makeElOption=function(t,e,n,i,r){var o,a,s=n.axis,l=s.grid,u=i.get("type"),h=mT(l,s).getOtherAxis(s).getGlobalExtent(),c=s.toGlobalCoord(s.dataToCoord(e,!0));u&&"none"!==u&&(a=(o=i).get("type"),o=o.getModel(a+"Style"),"line"===a?(p=o.getLineStyle()).fill=null:"shadow"===a&&((p=o.getAreaStyle()).stroke=null),o=p,(p=vT[u](s,c,h)).style=o,t.graphicKey=p.type,t.pointer=p);var p=Jw(l.model,n);l=e,e=t,t=p,p=n,n=i,i=r,r=zw.innerTextLayout(t.rotation,0,t.labelDirection),t.labelMargin=n.get(["label","margin"]),pT(e,p,n,i,{position:fT(p.axis,l,t),align:r.textAlign,verticalAlign:r.textVerticalAlign})},yT.prototype.getHandleTransform=function(t,e,n){var i=Jw(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);t=fT(e.axis,t,i);return{x:t[0],y:t[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},yT.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),n=mT(o,r).getOtherAxis(r).getGlobalExtent(),o="x"===r.dim?0:1,r=[t.x,t.y];r[o]+=e[o],r[o]=Math.min(a[1],r[o]),r[o]=Math.max(a[0],r[o]);n=(n[1]+n[0])/2,n=[n,n];n[o]=r[o];return{x:r[0],y:r[1],rotation:t.rotation,cursorPoint:n,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][o]}},yT);function yT(){return null!==gT&&gT.apply(this,arguments)||this}function mT(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var vT={line:function(t,e,n){var i;return{type:"Line",subPixelOptimize:!0,shape:(i=[e,n[0]],n=[e,n[1]],t=_T(t),{x1:i[t=t||0],y1:i[1-t],x2:n[t],y2:n[1-t]})}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:(n=[e-i/2,n[0]],r=[i,r],t=_T(t),{x:n[t=t||0],y:n[1-t],width:r[t],height:r[1-t]})}}};function _T(t){return"x"===t.dim?0:1}nl.registerAxisPointerClass("CartesianAxisPointer",Yh);var xT,nl=(l(bT,xT=qp),bT.type="axisPointer",bT.defaultOption={show:"auto",zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},bT);function bT(){var t=null!==xT&&xT.apply(this,arguments)||this;return t.type=bT.type,t}qp.registerClass(nl),r_(function(t){var e;t&&(t.axisPointer&&0!==t.axisPointer.length||(t.axisPointer={}),(e=t.axisPointer.link)&&!V(e)&&(t.axisPointer.link=[e]))}),o_(g.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=Uw(t,e)}),a_({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,n){var i=t.currTrigger,o=[t.x,t.y],r=t,a=t.dispatchAction||z(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){qM(o)&&(o=WM({seriesIndex:r.seriesIndex,dataIndex:r.dataIndex},e).point);var l=qM(o),u=r.axesInfo,h=s.axesInfo,c="leave"===i||qM(o),p={},d={},r={list:[],map:{}},f={showPointer:B(YM,d),showTooltip:B(ZM,r)};E(s.coordSysMap,function(t,e){var r=l||t.containPoint(o);E(s.coordSysAxesInfo[e],function(t,e){var n=t.axis,i=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);c||!r||u&&!i||(null!=(i=i&&i.value)||l||(i=n.pointToData(o)),null!=i&&XM(t,i,f,!1,p))})});var g,y,m={};return E(h,function(n,t){var i=n.linkGroup;i&&!d[t]&&E(i.axesInfo,function(t,e){e=d[e];t!==n&&e&&(e=e.value,i.mapper&&(e=n.axis.scale.parse(i.mapper(e,jM(t),jM(n)))),m[n.key]=e)})}),E(m,function(t,e){XM(h[e],t,f,!0,p)}),g=d,i=h,y=p.axesInfo=[],E(i,function(t,e){var n=t.axisPointerModel.option,e=g[e];e?(t.useHandle||(n.status="show"),n.value=e.value,n.seriesDataIndices=(e.payloadBatch||[]).slice()):t.useHandle||(n.status="hide"),"show"===n.status&&y.push({axisDim:t.axis.dim,axisIndex:t.axis.model.componentIndex,value:n.value})}),function(t,e,n,i){if(qM(e)||!t.list.length)return i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(r,o,t,a),function(t,e){var n=e.getZr(),i="axisPointerLastHighlights",r=UM(n)[i]||{},o=UM(n)[i]={};E(t,function(t,e){t=t.axisPointerModel.option;"show"===t.status&&E(t.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;o[e]=t})});var a=[],s=[];E(r,function(t,e){o[e]||s.push(t)}),E(o,function(t,e){r[e]||a.push(t)}),s.length&&e.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:s}),a.length&&e.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:a})}(h,n),p}});var wT,Yh=(l(ST,wT=qp),ST.type="tooltip",ST.dependencies=["axisPointer"],ST.defaultOption={zlevel:0,z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderColor:"#333",borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},ST);function ST(){var t=null!==wT&&wT.apply(this,arguments)||this;return t.type=ST.type,t}function MT(t){var e=t.get("confine");return null!=e?e:"richText"===t.get("renderMode")}qp.registerClass(Yh);var TT=["-ms-","-moz-","-o-","-webkit-",""];function CT(i,t,e){var n,r=[],o=i.get("transitionDuration"),a=i.get("backgroundColor"),s=i.get("shadowBlur"),l=i.get("shadowColor"),u=i.get("shadowOffsetX"),h=i.get("shadowOffsetY"),c=i.getModel("textStyle"),p=yg(i,"html"),l=u+"px "+h+"px "+s+"px "+l;return r.push("box-shadow:"+l),t&&o&&r.push((n="opacity "+(t=o)/2+"s "+(o="cubic-bezier(0.23, 1, 0.32, 1)")+",visibility "+t/2+"s "+o,e||(n+=",left "+t+"s "+o+",top "+t+"s "+o),O(TT,function(t){return t+"transition:"+n}).join(";"))),a&&(w.canvasSupported?r.push("background-Color:"+a):(r.push("background-Color:#"+en(a)),r.push("filter:alpha(opacity=70)"))),E(["width","color","radius"],function(t){var e="border-"+t,n=xp(e),n=i.get(n);null!=n&&r.push(e+":"+n+("color"===t?"":"px"))}),r.push(function(n){var i=[],t=n.get("fontSize");(o=n.getTextColor())&&i.push("color:"+o),i.push("font:"+n.getFont()),t&&i.push("line-height:"+Math.round(3*t/2)+"px");var e=n.get("textShadowColor"),r=n.get("textShadowBlur")||0,o=n.get("textShadowOffsetX")||0,t=n.get("textShadowOffsetY")||0;return e&&r&&i.push("text-shadow:"+o+"px "+t+"px "+r+"px "+e),E(["decoration","align"],function(t){var e=n.get(t);e&&i.push("text-"+t+":"+e)}),i.join(";")}(c)),null!=p&&r.push("padding:"+bp(p).join("px ")+"px"),r.join(";")+";"}function IT(t,e,n,i,r){var o,a,s=e&&e.painter;n?(a=s&&s.getViewportRoot())&&(o=t,n=a,a=document.body,Gt(Ht,n,i,r,!0)&&Gt(o,a,Ht[0],Ht[1])):(t[0]=i,t[1]=r,(s=s&&s.getViewportRootOffset())&&(t[0]+=s.offsetLeft,t[1]+=s.offsetTop)),t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var AT=(DT.prototype.update=function(t){var e=this._container,n=e.currentStyle||document.defaultView.getComputedStyle(e),e=e.style;"absolute"!==e.position&&"absolute"!==n.position&&(e.position="relative"),t.get("alwaysShowContent")&&this._moveIfResized(),this.el.className=t.get("className")||""},DT.prototype.show=function(t,e){clearTimeout(this._hideTimeout),clearTimeout(this._longHideTimeout);var n=this.el,i=this._styleCoord,r=n.offsetHeight/2;e=kp(e),n.style.cssText="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+CT(t,!this._firstShow,this._longHide)+";left:"+i[0]+"px;top:"+(i[1]-r)+"px;border-color: "+e+";"+(t.get("extraCssText")||""),n.style.display=n.innerHTML?"block":"none",n.style.pointerEvents=this._enterable?"auto":"none",this._show=!0,this._firstShow=!1,this._longHide=!1},DT.prototype.setContent=function(t,e,n,i,r){if(null!=t){var o=this.el;if(H(r)&&"item"===n.get("trigger")&&!MT(n)&&(t+=function(t,e,n){if(!H(n)||"inside"===n)return"";e=kp(e);var n=i="left"===(i=n)?"right":"right"===i?"left":"top"===i?"bottom":"top",i="",r="",r=-1<L(["left","right"],n)?(i=n+":-6px;top:50%;","translateY(-50%) rotate("+("left"==n?-225:-45)+"deg)"):(i=n+":-6px;left:50%;","translateX(-50%) rotate("+("top"==n?225:45)+"deg)");return'<div style="'+["position:absolute;width:10px;height:10px;",""+i+(r=O(TT,function(t){return t+"transform:"+r}).join(";"))+";","border-bottom: "+e+" solid 1px;","border-right: "+e+" solid 1px;","background-color: "+t+";","box-shadow: 8px 8px 16px -3px #000;"].join("")+'"></div>'}(n.get("backgroundColor"),i,r)),H(t))o.innerHTML=t;else if(t){o.innerHTML="",V(t)||(t=[t]);for(var a=0;a<t.length;a++)Z(t[a])&&t[a].parentNode!==o&&o.appendChild(t[a])}}},DT.prototype.setEnterable=function(t){this._enterable=t},DT.prototype.getSize=function(){var t=this.el;return[t.clientWidth,t.clientHeight]},DT.prototype.moveTo=function(t,e){var n=this._styleCoord;IT(n,this._zr,this._appendToBody,t,e),null!=n[0]&&null!=n[1]&&((e=this.el.style).left=n[0].toFixed(0)+"px",e.top=n[1].toFixed(0)+"px")},DT.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},DT.prototype.hide=function(){var t=this;this.el.style.visibility="hidden",this.el.style.opacity="0",this._show=!1,this._longHideTimeout=setTimeout(function(){return t._longHide=!0},500)},DT.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(z(this.hide,this),t)):this.hide())},DT.prototype.isShow=function(){return this._show},DT.prototype.dispose=function(){this.el.parentNode.removeChild(this.el)},DT.prototype.getOuterSize=function(){var t,e=this.el.clientWidth,n=this.el.clientHeight;return document.defaultView&&document.defaultView.getComputedStyle&&((t=document.defaultView.getComputedStyle(this.el))&&(e+=parseInt(t.borderLeftWidth,10)+parseInt(t.borderRightWidth,10),n+=parseInt(t.borderTopWidth,10)+parseInt(t.borderBottomWidth,10))),{width:e,height:n}},DT);function DT(t,e,n){if(this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._firstShow=!0,this._longHide=!0,w.wxa)return null;var i=document.createElement("div");i.domBelongToZr=!0,this.el=i;var r=this._zr=e.getZr(),n=this._appendToBody=n&&n.appendToBody;IT(this._styleCoord,r,n,e.getWidth()/2,e.getHeight()/2),(n?document.body:t).appendChild(i),this._container=t;var o=this;i.onmouseenter=function(){o._enterable&&(clearTimeout(o._hideTimeout),o._show=!0),o._inContent=!0},i.onmousemove=function(t){var e;t=t||window.event,o._enterable||(e=r.handler,Kt(r.painter.getViewportRoot(),t,!0),e.dispatch("mousemove",t))},i.onmouseleave=function(){o._inContent=!1,o._enterable&&o._show&&o.hideLater(o._hideDelay)}}var kT=(LT.prototype.update=function(t){t.get("alwaysShowContent")&&this._moveIfResized()},LT.prototype.show=function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.show(),this._show=!0},LT.prototype.setContent=function(t,e,n,i,r){U(t)&&au(""),this.el&&this._zr.remove(this.el);var o=n.getModel("textStyle");this.el=new Ss({style:{rich:e.richTextStyles,text:t,lineHeight:22,backgroundColor:n.get("backgroundColor"),borderRadius:n.get("borderRadius"),borderWidth:1,borderColor:i,shadowColor:n.get("shadowColor"),shadowBlur:n.get("shadowBlur"),shadowOffsetX:n.get("shadowOffsetX"),shadowOffsetY:n.get("shadowOffsetY"),textShadowColor:o.get("textShadowColor"),textShadowBlur:o.get("textShadowBlur")||0,textShadowOffsetX:o.get("textShadowOffsetX")||0,textShadowOffsetY:o.get("textShadowOffsetY")||0,fill:n.get(["textStyle","color"]),padding:yg(n,"richText"),verticalAlign:"top",align:"left"},z:n.get("z")}),this._zr.add(this.el);var a=this;this.el.on("mouseover",function(){a._enterable&&(clearTimeout(a._hideTimeout),a._show=!0),a._inContent=!0}),this.el.on("mouseout",function(){a._enterable&&a._show&&a.hideLater(a._hideDelay),a._inContent=!1})},LT.prototype.setEnterable=function(t){this._enterable=t},LT.prototype.getSize=function(){var t=this.el,e=this.el.getBoundingRect(),t=OT(t.style);return[e.width+t.left+t.right,e.height+t.top+t.bottom]},LT.prototype.moveTo=function(t,e){var n,i,r=this.el;r&&(RT(n=this._styleCoord,this._zr,t,e),t=n[0],e=n[1],n=PT((i=r.style).borderWidth||0),i=OT(i),r.x=t+n+i.left,r.y=e+n+i.top,r.markRedraw())},LT.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},LT.prototype.hide=function(){this.el&&this.el.hide(),this._show=!1},LT.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(z(this.hide,this),t)):this.hide())},LT.prototype.isShow=function(){return this._show},LT.prototype.getOuterSize=function(){var t=this.getSize();return{width:t[0],height:t[1]}},LT.prototype.dispose=function(){this._zr.remove(this.el)},LT);function LT(t){this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._zr=t.getZr(),RT(this._styleCoord,this._zr,t.getWidth()/2,t.getHeight()/2)}function PT(t){return Math.max(0,t)}function OT(t){var e=PT(t.shadowBlur||0),n=PT(t.shadowOffsetX||0),t=PT(t.shadowOffsetY||0);return{left:PT(e-n),right:PT(e+n),top:PT(e-t),bottom:PT(e+t)}}function RT(t,e,n,i){t[0]=n,t[1]=i,t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var ET,NT=z,zT=E,BT=Vl,VT=new oa({shape:{x:-1,y:-1,width:2,height:2}}),nl=(l(FT,ET=Pg),FT.prototype.init=function(t,e){var n;w.node||(t=(n=t.getComponent("tooltip")).get("renderMode"),this._renderMode="auto"===(t=t)?w.domSupported?"html":"richText":t||"html",this._tooltipContent="richText"===this._renderMode?new kT(e):new AT(e.getDom(),e,{appendToBody:n.get("appendToBody",!0)}))},FT.prototype.render=function(t,e,n){w.node||(this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._alwaysShowContent=t.get("alwaysShowContent"),(n=this._tooltipContent).update(t),n.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow())},FT.prototype._initGlobalListener=function(){var i=this._tooltipModel.get("triggerOn");JM("itemTooltip",this._api,NT(function(t,e,n){"none"!==i&&(0<=i.indexOf(t)?this._tryShow(e,n):"leave"===t&&this._hide(n))},this))},FT.prototype._keepShow=function(){var t,e=this._tooltipModel,n=this._ecModel,i=this._api;null!=this._lastX&&null!=this._lastY&&"none"!==e.get("triggerOn")&&(t=this,clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){i.isDisposed()||t.manuallyShowTip(e,n,i,{x:t._lastX,y:t._lastY,dataByCoordSys:t._lastDataByCoordSys})}))},FT.prototype.manuallyShowTip=function(t,e,n,i){var r,o,a;i.from===this.uid||w.node||(r=GT(i,n),this._ticket="",a=i.dataByCoordSys,i.tooltip&&null!=i.x&&null!=i.y?((o=VT).x=i.x,o.y=i.y,o.update(),o.tooltip=i.tooltip,this._tryShow({offsetX:i.x,offsetY:i.y,target:o},r)):a?this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},r):null!=i.seriesIndex?this._manuallyAxisShowTip(t,e,n,i)||(t=(a=WM(i,e)).point[0],e=a.point[1],null!=t&&null!=e&&this._tryShow({offsetX:t,offsetY:e,position:i.position,target:a.el},r)):null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},r)))},FT.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(GT(i,n))},FT.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){e=e.getSeriesByIndex(r);if(e)if("axis"===HT([e.getData().getItemModel(o),e,(e.coordinateSystem||{}).model,t]).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},FT.prototype._tryShow=function(t,e){var n,i=t.target;this._tooltipModel&&(this._lastX=t.offsetX,this._lastY=t.offsetY,(n=t.dataByCoordSys)&&n.length?this._showAxisTooltip(n,t):i&&zm(i,function(t){return null!=Gu(t).dataIndex})?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,i,e)):i&&i.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,i,e)):(this._lastDataByCoordSys=null,this._hide(e)))},FT.prototype._showOrMove=function(t,e){t=t.get("showDelay");e=z(e,this),clearTimeout(this._showTimout),0<t?this._showTimout=setTimeout(e,t):e()},FT.prototype._showAxisTooltip=function(t,e){var l=this._ecModel,n=this._tooltipModel,i=[e.offsetX,e.offsetY],r=HT([e.tooltipOption,n]),u=this._renderMode,h=[],c=ug("section",{blocks:[],noHeader:!0}),p=[],d=new mg;zT(t,function(t){zT(t.dataByAxis,function(i){var r,o,a=l.getComponent(i.axisDim+"Axis",i.axisIndex),s=i.value;a&&null!=s&&(r=dT(s,a.axis,l,i.seriesDataIndices,i.valueLabelOpt),o=ug("section",{header:r,noHeader:!rt(r),sortBlocks:!0,blocks:[]}),c.blocks.push(o),E(i.seriesDataIndices,function(t){var e=l.getSeriesByIndex(t.seriesIndex),n=t.dataIndexInside,t=e.getDataParams(n);t.axisDim=i.axisDim,t.axisIndex=i.axisIndex,t.axisType=i.axisType,t.axisId=i.axisId,t.axisValue=ib(a.axis,{value:s}),t.axisValueLabel=r,t.marker=d.makeTooltipMarker("item",kp(t.color),u);n=Af(e.formatTooltip(n,!0,null));n.markupFragment&&o.blocks.push(n.markupFragment),n.markupText&&p.push(n.markupText),h.push(t)}))})}),c.blocks.reverse(),p.reverse();var o=e.position,e=r.get("order"),e=pg(c,d,u,e,l.get("useUTC"));e&&p.unshift(e);var e="richText"===u?"\n\n":"<br/>",a=p.join(e);this._showOrMove(r,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(r,o,i[0],i[1],this._tooltipContent,h):this._showTooltipContent(r,a,h,Math.random()+"",i[0],i[1],o,null,d)})},FT.prototype._showSeriesItemTooltip=function(t,e,n){var i,r,o,a,s=zm(e,function(t){return null!=Gu(t).dataIndex}),l=this._ecModel,u=Gu(s),h=u.seriesIndex,c=l.getSeriesByIndex(h),p=u.dataModel||c,d=u.dataIndex,e=u.dataType,s=p.getData(e),u=this._renderMode,f=HT([s.getItemModel(d),p,c&&(c.coordinateSystem||{}).model,this._tooltipModel]),c=f.get("trigger");null!=c&&"item"!==c||(i=p.getDataParams(d,e),r=new mg,i.marker=r.makeTooltipMarker("item",kp(i.color),u),c=Af(p.formatTooltip(d,!1,e)),e=f.get("order"),o=c.markupFragment?pg(c.markupFragment,r,u,e,l.get("useUTC")):c.markupText,a="item_"+p.name+"_"+d,this._showOrMove(f,function(){this._showTooltipContent(f,o,i,a,t.offsetX,t.offsetY,t.position,t.target,r)}),n({type:"showTip",dataIndexInside:d,dataIndex:s.getRawIndex(d),seriesIndex:h,from:this.uid}))},FT.prototype._showComponentItemTooltip=function(t,e,n){var i=e.tooltip;H(i)&&(i={content:i,formatter:i});var r=new Ec(i,this._tooltipModel,this._ecModel),o=r.get("content"),a=Math.random()+"",s=new mg;this._showOrMove(r,function(){this._showTooltipContent(r,o,r.get("formatterParams")||{},a,t.offsetX,t.offsetY,t.position,e,s)}),n({type:"showTip",from:this.uid})},FT.prototype._showTooltipContent=function(n,t,i,e,r,o,a,s,l){var u,h,c,p,d;this._ticket="",n.get("showContent")&&n.get("show")&&(u=this._tooltipContent,h=n.get("formatter"),a=a||n.get("position"),p=t,c=this._getNearestPoint([r,o],i,n.get("trigger")),h&&H(h)?(d=n.ecModel.get("useUTC"),p=h,(t=V(i)?i[0]:i)&&t.axisType&&0<=t.axisType.indexOf("time")&&(p=ip(t.axisValue,p,d)),p=Ap(p,i,!0)):F(h)&&(d=NT(function(t,e){t===this._ticket&&(u.setContent(e,l,n,c.color,a),this._updatePosition(n,a,r,o,u,i,s))},this),this._ticket=e,p=h(i,e,d)),u.setContent(p,l,n,c.color,a),u.show(n,c.color),this._updatePosition(n,a,r,o,u,i,s))},FT.prototype._getNearestPoint=function(t,e,n){return"axis"===n||V(e)?{color:"html"===this._renderMode?"#fff":"none"}:V(e)?void 0:{color:e.color||e.borderColor}},FT.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u,h=r.getSize(),c=t.get("align"),p=t.get("verticalAlign"),d=a&&a.getBoundingRect().clone();a&&d.applyTransform(a.transform),F(e)&&(e=e([n,i],o,r.el,d,{viewSize:[s,l],contentSize:h.slice()})),V(e)?(n=BT(e[0],s),i=BT(e[1],l)):U(e)?((o=e).width=h[0],o.height=h[1],n=(o=Bp(o,{width:s,height:l})).x,i=o.y,p=c=null):i=(n=(u=H(e)&&a?function(t,e,n){var i=n[0],r=n[1],o=0,a=0,s=e.width,n=e.height;switch(t){case"inside":o=e.x+s/2-i/2,a=e.y+n/2-r/2;break;case"top":o=e.x+s/2-i/2,a=e.y-r-10;break;case"bottom":o=e.x+s/2-i/2,a=e.y+n+10;break;case"left":o=e.x-i-10-5,a=e.y+n/2-r/2;break;case"right":o=e.x+s+10+5,a=e.y+n/2-r/2}return[o,a]}(e,d,h):function(t,e,n,i,r,o,a){var s=n.getOuterSize(),n=s.width,s=s.height;null!=o&&(i<t+n+o+2?t-=n+o:t+=o);null!=a&&(r<e+s+a?e-=s+a:e+=a);return[t,e]}(n,i,r,s,l,c?null:20,p?null:20))[0],u[1]),c&&(n-=WT(c)?h[0]/2:"right"===c?h[0]:0),p&&(i-=WT(p)?h[1]/2:"bottom"===p?h[1]:0),MT(t)&&(n=(u=(c=n,p=i,h=s,t=l,s=(l=(s=r).getOuterSize()).width,l=l.height,c=Math.min(c+s,h)-s,p=Math.min(p+l,t)-l,c=Math.max(c,0),p=Math.max(p,0),[c,p]))[0],i=u[1]),r.moveTo(n,i)},FT.prototype._updateContentNotChangedOnAxis=function(n){var t=this._lastDataByCoordSys,o=!!t&&t.length===n.length;return o&&zT(t,function(t,e){var t=t.dataByAxis||[],r=(n[e]||{}).dataByAxis||[];(o=o&&t.length===r.length)&&zT(t,function(t,e){var n=r[e]||{},e=t.seriesDataIndices||[],i=n.seriesDataIndices||[];(o=o&&t.value===n.value&&t.axisType===n.axisType&&t.axisId===n.axisId&&e.length===i.length)&&zT(e,function(t,e){e=i[e];o=o&&t.seriesIndex===e.seriesIndex&&t.dataIndex===e.dataIndex})})}),this._lastDataByCoordSys=n,!!o},FT.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},FT.prototype.dispose=function(t,e){w.node||(this._tooltipContent.dispose(),eT("itemTooltip",e))},FT.type="tooltip",FT);function FT(){var t=null!==ET&&ET.apply(this,arguments)||this;return t.type=FT.type,t}function HT(t){for(var e=t.pop();t.length;){var n=t.pop();n&&(n instanceof Ec&&(n=n.get("tooltip",!0)),H(n)&&(n={formatter:n}),e=new Ec(n,e,e.ecModel))}return e}function GT(t,e){return t.dispatchAction||z(e.dispatchAction,e)}function WT(t){return"center"===t||"middle"===t}Pg.registerClass(nl),a_({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),a_({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){});var UT,Yh=(l(XT,UT=qp),XT.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{},this._updateSelector(t)},XT.prototype.mergeOption=function(t,e){UT.prototype.mergeOption.call(this,t,e),this._updateSelector(t)},XT.prototype._updateSelector=function(t){var n=t.selector,i=this.ecModel;!0===n&&(n=t.selector=["all","inverse"]),V(n)&&E(n,function(t,e){H(t)&&(t={type:t}),n[e]=b(t,(e=i,"all"===(t=t.type)?{type:"all",title:e.getLocale(["legend","selector","all"])}:"inverse"===t?{type:"inverse",title:e.getLocale(["legend","selector","inverse"])}:void 0))})},XT.prototype.optionUpdated=function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}e||this.select(t[0].get("name"))}},XT.prototype._updateData=function(i){var r=[],o=[];i.eachRawSeries(function(t){var e,n=t.name;o.push(n),t.legendVisualProvider?(n=t.legendVisualProvider.getAllNames(),i.isSeriesFiltered(t)||(o=o.concat(n)),n.length?r=r.concat(n):e=!0):e=!0,e&&mu(t)&&r.push(t.name)}),this._availableNames=o;var t=O(this.get("data")||r,function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new Ec(t,this,this.ecModel)},this);this._data=t},XT.prototype.getData=function(){return this._data},XT.prototype.select=function(t){var e=this.option.selected;"single"===this.get("selectedMode")&&E(this._data,function(t){e[t.get("name")]=!1}),e[t]=!0},XT.prototype.unSelect=function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},XT.prototype.toggleSelected=function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},XT.prototype.allSelect=function(){var t=this._data,e=this.option.selected;E(t,function(t){e[t.get("name",!0)]=!0})},XT.prototype.inverseSelect=function(){var t=this._data,e=this.option.selected;E(t,function(t){t=t.get("name",!0);e.hasOwnProperty(t)||(e[t]=!0),e[t]=!e[t]})},XT.prototype.isSelected=function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&0<=L(this._availableNames,t)},XT.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},XT.type="legend.plain",XT.dependencies=["series"],XT.defaultOption={zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",itemStyle:{borderWidth:0},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:" sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},XT);function XT(){var t=null!==UT&&UT.apply(this,arguments)||this;return t.type=XT.type,t.layoutMode={type:"box",ignoreSize:!0},t}function YT(t,e,n){var i,r={},o="toggleSelected"===t;return n.eachComponent("legend",function(n){o&&null!=i?n[i?"select":"unSelect"](e.name):"allSelect"===t||"inverseSelect"===t?n[t]():(n[t](e.name),i=n.isSelected(e.name)),E(n.getData(),function(t){var e=t.get("name");"\n"!==e&&""!==e&&(t=n.isSelected(e),r.hasOwnProperty(e)?r[e]=r[e]&&t:r[e]=t)})}),"allSelect"===t||"inverseSelect"===t?{selected:r}:{name:e.name,selected:r}}function ZT(t,e){var n=bp(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new oa({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}qp.registerClass(Yh),a_("legendToggleSelect","legendselectchanged",B(YT,"toggleSelected")),a_("legendAllSelect","legendselectall",B(YT,"allSelect")),a_("legendInverseSelect","legendinverseselect",B(YT,"inverseSelect")),a_("legendSelect","legendselected",B(YT,"select")),a_("legendUnSelect","legendunselected",B(YT,"unSelect"));var jT,qT=B,KT=E,$T=Ho,nl=(l(JT,jT=Pg),JT.prototype.init=function(){this.group.add(this._contentGroup=new $T),this.group.add(this._selectorGroup=new $T),this._isFirstRender=!0},JT.prototype.getContentGroup=function(){return this._contentGroup},JT.prototype.getSelectorGroup=function(){return this._selectorGroup},JT.prototype.render=function(t,e,n){var i,r,o,a,s,l=this._isFirstRender;this._isFirstRender=!1,this.resetInner(),t.get("show",!0)&&(i=t.get("align"),s=t.get("orient"),i&&"auto"!==i||(i="right"===t.get("left")&&"vertical"===s?"right":"left"),r=t.get("selector",!0),a=t.get("selectorPosition",!0),!r||a&&"auto"!==a||(a="horizontal"===s?"end":"start"),this.renderInner(i,t,e,n,r,s,a),n=Bp(o=t.getBoxLayoutParams(),e={width:n.getWidth(),height:n.getHeight()},s=t.get("padding")),s=Bp(D({width:(a=this.layoutInner(t,i,n,l,r,a)).width,height:a.height},o),e,s),this.group.x=s.x-a.x,this.group.y=s.y-a.y,this.group.markRedraw(),this.group.add(this._backgroundEl=ZT(a,t)))},JT.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},JT.prototype.renderInner=function(u,h,c,p,t,e,n){var d=this.getContentGroup(),f=ht(),g=h.get("selectedMode"),y=[];c.eachRawSeries(function(t){t.get("legendHoverLink")||y.push(t.id)}),KT(h.getData(),function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var t=new $T;return t.newline=!0,void d.add(t)}var e,n,i,s,l=c.getSeriesByName(a)[0];f.get(a)||(l?(e=(i=(s=l.getData()).getVisual("style"))[s.getVisual("drawType")]||i.fill,n=i.stroke,t=i.decal,i=s.getVisual("legendSymbol")||"roundRect",s=s.getVisual("symbol"),this._createItem(a,o,r,h,i,s,u,e,n,t,g).on("click",qT(tC,a,null,p,y)).on("mouseover",qT(nC,l.name,null,p,y)).on("mouseout",qT(iC,l.name,null,p,y)),f.set(a,!0)):c.eachRawSeries(function(t){var e,n,i;f.get(a)||!t.legendVisualProvider||(e=t.legendVisualProvider).containName(a)&&(n=e.indexOfName(a),t=(i=e.getItemVisual(n,"style")).stroke,e=i.decal,n=i.fill,(i=Je(i.fill))&&0===i[3]&&(i[3]=.2,n=an(i,"rgba")),this._createItem(a,o,r,h,"roundRect",null,u,n,t,e,g).on("click",qT(tC,null,a,p,y)).on("mouseover",qT(nC,null,a,p,y)).on("mouseout",qT(iC,null,a,p,y)),f.set(a,!0))},this))},this),t&&this._createSelector(t,h,p,e,n)},JT.prototype._createSelector=function(t,i,r,e,n){var o=this.getSelectorGroup();KT(t,function(t){var e=t.type,n=new Ss({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){r.dispatchAction({type:"all"===e?"legendAllSelect":"legendInverseSelect"})}});o.add(n),pc(n,{normal:i.getModel("selectorLabel"),emphasis:i.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Dh(n)})},JT.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=i.get("itemWidth"),p=i.get("itemHeight"),d=i.get("inactiveColor"),f=i.get("inactiveBorderColor"),g=i.get("symbolKeepAspect"),y=i.getModel("itemStyle"),m=i.isSelected(t),v=new $T,_=n.getModel("textStyle"),x=n.get("icon"),b=n.getModel("tooltip"),w=b.parentModel,n=Um(r=x||r,0,0,c,p,m?s:d,null==g||g);v.add(QT(n,r,y,l,f,u,m)),x||!o||o===r&&"none"!==o||("none"===o&&(o="circle"),g=Um(o,(c-(r=.8*p))/2,(p-r)/2,r,r,m?s:d,null==g||g),v.add(QT(g,o,y,l,f,u,m)));f="left"===a?c+5:-5,u=a,c=i.get("formatter"),a=t;"string"==typeof c&&c?a=c.replace("{name}",null!=t?t:""):"function"==typeof c&&(a=c(t)),v.add(new Ss({style:fc(_,{text:a,x:f,y:p/2,fill:m?_.getTextColor():d,align:u,verticalAlign:"middle"})}));u=new oa({shape:v.getBoundingRect(),invisible:!0});return b.get("show")&&(i={componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]},u.tooltip=A({content:t,formatter:w.get("formatter",!0)||function(t){return t.name},formatterParams:i},b.option)),v.add(u),v.eachChild(function(t){t.silent=!0}),u.silent=!h,this.getContentGroup().add(v),Dh(v),v.__legendDataIndex=e,v},JT.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();zp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){zp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,n=0===d?"width":"height",r=0===d?"height":"width",t=0===d?"y":"x";"end"===o?c[d]+=l[n]+p:u[d]+=h[n]+p,c[1-d]+=l[r]/2-h[r]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];s={x:0,y:0};return s[n]=l[n]+p+h[n],s[r]=Math.max(l[r],h[r]),s[t]=Math.min(0,h[t]+c[1-d]),s}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},JT.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},JT.type="legend.plain",JT);function JT(){var t=null!==jT&&jT.apply(this,arguments)||this;return t.type=JT.type,t.newlineDisabled=!1,t}function QT(t,e,n,i,r,o,a){var s;return"line"!==e&&e.indexOf("empty")<0?(s=n.getItemStyle(),t.style.stroke=i,t.style.decal=o,a||(s.stroke=r)):s=n.getItemStyle(["borderWidth","borderColor"]),t.setStyle(s),t}function tC(t,e,n,i){iC(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),nC(t,e,n,i)}function eC(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;i<r&&!(e=n[i].states.emphasis);)i++;return e&&e.hoverLayer}function nC(t,e,n,i){eC(n)||n.dispatchAction({type:"highlight",seriesName:t,name:e,excludeSeriesId:i})}function iC(t,e,n,i){eC(n)||n.dispatchAction({type:"downplay",seriesName:t,name:e,excludeSeriesId:i})}Pg.registerClass(nl),o_(g.PROCESSOR.SERIES_FILTER,function(t){var n=t.findComponents({mainType:"legend"});n&&n.length&&t.filterSeries(function(t){for(var e=0;e<n.length;e++)if(!n[e].isSelected(t.name))return!1;return!0})}),qp.registerSubTypeDefaulter("legend",function(){return"plain"});var rC,Yh=(l(oC,rC=Yh),oC.prototype.setScrollDataIndex=function(t){this.option.scrollDataIndex=t},oC.prototype.init=function(t,e,n){var i=Gp(t);rC.prototype.init.call(this,t,e,n),aC(this,t,i)},oC.prototype.mergeOption=function(t,e){rC.prototype.mergeOption.call(this,t,e),aC(this,this.option,t)},oC.type="legend.scroll",oC.defaultOption=Vc(Yh.defaultOption,{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800}),oC);function oC(){var t=null!==rC&&rC.apply(this,arguments)||this;return t.type=oC.type,t}function aC(t,e,n){var i=[1,1];i[t.getOrient().index]=0,Hp(e,n,{type:"box",ignoreSize:!!i})}qp.registerClass(Yh);var sC,lC=Ho,uC=["width","height"],hC=["x","y"],nl=(l(cC,sC=nl),cC.prototype.init=function(){sC.prototype.init.call(this),this.group.add(this._containerGroup=new lC),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new lC)},cC.prototype.resetInner=function(){sC.prototype.resetInner.call(this),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},cC.prototype.renderInner=function(t,i,e,r,n,o,a){var s=this;sC.prototype.renderInner.call(this,t,i,e,r,n,o,a);var l=this._controllerGroup,a=i.get("pageIconSize",!0),u=V(a)?a:[a,a];h("pagePrev",0);a=i.getModel("pageTextStyle");function h(t,e){var n=t+"DataIndex",n=ac(i.get("pageIcons",!0)[i.getOrient().name][e],{onclick:z(s._pageGo,s,n,i,r)},{x:-u[0]/2,y:-u[1]/2,width:u[0],height:u[1]});n.name=t,l.add(n)}l.add(new Ss({name:"pageText",style:{text:"xx/xx",fill:a.getTextColor(),font:a.getFont(),verticalAlign:"middle",align:"center"},silent:!0})),h("pageNext",1)},cC.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getSelectorGroup(),s=t.getOrient().index,l=uC[s],u=hC[s],h=uC[1-s],c=hC[1-s];r&&zp("horizontal",a,t.get("selectorItemGap",!0));var p=t.get("selectorButtonGap",!0),d=a.getBoundingRect(),f=[-d.x,-d.y],g=I(n);r&&(g[l]=n[l]-d[l]-p);g=this._layoutContentAndController(t,i,g,s,l,h,c,u);return r&&("end"===o?f[s]+=g[l]+p:(o=d[l]+p,f[s]-=o,g[u]-=o),g[l]+=d[l]+p,f[1-s]+=g[c]+g[h]/2-d[h]/2,g[h]=Math.max(g[h],d[h]),g[c]=Math.min(g[c],d[c]+f[1-s]),a.x=f[0],a.y=f[1],a.markRedraw()),g},cC.prototype._layoutContentAndController=function(t,e,n,i,r,o,a,s){var l=this.getContentGroup(),u=this._containerGroup,h=this._controllerGroup;zp(t.get("orient"),l,t.get("itemGap"),i?n.width:null,i?null:n.height),zp("horizontal",h,t.get("pageButtonItemGap",!0));var c=l.getBoundingRect(),p=h.getBoundingRect(),d=this._showController=c[r]>n[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],e=[-p.x,-p.y],s=Q(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?e[i]+=n[r]-p[r]:g[i]+=p[r]+s),e[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(e);g={x:0,y:0};g[r]=(d?n:c)[r],g[o]=Math.max(c[o],p[o]),g[a]=Math.min(0,p[a]+e[1-i]),u.__rectSize=n[r],d?((i={x:0,y:0})[r]=Math.max(n[r]-p[r]-s,0),i[o]=g[o],u.setClipPath(new oa({shape:i})),u.__rectSize=i[r]):h.eachChild(function(t){t.attr({invisible:!0,silent:!0})});h=this._getPageInfo(t);return null!=h.pageIndex&&jh(l,{x:h.contentPosition[0],y:h.contentPosition[1]},d?t:null),this._updatePageInfoView(t,h),g},cC.prototype._pageGo=function(t,e,n){t=this._getPageInfo(e)[t];null!=t&&n.dispatchAction({type:"legendScroll",scrollDataIndex:t,legendId:e.id})},cC.prototype._updatePageInfoView=function(n,i){var r=this._controllerGroup;E(["pagePrev","pageNext"],function(t){var e=null!=i[t+"DataIndex"],t=r.childOfName(t);t&&(t.setStyle("fill",e?n.get("pageIconColor",!0):n.get("pageIconInactiveColor",!0)),t.cursor=e?"pointer":"default")});var t=r.childOfName("pageText"),e=n.get("pageFormatter"),o=i.pageIndex,a=null!=o?o+1:0,o=i.pageCount;t&&e&&t.setStyle("text",H(e)?e.replace("{current}",null==a?"":a+"").replace("{total}",null==o?"":o+""):e({current:a,total:o}))},cC.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=uC[r],a=hC[r],s=this._findTargetItemIndex(e),l=n.children(),t=l[s],u=l.length,e=u?1:0,h={contentPosition:[n.x,n.y],pageCount:e,pageIndex:e-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!t)return h;t=g(t);h.contentPosition[r]=-t.s;for(var c=s+1,p=t,d=t,f=null;c<=u;++c)(!(f=g(l[c]))&&d.e>p.s+i||f&&!y(f,p.s))&&(p=d.i>p.i?d:f)&&(null==h.pageNextDataIndex&&(h.pageNextDataIndex=p.i),++h.pageCount),d=f;for(c=s-1,p=t,d=t,f=null;-1<=c;--c)(f=g(l[c]))&&y(d,f.s)||!(p.i<d.i)||(d=p,null==h.pagePrevDataIndex&&(h.pagePrevDataIndex=p.i),++h.pageCount,++h.pageIndex),p=f;return h;function g(t){if(t){var e=t.getBoundingRect(),n=e[a]+t[a];return{s:n,e:n+e[o],i:t.__legendDataIndex}}}function y(t,e){return t.e>=e&&t.s<=e+i}},cC.prototype._findTargetItemIndex=function(n){return this._showController?(this.getContentGroup().eachChild(function(t,e){t=t.__legendDataIndex;null==r&&null!=t&&(r=e),t===n&&(i=e)}),null!=i?i:r):0;var i,r},cC.type="legend.scroll",cC);function cC(){var t=null!==sC&&sC.apply(this,arguments)||this;return t.type=cC.type,t.newlineDisabled=!0,t._currentIndex=0,t}Pg.registerClass(nl),a_("legendScroll","legendscroll",function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(n)})});var pC,nl=(l(dC,pC=qp),dC.type="title",dC.defaultOption={zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},dC);function dC(){var t=null!==pC&&pC.apply(this,arguments)||this;return t.type=dC.type,t.layoutMode={type:"box",ignoreSize:!0},t}qp.registerClass(nl);var fC,nl=(l(gC,fC=Pg),gC.prototype.render=function(t,e,n){var i,r,o,a,s,l,u,h,c;this.group.removeAll(),t.get("show")&&(i=this.group,h=t.getModel("textStyle"),a=t.getModel("subtextStyle"),r=t.get("textAlign"),c=Q(t.get("textBaseline"),t.get("textVerticalAlign")),u=(o=new Ss({style:fc(h,{text:t.get("text"),fill:h.getTextColor()},{disableBox:!0}),z2:10})).getBoundingRect(),h=t.get("subtext"),a=new Ss({style:fc(a,{text:h,fill:a.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),s=t.get("link"),l=t.get("sublink"),u=t.get("triggerEvent",!0),o.silent=!s&&!u,a.silent=!l&&!u,s&&o.on("click",function(){Lp(s,"_"+t.get("target"))}),l&&a.on("click",function(){Lp(l,"_"+t.get("subtarget"))}),Gu(o).eventData=Gu(a).eventData=u?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(o),h&&i.add(a),u=i.getBoundingRect(),(h=t.getBoxLayoutParams()).width=u.width,h.height=u.height,n=Bp(h,{width:n.getWidth(),height:n.getHeight()},t.get("padding")),r||("middle"===(r=t.get("left")||t.get("right"))&&(r="center"),"right"===r?n.x+=n.width:"center"===r&&(n.x+=n.width/2)),c||("center"===(c=t.get("top")||t.get("bottom"))&&(c="middle"),"bottom"===c?n.y+=n.height:"middle"===c&&(n.y+=n.height/2),c=c||"top"),i.x=n.x,i.y=n.y,i.markRedraw(),c={align:r,verticalAlign:c},o.setStyle(c),a.setStyle(c),u=i.getBoundingRect(),c=n.margin,(n=t.getItemStyle(["color","opacity"])).fill=t.get("backgroundColor"),n=new oa({shape:{x:u.x-c[3],y:u.y-c[0],width:u.width+c[1]+c[3],height:u.height+c[0]+c[2],r:t.get("borderRadius")},style:n,subPixelOptimize:!0,silent:!0}),i.add(n))},gC.type="title",gC);function gC(){var t=null!==fC&&fC.apply(this,arguments)||this;return t.type=gC.type,t}function yC(t){hu(t,"label",["show"])}Pg.registerClass(nl);var mC,vC=bu(),_C=(l(xC,mC=qp),xC.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._mergeOption(t,n,!1,!0)},xC.prototype.isAnimationEnabled=function(){if(w.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},xC.prototype.mergeOption=function(t,e){this._mergeOption(t,e,!1,!1)},xC.prototype._mergeOption=function(t,i,e,r){var o=this.mainType;e||i.eachSeries(function(t){var e=t.get(this.mainType,!0),n=vC(t)[o];e&&e.data?(n?n._mergeOption(e,i,!0):(r&&yC(e),E(e.data,function(t){t instanceof Array?(yC(t[0]),yC(t[1])):yC(t)}),A(n=this.createMarkerModelFromSeries(e,this,i),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),n.__hostSeries=t),vC(t)[o]=n):vC(t)[o]=null},this)},xC.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t),t=i.getName(t);return ug("section",{header:this.name,blocks:[ug("nameValue",{name:t,value:r,noName:!t,noValue:null==r})]})},xC.prototype.getData=function(){return this._data},xC.prototype.setData=function(t){this._data=t},xC.getMarkerModelFromSeries=function(t,e){return vC(t)[e]},xC.type="marker",xC.dependencies=["series","grid","polar","geo"],xC);function xC(){var t=null!==mC&&mC.apply(this,arguments)||this;return t.type=xC.type,t.createdBySelf=!1,t}T(_C,Ca.prototype);var bC,nl=(l(wC,bC=_C),wC.prototype.createMarkerModelFromSeries=function(t,e,n){return new wC(t,e,n)},wC.type="markPoint",wC.defaultOption={zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}},wC);function wC(){var t=null!==bC&&bC.apply(this,arguments)||this;return t.type=wC.type,t}function SC(t,e,n,i,r,o){var a=[],s=$_(e,i)?e.getCalculationInfo("stackResultDimension"):i,t=DC(e,s,t),t=e.indicesOfNearest(s,t)[0];a[r]=e.get(n,t),a[o]=e.get(s,t);s=e.get(i,t),t=Gl(e.get(i,t));return 0<=(t=Math.min(t,20))&&(a[o]=+a[o].toFixed(t)),[a,s]}qp.registerClass(nl);var MC={min:B(SC,"min"),max:B(SC,"max"),average:B(SC,"average"),median:B(SC,"median")};function TC(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&(o=e,isNaN(parseFloat(o.x))||isNaN(parseFloat(o.y)))&&!V(e.coord)&&i){var r=i.dimensions,o=CC(e,n,i,t);if((e=I(e)).type&&MC[e.type]&&o.baseAxis&&o.valueAxis){i=L(r,o.baseAxis.dim),t=L(r,o.valueAxis.dim),t=MC[e.type](n,o.baseDataDim,o.valueDataDim,i,t);e.coord=t[0],e.value=t[1]}else{for(var a=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],s=0;s<2;s++)MC[a[s]]&&(a[s]=DC(n,n.mapDimension(r[s]),a[s]));e.coord=a}}return e}function CC(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData(),i=n.dimensions;e=n.getDimension(e);for(var r=0;r<i.length;r++){var o=n.getDimensionInfo(i[r]);if(o.name===e)return o.coordDim}}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function IC(t,e){return!(t&&t.containData&&e.coord&&(n=e,isNaN(parseFloat(n.x))&&isNaN(parseFloat(n.y))))||t.containData(e.coord);var n}function AC(t,e,n,i){return i<2?t.coord&&t.coord[i]:t.value}function DC(t,e,n){if("average"!==n)return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0];var i=0,r=0;return t.each(e,function(t,e){isNaN(t)||(i+=t,r++)}),i/r}var kC,LC=bu(),Ca=(l(PC,kC=Pg),PC.prototype.init=function(){this.markerGroupMap=ht()},PC.prototype.render=function(t,n,i){var r=this,e=this.markerGroupMap;e.each(function(t){LC(t).keep=!1}),n.eachSeries(function(t){var e=_C.getMarkerModelFromSeries(t,r.type);e&&r.renderSeries(t,e,n,i)}),e.each(function(t){LC(t).keep||r.group.remove(t.group)})},PC.prototype.markKeep=function(t){LC(t).keep=!0},PC.prototype.blurSeries=function(t){var e=this;E(t,function(t){t=_C.getMarkerModelFromSeries(t,e.type);t&&t.getData().eachItemGraphicEl(function(t){t&&wh(t)})})},PC.type="marker",PC);function PC(){var t=null!==kC&&kC.apply(this,arguments)||this;return t.type=PC.type,t}function OC(a,s,l){var u=s.coordinateSystem;a.each(function(t){var e,n,i=a.getItemModel(t),r=Vl(i.get("x"),l.getWidth()),o=Vl(i.get("y"),l.getHeight());isNaN(r)||isNaN(o)?s.getMarkerPosition?n=s.getMarkerPosition(a.getValues(a.dimensions,t)):u&&(e=a.get(u.dimensions[0],t),i=a.get(u.dimensions[1],t),n=u.dataToPoint([e,i])):n=[r,o],isNaN(r)||(n[0]=r),isNaN(o)||(n[1]=o),a.setItemLayout(t,n)})}var RC,nl=(l(EC,RC=Ca),EC.prototype.updateTransform=function(t,e,n){e.eachSeries(function(t){var e=_C.getMarkerModelFromSeries(t,"markPoint");e&&(OC(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())},this)},EC.prototype.renderSeries=function(t,s,e,n){var i=t.coordinateSystem,r=t.id,l=t.getData(),o=this.markerGroupMap,r=o.get(r)||o.set(r,new Xb),u=function(t,e,n){i=t?O(t&&t.dimensions,function(t){return D({name:t},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float"}];var i=new H_(i,n),n=O(n.get("data"),B(TC,e));t&&(n=R(n,B(IC,t)));return i.initData(n,null,t?AC:function(t){return t.value}),i}(i,t,s);s.setData(u),OC(s.getData(),t,n),u.each(function(t){var e,n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate");(F(i)||F(r)||F(o))&&(e=s.getRawValue(t),a=s.getDataParams(t),F(i)&&(i=i(e,a)),F(r)&&(r=r(e,a)),F(o)&&(o=o(e,a)));var a=n.getModel("itemStyle").getItemStyle(),n=Ay(l,"color");a.fill||(a.fill=n),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,style:a})}),r.updateData(u),this.group.add(r.group),u.eachItemGraphicEl(function(t){t.traverse(function(t){Gu(t).dataModel=s})}),this.markKeep(r),r.group.silent=s.get("silent")||t.get("silent")},EC.type="markPoint",EC);function EC(){var t=null!==RC&&RC.apply(this,arguments)||this;return t.type=EC.type,t}Pg.registerClass(nl),r_(function(t){t.markPoint=t.markPoint||{}});var NC,nl=(l(zC,NC=_C),zC.prototype.createMarkerModelFromSeries=function(t,e,n){return new zC(t,e,n)},zC.type="markLine",zC.defaultOption={zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},zC);function zC(){var t=null!==NC&&NC.apply(this,arguments)||this;return t.type=zC.type,t}qp.registerClass(nl);var BC,VC=fa.prototype,FC=Fs.prototype,HC=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1};l(GC,BC=HC);function GC(){return null!==BC&&BC.apply(this,arguments)||this}function WC(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var UC,XC=(l(YC,UC=_o),YC.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},YC.prototype.getDefaultShape=function(){return new HC},YC.prototype.buildPath=function(t,e){(WC(e)?VC:FC).buildPath.call(this,t,e)},YC.prototype.pointAt=function(t){return(WC(this.shape)?VC:FC).pointAt.call(this,t)},YC.prototype.tangentAt=function(t){var e=this.shape,t=WC(e)?[e.x2-e.x1,e.y2-e.y1]:FC.tangentAt.call(this,t);return wt(t,t)},YC);function YC(t){t=UC.call(this,t)||this;return t.type="ec-line",t}var ZC=["fromSymbol","toSymbol"];function jC(t){return"_"+t+"Type"}function qC(t,e,n){var i=e.getItemVisual(n,t);if(i&&"none"!==i){var r=e.getItemVisual(n,t+"Size"),n=e.getItemVisual(n,t+"Rotate"),r=V(r)?r:[r,r],r=Um(i,-r[0]/2,-r[1]/2,r[0],r[1]);return r.__specifiedRotation=null==n||isNaN(n)?void 0:+n*Math.PI/180||0,r.name=t,r}}function KC(t,e){t.x1=e[0][0],t.y1=e[0][1],t.x2=e[1][0],t.y2=e[1][1],t.percent=1;e=e[2];e?(t.cpx1=e[0],t.cpy1=e[1]):(t.cpx1=NaN,t.cpy1=NaN)}var $C,JC=(l(QC,$C=Ho),QC.prototype._createLine=function(n,i,t){var e,r=n.hostModel,o=n.getItemLayout(i),o=(e=o,KC((o=new XC({name:"line",subPixelOptimize:!0})).shape,e),o);o.shape.percent=0,qh(o,{shape:{percent:1}},r,i),this.add(o),E(ZC,function(t){var e=qC(t,n,i);this.add(e),this[jC(t)]=n.getItemVisual(i,t)},this),this._updateCommonStl(n,i,t)},QC.prototype.updateData=function(i,r,t){var e=i.hostModel,n=this.childOfName("line"),o=i.getItemLayout(r),a={shape:{}};KC(a.shape,o),jh(n,a,e,r),E(ZC,function(t){var e=i.getItemVisual(r,t),n=jC(t);this[n]!==e&&(this.remove(this.childOfName(t)),t=qC(t,i,r),this.add(t)),this[n]=e},this),this._updateCommonStl(i,r,t)},QC.prototype.getLinePath=function(){return this.childAt(0)},QC.prototype._updateCommonStl=function(n,t,e){var i=n.hostModel,o=this.childOfName("line"),r=e&&e.emphasisLineStyle,a=e&&e.blurLineStyle,s=e&&e.selectLineStyle,l=e&&e.labelStatesModels;e&&!n.hasItemOption||(r=(e=n.getItemModel(t)).getModel(["emphasis","lineStyle"]).getLineStyle(),a=e.getModel(["blur","lineStyle"]).getLineStyle(),s=e.getModel(["select","lineStyle"]).getLineStyle(),l=dc(e));var u=n.getItemVisual(t,"style"),h=u.stroke;o.useStyle(u),o.style.fill=null,o.style.strokeNoScale=!0,o.ensureState("emphasis").style=r,o.ensureState("blur").style=a,o.ensureState("select").style=s,E(ZC,function(t){var e=this.childOfName(t);if(e){e.setColor(h),e.style.opacity=u.opacity;for(var n=0;n<qu.length;n++){var i=qu[n],r=o.getState(i);r&&(r=r.style||{},i=(i=e.ensureState(i)).style||(i.style={}),null!=r.stroke&&(i[e.__isEmptyBrush?"stroke":"fill"]=r.stroke),null!=r.opacity&&(i.opacity=r.opacity))}e.markRedraw()}},this);s=i.getRawValue(t);pc(this,l,{labelDataIndex:t,labelFetcher:{getFormattedLabel:function(t,e){return i.getFormattedLabel(t,e,n.dataType)}},inheritColor:h||"#000",defaultOpacity:u.opacity,defaultText:(null==s?n.getName(t):isFinite(s)?Fl(s):s)+""});s=this.getTextContent();s&&(l=l.normal,s.__align=s.style.align,s.__verticalAlign=s.style.verticalAlign,s.__position=l.get("position")||"middle",V(l=l.get("distance"))||(l=[l,l]),s.__labelDistance=l),this.setTextConfig({position:null,local:!0,inside:!1}),Dh(this)},QC.prototype.highlight=function(){xh(this)},QC.prototype.downplay=function(){bh(this)},QC.prototype.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},QC.prototype.setLinePoints=function(t){var e=this.childOfName("line");KC(e.shape,t),e.dirty()},QC.prototype.beforeUpdate=function(){var t=this.childOfName("fromSymbol"),e=this.childOfName("toSymbol"),n=this.getTextContent();if(t||e||n&&!n.ignore){for(var i=1,r=this.parent;r;)r.scaleX&&(i/=r.scaleX),r=r.parent;var o=this.childOfName("line");if(this.__dirty||o.__dirty){var a=o.shape.percent,s=o.pointAt(0),l=o.pointAt(a),u=vt([],l,s);if(wt(u,u),t&&(t.setPosition(s),g(t,0),t.scaleX=t.scaleY=i*a,t.markRedraw()),e&&(e.setPosition(l),g(e,1),e.scaleX=e.scaleY=i*a,e.markRedraw()),n&&!n.ignore){n.x=n.y=0;var h=void(n.originX=n.originY=0),c=void 0,p=n.__labelDistance,d=p[0]*i,t=p[1]*i,e=a/2,p=o.tangentAt(e),a=[p[1],-p[0]],e=o.pointAt(e);0<a[1]&&(a[0]=-a[0],a[1]=-a[1]);a=p[0]<0?-1:1;"start"!==n.__position&&"end"!==n.__position&&(f=-Math.atan2(p[1],p[0]),l[0]<s[0]&&(f=Math.PI+f),n.rotation=f);var f=void 0;switch(n.__position){case"insideStartTop":case"insideMiddleTop":case"insideEndTop":case"middle":f=-t,c="bottom";break;case"insideStartBottom":case"insideMiddleBottom":case"insideEndBottom":f=t,c="top";break;default:f=0,c="middle"}switch(n.__position){case"end":n.x=u[0]*d+l[0],n.y=u[1]*t+l[1],h=.8<u[0]?"left":u[0]<-.8?"right":"center",c=.8<u[1]?"top":u[1]<-.8?"bottom":"middle";break;case"start":n.x=-u[0]*d+s[0],n.y=-u[1]*t+s[1],h=.8<u[0]?"right":u[0]<-.8?"left":"center",c=.8<u[1]?"bottom":u[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":n.x=d*a+s[0],n.y=s[1]+f,h=p[0]<0?"right":"left",n.originX=-d*a,n.originY=-f;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":n.x=e[0],n.y=e[1]+f,h="center",n.originY=-f;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":n.x=-d*a+l[0],n.y=l[1]+f,h=0<=p[0]?"right":"left",n.originX=d*a,n.originY=-f}n.scaleX=n.scaleY=i,n.setStyle({verticalAlign:n.__verticalAlign||c,align:n.__align||h})}}}function g(t,e){var n,i=t.__specifiedRotation;null==i?(n=o.tangentAt(e),t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(n[1],n[0]))):t.attr("rotation",i)}},QC);function QC(t,e,n){var i=$C.call(this)||this;return i._createLine(t,e,n),i}var tI=(eI.prototype.isPersistent=function(){return!0},eI.prototype.updateData=function(n){var i=this,e=this.group,r=this._lineData;this._lineData=n,r||e.removeAll();var o=nI(n);n.diff(r).add(function(t){i._doAdd(n,t,o)}).update(function(t,e){i._doUpdate(r,n,e,t,o)}).remove(function(t){e.remove(r.getItemGraphicEl(t))}).execute()},eI.prototype.updateLayout=function(){var n=this._lineData;n&&n.eachItemGraphicEl(function(t,e){t.updateLayout(n,e)},this)},eI.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=nI(t),this._lineData=null,this.group.removeAll()},eI.prototype.incrementalUpdate=function(t,e){function n(t){var e;t.isGroup||(e=t).animators&&0<e.animators.length||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var i,r=t.start;r<t.end;r++){rI(e.getItemLayout(r))&&((i=new this._LineCtor(e,r,this._seriesScope)).traverse(n),this.group.add(i),e.setItemGraphicEl(r,i))}},eI.prototype.remove=function(){this.group.removeAll()},eI.prototype._doAdd=function(t,e,n){rI(t.getItemLayout(e))&&(n=new this._LineCtor(t,e,n),t.setItemGraphicEl(e,n),this.group.add(n))},eI.prototype._doUpdate=function(t,e,n,i,r){n=t.getItemGraphicEl(n);rI(e.getItemLayout(i))?(n?n.updateData(e,i,r):n=new this._LineCtor(e,i,r),e.setItemGraphicEl(i,n),this.group.add(n)):this.group.remove(n)},eI);function eI(t){this.group=new Ho,this._LineCtor=t||JC}function nI(t){t=t.hostModel;return{lineStyle:t.getModel("lineStyle").getLineStyle(),emphasisLineStyle:t.getModel(["emphasis","lineStyle"]).getLineStyle(),blurLineStyle:t.getModel(["blur","lineStyle"]).getLineStyle(),selectLineStyle:t.getModel(["select","lineStyle"]).getLineStyle(),labelStatesModels:dc(t)}}function iI(t){return isNaN(t[0])||isNaN(t[1])}function rI(t){return!iI(t[0])&&!iI(t[1])}function oI(t,e,n,i){var r,o,a,s=t.getData(),l=[TC(t,(l=V(i)?i:"min"===(r=i.type)||"max"===r||"average"===r||"median"===r||null!=i.xAxis||null!=i.yAxis?(l=o=void 0,l=null!=i.yAxis||null!=i.xAxis?(o=e.getAxis(null!=i.yAxis?"y":"x"),J(i.yAxis,i.xAxis)):(o=(a=CC(i,s,e,t)).valueAxis,DC(s,J_(s,a.valueDataDim),r)),s=1-(e="x"===o.dim?0:1),a={coord:[]},(o=I(i)).type=null,o.coord=[],o.coord[s]=-1/0,a.coord[s]=1/0,0<=(n=n.get("precision"))&&"number"==typeof l&&(l=+l.toFixed(Math.min(n,20))),o.coord[e]=a.coord[e]=l,[o,a,{type:r,valueIndex:i.valueIndex,value:l}]):[])[0]),TC(t,l[1]),A({},l[2])];return l[2].type=l[2].type||null,b(l[2],l[0]),b(l[2],l[1]),l}var aI=bu();function sI(t){return!isNaN(t)&&!isFinite(t)}function lI(t,e,n,i){var r=1-t,o=i.dimensions[t];return sI(e[r])&&sI(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function uI(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(lI(1,n,i,t)||lI(0,n,i,t)))return!0}return IC(t,e[0])&&IC(t,e[1])}function hI(t,e,n,i,r){var o,a,s,l,u=i.coordinateSystem,h=t.getItemModel(e),c=Vl(h.get("x"),r.getWidth()),r=Vl(h.get("y"),r.getHeight());isNaN(c)||isNaN(r)?(o=i.getMarkerPosition?i.getMarkerPosition(t.getValues(t.dimensions,e)):(l=u.dimensions,a=t.get(l[0],e),s=t.get(l[1],e),u.dataToPoint([a,s])),fw(u,"cartesian2d")&&(a=u.getAxis("x"),s=u.getAxis("y"),l=u.dimensions,sI(t.get(l[0],e))?o[0]=a.toGlobalCoord(a.getExtent()[n?0:1]):sI(t.get(l[1],e))&&(o[1]=s.toGlobalCoord(s.getExtent()[n?0:1]))),isNaN(c)||(o[0]=c),isNaN(r)||(o[1]=r)):o=[c,r],t.setItemLayout(e,o)}var cI,nl=(l(pI,cI=Ca),pI.prototype.updateTransform=function(t,e,o){e.eachSeries(function(e){var n,i,r,t=_C.getMarkerModelFromSeries(e,"markLine");t&&(n=t.getData(),i=aI(t).from,r=aI(t).to,i.each(function(t){hI(i,t,!0,e,o),hI(r,t,!1,e,o)}),n.each(function(t){n.setItemLayout(t,[i.getItemLayout(t),r.getItemLayout(t)])}),this.markerGroupMap.get(e.id).updateLayout())},this)},pI.prototype.renderSeries=function(o,n,t,a){var e=o.coordinateSystem,i=o.id,s=o.getData(),r=this.markerGroupMap,i=r.get(i)||r.set(i,new tI);this.group.add(i.group);var e=function(t,e,n){o=t?O(t&&t.dimensions,function(t){return D({name:t},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float"}];var i=new H_(o,n),r=new H_(o,n),o=new H_([],n),n=O(n.get("data"),B(oI,e,t,n));t&&(n=R(n,B(uI,t)));t=t?AC:function(t){return t.value};return i.initData(O(n,function(t){return t[0]}),null,t),r.initData(O(n,function(t){return t[1]}),null,t),o.initData(O(n,function(t){return t[2]})),o.hasItemOption=!0,{from:i,to:r,line:o}}(e,o,n),l=e.from,u=e.to,h=e.line;aI(n).from=l,aI(n).to=u,n.setData(h);var c=n.get("symbol"),p=n.get("symbolSize");function d(t,e,n){var i=t.getItemModel(e);hI(t,e,n,o,a);var r=i.getModel("itemStyle").getItemStyle();null==r.fill&&(r.fill=Ay(s,"color")),t.setItemVisual(e,{symbolRotate:i.get("symbolRotate"),symbolSize:i.get("symbolSize")||p[n?0:1],symbol:i.get("symbol",!0)||c[n?0:1],style:r})}V(c)||(c=[c,c]),V(p)||(p=[p,p]),e.from.each(function(t){d(l,t,!0),d(u,t,!1)}),h.each(function(t){var e=h.getItemModel(t).getModel("lineStyle").getLineStyle();h.setItemLayout(t,[l.getItemLayout(t),u.getItemLayout(t)]),null==e.stroke&&(e.stroke=l.getItemVisual(t,"style").fill),h.setItemVisual(t,{fromSymbolRotate:l.getItemVisual(t,"symbolRotate"),fromSymbolSize:l.getItemVisual(t,"symbolSize"),fromSymbol:l.getItemVisual(t,"symbol"),toSymbolRotate:u.getItemVisual(t,"symbolRotate"),toSymbolSize:u.getItemVisual(t,"symbolSize"),toSymbol:u.getItemVisual(t,"symbol"),style:e})}),i.updateData(h),e.line.eachItemGraphicEl(function(t,e){t.traverse(function(t){Gu(t).dataModel=n})}),this.markKeep(i),i.group.silent=n.get("silent")||o.get("silent")},pI.type="markLine",pI);function pI(){var t=null!==cI&&cI.apply(this,arguments)||this;return t.type=pI.type,t}Pg.registerClass(nl),r_(function(t){t.markLine=t.markLine||{}});var dI,Fs=(l(fI,dI=_C),fI.prototype.createMarkerModelFromSeries=function(t,e,n){return new fI(t,e,n)},fI.type="markArea",fI.defaultOption={zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},fI);function fI(){var t=null!==dI&&dI.apply(this,arguments)||this;return t.type=fI.type,t}qp.registerClass(Fs);function gI(t,e,n,i){var r=TC(t,i[0]),o=TC(t,i[1]),t=r.coord,i=o.coord;return t[0]=J(t[0],-1/0),t[1]=J(t[1],-1/0),i[0]=J(i[0],1/0),i[1]=J(i[1],1/0),(i=S([{},r,o])).coord=[r.coord,o.coord],i.x0=r.x,i.y0=r.y,i.x1=o.x,i.y1=o.y,i}var yI=bu();function mI(t){return!isNaN(t)&&!isFinite(t)}function vI(t,e,n){t=1-t;return mI(e[t])&&mI(n[t])}function _I(t,e){var n=e.coord[0],i=e.coord[1];return!!(fw(t,"cartesian2d")&&n&&i&&(vI(1,n,i)||vI(0,n,i)))||(IC(t,{coord:n,x:e.x0,y:e.y0})||IC(t,{coord:i,x:e.x1,y:e.y1}))}function xI(t,e,n,i,r){var o,a,s,l,u=i.coordinateSystem,h=t.getItemModel(e),c=Vl(h.get(n[0]),r.getWidth()),r=Vl(h.get(n[1]),r.getHeight());return isNaN(c)||isNaN(r)?(l=i.getMarkerPosition?i.getMarkerPosition(t.getValues(n,e)):(o=[a=t.get(n[0],e),s=t.get(n[1],e)],u.clampData&&u.clampData(o,o),u.dataToPoint(o,!0)),fw(u,"cartesian2d")&&(o=u.getAxis("x"),u=u.getAxis("y"),a=t.get(n[0],e),s=t.get(n[1],e),mI(a)?l[0]=o.toGlobalCoord(o.getExtent()["x0"===n[0]?0:1]):mI(s)&&(l[1]=u.toGlobalCoord(u.getExtent()["y0"===n[1]?0:1]))),isNaN(c)||(l[0]=c),isNaN(r)||(l[1]=r)):l=[c,r],l}var bI,wI=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],nl=(l(SI,bI=Ca),SI.prototype.updateTransform=function(t,e,r){e.eachSeries(function(n){var i,t=_C.getMarkerModelFromSeries(n,"markArea");t&&(i=t.getData()).each(function(e){var t=O(wI,function(t){return xI(i,e,t,n,r)});i.setItemLayout(e,t),i.getItemGraphicEl(e).setShape("points",t)})},this)},SI.prototype.renderSeries=function(r,o,t,a){var s=r.coordinateSystem,e=r.id,l=r.getData(),n=this.markerGroupMap,i=n.get(e)||n.set(e,{group:new Ho});this.group.add(i.group),this.markKeep(i);var u=function(t,n,e){var i,r;r=t?(i=O(t&&t.dimensions,function(t){var e=n.getData();return D({name:t},e.getDimensionInfo(e.mapDimension(t))||{})}),new H_(O(["x0","y0","x1","y1"],function(t,e){return{name:t,type:i[e%2].type}}),e)):new H_(i=[{name:"value",type:"float"}],e);e=O(e.get("data"),B(gI,n,t,e));t&&(e=R(e,B(_I,t)));t=t?function(t,e,n,i){return t.coord[Math.floor(i/2)][i%2]}:function(t){return t.value};return r.initData(e,null,t),r.hasItemOption=!0,r}(s,r,o);o.setData(u),u.each(function(n){var t=O(wI,function(t){return xI(u,n,t,r,a)}),i=!0;E(wI,function(t){var e;i&&(e=u.get(t[0],n),t=u.get(t[1],n),(mI(e)||s.getAxis("x").containData(e))&&(mI(t)||s.getAxis("y").containData(t))&&(i=!1))}),u.setItemLayout(n,{points:t,allClipped:i});var e=u.getItemModel(n).getModel("itemStyle").getItemStyle(),t=Ay(l,"color");e.fill||(e.fill=t,"string"==typeof e.fill&&(e.fill=on(e.fill,.4))),e.stroke||(e.stroke=t),u.setItemVisual(n,"style",e)}),u.diff(yI(i).data).add(function(t){var e=u.getItemLayout(t);e.allClipped||(e=new xa({shape:{points:e.points}}),u.setItemGraphicEl(t,e),i.group.add(e))}).update(function(t,e){var n=yI(i).data.getItemGraphicEl(e),e=u.getItemLayout(t);e.allClipped?n&&i.group.remove(n):(n?jh(n,{shape:{points:e.points}},o,t):n=new xa({shape:{points:e.points}}),u.setItemGraphicEl(t,n),i.group.add(n))}).remove(function(t){t=yI(i).data.getItemGraphicEl(t);i.group.remove(t)}).execute(),u.eachItemGraphicEl(function(t,e){var n=u.getItemModel(e),i=u.getItemVisual(e,"style");t.useStyle(u.getItemVisual(e,"style")),pc(t,dc(n),{labelFetcher:o,labelDataIndex:e,defaultText:u.getName(e)||"",inheritColor:"string"==typeof i.fill?on(i.fill,1):"#000"}),Ph(t,n),Dh(t),Gu(t).dataModel=o}),yI(i).data=u,i.group.silent=o.get("silent")||r.get("silent")},SI.type="markArea",SI);function SI(){var t=null!==bI&&bI.apply(this,arguments)||this;return t.type=SI.type,t}Pg.registerClass(nl),r_(function(t){t.markArea=t.markArea||{}}),qp.registerSubTypeDefaulter("dataZoom",function(){return"slider"});var MI=["x","y","radius","angle","single"],TI=["cartesian2d","polar","singleAxis"];function CI(t){return t+"Axis"}function II(t,e){var i,r=ht(),n=[],o=ht();for(t.eachComponent({mainType:"dataZoom",query:e},function(t){o.get(t.uid)||s(t)});i=!1,t.eachComponent("dataZoom",a),i;);function a(t){var n;!o.get(t.uid)&&(n=!1,t.eachTargetAxis(function(t,e){t=r.get(t);t&&t[e]&&(n=!0)}),n)&&(s(t),i=!0)}function s(t){o.set(t.uid,!0),n.push(t),t.eachTargetAxis(function(t,e){(r.get(t)||r.set(t,[]))[e]=!0})}return n}function AI(t){var r=t.ecModel,o={infoList:[],infoMap:ht()};return t.eachTargetAxis(function(t,e){var n,i=r.getComponent(CI(t),e);!i||(n=i.getCoordSysModel())&&(t=n.uid,(e=o.infoMap.get(t))||(e={model:n,axisModels:[]},o.infoList.push(e),o.infoMap.set(t,e)),e.axisModels.push(i))}),o}var DI=(kI.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},kI);function kI(){this.indexList=[],this.indexMap=[]}var LI,Fs=(l(PI,LI=qp),PI.prototype.init=function(t,e,n){var i=OI(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},PI.prototype.mergeOption=function(t){var e=OI(t);b(this.option,t,!0),b(this.settledOption,e,!0),this._doInit(e)},PI.prototype._doInit=function(t){var n=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var i=this.settledOption;E([["start","startValue"],["end","endValue"]],function(t,e){"value"===this._rangePropMode[e]&&(n[t[0]]=i[t[0]]=null)},this),this._resetTarget()},PI.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ht();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each(function(t){t.indexList.length&&(this._noTarget=!1)},this)},PI.prototype._fillSpecifiedTargetAxis=function(i){var r=!1;return E(MI,function(t){var e,n=this.getReferringComponents(CI(t),Tu);n.specified&&(r=!0,e=new DI,E(n.models,function(t){e.add(t.componentIndex)}),i.set(t,e))},this),r},PI.prototype._fillAutoTargetAxisByOrient=function(o,e){var t,i=this.ecModel,a=!0;function n(t,e){var n,i,r=t[0];r&&((n=new DI).add(r.componentIndex),o.set(e,n),a=!1,"x"!==e&&"y"!==e||(i=r.getReferringComponents("grid",Mu).models[0])&&E(t,function(t){r.componentIndex!==t.componentIndex&&i===t.getReferringComponents("grid",Mu).models[0]&&n.add(t.componentIndex)}))}a&&(t="vertical"===e?"y":"x",n(i.findComponents({mainType:t+"Axis"}),t)),a&&n(i.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single"),a&&E(MI,function(t){var e,n;!a||(e=i.findComponents({mainType:CI(t),filter:function(t){return"category"===t.get("type",!0)}}))[0]&&((n=new DI).add(e[0].componentIndex),o.set(t,n),a=!1)},this)},PI.prototype._makeAutoOrientByTargetAxis=function(){var e;return this.eachTargetAxis(function(t){e=e||t},this),"y"===e?"vertical":"horizontal"},PI.prototype._setDefaultThrottle=function(t){t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle&&(t=this.ecModel.option,this.option.throttle=t.animation&&0<t.animationDurationUpdate?100:20)},PI.prototype._updateRangeUse=function(i){var r=this._rangePropMode,o=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],function(t,e){var n=null!=i[t[0]],t=null!=i[t[1]];n&&!t?r[e]="percent":!n&&t?r[e]="value":o?r[e]=o[e]:n&&(r[e]="percent")})},PI.prototype.noTarget=function(){return this._noTarget},PI.prototype.getFirstTargetAxisModel=function(){var n;return this.eachTargetAxis(function(t,e){null==n&&(n=this.ecModel.getComponent(CI(t),e))},this),n},PI.prototype.eachTargetAxis=function(n,i){this._targetAxisInfoMap.each(function(t,e){E(t.indexList,function(t){n.call(i,e,t)})})},PI.prototype.getAxisProxy=function(t,e){e=this.getAxisModel(t,e);if(e)return e.__dzAxisProxy},PI.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(CI(t),e)},PI.prototype.setRawRange=function(e){var n=this.option,i=this.settledOption;E([["start","startValue"],["end","endValue"]],function(t){null==e[t[0]]&&null==e[t[1]]||(n[t[0]]=i[t[0]]=e[t[0]],n[t[1]]=i[t[1]]=e[t[1]])},this),this._updateRangeUse(e)},PI.prototype.setCalculatedRange=function(e){var n=this.option;E(["start","startValue","end","endValue"],function(t){n[t]=e[t]})},PI.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},PI.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();e=this.findRepresentativeAxisProxy();return e?e.getDataValueWindow():void 0},PI.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i<n.length;i++)for(var r=n[i],o=this._targetAxisInfoMap.get(r),a=0;a<o.indexList.length;a++){var s=this.getAxisProxy(r,o.indexList[a]);if(s.hostedBy(this))return s;e=e||s}return e},PI.prototype.getRangePropMode=function(){return this._rangePropMode.slice()},PI.prototype.getOrient=function(){return this._orient},PI.type="dataZoom",PI.dependencies=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","series","toolbox"],PI.defaultOption={zlevel:0,z:4,filterMode:"filter",start:0,end:100},PI);function PI(){var t=null!==LI&&LI.apply(this,arguments)||this;return t.type=PI.type,t._autoThrottle=!0,t._noTarget=!0,t._rangePropMode=["percent","percent"],t}function OI(e){var n={};return E(["start","end","startValue","endValue","throttle"],function(t){e.hasOwnProperty(t)&&(n[t]=e[t])}),n}var RI,Ca=(l(EI,RI=Pg),EI.prototype.render=function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},EI.type="dataZoom",EI);function EI(){var t=null!==RI&&RI.apply(this,arguments)||this;return t.type=EI.type,t}Pg.registerClass(Ca);var NI,nl=(l(zI,NI=Fs),zI.type="dataZoom.slider",zI.layoutMode="box",zI.defaultOption=Vc(Fs.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),zI);function zI(){var t=null!==NI&&NI.apply(this,arguments)||this;return t.type=zI.type,t}function BI(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];null!=r&&(r=FI(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i&&(s=FI(s=Math.abs(e[1]-e[0]),[0,a]),r=o=FI(s,[r,o]),i=0),e[0]=FI(e[0],n),e[1]=FI(e[1],n);var s=VI(e,i);e[i]+=t;t=r||0,n=n.slice();return s.sign<0?n[0]+=t:n[1]-=t,e[i]=FI(e[i],n),n=VI(e,i),null!=r&&(n.sign!==s.sign||n.span<r)&&(e[1-i]=e[i]+s.sign*r),n=VI(e,i),null!=o&&n.span>o&&(e[1-i]=e[i]+n.sign*o),e}function VI(t,e){t=t[e]-t[1-e];return{span:Math.abs(t),sign:0<t||!(t<0)&&e?-1:1}}function FI(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}qp.registerClass(nl);var HI,GI=oa,WI="horizontal",UI="vertical",XI=["line","bar","candlestick","scatter"],YI={easing:"cubicOut",duration:100},nl=(l(ZI,HI=Ca),ZI.prototype.init=function(t,e){this.api=e,this._onBrush=z(this._onBrush,this),this._onBrushEnd=z(this._onBrushEnd,this)},ZI.prototype.render=function(t,e,n,i){if(HI.prototype.render.apply(this,arguments),jg(this,"_dispatchZoomAction",t.get("throttle"),"fixRate"),this._orient=t.getOrient(),!1!==t.get("show")){if(t.noTarget())return this._clear(),void this.group.removeAll();i&&"dataZoom"===i.type&&i.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},ZI.prototype.dispose=function(){this._clear(),HI.prototype.dispose.apply(this,arguments)},ZI.prototype._clear=function(){var t,e;(n=(t=this)[e="_dispatchZoomAction"])&&n[Ug]&&(t[e]=n[Ug]);var n=this.api.getZr();n.off("mousemove",this._onBrush),n.off("mouseup",this._onBrushEnd)},ZI.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Ho;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},ZI.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),e={width:e.getWidth(),height:e.getHeight()},r=this._orient===WI?{right:e.width-i.x-i.width,top:e.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},o=Gp(t.option);E(["right","top","width","height"],function(t){"ph"===o[t]&&(o[t]=r[t])});e=Bp(o,e);this._location={x:e.x,y:e.y},this._size=[e.width,e.height],this._orient===UI&&this._size.reverse()},ZI.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,i=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==WI||r?n===WI&&r?{scaleY:i?1:-1,scaleX:-1}:n!==UI||r?{scaleY:i?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:i?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:i?1:-1,scaleX:1});o=t.getBoundingRect([o]);t.x=e.x-o.x,t.y=e.y-o.y,t.markRedraw()},ZI.prototype._getViewExtent=function(){return[0,this._size[0]]},ZI.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new GI({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));t=new GI({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:z(this._onClickPanel,this)}),e=this.api.getZr();i?(t.on("mousedown",this._onBrushStart,this),t.cursor="crosshair",e.on("mousemove",this._onBrush),e.on("mouseup",this._onBrushEnd)):(e.off("mousemove",this._onBrush),e.off("mouseup",this._onBrushEnd)),n.add(t)},ZI.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=t.series,i=n.getRawData(),n=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=n){var r,t=.3*((o=i.getDataExtent(n))[1]-o[0]),o=[o[0]-t,o[1]+t],a=[0,e[1]],t=[0,e[0]],s=[[e[0],0],[0,0]],l=[],u=t[1]/(i.count()-1),h=0,c=Math.round(i.count()/e[0]);i.each([n],function(t,e){var n;0<c&&e%c?h+=u:(t=(n=null==t||isNaN(t)||""===t)?0:Bl(t,o,a,!0),n&&!r&&e?(s.push([s[s.length-1][0],0]),l.push([l[l.length-1][0],0])):!n&&r&&(s.push([h,0]),l.push([h,0])),s.push([h,t]),l.push([h,t]),h+=u,r=n)});for(var p,d,f,g=this.dataZoomModel,y=0;y<3;y++){var m=(p=1===y,d=f=d=void 0,d=g.getModel(p?"selectedDataBackground":"dataBackground"),f=new Ho,p=new xa({shape:{points:s},segmentIgnoreThreshold:1,style:d.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),d=new Ma({shape:{points:l},segmentIgnoreThreshold:1,style:d.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19}),f.add(p),f.add(d),f);this._displayables.sliderGroup.add(m),this._displayables.dataShadowSegs.push(m)}}}},ZI.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,s=t.get("showDataShadow");if(!1!==s){var l,u=this.ecModel;return t.eachTargetAxis(function(o,a){E(t.getAxisProxy(o,a).getTargetSeriesModels(),function(t){var e,n,i,r;l||!0!==s&&L(XI,t.get("type"))<0||(e=u.getComponent(CI(o),a).axis,n={x:"y",y:"x",radius:"angle",angle:"radius"}[o],r=t.coordinateSystem,null!=n&&r.getOtherAxis&&(i=r.getOtherAxis(e).inverse),n=t.getData().mapDimension(n),l={thisAxis:e,series:t,thisDim:o,otherDim:n,otherAxisInverse:i})},this)},this),l}},ZI.prototype._renderHandle=function(){var r=this.group,t=this._displayables,o=t.handles=[null,null],a=t.handleLabels=[null,null],s=this._displayables.sliderGroup,e=this._size,l=this.dataZoomModel,n=this.api,i=l.get("borderRadius")||0,u=l.get("brushSelect"),h=t.filler=new GI({silent:u,style:{fill:l.get("fillerColor")},textConfig:{position:"inside"}});s.add(h),s.add(new GI({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:e[0],height:e[1],r:i},style:{stroke:l.get("dataBackgroundColor")||l.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],function(t){var e=l.get("handleIcon");!Hm[e]&&e.indexOf("path://")<0&&(e="path://"+e);var n=Um(e,-1,0,2,2,null,!0);n.attr({cursor:jI(this._orient),draggable:!0,drift:z(this._onDragMove,this,t),ondragend:z(this._onDragEnd,this),onmouseover:z(this._showDataInfo,this,!0),onmouseout:z(this._showDataInfo,this,!1),z2:5});var i=n.getBoundingRect(),e=l.get("handleSize");this._handleHeight=Vl(e,this._size[1]),this._handleWidth=i.width/i.height*this._handleHeight,n.setStyle(l.getModel("handleStyle").getItemStyle()),n.style.strokeNoScale=!0,n.rectHover=!0,n.ensureState("emphasis").style=l.getModel(["emphasis","handleStyle"]).getItemStyle(),Dh(n);i=l.get("handleColor");null!=i&&(n.style.fill=i),s.add(o[t]=n);n=l.getModel("textStyle");r.add(a[t]=new Ss({silent:!0,invisible:!0,style:{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:n.getTextColor(),font:n.getFont()},z2:10}))},this);var c,p=h;u&&(i=Vl(l.get("moveHandleSize"),e[1]),c=t.moveHandle=new oa({style:l.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:e[1]-.5,height:i}}),h=.8*i,(u=t.moveHandleIcon=Um(l.get("moveHandleIcon"),-h/2,-h/2,h,h,"#fff",!0)).silent=!0,u.y=e[1]+i/2-.5,c.ensureState("emphasis").style=l.getModel(["emphasis","moveHandleStyle"]).getItemStyle(),h=Math.min(e[1]/2,Math.max(i,10)),(p=t.moveZone=new oa({invisible:!0,shape:{y:e[1]-h,height:i+h}})).on("mouseover",function(){n.enterEmphasis(c)}).on("mouseout",function(){n.leaveEmphasis(c)}),s.add(c),s.add(u),s.add(p)),p.attr({draggable:!0,cursor:jI(this._orient),drift:z(this._onDragMove,this,"all"),ondragstart:z(this._showDataInfo,this,!0),ondragend:z(this._onDragEnd,this),onmouseover:z(this._showDataInfo,this,!0),onmouseout:z(this._showDataInfo,this,!1)})},ZI.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Bl(t[0],[0,100],e,!0),Bl(t[1],[0,100],e,!0)]},ZI.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];BI(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Bl(o.minSpan,a,r,!0):null,null!=o.maxSpan?Bl(o.maxSpan,a,r,!0):null);o=this._range,a=this._range=Hl([Bl(i[0],r,a,!0),Bl(i[1],r,a,!0)]);return!o||o[0]!==a[0]||o[1]!==a[1]},ZI.prototype._updateView=function(t){var i=this._displayables,r=this._handleEnds,e=Hl(r.slice()),o=this._size;E([0,1],function(t){var e=i.handles[t],n=this._handleHeight;e.attr({scaleX:n/2,scaleY:n/2,x:r[t]+(t?-1:1),y:o[1]/2-n/2})},this),i.filler.setShape({x:e[0],y:0,width:e[1]-e[0],height:o[1]});var n={x:e[0],width:e[1]-e[0]};i.moveHandle&&(i.moveHandle.setShape(n),i.moveZone.setShape(n),i.moveZone.getBoundingRect(),i.moveHandleIcon&&i.moveHandleIcon.attr("x",n.x+n.width/2));for(var a=i.dataShadowSegs,s=[0,e[0],e[1],o[0]],l=0;l<a.length;l++){var u=a[l],h=u.getClipPath();h||(h=new oa,u.setClipPath(h)),h.setShape({x:s[l],y:0,width:s[l+1]-s[l],height:o[1]})}this._updateDataInfo(t)},ZI.prototype._updateDataInfo=function(t){var e,n,i=this.dataZoomModel,r=this._displayables,o=r.handleLabels,a=this._orient,s=["",""];!i.get("showDetail")||(n=i.findRepresentativeAxisProxy())&&(e=n.getAxisModel().axis,i=this._range,n=t?n.calculateDataWindow({start:i[0],end:i[1]}).valueWindow:n.getDataValueWindow(),s=[this._formatLabel(n[0],e),this._formatLabel(n[1],e)]);var l=Hl(this._handleEnds.slice());function u(t){var e=tc(r.handles[t].parent,this.group),n=nc(0===t?"right":"left",e),i=this._handleWidth/2+5,e=ec([l[t]+(0===t?-i:i),this._size[1]/2],e);o[t].setStyle({x:e[0],y:e[1],verticalAlign:a===WI?"middle":n,align:a===WI?n:"center",text:s[t]})}u.call(this,0),u.call(this,1)},ZI.prototype._formatLabel=function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),n=n.get("labelPrecision");null!=n&&"auto"!==n||(n=e.getPixelPrecision());n=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel({value:Math.round(t)}):t.toFixed(Math.min(n,20));return F(i)?i(t,n):H(i)?i.replace("{value}",n):n},ZI.prototype._showDataInfo=function(t){t=this._dragging||t;var e=this._displayables,n=e.handleLabels;n[0].attr("invisible",!t),n[1].attr("invisible",!t),e.moveHandle&&this.api[t?"enterEmphasis":"leaveEmphasis"](e.moveHandle,1)},ZI.prototype._onDragMove=function(t,e,n,i){this._dragging=!0,Jt(i.event);n=ec([e,n],this._displayables.sliderGroup.getLocalTransform(),!0),t=this._updateInterval(t,n[0]),n=this.dataZoomModel.get("realtime");this._updateView(!n),t&&n&&this._dispatchZoomAction(!0)},ZI.prototype._onDragEnd=function(){this._dragging=!1,this._showDataInfo(!1),this.dataZoomModel.get("realtime")||this._dispatchZoomAction(!1)},ZI.prototype._onClickPanel=function(t){var e=this._size,t=this._displayables.sliderGroup.transformCoordToLocal(t.offsetX,t.offsetY);t[0]<0||t[0]>e[0]||t[1]<0||t[1]>e[1]||(e=((e=this._handleEnds)[0]+e[1])/2,e=this._updateInterval("all",t[0]-e),this._updateView(),e&&this._dispatchZoomAction(!1))},ZI.prototype._onBrushStart=function(t){var e=t.offsetX,t=t.offsetY;this._brushStart=new Mn(e,t),this._brushing=!0,this._brushStartTime=+new Date},ZI.prototype._onBrushEnd=function(t){var e,n,i;this._brushing&&(i=this._displayables.brushRect,this._brushing=!1,i&&(i.attr("ignore",!0),e=i.shape,+new Date-this._brushStartTime<200&&Math.abs(e.width)<5||(n=this._getViewExtent(),i=[0,100],this._range=Hl([Bl(e.x,n,i,!0),Bl(e.x+e.width,n,i,!0)]),this._handleEnds=[e.x,e.x+e.width],this._updateView(),this._dispatchZoomAction(!1))))},ZI.prototype._onBrush=function(t){this._brushing&&(Jt(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},ZI.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new GI({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);i=this._brushStart,n=this._displayables.sliderGroup,e=n.transformCoordToLocal(t,e),n=n.transformCoordToLocal(i.x,i.y),i=this._size;e[0]=Math.max(Math.min(i[0],e[0]),0),r.setShape({x:n[0],y:0,width:e[0]-n[0],height:i[1]})},ZI.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?YI:null,start:e[0],end:e[1]})},ZI.prototype._findCoordRect=function(){var t,e,n=AI(this.dataZoomModel).infoList;return!t&&n.length&&(t=(e=n[0].model.coordinateSystem).getRect&&e.getRect()),t||(t={x:.2*(n=this.api.getWidth()),y:.2*(e=this.api.getHeight()),width:.6*n,height:.6*e}),t},ZI.type="dataZoom.slider",ZI);function ZI(){var t=null!==HI&&HI.apply(this,arguments)||this;return t.type=ZI.type,t._displayables={},t}function jI(t){return"vertical"===t?"ns-resize":"ew-resize"}Pg.registerClass(nl);var qI=E,KI=Hl,$I=(JI.prototype.hostedBy=function(t){return this._dataZoomModel===t},JI.prototype.getDataValueWindow=function(){return this._valueWindow.slice()},JI.prototype.getDataPercentWindow=function(){return this._percentWindow.slice()},JI.prototype.getTargetSeriesModels=function(){var n=[];return this.ecModel.eachSeries(function(t){var e;e=(e=t).get("coordinateSystem"),0<=L(TI,e)&&(e=CI(this._dimName),(e=t.getReferringComponents(e,Mu).models[0])&&this._axisIndex===e.componentIndex&&n.push(t))},this),n},JI.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},JI.prototype.getMinMaxSpan=function(){return I(this._minMaxSpan)},JI.prototype.calculateDataWindow=function(i){var r,o=this._dataExtent,s=this.getAxisModel().axis.scale,a=this._dataZoomModel.getRangePropMode(),l=[0,100],u=[],h=[];qI(["start","end"],function(t,e){var n=i[t],t=i[t+"Value"];"percent"===a[e]?(null==n&&(n=l[e]),t=s.parse(Bl(n,l,o))):(r=!0,n=Bl(t=null==t?o[e]:s.parse(t),o,l)),h[e]=t,u[e]=n}),KI(h),KI(u);var c=this._minMaxSpan;function t(t,e,n,i,r){var o=r?"Span":"ValueSpan";BI(0,t,n,"all",c["min"+o],c["max"+o]);for(var a=0;a<2;a++)e[a]=Bl(t[a],n,i,!0),r&&(e[a]=s.parse(e[a]))}return r?t(h,u,o,l,!1):t(u,h,l,o,!0),{valueWindow:h,percentWindow:u}},JI.prototype.reset=function(t){var e;t===this._dataZoomModel&&(e=this.getTargetSeriesModels(),this._dataExtent=function(t,e,n){var i=[1/0,-1/0];qI(n,function(t){lb(i,t.getData(),e)});t=t.getAxisModel(),t=$x(t.axis.scale,t,i).calculate();return[t.min,t.max]}(this,this._dimName,e),this._updateMinMaxSpan(),t=this.calculateDataWindow(t.settledOption),this._valueWindow=t.valueWindow,this._percentWindow=t.percentWindow,this._setAxisModel())},JI.prototype.filterData=function(t,e){var i,n,r,h;t===this._dataZoomModel&&(i=this._dimName,n=this.getTargetSeriesModels(),r=t.get("filterMode"),h=this._valueWindow,"none"!==r&&qI(n,function(n){var l=n.getData(),u=l.mapDimensionsAll(i);u.length&&("weakFilter"===r?l.filterSelf(function(t){for(var e,n,i,r=0;r<u.length;r++){var o=l.get(u[r],t),a=!isNaN(o),s=o<h[0],o=o>h[1];if(a&&!s&&!o)return!0;a&&(i=!0),s&&(e=!0),o&&(n=!0)}return i&&e&&n}):qI(u,function(t){var e;"empty"===r?n.setData(l=l.map(t,function(t){return(e=t)>=h[0]&&e<=h[1]?t:NaN;var e})):((e={})[t]=h,l.selectRange(e))}),qI(u,function(t){l.setApproximateExtent(h,t)}))}))},JI.prototype._updateMinMaxSpan=function(){var i=this._minMaxSpan={},r=this._dataZoomModel,o=this._dataExtent;qI(["min","max"],function(t){var e=r.get(t+"Span"),n=r.get(t+"ValueSpan");null!=n&&(n=this.getAxisModel().axis.scale.parse(n)),null!=n?e=Bl(o[0]+n,o,[0,100],!0):null!=e&&(n=Bl(e,[0,100],o,!0)-o[0]),i[t+"Span"]=e,i[t+"ValueSpan"]=n},this)},JI.prototype._setAxisModel=function(){var t,e=this.getAxisModel(),n=this._percentWindow,i=this._valueWindow;n&&(t=Ul(i,[0,500]),t=Math.min(t,20),e=e.axis.scale.rawExtentInfo,0!==n[0]&&e.setDeterminedMinMax("min",+i[0].toFixed(t)),100!==n[1]&&e.setDeterminedMinMax("max",+i[1].toFixed(t)),e.freeze())},JI);function JI(t,e,n,i){this._dimName=t,this._axisIndex=e,this.ecModel=i,this._dataZoomModel=n}o_(g.PROCESSOR.FILTER,{getTargetSeries:function(o){function t(r){o.eachComponent("dataZoom",function(i){i.eachTargetAxis(function(t,e){var n=o.getComponent(CI(t),e);r(t,e,n,i)})})}t(function(t,e,n,i){n.__dzAxisProxy=null});var r=[];t(function(t,e,n,i){n.__dzAxisProxy||(n.__dzAxisProxy=new $I(t,e,i,o),r.push(n.__dzAxisProxy))});var e=ht();return E(r,function(t){E(t.getTargetSeriesModels(),function(t){e.set(t.uid,t)})}),e},overallReset:function(t,i){t.eachComponent("dataZoom",function(n){n.eachTargetAxis(function(t,e){n.getAxisProxy(t,e).reset(n)}),n.eachTargetAxis(function(t,e){n.getAxisProxy(t,e).filterData(n,i)})}),t.eachComponent("dataZoom",function(t){var e,n=t.findRepresentativeAxisProxy();n&&(e=n.getDataPercentWindow(),n=n.getDataValueWindow(),t.setCalculatedRange({start:e[0],end:e[1],startValue:n[0],endValue:n[1]}))})}}),a_("dataZoom",function(e,t){E(II(t,e),function(t){t.setRawRange({start:e.start,end:e.end,startValue:e.startValue,endValue:e.endValue})})});var QI,nl=(l(tA,QI=Fs),tA.type="dataZoom.inside",tA.defaultOption=Vc(Fs.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),tA);function tA(){var t=null!==QI&&QI.apply(this,arguments)||this;return t.type=tA.type,t}qp.registerClass(nl);var eA="\0_ec_interaction_mutex";function nA(t,e){return iA(t)[e]}function iA(t){return t[eA]||(t[eA]={})}a_({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){});var rA,oA=(l(aA,rA=Et),aA.prototype.isDragging=function(){return this._dragging},aA.prototype.isPinching=function(){return this._pinching},aA.prototype.setPointerChecker=function(t){this.pointerChecker=t},aA.prototype.dispose=function(){this.disable()},aA.prototype._mousedownHandler=function(t){var e,n;Qt(t)||t.target&&t.target.draggable||(e=t.offsetX,n=t.offsetY,this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0))},aA.prototype._mousemoveHandler=function(t){var e,n,i,r,o,a;this._dragging&&uA("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!nA(this._zr,"globalPan")&&(e=t.offsetX,n=t.offsetY,o=e-(i=this._x),a=n-(r=this._y),this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&Jt(t.event),lA(this,"pan","moveOnMouseMove",t,{dx:o,dy:a,oldX:i,oldY:r,newX:e,newY:n,isAvailableBehavior:null}))},aA.prototype._mouseupHandler=function(t){Qt(t)||(this._dragging=!1)},aA.prototype._mousewheelHandler=function(t){var e=uA("zoomOnMouseWheel",t,this._opt),n=uA("moveOnMouseWheel",t,this._opt),i=t.wheelDelta,r=Math.abs(i),o=t.offsetX,a=t.offsetY;0!==i&&(e||n)&&(e&&(r=3<r?1.4:1<r?1.2:1.1,sA(this,"zoom","zoomOnMouseWheel",t,{scale:0<i?r:1/r,originX:o,originY:a,isAvailableBehavior:null})),n&&sA(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(0<i?1:-1)*(3<(i=Math.abs(i))?.4:1<i?.15:.05),originX:o,originY:a,isAvailableBehavior:null}))},aA.prototype._pinchHandler=function(t){nA(this._zr,"globalPan")||sA(this,"zoom",null,t,{scale:1<t.pinchScale?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},aA);function aA(n){var t=rA.call(this)||this;t._zr=n;var i=z(t._mousedownHandler,t),r=z(t._mousemoveHandler,t),o=z(t._mouseupHandler,t),a=z(t._mousewheelHandler,t),s=z(t._pinchHandler,t);return t.enable=function(t,e){this.disable(),this._opt=D(I(e)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(n.on("mousedown",i),n.on("mousemove",r),n.on("mouseup",o)),!0!==t&&"scale"!==t&&"zoom"!==t||(n.on("mousewheel",a),n.on("pinch",s))},t.disable=function(){n.off("mousedown",i),n.off("mousemove",r),n.off("mouseup",o),n.off("mousewheel",a),n.off("pinch",s)},t}function sA(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(Jt(i.event),lA(t,e,n,i,r))}function lA(t,e,n,i,r){r.isAvailableBehavior=z(uA,null,n,i),t.trigger(e,r)}function uA(t,e,n){n=n[t];return!t||n&&(!H(n)||e.event[n+"Key"])}var hA=bu();function cA(t,e){e&&(t.removeKey(e.model.uid),(e=e.controller)&&e.dispose())}function pA(t,e){t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function dA(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}o_(g.PROCESSOR.FILTER,function(t,a){var e=hA(a),l=e.coordSysRecordMap||(e.coordSysRecordMap=ht());l.each(function(t){t.dataZoomInfoMap=null}),t.eachComponent({mainType:"dataZoom",subType:"inside"},function(r){E(AI(r).infoList,function(t){var e,o,n,i=t.model.uid,e=l.get(i)||l.set(i,(e=a,i=t.model,o={model:i,containsPoint:B(dA,i),dispatchAction:B(pA,e),dataZoomInfoMap:null,controller:null},n=o.controller=new oA(e.getZr()),E(["pan","zoom","scrollMove"],function(r){n.on(r,function(n){var i=[];o.dataZoomInfoMap.each(function(t){var e;n.isAvailableBehavior(t.model.option)&&(e=(e=(t.getRange||{})[r])&&e(t.dzReferCoordSysInfo,o.model.mainType,o.controller,n),!t.model.get("disabled",!0)&&e&&i.push({dataZoomId:t.model.id,start:e[0],end:e[1]}))}),i.length&&o.dispatchAction(i)})}),o));(e.dataZoomInfoMap||(e.dataZoomInfoMap=ht())).set(r.uid,{dzReferCoordSysInfo:t,model:r,getRange:null})})}),l.each(function(t){var e,n,i,r,o,a=t.controller,s=t.dataZoomInfoMap;!s||null!=(n=s.keys()[0])&&(e=s.get(n)),e?(r={type_true:2,type_move:1,type_false:0,type_undefined:-1},o=!0,s.each(function(t){var e=t.model,t=!e.get("disabled",!0)&&(!e.get("zoomLock",!0)||"move");r["type_"+i]<r["type_"+t]&&(i=t),o=o&&e.get("preventDefaultMouseMove",!0)}),s={controlType:i,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!o}},a.enable(s.controlType,s.opt),a.setPointerChecker(t.containsPoint),jg(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")):cA(l,t)})});var fA,nl=(l(gA,fA=Ca),gA.prototype.render=function(t,e,n){var i,r;fA.prototype.render.apply(this,arguments),t.noTarget()?this._clear():(this.range=t.getPercentRange(),n=n,i=t,r={pan:z(yA.pan,this),zoom:z(yA.zoom,this),scrollMove:z(yA.scrollMove,this)},hA(n).coordSysRecordMap.each(function(t){t=t.dataZoomInfoMap.get(i.uid);t&&(t.getRange=r)}))},gA.prototype.dispose=function(){this._clear(),fA.prototype.dispose.apply(this,arguments)},gA.prototype._clear=function(){!function(t,e){for(var n=hA(t).coordSysRecordMap,i=n.keys(),r=0;r<i.length;r++){var o=i[r],a=n.get(o),s=a.dataZoomInfoMap;s&&(o=e.uid,s.get(o)&&(s.removeKey(o),s.keys().length||cA(n,a)))}}(this.api,this.dataZoomModel),this.range=null},gA.type="dataZoom.inside",gA);function gA(){var t=null!==fA&&fA.apply(this,arguments)||this;return t.type="dataZoom.inside",t}var yA={zoom:function(t,e,n,i){var r=this.range,o=r.slice(),a=t.axisModels[0];if(a){t=vA[e](null,[i.originX,i.originY],a,n,t),t=(0<t.signal?t.pixelStart+t.pixelLength-t.pixel:t.pixel-t.pixelStart)/t.pixelLength*(o[1]-o[0])+o[0],i=Math.max(1/i.scale,0);o[0]=(o[0]-t)*i+t,o[1]=(o[1]-t)*i+t;t=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return BI(0,o,[0,100],0,t.minSpan,t.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:mA(function(t,e,n,i,r,o){n=vA[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return n.signal*(t[1]-t[0])*n.pixel/n.pixelLength}),scrollMove:mA(function(t,e,n,i,r,o){return vA[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta})};function mA(s){return function(t,e,n,i){var r=this.range,o=r.slice(),a=t.axisModels[0];if(a)return BI(s(o,a,t,e,n,i),o,[0,100],"all"),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}}var vA={grid:function(t,e,n,i,r){var o=n.axis,n={},r=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(n.pixel=e[0]-t[0],n.pixelLength=r.width,n.pixelStart=r.x,n.signal=o.inverse?1:-1):(n.pixel=e[1]-t[1],n.pixelLength=r.height,n.pixelStart=r.y,n.signal=o.inverse?-1:1),n},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),r=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=r[1]-r[0],a.pixelStart=r[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,n=r.model.coordinateSystem.getRect(),r={};return t=t||[0,0],"horizontal"===o.orient?(r.pixel=e[0]-t[0],r.pixelLength=n.width,r.pixelStart=n.x,r.signal=o.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=n.height,r.pixelStart=n.y,r.signal=o.inverse?-1:1),r}};Pg.registerClass(nl);function _A(){}var xA={};function bA(t,e){xA[t]=e}function wA(t){return xA[t]}var SA,nl=(l(MA,SA=qp),MA.prototype.optionUpdated=function(){SA.prototype.optionUpdated.apply(this,arguments);var n=this.ecModel;E(this.option.feature,function(t,e){e=wA(e);e&&(e.getDefaultOption&&(e.defaultOption=e.getDefaultOption(n)),b(t,e.defaultOption))})},MA.type="toolbox",MA.layoutMode={type:"box",ignoreSize:!0},MA.defaultOption={show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1}},MA);function MA(){var t=null!==SA&&SA.apply(this,arguments)||this;return t.type=MA.type,t}qp.registerClass(nl);var TA,nl=(l(CA,TA=Pg),CA.prototype.render=function(h,c,p,o){var d,a,s,l,t,e,n,i,r,u,f=this.group;function g(t,e){var n,i=l[t],r=l[e],t=a[i],e=new Ec(t,h,h.ecModel);if(o&&null!=o.newTitle&&o.featureName===i&&(t.title=o.newTitle),i&&!r){if(0===i.indexOf("my"))n={onclick:e.option.onclick,featureName:i};else{t=wA(i);if(!t)return;n=new t}s[i]=n}else if(!(n=s[r]))return;if(n.uid=Bc("toolbox-feature"),n.model=e,n.ecModel=c,n.api=p,n instanceof _A){if(!i&&r)return void(n.dispose&&n.dispose(c,p));if(!e.get("show")||n.unusable)return void(n.remove&&n.remove(c,p))}!function(r,o,t){var e,a,s=r.getModel("iconStyle"),l=r.getModel(["emphasis","iconStyle"]),n=o instanceof _A&&o.getIcons?o.getIcons():r.get("icon"),i=r.get("title")||{};"string"==typeof n?(e={})[t]=n:e=n;"string"==typeof i?(a={})[t]=i:a=i;var u=r.iconPaths={};E(e,function(t,e){var n=ac(t,{},{x:-d/2,y:-d/2,width:d,height:d});n.setStyle(s.getItemStyle()),n.ensureState("emphasis").style=l.getItemStyle();var i=new Ss({style:{text:a[e],align:l.get("textAlign"),borderRadius:l.get("textBorderRadius"),padding:l.get("textPadding"),fill:null},ignore:!0});n.setTextContent(i);t=h.getModel("tooltip");t&&t.get("show")&&(n.tooltip=A({content:a[e],formatter:t.get("formatter",!0)||function(){return a[e]},formatterParams:{componentType:"toolbox",name:e,title:a[e],$vars:["name","title"]},position:t.get("position",!0)||"bottom"},t.option)),n.__title=a[e],n.on("mouseover",function(){var t=l.getItemStyle(),e="vertical"===h.get("orient")?null==h.get("right")?"right":"left":null==h.get("bottom")?"bottom":"top";i.setStyle({fill:l.get("textFill")||t.fill||t.stroke||"#000",backgroundColor:l.get("textBackgroundColor")}),n.setTextConfig({position:l.get("textPosition")||e}),i.ignore=!h.get("showTitle"),xh(this)}).on("mouseout",function(){"emphasis"!==r.get(["iconStatus",e])&&bh(this),i.hide()}),("emphasis"===r.get(["iconStatus",e])?xh:bh)(n),f.add(n),n.on("click",z(o.onclick,o,c,p,e)),u[e]=n})}(e,n,i),e.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?xh:bh)(i[t])},n instanceof _A&&n.render&&n.render(e,c,p,o)}f.removeAll(),h.get("show")&&(d=+h.get("itemSize"),a=h.get("feature")||{},s=this._features||(this._features={}),l=[],E(a,function(t,e){l.push(e)}),new d_(this._featureNames||[],l).add(g).update(g).remove(B(g,null)).execute(),this._featureNames=l,t=f,n=p,i=(e=h).getBoxLayoutParams(),r=e.get("padding"),u={width:n.getWidth(),height:n.getHeight()},n=Bp(i,u,r),zp(e.get("orient"),t,e.get("itemGap"),n.width,n.height),Vp(t,i,u,r),f.add(ZT(f.getBoundingRect(),h)),f.eachChild(function(t){var e=t.__title,n=t.ensureState("emphasis"),i=n.textConfig||(n.textConfig={}),r=t.getTextContent(),o=r&&r.states.emphasis;o&&!F(o)&&e&&(n=o.style||(o.style={}),r=Wn(e,Ss.makeFont(n)),o=t.x+f.x,e=!1,t.y+f.y+d+r.height>p.getHeight()&&(i.position="top",e=!0),e=e?-5-r.height:d+8,o+r.width/2>p.getWidth()?(i.position=["100%",e],n.align="right"):o-r.width/2<0&&(i.position=[0,e],n.align="left"))}))},CA.prototype.updateView=function(t,e,n,i){E(this._features,function(t){t instanceof _A&&t.updateView&&t.updateView(t.model,e,n,i)})},CA.prototype.remove=function(e,n){E(this._features,function(t){t instanceof _A&&t.remove&&t.remove(e,n)}),this.group.removeAll()},CA.prototype.dispose=function(e,n){E(this._features,function(t){t instanceof _A&&t.dispose&&t.dispose(e,n)})},CA.type="toolbox",CA);function CA(){return null!==TA&&TA.apply(this,arguments)||this}Pg.registerClass(nl);var IA,nl=(l(AA,IA=_A),AA.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",r="svg"===e.getZr().painter.getType()?"svg":n.get("type",!0)||"png",e=e.getConnectedDataURL({type:r,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if("function"!=typeof MouseEvent||w.browser.ie||w.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var o=atob(e.split(",")[1]),a=o.length,s=new Uint8Array(a);a--;)s[a]=o.charCodeAt(a);t=new Blob([s]);window.navigator.msSaveOrOpenBlob(t,i+"."+r)}else{var l=n.get("lang"),l='<body style="margin:0;"><img src="'+e+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>';window.open().document.write(l)}else{l=document.createElement("a");l.download=i+"."+r,l.target="_blank",l.href=e;e=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});l.dispatchEvent(e)}},AA.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocale(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:t.getLocale(["toolbox","saveAsImage","lang"])}},AA);function AA(){return null!==IA&&IA.apply(this,arguments)||this}nl.prototype.unusable=!w.canvasSupported,bA("saveAsImage",nl);var DA,kA="__ec_magicType_stack__",LA=[["line","bar"],["stack"]],nl=(l(PA,DA=_A),PA.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),function(t){e[t]&&(n[t]=e[t])}),n},PA.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocale(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},PA.prototype.onclick=function(t,e,a){var s,n,l=this.model,i=l.get(["seriesIndex",a]);OA[a]&&(s={series:[]},E(LA,function(t){0<=L(t,a)&&E(t,function(t){l.setIconStatus(t,"normal")})}),l.setIconStatus(a,"emphasis"),t.eachComponent({mainType:"series",query:null==i?null:{seriesIndex:i}},function(t){var e=t.subType,n=t.id,n=OA[a](e,n,t,l);n&&(D(n,t.option),s.series.push(n));n=t.coordinateSystem;if(n&&"cartesian2d"===n.type&&("line"===a||"bar"===a)){n=n.getAxesByScale("ordinal")[0];if(n){var i=n.dim+"Axis",r=t.getReferringComponents(i,Mu).models[0].componentIndex;s[i]=s[i]||[];for(var o=0;o<=r;o++)s[i][r]=s[i][r]||{};s[i][r].boundaryGap="bar"===a}}}),"stack"===a&&(n=b({stack:l.option.title.tiled,tiled:l.option.title.stack},l.option.title)),e.dispatchAction({type:"changeMagicType",currentType:a,newOption:s,newTitle:n,featureName:"magicType"}))},PA);function PA(){return null!==DA&&DA.apply(this,arguments)||this}var OA={line:function(t,e,n,i){if("bar"===t)return b({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return b({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){n=n.get("stack")===kA;if("line"===t||"bar"===t)return i.setIconStatus("stack",n?"normal":"emphasis"),b({id:e,stack:n?"":kA},i.get(["option","stack"])||{},!0)}};a_({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),bA("magicType",nl);var RA=new Array(60).join("-"),EA="\t";function NA(t){var r,o,a,h,t=(r={},o=[],a=[],t.eachRawSeries(function(t){var e,n,i=t.coordinateSystem;i&&("cartesian2d"===i.type||"polar"===i.type)&&"category"===(e=i.getBaseAxis()).type?(n=e.dim+"_"+e.index,r[n]||(r[n]={categoryAxis:e,valueAxis:i.getOtherAxis(e),series:[]},a.push({axisDim:e.dim,axisIndex:e.index})),r[n].series.push(t)):o.push(t)}),{seriesGroupByCategoryAxis:r,other:o,meta:a});return{value:R([(h=[],E(t.seriesGroupByCategoryAxis,function(t,e){var n=t.categoryAxis,i=t.valueAxis.dim,r=[" "].concat(O(t.series,function(t){return t.name})),o=[n.model.getCategories()];E(t.series,function(t){var e=t.getRawData();o.push(t.getRawData().mapArray(e.mapDimension(i),function(t){return t}))});for(var a=[r.join(EA)],s=0;s<o[0].length;s++){for(var l=[],u=0;u<o.length;u++)l.push(o[u][s]);a.push(l.join(EA))}h.push(a.join("\n"))}),h.join("\n\n"+RA+"\n\n")),O(t.other,function(t){var i=t.getRawData(),r=[t.name],o=[];return i.each(i.dimensions,function(){for(var t=arguments.length,e=arguments[t-1],e=i.getName(e),n=0;n<t-1;n++)o[n]=arguments[n];r.push((e?e+EA:"")+o.join(EA))}),r.join("\n")}).join("\n\n"+RA+"\n\n")],function(t){return!!t.replace(/[\n\t\s]/g,"")}).join("\n\n"+RA+"\n\n"),meta:t.meta}}function zA(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var BA,VA=new RegExp("["+EA+"]+","g");function FA(t,r){var t=t.split(new RegExp("\n*"+RA+"\n*","g")),o={series:[]};return E(t,function(t,e){var n,i;0<=(i=t).slice(0,i.indexOf("\n")).indexOf(EA)?(n=function(t){for(var e=t.split(/\n+/g),n=[],i=O(zA(e.shift()).split(VA),function(t){return{name:t,data:[]}}),r=0;r<e.length;r++){var o=zA(e[r]).split(VA);n.push(o.shift());for(var a=0;a<o.length;a++)i[a]&&(i[a].data[r]=o[a])}return{series:i,categories:n}}(t),e=(i=r[e]).axisDim+"Axis",i&&(o[e]=o[e]||[],o[e][i.axisIndex]={data:n.categories},o.series=o.series.concat(n.series))):(n=function(t){for(var e=t.split(/\n+/g),t=zA(e.shift()),n=[],i=0;i<e.length;i++){var r=zA(e[i]);if(r){for(var o,a=r.split(VA),s=void 0,r=!1,s=isNaN(a[0])?(r=!0,o=a[0],a=a.slice(1),n[i]={name:o,value:[]},n[i].value):n[i]=[],l=0;l<a.length;l++)s.push(+a[l]);1===s.length&&(r?n[i].value=s[0]:n[i]=s[0])}}return{name:t,data:n}}(t),o.series.push(n))}),o}function HA(){return null!==BA&&BA.apply(this,arguments)||this}bA("dataView",(l(HA,BA=_A),HA.prototype.onclick=function(t,e){var n=e.getDom(),i=this.model;this._dom&&n.removeChild(this._dom);var r=document.createElement("div");r.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",r.style.backgroundColor=i.get("backgroundColor")||"#fff";var o=document.createElement("h4"),a=i.get("lang")||[];o.innerHTML=a[0]||i.get("title"),o.style.cssText="margin: 10px 20px;",o.style.color=i.get("textColor");var s=document.createElement("div"),l=document.createElement("textarea");s.style.cssText="display:block;width:100%;overflow:auto;";var u=i.get("optionToContent"),h=i.get("contentToOption"),c=NA(t);"function"==typeof u?"string"==typeof(f=u(e.getOption()))?s.innerHTML=f:Z(f)&&s.appendChild(f):(s.appendChild(l),l.readOnly=i.get("readOnly"),l.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",l.style.color=i.get("textColor"),l.style.borderColor=i.get("textareaBorderColor"),l.style.backgroundColor=i.get("textareaColor"),l.value=c.value);var p=c.meta,d=document.createElement("div");d.style.cssText="position:absolute;bottom:0;left:0;right:0;";var t="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",f=document.createElement("div"),c=document.createElement("div");t+=";background-color:"+i.get("buttonColor"),t+=";color:"+i.get("buttonTextColor");var g=this;function y(){n.removeChild(r),g._dom=null}$t(f,"click",y),$t(c,"click",function(){if(null==h&&null!=u||null!=h&&null==u)y();else{var t;try{t="function"==typeof h?h(s,e.getOption()):FA(l.value,p)}catch(t){throw y(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),y()}}),f.innerHTML=a[1],c.innerHTML=a[2],c.style.cssText=t,f.style.cssText=t,i.get("readOnly")||d.appendChild(c),d.appendChild(f),r.appendChild(o),r.appendChild(s),r.appendChild(d),s.style.height=n.clientHeight-80+"px",n.appendChild(r),this._dom=r},HA.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},HA.prototype.dispose=function(t,e){this.remove(t,e)},HA.getDefaultOption=function(t){return{show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:t.getLocale(["toolbox","dataView","title"]),lang:t.getLocale(["toolbox","dataView","lang"]),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"}},HA)),a_({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,r){var o=[];E(t.newOption.series,function(t){var e,i,n=r.getSeriesByName(t.name)[0];n?(e=n.get("data"),o.push({name:t.name,data:(n=t.data,i=e,O(n,function(t,e){var n=i&&i[e];if(!U(n)||V(n))return t;U(t)&&!V(t)||(t={value:t});e=null!=n.name&&null==t.name;return t=D(t,n),e&&delete t.name,t}))})):o.push(A({type:"scatter"},t))}),r.mergeOption(D({series:o},t.newOption))});var GA,WA=!0,UA=Math.min,XA=Math.max,YA=Math.pow,ZA=1e4,jA=6,qA=6,KA="globalPan",$A={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},JA={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},QA={brushStyle:{lineWidth:2,stroke:"rgba(210,219,238,0.3)",fill:"#D2DBEE"},transformable:!0,brushMode:"single",removeOnClick:!1},tD=0,eD=(l(nD,GA=Et),nD.prototype.enableBrush=function(t){return this._brushType&&this._doDisableBrush(),t.brushType&&this._doEnableBrush(t),this},nD.prototype._doEnableBrush=function(t){var e,n,i,r=this._zr;this._enableGlobalPan||(e=r,n=KA,i=this._uid,iA(e)[n]=i),E(this._handlers,function(t,e){r.on(e,t)}),this._brushType=t.brushType,this._brushOption=b(I(QA),t,!0)},nD.prototype._doDisableBrush=function(){var t,e,n,i=this._zr;t=i,e=KA,n=this._uid,(t=iA(t))[e]===n&&(t[e]=null),E(this._handlers,function(t,e){i.off(e,t)}),this._brushType=this._brushOption=null},nD.prototype.setPanels=function(t){var e;return t&&t.length?(e=this._panels={},E(t,function(t){e[t.panelId]=I(t)})):this._panels=null,this},nD.prototype.mount=function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({x:t.x||0,y:t.y||0,rotation:t.rotation||0,scaleX:t.scaleX||1,scaleY:t.scaleY||1}),this._transform=e.getLocalTransform(),this},nD.prototype.updateCovers=function(i){i=O(i,function(t){return b(I(QA),t,!0)});var n="\0-brush-index-",r=this._covers,o=this._covers=[],a=this,s=this._creatingCover;return new d_(r,i,function(t,e){return l(t.__brushOption,e)},l).add(t).update(t).remove(function(t){r[t]!==s&&a.group.remove(r[t])}).execute(),this;function l(t,e){return(null!=t.id?t.id:n+e)+"-"+t.brushType}function t(t,e){var n=i[t];null!=e&&r[e]===s?o[t]=r[e]:(n=o[t]=null!=e?(r[e].__brushOption=n,r[e]):rD(a,iD(a,n)),sD(a,n))}},nD.prototype.unmount=function(){return this.enableBrush(!1),cD(this),this._zr.remove(this.group),this},nD.prototype.dispose=function(){this.unmount(),this.off()},nD);function nD(t){var e=GA.call(this)||this;return e._track=[],e._covers=[],e._handlers={},e._zr=t,e.group=new Ho,e._uid="brushController_"+tD++,E(kD,function(t,e){this._handlers[e]=z(t,this)},e),e}function iD(t,e){var n=PD[e.brushType].createCover(t,e);return n.__brushOption=e,aD(n,e),t.group.add(n),n}function rD(t,e){var n=lD(e);return n.endCreating&&(n.endCreating(t,e),aD(e,e.__brushOption)),e}function oD(t,e){var n=e.__brushOption;lD(e).updateCoverShape(t,e,n.range,n)}function aD(t,e){var n=e.z;null==n&&(n=ZA),t.traverse(function(t){t.z=n,t.z2=n})}function sD(t,e){lD(e).updateCommon(t,e),oD(t,e)}function lD(t){return PD[t.__brushOption.brushType]}function uD(t,e,n){var i,r=t._panels;if(!r)return WA;var o=t._transform;return E(r,function(t){t.isTargetByCursor(e,n,o)&&(i=t)}),i}function hD(t,e){t=t._panels;if(!t)return WA;e=e.__brushOption.panelId;return null!=e?t[e]:WA}function cD(e){var t=e._covers,n=t.length;return E(t,function(t){e.group.remove(t)},e),t.length=0,n}function pD(t,e){var n=O(t._covers,function(t){var e=t.__brushOption,t=I(e.range);return{brushType:e.brushType,panelId:e.panelId,range:t}});t.trigger("brush",{areas:n,isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function dD(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function fD(e,n,t,i){var r=new Ho;return r.add(new oa({name:"main",style:vD(t),silent:!0,draggable:!0,cursor:"move",drift:B(bD,e,n,r,["n","s","w","e"]),ondragend:B(pD,n,{isEnd:!0})})),E(i,function(t){r.add(new oa({name:t.join(""),style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:B(bD,e,n,r,t),ondragend:B(pD,n,{isEnd:!0})}))}),r}function gD(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=XA(r,qA),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],p=h-o+r/2,d=c-o+r/2,n=h-a,h=c-s,c=n+r,r=h+r;mD(t,e,"main",a,s,n,h),i.transformable&&(mD(t,e,"w",l,u,o,r),mD(t,e,"e",p,u,o,r),mD(t,e,"n",l,u,c,o),mD(t,e,"s",l,d,c,o),mD(t,e,"nw",l,u,o,o),mD(t,e,"ne",p,u,o,o),mD(t,e,"sw",l,d,o,o),mD(t,e,"se",p,d,o,o))}function yD(n,i){var t=i.__brushOption,r=t.transformable,e=i.childAt(0);e.useStyle(vD(t)),e.attr({silent:!r,cursor:r?"move":"default"}),E([["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]],function(t){var e=i.childOfName(t.join("")),t=1===t.length?xD(n,t[0]):function(t,e){e=[xD(t,e[0]),xD(t,e[1])];return"e"!==e[0]&&"w"!==e[0]||e.reverse(),e.join("")}(n,t);e&&e.attr({silent:!r,invisible:!r,cursor:r?JA[t]+"-resize":null})})}function mD(t,e,n,i,r,o,a){n=e.childOfName(n);n&&n.setShape((i=MD(t,e,[[i,r],[i+o,r+a]]),o=UA(i[0][0],i[1][0]),r=UA(i[0][1],i[1][1]),a=XA(i[0][0],i[1][0]),i=XA(i[0][1],i[1][1]),{x:o,y:r,width:a-o,height:i-r}))}function vD(t){return D({strokeNoScale:!0},t.brushStyle)}function _D(t,e,n,i){var r=[UA(t,n),UA(e,i)],i=[XA(t,n),XA(e,i)];return[[r[0],i[0]],[r[1],i[1]]]}function xD(t,e){return{left:"w",right:"e",top:"n",bottom:"s"}[nc({w:"left",e:"right",n:"top",s:"bottom"}[e],tc(t.group))]}function bD(t,e,n,i,r,o){var a=n.__brushOption,s=t.toRectRange(a.range),l=SD(e,r,o);E(i,function(t){t=$A[t];s[t[0]][t[1]]+=l[t[0]]}),a.range=t.fromRectRange(_D(s[0][0],s[1][0],s[0][1],s[1][1])),sD(e,n),pD(e,{isEnd:!1})}function wD(t,e,n,i){var r=e.__brushOption.range,o=SD(t,n,i);E(r,function(t){t[0]+=o[0],t[1]+=o[1]}),sD(t,e),pD(t,{isEnd:!1})}function SD(t,e,n){t=t.group,n=t.transformCoordToLocal(e,n),t=t.transformCoordToLocal(0,0);return[n[0]-t[0],n[1]-t[1]]}function MD(t,e,n){e=hD(t,e);return e&&e!==WA?e.clipPath(n,t._transform):I(n)}function TD(t,e,n){if(t._brushType&&!function(t,e,n){t=t._zr;return e<0||e>t.getWidth()||n<0||n>t.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=uD(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(o===WA||s.panelId===o.panelId)&&PD[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}function CD(t){t=t.event;t.preventDefault&&t.preventDefault()}function ID(t,e,n){return t.childOfName("main").contain(e,n)}function AD(t,e,n,i){var r,o,a=t._creatingCover,s=t._creatingPanel,l=t._brushOption;return t._track.push(n.slice()),function(t){if((n=t._track).length){var e=n[n.length-1],t=n[0],n=e[0]-t[0],t=e[1]-t[1],t=YA(n*n+t*t,.5);return jA<t}}(t)||a?(s&&!a&&("single"===l.brushMode&&cD(t),(r=I(l)).brushType=DD(r.brushType,s),r.panelId=s===WA?null:s.panelId,a=t._creatingCover=iD(t,r),t._covers.push(a)),a&&(o=PD[DD(t._brushType,s)],a.__brushOption.range=o.getCreatingRange(MD(t,a,t._track)),i&&(rD(t,a),o.updateCommon(t,a)),oD(t,a),o={isEnd:i})):i&&"single"===l.brushMode&&l.removeOnClick&&uD(t,e,n)&&cD(t)&&(o={isEnd:i,removeOnClick:!0}),o}function DD(t,e){return"auto"===t?e.defaultBrushType:t}var kD={mousedown:function(t){var e;this._dragging?LD(this,t):t.target&&t.target.draggable||(CD(t),e=this.group.transformCoordToLocal(t.offsetX,t.offsetY),this._creatingCover=null,(this._creatingPanel=uD(this,t,e))&&(this._dragging=!0,this._track=[e.slice()]))},mousemove:function(t){var e=t.offsetX,n=t.offsetY,n=this.group.transformCoordToLocal(e,n);TD(this,t,n),this._dragging&&(CD(t),(n=AD(this,t,n,!1))&&pD(this,n))},mouseup:function(t){LD(this,t)}};function LD(t,e){var n,i;t._dragging&&(CD(e),n=e.offsetX,i=e.offsetY,i=t.group.transformCoordToLocal(n,i),i=AD(t,e,i,!0),t._dragging=!1,t._track=[],t._creatingCover=null,i&&pD(t,i))}var PD={lineX:OD(0),lineY:OD(1),rect:{createCover:function(t,e){function n(t){return t}return fD({toRectRange:n,fromRectRange:n},t,e,[["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]])},getCreatingRange:function(t){t=dD(t);return _D(t[1][0],t[1][1],t[0][0],t[0][1])},updateCoverShape:function(t,e,n,i){gD(t,e,n,i)},updateCommon:yD,contain:ID},polygon:{createCover:function(t,e){var n=new Ho;return n.add(new Ma({name:"main",style:vD(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new xa({name:"main",draggable:!0,drift:B(wD,t,e),ondragend:B(pD,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:MD(t,e,n)})},updateCommon:yD,contain:ID}};function OD(a){return{createCover:function(t,e){return fD({toRectRange:function(t){t=[t,[0,100]];return a&&t.reverse(),t},fromRectRange:function(t){return t[a]}},t,e,[[["w"],["e"]],[["n"],["s"]]][a])},getCreatingRange:function(t){t=dD(t);return[UA(t[0][a],t[1][a]),XA(t[0][a],t[1][a])]},updateCoverShape:function(t,e,n,i){var r=hD(t,e),o=[n,r!==WA&&r.getLinearBrushOtherExtent?r.getLinearBrushOtherExtent(a):[0,[(o=t._zr).getWidth(),o.getHeight()][1-a]]];a&&o.reverse(),gD(t,e,o,i)},updateCommon:yD,contain:ID}}var RD={axisPointer:1,tooltip:1,brush:1};function ED(t,i,r){var o=ND(t);return function(t,e){return o.contain(e[0],e[1])&&(n=t,e=r,t=(t=i).getComponentByElement(n.topTarget),n=t&&t.coordinateSystem,!(t&&t!==e&&!RD.hasOwnProperty(t.mainType)&&n&&n.model!==e));var n}}function ND(t){return Rn.create(t)}var zD=["dataToPoint","pointToData"],BD=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],VD=(FD.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,function(t,e,n){(t.coordRanges||(t.coordRanges=[])).push(e),t.coordRange||(t.coordRange=e,e=YD[t.brushType](0,n,e),t.__rangeOffset={offset:jD[t.brushType](e.values,t.range,[1,1]),xyMinMax:e.xyMinMax})}),t},FD.prototype.matchOutputRanges=function(t,i,r){E(t,function(n){var t=this.findTargetInfo(n,i);t&&!0!==t&&E(t.coordSyses,function(t){var e=YD[n.brushType](1,t,n.range);r(n,e.values,t,i)})},this)},FD.prototype.setInputRanges=function(t,i){E(t,function(t){var e,n=this.findTargetInfo(t,i);t.range=t.range||[],n&&!0!==n&&(t.panelId=n.panelId,e=YD[t.brushType](0,n.coordSys,t.coordRange),n=t.__rangeOffset,t.range=n?jD[t.brushType](e.values,n.offset,function(t,e){t=KD(t),e=KD(e),e=[t[0]/e[0],t[1]/e[1]];return isNaN(e[0])&&(e[0]=1),isNaN(e[1])&&(e[1]=1),e}(e.xyMinMax,n.xyMinMax)):e.values)},this)},FD.prototype.makePanelOpts=function(o,a){return O(this._targetInfoList,function(t){var n,i,e,r=t.getPanelRect();return{panelId:t.panelId,defaultBrushType:a?a(t):null,clipPath:(e=ND(e=r),function(t){return oc(t,e)}),isTargetByCursor:ED(r,o,t.coordSysModel),getLinearBrushOtherExtent:(n=ND(n=r),function(t){var e=null!=i?i:t,t=e?n.width:n.height,e=e?n.x:n.y;return[e,e+(t||0)]})}})},FD.prototype.controlSeries=function(t,e,n){n=this.findTargetInfo(t,n);return!0===n||n&&0<=L(n.coordSyses,e.coordinateSystem)},FD.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=GD(e,t),r=0;r<n.length;r++){var o=n[r],a=t.panelId;if(a){if(o.panelId===a)return o}else for(var s=0;s<UD.length;s++)if(UD[s](i,o))return o}return!0},FD);function FD(t,e,n){var i=this;this._targetInfoList=[];var r=GD(e,t);E(WD,function(t,e){n&&n.include&&!(0<=L(n.include,e))||t(r,i._targetInfoList)})}function HD(t){return t[0]>t[1]&&t.reverse(),t}function GD(t,e){return Su(t,e,{includeMainTypes:BD})}var WD={grid:function(t,i){var r=t.xAxisModels,o=t.yAxisModels,t=t.gridModels,e=ht(),a={},s={};(r||o||t)&&(E(r,function(t){t=t.axis.grid.model;e.set(t.id,t),a[t.id]=!0}),E(o,function(t){t=t.axis.grid.model;e.set(t.id,t),s[t.id]=!0}),E(t,function(t){e.set(t.id,t),a[t.id]=!0,s[t.id]=!0}),e.each(function(t){var e=t.coordinateSystem,n=[];E(e.getCartesians(),function(t,e){(0<=L(r,t.getAxis("x").model)||0<=L(o,t.getAxis("y").model))&&n.push(t)}),i.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:n[0],coordSyses:n,getPanelRect:XD.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,n){E(t.geoModels,function(t){var e=t.coordinateSystem;n.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:e,coordSyses:[e],getPanelRect:XD.geo})})}},UD=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,t=t.gridModel;return!t&&n&&(t=n.axis.grid.model),!t&&i&&(t=i.axis.grid.model),t&&t===e.gridModel},function(t,e){t=t.geoModel;return t&&t===e.geoModel}],XD={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(tc(t)),e}},YD={lineX:B(ZD,0),lineY:B(ZD,1),rect:function(t,e,n){var i=e[zD[t]]([n[0][0],n[1][0]]),n=e[zD[t]]([n[0][1],n[1][1]]),n=[HD([i[0],n[0]]),HD([i[1],n[1]])];return{values:n,xyMinMax:n}},polygon:function(e,n,t){var i=[[1/0,-1/0],[1/0,-1/0]];return{values:O(t,function(t){t=n[zD[e]](t);return i[0][0]=Math.min(i[0][0],t[0]),i[1][0]=Math.min(i[1][0],t[1]),i[0][1]=Math.max(i[0][1],t[0]),i[1][1]=Math.max(i[1][1],t[1]),t}),xyMinMax:i}}};function ZD(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=HD(O([0,1],function(t){return e?r.coordToData(r.toLocalCoord(i[t])):r.toGlobalCoord(r.dataToCoord(i[t]))})),n=[];return n[t]=o,n[1-t]=[NaN,NaN],{values:o,xyMinMax:n}}var jD={lineX:B(qD,0),lineY:B(qD,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,n,i){return O(t,function(t,e){return[t[0]-i[0]*n[e][0],t[1]-i[1]*n[e][1]]})}};function qD(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function KD(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var $D=E,JD=bu();function QD(t){t=JD(t);return t.snapshots||(t.snapshots=[{}]),t.snapshots}var tk,Fs=(l(ek,tk=Fs),ek.type="dataZoom.select",ek);function ek(){var t=null!==tk&&tk.apply(this,arguments)||this;return t.type=ek.type,t}qp.registerClass(Fs);var nk,Ca=(l(ik,nk=Ca),ik.type="dataZoom.select",ik);function ik(){var t=null!==nk&&nk.apply(this,arguments)||this;return t.type=ik.type,t}Pg.registerClass(Ca);var rk,ok=E,ak=lu+"toolbox-dataZoom_",Ca=(l(sk,rk=_A),sk.prototype.render=function(t,e,n,i){this.brushController||(this.brushController=new eD(n.getZr()),this.brushController.on("brush",z(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n.isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n.isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");r=new VD(pk(t),e,{include:["grid"]}).makePanelOpts(r,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"});n.brushController.setPanels(r).enableBrush(!(!o||!r.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),e=e,t.setIconStatus("back",1<function(t){return QD(t).length}(e)?"emphasis":"normal")},sk.prototype.onclick=function(t,e,n){ck[n].call(this)},sk.prototype.remove=function(t,e){this.brushController.unmount()},sk.prototype.dispose=function(t,e){this.brushController.dispose()},sk.prototype._onBrush=function(t){var s,l,r,o,e=t.areas;function i(t,e,n){var i,r,o,a=e.getAxis(t),e=a.model,t=(i=t,r=e,l.eachComponent({mainType:"dataZoom",subType:"select"},function(t){t.getAxisModel(i,r.componentIndex)&&(o=t)}),o),e=t.findRepresentativeAxisProxy(e).getMinMaxSpan();null==e.minValueSpan&&null==e.maxValueSpan||(n=BI(0,n.slice(),a.scale.getExtent(),0,e.minValueSpan,e.maxValueSpan)),t&&(s[t.id]={dataZoomId:t.id,startValue:n[0],endValue:n[1]})}t.isEnd&&e.length&&(s={},l=this.ecModel,this.brushController.updateCovers([]),new VD(pk(this.model),l,{include:["grid"]}).matchOutputRanges(e,l,function(t,e,n){"cartesian2d"===n.type&&("rect"===(t=t.brushType)?(i("x",n,e[0]),i("y",n,e[1])):i({lineX:"x",lineY:"y"}[t],n,e))}),e=s,o=QD(r=l),$D(e,function(t,e){for(var n,i=o.length-1;0<=i;i--){if(o[i][e])break}i<0&&((n=r.queryComponents({mainType:"dataZoom",subType:"select",id:e})[0])&&(n=n.getPercentRange(),o[0][e]={dataZoomId:e,start:n[0],end:n[1]}))}),o.push(e),this._dispatchZoomAction(s))},sk.prototype._dispatchZoomAction=function(t){var n=[];ok(t,function(t,e){n.push(I(t))}),n.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:n})},sk.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocale(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},sk);function sk(){return null!==rk&&rk.apply(this,arguments)||this}var lk,uk,hk,ck={zoom:function(){var t=!this.isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var i=QD(t),t=i[i.length-1];1<i.length&&i.pop();var r={};return $D(t,function(t,e){for(var n=i.length-1;0<=n;n--)if(t=i[n][e]){r[e]=t;break}}),r}(this.ecModel))}};function pk(t){t={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==t.xAxisIndex&&null==t.xAxisId&&(t.xAxisIndex="all"),null==t.yAxisIndex&&null==t.yAxisId&&(t.yAxisIndex="all"),t}function dk(){return null!==hk&&hk.apply(this,arguments)||this}bA("dataZoom",Ca),lk="dataZoom",uk=function(t){var e=t.getComponent("toolbox",0);if(e){var i=e.getModel(["feature","dataZoom"]),r=[],t=Su(t,pk(i));return ok(t.xAxisModels,function(t){return n(t,"xAxis","xAxisIndex")}),ok(t.yAxisModels,function(t){return n(t,"yAxis","yAxisIndex")}),r}function n(t,e,n){t=t.componentIndex,e={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:ak+e+t};e[n]=t,r.push(e)}},it(null==gd.get(lk)&&uk),gd.set(lk,uk),bA("restore",(l(dk,hk=_A),dk.prototype.onclick=function(t,e){JD(t).snapshots=null,e.dispatchAction({type:"restore",from:this.uid})},dk.getDefaultOption=function(t){return{show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:t.getLocale(["toolbox","restore","title"])}},dk)),a_({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")});var fk={label:{enabled:!0},decal:{show:!1}},gk=bu(),yk={};Ca=g.VISUAL.ARIA;function mk(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}r_(function(t){var e;t&&t.aria&&(null!=(e=t.aria).show&&(e.enabled=e.show),e.label=e.label||{},E(["description","general","series","data"],function(t){null!=e[t]&&(e.label[t]=e[t])}))}),l_(Ca,function(f,r){var t,o=f.getModel("aria");function g(t,e){if("string"!=typeof t)return t;var n=t;return E(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}o.get("enabled")&&(b((t=I(fk)).label,f.getLocaleModel().get("aria"),!1),b(o.option,t,!1),function(){{var n;o.getModel("decal").get("show")&&(n=ht(),f.eachSeries(function(t){var e;t.useColorPaletteOnData&&((e=n.get(t.type))||(e={},n.set(t.type,e)),gk(t).scope=e)}),f.eachRawSeries(function(i){var r,o,a,s,l,t,e;function u(t,e){e=t?A(A({},e),t):e;return e.dirty=!0,e}f.isSeriesFiltered(i)||("function"!=typeof i.enableAriaDecal?(r=i.getData(),i.useColorPaletteOnData?(o=i.getRawData(),a={},s=gk(i).scope,r.each(function(t){var e=r.getRawIndex(t);a[e]=t}),l=o.count(),o.each(function(t){var e=a[t],n=o.getName(t)||t+"",t=Sd(i.ecModel,n,s,l),n=r.getItemVisual(e,"decal");r.setItemVisual(e,"decal",u(n,t))})):(t=Sd(i.ecModel,i.name,yk,f.getSeriesCount()),e=r.getVisual("decal"),r.setVisual("decal",u(e,t)))):i.enableAriaDecal())}))}}(),function(){var t=f.getLocaleModel().get("aria"),u=o.getModel("label");if(u.option=D(u.option,t),!u.get("enabled"))return;var e=r.getZr().dom;if(u.get("description"))return e.setAttribute("aria-label",u.get("description"));var h=f.getSeriesCount(),c=u.get(["data","maxCount"])||10,n=u.get(["series","maxCount"])||10,p=Math.min(h,n);{var d,i;h<1||(i=function(){var t=f.get("title");t&&t.length&&(t=t[0]);return t&&t.text}(),t=i?g(u.get(["general","withTitle"]),{title:i}):u.get(["general","withoutTitle"]),d=[],n=1<h?u.get(["series","multiple","prefix"]):u.get(["series","single","prefix"]),t+=g(n,{seriesCount:h}),f.eachSeries(function(t,e){if(e<p){var n=void 0,e=t.get("name")?"withName":"withoutName";n=g(n=1<h?u.get(["series","multiple",e]):u.get(["series","single",e]),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:(e=t.subType,f.getLocaleModel().get(["series","typeNames"])[e]||"自定义图")});var i=t.getData();i.count()>c?n+=g(u.get(["data","partialData"]),{displayCnt:c}):n+=u.get(["data","allData"]);for(var r,o,a,s=[],l=0;l<i.count();l++){l<c&&(r=i.getName(l),o=Tf(i,l),a=u.get(["data",r?"withName":"withoutName"]),s.push(g(a,{name:r,value:o})))}e=u.get(["data","separator","middle"]),t=u.get(["data","separator","end"]);n+=s.join(e)+t,d.push(n)}}),i=u.getModel(["series","multiple","separator"]),n=i.get("middle"),i=i.get("end"),t+=d.join(n)+i,e.setAttribute("aria-label",t))}}())});var vk="none",_k=Math.round,xk=Math.sin,bk=Math.cos,wk=Math.PI,Sk=2*Math.PI,Mk=180/wk;function Tk(t){return _k(1e3*t)/1e3}function Ck(t){return _k(1e4*t)/1e4}function Ik(t){return t<1e-4&&-1e-4<t}function Ak(t,e){e&&Dk(t,"transform","matrix("+Tk(e[0])+","+Tk(e[1])+","+Tk(e[2])+","+Tk(e[3])+","+Ck(e[4])+","+Ck(e[5])+")")}function Dk(t,e,n){n&&("linear"===n.type||"radial"===n.type)||t.setAttribute(e,n)}function kk(t,e,n){var i,r,o,a=null==e.opacity?1:e.opacity;null!=(i=(i=e).fill)&&i!==vk?(Dk(t,"fill",o="transparent"===(o=e.fill)?vk:o),Dk(t,"fill-opacity",(null!=e.fillOpacity?e.fillOpacity*a:a)+"")):Dk(t,"fill",vk),null!=(o=(o=e).stroke)&&o!==vk?(Dk(t,"stroke",o="transparent"===(o=e.stroke)?vk:o),o=e.lineWidth,Dk(t,"stroke-width",((r=e.strokeNoScale?n.getLineScale():1)?o/r:0)+""),Dk(t,"paint-order",e.strokeFirst?"stroke":"fill"),Dk(t,"stroke-opacity",(null!=e.strokeOpacity?e.strokeOpacity*a:a)+""),(a=e.lineDash&&0<o&&um(e.lineDash,o))?(o=e.lineDashOffset,r&&1!==r&&(a=O(a,function(t){return t/r}),o=o&&_k(o/=r)),Dk(t,"stroke-dasharray",a.join(",")),Dk(t,"stroke-dashoffset",(o||0)+"")):Dk(t,"stroke-dasharray",""),e.lineCap&&Dk(t,"stroke-linecap",e.lineCap),e.lineJoin&&Dk(t,"stroke-linejoin",e.lineJoin),e.miterLimit&&Dk(t,"stroke-miterlimit",e.miterLimit+"")):Dk(t,"stroke",vk)}var Lk=(Pk.prototype.reset=function(){this._d=[],this._str=""},Pk.prototype.moveTo=function(t,e){this._add("M",t,e)},Pk.prototype.lineTo=function(t,e){this._add("L",t,e)},Pk.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},Pk.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},Pk.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},Pk.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=0===this._d.length,u=a-o,h=!s,c=Math.abs(u),p=Ik(c-Sk)||(h?Sk<=u:Sk<=-u),a=!1,a=!!p||!Ik(c)&&wk<=(0<u?u%Sk:u%Sk+Sk)==!!h,s=Ck(t+n*bk(o)),c=Ck(e+i*xk(o));p&&(u=h?Sk-1e-4:1e-4-Sk,a=!0,l&&this._d.push("M",s,c));t=Ck(t+n*bk(o+u)),u=Ck(e+i*xk(o+u));if(isNaN(s)||isNaN(c)||isNaN(n)||isNaN(i)||isNaN(r)||isNaN(Mk)||isNaN(t)||isNaN(u))return"";this._d.push("A",Ck(n),Ck(i),_k(r*Mk),+a,+h,t,u)},Pk.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("L",t+n,e),this._add("L",t+n,e+i),this._add("L",t,e+i),this._add("L",t,e)},Pk.prototype.closePath=function(){0<this._d.length&&this._add("Z")},Pk.prototype._add=function(t,e,n,i,r,o,a,s,l){this._d.push(t);for(var u=1;u<arguments.length;u++){var h=arguments[u];if(isNaN(h))return void(this._invalid=!0);this._d.push(Ck(h))}},Pk.prototype.generateStr=function(){this._str=this._invalid?"":this._d.join(" "),this._d=[]},Pk.prototype.getStr=function(){return this._str},Pk);function Pk(){}var Ok={brush:function(t){var e=t.style,n=t.__svgEl;n||(n=mk("path"),t.__svgEl=n),t.path||t.createPathProxy();var i=t.path;t.shapeChanged()&&(i.beginPath(),t.buildPath(i,t.shape),t.pathUpdated());var r=i.getVersion(),o=t,a=o.__svgPathBuilder;(o.__svgPathVersion!==r||!a||t.style.strokePercent<1)&&((a=a||(o.__svgPathBuilder=new Lk)).reset(),i.rebuildPath(a,t.style.strokePercent),a.generateStr(),o.__svgPathVersion=r),Dk(n,"d",a.getStr()),kk(n,e,t),Ak(n,t.transform)}},Rk={brush:function(t){var e,n,i,r,o,a,s=t.style,l=s.image;l instanceof HTMLImageElement&&(l=l.src),l&&(e=s.x||0,n=s.y||0,i=s.width,r=s.height,(o=t.__svgEl)||(o=mk("image"),t.__svgEl=o),l!==t.__imageSrc&&(a="href",s=l,o.setAttributeNS("http://www.w3.org/1999/xlink",a,s),t.__imageSrc=l),Dk(o,"width",i+""),Dk(o,"height",r+""),Dk(o,"x",e+""),Dk(o,"y",n+""),Ak(o,t.transform))}},Ek={left:"start",right:"end",center:"middle",middle:"middle"};var Nk={brush:function(t){var e,n,i,r=t.style,o=r.text;null!=o&&(o+=""),!o||isNaN(r.x)||isNaN(r.y)||((e=t.__svgEl)||(e=mk("text"),i="xml:space",n="preserve",e.setAttributeNS("http://www.w3.org/XML/1998/namespace",i,n),t.__svgEl=e),i=r.font||Vn,e.style.font=i,e.textContent=o,kk(e,r,t),Ak(e,t.transform),n=r.x||0,o=r.y||0,t=Yn(i),"top"===(i=r.textBaseline)?o+=t/2:"bottom"===i&&(o-=t/2),o=o,r=Ek[r.textAlign]||r.textAlign,Dk(e,"dominant-baseline","central"),Dk(e,"text-anchor",r),Dk(e,"x",n+""),Dk(e,"y",o+""))}};function zk(s,l,u){u=u||function(t,e){return t===e},s=s.slice();var h=(l=l.slice()).length,c=s.length,p=1,t=h+c,d=[{newPos:-1,components:[]}],e=Bk(d[0],l,s,0,u);if(d[0].newPos+1>=h&&c<=e+1){for(var n=[],i=0;i<l.length;i++)n.push(i);return[{indices:n,count:l.length,added:!1,removed:!1}]}for(;p<=t;){var r=function(){for(var t=-1*p;t<=p;t+=2){var e,n=d[t-1],i=d[t+1],r=(i?i.newPos:0)-t;n&&(d[t-1]=void 0);var o=n&&n.newPos+1<h,a=i&&0<=r&&r<c;if(o||a){if(!o||a&&n.newPos<i.newPos?Vk((e={newPos:(e=i).newPos,components:e.components.slice(0)}).components,!1,!0):((e=n).newPos++,Vk(e.components,!0,!1)),r=Bk(e,l,s,t,u),e.newPos+1>=h&&c<=r+1)return function(t){for(var e=0,n=t.length,i=0,r=0;e<n;e++){var o=t[e];if(o.removed){for(s=r;s<r+o.count;s++)o.indices.push(s);r+=o.count}else{for(var a=[],s=i;s<i+o.count;s++)a.push(s);o.indices=a,i+=o.count,o.added||(r+=o.count)}}return t}(e.components);d[t]=e}else d[t]=void 0}p++}();if(r)return r}}function Bk(t,e,n,i,r){for(var o=e.length,a=n.length,s=t.newPos,l=s-i,u=0;s+1<o&&l+1<a&&r(e[s+1],n[l+1]);)s++,l++,u++;return u&&t.components.push({count:u,added:!1,removed:!1,indices:[]}),t.newPos=s,l}function Vk(t,e,n){var i=t[t.length-1];i&&i.added===e&&i.removed===n?t[t.length-1]={count:i.count+1,added:e,removed:n,indices:[]}:t.push({count:1,added:e,removed:n,indices:[]})}Fk.prototype.getDefs=function(t){var e=this._svgRoot,n=this._svgRoot.getElementsByTagName("defs");if(0!==n.length)return n[0];if(t){var i=e.insertBefore(this.createElement("defs"),e.firstChild);return i.contains||(i.contains=function(t){var e=i.children;if(!e)return!1;for(var n=e.length-1;0<=n;--n)if(e[n]===t)return!0;return!1}),i}return null},Fk.prototype.doUpdate=function(t,e){var n;t&&(n=this.getDefs(!1),t[this._domName]&&n.contains(t[this._domName])?"function"==typeof e&&e(t):(e=this.add(t))&&(t[this._domName]=e))},Fk.prototype.add=function(t){return null},Fk.prototype.addDom=function(t){var e=this.getDefs(!0);t.parentNode!==e&&e.appendChild(t)},Fk.prototype.removeDom=function(t){var e=this.getDefs(!1);e&&t[this._domName]&&(e.removeChild(t[this._domName]),t[this._domName]=null)},Fk.prototype.getDoms=function(){var i=this.getDefs(!1);if(!i)return[];var r=[];return E(this._tagNames,function(t){for(var e=i.getElementsByTagName(t),n=0;n<e.length;n++)r.push(e[n])}),r},Fk.prototype.markAllUnused=function(){var t=this.getDoms(),e=this;E(t,function(t){t[e._markLabel]="0"})},Fk.prototype.markDomUsed=function(t){t&&(t[this._markLabel]="1")},Fk.prototype.markDomUnused=function(t){t&&(t[this._markLabel]="0")},Fk.prototype.isDomUnused=function(t){return t&&"1"!==t[this._markLabel]},Fk.prototype.removeUnused=function(){var e=this,n=this.getDefs(!1);n&&E(this.getDoms(),function(t){e.isDomUnused(t)&&n.removeChild(t)})},Fk.prototype.getSvgProxy=function(t){return t instanceof _o?Ok:t instanceof Yo?Rk:t instanceof Oa?Nk:Ok},Fk.prototype.getSvgElement=function(t){return t.__svgEl},Ca=Fk;function Fk(t,e,n,i,r){this.nextId=0,this._domName="_dom",this.createElement=mk,this._zrId=t,this._svgRoot=e,this._tagNames="string"==typeof n?[n]:n,this._markLabel=i,r&&(this._domName=r)}function Hk(t){return"linear"===t.type}function Gk(t){return"radial"===t.type}function Wk(t){return t&&("linear"===t.type||"radial"===t.type)}var Uk,Xk=(l(Yk,Uk=Ca),Yk.prototype.addWithoutUpdate=function(r,o){var a;o&&o.style&&(a=this,E(["fill","stroke"],function(t){var e,n,i=o.style[t];Wk(i)&&(e=i,n=a.getDefs(!0),i=void 0,e.__dom?(i=e.__dom,n.contains(e.__dom)||a.addDom(i)):i=a.add(e),a.markUsed(o),i=i.getAttribute("id"),r.setAttribute(t,"url(#"+i+")"))}))},Yk.prototype.add=function(t){var e;if(Hk(t))e=this.createElement("linearGradient");else{if(!Gk(t))return x("Illegal gradient type."),null;e=this.createElement("radialGradient")}return t.id=t.id||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-gradient-"+t.id),this.updateDom(t,e),this.addDom(e),e},Yk.prototype.update=function(n){var i;Wk(n)&&(i=this).doUpdate(n,function(){var t,e=n.__dom;e&&(t=e.tagName,"linear"===(e=n.type)&&"linearGradient"===t||"radial"===e&&"radialGradient"===t?i.updateDom(n,n.__dom):(i.removeDom(n),i.add(n)))})},Yk.prototype.updateDom=function(t,e){if(Hk(t))e.setAttribute("x1",t.x+""),e.setAttribute("y1",t.y+""),e.setAttribute("x2",t.x2+""),e.setAttribute("y2",t.y2+"");else{if(!Gk(t))return void x("Illegal gradient type.");e.setAttribute("cx",t.x+""),e.setAttribute("cy",t.y+""),e.setAttribute("r",t.r+"")}t.global?e.setAttribute("gradientUnits","userSpaceOnUse"):e.setAttribute("gradientUnits","objectBoundingBox"),e.innerHTML="";for(var n=t.colorStops,i=0,r=n.length;i<r;++i){var o=this.createElement("stop");o.setAttribute("offset",100*n[i].offset+"%");var a,s=n[i].color;-1<s.indexOf("rgba")?(a=Je(s)[3],s=en(s),o.setAttribute("stop-color","#"+s),o.setAttribute("stop-opacity",a+"")):o.setAttribute("stop-color",n[i].color),e.appendChild(o)}t.__dom=e},Yk.prototype.markUsed=function(t){var e;t.style&&((e=t.style.fill)&&e.__dom&&Uk.prototype.markDomUsed.call(this,e.__dom),(e=t.style.stroke)&&e.__dom&&Uk.prototype.markDomUsed.call(this,e.__dom))},Yk);function Yk(t,e){return Uk.call(this,t,e,["linearGradient","radialGradient"],"__gradient_in_use__")||this}function Zk(t){return t&&(t.image||t.svgElement)}var jk,qk=new Ic,Kk=(l($k,jk=Ca),$k.prototype.addWithoutUpdate=function(r,o){var a;o&&o.style&&(a=this,E(["fill","stroke"],function(t){var e,n,i=o.style[t];Zk(i)&&(e=a.getDefs(!0),(n=qk.get(i))?e.contains(n)||a.addDom(n):n=a.add(i),a.markUsed(o),n=n.getAttribute("id"),r.setAttribute(t,"url(#"+n+")"))}))},$k.prototype.add=function(t){if(Zk(t)){var e=this.createElement("pattern");return t.id=null==t.id?this.nextId++:t.id,e.setAttribute("id","zr"+this._zrId+"-pattern-"+t.id),e.setAttribute("x","0"),e.setAttribute("y","0"),e.setAttribute("patternUnits","userSpaceOnUse"),this.updateDom(t,e),this.addDom(e),e}},$k.prototype.update=function(e){var n;Zk(e)&&(n=this).doUpdate(e,function(){var t=qk.get(e);n.updateDom(e,t)})},$k.prototype.updateDom=function(t,e){var n=t.svgElement;if(n instanceof SVGElement)n.parentNode!==e&&(e.innerHTML="",e.appendChild(n),e.setAttribute("width",t.svgWidth+""),e.setAttribute("height",t.svgHeight+""));else{var i=void 0,n=e.getElementsByTagName("image");if(n.length){if(!t.image)return void e.removeChild(n[0]);i=n[0]}else t.image&&(i=this.createElement("image"));i&&(n=void 0,"string"==typeof t.image?n=t.image:t.image instanceof HTMLImageElement?n=t.image.src:t.image instanceof HTMLCanvasElement&&(n=t.image.toDataURL()),n&&(i.setAttribute("href",n),i.setAttribute("x","0"),i.setAttribute("y","0"),(n=as(n,i,{dirty:function(){}},function(t){e.setAttribute("width",t.width+""),e.setAttribute("height",t.height+"")}))&&n.width&&n.height&&(e.setAttribute("width",n.width+""),e.setAttribute("height",n.height+"")),e.appendChild(i)))}i="translate("+(t.x||0)+", "+(t.y||0)+") rotate("+(t.rotation||0)/Math.PI*180+") scale("+(t.scaleX||1)+", "+(t.scaleY||1)+")";e.setAttribute("patternTransform",i),qk.set(t,e)},$k.prototype.markUsed=function(t){t.style&&(Zk(t.style.fill)&&jk.prototype.markDomUsed.call(this,qk.get(t.style.fill)),Zk(t.style.stroke)&&jk.prototype.markDomUsed.call(this,qk.get(t.style.stroke)))},$k);function $k(t,e){return jk.call(this,t,e,["pattern"],"__pattern_in_use__")||this}function Jk(t){t=t.__clipPaths;return t&&0<t.length}var Qk,tL=(l(eL,Qk=Ca),eL.prototype.markAllUnused=function(){for(var t in Qk.prototype.markAllUnused.call(this),this._refGroups)this.markDomUnused(this._refGroups[t]);this._keyDuplicateCount={}},eL.prototype._getClipPathGroup=function(t,e){if(Jk(t)){var n=t.__clipPaths,i=this._keyDuplicateCount,t=function(t){var e=[];if(t)for(var n=0;n<t.length;n++){var i=t[n];e.push(i.id)}return e.join(",")}(n);return lm(n,e&&e.__clipPaths)&&(i[t]=i[t]||0,i[t]&&(t+="-"+i[t]),i[t]++),this._refGroups[t]||(this._refGroups[t]=this.createElement("g"))}},eL.prototype.update=function(t,e){e=this._getClipPathGroup(t,e);return e&&(this.markDomUsed(e),this.updateDom(e,t.__clipPaths)),e},eL.prototype.updateDom=function(t,e){var n,i,r,o;e&&0<e.length?(n=this.getDefs(!0),r=i=void 0,(o=e[0])._dom?(r=o._dom.getAttribute("id"),i=o._dom,n.contains(i)||n.appendChild(i)):(r="zr"+this._zrId+"-clip-"+this.nextId,++this.nextId,(i=this.createElement("clipPath")).setAttribute("id",r),n.appendChild(i),o._dom=i),this.getSvgProxy(o).brush(o),o=this.getSvgElement(o),i.innerHTML="",i.appendChild(o),t.setAttribute("clip-path","url(#"+r+")"),1<e.length&&this.updateDom(i,e.slice(1))):t&&t.setAttribute("clip-path","none")},eL.prototype.markUsed=function(t){var e=this;t.__clipPaths&&E(t.__clipPaths,function(t){t._dom&&Qk.prototype.markDomUsed.call(e,t._dom)})},eL.prototype.removeUnused=function(){Qk.prototype.removeUnused.call(this);var t,e={};for(t in this._refGroups){var n=this._refGroups[t];this.isDomUnused(n)?n.parentNode&&n.parentNode.removeChild(n):e[t]=n}this._refGroups=e},eL);function eL(t,e){e=Qk.call(this,t,e,"clipPath","__clippath_in_use__")||this;return e._refGroups={},e._keyDuplicateCount={},e}var nL,iL=(l(rL,nL=Ca),rL.prototype._getFromPool=function(){var t,e=this._shadowDomPool.pop();return e||((e=this.createElement("filter")).setAttribute("id","zr"+this._zrId+"-shadow-"+this.nextId++),t=this.createElement("feDropShadow"),e.appendChild(t),this.addDom(e)),e},rL.prototype.update=function(t,e){var n,i=e.style;(n=i)&&(n.shadowBlur||n.shadowOffsetX||n.shadowOffsetY)?(n=(i=e).style,i=i.getGlobalScale(),n=[n.shadowColor,(n.shadowBlur||0).toFixed(2),(n.shadowOffsetX||0).toFixed(2),(n.shadowOffsetY||0).toFixed(2),i[0],i[1]].join(","),(i=e._shadowDom=this._shadowDomMap[n])||(i=this._getFromPool(),this._shadowDomMap[n]=i),this.updateDom(t,e,i)):this.remove(t,e)},rL.prototype.remove=function(t,e){null!=e._shadowDom&&(e._shadowDom=null,t.style.filter="")},rL.prototype.updateDom=function(t,e,n){var i,r,o=n.children[0],a=e.style,s=e.getGlobalScale(),l=s[0],u=s[1];l&&u&&(i=a.shadowOffsetX||0,r=a.shadowOffsetY||0,s=a.shadowBlur,a=a.shadowColor,o.setAttribute("dx",i/l+""),o.setAttribute("dy",r/u+""),o.setAttribute("flood-color",a),u=s/2/l+" "+s/2/u,o.setAttribute("stdDeviation",u),n.setAttribute("x","-100%"),n.setAttribute("y","-100%"),n.setAttribute("width","300%"),n.setAttribute("height","300%"),n=(e._shadowDom=n).getAttribute("id"),t.style.filter="url(#"+n+")")},rL.prototype.removeUnused=function(){if(this.getDefs(!1)){var t,e=this._shadowDomPool;for(t in this._shadowDomMap){var n=this._shadowDomMap[t];e.push(n)}this._shadowDomMap={}}},rL);function rL(t,e){e=nL.call(this,t,e,["filter"],"__filter_in_use__","_shadowDom")||this;return e._shadowDomMap={},e._shadowDomPool=[],e}function oL(t){return parseInt(t,10)}function aL(t){return t instanceof _o?Ok:t instanceof Yo?Rk:t instanceof Oa?Nk:Ok}function sL(t,e){return e&&t&&e.parentNode!==t}function lL(t,e,n){sL(t,e)&&n&&((n=n.nextSibling)?t.insertBefore(e,n):t.appendChild(e))}function uL(t,e){var n;sL(t,e)&&((n=t.firstChild)?t.insertBefore(e,n):t.appendChild(e))}function hL(t){return t.__svgEl}function cL(t,e,n,i){this.type="svg",this.refreshHover=pL("refreshHover"),this.pathToImage=pL("pathToImage"),this.configLayer=pL("configLayer"),this.root=t,this.storage=e,this._opts=n=A({},n||{});var r=mk("svg");r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("version","1.1"),r.setAttribute("baseProfile","full"),r.style.cssText="user-select:none;position:absolute;left:0;top:0;";var o=mk("g");r.appendChild(o);e=mk("g");r.appendChild(e),this._gradientManager=new Xk(i,e),this._patternManager=new Kk(i,e),this._clipPathManager=new tL(i,e),this._shadowManager=new iL(i,e);i=document.createElement("div");i.style.cssText="overflow:hidden;position:relative",this._svgDom=r,this._svgRoot=e,this._backgroundRoot=o,this._viewport=i,t.appendChild(i),i.appendChild(r),this.resize(n.width,n.height),this._visibleList=[]}function pL(t){return function(){x('In SVG mode painter not support method "'+t+'"')}}Nl("svg",(cL.prototype.getType=function(){return"svg"},cL.prototype.getViewportRoot=function(){return this._viewport},cL.prototype.getSvgDom=function(){return this._svgDom},cL.prototype.getSvgRoot=function(){return this._svgRoot},cL.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},cL.prototype.refresh=function(){var t=this.storage.getDisplayList(!0);this._paintList(t)},cL.prototype.setBackgroundColor=function(t){this._backgroundRoot&&this._backgroundNode&&this._backgroundRoot.removeChild(this._backgroundNode);var e=mk("rect");e.setAttribute("width",this.getWidth()),e.setAttribute("height",this.getHeight()),e.setAttribute("x",0),e.setAttribute("y",0),e.setAttribute("id",0),e.style.fill=t,this._backgroundRoot.appendChild(e),this._backgroundNode=e},cL.prototype.createSVGElement=mk,cL.prototype.paintOne=function(t){var e=aL(t);return e&&e.brush(t),hL(t)},cL.prototype._paintList=function(t){var e=this._gradientManager,n=this._patternManager,i=this._clipPathManager,r=this._shadowManager;e.markAllUnused(),n.markAllUnused(),i.markAllUnused(),r.markAllUnused();for(var o=this._svgRoot,a=this._visibleList,s=t.length,l=[],u=0;u<s;u++){var h=aL(b=t[u]),c=hL(b);b.invisible||(!b.__dirty&&c||(h&&h.brush(b),(c=hL(b))&&b.style&&(e.update(b.style.fill),e.update(b.style.stroke),n.update(b.style.fill),n.update(b.style.stroke),r.update(c,b)),b.__dirty=0),c&&l.push(b))}for(var p,d,f,g,y,m,v=zk(a,l),u=0;u<v.length;u++){if((x=v[u]).removed)for(var _=0;_<x.count;_++){c=hL(b=a[x.indices[_]]);Jk(b)?(g=c)&&g.parentNode&&g.parentNode.removeChild(g):(f=o,(g=c)&&f&&g.parentNode===f&&f.removeChild(g))}}for(u=0;u<v.length;u++){var x;(x=v[u]).added;if(!x.removed)for(_=0;_<x.count;_++){var b=l[x.indices[_]],w=i.update(b,y);w!==m&&(p=d,w&&(p?lL(o,w,p):uL(o,w),d=w,p=null),m=w);c=hL(b);p?lL(m||o,c,p):uL(m||o,c),p=c||p,m||(d=p),e.markUsed(b),e.addWithoutUpdate(c,b),n.markUsed(b),n.addWithoutUpdate(c,b),i.markUsed(b),y=b}}e.removeUnused(),n.removeUnused(),i.removeUnused(),r.removeUnused(),this._visibleList=l},cL.prototype._getDefs=function(t){var e=this._svgDom,n=e.getElementsByTagName("defs");if(0!==n.length)return n[0];if(t){var i=e.insertBefore(mk("defs"),e.firstChild);return i.contains||(i.contains=function(t){var e=i.children;if(!e)return!1;for(var n=e.length-1;0<=n;--n)if(e[n]===t)return!0;return!1}),i}return null},cL.prototype.resize=function(t,e){var n=this._viewport;n.style.display="none";var i=this._opts;null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width===t&&this._height===e||(this._width=t,this._height=e,(n=n.style).width=t+"px",n.height=e+"px",(n=this._svgDom).setAttribute("width",t+""),n.setAttribute("height",e+"")),this._backgroundNode&&(this._backgroundNode.setAttribute("width",t),this._backgroundNode.setAttribute("height",e))},cL.prototype.getWidth=function(){return this._width},cL.prototype.getHeight=function(){return this._height},cL.prototype._getSize=function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);t=this.root,e=document.defaultView.getComputedStyle(t);return(t[i]||oL(e[n])||oL(t.style[n]))-(oL(e[r])||0)-(oL(e[o])||0)|0},cL.prototype.dispose=function(){this.root.innerHTML="",this._svgRoot=this._backgroundRoot=this._svgDom=this._backgroundNode=this._viewport=this.storage=null},cL.prototype.clear=function(){var t=this._viewport;t&&t.parentNode&&t.parentNode.removeChild(t)},cL.prototype.toDataURL=function(){return this.refresh(),"data:image/svg+xml;charset=UTF-8,"+encodeURIComponent(this._svgDom.outerHTML.replace(/></g,">\n\r<"))},cL)),t.Axis=wl,t.List=H_,t.Model=Ec,t.PRIORITY=g,t.color=ln,t.connect=function(e){var t;return V(e)&&(t=e,e=null,$m(t,function(t){null!=t.group&&(e=t.group)}),e=e||"g_"+Qv++,$m(t,function(t){t.group=e})),$v[e]=!0,e},t.dataTool={},t.dependencies={zrender:"5.0.1"},t.disConnect=e_,t.disconnect=Dc,t.dispose=function(t){"string"==typeof t?t=Kv[t]:t instanceof Ov||(t=n_(t)),t instanceof Ov&&!t.isDisposed()&&t.dispose()},t.env=w,t.extendChartView=function(t){return zg.extend(t)},t.extendComponentModel=function(t){return qp.extend(t)},t.extendComponentView=function(t){return Pg.extend(t)},t.extendSeriesModel=function(t){return Sg.extend(t)},t.format=Lb,t.getCoordinateSystemDimensions=function(t){if(t=Ed.get(t))return t.getDimensionsInfo?t.getDimensionsInfo():t.dimensions.slice()},t.getInstanceByDom=n_,t.getInstanceById=function(t){return Kv[t]},t.getMap=function(t){return(t=My(t))&&t[0]&&{geoJson:t[0].geoJSON,specialAreas:t[0].specialAreas}},t.graphic=Ob,t.helper=Qa,t.init=function(t,e,n){var i=n_(t);if(i)return i;var r=new Ov(t,e,n);return r.id="ec_"+Jv++,Kv[r.id]=r,Iu(t,t_,r.id),Av(r),$m(Xv,function(t){t(r)}),r},t.innerDrawElementOnCanvas=Im,t.matrix=Se,t.number=kb,t.parseGeoJSON=mb,t.parseGeoJson=qn,t.registerAction=a_,t.registerCoordinateSystem=function(t,e){Ed.register(t,e)},t.registerLayout=s_,t.registerLoading=h_,t.registerLocale=Yc,t.registerMap=function(t,e,n){Sy(t,e,n)},t.registerPostInit=function(t){t&&Xv.push(t)},t.registerPostUpdate=function(t){t&&Yv.push(t)},t.registerPreprocessor=r_,t.registerProcessor=o_,t.registerTheme=i_,t.registerTransform=Lc,t.registerVisual=l_,t.setCanvasCreator=function(t){m("createCanvas",t)},t.throttle=Zg,t.time=ua,t.util=Pb,t.vector=Lt,t.version="5.0.0",t.zrender=n,Object.defineProperty(t,"__esModule",{value:!0})});