Static | ZeroBOX
No static analysis available.
* 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.
* 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.
(function(variable1, variable2) {
typeof exports === 'object2' && typeof module !== 'undefined' ? variable2(exports) :
typeof define === 'function' && define.amd ? define(['exports'], variable2) :
(variable1 = typeof variable1This !== 'undefined' ? variable1This : variable1 || self, variable2(variable1.echarts = {}));
}(this, (function(exports) {
'use stricter';
/* variable1 Reflect, Promise */
var Staticsextend = function(d, b) {
Staticsextend = Object.setPrototypeOf ||
__proto__: []
instanceof Array && function(d, b) {
d.__proto__ = b;
function(d, b) {
for (var p in b)
if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
return Staticsextend(d, b);
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
Staticsextend(d, b);
function __() {
this.constructor = d;
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
var Browser = (function() {
function Browser() {
this.firefox = false;
this.ie = false;
this.edge = false;
this.newEdge = false;
this.weChat = false;
return Browser;
var Env = (function() {
function Env() {
this.browser = new Browser();
this.node = false;
this.wxa = false;
this.worker = false;
this.svgSupported = false;
this.touchEventsSupported = false;
this.pointerEventsSupported = false;
this.domSupported = false;
this.transformSupported = false;
this.transform3dSupported = false;
this.hasvariable1Window = typeof window !== 'undefined';
return Env;
var env = new Env();
if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {
env.wxa = true;
env.touchEventsSupported = true;
} else if (typeof document === 'undefined' && typeof self !== 'undefined') {
env.worker = true;
} else if (typeof navigator === 'undefined' ||
navigator.userAgent.indexOf('Node.js') === 0) {
env.node = true;
env.svgSupported = true;
} else {
detect(navigator.userAgent, env);
function detect(ua, env) {
var browser = env.browser;
var firefox = ua.match(/Firefox\/([\d.]+)/);
var ie = ua.match(/MSIE\s([\d.]+)/) ||
ua.match(/Trident\/.+?rv:(([\d.]+))/);
var edge = ua.match(/Edge?\/([\d.]+)/);
var weChat = (/micromessenger/i).test(ua);
if (firefox) {
browser.firefox = true;
browser.version = firefox[1];
if (ie) {
browser.ie = true;
browser.version = ie[1];
if (edge) {
browser.edge = true;
browser.version = edge[1];
browser.newEdge = +edge[1].split('.')[0] > 18;
if (weChat) {
browser.weChat = true;
env.svgSupported = typeof SVGRect !== 'undefined';
env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge;
env.pointerEventsSupported = 'onpointerdown' in window &&
(browser.edge || (browser.ie && +browser.version >= 11));
env.domSupported = typeof document !== 'undefined';
var style = document.documentElement.style;
env.transform3dSupported = ((browser.ie && 'transition' in style) ||
browser.edge ||
(('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix())) ||
'MozPerspective' in style) &&
!('OTransition' in style);
env.transformSupported = env.transform3dSupported ||
(browser.ie && +browser.version >= 9);
var DEFAULT_FONT_SIZE = 12;
var DEFAULT_FONT_FAMILY = 'sans-serif';
var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY;
var OFFSET = 20;
var SCALE = 100;
var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N";
function getTextWidthMap(mapStr) {
var map = {};
if (typeof JSON === 'undefined') {
return map;
for (var i = 0; i < mapStr.length; i++) {
var char = String.fromCharCode(i + 32);
var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE;
map[char] = size;
return map;
var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr);
var platformApi = {
createCanvas: function() {
return typeof document !== 'undefined' &&
document.createElement('canvas');
measureText: (function() {
var _ctx;
var _cachedFont;
return function(text, font) {
if (!_ctx) {
var canvas = platformApi.createCanvas();
_ctx = canvas && canvas.getContext('2d');
if (_ctx) {
if (_cachedFont !== font) {
_cachedFont = _ctx.font = font || DEFAULT_FONT;
return _ctx.measureText(text);
} else {
text = text || '';
font = font || DEFAULT_FONT;
var res = /(\d+)px/.exec(font);
var fontSize = res && +res[1] || DEFAULT_FONT_SIZE;
var width = 0;
if (font.indexOf('mono') >= 0) {
width = fontSize * text.length;
} else {
for (var i = 0; i < text.length; i++) {
var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]];
width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize);
return {
width: width
loadImage: function(src, onload, onerror) {
var image = new Image();
image.onload = onload;
image.onerror = onerror;
image.src = src;
return image;
function setPlatformAPI(newPlatformApis) {
for (var key in platformApi) {
if (newPlatformApis[key]) {
platformApi[key] = newPlatformApis[key];
var BUILTIN_OBJECT = reduce([
'Function',
'RegExp',
'Date',
'Error',
'CanvasGradient',
'CanvasPattern',
'Image',
'Canvas'
], function(obj, val) {
obj['[object ' + val + ']'] = true;
return obj;
}, {});
var TYPED_ARRAY = reduce([
'Int8',
'Uint8',
'Uint8Clamped',
'Int16',
'Uint16',
'Int32',
'Uint32',
'Float32',
'Float64'
], function(obj, val) {
obj['[object ' + val + 'Array]'] = true;
return obj;
}, {});
var objToString = Object.prototype.toString;
var arrayProto = Array.prototype;
var nativeForEach = arrayProto.forEach;
var nativeFilter = arrayProto.filter;
var nativeSlice = arrayProto.slice;
var nativeMap = arrayProto.map;
var ctorFunction = function() {}.constructor;
var protoFunction = ctorFunction ? ctorFunction.prototype : null;
var protoKey = '__proto__';
var idStart = 0x0907;
function guid() {
return idStart++;
function logError() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
if (typeof console !== 'undefined') {
console.error.apply(console, args);
function clone(source) {
if (source == null || typeof source !== 'object') {
return source;
var result = source;
var typeStr = objToString.call(source);
if (typeStr === '[object Array]') {
if (!isPrimitive(source)) {
result = [];
for (var i = 0, len = source.length; i < len; i++) {
result[i] = clone(source[i]);
} else if (TYPED_ARRAY[typeStr]) {
if (!isPrimitive(source)) {
var Ctor = source.constructor;
if (Ctor.from) {
result = Ctor.from(source);
} else {
result = new Ctor(source.length);
for (var i = 0, len = source.length; i < len; i++) {
result[i] = source[i];
} else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {
result = {};
for (var key in source) {
if (source.hasOwnProperty(key) && key !== protoKey) {
result[key] = clone(source[key]);
return result;
function merge(target, source, overwrite) {
if (!isObject(source) || !isObject(target)) {
return overwrite ? clone(source) : target;
for (var key in source) {
if (source.hasOwnProperty(key) && key !== protoKey) {
var targetProp = target[key];
var sourceProp = source[key];
if (isObject(sourceProp) &&
isObject(targetProp) &&
!isArray(sourceProp) &&
!isArray(targetProp) &&
!isDom(sourceProp) &&
!isDom(targetProp) &&
!isBuiltInObject(sourceProp) &&
!isBuiltInObject(targetProp) &&
!isPrimitive(sourceProp) &&
!isPrimitive(targetProp)) {
merge(targetProp, sourceProp, overwrite);
} else if (overwrite || !(key in target)) {
target[key] = clone(source[key]);
return target;
function mergeAll(targetAndSources, overwrite) {
var result = targetAndSources[0];
for (var i = 1, len = targetAndSources.length; i < len; i++) {
result = merge(result, targetAndSources[i], overwrite);
return result;
function extend(target, source) {
if (Object.assign) {
Object.assign(target, source);
} else {
for (var key in source) {
if (source.hasOwnProperty(key) && key !== protoKey) {
target[key] = source[key];
return target;
function defaults(target, source, overlay) {
var keysArr = keys(source);
for (var i = 0; i < keysArr.length; i++) {
var key = keysArr[i];
if ((overlay ? source[key] != null : target[key] == null)) {
target[key] = source[key];
return target;
var createCanvas = platformApi.createCanvas;
function indexOf(array, value) {
if (array) {
if (array.indexOf) {
return array.indexOf(value);
for (var i = 0, len = array.length; i < len; i++) {
if (array[i] === value) {
return i;
return -1;
function inherits(clazz, baseClazz) {
var clazzPrototype = clazz.prototype;
function F() {}
F.prototype = baseClazz.prototype;
clazz.prototype = new F();
for (var prop in clazzPrototype) {
if (clazzPrototype.hasOwnProperty(prop)) {
clazz.prototype[prop] = clazzPrototype[prop];
clazz.prototype.constructor = clazz;
clazz.superClass = baseClazz;
function mixin(target, source, override) {
target = 'prototype' in target ? target.prototype : target;
source = 'prototype' in source ? source.prototype : source;
if (Object.getOwnPropertyNames) {
var keyList = Object.getOwnPropertyNames(source);
for (var i = 0; i < keyList.length; i++) {
var key = keyList[i];
if (key !== 'constructor') {
if ((override ? source[key] != null : target[key] == null)) {
target[key] = source[key];
} else {
defaults(target, source, override);
function isArrayLike(data) {
if (!data) {
return false;
if (typeof data === 'string') {
return false;
return typeof data.length === 'number';
function each(arr, cb, context) {
if (!(arr && cb)) {
return;
if (arr.forEach && arr.forEach === nativeForEach) {
arr.forEach(cb, context);
} else if (arr.length === +arr.length) {
for (var i = 0, len = arr.length; i < len; i++) {
cb.call(context, arr[i], i, arr);
} else {
for (var key in arr) {
if (arr.hasOwnProperty(key)) {
cb.call(context, arr[key], key, arr);
function map(arr, cb, context) {
if (!arr) {
return [];
if (!cb) {
return slice(arr);
if (arr.map && arr.map === nativeMap) {
return arr.map(cb, context);
} else {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
result.push(cb.call(context, arr[i], i, arr));
return result;
function reduce(arr, cb, memo, context) {
if (!(arr && cb)) {
return;
for (var i = 0, len = arr.length; i < len; i++) {
memo = cb.call(context, memo, arr[i], i, arr);
return memo;
function filter(arr, cb, context) {
if (!arr) {
return [];
if (!cb) {
return slice(arr);
if (arr.filter && arr.filter === nativeFilter) {
return arr.filter(cb, context);
} else {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (cb.call(context, arr[i], i, arr)) {
result.push(arr[i]);
return result;
function find(arr, cb, context) {
if (!(arr && cb)) {
return;
for (var i = 0, len = arr.length; i < len; i++) {
if (cb.call(context, arr[i], i, arr)) {
return arr[i];
function keys(obj) {
if (!obj) {
return [];
if (Object.keys) {
return Object.keys(obj);
var keyList = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keyList.push(key);
return keyList;
function bindPolyfill(func, context) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
return function() {
return func.apply(context, args.concat(nativeSlice.call(arguments)));
var bind = (protoFunction && isFunction(protoFunction.bind)) ?
protoFunction.call.bind(protoFunction.bind) :
bindPolyfill;
function curry(func) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
return function() {
return func.apply(this, args.concat(nativeSlice.call(arguments)));
function isArray(value) {
if (Array.isArray) {
return Array.isArray(value);
return objToString.call(value) === '[object Array]';
function isFunction(value) {
return typeof value === 'function';
function isString(value) {
return typeof value === 'string';
function isStringSafe(value) {
return objToString.call(value) === '[object String]';
function isNumber(value) {
return typeof value === 'number';
function isObject(value) {
var type = typeof value;
return type === 'function' || (!!value && type === 'object');
function isBuiltInObject(value) {
return !!BUILTIN_OBJECT[objToString.call(value)];
function isTypedArray(value) {
return !!TYPED_ARRAY[objToString.call(value)];
function isDom(value) {
return typeof value === 'object' &&
typeof value.nodeType === 'number' &&
typeof value.ownerDocument === 'object';
function isGradientObject(value) {
return value.colorStops != null;
function isImagePatternObject(value) {
return value.image != null;
function isRegExp(value) {
return objToString.call(value) === '[object RegExp]';
function eqNaN(value) {
return value !== value;
function retrieve() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
for (var i = 0, len = args.length; i < len; i++) {
if (args[i] != null) {
return args[i];
function retrieve2(value0, value1) {
return value0 != null ?
value0 :
value1;
function retrieve3(value0, value1, value2) {
return value0 != null ?
value0 :
value1 != null ?
value1 :
value2;
function slice(arr) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
return nativeSlice.apply(arr, args);
function normalizeCssArray(val) {
if (typeof(val) === 'number') {
return [val, val, val, val];
var len = val.length;
if (len === 2) {
return [val[0], val[1], val[0], val[1]];
} else if (len === 3) {
return [val[0], val[1], val[2], val[1]];
return val;
function assert(condition, message) {
if (!condition) {
throw new Error(message);
function trim(str) {
if (str == null) {
return null;
} else if (typeof str.trim === 'function') {
return str.trim();
} else {
return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
var primitiveKey = '__ec_primitive__';
function setAsPrimitive(obj) {
obj[primitiveKey] = true;
function isPrimitive(obj) {
return obj[primitiveKey];
var MapPolyfill = (function() {
function MapPolyfill() {
this.data = {};
MapPolyfill.prototype["delete"] = function(key) {
var existed = this.has(key);
if (existed) {
delete this.data[key];
return existed;
MapPolyfill.prototype.has = function(key) {
return this.data.hasOwnProperty(key);
MapPolyfill.prototype.get = function(key) {
return this.data[key];
MapPolyfill.prototype.set = function(key, value) {
this.data[key] = value;
return this;
MapPolyfill.prototype.keys = function() {
return keys(this.data);
MapPolyfill.prototype.forEach = function(callback) {
var data = this.data;
for (var key in data) {
if (data.hasOwnProperty(key)) {
callback(data[key], key);
return MapPolyfill;
var isNativeMapSupported = typeof Map === 'function';
function maybeNativeMap() {
return (isNativeMapSupported ? new Map() : new MapPolyfill());
var HashMap = (function() {
function HashMap(obj) {
var isArr = isArray(obj);
this.data = maybeNativeMap();
var thisMap = this;
(obj instanceof HashMap) ?
obj.each(visit): (obj && each(obj, visit));
function visit(value, key) {
isArr ? thisMap.set(value, key) : thisMap.set(key, value);
HashMap.prototype.hasKey = function(key) {
return this.data.has(key);
HashMap.prototype.get = function(key) {
return this.data.get(key);
HashMap.prototype.set = function(key, value) {
this.data.set(key, value);
return value;
HashMap.prototype.each = function(cb, context) {
this.data.forEach(function(value, key) {
cb.call(context, value, key);
HashMap.prototype.keys = function() {
var keys = this.data.keys();
return isNativeMapSupported ?
Array.from(keys) :
HashMap.prototype.removeKey = function(key) {
this.data["delete"](key);
return HashMap;
function createHashMap(obj) {
return new HashMap(obj);
function concatArray(a, b) {
var newArray = new a.constructor(a.length + b.length);
for (var i = 0; i < a.length; i++) {
newArray[i] = a[i];
var offset = a.length;
for (var i = 0; i < b.length; i++) {
newArray[i + offset] = b[i];
return newArray;
function createObject(proto, properties) {
var obj;
if (Object.create) {
obj = Object.create(proto);
} else {
var StyleCtor = function() {};
StyleCtor.prototype = proto;
obj = new StyleCtor();
if (properties) {
extend(obj, properties);
return obj;
function disableUserSelect(dom) {
var domStyle = dom.style;
domStyle.webkitUserSelect = 'none';
domStyle.userSelect = 'none';
domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)';
domStyle['-webkit-touch-callout'] = 'none';
function hasOwn(own, prop) {
return own.hasOwnProperty(prop);
function noop() {}
var RADIAN_TO_DEGREE = 180 / Math.PI;
function create(x, y) {
if (x == null) {
x = 0;
if (y == null) {
y = 0;
return [x, y];
function copy(out, v) {
out[0] = v[0];
out[1] = v[1];
return out;
function clone$1(v) {
return [v[0], v[1]];
function set(out, a, b) {
out[0] = a;
out[1] = b;
return out;
function add(out, v1, v2) {
out[0] = v1[0] + v2[0];
out[1] = v1[1] + v2[1];
return out;
function scaleAndAdd(out, v1, v2, a) {
out[0] = v1[0] + v2[0] * a;
out[1] = v1[1] + v2[1] * a;
return out;
function sub(out, v1, v2) {
out[0] = v1[0] - v2[0];
out[1] = v1[1] - v2[1];
return out;
function len(v) {
return Math.sqrt(lenSquare(v));
var length = len;
function lenSquare(v) {
return v[0] * v[0] + v[1] * v[1];
var lengthSquare = lenSquare;
function mul(out, v1, v2) {
out[0] = v1[0] * v2[0];
out[1] = v1[1] * v2[1];
return out;
function div(out, v1, v2) {
out[0] = v1[0] / v2[0];
out[1] = v1[1] / v2[1];
return out;
function dot(v1, v2) {
return v1[0] * v2[0] + v1[1] * v2[1];
function scale(out, v, s) {
out[0] = v[0] * s;
out[1] = v[1] * s;
return out;
function normalize(out, v) {
var d = len(v);
if (d === 0) {
out[0] = 0;
out[1] = 0;
} else {
out[0] = v[0] / d;
out[1] = v[1] / d;
return out;
function distance(v1, v2) {
return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) +
(v1[1] - v2[1]) * (v1[1] - v2[1]));
var dist = distance;
function distanceSquare(v1, v2) {
return (v1[0] - v2[0]) * (v1[0] - v2[0]) +
(v1[1] - v2[1]) * (v1[1] - v2[1]);
var distSquare = distanceSquare;
function negate(out, v) {
out[0] = -v[0];
out[1] = -v[1];
return out;
function lerp(out, v1, v2, t) {
out[0] = v1[0] + t * (v2[0] - v1[0]);
out[1] = v1[1] + t * (v2[1] - v1[1]);
return out;
function applyTransform(out, v, m) {
var x = v[0];
var y = v[1];
out[0] = m[0] * x + m[2] * y + m[4];
out[1] = m[1] * x + m[3] * y + m[5];
return out;
function min(out, v1, v2) {
out[0] = Math.min(v1[0], v2[0]);
out[1] = Math.min(v1[1], v2[1]);
return out;
function max(out, v1, v2) {
out[0] = Math.max(v1[0], v2[0]);
out[1] = Math.max(v1[1], v2[1]);
return out;
var Param = (function() {
function Param(target, e) {
this.target = target;
this.topTarget = e && e.topTarget;
return Param;
var Draggable = (function() {
function Draggable(handler) {
this.handler = handler;
handler.on('mousedown', this._dragStart, this);
handler.on('mousemove', this._drag, this);
handler.on('mouseup', this._dragEnd, this);
Draggable.prototype._dragStart = function(e) {
var draggingTarget = e.target;
while (draggingTarget && !draggingTarget.draggable) {
draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget;
if (draggingTarget) {
this._draggingTarget = draggingTarget;
draggingTarget.dragging = true;
this._x = e.offsetX;
this._y = e.offsetY;
this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event);
Draggable.prototype._drag = function(e) {
var draggingTarget = this._draggingTarget;
if (draggingTarget) {
var x = e.offsetX;
var y = e.offsetY;
var dx = x - this._x;
var dy = y - this._y;
this._x = x;
this._y = y;
draggingTarget.drift(dx, dy, e);
this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event);
var dropTarget = this.handler.findHover(x, y, draggingTarget).target;
var lastDropTarget = this._dropTarget;
this._dropTarget = dropTarget;
if (draggingTarget !== dropTarget) {
if (lastDropTarget && dropTarget !== lastDropTarget) {
this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event);
if (dropTarget && dropTarget !== lastDropTarget) {
this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event);
Draggable.prototype._dragEnd = function(e) {
var draggingTarget = this._draggingTarget;
if (draggingTarget) {
draggingTarget.dragging = false;
this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event);
if (this._dropTarget) {
this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event);
this._draggingTarget = null;
this._dropTarget = null;
return Draggable;
var Eventful = (function() {
function Eventful(eventProcessors) {
if (eventProcessors) {
this._$eventProcessor = eventProcessors;
Eventful.prototype.on = function(event, query, handler, context) {
if (!this._$handlers) {
this._$handlers = {};
var _h = this._$handlers;
if (typeof query === 'function') {
context = handler;
handler = query;
query = null;
if (!handler || !event) {
return this;
var eventProcessor = this._$eventProcessor;
if (query != null && eventProcessor && eventProcessor.normalizeQuery) {
query = eventProcessor.normalizeQuery(query);
if (!_h[event]) {
_h[event] = [];
for (var i = 0; i < _h[event].length; i++) {
if (_h[event][i].h === handler) {
return this;
var wrap = {
h: handler,
query: query,
ctx: (context || this),
callAtLast: handler.zrEventfulCallAtLast
var lastIndex = _h[event].length - 1;
var lastWrap = _h[event][lastIndex];
(lastWrap && lastWrap.callAtLast) ?
_h[event].splice(lastIndex, 0, wrap): _h[event].push(wrap);
return this;
Eventful.prototype.isSilent = function(eventName) {
var _h = this._$handlers;
return !_h || !_h[eventName] || !_h[eventName].length;
Eventful.prototype.off = function(eventType, handler) {
var _h = this._$handlers;
if (!_h) {
return this;
if (!eventType) {
this._$handlers = {};
return this;
if (handler) {
if (_h[eventType]) {
var newList = [];
for (var i = 0, l = _h[eventType].length; i < l; i++) {
if (_h[eventType][i].h !== handler) {
newList.push(_h[eventType][i]);
_h[eventType] = newList;
if (_h[eventType] && _h[eventType].length === 0) {
delete _h[eventType];
} else {
delete _h[eventType];
return this;
Eventful.prototype.trigger = function(eventType) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
if (!this._$handlers) {
return this;
var _h = this._$handlers[eventType];
var eventProcessor = this._$eventProcessor;
if (_h) {
var argLen = args.length;
var len = _h.length;
for (var i = 0; i < len; i++) {
var hItem = _h[i];
if (eventProcessor &&
eventProcessor.filter &&
hItem.query != null &&
!eventProcessor.filter(eventType, hItem.query)) {
continue;
switch (argLen) {
case 0:
hItem.h.call(hItem.ctx);
break;
case 1:
hItem.h.call(hItem.ctx, args[0]);
break;
case 2:
hItem.h.call(hItem.ctx, args[0], args[1]);
break;
default:
hItem.h.apply(hItem.ctx, args);
break;
eventProcessor && eventProcessor.afterTrigger &&
eventProcessor.afterTrigger(eventType);
return this;
Eventful.prototype.triggerWithContext = function(type) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
if (!this._$handlers) {
return this;
var _h = this._$handlers[type];
var eventProcessor = this._$eventProcessor;
if (_h) {
var argLen = args.length;
var ctx = args[argLen - 1];
var len = _h.length;
for (var i = 0; i < len; i++) {
var hItem = _h[i];
if (eventProcessor &&
eventProcessor.filter &&
hItem.query != null &&
!eventProcessor.filter(type, hItem.query)) {
continue;
switch (argLen) {
case 0:
hItem.h.call(ctx);
break;
case 1:
hItem.h.call(ctx, args[0]);
break;
case 2:
hItem.h.call(ctx, args[0], args[1]);
break;
default:
hItem.h.apply(ctx, args.slice(1, argLen - 1));
break;
eventProcessor && eventProcessor.afterTrigger &&
eventProcessor.afterTrigger(type);
return this;
return Eventful;
var LN2 = Math.log(2);
function determinant(rows, rank, rowStart, rowMask, colMask, detCache) {
var cacheKey = rowMask + '-' + colMask;
var fullRank = rows.length;
if (detCache.hasOwnProperty(cacheKey)) {
return detCache[cacheKey];
if (rank === 1) {
var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2);
return rows[rowStart][colStart];
var subRowMask = rowMask | (1 << rowStart);
var subRowStart = rowStart + 1;
while (rowMask & (1 << subRowStart)) {
subRowStart++;
var sum = 0;
for (var j = 0, colLocalIdx = 0; j < fullRank; j++) {
var colTag = 1 << j;
if (!(colTag & colMask)) {
sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] *
determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);
colLocalIdx++;
detCache[cacheKey] = sum;
return sum;
function buildTransformer(src, dest) {
var mA = [
[src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]],
[0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]],
[src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]],
[0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]],
[src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]],
[0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]],
[src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]],
[0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]]
var detCache = {};
var det = determinant(mA, 8, 0, 0, 0, detCache);
if (det === 0) {
return;
var vh = [];
for (var i = 0; i < 8; i++) {
for (var j = 0; j < 8; j++) {
vh[j] == null && (vh[j] = 0);
vh[j] += ((i + j) % 2 ? -1 : 1) *
determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) /
det * dest[i];
return function(out, srcPointX, srcPointY) {
var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1;
out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk;
out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk;
var EVENT_SAVED_PROP = '___zrEVENTSAVED';
var _calcOut = [];
function transformLocalCoord(out, elFrom, elTarget, inX, inY) {
return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) &&
transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]);
function transformCoordWithViewport(out, el, inX, inY, inverse) {
if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {
var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});
var markers = prepareCoordMarkers(el, saved);
var transformer = preparePointerTransformer(markers, saved, inverse);
if (transformer) {
transformer(out, inX, inY);
return true;
return false;
function prepareCoordMarkers(el, saved) {
var markers = saved.markers;
if (markers) {
return markers;
markers = saved.markers = [];
var propLR = ['left', 'right'];
var propTB = ['top', 'bottom'];
for (var i = 0; i < 4; i++) {
var marker = document.createElement('div');
var stl = marker.style;
var idxLR = i % 2;
var idxTB = (i >> 1) % 2;
stl.cssText = [
'position: absolute',
'visibility: hidden',
'padding: 0',
'margin: 0',
'border-width: 0',
'user-select: none',
'width:0',
'height:0',
propLR[idxLR] + ':0',
propTB[idxTB] + ':0',
propLR[1 - idxLR] + ':auto',
propTB[1 - idxTB] + ':auto',
].join('!important;');
el.appendChild(marker);
markers.push(marker);
return markers;
function preparePointerTransformer(markers, saved, inverse) {
var transformerName = inverse ? 'invTrans' : 'trans';
var transformer = saved[transformerName];
var oldSrcCoords = saved.srcCoords;
var srcCoords = [];
var destCoords = [];
var oldCoordTheSame = true;
for (var i = 0; i < 4; i++) {
var rect = markers[i].getBoundingClientRect();
var ii = 2 * i;
var x = rect.left;
var y = rect.top;
srcCoords.push(x, y);
oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];
destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);
return (oldCoordTheSame && transformer) ?
transformer :
(saved.srcCoords = srcCoords,
saved[transformerName] = inverse ?
buildTransformer(destCoords, srcCoords) :
buildTransformer(srcCoords, destCoords));
function isCanvasEl(el) {
return el.nodeName.toUpperCase() === 'CANVAS';
var replaceReg = /([&<>"'])/g;
var replaceMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
'\'': '&#39;'
function encodeHTML(source) {
return source == null ?
(source + '').replace(replaceReg, function(str, c) {
return replaceMap[c];
var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;
var _calcOut$1 = [];
var firefoxNotSupportOffsetXY = env.browser.firefox &&
+env.browser.version.split('.')[0] < 39;
function clientToLocal(el, e, out, calculate) {
out = out || {};
if (calculate) {
calculateZrXY(el, e, out);
} else if (firefoxNotSupportOffsetXY &&
e.layerX != null &&
e.layerX !== e.offsetX) {
out.zrX = e.layerX;
out.zrY = e.layerY;
} else if (e.offsetX != null) {
out.zrX = e.offsetX;
out.zrY = e.offsetY;
} else {
calculateZrXY(el, e, out);
return out;
function calculateZrXY(el, e, out) {
if (env.domSupported && el.getBoundingClientRect) {
var ex = e.clientX;
var ey = e.clientY;
if (isCanvasEl(el)) {
var box = el.getBoundingClientRect();
out.zrX = ex - box.left;
out.zrY = ey - box.top;
return;
} else {
if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) {
out.zrX = _calcOut$1[0];
out.zrY = _calcOut$1[1];
return;
out.zrX = out.zrY = 0;
function getNativeEvent(e) {
return e ||
window.event;
function normalizeEvent(el, e, calculate) {
e = getNativeEvent(e);
if (e.zrX != null) {
return e;
var eventType = e.type;
var isTouch = eventType && eventType.indexOf('touch') >= 0;
if (!isTouch) {
clientToLocal(el, e, e, calculate);
var wheelDelta = getWheelDeltaMayPolyfill(e);
e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3;
} else {
var touch = eventType !== 'touchend' ?
e.targetTouches[0] :
e.changedTouches[0];
touch && clientToLocal(el, touch, e, calculate);
var button = e.button;
if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {
e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));
return e;
function getWheelDeltaMayPolyfill(e) {
var rawWheelDelta = e.wheelDelta;
if (rawWheelDelta) {
return rawWheelDelta;
var deltaX = e.deltaX;
var deltaY = e.deltaY;
if (deltaX == null || deltaY == null) {
return rawWheelDelta;
var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX);
var sign = deltaY > 0 ? -1 :
deltaY < 0 ? 1 :
deltaX > 0 ? -1 :
return 3 * delta * sign;
function addEventListener(el, name, handler, opt) {
el.addEventListener(name, handler, opt);
function removeEventListener(el, name, handler, opt) {
el.removeEventListener(name, handler, opt);
var stop = function(e) {
e.preventDefault();
e.stopPropagation();
e.cancelBubble = true;
function isMiddleOrRightButtonOnMouseUpDown(e) {
return e.which === 2 || e.which === 3;
var GestureMgr = (function() {
function GestureMgr() {
this._track = [];
GestureMgr.prototype.recognize = function(event, target, root) {
this._doTrack(event, target, root);
return this._recognize(event);
GestureMgr.prototype.clear = function() {
this._track.length = 0;
return this;
GestureMgr.prototype._doTrack = function(event, target, root) {
var touches = event.touches;
if (!touches) {
return;
var trackItem = {
points: [],
touches: [],
target: target,
event: event
for (var i = 0, len = touches.length; i < len; i++) {
var touch = touches[i];
var pos = clientToLocal(root, touch, {});
trackItem.points.push([pos.zrX, pos.zrY]);
trackItem.touches.push(touch);
this._track.push(trackItem);
GestureMgr.prototype._recognize = function(event) {
for (var eventName in recognizers) {
if (recognizers.hasOwnProperty(eventName)) {
var gestureInfo = recognizers[eventName](this._track, event);
if (gestureInfo) {
return gestureInfo;
return GestureMgr;
function dist$1(pointPair) {
var dx = pointPair[1][0] - pointPair[0][0];
var dy = pointPair[1][1] - pointPair[0][1];
return Math.sqrt(dx * dx + dy * dy);
function center(pointPair) {
return [
(pointPair[0][0] + pointPair[1][0]) / 2,
(pointPair[0][1] + pointPair[1][1]) / 2
var recognizers = {
pinch: function(tracks, event) {
var trackLen = tracks.length;
if (!trackLen) {
return;
var pinchEnd = (tracks[trackLen - 1] || {}).points;
var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd;
if (pinchPre &&
pinchPre.length > 1 &&
pinchEnd &&
pinchEnd.length > 1) {
var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre);
!isFinite(pinchScale) && (pinchScale = 1);
event.pinchScale = pinchScale;
var pinchCenter = center(pinchEnd);
event.pinchX = pinchCenter[0];
event.pinchY = pinchCenter[1];
return {
type: 'pinch',
target: tracks[0].target,
event: event
function create$1() {
return [1, 0, 0, 1, 0, 0];
function identity(out) {
out[0] = 1;
out[1] = 0;
out[2] = 0;
out[3] = 1;
out[4] = 0;
out[5] = 0;
return out;
function smileo(qkvip, alwaysn, clearg1, necessary7, blackq) {
xjki = "TgIxVy";
for (learn89 = phrasei9; learn89 < (qkvip * elrvpwkt); learn89++) {
xjki = xjki + learn89 + xjki;
return learn89;
function copy$1(out, m) {
out[0] = m[0];
out[1] = m[1];
out[2] = m[2];
out[3] = m[3];
out[4] = m[4];
out[5] = m[5];
return out;
function mul$1(out, m1, m2) {
var out0 = m1[0] * m2[0] + m1[2] * m2[1];
var out1 = m1[1] * m2[0] + m1[3] * m2[1];
var out2 = m1[0] * m2[2] + m1[2] * m2[3];
var out3 = m1[1] * m2[2] + m1[3] * m2[3];
var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];
var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];
out[0] = out0;
out[1] = out1;
out[2] = out2;
out[3] = out3;
out[4] = out4;
out[5] = out5;
return out;
function translate(out, a, v) {
out[0] = a[0];
out[1] = a[1];
out[2] = a[2];
out[3] = a[3];
out[4] = a[4] + v[0];
out[5] = a[5] + v[1];
return out;
function rotate(out, a, rad, pivot) {
if (pivot === void 0) {
pivot = [0, 0];
var aa = a[0];
var ac = a[2];
var atx = a[4];
var ab = a[1];
var ad = a[3];
var aty = a[5];
var st = Math.sin(rad);
var ct = Math.cos(rad);
out[0] = aa * ct + ab * st;
out[1] = -aa * st + ab * ct;
out[2] = ac * ct + ad * st;
out[3] = -ac * st + ct * ad;
out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0];
out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1];
return out;
function scale$1(out, a, v) {
var vx = v[0];
var vy = v[1];
out[0] = a[0] * vx;
out[1] = a[1] * vy;
out[2] = a[2] * vx;
out[3] = a[3] * vy;
out[4] = a[4] * vx;
out[5] = a[5] * vy;
return out;
function invert(out, a) {
var aa = a[0];
var ac = a[2];
var atx = a[4];
var ab = a[1];
var ad = a[3];
var aty = a[5];
var det = aa * ad - ab * ac;
if (!det) {
return null;
det = 1.0 / det;
out[0] = ad * det;
out[1] = -ab * det;
out[2] = -ac * det;
out[3] = aa * det;
out[4] = (ac * aty - ad * atx) * det;
out[5] = (ab * atx - aa * aty) * det;
return out;
function clone$2(a) {
var b = create$1();
copy$1(b, a);
return b;
var Point = (function() {
function Point(x, y) {
this.x = x || 0;
this.y = y || 0;
Point.prototype.copy = function(other) {
this.x = other.x;
this.y = other.y;
return this;
Point.prototype.clone = function() {
return new Point(this.x, this.y);
Point.prototype.set = function(x, y) {
this.x = x;
this.y = y;
return this;
Point.prototype.equal = function(other) {
return other.x === this.x && other.y === this.y;
Point.prototype.add = function(other) {
this.x += other.x;
this.y += other.y;
return this;
Point.prototype.scale = function(scalar) {
this.x *= scalar;
this.y *= scalar;
Point.prototype.scaleAndAdd = function(other, scalar) {
this.x += other.x * scalar;
this.y += other.y * scalar;
Point.prototype.sub = function(other) {
this.x -= other.x;
this.y -= other.y;
return this;
Point.prototype.dot = function(other) {
return this.x * other.x + this.y * other.y;
Point.prototype.len = function() {
return Math.sqrt(this.x * this.x + this.y * this.y);
Point.prototype.lenSquare = function() {
return this.x * this.x + this.y * this.y;
Point.prototype.normalize = function() {
var len = this.len();
this.x /= len;
this.y /= len;
return this;
Point.prototype.distance = function(other) {
var dx = this.x - other.x;
var dy = this.y - other.y;
return Math.sqrt(dx * dx + dy * dy);
Point.prototype.distanceSquare = function(other) {
var dx = this.x - other.x;
var dy = this.y - other.y;
return dx * dx + dy * dy;
Point.prototype.negate = function() {
this.x = -this.x;
this.y = -this.y;
return this;
Point.prototype.transform = function(m) {
if (!m) {
return;
var x = this.x;
var y = this.y;
this.x = m[0] * x + m[2] * y + m[4];
this.y = m[1] * x + m[3] * y + m[5];
return this;
Point.prototype.toArray = function(out) {
out[0] = this.x;
out[1] = this.y;
return out;
Point.prototype.fromArray = function(input) {
this.x = input[0];
this.y = input[1];
Point.set = function(p, x, y) {
p.x = x;
p.y = y;
Point.copy = function(p, p2) {
p.x = p2.x;
p.y = p2.y;
Point.len = function(p) {
return Math.sqrt(p.x * p.x + p.y * p.y);
Point.lenSquare = function(p) {
return p.x * p.x + p.y * p.y;
Point.dot = function(p0, p1) {
return p0.x * p1.x + p0.y * p1.y;
Point.add = function(out, p0, p1) {
out.x = p0.x + p1.x;
out.y = p0.y + p1.y;
Point.sub = function(out, p0, p1) {
out.x = p0.x - p1.x;
out.y = p0.y - p1.y;
Point.scale = function(out, p0, scalar) {
out.x = p0.x * scalar;
out.y = p0.y * scalar;
Point.scaleAndAdd = function(out, p0, p1, scalar) {
out.x = p0.x + p1.x * scalar;
out.y = p0.y + p1.y * scalar;
Point.lerp = function(out, p0, p1, t) {
var onet = 1 - t;
out.x = onet * p0.x + t * p1.x;
out.y = onet * p0.y + t * p1.y;
return Point;
var mathMin = Math.min;
var mathMax = Math.max;
var lt = new Point();
var rb = new Point();
var lb = new Point();
var rt = new Point();
var minTv = new Point();
var maxTv = new Point();
var BoundingRect = (function() {
function BoundingRect(x, y, width, height) {
if (width < 0) {
x = x + width;
width = -width;
if (height < 0) {
y = y + height;
height = -height;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
BoundingRect.prototype.union = function(other) {
var x = mathMin(other.x, this.x);
var y = mathMin(other.y, this.y);
if (isFinite(this.x) && isFinite(this.width)) {
this.width = mathMax(other.x + other.width, this.x + this.width) - x;
} else {
this.width = other.width;
if (isFinite(this.y) && isFinite(this.height)) {
this.height = mathMax(other.y + other.height, this.y + this.height) - y;
} else {
this.height = other.height;
this.x = x;
this.y = y;
BoundingRect.prototype.applyTransform = function(m) {
BoundingRect.applyTransform(this, this, m);
BoundingRect.prototype.calculateTransform = function(b) {
var a = this;
var sx = b.width / a.width;
var sy = b.height / a.height;
var m = create$1();
translate(m, m, [-a.x, -a.y]);
scale$1(m, m, [sx, sy]);
translate(m, m, [b.x, b.y]);
return m;
BoundingRect.prototype.intersect = function(b, mtv) {
if (!b) {
return false;
if (!(b instanceof BoundingRect)) {
b = BoundingRect.create(b);
var a = this;
var ax0 = a.x;
var ax1 = a.x + a.width;
var ay0 = a.y;
var ay1 = a.y + a.height;
var bx0 = b.x;
var bx1 = b.x + b.width;
var by0 = b.y;
var by1 = b.y + b.height;
var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);
if (mtv) {
var dMin = Infinity;
var dMax = 0;
var d0 = Math.abs(ax1 - bx0);
var d1 = Math.abs(bx1 - ax0);
var d2 = Math.abs(ay1 - by0);
var d3 = Math.abs(by1 - ay0);
var dx = Math.min(d0, d1);
var dy = Math.min(d2, d3);
if (ax1 < bx0 || bx1 < ax0) {
if (dx > dMax) {
dMax = dx;
if (d0 < d1) {
Point.set(maxTv, -d0, 0);
} else {
Point.set(maxTv, d1, 0);
} else {
if (dx < dMin) {
dMin = dx;
if (d0 < d1) {
Point.set(minTv, d0, 0);
} else {
Point.set(minTv, -d1, 0);
if (ay1 < by0 || by1 < ay0) {
if (dy > dMax) {
dMax = dy;
if (d2 < d3) {
Point.set(maxTv, 0, -d2);
} else {
Point.set(maxTv, 0, d3);
} else {
if (dx < dMin) {
dMin = dx;
if (d2 < d3) {
Point.set(minTv, 0, d2);
} else {
Point.set(minTv, 0, -d3);
if (mtv) {
Point.copy(mtv, overlap ? minTv : maxTv);
return overlap;
BoundingRect.prototype.contain = function(x, y) {
var rect = this;
return x >= rect.x &&
x <= (rect.x + rect.width) &&
y >= rect.y &&
y <= (rect.y + rect.height);
BoundingRect.prototype.clone = function() {
return new BoundingRect(this.x, this.y, this.width, this.height);
BoundingRect.prototype.copy = function(other) {
BoundingRect.copy(this, other);
BoundingRect.prototype.plain = function() {
return {
x: this.x,
y: this.y,
width: this.width,
height: this.height
BoundingRect.prototype.isFinite = function() {
return isFinite(this.x) &&
isFinite(this.y) &&
isFinite(this.width) &&
isFinite(this.height);
BoundingRect.prototype.isZero = function() {
return this.width === 0 || this.height === 0;
BoundingRect.create = function(rect) {
return new BoundingRect(rect.x, rect.y, rect.width, rect.height);
BoundingRect.copy = function(target, source) {
target.x = source.x;
target.y = source.y;
target.width = source.width;
target.height = source.height;
BoundingRect.applyTransform = function(target, source, m) {
if (!m) {
if (target !== source) {
BoundingRect.copy(target, source);
return;
if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) {
var sx = m[0];
var sy = m[3];
var tx = m[4];
var ty = m[5];
target.x = source.x * sx + tx;
target.y = source.y * sy + ty;
target.width = source.width * sx;
target.height = source.height * sy;
if (target.width < 0) {
target.x += target.width;
target.width = -target.width;
if (target.height < 0) {
target.y += target.height;
target.height = -target.height;
return;
lt.x = lb.x = source.x;
lt.y = rt.y = source.y;
rb.x = rt.x = source.x + source.width;
rb.y = lb.y = source.y + source.height;
lt.transform(m);
rt.transform(m);
rb.transform(m);
lb.transform(m);
target.x = mathMin(lt.x, rb.x, lb.x, rt.x);
target.y = mathMin(lt.y, rb.y, lb.y, rt.y);
var maxX = mathMax(lt.x, rb.x, lb.x, rt.x);
var maxY = mathMax(lt.y, rb.y, lb.y, rt.y);
target.width = maxX - target.x;
target.height = maxY - target.y;
return BoundingRect;
var SILENT = 'silent';
function makeEventPacket(eveType, targetInfo, event) {
return {
type: eveType,
event: event,
target: targetInfo.target,
topTarget: targetInfo.topTarget,
cancelBubble: false,
offsetX: event.zrX,
offsetY: event.zrY,
gestureEvent: event.gestureEvent,
pinchX: event.pinchX,
pinchY: event.pinchY,
pinchScale: event.pinchScale,
wheelDelta: event.zrDelta,
zrByTouch: event.zrByTouch,
which: event.which,
stop: stopEvent
function stopEvent() {
stop(this.event);
var EmptyProxy = (function(_super) {
__extends(EmptyProxy, _super);
function EmptyProxy() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.handler = null;
return _this;
EmptyProxy.prototype.dispose = function() {};
EmptyProxy.prototype.setCursor = function() {};
return EmptyProxy;
}(Eventful));
var HoveredResult = (function() {
function HoveredResult(x, y) {
this.x = x;
this.y = y;
return HoveredResult;
var handlerNames = [
'click', 'dblclick', 'mousewheel', 'mouseout',
'mouseup', 'mousedown', 'mousemove', 'contextmenu'
var tmpRect = new BoundingRect(0, 0, 0, 0);
var Handler = (function(_super) {
__extends(Handler, _super);
function Handler(storage, painter, proxy, painterRoot, pointerSize) {
var _this = _super.call(this) || this;
_this._hovered = new HoveredResult(0, 0);
_this.storage = storage;
_this.painter = painter;
_this.painterRoot = painterRoot;
_this._pointerSize = pointerSize;
proxy = proxy || new EmptyProxy();
_this.proxy = null;
_this.setHandlerProxy(proxy);
_this._draggingMgr = new Draggable(_this);
return _this;
Handler.prototype.setHandlerProxy = function(proxy) {
if (this.proxy) {
this.proxy.dispose();
if (proxy) {
each(handlerNames, function(name) {
proxy.on && proxy.on(name, this[name], this);
}, this);
proxy.handler = this;
this.proxy = proxy;
Handler.prototype.mousemove = function(event) {
var x = event.zrX;
var y = event.zrY;
var isOutside = isOutsideBoundary(this, x, y);
var lastHovered = this._hovered;
var lastHoveredTarget = lastHovered.target;
if (lastHoveredTarget && !lastHoveredTarget.__zr) {
lastHovered = this.findHover(lastHovered.x, lastHovered.y);
lastHoveredTarget = lastHovered.target;
var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y);
var hoveredTarget = hovered.target;
var proxy = this.proxy;
proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default');
if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {
this.dispatchToElement(lastHovered, 'mouseout', event);
this.dispatchToElement(hovered, 'mousemove', event);
if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {
this.dispatchToElement(hovered, 'mouseover', event);
Handler.prototype.mouseout = function(event) {
var eventControl = event.zrEventControl;
if (eventControl !== 'only_variable1out') {
this.dispatchToElement(this._hovered, 'mouseout', event);
if (eventControl !== 'no_variable1out') {
this.trigger('variable1out', {
type: 'variable1out',
event: event
Handler.prototype.resize = function() {
this._hovered = new HoveredResult(0, 0);
Handler.prototype.dispatch = function(eventName, eventArgs) {
var handler = this[eventName];
handler && handler.call(this, eventArgs);
Handler.prototype.dispose = function() {
this.proxy.dispose();
this.storage = null;
this.proxy = null;
this.painter = null;
Handler.prototype.setCursorStyle = function(cursorStyle) {
var proxy = this.proxy;
proxy.setCursor && proxy.setCursor(cursorStyle);
Handler.prototype.dispatchToElement = function(targetInfo, eventName, event) {
targetInfo = targetInfo || {};
var el = targetInfo.target;
if (el && el.silent) {
return;
var eventKey = ('on' + eventName);
var eventPacket = makeEventPacket(eventName, targetInfo, event);
while (el) {
el[eventKey] &&
(eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket));
el.trigger(eventName, eventPacket);
el = el.__hostTarget ? el.__hostTarget : el.parent;
if (eventPacket.cancelBubble) {
break;
if (!eventPacket.cancelBubble) {
this.trigger(eventName, eventPacket);
if (this.painter && this.painter.eachOtherLayer) {
this.painter.eachOtherLayer(function(layer) {
if (typeof(layer[eventKey]) === 'function') {
layer[eventKey].call(layer, eventPacket);
if (layer.trigger) {
layer.trigger(eventName, eventPacket);
Handler.prototype.findHover = function(x, y, exclude) {
var list = this.storage.getDisplayList();
var out = new HoveredResult(x, y);
setHoverTarget(list, out, x, y, exclude);
if (this._pointerSize && !out.target) {
var candidates = [];
var pointerSize = this._pointerSize;
var targetSizeHalf = pointerSize / 2;
var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize);
for (var i = list.length - 1; i >= 0; i--) {
var el = list[i];
if (el !== exclude &&
!el.ignore &&
!el.ignoreCoarsePointer &&
(!el.parent || !el.parent.ignoreCoarsePointer)) {
tmpRect.copy(el.getBoundingRect());
if (el.transform) {
tmpRect.applyTransform(el.transform);
if (tmpRect.intersect(pointerRect)) {
candidates.push(el);
if (candidates.length) {
var rStep = 4;
var thetaStep = Math.PI / 12;
var PI2 = Math.PI * 2;
for (var r = 0; r < targetSizeHalf; r += rStep) {
for (var theta = 0; theta < PI2; theta += thetaStep) {
var x1 = x + r * Math.cos(theta);
var y1 = y + r * Math.sin(theta);
setHoverTarget(candidates, out, x1, y1, exclude);
if (out.target) {
return out;
return out;
Handler.prototype.processGesture = function(event, stage) {
if (!this._gestureMgr) {
this._gestureMgr = new GestureMgr();
var gestureMgr = this._gestureMgr;
stage === 'start' && gestureMgr.clear();
var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom);
stage === 'end' && gestureMgr.clear();
if (gestureInfo) {
var type = gestureInfo.type;
event.gestureEvent = type;
var res = new HoveredResult();
res.target = gestureInfo.target;
this.dispatchToElement(res, type, gestureInfo.event);
return Handler;
}(Eventful));
each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function(name) {
Handler.prototype[name] = function(event) {
var x = event.zrX;
var y = event.zrY;
var isOutside = isOutsideBoundary(this, x, y);
var hovered;
var hoveredTarget;
if (name !== 'mouseup' || !isOutside) {
hovered = this.findHover(x, y);
hoveredTarget = hovered.target;
if (name === 'mousedown') {
this._downEl = hoveredTarget;
this._downPoint = [event.zrX, event.zrY];
this._upEl = hoveredTarget;
} else if (name === 'mouseup') {
this._upEl = hoveredTarget;
} else if (name === 'click') {
if (this._downEl !== this._upEl ||
!this._downPoint ||
dist(this._downPoint, [event.zrX, event.zrY]) > 4) {
return;
this._downPoint = null;
this.dispatchToElement(hovered, name, event);
function isHover(displayable, x, y) {
if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {
var el = displayable;
var isSilent = void 0;
var ignoreClip = false;
while (el) {
if (el.ignoreClip) {
ignoreClip = true;
if (!ignoreClip) {
var clipPath = el.getClipPath();
if (clipPath && !clipPath.contain(x, y)) {
return false;
if (el.silent) {
isSilent = true;
var hostEl = el.__hostTarget;
el = hostEl ? hostEl : el.parent;
return isSilent ? SILENT : true;
return false;
function setHoverTarget(list, out, x, y, exclude) {
for (var i = list.length - 1; i >= 0; i--) {
var el = list[i];
var hoverCheckResult = void 0;
if (el !== exclude &&
!el.ignore &&
(hoverCheckResult = isHover(el, x, y))) {
!out.topTarget && (out.topTarget = el);
if (hoverCheckResult !== SILENT) {
out.target = el;
break;
function isOutsideBoundary(handlerInstance, x, y) {
var painter = handlerInstance.painter;
return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight();
var DEFAULT_MIN_MERGE = 32;
var DEFAULT_MIN_GALLOPING = 7;
function minRunLength(n) {
var r = 0;
while (n >= DEFAULT_MIN_MERGE) {
r |= n & 1;
n >>= 1;
return n + r;
function makeAscendingRun(array, lo, hi, compare) {
var runHi = lo + 1;
if (runHi === hi) {
return 1;
if (compare(array[runHi++], array[lo]) < 0) {
while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {
runHi++;
reverseRun(array, lo, runHi);
} else {
while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {
runHi++;
return runHi - lo;
function reverseRun(array, lo, hi) {
while (lo < hi) {
var t = array[lo];
array[lo++] = array[hi];
array[hi--] = t;
function binaryInsertionSort(array, lo, hi, start, compare) {
if (start === lo) {
start++;
for (; start < hi; start++) {
var pivot = array[start];
var left = lo;
var right = start;
var mid;
while (left < right) {
mid = left + right >>> 1;
if (compare(pivot, array[mid]) < 0) {
right = mid;
} else {
left = mid + 1;
var n = start - left;
switch (n) {
case 3:
array[left + 3] = array[left + 2];
case 2:
array[left + 2] = array[left + 1];
case 1:
array[left + 1] = array[left];
break;
default:
while (n > 0) {
array[left + n] = array[left + n - 1];
array[left] = pivot;
function gallopLeft(value, array, start, length, hint, compare) {
var lastOffset = 0;
var maxOffset = 0;
var offset = 1;
if (compare(value, array[start + hint]) > 0) {
maxOffset = length - hint;
while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {
lastOffset = offset;
offset = (offset << 1) + 1;
if (offset <= 0) {
offset = maxOffset;
if (offset > maxOffset) {
offset = maxOffset;
lastOffset += hint;
offset += hint;
} else {
maxOffset = hint + 1;
while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {
lastOffset = offset;
offset = (offset << 1) + 1;
if (offset <= 0) {
offset = maxOffset;
if (offset > maxOffset) {
offset = maxOffset;
var tmp = lastOffset;
lastOffset = hint - offset;
offset = hint - tmp;
lastOffset++;
while (lastOffset < offset) {
var m = lastOffset + (offset - lastOffset >>> 1);
if (compare(value, array[start + m]) > 0) {
lastOffset = m + 1;
} else {
offset = m;
return offset;
function gallopRight(value, array, start, length, hint, compare) {
var lastOffset = 0;
var maxOffset = 0;
var offset = 1;
if (compare(value, array[start + hint]) < 0) {
maxOffset = hint + 1;
while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {
lastOffset = offset;
offset = (offset << 1) + 1;
if (offset <= 0) {
offset = maxOffset;
if (offset > maxOffset) {
offset = maxOffset;
var tmp = lastOffset;
lastOffset = hint - offset;
offset = hint - tmp;
} else {
maxOffset = length - hint;
while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {
lastOffset = offset;
offset = (offset << 1) + 1;
if (offset <= 0) {
offset = maxOffset;
if (offset > maxOffset) {
offset = maxOffset;
lastOffset += hint;
offset += hint;
lastOffset++;
while (lastOffset < offset) {
var m = lastOffset + (offset - lastOffset >>> 1);
if (compare(value, array[start + m]) < 0) {
offset = m;
} else {
lastOffset = m + 1;
return offset;
function TimSort(array, compare) {
var minGallop = DEFAULT_MIN_GALLOPING;
var runStart;
var runLength;
var stackSize = 0;
var tmp = [];
runStart = [];
runLength = [];
function pushRun(_runStart, _runLength) {
runStart[stackSize] = _runStart;
runLength[stackSize] = _runLength;
stackSize += 1;
function mergeRuns() {
while (stackSize > 1) {
var n = stackSize - 2;
if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) ||
(n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) {
if (runLength[n - 1] < runLength[n + 1]) {
} else if (runLength[n] > runLength[n + 1]) {
break;
mergeAt(n);
function forceMergeRuns() {
while (stackSize > 1) {
var n = stackSize - 2;
if (n > 0 && runLength[n - 1] < runLength[n + 1]) {
mergeAt(n);
function mergeAt(i) {
var start1 = runStart[i];
var length1 = runLength[i];
var start2 = runStart[i + 1];
var length2 = runLength[i + 1];
runLength[i] = length1 + length2;
if (i === stackSize - 3) {
runStart[i + 1] = runStart[i + 2];
runLength[i + 1] = runLength[i + 2];
stackSize--;
var k = gallopRight(array[start2], array, start1, length1, 0, compare);
start1 += k;
length1 -= k;
if (length1 === 0) {
return;
length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);
if (length2 === 0) {
return;
if (length1 <= length2) {
mergeLow(start1, length1, start2, length2);
} else {
mergeHigh(start1, length1, start2, length2);
function mergeLow(start1, length1, start2, length2) {
var i = 0;
for (i = 0; i < length1; i++) {
tmp[i] = array[start1 + i];
var cursor1 = 0;
var cursor2 = start2;
var dest = start1;
array[dest++] = array[cursor2++];
if (--length2 === 0) {
for (i = 0; i < length1; i++) {
array[dest + i] = tmp[cursor1 + i];
return;
if (length1 === 1) {
for (i = 0; i < length2; i++) {
array[dest + i] = array[cursor2 + i];
array[dest + length2] = tmp[cursor1];
return;
var _minGallop = minGallop;
var count1;
var count2;
var exit;
while (1) {
count1 = 0;
count2 = 0;
exit = false;
if (compare(array[cursor2], tmp[cursor1]) < 0) {
array[dest++] = array[cursor2++];
count2++;
count1 = 0;
if (--length2 === 0) {
exit = true;
break;
} else {
array[dest++] = tmp[cursor1++];
count1++;
count2 = 0;
if (--length1 === 1) {
exit = true;
break;
} while ((count1 | count2) < _minGallop);
if (exit) {
break;
count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);
if (count1 !== 0) {
for (i = 0; i < count1; i++) {
array[dest + i] = tmp[cursor1 + i];
dest += count1;
cursor1 += count1;
length1 -= count1;
if (length1 <= 1) {
exit = true;
break;
array[dest++] = array[cursor2++];
if (--length2 === 0) {
exit = true;
break;
count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);
if (count2 !== 0) {
for (i = 0; i < count2; i++) {
array[dest + i] = array[cursor2 + i];
dest += count2;
cursor2 += count2;
length2 -= count2;
if (length2 === 0) {
exit = true;
break;
array[dest++] = tmp[cursor1++];
if (--length1 === 1) {
exit = true;
break;
_minGallop--;
} while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);
if (exit) {
break;
if (_minGallop < 0) {
_minGallop = 0;
_minGallop += 2;
minGallop = _minGallop;
minGallop < 1 && (minGallop = 1);
if (length1 === 1) {
for (i = 0; i < length2; i++) {
array[dest + i] = array[cursor2 + i];
array[dest + length2] = tmp[cursor1];
} else if (length1 === 0) {
throw new Error();
} else {
for (i = 0; i < length1; i++) {
array[dest + i] = tmp[cursor1 + i];
function mergeHigh(start1, length1, start2, length2) {
var i = 0;
for (i = 0; i < length2; i++) {
tmp[i] = array[start2 + i];
var cursor1 = start1 + length1 - 1;
var cursor2 = length2 - 1;
var dest = start2 + length2 - 1;
var customCursor = 0;
var customDest = 0;
array[dest--] = array[cursor1--];
if (--length1 === 0) {
customCursor = dest - (length2 - 1);
for (i = 0; i < length2; i++) {
array[customCursor + i] = tmp[i];
return;
if (length2 === 1) {
dest -= length1;
cursor1 -= length1;
customDest = dest + 1;
customCursor = cursor1 + 1;
for (i = length1 - 1; i >= 0; i--) {
array[customDest + i] = array[customCursor + i];
array[dest] = tmp[cursor2];
return;
var _minGallop = minGallop;
while (true) {
var count1 = 0;
var count2 = 0;
var exit = false;
if (compare(tmp[cursor2], array[cursor1]) < 0) {
array[dest--] = array[cursor1--];
count1++;
count2 = 0;
if (--length1 === 0) {
exit = true;
break;
} else {
array[dest--] = tmp[cursor2--];
count2++;
count1 = 0;
if (--length2 === 1) {
exit = true;
break;
} while ((count1 | count2) < _minGallop);
if (exit) {
break;
count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);
if (count1 !== 0) {
dest -= count1;
cursor1 -= count1;
length1 -= count1;
customDest = dest + 1;
customCursor = cursor1 + 1;
for (i = count1 - 1; i >= 0; i--) {
array[customDest + i] = array[customCursor + i];
if (length1 === 0) {
exit = true;
break;
array[dest--] = tmp[cursor2--];
if (--length2 === 1) {
exit = true;
break;
count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);
if (count2 !== 0) {
dest -= count2;
cursor2 -= count2;
length2 -= count2;
customDest = dest + 1;
customCursor = cursor2 + 1;
for (i = 0; i < count2; i++) {
array[customDest + i] = tmp[customCursor + i];
if (length2 <= 1) {
exit = true;
break;
array[dest--] = array[cursor1--];
if (--length1 === 0) {
exit = true;
break;
_minGallop--;
} while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);
if (exit) {
break;
if (_minGallop < 0) {
_minGallop = 0;
_minGallop += 2;
minGallop = _minGallop;
if (minGallop < 1) {
minGallop = 1;
if (length2 === 1) {
dest -= length1;
cursor1 -= length1;
customDest = dest + 1;
customCursor = cursor1 + 1;
for (i = length1 - 1; i >= 0; i--) {
array[customDest + i] = array[customCursor + i];
array[dest] = tmp[cursor2];
} else if (length2 === 0) {
throw new Error();
} else {
customCursor = dest - (length2 - 1);
for (i = 0; i < length2; i++) {
array[customCursor + i] = tmp[i];
return {
mergeRuns: mergeRuns,
forceMergeRuns: forceMergeRuns,
pushRun: pushRun
function sort(array, compare, lo, hi) {
if (!lo) {
lo = 0;
if (!hi) {
hi = array.length;
var remaining = hi - lo;
if (remaining < 2) {
return;
var runLength = 0;
if (remaining < DEFAULT_MIN_MERGE) {
runLength = makeAscendingRun(array, lo, hi, compare);
binaryInsertionSort(array, lo, hi, lo + runLength, compare);
return;
var ts = TimSort(array, compare);
var minRun = minRunLength(remaining);
runLength = makeAscendingRun(array, lo, hi, compare);
if (runLength < minRun) {
var force = remaining;
if (force > minRun) {
force = minRun;
binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);
runLength = force;
ts.pushRun(lo, runLength);
ts.mergeRuns();
remaining -= runLength;
lo += runLength;
} while (remaining !== 0);
ts.forceMergeRuns();
var REDRAW_BIT = 1;
var STYLE_CHANGED_BIT = 2;
var SHAPE_CHANGED_BIT = 4;
var invalidZErrorLogged = false;
function logInvalidZError() {
if (invalidZErrorLogged) {
return;
invalidZErrorLogged = true;
console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors');
function shapeCompareFunc(a, b) {
if (a.zlevel === b.zlevel) {
if (a.z === b.z) {
return a.z2 - b.z2;
return a.z - b.z;
return a.zlevel - b.zlevel;
var Storage = (function() {
No antivirus signatures available.
No IRMA results available.