| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
import { __extends } from "tslib"; 
 | 
/* 
 | 
* 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. 
 | 
*/ 
 | 
import * as zrender from 'zrender/lib/zrender.js'; 
 | 
import { assert, each, isFunction, isObject, indexOf, bind, clone, setAsPrimitive, extend, createHashMap, map, defaults, isDom, isArray, noop, isString, retrieve2 } from 'zrender/lib/core/util.js'; 
 | 
import env from 'zrender/lib/core/env.js'; 
 | 
import timsort from 'zrender/lib/core/timsort.js'; 
 | 
import Eventful from 'zrender/lib/core/Eventful.js'; 
 | 
import GlobalModel from '../model/Global.js'; 
 | 
import ExtensionAPI from './ExtensionAPI.js'; 
 | 
import CoordinateSystemManager from './CoordinateSystem.js'; 
 | 
import OptionManager from '../model/OptionManager.js'; 
 | 
import backwardCompat from '../preprocessor/backwardCompat.js'; 
 | 
import dataStack from '../processor/dataStack.js'; 
 | 
import SeriesModel from '../model/Series.js'; 
 | 
import ComponentView from '../view/Component.js'; 
 | 
import ChartView from '../view/Chart.js'; 
 | 
import * as graphic from '../util/graphic.js'; 
 | 
import { getECData } from '../util/innerStore.js'; 
 | 
import { isHighDownDispatcher, HOVER_STATE_EMPHASIS, HOVER_STATE_BLUR, blurSeriesFromHighlightPayload, toggleSelectionFromPayload, updateSeriesElementSelection, getAllSelectedIndices, isSelectChangePayload, isHighDownPayload, HIGHLIGHT_ACTION_TYPE, DOWNPLAY_ACTION_TYPE, SELECT_ACTION_TYPE, UNSELECT_ACTION_TYPE, TOGGLE_SELECT_ACTION_TYPE, savePathStates, enterEmphasis, leaveEmphasis, leaveBlur, enterSelect, leaveSelect, enterBlur, allLeaveBlur, findComponentHighDownDispatchers, blurComponent, handleGlobalMouseOverForHighDown, handleGlobalMouseOutForHighDown } from '../util/states.js'; 
 | 
import * as modelUtil from '../util/model.js'; 
 | 
import { throttle } from '../util/throttle.js'; 
 | 
import { seriesStyleTask, dataStyleTask, dataColorPaletteTask } from '../visual/style.js'; 
 | 
import loadingDefault from '../loading/default.js'; 
 | 
import Scheduler from './Scheduler.js'; 
 | 
import lightTheme from '../theme/light.js'; 
 | 
import darkTheme from '../theme/dark.js'; 
 | 
import { parseClassType } from '../util/clazz.js'; 
 | 
import { ECEventProcessor } from '../util/ECEventProcessor.js'; 
 | 
import { seriesSymbolTask, dataSymbolTask } from '../visual/symbol.js'; 
 | 
import { getVisualFromData, getItemVisualFromData } from '../visual/helper.js'; 
 | 
import { deprecateLog, deprecateReplaceLog, error, warn } from '../util/log.js'; 
 | 
import { handleLegacySelectEvents } from '../legacy/dataSelectAction.js'; 
 | 
import { registerExternalTransform } from '../data/helper/transform.js'; 
 | 
import { createLocaleObject, SYSTEM_LANG } from './locale.js'; 
 | 
import { findEventDispatcher } from '../util/event.js'; 
 | 
import decal from '../visual/decal.js'; 
 | 
import lifecycle from './lifecycle.js'; 
 | 
import { platformApi, setPlatformAPI } from 'zrender/lib/core/platform.js'; 
 | 
import { getImpl } from './impl.js'; 
 | 
export var version = '5.6.0'; 
 | 
export var dependencies = { 
 | 
  zrender: '5.6.1' 
 | 
}; 
 | 
var TEST_FRAME_REMAIN_TIME = 1; 
 | 
var PRIORITY_PROCESSOR_SERIES_FILTER = 800; 
 | 
// Some data processors depends on the stack result dimension (to calculate data extent). 
 | 
// So data stack stage should be in front of data processing stage. 
 | 
var PRIORITY_PROCESSOR_DATASTACK = 900; 
 | 
// "Data filter" will block the stream, so it should be 
 | 
// put at the beginning of data processing. 
 | 
var PRIORITY_PROCESSOR_FILTER = 1000; 
 | 
var PRIORITY_PROCESSOR_DEFAULT = 2000; 
 | 
var PRIORITY_PROCESSOR_STATISTIC = 5000; 
 | 
var PRIORITY_VISUAL_LAYOUT = 1000; 
 | 
var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; 
 | 
var PRIORITY_VISUAL_GLOBAL = 2000; 
 | 
var PRIORITY_VISUAL_CHART = 3000; 
 | 
var PRIORITY_VISUAL_COMPONENT = 4000; 
 | 
// Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to 
 | 
// overwrite the viusal result of component (like `visualMap`) 
 | 
// using data item specific setting (like itemStyle.xxx on data item) 
 | 
var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; 
 | 
// Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on 
 | 
// visual result like `symbolSize`. 
 | 
var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; 
 | 
var PRIORITY_VISUAL_BRUSH = 5000; 
 | 
var PRIORITY_VISUAL_ARIA = 6000; 
 | 
var PRIORITY_VISUAL_DECAL = 7000; 
 | 
export var PRIORITY = { 
 | 
  PROCESSOR: { 
 | 
    FILTER: PRIORITY_PROCESSOR_FILTER, 
 | 
    SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, 
 | 
    STATISTIC: PRIORITY_PROCESSOR_STATISTIC 
 | 
  }, 
 | 
  VISUAL: { 
 | 
    LAYOUT: PRIORITY_VISUAL_LAYOUT, 
 | 
    PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, 
 | 
    GLOBAL: PRIORITY_VISUAL_GLOBAL, 
 | 
    CHART: PRIORITY_VISUAL_CHART, 
 | 
    POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, 
 | 
    COMPONENT: PRIORITY_VISUAL_COMPONENT, 
 | 
    BRUSH: PRIORITY_VISUAL_BRUSH, 
 | 
    CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, 
 | 
    ARIA: PRIORITY_VISUAL_ARIA, 
 | 
    DECAL: PRIORITY_VISUAL_DECAL 
 | 
  } 
 | 
}; 
 | 
// Main process have three entries: `setOption`, `dispatchAction` and `resize`, 
 | 
// where they must not be invoked nestedly, except the only case: invoke 
 | 
// dispatchAction with updateMethod "none" in main process. 
 | 
// This flag is used to carry out this rule. 
 | 
// All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]). 
 | 
var IN_MAIN_PROCESS_KEY = '__flagInMainProcess'; 
 | 
var PENDING_UPDATE = '__pendingUpdate'; 
 | 
var STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus'; 
 | 
var ACTION_REG = /^[a-zA-Z0-9_]+$/; 
 | 
var CONNECT_STATUS_KEY = '__connectUpdateStatus'; 
 | 
var CONNECT_STATUS_PENDING = 0; 
 | 
var CONNECT_STATUS_UPDATING = 1; 
 | 
var CONNECT_STATUS_UPDATED = 2; 
 | 
; 
 | 
; 
 | 
function createRegisterEventWithLowercaseECharts(method) { 
 | 
  return function () { 
 | 
    var args = []; 
 | 
    for (var _i = 0; _i < arguments.length; _i++) { 
 | 
      args[_i] = arguments[_i]; 
 | 
    } 
 | 
    if (this.isDisposed()) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    return toLowercaseNameAndCallEventful(this, method, args); 
 | 
  }; 
 | 
} 
 | 
function createRegisterEventWithLowercaseMessageCenter(method) { 
 | 
  return function () { 
 | 
    var args = []; 
 | 
    for (var _i = 0; _i < arguments.length; _i++) { 
 | 
      args[_i] = arguments[_i]; 
 | 
    } 
 | 
    return toLowercaseNameAndCallEventful(this, method, args); 
 | 
  }; 
 | 
} 
 | 
function toLowercaseNameAndCallEventful(host, method, args) { 
 | 
  // `args[0]` is event name. Event name is all lowercase. 
 | 
  args[0] = args[0] && args[0].toLowerCase(); 
 | 
  return Eventful.prototype[method].apply(host, args); 
 | 
} 
 | 
var MessageCenter = /** @class */function (_super) { 
 | 
  __extends(MessageCenter, _super); 
 | 
  function MessageCenter() { 
 | 
    return _super !== null && _super.apply(this, arguments) || this; 
 | 
  } 
 | 
  return MessageCenter; 
 | 
}(Eventful); 
 | 
var messageCenterProto = MessageCenter.prototype; 
 | 
messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on'); 
 | 
messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off'); 
 | 
// --------------------------------------- 
 | 
// Internal method names for class ECharts 
 | 
// --------------------------------------- 
 | 
var prepare; 
 | 
var prepareView; 
 | 
var updateDirectly; 
 | 
var updateMethods; 
 | 
var doConvertPixel; 
 | 
var updateStreamModes; 
 | 
var doDispatchAction; 
 | 
var flushPendingActions; 
 | 
var triggerUpdatedEvent; 
 | 
var bindRenderedEvent; 
 | 
var bindMouseEvent; 
 | 
var render; 
 | 
var renderComponents; 
 | 
var renderSeries; 
 | 
var createExtensionAPI; 
 | 
var enableConnect; 
 | 
var markStatusToUpdate; 
 | 
var applyChangedStates; 
 | 
var ECharts = /** @class */function (_super) { 
 | 
  __extends(ECharts, _super); 
 | 
  function ECharts(dom, 
 | 
  // Theme name or themeOption. 
 | 
  theme, opts) { 
 | 
    var _this = _super.call(this, new ECEventProcessor()) || this; 
 | 
    _this._chartsViews = []; 
 | 
    _this._chartsMap = {}; 
 | 
    _this._componentsViews = []; 
 | 
    _this._componentsMap = {}; 
 | 
    // Can't dispatch action during rendering procedure 
 | 
    _this._pendingActions = []; 
 | 
    opts = opts || {}; 
 | 
    // Get theme by name 
 | 
    if (isString(theme)) { 
 | 
      theme = themeStorage[theme]; 
 | 
    } 
 | 
    _this._dom = dom; 
 | 
    var defaultRenderer = 'canvas'; 
 | 
    var defaultCoarsePointer = 'auto'; 
 | 
    var defaultUseDirtyRect = false; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      var root = /* eslint-disable-next-line */ 
 | 
      env.hasGlobalWindow ? window : global; 
 | 
      if (root) { 
 | 
        defaultRenderer = retrieve2(root.__ECHARTS__DEFAULT__RENDERER__, defaultRenderer); 
 | 
        defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer); 
 | 
        defaultUseDirtyRect = retrieve2(root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__, defaultUseDirtyRect); 
 | 
      } 
 | 
    } 
 | 
    if (opts.ssr) { 
 | 
      zrender.registerSSRDataGetter(function (el) { 
 | 
        var ecData = getECData(el); 
 | 
        var dataIndex = ecData.dataIndex; 
 | 
        if (dataIndex == null) { 
 | 
          return; 
 | 
        } 
 | 
        var hashMap = createHashMap(); 
 | 
        hashMap.set('series_index', ecData.seriesIndex); 
 | 
        hashMap.set('data_index', dataIndex); 
 | 
        ecData.ssrType && hashMap.set('ssr_type', ecData.ssrType); 
 | 
        return hashMap; 
 | 
      }); 
 | 
    } 
 | 
    var zr = _this._zr = zrender.init(dom, { 
 | 
      renderer: opts.renderer || defaultRenderer, 
 | 
      devicePixelRatio: opts.devicePixelRatio, 
 | 
      width: opts.width, 
 | 
      height: opts.height, 
 | 
      ssr: opts.ssr, 
 | 
      useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect), 
 | 
      useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer), 
 | 
      pointerSize: opts.pointerSize 
 | 
    }); 
 | 
    _this._ssr = opts.ssr; 
 | 
    // Expect 60 fps. 
 | 
    _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); 
 | 
    theme = clone(theme); 
 | 
    theme && backwardCompat(theme, true); 
 | 
    _this._theme = theme; 
 | 
    _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); 
 | 
    _this._coordSysMgr = new CoordinateSystemManager(); 
 | 
    var api = _this._api = createExtensionAPI(_this); 
 | 
    // Sort on demand 
 | 
    function prioritySortFunc(a, b) { 
 | 
      return a.__prio - b.__prio; 
 | 
    } 
 | 
    timsort(visualFuncs, prioritySortFunc); 
 | 
    timsort(dataProcessorFuncs, prioritySortFunc); 
 | 
    _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); 
 | 
    _this._messageCenter = new MessageCenter(); 
 | 
    // Init mouse events 
 | 
    _this._initEvents(); 
 | 
    // In case some people write `window.onresize = chart.resize` 
 | 
    _this.resize = bind(_this.resize, _this); 
 | 
    zr.animation.on('frame', _this._onframe, _this); 
 | 
    bindRenderedEvent(zr, _this); 
 | 
    bindMouseEvent(zr, _this); 
 | 
    // ECharts instance can be used as value. 
 | 
    setAsPrimitive(_this); 
 | 
    return _this; 
 | 
  } 
 | 
  ECharts.prototype._onframe = function () { 
 | 
    if (this._disposed) { 
 | 
      return; 
 | 
    } 
 | 
    applyChangedStates(this); 
 | 
    var scheduler = this._scheduler; 
 | 
    // Lazy update 
 | 
    if (this[PENDING_UPDATE]) { 
 | 
      var silent = this[PENDING_UPDATE].silent; 
 | 
      this[IN_MAIN_PROCESS_KEY] = true; 
 | 
      try { 
 | 
        prepare(this); 
 | 
        updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); 
 | 
      } catch (e) { 
 | 
        this[IN_MAIN_PROCESS_KEY] = false; 
 | 
        this[PENDING_UPDATE] = null; 
 | 
        throw e; 
 | 
      } 
 | 
      // At present, in each frame, zrender performs: 
 | 
      //   (1) animation step forward. 
 | 
      //   (2) trigger('frame') (where this `_onframe` is called) 
 | 
      //   (3) zrender flush (render). 
 | 
      // If we do nothing here, since we use `setToFinal: true`, the step (3) above 
 | 
      // will render the final state of the elements before the real animation started. 
 | 
      this._zr.flush(); 
 | 
      this[IN_MAIN_PROCESS_KEY] = false; 
 | 
      this[PENDING_UPDATE] = null; 
 | 
      flushPendingActions.call(this, silent); 
 | 
      triggerUpdatedEvent.call(this, silent); 
 | 
    } 
 | 
    // Avoid do both lazy update and progress in one frame. 
 | 
    else if (scheduler.unfinished) { 
 | 
      // Stream progress. 
 | 
      var remainTime = TEST_FRAME_REMAIN_TIME; 
 | 
      var ecModel = this._model; 
 | 
      var api = this._api; 
 | 
      scheduler.unfinished = false; 
 | 
      do { 
 | 
        var startTime = +new Date(); 
 | 
        scheduler.performSeriesTasks(ecModel); 
 | 
        // Currently dataProcessorFuncs do not check threshold. 
 | 
        scheduler.performDataProcessorTasks(ecModel); 
 | 
        updateStreamModes(this, ecModel); 
 | 
        // Do not update coordinate system here. Because that coord system update in 
 | 
        // each frame is not a good user experience. So we follow the rule that 
 | 
        // the extent of the coordinate system is determined in the first frame (the 
 | 
        // frame is executed immediately after task reset. 
 | 
        // this._coordSysMgr.update(ecModel, api); 
 | 
        // console.log('--- ec frame visual ---', remainTime); 
 | 
        scheduler.performVisualTasks(ecModel); 
 | 
        renderSeries(this, this._model, api, 'remain', {}); 
 | 
        remainTime -= +new Date() - startTime; 
 | 
      } while (remainTime > 0 && scheduler.unfinished); 
 | 
      // Call flush explicitly for trigger finished event. 
 | 
      if (!scheduler.unfinished) { 
 | 
        this._zr.flush(); 
 | 
      } 
 | 
      // Else, zr flushing be ensue within the same frame, 
 | 
      // because zr flushing is after onframe event. 
 | 
    } 
 | 
  }; 
 | 
  ECharts.prototype.getDom = function () { 
 | 
    return this._dom; 
 | 
  }; 
 | 
  ECharts.prototype.getId = function () { 
 | 
    return this.id; 
 | 
  }; 
 | 
  ECharts.prototype.getZr = function () { 
 | 
    return this._zr; 
 | 
  }; 
 | 
  ECharts.prototype.isSSR = function () { 
 | 
    return this._ssr; 
 | 
  }; 
 | 
  /* eslint-disable-next-line */ 
 | 
  ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) { 
 | 
    if (this[IN_MAIN_PROCESS_KEY]) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        error('`setOption` should not be called during main process.'); 
 | 
      } 
 | 
      return; 
 | 
    } 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    var silent; 
 | 
    var replaceMerge; 
 | 
    var transitionOpt; 
 | 
    if (isObject(notMerge)) { 
 | 
      lazyUpdate = notMerge.lazyUpdate; 
 | 
      silent = notMerge.silent; 
 | 
      replaceMerge = notMerge.replaceMerge; 
 | 
      transitionOpt = notMerge.transition; 
 | 
      notMerge = notMerge.notMerge; 
 | 
    } 
 | 
    this[IN_MAIN_PROCESS_KEY] = true; 
 | 
    if (!this._model || notMerge) { 
 | 
      var optionManager = new OptionManager(this._api); 
 | 
      var theme = this._theme; 
 | 
      var ecModel = this._model = new GlobalModel(); 
 | 
      ecModel.scheduler = this._scheduler; 
 | 
      ecModel.ssr = this._ssr; 
 | 
      ecModel.init(null, null, null, theme, this._locale, optionManager); 
 | 
    } 
 | 
    this._model.setOption(option, { 
 | 
      replaceMerge: replaceMerge 
 | 
    }, optionPreprocessorFuncs); 
 | 
    var updateParams = { 
 | 
      seriesTransition: transitionOpt, 
 | 
      optionChanged: true 
 | 
    }; 
 | 
    if (lazyUpdate) { 
 | 
      this[PENDING_UPDATE] = { 
 | 
        silent: silent, 
 | 
        updateParams: updateParams 
 | 
      }; 
 | 
      this[IN_MAIN_PROCESS_KEY] = false; 
 | 
      // `setOption(option, {lazyMode: true})` may be called when zrender has been slept. 
 | 
      // It should wake it up to make sure zrender start to render at the next frame. 
 | 
      this.getZr().wakeUp(); 
 | 
    } else { 
 | 
      try { 
 | 
        prepare(this); 
 | 
        updateMethods.update.call(this, null, updateParams); 
 | 
      } catch (e) { 
 | 
        this[PENDING_UPDATE] = null; 
 | 
        this[IN_MAIN_PROCESS_KEY] = false; 
 | 
        throw e; 
 | 
      } 
 | 
      // Ensure zr refresh sychronously, and then pixel in canvas can be 
 | 
      // fetched after `setOption`. 
 | 
      if (!this._ssr) { 
 | 
        // not use flush when using ssr mode. 
 | 
        this._zr.flush(); 
 | 
      } 
 | 
      this[PENDING_UPDATE] = null; 
 | 
      this[IN_MAIN_PROCESS_KEY] = false; 
 | 
      flushPendingActions.call(this, silent); 
 | 
      triggerUpdatedEvent.call(this, silent); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @deprecated 
 | 
   */ 
 | 
  ECharts.prototype.setTheme = function () { 
 | 
    deprecateLog('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); 
 | 
  }; 
 | 
  // We don't want developers to use getModel directly. 
 | 
  ECharts.prototype.getModel = function () { 
 | 
    return this._model; 
 | 
  }; 
 | 
  ECharts.prototype.getOption = function () { 
 | 
    return this._model && this._model.getOption(); 
 | 
  }; 
 | 
  ECharts.prototype.getWidth = function () { 
 | 
    return this._zr.getWidth(); 
 | 
  }; 
 | 
  ECharts.prototype.getHeight = function () { 
 | 
    return this._zr.getHeight(); 
 | 
  }; 
 | 
  ECharts.prototype.getDevicePixelRatio = function () { 
 | 
    return this._zr.painter.dpr 
 | 
    /* eslint-disable-next-line */ || env.hasGlobalWindow && window.devicePixelRatio || 1; 
 | 
  }; 
 | 
  /** 
 | 
   * Get canvas which has all thing rendered 
 | 
   * @deprecated Use renderToCanvas instead. 
 | 
   */ 
 | 
  ECharts.prototype.getRenderedCanvas = function (opts) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas'); 
 | 
    } 
 | 
    return this.renderToCanvas(opts); 
 | 
  }; 
 | 
  ECharts.prototype.renderToCanvas = function (opts) { 
 | 
    opts = opts || {}; 
 | 
    var painter = this._zr.painter; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (painter.type !== 'canvas') { 
 | 
        throw new Error('renderToCanvas can only be used in the canvas renderer.'); 
 | 
      } 
 | 
    } 
 | 
    return painter.getRenderedCanvas({ 
 | 
      backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'), 
 | 
      pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() 
 | 
    }); 
 | 
  }; 
 | 
  ECharts.prototype.renderToSVGString = function (opts) { 
 | 
    opts = opts || {}; 
 | 
    var painter = this._zr.painter; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (painter.type !== 'svg') { 
 | 
        throw new Error('renderToSVGString can only be used in the svg renderer.'); 
 | 
      } 
 | 
    } 
 | 
    return painter.renderToString({ 
 | 
      useViewBox: opts.useViewBox 
 | 
    }); 
 | 
  }; 
 | 
  /** 
 | 
   * Get svg data url 
 | 
   */ 
 | 
  ECharts.prototype.getSvgDataURL = function () { 
 | 
    if (!env.svgSupported) { 
 | 
      return; 
 | 
    } 
 | 
    var zr = this._zr; 
 | 
    var list = zr.storage.getDisplayList(); 
 | 
    // Stop animations 
 | 
    each(list, function (el) { 
 | 
      el.stopAnimation(null, true); 
 | 
    }); 
 | 
    return zr.painter.toDataURL(); 
 | 
  }; 
 | 
  ECharts.prototype.getDataURL = function (opts) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    opts = opts || {}; 
 | 
    var excludeComponents = opts.excludeComponents; 
 | 
    var ecModel = this._model; 
 | 
    var excludesComponentViews = []; 
 | 
    var self = this; 
 | 
    each(excludeComponents, function (componentType) { 
 | 
      ecModel.eachComponent({ 
 | 
        mainType: componentType 
 | 
      }, function (component) { 
 | 
        var view = self._componentsMap[component.__viewId]; 
 | 
        if (!view.group.ignore) { 
 | 
          excludesComponentViews.push(view); 
 | 
          view.group.ignore = true; 
 | 
        } 
 | 
      }); 
 | 
    }); 
 | 
    var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png')); 
 | 
    each(excludesComponentViews, function (view) { 
 | 
      view.group.ignore = false; 
 | 
    }); 
 | 
    return url; 
 | 
  }; 
 | 
  ECharts.prototype.getConnectedDataURL = function (opts) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    var isSvg = opts.type === 'svg'; 
 | 
    var groupId = this.group; 
 | 
    var mathMin = Math.min; 
 | 
    var mathMax = Math.max; 
 | 
    var MAX_NUMBER = Infinity; 
 | 
    if (connectedGroups[groupId]) { 
 | 
      var left_1 = MAX_NUMBER; 
 | 
      var top_1 = MAX_NUMBER; 
 | 
      var right_1 = -MAX_NUMBER; 
 | 
      var bottom_1 = -MAX_NUMBER; 
 | 
      var canvasList_1 = []; 
 | 
      var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); 
 | 
      each(instances, function (chart, id) { 
 | 
        if (chart.group === groupId) { 
 | 
          var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts)); 
 | 
          var boundingRect = chart.getDom().getBoundingClientRect(); 
 | 
          left_1 = mathMin(boundingRect.left, left_1); 
 | 
          top_1 = mathMin(boundingRect.top, top_1); 
 | 
          right_1 = mathMax(boundingRect.right, right_1); 
 | 
          bottom_1 = mathMax(boundingRect.bottom, bottom_1); 
 | 
          canvasList_1.push({ 
 | 
            dom: canvas, 
 | 
            left: boundingRect.left, 
 | 
            top: boundingRect.top 
 | 
          }); 
 | 
        } 
 | 
      }); 
 | 
      left_1 *= dpr_1; 
 | 
      top_1 *= dpr_1; 
 | 
      right_1 *= dpr_1; 
 | 
      bottom_1 *= dpr_1; 
 | 
      var width = right_1 - left_1; 
 | 
      var height = bottom_1 - top_1; 
 | 
      var targetCanvas = platformApi.createCanvas(); 
 | 
      var zr_1 = zrender.init(targetCanvas, { 
 | 
        renderer: isSvg ? 'svg' : 'canvas' 
 | 
      }); 
 | 
      zr_1.resize({ 
 | 
        width: width, 
 | 
        height: height 
 | 
      }); 
 | 
      if (isSvg) { 
 | 
        var content_1 = ''; 
 | 
        each(canvasList_1, function (item) { 
 | 
          var x = item.left - left_1; 
 | 
          var y = item.top - top_1; 
 | 
          content_1 += '<g transform="translate(' + x + ',' + y + ')">' + item.dom + '</g>'; 
 | 
        }); 
 | 
        zr_1.painter.getSvgRoot().innerHTML = content_1; 
 | 
        if (opts.connectedBackgroundColor) { 
 | 
          zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); 
 | 
        } 
 | 
        zr_1.refreshImmediately(); 
 | 
        return zr_1.painter.toDataURL(); 
 | 
      } else { 
 | 
        // Background between the charts 
 | 
        if (opts.connectedBackgroundColor) { 
 | 
          zr_1.add(new graphic.Rect({ 
 | 
            shape: { 
 | 
              x: 0, 
 | 
              y: 0, 
 | 
              width: width, 
 | 
              height: height 
 | 
            }, 
 | 
            style: { 
 | 
              fill: opts.connectedBackgroundColor 
 | 
            } 
 | 
          })); 
 | 
        } 
 | 
        each(canvasList_1, function (item) { 
 | 
          var img = new graphic.Image({ 
 | 
            style: { 
 | 
              x: item.left * dpr_1 - left_1, 
 | 
              y: item.top * dpr_1 - top_1, 
 | 
              image: item.dom 
 | 
            } 
 | 
          }); 
 | 
          zr_1.add(img); 
 | 
        }); 
 | 
        zr_1.refreshImmediately(); 
 | 
        return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); 
 | 
      } 
 | 
    } else { 
 | 
      return this.getDataURL(opts); 
 | 
    } 
 | 
  }; 
 | 
  ECharts.prototype.convertToPixel = function (finder, value) { 
 | 
    return doConvertPixel(this, 'convertToPixel', finder, value); 
 | 
  }; 
 | 
  ECharts.prototype.convertFromPixel = function (finder, value) { 
 | 
    return doConvertPixel(this, 'convertFromPixel', finder, value); 
 | 
  }; 
 | 
  /** 
 | 
   * Is the specified coordinate systems or components contain the given pixel point. 
 | 
   * @param {Array|number} value 
 | 
   * @return {boolean} result 
 | 
   */ 
 | 
  ECharts.prototype.containPixel = function (finder, value) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    var ecModel = this._model; 
 | 
    var result; 
 | 
    var findResult = modelUtil.parseFinder(ecModel, finder); 
 | 
    each(findResult, function (models, key) { 
 | 
      key.indexOf('Models') >= 0 && each(models, function (model) { 
 | 
        var coordSys = model.coordinateSystem; 
 | 
        if (coordSys && coordSys.containPoint) { 
 | 
          result = result || !!coordSys.containPoint(value); 
 | 
        } else if (key === 'seriesModels') { 
 | 
          var view = this._chartsMap[model.__viewId]; 
 | 
          if (view && view.containPoint) { 
 | 
            result = result || view.containPoint(value, model); 
 | 
          } else { 
 | 
            if (process.env.NODE_ENV !== 'production') { 
 | 
              warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.')); 
 | 
            } 
 | 
          } 
 | 
        } else { 
 | 
          if (process.env.NODE_ENV !== 'production') { 
 | 
            warn(key + ': containPoint is not supported'); 
 | 
          } 
 | 
        } 
 | 
      }, this); 
 | 
    }, this); 
 | 
    return !!result; 
 | 
  }; 
 | 
  /** 
 | 
   * Get visual from series or data. 
 | 
   * @param finder 
 | 
   *        If string, e.g., 'series', means {seriesIndex: 0}. 
 | 
   *        If Object, could contain some of these properties below: 
 | 
   *        { 
 | 
   *            seriesIndex / seriesId / seriesName, 
 | 
   *            dataIndex / dataIndexInside 
 | 
   *        } 
 | 
   *        If dataIndex is not specified, series visual will be fetched, 
 | 
   *        but not data item visual. 
 | 
   *        If all of seriesIndex, seriesId, seriesName are not specified, 
 | 
   *        visual will be fetched from first series. 
 | 
   * @param visualType 'color', 'symbol', 'symbolSize' 
 | 
   */ 
 | 
  ECharts.prototype.getVisual = function (finder, visualType) { 
 | 
    var ecModel = this._model; 
 | 
    var parsedFinder = modelUtil.parseFinder(ecModel, finder, { 
 | 
      defaultMainType: 'series' 
 | 
    }); 
 | 
    var seriesModel = parsedFinder.seriesModel; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (!seriesModel) { 
 | 
        warn('There is no specified series model'); 
 | 
      } 
 | 
    } 
 | 
    var data = seriesModel.getData(); 
 | 
    var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; 
 | 
    return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); 
 | 
  }; 
 | 
  /** 
 | 
   * Get view of corresponding component model 
 | 
   */ 
 | 
  ECharts.prototype.getViewOfComponentModel = function (componentModel) { 
 | 
    return this._componentsMap[componentModel.__viewId]; 
 | 
  }; 
 | 
  /** 
 | 
   * Get view of corresponding series model 
 | 
   */ 
 | 
  ECharts.prototype.getViewOfSeriesModel = function (seriesModel) { 
 | 
    return this._chartsMap[seriesModel.__viewId]; 
 | 
  }; 
 | 
  ECharts.prototype._initEvents = function () { 
 | 
    var _this = this; 
 | 
    each(MOUSE_EVENT_NAMES, function (eveName) { 
 | 
      var handler = function (e) { 
 | 
        var ecModel = _this.getModel(); 
 | 
        var el = e.target; 
 | 
        var params; 
 | 
        var isGlobalOut = eveName === 'globalout'; 
 | 
        // no e.target when 'globalout'. 
 | 
        if (isGlobalOut) { 
 | 
          params = {}; 
 | 
        } else { 
 | 
          el && findEventDispatcher(el, function (parent) { 
 | 
            var ecData = getECData(parent); 
 | 
            if (ecData && ecData.dataIndex != null) { 
 | 
              var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); 
 | 
              params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType, el) || {}; 
 | 
              return true; 
 | 
            } 
 | 
            // If element has custom eventData of components 
 | 
            else if (ecData.eventData) { 
 | 
              params = extend({}, ecData.eventData); 
 | 
              return true; 
 | 
            } 
 | 
          }, true); 
 | 
        } 
 | 
        // Contract: if params prepared in mouse event, 
 | 
        // these properties must be specified: 
 | 
        // { 
 | 
        //    componentType: string (component main type) 
 | 
        //    componentIndex: number 
 | 
        // } 
 | 
        // Otherwise event query can not work. 
 | 
        if (params) { 
 | 
          var componentType = params.componentType; 
 | 
          var componentIndex = params.componentIndex; 
 | 
          // Special handling for historic reason: when trigger by 
 | 
          // markLine/markPoint/markArea, the componentType is 
 | 
          // 'markLine'/'markPoint'/'markArea', but we should better 
 | 
          // enable them to be queried by seriesIndex, since their 
 | 
          // option is set in each series. 
 | 
          if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') { 
 | 
            componentType = 'series'; 
 | 
            componentIndex = params.seriesIndex; 
 | 
          } 
 | 
          var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); 
 | 
          var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]; 
 | 
          if (process.env.NODE_ENV !== 'production') { 
 | 
            // `event.componentType` and `event[componentTpype + 'Index']` must not 
 | 
            // be missed, otherwise there is no way to distinguish source component. 
 | 
            // See `dataFormat.getDataParams`. 
 | 
            if (!isGlobalOut && !(model && view)) { 
 | 
              warn('model or view can not be found by params'); 
 | 
            } 
 | 
          } 
 | 
          params.event = e; 
 | 
          params.type = eveName; 
 | 
          _this._$eventProcessor.eventInfo = { 
 | 
            targetEl: el, 
 | 
            packedEvent: params, 
 | 
            model: model, 
 | 
            view: view 
 | 
          }; 
 | 
          _this.trigger(eveName, params); 
 | 
        } 
 | 
      }; 
 | 
      // Consider that some component (like tooltip, brush, ...) 
 | 
      // register zr event handler, but user event handler might 
 | 
      // do anything, such as call `setOption` or `dispatchAction`, 
 | 
      // which probably update any of the content and probably 
 | 
      // cause problem if it is called previous other inner handlers. 
 | 
      handler.zrEventfulCallAtLast = true; 
 | 
      _this._zr.on(eveName, handler, _this); 
 | 
    }); 
 | 
    each(eventActionMap, function (actionType, eventType) { 
 | 
      _this._messageCenter.on(eventType, function (event) { 
 | 
        this.trigger(eventType, event); 
 | 
      }, _this); 
 | 
    }); 
 | 
    // Extra events 
 | 
    // TODO register? 
 | 
    each(['selectchanged'], function (eventType) { 
 | 
      _this._messageCenter.on(eventType, function (event) { 
 | 
        this.trigger(eventType, event); 
 | 
      }, _this); 
 | 
    }); 
 | 
    handleLegacySelectEvents(this._messageCenter, this, this._api); 
 | 
  }; 
 | 
  ECharts.prototype.isDisposed = function () { 
 | 
    return this._disposed; 
 | 
  }; 
 | 
  ECharts.prototype.clear = function () { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    this.setOption({ 
 | 
      series: [] 
 | 
    }, true); 
 | 
  }; 
 | 
  ECharts.prototype.dispose = function () { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    this._disposed = true; 
 | 
    var dom = this.getDom(); 
 | 
    if (dom) { 
 | 
      modelUtil.setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ''); 
 | 
    } 
 | 
    var chart = this; 
 | 
    var api = chart._api; 
 | 
    var ecModel = chart._model; 
 | 
    each(chart._componentsViews, function (component) { 
 | 
      component.dispose(ecModel, api); 
 | 
    }); 
 | 
    each(chart._chartsViews, function (chart) { 
 | 
      chart.dispose(ecModel, api); 
 | 
    }); 
 | 
    // Dispose after all views disposed 
 | 
    chart._zr.dispose(); 
 | 
    // Set properties to null. 
 | 
    // To reduce the memory cost in case the top code still holds this instance unexpectedly. 
 | 
    chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; 
 | 
    delete instances[chart.id]; 
 | 
  }; 
 | 
  /** 
 | 
   * Resize the chart 
 | 
   */ 
 | 
  ECharts.prototype.resize = function (opts) { 
 | 
    if (this[IN_MAIN_PROCESS_KEY]) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        error('`resize` should not be called during main process.'); 
 | 
      } 
 | 
      return; 
 | 
    } 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    this._zr.resize(opts); 
 | 
    var ecModel = this._model; 
 | 
    // Resize loading effect 
 | 
    this._loadingFX && this._loadingFX.resize(); 
 | 
    if (!ecModel) { 
 | 
      return; 
 | 
    } 
 | 
    var needPrepare = ecModel.resetOption('media'); 
 | 
    var silent = opts && opts.silent; 
 | 
    // There is some real cases that: 
 | 
    // chart.setOption(option, { lazyUpdate: true }); 
 | 
    // chart.resize(); 
 | 
    if (this[PENDING_UPDATE]) { 
 | 
      if (silent == null) { 
 | 
        silent = this[PENDING_UPDATE].silent; 
 | 
      } 
 | 
      needPrepare = true; 
 | 
      this[PENDING_UPDATE] = null; 
 | 
    } 
 | 
    this[IN_MAIN_PROCESS_KEY] = true; 
 | 
    try { 
 | 
      needPrepare && prepare(this); 
 | 
      updateMethods.update.call(this, { 
 | 
        type: 'resize', 
 | 
        animation: extend({ 
 | 
          // Disable animation 
 | 
          duration: 0 
 | 
        }, opts && opts.animation) 
 | 
      }); 
 | 
    } catch (e) { 
 | 
      this[IN_MAIN_PROCESS_KEY] = false; 
 | 
      throw e; 
 | 
    } 
 | 
    this[IN_MAIN_PROCESS_KEY] = false; 
 | 
    flushPendingActions.call(this, silent); 
 | 
    triggerUpdatedEvent.call(this, silent); 
 | 
  }; 
 | 
  ECharts.prototype.showLoading = function (name, cfg) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    if (isObject(name)) { 
 | 
      cfg = name; 
 | 
      name = ''; 
 | 
    } 
 | 
    name = name || 'default'; 
 | 
    this.hideLoading(); 
 | 
    if (!loadingEffects[name]) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        warn('Loading effects ' + name + ' not exists.'); 
 | 
      } 
 | 
      return; 
 | 
    } 
 | 
    var el = loadingEffects[name](this._api, cfg); 
 | 
    var zr = this._zr; 
 | 
    this._loadingFX = el; 
 | 
    zr.add(el); 
 | 
  }; 
 | 
  /** 
 | 
   * Hide loading effect 
 | 
   */ 
 | 
  ECharts.prototype.hideLoading = function () { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    this._loadingFX && this._zr.remove(this._loadingFX); 
 | 
    this._loadingFX = null; 
 | 
  }; 
 | 
  ECharts.prototype.makeActionFromEvent = function (eventObj) { 
 | 
    var payload = extend({}, eventObj); 
 | 
    payload.type = eventActionMap[eventObj.type]; 
 | 
    return payload; 
 | 
  }; 
 | 
  /** 
 | 
   * @param opt If pass boolean, means opt.silent 
 | 
   * @param opt.silent Default `false`. Whether trigger events. 
 | 
   * @param opt.flush Default `undefined`. 
 | 
   *        true: Flush immediately, and then pixel in canvas can be fetched 
 | 
   *            immediately. Caution: it might affect performance. 
 | 
   *        false: Not flush. 
 | 
   *        undefined: Auto decide whether perform flush. 
 | 
   */ 
 | 
  ECharts.prototype.dispatchAction = function (payload, opt) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    if (!isObject(opt)) { 
 | 
      opt = { 
 | 
        silent: !!opt 
 | 
      }; 
 | 
    } 
 | 
    if (!actions[payload.type]) { 
 | 
      return; 
 | 
    } 
 | 
    // Avoid dispatch action before setOption. Especially in `connect`. 
 | 
    if (!this._model) { 
 | 
      return; 
 | 
    } 
 | 
    // May dispatchAction in rendering procedure 
 | 
    if (this[IN_MAIN_PROCESS_KEY]) { 
 | 
      this._pendingActions.push(payload); 
 | 
      return; 
 | 
    } 
 | 
    var silent = opt.silent; 
 | 
    doDispatchAction.call(this, payload, silent); 
 | 
    var flush = opt.flush; 
 | 
    if (flush) { 
 | 
      this._zr.flush(); 
 | 
    } else if (flush !== false && env.browser.weChat) { 
 | 
      // In WeChat embedded browser, `requestAnimationFrame` and `setInterval` 
 | 
      // hang when sliding page (on touch event), which cause that zr does not 
 | 
      // refresh until user interaction finished, which is not expected. 
 | 
      // But `dispatchAction` may be called too frequently when pan on touch 
 | 
      // screen, which impacts performance if do not throttle them. 
 | 
      this._throttledZrFlush(); 
 | 
    } 
 | 
    flushPendingActions.call(this, silent); 
 | 
    triggerUpdatedEvent.call(this, silent); 
 | 
  }; 
 | 
  ECharts.prototype.updateLabelLayout = function () { 
 | 
    lifecycle.trigger('series:layoutlabels', this._model, this._api, { 
 | 
      // Not adding series labels. 
 | 
      // TODO 
 | 
      updatedSeries: [] 
 | 
    }); 
 | 
  }; 
 | 
  ECharts.prototype.appendData = function (params) { 
 | 
    if (this._disposed) { 
 | 
      disposedWarning(this.id); 
 | 
      return; 
 | 
    } 
 | 
    var seriesIndex = params.seriesIndex; 
 | 
    var ecModel = this.getModel(); 
 | 
    var seriesModel = ecModel.getSeriesByIndex(seriesIndex); 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      assert(params.data && seriesModel); 
 | 
    } 
 | 
    seriesModel.appendData(params); 
 | 
    // Note: `appendData` does not support that update extent of coordinate 
 | 
    // system, util some scenario require that. In the expected usage of 
 | 
    // `appendData`, the initial extent of coordinate system should better 
 | 
    // be fixed by axis `min`/`max` setting or initial data, otherwise if 
 | 
    // the extent changed while `appendData`, the location of the painted 
 | 
    // graphic elements have to be changed, which make the usage of 
 | 
    // `appendData` meaningless. 
 | 
    this._scheduler.unfinished = true; 
 | 
    this.getZr().wakeUp(); 
 | 
  }; 
 | 
  // A work around for no `internal` modifier in ts yet but 
 | 
  // need to strictly hide private methods to JS users. 
 | 
  ECharts.internalField = function () { 
 | 
    prepare = function (ecIns) { 
 | 
      var scheduler = ecIns._scheduler; 
 | 
      scheduler.restorePipelines(ecIns._model); 
 | 
      scheduler.prepareStageTasks(); 
 | 
      prepareView(ecIns, true); 
 | 
      prepareView(ecIns, false); 
 | 
      scheduler.plan(); 
 | 
    }; 
 | 
    /** 
 | 
     * Prepare view instances of charts and components 
 | 
     */ 
 | 
    prepareView = function (ecIns, isComponent) { 
 | 
      var ecModel = ecIns._model; 
 | 
      var scheduler = ecIns._scheduler; 
 | 
      var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; 
 | 
      var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; 
 | 
      var zr = ecIns._zr; 
 | 
      var api = ecIns._api; 
 | 
      for (var i = 0; i < viewList.length; i++) { 
 | 
        viewList[i].__alive = false; 
 | 
      } 
 | 
      isComponent ? ecModel.eachComponent(function (componentType, model) { 
 | 
        componentType !== 'series' && doPrepare(model); 
 | 
      }) : ecModel.eachSeries(doPrepare); 
 | 
      function doPrepare(model) { 
 | 
        // By default view will be reused if possible for the case that `setOption` with "notMerge" 
 | 
        // mode and need to enable transition animation. (Usually, when they have the same id, or 
 | 
        // especially no id but have the same type & name & index. See the `model.id` generation 
 | 
        // rule in `makeIdAndName` and `viewId` generation rule here). 
 | 
        // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that 
 | 
        // the new model has nothing to do with the old model. 
 | 
        var requireNewView = model.__requireNewView; 
 | 
        // This command should not work twice. 
 | 
        model.__requireNewView = false; 
 | 
        // Consider: id same and type changed. 
 | 
        var viewId = '_ec_' + model.id + '_' + model.type; 
 | 
        var view = !requireNewView && viewMap[viewId]; 
 | 
        if (!view) { 
 | 
          var classType = parseClassType(model.type); 
 | 
          var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : 
 | 
          // FIXME:TS 
 | 
          // (ChartView as ChartViewConstructor).getClass('series', classType.sub) 
 | 
          // For backward compat, still support a chart type declared as only subType 
 | 
          // like "liquidfill", but recommend "series.liquidfill" 
 | 
          // But need a base class to make a type series. 
 | 
          ChartView.getClass(classType.sub); 
 | 
          if (process.env.NODE_ENV !== 'production') { 
 | 
            assert(Clazz, classType.sub + ' does not exist.'); 
 | 
          } 
 | 
          view = new Clazz(); 
 | 
          view.init(ecModel, api); 
 | 
          viewMap[viewId] = view; 
 | 
          viewList.push(view); 
 | 
          zr.add(view.group); 
 | 
        } 
 | 
        model.__viewId = view.__id = viewId; 
 | 
        view.__alive = true; 
 | 
        view.__model = model; 
 | 
        view.group.__ecComponentInfo = { 
 | 
          mainType: model.mainType, 
 | 
          index: model.componentIndex 
 | 
        }; 
 | 
        !isComponent && scheduler.prepareView(view, model, ecModel, api); 
 | 
      } 
 | 
      for (var i = 0; i < viewList.length;) { 
 | 
        var view = viewList[i]; 
 | 
        if (!view.__alive) { 
 | 
          !isComponent && view.renderTask.dispose(); 
 | 
          zr.remove(view.group); 
 | 
          view.dispose(ecModel, api); 
 | 
          viewList.splice(i, 1); 
 | 
          if (viewMap[view.__id] === view) { 
 | 
            delete viewMap[view.__id]; 
 | 
          } 
 | 
          view.__id = view.group.__ecComponentInfo = null; 
 | 
        } else { 
 | 
          i++; 
 | 
        } 
 | 
      } 
 | 
    }; 
 | 
    updateDirectly = function (ecIns, method, payload, mainType, subType) { 
 | 
      var ecModel = ecIns._model; 
 | 
      ecModel.setUpdatePayload(payload); 
 | 
      // broadcast 
 | 
      if (!mainType) { 
 | 
        // FIXME 
 | 
        // Chart will not be update directly here, except set dirty. 
 | 
        // But there is no such scenario now. 
 | 
        each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); 
 | 
        return; 
 | 
      } 
 | 
      var query = {}; 
 | 
      query[mainType + 'Id'] = payload[mainType + 'Id']; 
 | 
      query[mainType + 'Index'] = payload[mainType + 'Index']; 
 | 
      query[mainType + 'Name'] = payload[mainType + 'Name']; 
 | 
      var condition = { 
 | 
        mainType: mainType, 
 | 
        query: query 
 | 
      }; 
 | 
      subType && (condition.subType = subType); // subType may be '' by parseClassType; 
 | 
      var excludeSeriesId = payload.excludeSeriesId; 
 | 
      var excludeSeriesIdMap; 
 | 
      if (excludeSeriesId != null) { 
 | 
        excludeSeriesIdMap = createHashMap(); 
 | 
        each(modelUtil.normalizeToArray(excludeSeriesId), function (id) { 
 | 
          var modelId = modelUtil.convertOptionIdName(id, null); 
 | 
          if (modelId != null) { 
 | 
            excludeSeriesIdMap.set(modelId, true); 
 | 
          } 
 | 
        }); 
 | 
      } 
 | 
      // If dispatchAction before setOption, do nothing. 
 | 
      ecModel && ecModel.eachComponent(condition, function (model) { 
 | 
        var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; 
 | 
        if (isExcluded) { 
 | 
          return; 
 | 
        } 
 | 
        ; 
 | 
        if (isHighDownPayload(payload)) { 
 | 
          if (model instanceof SeriesModel) { 
 | 
            if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(['emphasis', 'disabled'])) { 
 | 
              blurSeriesFromHighlightPayload(model, payload, ecIns._api); 
 | 
            } 
 | 
          } else { 
 | 
            var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), 
 | 
              focusSelf = _a.focusSelf, 
 | 
              dispatchers = _a.dispatchers; 
 | 
            if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { 
 | 
              blurComponent(model.mainType, model.componentIndex, ecIns._api); 
 | 
            } 
 | 
            // PENDING: 
 | 
            // Whether to put this "enter emphasis" code in `ComponentView`, 
 | 
            // which will be the same as `ChartView` but might be not necessary 
 | 
            // and will be far from this logic. 
 | 
            if (dispatchers) { 
 | 
              each(dispatchers, function (dispatcher) { 
 | 
                payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); 
 | 
              }); 
 | 
            } 
 | 
          } 
 | 
        } else if (isSelectChangePayload(payload)) { 
 | 
          // TODO geo 
 | 
          if (model instanceof SeriesModel) { 
 | 
            toggleSelectionFromPayload(model, payload, ecIns._api); 
 | 
            updateSeriesElementSelection(model); 
 | 
            markStatusToUpdate(ecIns); 
 | 
          } 
 | 
        } 
 | 
      }, ecIns); 
 | 
      ecModel && ecModel.eachComponent(condition, function (model) { 
 | 
        var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; 
 | 
        if (isExcluded) { 
 | 
          return; 
 | 
        } 
 | 
        ; 
 | 
        callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]); 
 | 
      }, ecIns); 
 | 
      function callView(view) { 
 | 
        view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); 
 | 
      } 
 | 
    }; 
 | 
    updateMethods = { 
 | 
      prepareAndUpdate: function (payload) { 
 | 
        prepare(this); 
 | 
        updateMethods.update.call(this, payload, { 
 | 
          // Needs to mark option changed if newOption is given. 
 | 
          // It's from MagicType. 
 | 
          // TODO If use a separate flag optionChanged in payload? 
 | 
          optionChanged: payload.newOption != null 
 | 
        }); 
 | 
      }, 
 | 
      update: function (payload, updateParams) { 
 | 
        var ecModel = this._model; 
 | 
        var api = this._api; 
 | 
        var zr = this._zr; 
 | 
        var coordSysMgr = this._coordSysMgr; 
 | 
        var scheduler = this._scheduler; 
 | 
        // update before setOption 
 | 
        if (!ecModel) { 
 | 
          return; 
 | 
        } 
 | 
        ecModel.setUpdatePayload(payload); 
 | 
        scheduler.restoreData(ecModel, payload); 
 | 
        scheduler.performSeriesTasks(ecModel); 
 | 
        // TODO 
 | 
        // Save total ecModel here for undo/redo (after restoring data and before processing data). 
 | 
        // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. 
 | 
        // Create new coordinate system each update 
 | 
        // In LineView may save the old coordinate system and use it to get the original point. 
 | 
        coordSysMgr.create(ecModel, api); 
 | 
        scheduler.performDataProcessorTasks(ecModel, payload); 
 | 
        // Current stream render is not supported in data process. So we can update 
 | 
        // stream modes after data processing, where the filtered data is used to 
 | 
        // determine whether to use progressive rendering. 
 | 
        updateStreamModes(this, ecModel); 
 | 
        // We update stream modes before coordinate system updated, then the modes info 
 | 
        // can be fetched when coord sys updating (consider the barGrid extent fix). But 
 | 
        // the drawback is the full coord info can not be fetched. Fortunately this full 
 | 
        // coord is not required in stream mode updater currently. 
 | 
        coordSysMgr.update(ecModel, api); 
 | 
        clearColorPalette(ecModel); 
 | 
        scheduler.performVisualTasks(ecModel, payload); 
 | 
        render(this, ecModel, api, payload, updateParams); 
 | 
        // Set background 
 | 
        var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; 
 | 
        var darkMode = ecModel.get('darkMode'); 
 | 
        zr.setBackgroundColor(backgroundColor); 
 | 
        // Force set dark mode. 
 | 
        if (darkMode != null && darkMode !== 'auto') { 
 | 
          zr.setDarkMode(darkMode); 
 | 
        } 
 | 
        lifecycle.trigger('afterupdate', ecModel, api); 
 | 
      }, 
 | 
      updateTransform: function (payload) { 
 | 
        var _this = this; 
 | 
        var ecModel = this._model; 
 | 
        var api = this._api; 
 | 
        // update before setOption 
 | 
        if (!ecModel) { 
 | 
          return; 
 | 
        } 
 | 
        ecModel.setUpdatePayload(payload); 
 | 
        // ChartView.markUpdateMethod(payload, 'updateTransform'); 
 | 
        var componentDirtyList = []; 
 | 
        ecModel.eachComponent(function (componentType, componentModel) { 
 | 
          if (componentType === 'series') { 
 | 
            return; 
 | 
          } 
 | 
          var componentView = _this.getViewOfComponentModel(componentModel); 
 | 
          if (componentView && componentView.__alive) { 
 | 
            if (componentView.updateTransform) { 
 | 
              var result = componentView.updateTransform(componentModel, ecModel, api, payload); 
 | 
              result && result.update && componentDirtyList.push(componentView); 
 | 
            } else { 
 | 
              componentDirtyList.push(componentView); 
 | 
            } 
 | 
          } 
 | 
        }); 
 | 
        var seriesDirtyMap = createHashMap(); 
 | 
        ecModel.eachSeries(function (seriesModel) { 
 | 
          var chartView = _this._chartsMap[seriesModel.__viewId]; 
 | 
          if (chartView.updateTransform) { 
 | 
            var result = chartView.updateTransform(seriesModel, ecModel, api, payload); 
 | 
            result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); 
 | 
          } else { 
 | 
            seriesDirtyMap.set(seriesModel.uid, 1); 
 | 
          } 
 | 
        }); 
 | 
        clearColorPalette(ecModel); 
 | 
        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. 
 | 
        // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); 
 | 
        this._scheduler.performVisualTasks(ecModel, payload, { 
 | 
          setDirty: true, 
 | 
          dirtyMap: seriesDirtyMap 
 | 
        }); 
 | 
        // Currently, not call render of components. Geo render cost a lot. 
 | 
        // renderComponents(ecIns, ecModel, api, payload, componentDirtyList); 
 | 
        renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); 
 | 
        lifecycle.trigger('afterupdate', ecModel, api); 
 | 
      }, 
 | 
      updateView: function (payload) { 
 | 
        var ecModel = this._model; 
 | 
        // update before setOption 
 | 
        if (!ecModel) { 
 | 
          return; 
 | 
        } 
 | 
        ecModel.setUpdatePayload(payload); 
 | 
        ChartView.markUpdateMethod(payload, 'updateView'); 
 | 
        clearColorPalette(ecModel); 
 | 
        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. 
 | 
        this._scheduler.performVisualTasks(ecModel, payload, { 
 | 
          setDirty: true 
 | 
        }); 
 | 
        render(this, ecModel, this._api, payload, {}); 
 | 
        lifecycle.trigger('afterupdate', ecModel, this._api); 
 | 
      }, 
 | 
      updateVisual: function (payload) { 
 | 
        // updateMethods.update.call(this, payload); 
 | 
        var _this = this; 
 | 
        var ecModel = this._model; 
 | 
        // update before setOption 
 | 
        if (!ecModel) { 
 | 
          return; 
 | 
        } 
 | 
        ecModel.setUpdatePayload(payload); 
 | 
        // clear all visual 
 | 
        ecModel.eachSeries(function (seriesModel) { 
 | 
          seriesModel.getData().clearAllVisual(); 
 | 
        }); 
 | 
        // Perform visual 
 | 
        ChartView.markUpdateMethod(payload, 'updateVisual'); 
 | 
        clearColorPalette(ecModel); 
 | 
        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. 
 | 
        this._scheduler.performVisualTasks(ecModel, payload, { 
 | 
          visualType: 'visual', 
 | 
          setDirty: true 
 | 
        }); 
 | 
        ecModel.eachComponent(function (componentType, componentModel) { 
 | 
          if (componentType !== 'series') { 
 | 
            var componentView = _this.getViewOfComponentModel(componentModel); 
 | 
            componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); 
 | 
          } 
 | 
        }); 
 | 
        ecModel.eachSeries(function (seriesModel) { 
 | 
          var chartView = _this._chartsMap[seriesModel.__viewId]; 
 | 
          chartView.updateVisual(seriesModel, ecModel, _this._api, payload); 
 | 
        }); 
 | 
        lifecycle.trigger('afterupdate', ecModel, this._api); 
 | 
      }, 
 | 
      updateLayout: function (payload) { 
 | 
        updateMethods.update.call(this, payload); 
 | 
      } 
 | 
    }; 
 | 
    doConvertPixel = function (ecIns, methodName, finder, value) { 
 | 
      if (ecIns._disposed) { 
 | 
        disposedWarning(ecIns.id); 
 | 
        return; 
 | 
      } 
 | 
      var ecModel = ecIns._model; 
 | 
      var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); 
 | 
      var result; 
 | 
      var parsedFinder = modelUtil.parseFinder(ecModel, finder); 
 | 
      for (var i = 0; i < coordSysList.length; i++) { 
 | 
        var coordSys = coordSysList[i]; 
 | 
        if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { 
 | 
          return result; 
 | 
        } 
 | 
      } 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        warn('No coordinate system that supports ' + methodName + ' found by the given finder.'); 
 | 
      } 
 | 
    }; 
 | 
    updateStreamModes = function (ecIns, ecModel) { 
 | 
      var chartsMap = ecIns._chartsMap; 
 | 
      var scheduler = ecIns._scheduler; 
 | 
      ecModel.eachSeries(function (seriesModel) { 
 | 
        scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); 
 | 
      }); 
 | 
    }; 
 | 
    doDispatchAction = function (payload, silent) { 
 | 
      var _this = this; 
 | 
      var ecModel = this.getModel(); 
 | 
      var payloadType = payload.type; 
 | 
      var escapeConnect = payload.escapeConnect; 
 | 
      var actionWrap = actions[payloadType]; 
 | 
      var actionInfo = actionWrap.actionInfo; 
 | 
      var cptTypeTmp = (actionInfo.update || 'update').split(':'); 
 | 
      var updateMethod = cptTypeTmp.pop(); 
 | 
      var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); 
 | 
      this[IN_MAIN_PROCESS_KEY] = true; 
 | 
      var payloads = [payload]; 
 | 
      var batched = false; 
 | 
      // Batch action 
 | 
      if (payload.batch) { 
 | 
        batched = true; 
 | 
        payloads = map(payload.batch, function (item) { 
 | 
          item = defaults(extend({}, item), payload); 
 | 
          item.batch = null; 
 | 
          return item; 
 | 
        }); 
 | 
      } 
 | 
      var eventObjBatch = []; 
 | 
      var eventObj; 
 | 
      var isSelectChange = isSelectChangePayload(payload); 
 | 
      var isHighDown = isHighDownPayload(payload); 
 | 
      // Only leave blur once if there are multiple batches. 
 | 
      if (isHighDown) { 
 | 
        allLeaveBlur(this._api); 
 | 
      } 
 | 
      each(payloads, function (batchItem) { 
 | 
        // Action can specify the event by return it. 
 | 
        eventObj = actionWrap.action(batchItem, _this._model, _this._api); 
 | 
        // Emit event outside 
 | 
        eventObj = eventObj || extend({}, batchItem); 
 | 
        // Convert type to eventType 
 | 
        eventObj.type = actionInfo.event || eventObj.type; 
 | 
        eventObjBatch.push(eventObj); 
 | 
        // light update does not perform data process, layout and visual. 
 | 
        if (isHighDown) { 
 | 
          var _a = modelUtil.preParseFinder(payload), 
 | 
            queryOptionMap = _a.queryOptionMap, 
 | 
            mainTypeSpecified = _a.mainTypeSpecified; 
 | 
          var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series'; 
 | 
          updateDirectly(_this, updateMethod, batchItem, componentMainType); 
 | 
          markStatusToUpdate(_this); 
 | 
        } else if (isSelectChange) { 
 | 
          // At present `dispatchAction({ type: 'select', ... })` is not supported on components. 
 | 
          // geo still use 'geoselect'. 
 | 
          updateDirectly(_this, updateMethod, batchItem, 'series'); 
 | 
          markStatusToUpdate(_this); 
 | 
        } else if (cptType) { 
 | 
          updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); 
 | 
        } 
 | 
      }); 
 | 
      if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) { 
 | 
        try { 
 | 
          // Still dirty 
 | 
          if (this[PENDING_UPDATE]) { 
 | 
            prepare(this); 
 | 
            updateMethods.update.call(this, payload); 
 | 
            this[PENDING_UPDATE] = null; 
 | 
          } else { 
 | 
            updateMethods[updateMethod].call(this, payload); 
 | 
          } 
 | 
        } catch (e) { 
 | 
          this[IN_MAIN_PROCESS_KEY] = false; 
 | 
          throw e; 
 | 
        } 
 | 
      } 
 | 
      // Follow the rule of action batch 
 | 
      if (batched) { 
 | 
        eventObj = { 
 | 
          type: actionInfo.event || payloadType, 
 | 
          escapeConnect: escapeConnect, 
 | 
          batch: eventObjBatch 
 | 
        }; 
 | 
      } else { 
 | 
        eventObj = eventObjBatch[0]; 
 | 
      } 
 | 
      this[IN_MAIN_PROCESS_KEY] = false; 
 | 
      if (!silent) { 
 | 
        var messageCenter = this._messageCenter; 
 | 
        messageCenter.trigger(eventObj.type, eventObj); 
 | 
        // Extra triggered 'selectchanged' event 
 | 
        if (isSelectChange) { 
 | 
          var newObj = { 
 | 
            type: 'selectchanged', 
 | 
            escapeConnect: escapeConnect, 
 | 
            selected: getAllSelectedIndices(ecModel), 
 | 
            isFromClick: payload.isFromClick || false, 
 | 
            fromAction: payload.type, 
 | 
            fromActionPayload: payload 
 | 
          }; 
 | 
          messageCenter.trigger(newObj.type, newObj); 
 | 
        } 
 | 
      } 
 | 
    }; 
 | 
    flushPendingActions = function (silent) { 
 | 
      var pendingActions = this._pendingActions; 
 | 
      while (pendingActions.length) { 
 | 
        var payload = pendingActions.shift(); 
 | 
        doDispatchAction.call(this, payload, silent); 
 | 
      } 
 | 
    }; 
 | 
    triggerUpdatedEvent = function (silent) { 
 | 
      !silent && this.trigger('updated'); 
 | 
    }; 
 | 
    /** 
 | 
     * Event `rendered` is triggered when zr 
 | 
     * rendered. It is useful for realtime 
 | 
     * snapshot (reflect animation). 
 | 
     * 
 | 
     * Event `finished` is triggered when: 
 | 
     * (1) zrender rendering finished. 
 | 
     * (2) initial animation finished. 
 | 
     * (3) progressive rendering finished. 
 | 
     * (4) no pending action. 
 | 
     * (5) no delayed setOption needs to be processed. 
 | 
     */ 
 | 
    bindRenderedEvent = function (zr, ecIns) { 
 | 
      zr.on('rendered', function (params) { 
 | 
        ecIns.trigger('rendered', params); 
 | 
        // The `finished` event should not be triggered repeatedly, 
 | 
        // so it should only be triggered when rendering indeed happens 
 | 
        // in zrender. (Consider the case that dipatchAction is keep 
 | 
        // triggering when mouse move). 
 | 
        if ( 
 | 
        // Although zr is dirty if initial animation is not finished 
 | 
        // and this checking is called on frame, we also check 
 | 
        // animation finished for robustness. 
 | 
        zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) { 
 | 
          ecIns.trigger('finished'); 
 | 
        } 
 | 
      }); 
 | 
    }; 
 | 
    bindMouseEvent = function (zr, ecIns) { 
 | 
      zr.on('mouseover', function (e) { 
 | 
        var el = e.target; 
 | 
        var dispatcher = findEventDispatcher(el, isHighDownDispatcher); 
 | 
        if (dispatcher) { 
 | 
          handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        } 
 | 
      }).on('mouseout', function (e) { 
 | 
        var el = e.target; 
 | 
        var dispatcher = findEventDispatcher(el, isHighDownDispatcher); 
 | 
        if (dispatcher) { 
 | 
          handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        } 
 | 
      }).on('click', function (e) { 
 | 
        var el = e.target; 
 | 
        var dispatcher = findEventDispatcher(el, function (target) { 
 | 
          return getECData(target).dataIndex != null; 
 | 
        }, true); 
 | 
        if (dispatcher) { 
 | 
          var actionType = dispatcher.selected ? 'unselect' : 'select'; 
 | 
          var ecData = getECData(dispatcher); 
 | 
          ecIns._api.dispatchAction({ 
 | 
            type: actionType, 
 | 
            dataType: ecData.dataType, 
 | 
            dataIndexInside: ecData.dataIndex, 
 | 
            seriesIndex: ecData.seriesIndex, 
 | 
            isFromClick: true 
 | 
          }); 
 | 
        } 
 | 
      }); 
 | 
    }; 
 | 
    function clearColorPalette(ecModel) { 
 | 
      ecModel.clearColorPalette(); 
 | 
      ecModel.eachSeries(function (seriesModel) { 
 | 
        seriesModel.clearColorPalette(); 
 | 
      }); 
 | 
    } 
 | 
    ; 
 | 
    // Allocate zlevels for series and components 
 | 
    function allocateZlevels(ecModel) { 
 | 
      ; 
 | 
      var componentZLevels = []; 
 | 
      var seriesZLevels = []; 
 | 
      var hasSeparateZLevel = false; 
 | 
      ecModel.eachComponent(function (componentType, componentModel) { 
 | 
        var zlevel = componentModel.get('zlevel') || 0; 
 | 
        var z = componentModel.get('z') || 0; 
 | 
        var zlevelKey = componentModel.getZLevelKey(); 
 | 
        hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey; 
 | 
        (componentType === 'series' ? seriesZLevels : componentZLevels).push({ 
 | 
          zlevel: zlevel, 
 | 
          z: z, 
 | 
          idx: componentModel.componentIndex, 
 | 
          type: componentType, 
 | 
          key: zlevelKey 
 | 
        }); 
 | 
      }); 
 | 
      if (hasSeparateZLevel) { 
 | 
        // Series after component 
 | 
        var zLevels = componentZLevels.concat(seriesZLevels); 
 | 
        var lastSeriesZLevel_1; 
 | 
        var lastSeriesKey_1; 
 | 
        timsort(zLevels, function (a, b) { 
 | 
          if (a.zlevel === b.zlevel) { 
 | 
            return a.z - b.z; 
 | 
          } 
 | 
          return a.zlevel - b.zlevel; 
 | 
        }); 
 | 
        each(zLevels, function (item) { 
 | 
          var componentModel = ecModel.getComponent(item.type, item.idx); 
 | 
          var zlevel = item.zlevel; 
 | 
          var key = item.key; 
 | 
          if (lastSeriesZLevel_1 != null) { 
 | 
            zlevel = Math.max(lastSeriesZLevel_1, zlevel); 
 | 
          } 
 | 
          if (key) { 
 | 
            if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { 
 | 
              zlevel++; 
 | 
            } 
 | 
            lastSeriesKey_1 = key; 
 | 
          } else if (lastSeriesKey_1) { 
 | 
            if (zlevel === lastSeriesZLevel_1) { 
 | 
              zlevel++; 
 | 
            } 
 | 
            lastSeriesKey_1 = ''; 
 | 
          } 
 | 
          lastSeriesZLevel_1 = zlevel; 
 | 
          componentModel.setZLevel(zlevel); 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    render = function (ecIns, ecModel, api, payload, updateParams) { 
 | 
      allocateZlevels(ecModel); 
 | 
      renderComponents(ecIns, ecModel, api, payload, updateParams); 
 | 
      each(ecIns._chartsViews, function (chart) { 
 | 
        chart.__alive = false; 
 | 
      }); 
 | 
      renderSeries(ecIns, ecModel, api, payload, updateParams); 
 | 
      // Remove groups of unrendered charts 
 | 
      each(ecIns._chartsViews, function (chart) { 
 | 
        if (!chart.__alive) { 
 | 
          chart.remove(ecModel, api); 
 | 
        } 
 | 
      }); 
 | 
    }; 
 | 
    renderComponents = function (ecIns, ecModel, api, payload, updateParams, dirtyList) { 
 | 
      each(dirtyList || ecIns._componentsViews, function (componentView) { 
 | 
        var componentModel = componentView.__model; 
 | 
        clearStates(componentModel, componentView); 
 | 
        componentView.render(componentModel, ecModel, api, payload); 
 | 
        updateZ(componentModel, componentView); 
 | 
        updateStates(componentModel, componentView); 
 | 
      }); 
 | 
    }; 
 | 
    /** 
 | 
     * Render each chart and component 
 | 
     */ 
 | 
    renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) { 
 | 
      // Render all charts 
 | 
      var scheduler = ecIns._scheduler; 
 | 
      updateParams = extend(updateParams || {}, { 
 | 
        updatedSeries: ecModel.getSeries() 
 | 
      }); 
 | 
      // TODO progressive? 
 | 
      lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams); 
 | 
      var unfinished = false; 
 | 
      ecModel.eachSeries(function (seriesModel) { 
 | 
        var chartView = ecIns._chartsMap[seriesModel.__viewId]; 
 | 
        chartView.__alive = true; 
 | 
        var renderTask = chartView.renderTask; 
 | 
        scheduler.updatePayload(renderTask, payload); 
 | 
        // TODO states on marker. 
 | 
        clearStates(seriesModel, chartView); 
 | 
        if (dirtyMap && dirtyMap.get(seriesModel.uid)) { 
 | 
          renderTask.dirty(); 
 | 
        } 
 | 
        if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { 
 | 
          unfinished = true; 
 | 
        } 
 | 
        chartView.group.silent = !!seriesModel.get('silent'); 
 | 
        // Should not call markRedraw on group, because it will disable zrender 
 | 
        // incremental render (always render from the __startIndex each frame) 
 | 
        // chartView.group.markRedraw(); 
 | 
        updateBlend(seriesModel, chartView); 
 | 
        updateSeriesElementSelection(seriesModel); 
 | 
      }); 
 | 
      scheduler.unfinished = unfinished || scheduler.unfinished; 
 | 
      lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams); 
 | 
      // transition after label is layouted. 
 | 
      lifecycle.trigger('series:transition', ecModel, api, updateParams); 
 | 
      ecModel.eachSeries(function (seriesModel) { 
 | 
        var chartView = ecIns._chartsMap[seriesModel.__viewId]; 
 | 
        // Update Z after labels updated. Before applying states. 
 | 
        updateZ(seriesModel, chartView); 
 | 
        // NOTE: Update states after label is updated. 
 | 
        // label should be in normal status when layouting. 
 | 
        updateStates(seriesModel, chartView); 
 | 
      }); 
 | 
      // If use hover layer 
 | 
      updateHoverLayerStatus(ecIns, ecModel); 
 | 
      lifecycle.trigger('series:afterupdate', ecModel, api, updateParams); 
 | 
    }; 
 | 
    markStatusToUpdate = function (ecIns) { 
 | 
      ecIns[STATUS_NEEDS_UPDATE_KEY] = true; 
 | 
      // Wake up zrender if it's sleep. Let it update states in the next frame. 
 | 
      ecIns.getZr().wakeUp(); 
 | 
    }; 
 | 
    applyChangedStates = function (ecIns) { 
 | 
      if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { 
 | 
        return; 
 | 
      } 
 | 
      ecIns.getZr().storage.traverse(function (el) { 
 | 
        // Not applied on removed elements, it may still in fading. 
 | 
        if (graphic.isElementRemoved(el)) { 
 | 
          return; 
 | 
        } 
 | 
        applyElementStates(el); 
 | 
      }); 
 | 
      ecIns[STATUS_NEEDS_UPDATE_KEY] = false; 
 | 
    }; 
 | 
    function applyElementStates(el) { 
 | 
      var newStates = []; 
 | 
      var oldStates = el.currentStates; 
 | 
      // Keep other states. 
 | 
      for (var i = 0; i < oldStates.length; i++) { 
 | 
        var stateName = oldStates[i]; 
 | 
        if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) { 
 | 
          newStates.push(stateName); 
 | 
        } 
 | 
      } 
 | 
      // Only use states when it's exists. 
 | 
      if (el.selected && el.states.select) { 
 | 
        newStates.push('select'); 
 | 
      } 
 | 
      if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { 
 | 
        newStates.push('emphasis'); 
 | 
      } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { 
 | 
        newStates.push('blur'); 
 | 
      } 
 | 
      el.useStates(newStates); 
 | 
    } 
 | 
    function updateHoverLayerStatus(ecIns, ecModel) { 
 | 
      var zr = ecIns._zr; 
 | 
      var storage = zr.storage; 
 | 
      var elCount = 0; 
 | 
      storage.traverse(function (el) { 
 | 
        if (!el.isGroup) { 
 | 
          elCount++; 
 | 
        } 
 | 
      }); 
 | 
      if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) { 
 | 
        ecModel.eachSeries(function (seriesModel) { 
 | 
          if (seriesModel.preventUsingHoverLayer) { 
 | 
            return; 
 | 
          } 
 | 
          var chartView = ecIns._chartsMap[seriesModel.__viewId]; 
 | 
          if (chartView.__alive) { 
 | 
            chartView.eachRendered(function (el) { 
 | 
              if (el.states.emphasis) { 
 | 
                el.states.emphasis.hoverLayer = true; 
 | 
              } 
 | 
            }); 
 | 
          } 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    ; 
 | 
    /** 
 | 
     * Update chart and blend. 
 | 
     */ 
 | 
    function updateBlend(seriesModel, chartView) { 
 | 
      var blendMode = seriesModel.get('blendMode') || null; 
 | 
      chartView.eachRendered(function (el) { 
 | 
        // FIXME marker and other components 
 | 
        if (!el.isGroup) { 
 | 
          // DON'T mark the element dirty. In case element is incremental and don't want to rerender. 
 | 
          el.style.blend = blendMode; 
 | 
        } 
 | 
      }); 
 | 
    } 
 | 
    ; 
 | 
    function updateZ(model, view) { 
 | 
      if (model.preventAutoZ) { 
 | 
        return; 
 | 
      } 
 | 
      var z = model.get('z') || 0; 
 | 
      var zlevel = model.get('zlevel') || 0; 
 | 
      // Set z and zlevel 
 | 
      view.eachRendered(function (el) { 
 | 
        doUpdateZ(el, z, zlevel, -Infinity); 
 | 
        // Don't traverse the children because it has been traversed in _updateZ. 
 | 
        return true; 
 | 
      }); 
 | 
    } 
 | 
    ; 
 | 
    function doUpdateZ(el, z, zlevel, maxZ2) { 
 | 
      // Group may also have textContent 
 | 
      var label = el.getTextContent(); 
 | 
      var labelLine = el.getTextGuideLine(); 
 | 
      var isGroup = el.isGroup; 
 | 
      if (isGroup) { 
 | 
        // set z & zlevel of children elements of Group 
 | 
        var children = el.childrenRef(); 
 | 
        for (var i = 0; i < children.length; i++) { 
 | 
          maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); 
 | 
        } 
 | 
      } else { 
 | 
        // not Group 
 | 
        el.z = z; 
 | 
        el.zlevel = zlevel; 
 | 
        maxZ2 = Math.max(el.z2, maxZ2); 
 | 
      } 
 | 
      // always set z and zlevel if label/labelLine exists 
 | 
      if (label) { 
 | 
        label.z = z; 
 | 
        label.zlevel = zlevel; 
 | 
        // lift z2 of text content 
 | 
        // TODO if el.emphasis.z2 is spcefied, what about textContent. 
 | 
        isFinite(maxZ2) && (label.z2 = maxZ2 + 2); 
 | 
      } 
 | 
      if (labelLine) { 
 | 
        var textGuideLineConfig = el.textGuideLineConfig; 
 | 
        labelLine.z = z; 
 | 
        labelLine.zlevel = zlevel; 
 | 
        isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); 
 | 
      } 
 | 
      return maxZ2; 
 | 
    } 
 | 
    // Clear states without animation. 
 | 
    // TODO States on component. 
 | 
    function clearStates(model, view) { 
 | 
      view.eachRendered(function (el) { 
 | 
        // Not applied on removed elements, it may still in fading. 
 | 
        if (graphic.isElementRemoved(el)) { 
 | 
          return; 
 | 
        } 
 | 
        var textContent = el.getTextContent(); 
 | 
        var textGuide = el.getTextGuideLine(); 
 | 
        if (el.stateTransition) { 
 | 
          el.stateTransition = null; 
 | 
        } 
 | 
        if (textContent && textContent.stateTransition) { 
 | 
          textContent.stateTransition = null; 
 | 
        } 
 | 
        if (textGuide && textGuide.stateTransition) { 
 | 
          textGuide.stateTransition = null; 
 | 
        } 
 | 
        // TODO If el is incremental. 
 | 
        if (el.hasState()) { 
 | 
          el.prevStates = el.currentStates; 
 | 
          el.clearStates(); 
 | 
        } else if (el.prevStates) { 
 | 
          el.prevStates = null; 
 | 
        } 
 | 
      }); 
 | 
    } 
 | 
    function updateStates(model, view) { 
 | 
      var stateAnimationModel = model.getModel('stateAnimation'); 
 | 
      var enableAnimation = model.isAnimationEnabled(); 
 | 
      var duration = stateAnimationModel.get('duration'); 
 | 
      var stateTransition = duration > 0 ? { 
 | 
        duration: duration, 
 | 
        delay: stateAnimationModel.get('delay'), 
 | 
        easing: stateAnimationModel.get('easing') 
 | 
        // additive: stateAnimationModel.get('additive') 
 | 
      } : null; 
 | 
      view.eachRendered(function (el) { 
 | 
        if (el.states && el.states.emphasis) { 
 | 
          // Not applied on removed elements, it may still in fading. 
 | 
          if (graphic.isElementRemoved(el)) { 
 | 
            return; 
 | 
          } 
 | 
          if (el instanceof graphic.Path) { 
 | 
            savePathStates(el); 
 | 
          } 
 | 
          // Only updated on changed element. In case element is incremental and don't want to rerender. 
 | 
          // TODO, a more proper way? 
 | 
          if (el.__dirty) { 
 | 
            var prevStates = el.prevStates; 
 | 
            // Restore states without animation 
 | 
            if (prevStates) { 
 | 
              el.useStates(prevStates); 
 | 
            } 
 | 
          } 
 | 
          // Update state transition and enable animation again. 
 | 
          if (enableAnimation) { 
 | 
            el.stateTransition = stateTransition; 
 | 
            var textContent = el.getTextContent(); 
 | 
            var textGuide = el.getTextGuideLine(); 
 | 
            // TODO Is it necessary to animate label? 
 | 
            if (textContent) { 
 | 
              textContent.stateTransition = stateTransition; 
 | 
            } 
 | 
            if (textGuide) { 
 | 
              textGuide.stateTransition = stateTransition; 
 | 
            } 
 | 
          } 
 | 
          // Use highlighted and selected flag to toggle states. 
 | 
          if (el.__dirty) { 
 | 
            applyElementStates(el); 
 | 
          } 
 | 
        } 
 | 
      }); 
 | 
    } 
 | 
    ; 
 | 
    createExtensionAPI = function (ecIns) { 
 | 
      return new (/** @class */function (_super) { 
 | 
        __extends(class_1, _super); 
 | 
        function class_1() { 
 | 
          return _super !== null && _super.apply(this, arguments) || this; 
 | 
        } 
 | 
        class_1.prototype.getCoordinateSystems = function () { 
 | 
          return ecIns._coordSysMgr.getCoordinateSystems(); 
 | 
        }; 
 | 
        class_1.prototype.getComponentByElement = function (el) { 
 | 
          while (el) { 
 | 
            var modelInfo = el.__ecComponentInfo; 
 | 
            if (modelInfo != null) { 
 | 
              return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); 
 | 
            } 
 | 
            el = el.parent; 
 | 
          } 
 | 
        }; 
 | 
        class_1.prototype.enterEmphasis = function (el, highlightDigit) { 
 | 
          enterEmphasis(el, highlightDigit); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.leaveEmphasis = function (el, highlightDigit) { 
 | 
          leaveEmphasis(el, highlightDigit); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.enterBlur = function (el) { 
 | 
          enterBlur(el); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.leaveBlur = function (el) { 
 | 
          leaveBlur(el); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.enterSelect = function (el) { 
 | 
          enterSelect(el); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.leaveSelect = function (el) { 
 | 
          leaveSelect(el); 
 | 
          markStatusToUpdate(ecIns); 
 | 
        }; 
 | 
        class_1.prototype.getModel = function () { 
 | 
          return ecIns.getModel(); 
 | 
        }; 
 | 
        class_1.prototype.getViewOfComponentModel = function (componentModel) { 
 | 
          return ecIns.getViewOfComponentModel(componentModel); 
 | 
        }; 
 | 
        class_1.prototype.getViewOfSeriesModel = function (seriesModel) { 
 | 
          return ecIns.getViewOfSeriesModel(seriesModel); 
 | 
        }; 
 | 
        return class_1; 
 | 
      }(ExtensionAPI))(ecIns); 
 | 
    }; 
 | 
    enableConnect = function (chart) { 
 | 
      function updateConnectedChartsStatus(charts, status) { 
 | 
        for (var i = 0; i < charts.length; i++) { 
 | 
          var otherChart = charts[i]; 
 | 
          otherChart[CONNECT_STATUS_KEY] = status; 
 | 
        } 
 | 
      } 
 | 
      each(eventActionMap, function (actionType, eventType) { 
 | 
        chart._messageCenter.on(eventType, function (event) { 
 | 
          if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { 
 | 
            if (event && event.escapeConnect) { 
 | 
              return; 
 | 
            } 
 | 
            var action_1 = chart.makeActionFromEvent(event); 
 | 
            var otherCharts_1 = []; 
 | 
            each(instances, function (otherChart) { 
 | 
              if (otherChart !== chart && otherChart.group === chart.group) { 
 | 
                otherCharts_1.push(otherChart); 
 | 
              } 
 | 
            }); 
 | 
            updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); 
 | 
            each(otherCharts_1, function (otherChart) { 
 | 
              if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { 
 | 
                otherChart.dispatchAction(action_1); 
 | 
              } 
 | 
            }); 
 | 
            updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); 
 | 
          } 
 | 
        }); 
 | 
      }); 
 | 
    }; 
 | 
  }(); 
 | 
  return ECharts; 
 | 
}(Eventful); 
 | 
var echartsProto = ECharts.prototype; 
 | 
echartsProto.on = createRegisterEventWithLowercaseECharts('on'); 
 | 
echartsProto.off = createRegisterEventWithLowercaseECharts('off'); 
 | 
/** 
 | 
 * @deprecated 
 | 
 */ 
 | 
// @ts-ignore 
 | 
echartsProto.one = function (eventName, cb, ctx) { 
 | 
  var self = this; 
 | 
  deprecateLog('ECharts#one is deprecated.'); 
 | 
  function wrapped() { 
 | 
    var args2 = []; 
 | 
    for (var _i = 0; _i < arguments.length; _i++) { 
 | 
      args2[_i] = arguments[_i]; 
 | 
    } 
 | 
    cb && cb.apply && cb.apply(this, args2); 
 | 
    // @ts-ignore 
 | 
    self.off(eventName, wrapped); 
 | 
  } 
 | 
  ; 
 | 
  // @ts-ignore 
 | 
  this.on.call(this, eventName, wrapped, ctx); 
 | 
}; 
 | 
var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu']; 
 | 
function disposedWarning(id) { 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    warn('Instance ' + id + ' has been disposed'); 
 | 
  } 
 | 
} 
 | 
var actions = {}; 
 | 
/** 
 | 
 * Map eventType to actionType 
 | 
 */ 
 | 
var eventActionMap = {}; 
 | 
var dataProcessorFuncs = []; 
 | 
var optionPreprocessorFuncs = []; 
 | 
var visualFuncs = []; 
 | 
var themeStorage = {}; 
 | 
var loadingEffects = {}; 
 | 
var instances = {}; 
 | 
var connectedGroups = {}; 
 | 
var idBase = +new Date() - 0; 
 | 
var groupIdBase = +new Date() - 0; 
 | 
var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; 
 | 
/** 
 | 
 * @param opts.devicePixelRatio Use window.devicePixelRatio by default 
 | 
 * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart. 
 | 
 * @param opts.width Use clientWidth of the input `dom` by default. 
 | 
 *        Can be 'auto' (the same as null/undefined) 
 | 
 * @param opts.height Use clientHeight of the input `dom` by default. 
 | 
 *        Can be 'auto' (the same as null/undefined) 
 | 
 * @param opts.locale Specify the locale. 
 | 
 * @param opts.useDirtyRect Enable dirty rectangle rendering or not. 
 | 
 */ 
 | 
export function init(dom, theme, opts) { 
 | 
  var isClient = !(opts && opts.ssr); 
 | 
  if (isClient) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (!dom) { 
 | 
        throw new Error('Initialize failed: invalid dom.'); 
 | 
      } 
 | 
    } 
 | 
    var existInstance = getInstanceByDom(dom); 
 | 
    if (existInstance) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        warn('There is a chart instance already initialized on the dom.'); 
 | 
      } 
 | 
      return existInstance; 
 | 
    } 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) { 
 | 
        warn('Can\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.'); 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  var chart = new ECharts(dom, theme, opts); 
 | 
  chart.id = 'ec_' + idBase++; 
 | 
  instances[chart.id] = chart; 
 | 
  isClient && modelUtil.setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); 
 | 
  enableConnect(chart); 
 | 
  lifecycle.trigger('afterinit', chart); 
 | 
  return chart; 
 | 
} 
 | 
/** 
 | 
 * @usage 
 | 
 * (A) 
 | 
 * ```js 
 | 
 * let chart1 = echarts.init(dom1); 
 | 
 * let chart2 = echarts.init(dom2); 
 | 
 * chart1.group = 'xxx'; 
 | 
 * chart2.group = 'xxx'; 
 | 
 * echarts.connect('xxx'); 
 | 
 * ``` 
 | 
 * (B) 
 | 
 * ```js 
 | 
 * let chart1 = echarts.init(dom1); 
 | 
 * let chart2 = echarts.init(dom2); 
 | 
 * echarts.connect('xxx', [chart1, chart2]); 
 | 
 * ``` 
 | 
 */ 
 | 
export function connect(groupId) { 
 | 
  // Is array of charts 
 | 
  if (isArray(groupId)) { 
 | 
    var charts = groupId; 
 | 
    groupId = null; 
 | 
    // If any chart has group 
 | 
    each(charts, function (chart) { 
 | 
      if (chart.group != null) { 
 | 
        groupId = chart.group; 
 | 
      } 
 | 
    }); 
 | 
    groupId = groupId || 'g_' + groupIdBase++; 
 | 
    each(charts, function (chart) { 
 | 
      chart.group = groupId; 
 | 
    }); 
 | 
  } 
 | 
  connectedGroups[groupId] = true; 
 | 
  return groupId; 
 | 
} 
 | 
export function disconnect(groupId) { 
 | 
  connectedGroups[groupId] = false; 
 | 
} 
 | 
/** 
 | 
 * Alias and backward compatibility 
 | 
 * @deprecated 
 | 
 */ 
 | 
export var disConnect = disconnect; 
 | 
/** 
 | 
 * Dispose a chart instance 
 | 
 */ 
 | 
export function dispose(chart) { 
 | 
  if (isString(chart)) { 
 | 
    chart = instances[chart]; 
 | 
  } else if (!(chart instanceof ECharts)) { 
 | 
    // Try to treat as dom 
 | 
    chart = getInstanceByDom(chart); 
 | 
  } 
 | 
  if (chart instanceof ECharts && !chart.isDisposed()) { 
 | 
    chart.dispose(); 
 | 
  } 
 | 
} 
 | 
export function getInstanceByDom(dom) { 
 | 
  return instances[modelUtil.getAttribute(dom, DOM_ATTRIBUTE_KEY)]; 
 | 
} 
 | 
export function getInstanceById(key) { 
 | 
  return instances[key]; 
 | 
} 
 | 
/** 
 | 
 * Register theme 
 | 
 */ 
 | 
export function registerTheme(name, theme) { 
 | 
  themeStorage[name] = theme; 
 | 
} 
 | 
/** 
 | 
 * Register option preprocessor 
 | 
 */ 
 | 
export function registerPreprocessor(preprocessorFunc) { 
 | 
  if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { 
 | 
    optionPreprocessorFuncs.push(preprocessorFunc); 
 | 
  } 
 | 
} 
 | 
export function registerProcessor(priority, processor) { 
 | 
  normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); 
 | 
} 
 | 
/** 
 | 
 * Register postIniter 
 | 
 * @param {Function} postInitFunc 
 | 
 */ 
 | 
export function registerPostInit(postInitFunc) { 
 | 
  registerUpdateLifecycle('afterinit', postInitFunc); 
 | 
} 
 | 
/** 
 | 
 * Register postUpdater 
 | 
 * @param {Function} postUpdateFunc 
 | 
 */ 
 | 
export function registerPostUpdate(postUpdateFunc) { 
 | 
  registerUpdateLifecycle('afterupdate', postUpdateFunc); 
 | 
} 
 | 
export function registerUpdateLifecycle(name, cb) { 
 | 
  lifecycle.on(name, cb); 
 | 
} 
 | 
export function registerAction(actionInfo, eventName, action) { 
 | 
  if (isFunction(eventName)) { 
 | 
    action = eventName; 
 | 
    eventName = ''; 
 | 
  } 
 | 
  var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = { 
 | 
    event: eventName 
 | 
  }][0]; 
 | 
  // Event name is all lowercase 
 | 
  actionInfo.event = (actionInfo.event || actionType).toLowerCase(); 
 | 
  eventName = actionInfo.event; 
 | 
  if (eventActionMap[eventName]) { 
 | 
    // Already registered. 
 | 
    return; 
 | 
  } 
 | 
  // Validate action type and event name. 
 | 
  assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); 
 | 
  if (!actions[actionType]) { 
 | 
    actions[actionType] = { 
 | 
      action: action, 
 | 
      actionInfo: actionInfo 
 | 
    }; 
 | 
  } 
 | 
  eventActionMap[eventName] = actionType; 
 | 
} 
 | 
export function registerCoordinateSystem(type, coordSysCreator) { 
 | 
  CoordinateSystemManager.register(type, coordSysCreator); 
 | 
} 
 | 
/** 
 | 
 * Get dimensions of specified coordinate system. 
 | 
 * @param {string} type 
 | 
 * @return {Array.<string|Object>} 
 | 
 */ 
 | 
export function getCoordinateSystemDimensions(type) { 
 | 
  var coordSysCreator = CoordinateSystemManager.get(type); 
 | 
  if (coordSysCreator) { 
 | 
    return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice(); 
 | 
  } 
 | 
} 
 | 
export { registerLocale } from './locale.js'; 
 | 
function registerLayout(priority, layoutTask) { 
 | 
  normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); 
 | 
} 
 | 
function registerVisual(priority, visualTask) { 
 | 
  normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); 
 | 
} 
 | 
export { registerLayout, registerVisual }; 
 | 
var registeredTasks = []; 
 | 
function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { 
 | 
  if (isFunction(priority) || isObject(priority)) { 
 | 
    fn = priority; 
 | 
    priority = defaultPriority; 
 | 
  } 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    if (isNaN(priority) || priority == null) { 
 | 
      throw new Error('Illegal priority'); 
 | 
    } 
 | 
    // Check duplicate 
 | 
    each(targetList, function (wrap) { 
 | 
      assert(wrap.__raw !== fn); 
 | 
    }); 
 | 
  } 
 | 
  // Already registered 
 | 
  if (indexOf(registeredTasks, fn) >= 0) { 
 | 
    return; 
 | 
  } 
 | 
  registeredTasks.push(fn); 
 | 
  var stageHandler = Scheduler.wrapStageHandler(fn, visualType); 
 | 
  stageHandler.__prio = priority; 
 | 
  stageHandler.__raw = fn; 
 | 
  targetList.push(stageHandler); 
 | 
} 
 | 
export function registerLoading(name, loadingFx) { 
 | 
  loadingEffects[name] = loadingFx; 
 | 
} 
 | 
/** 
 | 
 * ZRender need a canvas context to do measureText. 
 | 
 * But in node environment canvas may be created by node-canvas. 
 | 
 * So we need to specify how to create a canvas instead of using document.createElement('canvas') 
 | 
 * 
 | 
 * 
 | 
 * @deprecated use setPlatformAPI({ createCanvas }) instead. 
 | 
 * 
 | 
 * @example 
 | 
 *     let Canvas = require('canvas'); 
 | 
 *     let echarts = require('echarts'); 
 | 
 *     echarts.setCanvasCreator(function () { 
 | 
 *         // Small size is enough. 
 | 
 *         return new Canvas(32, 32); 
 | 
 *     }); 
 | 
 */ 
 | 
export function setCanvasCreator(creator) { 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.'); 
 | 
  } 
 | 
  setPlatformAPI({ 
 | 
    createCanvas: creator 
 | 
  }); 
 | 
} 
 | 
/** 
 | 
 * The parameters and usage: see `geoSourceManager.registerMap`. 
 | 
 * Compatible with previous `echarts.registerMap`. 
 | 
 */ 
 | 
export function registerMap(mapName, geoJson, specialAreas) { 
 | 
  var registerMap = getImpl('registerMap'); 
 | 
  registerMap && registerMap(mapName, geoJson, specialAreas); 
 | 
} 
 | 
export function getMap(mapName) { 
 | 
  var getMap = getImpl('getMap'); 
 | 
  return getMap && getMap(mapName); 
 | 
} 
 | 
export var registerTransform = registerExternalTransform; 
 | 
/** 
 | 
 * Globa dispatchAction to a specified chart instance. 
 | 
 */ 
 | 
// export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) { 
 | 
//     if (!payload || !payload.chartId) { 
 | 
//         // Must have chartId to find chart 
 | 
//         return; 
 | 
//     } 
 | 
//     const chart = instances[payload.chartId]; 
 | 
//     if (chart) { 
 | 
//         chart.dispatchAction(payload, opt); 
 | 
//     } 
 | 
// } 
 | 
// Builtin global visual 
 | 
registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); 
 | 
registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); 
 | 
registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); 
 | 
registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); 
 | 
registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); 
 | 
registerVisual(PRIORITY_VISUAL_DECAL, decal); 
 | 
registerPreprocessor(backwardCompat); 
 | 
registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); 
 | 
registerLoading('default', loadingDefault); 
 | 
// Default actions 
 | 
registerAction({ 
 | 
  type: HIGHLIGHT_ACTION_TYPE, 
 | 
  event: HIGHLIGHT_ACTION_TYPE, 
 | 
  update: HIGHLIGHT_ACTION_TYPE 
 | 
}, noop); 
 | 
registerAction({ 
 | 
  type: DOWNPLAY_ACTION_TYPE, 
 | 
  event: DOWNPLAY_ACTION_TYPE, 
 | 
  update: DOWNPLAY_ACTION_TYPE 
 | 
}, noop); 
 | 
registerAction({ 
 | 
  type: SELECT_ACTION_TYPE, 
 | 
  event: SELECT_ACTION_TYPE, 
 | 
  update: SELECT_ACTION_TYPE 
 | 
}, noop); 
 | 
registerAction({ 
 | 
  type: UNSELECT_ACTION_TYPE, 
 | 
  event: UNSELECT_ACTION_TYPE, 
 | 
  update: UNSELECT_ACTION_TYPE 
 | 
}, noop); 
 | 
registerAction({ 
 | 
  type: TOGGLE_SELECT_ACTION_TYPE, 
 | 
  event: TOGGLE_SELECT_ACTION_TYPE, 
 | 
  update: TOGGLE_SELECT_ACTION_TYPE 
 | 
}, noop); 
 | 
// Default theme 
 | 
registerTheme('light', lightTheme); 
 | 
registerTheme('dark', darkTheme); 
 | 
// For backward compatibility, where the namespace `dataTool` will 
 | 
// be mounted on `echarts` is the extension `dataTool` is imported. 
 | 
export var dataTool = {}; 
 |