From 23ee880f1bbefd3d839b5270491b66528fb99573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BE=A1=E9=B1=BC?= <1435456124@qq.com> Date: Thu, 29 Aug 2024 14:28:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 12 + .d.ts | 4 + .editorconfig | 9 + .gitignore | 14 + .postcssrc.js | 10 + build/build.js | 41 + build/check-versions.js | 54 + build/logo.png | Bin 0 -> 6849 bytes build/utils.js | 101 + build/vue-loader.conf.js | 22 + build/webpack.base.conf.js | 82 + build/webpack.dev.conf.js | 95 + build/webpack.prod.conf.js | 145 + config/dev.env.js | 7 + config/index.js | 98 + config/prod.env.js | 4 + index.html | 12 + package-lock.json | 15017 +++ package.json | 69 + src/App.vue | 319 + src/assets/logo.png | Bin 0 -> 6849 bytes src/assets/logo@2x.png | Bin 0 -> 4379 bytes src/axios/apiConfig.js | 29 + src/axios/index.js | 51 + src/components/ChinaCo2Content.vue | 26 + src/components/ChinaCo2ContentBottom.vue | 359 + src/components/ChinaCo2ContentTop.vue | 276 + src/components/ChinaCo2Left.vue | 25 + src/components/ChinaCo2LeftBottom.vue | 130 + src/components/ChinaCo2LeftTop.vue | 86 + src/components/ChinaCo2Right.vue | 25 + src/components/ChinaCo2RightBottom.vue | 131 + src/components/ChinaCo2RightTop.vue | 183 + src/components/DetailsCo2Left.vue | 32 + src/components/DetailsCo2LeftBottom.vue | 16 + src/components/DetailsCo2LeftContent.vue | 215 + src/components/DetailsCo2LeftTop.vue | 87 + src/components/DetailsCo2Right.vue | 23 + src/components/DetailsCo2RightContent.vue | 102 + src/components/IndexBottom.vue | 50 + src/components/IndexContent.vue | 28 + src/components/IndexContentLeft.vue | 144 + src/components/IndexContentRight.vue | 36 + src/components/IndexContentRightBottom.vue | 128 + src/components/IndexContentRightTop.vue | 384 + src/components/IndexTop.vue | 46 + src/components/demo.vue | 52 + src/components/lefttext.vue | 218 + src/echartsjs/echarts.js | 95739 +++++++++++++++++++ src/echartsjs/world_map.js | 449 + src/images/bg.jpg | Bin 0 -> 1429612 bytes src/images/head_bg.png | Bin 0 -> 7881 bytes src/images/inp.png | Bin 0 -> 9696 bytes src/json/1990.json | 2135 + src/json/world.json | 1 + src/main.js | 53 + src/router/index.js | 37 + src/store/index.js | 274 + src/views/ChinaCo2.vue | 37 + src/views/DetailsCo2.vue | 35 + src/views/Index.vue | 35 + src/views/text.vue | 64 + static/.gitkeep | 0 63 files changed, 117856 insertions(+) create mode 100644 .babelrc create mode 100644 .d.ts create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .postcssrc.js create mode 100644 build/build.js create mode 100644 build/check-versions.js create mode 100644 build/logo.png create mode 100644 build/utils.js create mode 100644 build/vue-loader.conf.js create mode 100644 build/webpack.base.conf.js create mode 100644 build/webpack.dev.conf.js create mode 100644 build/webpack.prod.conf.js create mode 100644 config/dev.env.js create mode 100644 config/index.js create mode 100644 config/prod.env.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.vue create mode 100644 src/assets/logo.png create mode 100644 src/assets/logo@2x.png create mode 100644 src/axios/apiConfig.js create mode 100644 src/axios/index.js create mode 100644 src/components/ChinaCo2Content.vue create mode 100644 src/components/ChinaCo2ContentBottom.vue create mode 100644 src/components/ChinaCo2ContentTop.vue create mode 100644 src/components/ChinaCo2Left.vue create mode 100644 src/components/ChinaCo2LeftBottom.vue create mode 100644 src/components/ChinaCo2LeftTop.vue create mode 100644 src/components/ChinaCo2Right.vue create mode 100644 src/components/ChinaCo2RightBottom.vue create mode 100644 src/components/ChinaCo2RightTop.vue create mode 100644 src/components/DetailsCo2Left.vue create mode 100644 src/components/DetailsCo2LeftBottom.vue create mode 100644 src/components/DetailsCo2LeftContent.vue create mode 100644 src/components/DetailsCo2LeftTop.vue create mode 100644 src/components/DetailsCo2Right.vue create mode 100644 src/components/DetailsCo2RightContent.vue create mode 100644 src/components/IndexBottom.vue create mode 100644 src/components/IndexContent.vue create mode 100644 src/components/IndexContentLeft.vue create mode 100644 src/components/IndexContentRight.vue create mode 100644 src/components/IndexContentRightBottom.vue create mode 100644 src/components/IndexContentRightTop.vue create mode 100644 src/components/IndexTop.vue create mode 100644 src/components/demo.vue create mode 100644 src/components/lefttext.vue create mode 100644 src/echartsjs/echarts.js create mode 100644 src/echartsjs/world_map.js create mode 100644 src/images/bg.jpg create mode 100644 src/images/head_bg.png create mode 100644 src/images/inp.png create mode 100644 src/json/1990.json create mode 100644 src/json/world.json create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/store/index.js create mode 100644 src/views/ChinaCo2.vue create mode 100644 src/views/DetailsCo2.vue create mode 100644 src/views/Index.vue create mode 100644 src/views/text.vue create mode 100644 static/.gitkeep diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..3a280ba --- /dev/null +++ b/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"] +} diff --git a/.d.ts b/.d.ts new file mode 100644 index 0000000..88178be --- /dev/null +++ b/.d.ts @@ -0,0 +1,4 @@ +declare module 'vue-gemini-scrollbar' { + const vis: any; + export default vis; +} \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..541a820 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..eee3e92 --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/build/build.js b/build/build.js new file mode 100644 index 0000000..8f2ad8a --- /dev/null +++ b/build/build.js @@ -0,0 +1,41 @@ +'use strict' +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, (err, stats) => { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. + chunks: false, + chunkModules: false + }) + '\n\n') + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/build/check-versions.js b/build/check-versions.js new file mode 100644 index 0000000..3ef972a --- /dev/null +++ b/build/check-versions.js @@ -0,0 +1,54 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') + +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + + console.log() + process.exit(1) + } +} diff --git a/build/logo.png b/build/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 { + const notifier = require('node-notifier') + + return (severity, errors) => { + if (severity !== 'error') return + + const error = errors[0] + const filename = error.file && error.file.split('!').pop() + + notifier.notify({ + title: packageConfig.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js new file mode 100644 index 0000000..33ed58b --- /dev/null +++ b/build/vue-loader.conf.js @@ -0,0 +1,22 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' +const sourceMapEnabled = isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + cssSourceMap: sourceMapEnabled, + cacheBusting: config.dev.cacheBusting, + transformToRequire: { + video: ['src', 'poster'], + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js new file mode 100644 index 0000000..a07e683 --- /dev/null +++ b/build/webpack.base.conf.js @@ -0,0 +1,82 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + + + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + } + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + }, + node: { + // prevent webpack from injecting useless setImmediate polyfill because Vue + // source contains it (although only uses it if it's native). + setImmediate: false, + // prevent webpack from injecting mocks to Node native modules + // that does not make sense for the client + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty', + child_process: 'empty' + } +} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js new file mode 100644 index 0000000..070ae22 --- /dev/null +++ b/build/webpack.dev.conf.js @@ -0,0 +1,95 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const path = require('path') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') +const portfinder = require('portfinder') + +const HOST = process.env.HOST +const PORT = process.env.PORT && Number(process.env.PORT) + +const devWebpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) + }, + // cheap-module-eval-source-map is faster for development + devtool: config.dev.devtool, + + // these devServer options should be customized in /config/index.js + devServer: { + clientLogLevel: 'warning', + historyApiFallback: { + rewrites: [ + { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, + ], + }, + hot: true, + contentBase: false, // since we use CopyWebpackPlugin. + compress: true, + host: HOST || config.dev.host, + port: PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + overlay: config.dev.errorOverlay + ? { warnings: false, errors: true } + : false, + publicPath: config.dev.assetsPublicPath, + proxy: config.dev.proxyTable, + quiet: true, // necessary for FriendlyErrorsPlugin + watchOptions: { + poll: config.dev.poll, + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.dev.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + // publish the new Port, necessary for e2e tests + process.env.PORT = port + // add port to devServer config + devWebpackConfig.devServer.port = port + + // Add FriendlyErrorsPlugin + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ + compilationSuccessInfo: { + messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], + }, + onErrors: config.dev.notifyOnErrors + ? utils.createNotifierCallback() + : undefined + })) + + resolve(devWebpackConfig) + } + }) +}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js new file mode 100644 index 0000000..d9f99f6 --- /dev/null +++ b/build/webpack.prod.conf.js @@ -0,0 +1,145 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') +const UglifyJsPlugin = require('uglifyjs-webpack-plugin') + +const env = require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true, + usePostCSS: true + }) + }, + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + new UglifyJsPlugin({ + uglifyOptions: { + compress: { + warnings: false + } + }, + sourceMap: config.build.productionSourceMap, + parallel: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css'), + // Setting the following option to `false` will not extract CSS from codesplit chunks. + // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. + // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, + // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 + allChunks: true, + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: config.build.productionSourceMap + ? { safe: true, map: { inline: false } } + : { safe: true } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vendor modules does not change + new webpack.HashedModuleIdsPlugin(), + // enable scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + // This instance extracts shared chunks from code splitted chunks and bundles them + // in a separate chunk, similar to the vendor chunk + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }), + + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/config/dev.env.js b/config/dev.env.js new file mode 100644 index 0000000..c17004b --- /dev/null +++ b/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}); \ No newline at end of file diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..92c9c5f --- /dev/null +++ b/config/index.js @@ -0,0 +1,98 @@ +'use strict' +// Template version: 1.3.1 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + // host: 'localhost', // can be overwritten by process.env.HOST + host: '0.0.0.0', // can be overwritten by process.env.HOST + // port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + port: 80, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-module-eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + cssSourceMap: true + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + }, + publicPath: './', + lintOnSave: true, + configureWebpack: { + //关闭 webpack 的性能提示 + performance: { + hints: false + } + + }, + devServer: { + proxy: { + // '/api': { + // target: 'http://124.71.168.125:5000/', //后端接口地址 + // changeOrigin: true, //是否允许跨越 + // pathRewrite: { + // '^/api': '/api' //重写, + // } + // }, + '/api': { + target: 'http://127.0.0.1:5000/', //后端接口地址 + changeOrigin: true, //是否允许跨越 + pathRewrite: { + '^/api': '/api' //重写, + } + } + } + } + +} diff --git a/config/prod.env.js b/config/prod.env.js new file mode 100644 index 0000000..a6f9976 --- /dev/null +++ b/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..706d566 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + demo + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..037c17d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15017 @@ +{ + "name": "demo", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "demo", + "version": "1.0.0", + "dependencies": { + "axios": "^1.3.4", + "echarts": "^4.8.0", + "echarts-stat": "^1.2.0", + "echarts-wordcloud": "^1.1.3", + "vue": "^2.5.2", + "vuex": "^3.6.2" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-loader": "^7.1.1", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "chalk": "^2.0.1", + "copy-webpack-plugin": "^4.0.1", + "css-loader": "^0.28.0", + "element-ui": "^2.15.13", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-gemini-scrollbar": "^2.0.1", + "vue-loader": "^13.3.0", + "vue-router": "^3.5.1", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ==", + "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", + "dev": true, + "dependencies": { + "acorn": "^4.0.3" + } + }, + "node_modules/acorn-dynamic-import/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "dev": true + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", + "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", + "dev": true, + "dependencies": { + "babel-runtime": "6.x" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "dependencies": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + }, + "bin": { + "autoprefixer-info": "bin/autoprefixer-info" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha512-TYX2QQATKA6Wssp6j7jqlw4QLmABDN1olRdEHndYvBXdaXM5dcx6j5rN0+nd+aVL+Th40fAEYvvw/Xxd/LETuQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", + "dev": true, + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha512-SFbWewr0/0U4AiRzsHqwsbOQeLXVa9T1ELdqEa2efcQB5KopTnunAqoj07TuHlN2lfTQNPGO/rJR4FMln5fVcA==", + "dev": true, + "dependencies": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==", + "dev": true + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "babel-core": "6", + "webpack": "2 || 3 || 4" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", + "dev": true + }, + "node_modules/babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha512-EbciFN5Jb9iqU9bqaLmmFLx2G8pAUsvpWJ6OzOWBNrSY9qTohXj+7YfZx6Ug1Qqh7tCb1EA7Jvn9bMC1HBiucg==", + "dev": true + }, + "node_modules/babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", + "dev": true + }, + "node_modules/babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", + "dev": true + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", + "dev": true + }, + "node_modules/babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha512-uT7eovUxtXe8Q2ufcjRuJIOL0hg6VAUJhiWJBLxH/evYAw+aqoJLcYTR8hqx13iOx/FfbCMHgBmXWZjukbkyPg==", + "dev": true, + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", + "dev": true, + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha512-skQ2CImwDkCHu0mkWvCOlBCpBIHW4/49IZWVwV4A/EnWjL9bB6UBvLyMNe3Td5XDStSZNhe69j4bfEW8dvUbew==", + "dev": true, + "dependencies": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-vue-jsx": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz", + "integrity": "sha512-W39X07/n3oJMQd8tALBO+440NraGSF//Lo1ydd/9Nme3+QiRGFBb1Q39T9iixh0jZPPbfv3so18tNoIgLatymw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "peerDependencies": { + "babel-helper-vue-jsx-merge-props": "^2.0.0" + } + }, + "node_modules/babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "node_modules/babel-preset-env/node_modules/browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha512-9F+nquz+37PrlTSBdpeQBKnQfAMNBnryXw+m4qBh35FNbJPfzZz+sjN2G5Uf1CRedU9PH7fJkTbYijxmkLX8Og==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "node_modules/babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha512-eCbEOF8uN0KypFXJmZXn2sTk7bPV9uM5xov7G/7BM08TbQEObsVs0cEWfy6NQySlfk7JBi/t+XJP1JkruYfthA==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bfj-node4": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.3.1.tgz", + "integrity": "sha512-SOmOsowQWfXc7ybFARsK3C4MCOWzERaOMV/Fl3Tgjs+5dJWyzo3oa127jL44eMbQiAN17J7SvAs2TRxEScTUmg==", + "deprecated": "Switch to the `bfj` package for fixes and new features!", + "dev": true, + "dependencies": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "tryer": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q==", + "dev": true, + "dependencies": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-api/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/caniuse-db": { + "version": "1.0.30001473", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001473.tgz", + "integrity": "sha512-Acmbmkrm6HlPiDcOn/Qlxga6jXGix9/y3vwzu8zHwcRCwAqAc5zPkuxjqpoi+JOlG6fY85phdVLdCE1gK1n2yA==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001473", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", + "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dev": true, + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", + "dev": true, + "dependencies": { + "q": "^1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA==", + "dev": true, + "dependencies": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ==", + "dev": true, + "dependencies": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha512-PZFskfj64QnpKVK9cPdY36pyWEhZNM+srRVqtwMiVTlnViSoZcvX35PpBhhUcyLTHXYvz7pZRmxvsqwzJqg9kA==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "dependencies": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-declaration-sorter/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "engines": { + "node": ">=0.12.0 || >= 4.3.0 < 5.0.0 || >=5.10" + } + }, + "node_modules/css-loader/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-loader/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/css-loader/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg==", + "dev": true, + "dependencies": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cssnano-preset-default/node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/cssnano-preset-default/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/cssnano-preset-default/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssnano-preset-default/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cssnano-preset-default/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/cssnano-preset-default/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/cssnano-preset-default/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cssnano-preset-default/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-calc/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/cssnano-preset-default/node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ==", + "dev": true, + "dependencies": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/cssnano/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/cssnano/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cssnano/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/cssnano/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w==", + "dev": true, + "dependencies": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "bin": { + "csso": "bin/csso" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", + "dev": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A==", + "dev": true, + "dependencies": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/echarts": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz", + "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==", + "dependencies": { + "zrender": "4.3.2" + } + }, + "node_modules/echarts-stat": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/echarts-stat/-/echarts-stat-1.2.0.tgz", + "integrity": "sha512-zLd7Kgs+tuTSeaK0VQEMNmnMivEkhvHIk1gpBtLzpRerfcIQ+Bd5XudOMmtwpaTc1WDZbA7d1V//iiBccR46Qg==" + }, + "node_modules/echarts-wordcloud": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/echarts-wordcloud/-/echarts-wordcloud-1.1.3.tgz", + "integrity": "sha512-Et8D5xEAoYkidmHun+hEH+2lF9dhCt6D0JJ390vlr2r/1zwhhZAbcL01CEvG93QcMcJpSvSPK8vRiGkTbMHRxg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.348", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz", + "integrity": "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==", + "dev": true + }, + "node_modules/element-ui": { + "version": "2.15.13", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz", + "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==", + "dev": true, + "dependencies": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + }, + "peerDependencies": { + "vue": "^2.5.17" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-set/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", + "dev": true, + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha512-bbB5tEuvC+SuRUG64X8ghvjgiRniuA4WlehWbFnoN4z6TxDXpyX+BMHF7rMgZAqoe+EbyNRUbHN0uuP9phy5jQ==", + "dev": true, + "dependencies": { + "original": ">=0.0.5" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "deprecated": "Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin", + "dev": true, + "dependencies": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^3.1.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gemini-scrollbar": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/gemini-scrollbar/-/gemini-scrollbar-1.5.3.tgz", + "integrity": "sha512-3Q4SrxkJ+ei+I5PlcRZCfPePv3EduP7xusOWp7Uw0+XywEWred7Nq9hoaP2IQh1vRjoidaVODV3rO3icFH/e5A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", + "integrity": "sha512-1g6EPVvIHuPmpAdBBpsIVYLgjzGV/QqcFRJXpMyrqEWG10JhOaTjQeCcjMDyX0Iqfm/Q5M9twR/mbDk5f5MqkA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha512-TKQYvHTJYUwPgXzwUF3EwPPkyQyvzfz+6s8Fw2eamxl0cRin1tDnYppcDYWz8UIoYMX4CgatplRq18odzmpAWw==", + "deprecated": "out of support", + "dev": true, + "dependencies": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "peerDependencies": { + "webpack": "1 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", + "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", + "dev": true, + "dependencies": { + "http-proxy": "^1.18.1", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha512-DzGfTasXPmwizQP4XV2rR6r2vp8TjlOpMnJqG9Iy2i1pl1lkZdZj5rSpIc7YFGX2nS46PPgAGEyT+Q5hE2FB2g==", + "dev": true, + "dependencies": { + "meow": "^3.3.0" + }, + "bin": { + "internal-ip": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw==", + "dev": true, + "dependencies": { + "html-comment-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.4", + "webpack-sources": "^1.0.1" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-expression-evaluator": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", + "integrity": "sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.1.tgz", + "integrity": "sha512-FSoF15xKSEM2qCE3/y2gH92PysJSBY58Wx/hmSdIzVSOd0vg+FRS28NWZADId1wh6PDlbVt0lfPduV0IBufItQ==", + "dev": true, + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^2.1.2" + } + }, + "node_modules/optimize-css-assets-webpack-plugin/node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/optimize-css-assets-webpack-plugin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/optimize-css-assets-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "dev": true, + "dependencies": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q==", + "dev": true, + "dependencies": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "node_modules/postcss-calc/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-calc/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-calc/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w==", + "dev": true, + "dependencies": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/postcss-colormin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-colormin/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-colormin/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA==", + "dev": true, + "dependencies": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "node_modules/postcss-convert-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-convert-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-convert-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg==", + "dev": true, + "dependencies": { + "postcss": "^5.0.14" + } + }, + "node_modules/postcss-discard-comments/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-comments/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og==", + "dev": true, + "dependencies": { + "postcss": "^5.0.14" + } + }, + "node_modules/postcss-discard-empty/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-empty/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA==", + "dev": true, + "dependencies": { + "postcss": "^5.0.16" + } + }, + "node_modules/postcss-discard-overridden/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-overridden/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg==", + "dev": true, + "dependencies": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-unused/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-filter-plugins/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-filter-plugins/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha512-WKS5LJMZLWGwtfhs5ahb2ycpoYF3m0kK4QEaM+elr5EpiMt0H296P/9ETa13WXzjPwB0DDTBiUBBWSHoApQIJg==", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-options/node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-options/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha512-/WGUMYhKiryWjYO6c7kAcqMuD7DVkaQ8HcbQenDme/d3OBOmrYMFObOKgUWyUy1uih5U2Dakq8H6VcJi5C9wHQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-plugins/node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-plugins/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/postcss-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/postcss-loader/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/postcss-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA==", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "node_modules/postcss-merge-idents/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-idents/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-longhand/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q==", + "dev": true, + "dependencies": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/postcss-merge-rules/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-rules/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA==", + "dev": true + }, + "node_modules/postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "node_modules/postcss-minify-font-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-font-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q==", + "dev": true, + "dependencies": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-gradients/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-minify-params/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-params/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-params/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-selectors/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ==", + "dev": true, + "dependencies": { + "postcss": "^5.0.5" + } + }, + "node_modules/postcss-normalize-charset/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-normalize-charset/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-unicode/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/postcss-normalize-url/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-normalize-url/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "node_modules/postcss-ordered-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-ordered-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "node_modules/postcss-reduce-idents/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-idents/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA==", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-reduce-initial/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-initial/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ==", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==", + "dev": true, + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "node_modules/postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ==", + "dev": true, + "dependencies": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "node_modules/postcss-svgo/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-svgo/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-svgo/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-unique-selectors/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-url": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", + "dev": true, + "dependencies": { + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w==", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-zindex/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-zindex/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-zindex/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==", + "dev": true, + "dependencies": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + } + }, + "node_modules/reduce-css-calc/node_modules/balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==", + "dev": true + }, + "node_modules/reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q==", + "dev": true, + "dependencies": { + "ajv": "^5.0.0" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha512-/YF5Uk8hcwi7ima04ppkbA4RaRMdPMBfwAvAf8sufYOxsJRtbdoBsT8vGvlb+799BrlGdYrd+oczIA2eN2JdWA==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "iojs": "*", + "node": ">=0.11.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "node_modules/sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha512-PmPRkAYIeuRgX+ZSieViT4Z3Q23bLS2Itm/ck1tSf5P0/yVuFDiI5q9mcnpXoMdToaPSRS9MEyUx/aaBxrFzyw==", + "dev": true, + "dependencies": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/stylehacks/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks/node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo/node_modules/js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", + "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dev": true, + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "node_modules/uglify-es/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true, + "optional": true + }, + "node_modules/uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "dependencies": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "mime": "1.3.x" + }, + "peerDependencies": { + "file-loader": "*" + } + }, + "node_modules/url-loader/node_modules/mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha512-a/kG+3WTtU8GJG1ngpkkHOHcH6zNjGrI47OQyoFsFBN0QpYYJ4u2yEORsGK5cZMI+cfu9HbSCCfGfRzG0fWE9A==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vue": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-gemini-scrollbar": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vue-gemini-scrollbar/-/vue-gemini-scrollbar-2.0.1.tgz", + "integrity": "sha512-oCh5akImSX9Hbe9agMx1GdL9I8uSGULUxEw+kthVHe7azkDG8M2x7gxv1ox9tHUyHCPzO5sfQnxsHRvyQCy6Dw==", + "dev": true, + "dependencies": { + "gemini-scrollbar": "^1.5.3" + }, + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "node_modules/vue-loader": { + "version": "13.7.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.3.tgz", + "integrity": "sha512-ACCwbfeC6HjY2pnDii+Zer+MZ6sdOtwvLmDXRK/BoD3WNR551V22R6KEagwHoTRJ0ZlIhpCBkptpCU6+Ri/05w==", + "dev": true, + "dependencies": { + "consolidate": "^0.14.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "lru-cache": "^4.1.1", + "postcss": "^6.0.8", + "postcss-load-config": "^1.1.0", + "postcss-selector-parser": "^2.0.0", + "prettier": "^1.7.0", + "resolve": "^1.4.0", + "source-map": "^0.6.1", + "vue-hot-reload-api": "^2.2.0", + "vue-style-loader": "^3.0.0", + "vue-template-es2015-compiler": "^1.6.0" + }, + "peerDependencies": { + "css-loader": "*", + "vue-template-compiler": "^2.0.0" + } + }, + "node_modules/vue-loader/node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/vue-loader/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-loader/node_modules/postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha512-3fpCfnXo9Qd/O/q/XL4cJUhRsqjVD2V1Vhy3wOEcLE5kz0TGtdDXJSoiTdH4e847KphbEac4+EZSH4qLRYIgLw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/vue-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", + "dev": true + }, + "node_modules/vue-style-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz", + "integrity": "sha512-ICtVdK/p+qXWpdSs2alWtsXt9YnDoYjQe0w5616j9+/EhjoxZkbun34uWgsMFnC1MhrMMwaWiImz3K2jK1Yp2Q==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "dependencies": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.1.tgz", + "integrity": "sha512-rwxyfecTAxoarCC9VlHlIpfQCmmJ/qWD5bpbjkof+7HrNhTNZIwZITxN6CdlYL2axGmwNUQ+tFgcSOiNXMf/sQ==", + "dev": true, + "dependencies": { + "acorn": "^5.3.0", + "bfj-node4": "^5.2.0", + "chalk": "^2.3.0", + "commander": "^2.13.0", + "ejs": "^2.5.7", + "express": "^4.16.2", + "filesize": "^3.5.11", + "gzip-size": "^4.1.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "opener": "^1.4.3", + "ws": "^4.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "dependencies": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "engines": { + "node": ">=0.6" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.1.2", + "compression": "^1.7.3", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">=4.7" + }, + "peerDependencies": { + "webpack": "^2.2.0 || ^3.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha512-+QQWqC2xeL0N5/TE+TY6OGEqyNRM+g2/r712PDNYgiCdXYCApXf1vzfmDSLBxfGRwV+moTq/V8FnMI24JCm2Yg==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/webpack/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/webpack/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/webpack/node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/webpack/node_modules/uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha512-TNM20HMW67kxHRNCZdvLyiwE1ST6WyY5Ae+TG55V81NpvNwJ9+V4/po4LHA1R9afV/WrqzfedG2UJCk2+swirw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + }, + "peerDependencies": { + "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "dependencies": { + "cuint": "^0.2.2" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/zrender": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz", + "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..56d1ea2 --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "demo", + "version": "1.0.0", + "description": "A Vue.js project", + "author": "BaiReCha <2245523304@qq.com>", + "private": true, + "scripts": { + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev", + "build": "node build/build.js" + }, + "dependencies": { + "axios": "^1.3.4", + "echarts": "^4.8.0", + "echarts-stat": "^1.2.0", + "echarts-wordcloud": "^1.1.3", + "vue": "^2.5.2", + "vuex": "^3.6.2" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-loader": "^7.1.1", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "chalk": "^2.0.1", + "copy-webpack-plugin": "^4.0.1", + "css-loader": "^0.28.0", + "element-ui": "^2.15.13", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-gemini-scrollbar": "^2.0.1", + "vue-loader": "^13.3.0", + "vue-router": "^3.5.1", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..2fdccf5 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,319 @@ + + + + + \ No newline at end of file diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 VkD~A98 literal 0 HcmV?d00001 diff --git a/src/axios/apiConfig.js b/src/axios/apiConfig.js new file mode 100644 index 0000000..cc60eaa --- /dev/null +++ b/src/axios/apiConfig.js @@ -0,0 +1,29 @@ +const apiConfig = { + apiFun() { + let baseUrl = {}; + switch (1) { + case 1: + baseUrl = { + //本地 + api: '127.0.0.1:5000' + }; + break; + case 2: + baseUrl = { + // 线上测试环境 + api: '', + }; + break; + case 3: + baseUrl = { + // 线上正式环境 + api: '', + }; + break; + default: + break; + } + return baseUrl + } +}; +export default apiConfig.apiFun() diff --git a/src/axios/index.js b/src/axios/index.js new file mode 100644 index 0000000..23cd9b1 --- /dev/null +++ b/src/axios/index.js @@ -0,0 +1,51 @@ +import Vue from 'vue'; +import axios from "axios"; +import store from "../store" +import apiConfig from "./apiConfig"; +import $api from '../axios/apiConfig' //接口 + +//接口 +for (let k in apiConfig) { + Vue.prototype[k] = apiConfig[k]; +} +const Axios = axios.create({ + timeout: 20000, + responseType: "json", + headers: { + 'Content-Type': 'application/json', + } +}); +let loadAll; +Axios.interceptors.request.use( + config => { + let userInfo = JSON.parse(window.localStorage.getItem('userInfo') || '{}'); + // 添加token + if (userInfo && userInfo.accessToken) { + config.headers['Authorization'] = userInfo.accessToken; + } else { + window.localStorage.clear() + } + if (config.mask !== false) { + loadAll = Loading.service({ + lock: true, + text: '加载中', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + } + return config; + }, + err => { + return Promise.reject(err); + }); + +Axios.interceptors.response.use( + response => { + setTimeout(() => { + loadAll.close(); + }, 500); + if (response.data.code === 200) { + //操作成功返回数据 + return response.data; + } + }) \ No newline at end of file diff --git a/src/components/ChinaCo2Content.vue b/src/components/ChinaCo2Content.vue new file mode 100644 index 0000000..6b36e9f --- /dev/null +++ b/src/components/ChinaCo2Content.vue @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2ContentBottom.vue b/src/components/ChinaCo2ContentBottom.vue new file mode 100644 index 0000000..a187d0c --- /dev/null +++ b/src/components/ChinaCo2ContentBottom.vue @@ -0,0 +1,359 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2ContentTop.vue b/src/components/ChinaCo2ContentTop.vue new file mode 100644 index 0000000..d5d8834 --- /dev/null +++ b/src/components/ChinaCo2ContentTop.vue @@ -0,0 +1,276 @@ + + + + + + + + diff --git a/src/components/ChinaCo2Left.vue b/src/components/ChinaCo2Left.vue new file mode 100644 index 0000000..c262335 --- /dev/null +++ b/src/components/ChinaCo2Left.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2LeftBottom.vue b/src/components/ChinaCo2LeftBottom.vue new file mode 100644 index 0000000..e61ec79 --- /dev/null +++ b/src/components/ChinaCo2LeftBottom.vue @@ -0,0 +1,130 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2LeftTop.vue b/src/components/ChinaCo2LeftTop.vue new file mode 100644 index 0000000..0e33de7 --- /dev/null +++ b/src/components/ChinaCo2LeftTop.vue @@ -0,0 +1,86 @@ + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2Right.vue b/src/components/ChinaCo2Right.vue new file mode 100644 index 0000000..809c342 --- /dev/null +++ b/src/components/ChinaCo2Right.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2RightBottom.vue b/src/components/ChinaCo2RightBottom.vue new file mode 100644 index 0000000..ee6c8c9 --- /dev/null +++ b/src/components/ChinaCo2RightBottom.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/src/components/ChinaCo2RightTop.vue b/src/components/ChinaCo2RightTop.vue new file mode 100644 index 0000000..4c9be48 --- /dev/null +++ b/src/components/ChinaCo2RightTop.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2Left.vue b/src/components/DetailsCo2Left.vue new file mode 100644 index 0000000..6388371 --- /dev/null +++ b/src/components/DetailsCo2Left.vue @@ -0,0 +1,32 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2LeftBottom.vue b/src/components/DetailsCo2LeftBottom.vue new file mode 100644 index 0000000..21365c2 --- /dev/null +++ b/src/components/DetailsCo2LeftBottom.vue @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2LeftContent.vue b/src/components/DetailsCo2LeftContent.vue new file mode 100644 index 0000000..a6cf9ea --- /dev/null +++ b/src/components/DetailsCo2LeftContent.vue @@ -0,0 +1,215 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2LeftTop.vue b/src/components/DetailsCo2LeftTop.vue new file mode 100644 index 0000000..0753657 --- /dev/null +++ b/src/components/DetailsCo2LeftTop.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2Right.vue b/src/components/DetailsCo2Right.vue new file mode 100644 index 0000000..5fec924 --- /dev/null +++ b/src/components/DetailsCo2Right.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/components/DetailsCo2RightContent.vue b/src/components/DetailsCo2RightContent.vue new file mode 100644 index 0000000..72ab808 --- /dev/null +++ b/src/components/DetailsCo2RightContent.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file diff --git a/src/components/IndexBottom.vue b/src/components/IndexBottom.vue new file mode 100644 index 0000000..0355f78 --- /dev/null +++ b/src/components/IndexBottom.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/src/components/IndexContent.vue b/src/components/IndexContent.vue new file mode 100644 index 0000000..1b8887a --- /dev/null +++ b/src/components/IndexContent.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/components/IndexContentLeft.vue b/src/components/IndexContentLeft.vue new file mode 100644 index 0000000..afc6369 --- /dev/null +++ b/src/components/IndexContentLeft.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/components/IndexContentRight.vue b/src/components/IndexContentRight.vue new file mode 100644 index 0000000..cdafd33 --- /dev/null +++ b/src/components/IndexContentRight.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/src/components/IndexContentRightBottom.vue b/src/components/IndexContentRightBottom.vue new file mode 100644 index 0000000..0cd09fc --- /dev/null +++ b/src/components/IndexContentRightBottom.vue @@ -0,0 +1,128 @@ + + + + + \ No newline at end of file diff --git a/src/components/IndexContentRightTop.vue b/src/components/IndexContentRightTop.vue new file mode 100644 index 0000000..5a8b7e5 --- /dev/null +++ b/src/components/IndexContentRightTop.vue @@ -0,0 +1,384 @@ + + + + + + \ No newline at end of file diff --git a/src/components/IndexTop.vue b/src/components/IndexTop.vue new file mode 100644 index 0000000..157d729 --- /dev/null +++ b/src/components/IndexTop.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/src/components/demo.vue b/src/components/demo.vue new file mode 100644 index 0000000..76a7892 --- /dev/null +++ b/src/components/demo.vue @@ -0,0 +1,52 @@ + + + + + + \ No newline at end of file diff --git a/src/components/lefttext.vue b/src/components/lefttext.vue new file mode 100644 index 0000000..bac32a2 --- /dev/null +++ b/src/components/lefttext.vue @@ -0,0 +1,218 @@ + diff --git a/src/echartsjs/echarts.js b/src/echartsjs/echarts.js new file mode 100644 index 0000000..297dd59 --- /dev/null +++ b/src/echartsjs/echarts.js @@ -0,0 +1,95739 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.echarts = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var Browser = (function () { + function Browser() { + this.firefox = false; + this.ie = false; + this.edge = false; + this.newEdge = false; + this.weChat = false; + } + return Browser; + }()); + var Env = (function () { + function Env() { + this.browser = new Browser(); + this.node = false; + this.wxa = false; + this.worker = false; + this.svgSupported = false; + this.touchEventsSupported = false; + this.pointerEventsSupported = false; + this.domSupported = false; + this.transformSupported = false; + this.transform3dSupported = false; + this.hasGlobalWindow = typeof window !== 'undefined'; + } + return Env; + }()); + var env = new Env(); + if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + env.wxa = true; + env.touchEventsSupported = true; + } + else if (typeof document === 'undefined' && typeof self !== 'undefined') { + env.worker = true; + } + else if (typeof navigator === 'undefined') { + env.node = true; + env.svgSupported = true; + } + else { + detect(navigator.userAgent, env); + } + function detect(ua, env) { + var browser = env.browser; + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE\s([\d.]+)/) + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge?\/([\d.]+)/); + var weChat = (/micromessenger/i).test(ua); + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (edge) { + browser.edge = true; + browser.version = edge[1]; + browser.newEdge = +edge[1].split('.')[0] > 18; + } + if (weChat) { + browser.weChat = true; + } + env.svgSupported = typeof SVGRect !== 'undefined'; + env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge; + env.pointerEventsSupported = 'onpointerdown' in window + && (browser.edge || (browser.ie && +browser.version >= 11)); + env.domSupported = typeof document !== 'undefined'; + var style = document.documentElement.style; + env.transform3dSupported = ((browser.ie && 'transition' in style) + || browser.edge + || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix())) + || 'MozPerspective' in style) + && !('OTransition' in style); + env.transformSupported = env.transform3dSupported + || (browser.ie && +browser.version >= 9); + } + + var DEFAULT_FONT_SIZE = 12; + var DEFAULT_FONT_FAMILY = 'sans-serif'; + var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY; + var OFFSET = 20; + var SCALE = 100; + var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"; + function getTextWidthMap(mapStr) { + var map = {}; + if (typeof JSON === 'undefined') { + return map; + } + for (var i = 0; i < mapStr.length; i++) { + var char = String.fromCharCode(i + 32); + var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE; + map[char] = size; + } + return map; + } + var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr); + var platformApi = { + createCanvas: function () { + return typeof document !== 'undefined' + && document.createElement('canvas'); + }, + measureText: (function () { + var _ctx; + var _cachedFont; + return function (text, font) { + if (!_ctx) { + var canvas = platformApi.createCanvas(); + _ctx = canvas && canvas.getContext('2d'); + } + if (_ctx) { + if (_cachedFont !== font) { + _cachedFont = _ctx.font = font || DEFAULT_FONT; + } + return _ctx.measureText(text); + } + else { + text = text || ''; + font = font || DEFAULT_FONT; + var res = /(\d+)px/.exec(font); + var fontSize = res && +res[1] || DEFAULT_FONT_SIZE; + var width = 0; + if (font.indexOf('mono') >= 0) { + width = fontSize * text.length; + } + else { + for (var i = 0; i < text.length; i++) { + var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]]; + width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize); + } + } + return { width: width }; + } + }; + })(), + loadImage: function (src, onload, onerror) { + var image = new Image(); + image.onload = onload; + image.onerror = onerror; + image.src = src; + return image; + } + }; + function setPlatformAPI(newPlatformApis) { + for (var key in platformApi) { + if (newPlatformApis[key]) { + platformApi[key] = newPlatformApis[key]; + } + } + } + + var BUILTIN_OBJECT = reduce([ + 'Function', + 'RegExp', + 'Date', + 'Error', + 'CanvasGradient', + 'CanvasPattern', + 'Image', + 'Canvas' + ], function (obj, val) { + obj['[object ' + val + ']'] = true; + return obj; + }, {}); + var TYPED_ARRAY = reduce([ + 'Int8', + 'Uint8', + 'Uint8Clamped', + 'Int16', + 'Uint16', + 'Int32', + 'Uint32', + 'Float32', + 'Float64' + ], function (obj, val) { + obj['[object ' + val + 'Array]'] = true; + return obj; + }, {}); + var objToString = Object.prototype.toString; + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var ctorFunction = function () { }.constructor; + var protoFunction = ctorFunction ? ctorFunction.prototype : null; + var protoKey = '__proto__'; + var idStart = 0x0907; + function guid() { + return idStart++; + } + function logError() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (typeof console !== 'undefined') { + console.error.apply(console, args); + } + } + function clone(source) { + if (source == null || typeof source !== 'object') { + return source; + } + var result = source; + var typeStr = objToString.call(source); + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (Ctor.from) { + result = Ctor.from(source); + } + else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = source[i]; + } + } + } + } + else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + result[key] = clone(source[key]); + } + } + } + return result; + } + function merge(target, source, overwrite) { + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + var targetProp = target[key]; + var sourceProp = source[key]; + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp)) { + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + target[key] = clone(source[key]); + } + } + } + return target; + } + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + function extend(target, source) { + if (Object.assign) { + Object.assign(target, source); + } + else { + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + target[key] = source[key]; + } + } + } + return target; + } + function defaults(target, source, overlay) { + var keysArr = keys(source); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if ((overlay ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + return target; + } + var createCanvas = platformApi.createCanvas; + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() { } + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + for (var prop in clazzPrototype) { + if (clazzPrototype.hasOwnProperty(prop)) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + function mixin(target, source, override) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + if (Object.getOwnPropertyNames) { + var keyList = Object.getOwnPropertyNames(source); + for (var i = 0; i < keyList.length; i++) { + var key = keyList[i]; + if (key !== 'constructor') { + if ((override ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + } + } + else { + defaults(target, source, override); + } + } + function isArrayLike(data) { + if (!data) { + return false; + } + if (typeof data === 'string') { + return false; + } + return typeof data.length === 'number'; + } + function each(arr, cb, context) { + if (!(arr && cb)) { + return; + } + if (arr.forEach && arr.forEach === nativeForEach) { + arr.forEach(cb, context); + } + else if (arr.length === +arr.length) { + for (var i = 0, len = arr.length; i < len; i++) { + cb.call(context, arr[i], i, arr); + } + } + else { + for (var key in arr) { + if (arr.hasOwnProperty(key)) { + cb.call(context, arr[key], key, arr); + } + } + } + } + function map(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.map && arr.map === nativeMap) { + return arr.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + result.push(cb.call(context, arr[i], i, arr)); + } + return result; + } + } + function reduce(arr, cb, memo, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + memo = cb.call(context, memo, arr[i], i, arr); + } + return memo; + } + function filter(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.filter && arr.filter === nativeFilter) { + return arr.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + result.push(arr[i]); + } + } + return result; + } + } + function find(arr, cb, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + return arr[i]; + } + } + } + function keys(obj) { + if (!obj) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keyList = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keyList.push(key); + } + } + return keyList; + } + function bindPolyfill(func, context) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + var bind = (protoFunction && isFunction(protoFunction.bind)) + ? protoFunction.call.bind(protoFunction.bind) + : bindPolyfill; + function curry(func) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + function isArray(value) { + if (Array.isArray) { + return Array.isArray(value); + } + return objToString.call(value) === '[object Array]'; + } + function isFunction(value) { + return typeof value === 'function'; + } + function isString(value) { + return typeof value === 'string'; + } + function isStringSafe(value) { + return objToString.call(value) === '[object String]'; + } + function isNumber(value) { + return typeof value === 'number'; + } + function isObject(value) { + var type = typeof value; + return type === 'function' || (!!value && type === 'object'); + } + function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; + } + function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; + } + function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; + } + function isGradientObject(value) { + return value.colorStops != null; + } + function isImagePatternObject(value) { + return value.image != null; + } + function isRegExp(value) { + return objToString.call(value) === '[object RegExp]'; + } + function eqNaN(value) { + return value !== value; + } + function retrieve() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0, len = args.length; i < len; i++) { + if (args[i] != null) { + return args[i]; + } + } + } + function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; + } + function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; + } + function slice(arr) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return nativeSlice.apply(arr, args); + } + function normalizeCssArray(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + function trim(str) { + if (str == null) { + return null; + } + else if (typeof str.trim === 'function') { + return str.trim(); + } + else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + } + var primitiveKey = '__ec_primitive__'; + function setAsPrimitive(obj) { + obj[primitiveKey] = true; + } + function isPrimitive(obj) { + return obj[primitiveKey]; + } + var MapPolyfill = (function () { + function MapPolyfill() { + this.data = {}; + } + MapPolyfill.prototype["delete"] = function (key) { + var existed = this.has(key); + if (existed) { + delete this.data[key]; + } + return existed; + }; + MapPolyfill.prototype.has = function (key) { + return this.data.hasOwnProperty(key); + }; + MapPolyfill.prototype.get = function (key) { + return this.data[key]; + }; + MapPolyfill.prototype.set = function (key, value) { + this.data[key] = value; + return this; + }; + MapPolyfill.prototype.keys = function () { + return keys(this.data); + }; + MapPolyfill.prototype.forEach = function (callback) { + var data = this.data; + for (var key in data) { + if (data.hasOwnProperty(key)) { + callback(data[key], key); + } + } + }; + return MapPolyfill; + }()); + var isNativeMapSupported = typeof Map === 'function'; + function maybeNativeMap() { + return (isNativeMapSupported ? new Map() : new MapPolyfill()); + } + var HashMap = (function () { + function HashMap(obj) { + var isArr = isArray(obj); + this.data = maybeNativeMap(); + var thisMap = this; + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each(obj, visit)); + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } + } + HashMap.prototype.hasKey = function (key) { + return this.data.has(key); + }; + HashMap.prototype.get = function (key) { + return this.data.get(key); + }; + HashMap.prototype.set = function (key, value) { + this.data.set(key, value); + return value; + }; + HashMap.prototype.each = function (cb, context) { + this.data.forEach(function (value, key) { + cb.call(context, value, key); + }); + }; + HashMap.prototype.keys = function () { + var keys = this.data.keys(); + return isNativeMapSupported + ? Array.from(keys) + : keys; + }; + HashMap.prototype.removeKey = function (key) { + this.data["delete"](key); + }; + return HashMap; + }()); + function createHashMap(obj) { + return new HashMap(obj); + } + function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (var i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; + } + function createObject(proto, properties) { + var obj; + if (Object.create) { + obj = Object.create(proto); + } + else { + var StyleCtor = function () { }; + StyleCtor.prototype = proto; + obj = new StyleCtor(); + } + if (properties) { + extend(obj, properties); + } + return obj; + } + function disableUserSelect(dom) { + var domStyle = dom.style; + domStyle.webkitUserSelect = 'none'; + domStyle.userSelect = 'none'; + domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)'; + domStyle['-webkit-touch-callout'] = 'none'; + } + function hasOwn(own, prop) { + return own.hasOwnProperty(prop); + } + function noop() { } + var RADIAN_TO_DEGREE = 180 / Math.PI; + + var util = /*#__PURE__*/Object.freeze({ + __proto__: null, + guid: guid, + logError: logError, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + createCanvas: createCanvas, + indexOf: indexOf, + inherits: inherits, + mixin: mixin, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + find: find, + keys: keys, + bind: bind, + curry: curry, + isArray: isArray, + isFunction: isFunction, + isString: isString, + isStringSafe: isStringSafe, + isNumber: isNumber, + isObject: isObject, + isBuiltInObject: isBuiltInObject, + isTypedArray: isTypedArray, + isDom: isDom, + isGradientObject: isGradientObject, + isImagePatternObject: isImagePatternObject, + isRegExp: isRegExp, + eqNaN: eqNaN, + retrieve: retrieve, + retrieve2: retrieve2, + retrieve3: retrieve3, + slice: slice, + normalizeCssArray: normalizeCssArray, + assert: assert, + trim: trim, + setAsPrimitive: setAsPrimitive, + isPrimitive: isPrimitive, + HashMap: HashMap, + createHashMap: createHashMap, + concatArray: concatArray, + createObject: createObject, + disableUserSelect: disableUserSelect, + hasOwn: hasOwn, + noop: noop, + RADIAN_TO_DEGREE: RADIAN_TO_DEGREE + }); + + function create(x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return [x, y]; + } + function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + function clone$1(v) { + return [v[0], v[1]]; + } + function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + function len(v) { + return Math.sqrt(lenSquare(v)); + } + var length = len; + function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + var lengthSquare = lenSquare; + function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + function normalize(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + } + function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1])); + } + var dist = distance; + function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + var distSquare = distanceSquare; + function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + function applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + + var vector = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create, + copy: copy, + clone: clone$1, + set: set, + add: add, + scaleAndAdd: scaleAndAdd, + sub: sub, + len: len, + length: length, + lenSquare: lenSquare, + lengthSquare: lengthSquare, + mul: mul, + div: div, + dot: dot, + scale: scale, + normalize: normalize, + distance: distance, + dist: dist, + distanceSquare: distanceSquare, + distSquare: distSquare, + negate: negate, + lerp: lerp, + applyTransform: applyTransform, + min: min, + max: max + }); + + var Param = (function () { + function Param(target, e) { + this.target = target; + this.topTarget = e && e.topTarget; + } + return Param; + }()); + var Draggable = (function () { + function Draggable(handler) { + this.handler = handler; + handler.on('mousedown', this._dragStart, this); + handler.on('mousemove', this._drag, this); + handler.on('mouseup', this._dragEnd, this); + } + Draggable.prototype._dragStart = function (e) { + var draggingTarget = e.target; + while (draggingTarget && !draggingTarget.draggable) { + draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget; + } + if (draggingTarget) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event); + } + }; + Draggable.prototype._drag = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + var x = e.offsetX; + var y = e.offsetY; + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + draggingTarget.drift(dx, dy, e); + this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event); + var dropTarget = this.handler.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event); + } + } + } + }; + Draggable.prototype._dragEnd = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + draggingTarget.dragging = false; + } + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event); + if (this._dropTarget) { + this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event); + } + this._draggingTarget = null; + this._dropTarget = null; + }; + return Draggable; + }()); + + var Eventful = (function () { + function Eventful(eventProcessors) { + if (eventProcessors) { + this._$eventProcessor = eventProcessors; + } + } + Eventful.prototype.on = function (event, query, handler, context) { + if (!this._$handlers) { + this._$handlers = {}; + } + var _h = this._$handlers; + if (typeof query === 'function') { + context = handler; + handler = query; + query = null; + } + if (!handler || !event) { + return this; + } + var eventProcessor = this._$eventProcessor; + if (query != null && eventProcessor && eventProcessor.normalizeQuery) { + query = eventProcessor.normalizeQuery(query); + } + if (!_h[event]) { + _h[event] = []; + } + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + var wrap = { + h: handler, + query: query, + ctx: (context || this), + callAtLast: handler.zrEventfulCallAtLast + }; + var lastIndex = _h[event].length - 1; + var lastWrap = _h[event][lastIndex]; + (lastWrap && lastWrap.callAtLast) + ? _h[event].splice(lastIndex, 0, wrap) + : _h[event].push(wrap); + return this; + }; + Eventful.prototype.isSilent = function (eventName) { + var _h = this._$handlers; + return !_h || !_h[eventName] || !_h[eventName].length; + }; + Eventful.prototype.off = function (eventType, handler) { + var _h = this._$handlers; + if (!_h) { + return this; + } + if (!eventType) { + this._$handlers = {}; + return this; + } + if (handler) { + if (_h[eventType]) { + var newList = []; + for (var i = 0, l = _h[eventType].length; i < l; i++) { + if (_h[eventType][i].h !== handler) { + newList.push(_h[eventType][i]); + } + } + _h[eventType] = newList; + } + if (_h[eventType] && _h[eventType].length === 0) { + delete _h[eventType]; + } + } + else { + delete _h[eventType]; + } + return this; + }; + Eventful.prototype.trigger = function (eventType) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[eventType]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(eventType, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(hItem.ctx); + break; + case 1: + hItem.h.call(hItem.ctx, args[0]); + break; + case 2: + hItem.h.call(hItem.ctx, args[0], args[1]); + break; + default: + hItem.h.apply(hItem.ctx, args); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(eventType); + return this; + }; + Eventful.prototype.triggerWithContext = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[type]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var ctx = args[argLen - 1]; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(type, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(ctx); + break; + case 1: + hItem.h.call(ctx, args[0]); + break; + case 2: + hItem.h.call(ctx, args[0], args[1]); + break; + default: + hItem.h.apply(ctx, args.slice(1, argLen - 1)); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(type); + return this; + }; + return Eventful; + }()); + + var LN2 = Math.log(2); + function determinant(rows, rank, rowStart, rowMask, colMask, detCache) { + var cacheKey = rowMask + '-' + colMask; + var fullRank = rows.length; + if (detCache.hasOwnProperty(cacheKey)) { + return detCache[cacheKey]; + } + if (rank === 1) { + var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2); + return rows[rowStart][colStart]; + } + var subRowMask = rowMask | (1 << rowStart); + var subRowStart = rowStart + 1; + while (rowMask & (1 << subRowStart)) { + subRowStart++; + } + var sum = 0; + for (var j = 0, colLocalIdx = 0; j < fullRank; j++) { + var colTag = 1 << j; + if (!(colTag & colMask)) { + sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] + * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache); + colLocalIdx++; + } + } + detCache[cacheKey] = sum; + return sum; + } + function buildTransformer(src, dest) { + var mA = [ + [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], + [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], + [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], + [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], + [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], + [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], + [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], + [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]] + ]; + var detCache = {}; + var det = determinant(mA, 8, 0, 0, 0, detCache); + if (det === 0) { + return; + } + var vh = []; + for (var i = 0; i < 8; i++) { + for (var j = 0; j < 8; j++) { + vh[j] == null && (vh[j] = 0); + vh[j] += ((i + j) % 2 ? -1 : 1) + * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) + / det * dest[i]; + } + } + return function (out, srcPointX, srcPointY) { + var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1; + out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk; + out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk; + }; + } + + var EVENT_SAVED_PROP = '___zrEVENTSAVED'; + var _calcOut = []; + function transformLocalCoord(out, elFrom, elTarget, inX, inY) { + return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) + && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]); + } + function transformCoordWithViewport(out, el, inX, inY, inverse) { + if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) { + var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {}); + var markers = prepareCoordMarkers(el, saved); + var transformer = preparePointerTransformer(markers, saved, inverse); + if (transformer) { + transformer(out, inX, inY); + return true; + } + } + return false; + } + function prepareCoordMarkers(el, saved) { + var markers = saved.markers; + if (markers) { + return markers; + } + markers = saved.markers = []; + var propLR = ['left', 'right']; + var propTB = ['top', 'bottom']; + for (var i = 0; i < 4; i++) { + var marker = document.createElement('div'); + var stl = marker.style; + var idxLR = i % 2; + var idxTB = (i >> 1) % 2; + stl.cssText = [ + 'position: absolute', + 'visibility: hidden', + 'padding: 0', + 'margin: 0', + 'border-width: 0', + 'user-select: none', + 'width:0', + 'height:0', + propLR[idxLR] + ':0', + propTB[idxTB] + ':0', + propLR[1 - idxLR] + ':auto', + propTB[1 - idxTB] + ':auto', + '' + ].join('!important;'); + el.appendChild(marker); + markers.push(marker); + } + return markers; + } + function preparePointerTransformer(markers, saved, inverse) { + var transformerName = inverse ? 'invTrans' : 'trans'; + var transformer = saved[transformerName]; + var oldSrcCoords = saved.srcCoords; + var srcCoords = []; + var destCoords = []; + var oldCoordTheSame = true; + for (var i = 0; i < 4; i++) { + var rect = markers[i].getBoundingClientRect(); + var ii = 2 * i; + var x = rect.left; + var y = rect.top; + srcCoords.push(x, y); + oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1]; + destCoords.push(markers[i].offsetLeft, markers[i].offsetTop); + } + return (oldCoordTheSame && transformer) + ? transformer + : (saved.srcCoords = srcCoords, + saved[transformerName] = inverse + ? buildTransformer(destCoords, srcCoords) + : buildTransformer(srcCoords, destCoords)); + } + function isCanvasEl(el) { + return el.nodeName.toUpperCase() === 'CANVAS'; + } + var replaceReg = /([&<>"'])/g; + var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' + }; + function encodeHTML(source) { + return source == null + ? '' + : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); + } + + var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + var _calcOut$1 = []; + var firefoxNotSupportOffsetXY = env.browser.firefox + && +env.browser.version.split('.')[0] < 39; + function clientToLocal(el, e, out, calculate) { + out = out || {}; + if (calculate) { + calculateZrXY(el, e, out); + } + else if (firefoxNotSupportOffsetXY + && e.layerX != null + && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } + else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } + else { + calculateZrXY(el, e, out); + } + return out; + } + function calculateZrXY(el, e, out) { + if (env.domSupported && el.getBoundingClientRect) { + var ex = e.clientX; + var ey = e.clientY; + if (isCanvasEl(el)) { + var box = el.getBoundingClientRect(); + out.zrX = ex - box.left; + out.zrY = ey - box.top; + return; + } + else { + if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) { + out.zrX = _calcOut$1[0]; + out.zrY = _calcOut$1[1]; + return; + } + } + } + out.zrX = out.zrY = 0; + } + function getNativeEvent(e) { + return e + || window.event; + } + function normalizeEvent(el, e, calculate) { + e = getNativeEvent(e); + if (e.zrX != null) { + return e; + } + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + if (!isTouch) { + clientToLocal(el, e, e, calculate); + var wheelDelta = getWheelDeltaMayPolyfill(e); + e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType !== 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + return e; + } + function getWheelDeltaMayPolyfill(e) { + var rawWheelDelta = e.wheelDelta; + if (rawWheelDelta) { + return rawWheelDelta; + } + var deltaX = e.deltaX; + var deltaY = e.deltaY; + if (deltaX == null || deltaY == null) { + return rawWheelDelta; + } + var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); + var sign = deltaY > 0 ? -1 + : deltaY < 0 ? 1 + : deltaX > 0 ? -1 + : 1; + return 3 * delta * sign; + } + function addEventListener(el, name, handler, opt) { + el.addEventListener(name, handler, opt); + } + function removeEventListener(el, name, handler, opt) { + el.removeEventListener(name, handler, opt); + } + var stop = function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + }; + function isMiddleOrRightButtonOnMouseUpDown(e) { + return e.which === 2 || e.which === 3; + } + + var GestureMgr = (function () { + function GestureMgr() { + this._track = []; + } + GestureMgr.prototype.recognize = function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }; + GestureMgr.prototype.clear = function () { + this._track.length = 0; + return this; + }; + GestureMgr.prototype._doTrack = function (event, target, root) { + var touches = event.touches; + if (!touches) { + return; + } + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + this._track.push(trackItem); + }; + GestureMgr.prototype._recognize = function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + }; + return GestureMgr; + }()); + function dist$1(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + return Math.sqrt(dx * dx + dy * dy); + } + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + var recognizers = { + pinch: function (tracks, event) { + var trackLen = tracks.length; + if (!trackLen) { + return; + } + var pinchEnd = (tracks[trackLen - 1] || {}).points; + var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd; + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1) { + var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + event.pinchScale = pinchScale; + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + return { + type: 'pinch', + target: tracks[0].target, + event: event + }; + } + } + }; + + function create$1() { + return [1, 0, 0, 1, 0, 0]; + } + function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + function copy$1(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + } + function mul$1(out, m1, m2) { + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + } + function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + } + function rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + } + function scale$1(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + } + function invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + function clone$2(a) { + var b = create$1(); + copy$1(b, a); + return b; + } + + var matrix = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$1, + identity: identity, + copy: copy$1, + mul: mul$1, + translate: translate, + rotate: rotate, + scale: scale$1, + invert: invert, + clone: clone$2 + }); + + var Point = (function () { + function Point(x, y) { + this.x = x || 0; + this.y = y || 0; + } + Point.prototype.copy = function (other) { + this.x = other.x; + this.y = other.y; + return this; + }; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Point.prototype.equal = function (other) { + return other.x === this.x && other.y === this.y; + }; + Point.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + return this; + }; + Point.prototype.scale = function (scalar) { + this.x *= scalar; + this.y *= scalar; + }; + Point.prototype.scaleAndAdd = function (other, scalar) { + this.x += other.x * scalar; + this.y += other.y * scalar; + }; + Point.prototype.sub = function (other) { + this.x -= other.x; + this.y -= other.y; + return this; + }; + Point.prototype.dot = function (other) { + return this.x * other.x + this.y * other.y; + }; + Point.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + Point.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y; + }; + Point.prototype.normalize = function () { + var len = this.len(); + this.x /= len; + this.y /= len; + return this; + }; + Point.prototype.distance = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + }; + Point.prototype.distanceSquare = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return dx * dx + dy * dy; + }; + Point.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Point.prototype.transform = function (m) { + if (!m) { + return; + } + var x = this.x; + var y = this.y; + this.x = m[0] * x + m[2] * y + m[4]; + this.y = m[1] * x + m[3] * y + m[5]; + return this; + }; + Point.prototype.toArray = function (out) { + out[0] = this.x; + out[1] = this.y; + return out; + }; + Point.prototype.fromArray = function (input) { + this.x = input[0]; + this.y = input[1]; + }; + Point.set = function (p, x, y) { + p.x = x; + p.y = y; + }; + Point.copy = function (p, p2) { + p.x = p2.x; + p.y = p2.y; + }; + Point.len = function (p) { + return Math.sqrt(p.x * p.x + p.y * p.y); + }; + Point.lenSquare = function (p) { + return p.x * p.x + p.y * p.y; + }; + Point.dot = function (p0, p1) { + return p0.x * p1.x + p0.y * p1.y; + }; + Point.add = function (out, p0, p1) { + out.x = p0.x + p1.x; + out.y = p0.y + p1.y; + }; + Point.sub = function (out, p0, p1) { + out.x = p0.x - p1.x; + out.y = p0.y - p1.y; + }; + Point.scale = function (out, p0, scalar) { + out.x = p0.x * scalar; + out.y = p0.y * scalar; + }; + Point.scaleAndAdd = function (out, p0, p1, scalar) { + out.x = p0.x + p1.x * scalar; + out.y = p0.y + p1.y * scalar; + }; + Point.lerp = function (out, p0, p1, t) { + var onet = 1 - t; + out.x = onet * p0.x + t * p1.x; + out.y = onet * p0.y + t * p1.y; + }; + return Point; + }()); + + var mathMin = Math.min; + var mathMax = Math.max; + var lt = new Point(); + var rb = new Point(); + var lb = new Point(); + var rt = new Point(); + var minTv = new Point(); + var maxTv = new Point(); + var BoundingRect = (function () { + function BoundingRect(x, y, width, height) { + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + BoundingRect.prototype.union = function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + if (isFinite(this.x) && isFinite(this.width)) { + this.width = mathMax(other.x + other.width, this.x + this.width) - x; + } + else { + this.width = other.width; + } + if (isFinite(this.y) && isFinite(this.height)) { + this.height = mathMax(other.y + other.height, this.y + this.height) - y; + } + else { + this.height = other.height; + } + this.x = x; + this.y = y; + }; + BoundingRect.prototype.applyTransform = function (m) { + BoundingRect.applyTransform(this, this, m); + }; + BoundingRect.prototype.calculateTransform = function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + var m = create$1(); + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + return m; + }; + BoundingRect.prototype.intersect = function (b, mtv) { + if (!b) { + return false; + } + if (!(b instanceof BoundingRect)) { + b = BoundingRect.create(b); + } + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + if (mtv) { + var dMin = Infinity; + var dMax = 0; + var d0 = Math.abs(ax1 - bx0); + var d1 = Math.abs(bx1 - ax0); + var d2 = Math.abs(ay1 - by0); + var d3 = Math.abs(by1 - ay0); + var dx = Math.min(d0, d1); + var dy = Math.min(d2, d3); + if (ax1 < bx0 || bx1 < ax0) { + if (dx > dMax) { + dMax = dx; + if (d0 < d1) { + Point.set(maxTv, -d0, 0); + } + else { + Point.set(maxTv, d1, 0); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d0 < d1) { + Point.set(minTv, d0, 0); + } + else { + Point.set(minTv, -d1, 0); + } + } + } + if (ay1 < by0 || by1 < ay0) { + if (dy > dMax) { + dMax = dy; + if (d2 < d3) { + Point.set(maxTv, 0, -d2); + } + else { + Point.set(maxTv, 0, d3); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d2 < d3) { + Point.set(minTv, 0, d2); + } + else { + Point.set(minTv, 0, -d3); + } + } + } + } + if (mtv) { + Point.copy(mtv, overlap ? minTv : maxTv); + } + return overlap; + }; + BoundingRect.prototype.contain = function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }; + BoundingRect.prototype.clone = function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }; + BoundingRect.prototype.copy = function (other) { + BoundingRect.copy(this, other); + }; + BoundingRect.prototype.plain = function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + }; + BoundingRect.prototype.isFinite = function () { + return isFinite(this.x) + && isFinite(this.y) + && isFinite(this.width) + && isFinite(this.height); + }; + BoundingRect.prototype.isZero = function () { + return this.width === 0 || this.height === 0; + }; + BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); + }; + BoundingRect.copy = function (target, source) { + target.x = source.x; + target.y = source.y; + target.width = source.width; + target.height = source.height; + }; + BoundingRect.applyTransform = function (target, source, m) { + if (!m) { + if (target !== source) { + BoundingRect.copy(target, source); + } + return; + } + if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) { + var sx = m[0]; + var sy = m[3]; + var tx = m[4]; + var ty = m[5]; + target.x = source.x * sx + tx; + target.y = source.y * sy + ty; + target.width = source.width * sx; + target.height = source.height * sy; + if (target.width < 0) { + target.x += target.width; + target.width = -target.width; + } + if (target.height < 0) { + target.y += target.height; + target.height = -target.height; + } + return; + } + lt.x = lb.x = source.x; + lt.y = rt.y = source.y; + rb.x = rt.x = source.x + source.width; + rb.y = lb.y = source.y + source.height; + lt.transform(m); + rt.transform(m); + rb.transform(m); + lb.transform(m); + target.x = mathMin(lt.x, rb.x, lb.x, rt.x); + target.y = mathMin(lt.y, rb.y, lb.y, rt.y); + var maxX = mathMax(lt.x, rb.x, lb.x, rt.x); + var maxY = mathMax(lt.y, rb.y, lb.y, rt.y); + target.width = maxX - target.x; + target.height = maxY - target.y; + }; + return BoundingRect; + }()); + + var SILENT = 'silent'; + function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + target: targetInfo.target, + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which, + stop: stopEvent + }; + } + function stopEvent() { + stop(this.event); + } + var EmptyProxy = (function (_super) { + __extends(EmptyProxy, _super); + function EmptyProxy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handler = null; + return _this; + } + EmptyProxy.prototype.dispose = function () { }; + EmptyProxy.prototype.setCursor = function () { }; + return EmptyProxy; + }(Eventful)); + var HoveredResult = (function () { + function HoveredResult(x, y) { + this.x = x; + this.y = y; + } + return HoveredResult; + }()); + var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var tmpRect = new BoundingRect(0, 0, 0, 0); + var Handler = (function (_super) { + __extends(Handler, _super); + function Handler(storage, painter, proxy, painterRoot, pointerSize) { + var _this = _super.call(this) || this; + _this._hovered = new HoveredResult(0, 0); + _this.storage = storage; + _this.painter = painter; + _this.painterRoot = painterRoot; + _this._pointerSize = pointerSize; + proxy = proxy || new EmptyProxy(); + _this.proxy = null; + _this.setHandlerProxy(proxy); + _this._draggingMgr = new Draggable(_this); + return _this; + } + Handler.prototype.setHandlerProxy = function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + if (proxy) { + each(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + proxy.handler = this; + } + this.proxy = proxy; + }; + Handler.prototype.mousemove = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y); + var hoveredTarget = hovered.target; + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + this.dispatchToElement(hovered, 'mousemove', event); + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }; + Handler.prototype.mouseout = function (event) { + var eventControl = event.zrEventControl; + if (eventControl !== 'only_globalout') { + this.dispatchToElement(this._hovered, 'mouseout', event); + } + if (eventControl !== 'no_globalout') { + this.trigger('globalout', { type: 'globalout', event: event }); + } + }; + Handler.prototype.resize = function () { + this._hovered = new HoveredResult(0, 0); + }; + Handler.prototype.dispatch = function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }; + Handler.prototype.dispose = function () { + this.proxy.dispose(); + this.storage = null; + this.proxy = null; + this.painter = null; + }; + Handler.prototype.setCursorStyle = function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }; + Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventKey = ('on' + eventName); + var eventPacket = makeEventPacket(eventName, targetInfo, event); + while (el) { + el[eventKey] + && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket)); + el.trigger(eventName, eventPacket); + el = el.__hostTarget ? el.__hostTarget : el.parent; + if (eventPacket.cancelBubble) { + break; + } + } + if (!eventPacket.cancelBubble) { + this.trigger(eventName, eventPacket); + if (this.painter && this.painter.eachOtherLayer) { + this.painter.eachOtherLayer(function (layer) { + if (typeof (layer[eventKey]) === 'function') { + layer[eventKey].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + } + }; + Handler.prototype.findHover = function (x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = new HoveredResult(x, y); + setHoverTarget(list, out, x, y, exclude); + if (this._pointerSize && !out.target) { + var candidates = []; + var pointerSize = this._pointerSize; + var targetSizeHalf = pointerSize / 2; + var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize); + for (var i = list.length - 1; i >= 0; i--) { + var el = list[i]; + if (el !== exclude + && !el.ignore + && !el.ignoreCoarsePointer + && (!el.parent || !el.parent.ignoreCoarsePointer)) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + if (tmpRect.intersect(pointerRect)) { + candidates.push(el); + } + } + } + if (candidates.length) { + var rStep = 4; + var thetaStep = Math.PI / 12; + var PI2 = Math.PI * 2; + for (var r = 0; r < targetSizeHalf; r += rStep) { + for (var theta = 0; theta < PI2; theta += thetaStep) { + var x1 = x + r * Math.cos(theta); + var y1 = y + r * Math.sin(theta); + setHoverTarget(candidates, out, x1, y1, exclude); + if (out.target) { + return out; + } + } + } + } + } + return out; + }; + Handler.prototype.processGesture = function (event, stage) { + if (!this._gestureMgr) { + this._gestureMgr = new GestureMgr(); + } + var gestureMgr = this._gestureMgr; + stage === 'start' && gestureMgr.clear(); + var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom); + stage === 'end' && gestureMgr.clear(); + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + var res = new HoveredResult(); + res.target = gestureInfo.target; + this.dispatchToElement(res, type, gestureInfo.event); + } + }; + return Handler; + }(Eventful)); + each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var hovered; + var hoveredTarget; + if (name !== 'mouseup' || !isOutside) { + hovered = this.findHover(x, y); + hoveredTarget = hovered.target; + } + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + this._upEl = hoveredTarget; + } + else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } + else if (name === 'click') { + if (this._downEl !== this._upEl + || !this._downPoint + || dist(this._downPoint, [event.zrX, event.zrY]) > 4) { + return; + } + this._downPoint = null; + } + this.dispatchToElement(hovered, name, event); + }; + }); + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent = void 0; + var ignoreClip = false; + while (el) { + if (el.ignoreClip) { + ignoreClip = true; + } + if (!ignoreClip) { + var clipPath = el.getClipPath(); + if (clipPath && !clipPath.contain(x, y)) { + return false; + } + if (el.silent) { + isSilent = true; + } + } + var hostEl = el.__hostTarget; + el = hostEl ? hostEl : el.parent; + } + return isSilent ? SILENT : true; + } + return false; + } + function setHoverTarget(list, out, x, y, exclude) { + for (var i = list.length - 1; i >= 0; i--) { + var el = list[i]; + var hoverCheckResult = void 0; + if (el !== exclude + && !el.ignore + && (hoverCheckResult = isHover(el, x, y))) { + !out.topTarget && (out.topTarget = el); + if (hoverCheckResult !== SILENT) { + out.target = el; + break; + } + } + } + } + function isOutsideBoundary(handlerInstance, x, y) { + var painter = handlerInstance.painter; + return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight(); + } + + var DEFAULT_MIN_MERGE = 32; + var DEFAULT_MIN_GALLOPING = 7; + function minRunLength(n) { + var r = 0; + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + return n + r; + } + function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + if (runHi === hi) { + return 1; + } + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + reverseRun(array, lo, runHi); + } + else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + return runHi - lo; + } + function reverseRun(array, lo, hi) { + hi--; + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } + } + function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + for (; start < hi; start++) { + var pivot = array[start]; + var left = lo; + var right = start; + var mid; + while (left < right) { + mid = left + right >>> 1; + if (compare(pivot, array[mid]) < 0) { + right = mid; + } + else { + left = mid + 1; + } + } + var n = start - left; + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + case 2: + array[left + 2] = array[left + 1]; + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + array[left] = pivot; + } + } + function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } + else { + offset = m; + } + } + return offset; + } + function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + else { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) < 0) { + offset = m; + } + else { + lastOffset = m + 1; + } + } + return offset; + } + function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var length = 0; + var runStart; + var runLength; + var stackSize = 0; + length = array.length; + var tmp = []; + runStart = []; + runLength = []; + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) + || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } + else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + mergeAt(n); + } + } + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + runLength[i] = length1 + length2; + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + stackSize--; + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + if (length1 === 0) { + return; + } + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + if (length2 === 0) { + return; + } + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } + else { + mergeHigh(start1, length1, start2, length2); + } + } + function mergeLow(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + var _minGallop = minGallop; + var count1; + var count2; + var exit; + while (1) { + count1 = 0; + count2 = 0; + exit = false; + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + if (--length2 === 0) { + exit = true; + break; + } + } + else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + exit = true; + break; + } + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + dest += count2; + cursor2 += count2; + length2 -= count2; + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + if (--length1 === 1) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + minGallop < 1 && (minGallop = 1); + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } + else if (length1 === 0) { + throw new Error(); + } + else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + function mergeHigh(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + return; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + return; + } + var _minGallop = minGallop; + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } + else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + if (length1 === 0) { + exit = true; + break; + } + } + array[dest--] = tmp[cursor2--]; + if (--length2 === 1) { + exit = true; + break; + } + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + if (length2 <= 1) { + exit = true; + break; + } + } + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + if (minGallop < 1) { + minGallop = 1; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + } + else if (length2 === 0) { + throw new Error(); + } + else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + return { + mergeRuns: mergeRuns, + forceMergeRuns: forceMergeRuns, + pushRun: pushRun + }; + } + function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + var remaining = hi - lo; + if (remaining < 2) { + return; + } + var runLength = 0; + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + var ts = TimSort(array, compare); + var minRun = minRunLength(remaining); + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + ts.pushRun(lo, runLength); + ts.mergeRuns(); + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + ts.forceMergeRuns(); + } + + var REDRAW_BIT = 1; + var STYLE_CHANGED_BIT = 2; + var SHAPE_CHANGED_BIT = 4; + + var invalidZErrorLogged = false; + function logInvalidZError() { + if (invalidZErrorLogged) { + return; + } + invalidZErrorLogged = true; + console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); + } + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + var Storage = (function () { + function Storage() { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + this.displayableSortFunc = shapeCompareFunc; + } + Storage.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }; + Storage.prototype.getDisplayList = function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + var displayList = this._displayList; + if (update || !displayList.length) { + this.updateDisplayList(includeIgnore); + } + return displayList; + }; + Storage.prototype.updateDisplayList = function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + sort(displayList, shapeCompareFunc); + }; + Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { + if (el.ignore && !includeIgnore) { + return; + } + el.beforeUpdate(); + el.update(); + el.afterUpdate(); + var userSetClipPath = el.getClipPath(); + if (el.ignoreClip) { + clipPaths = null; + } + else if (userSetClipPath) { + if (clipPaths) { + clipPaths = clipPaths.slice(); + } + else { + clipPaths = []; + } + var currentClipPath = userSetClipPath; + var parentClipPath = el; + while (currentClipPath) { + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + clipPaths.push(currentClipPath); + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.getClipPath(); + } + } + if (el.childrenRef) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (el.__dirty) { + child.__dirty |= REDRAW_BIT; + } + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + el.__dirty = 0; + } + else { + var disp = el; + if (clipPaths && clipPaths.length) { + disp.__clipPaths = clipPaths; + } + else if (disp.__clipPaths && disp.__clipPaths.length > 0) { + disp.__clipPaths = []; + } + if (isNaN(disp.z)) { + logInvalidZError(); + disp.z = 0; + } + if (isNaN(disp.z2)) { + logInvalidZError(); + disp.z2 = 0; + } + if (isNaN(disp.zlevel)) { + logInvalidZError(); + disp.zlevel = 0; + } + this._displayList[this._displayListLen++] = disp; + } + var decalEl = el.getDecalElement && el.getDecalElement(); + if (decalEl) { + this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); + } + var textGuide = el.getTextGuideLine(); + if (textGuide) { + this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); + } + var textEl = el.getTextContent(); + if (textEl) { + this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); + } + }; + Storage.prototype.addRoot = function (el) { + if (el.__zr && el.__zr.storage === this) { + return; + } + this._roots.push(el); + }; + Storage.prototype.delRoot = function (el) { + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this._roots.splice(idx, 1); + } + }; + Storage.prototype.delAllRoots = function () { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + return; + }; + Storage.prototype.getRoots = function () { + return this._roots; + }; + Storage.prototype.dispose = function () { + this._displayList = null; + this._roots = null; + }; + return Storage; + }()); + + var requestAnimationFrame; + requestAnimationFrame = (env.hasGlobalWindow + && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) || function (func) { + return setTimeout(func, 16); + }; + var requestAnimationFrame$1 = requestAnimationFrame; + + var easingFuncs = { + linear: function (k) { + return k; + }, + quadraticIn: function (k) { + return k * k; + }, + quadraticOut: function (k) { + return k * (2 - k); + }, + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + cubicIn: function (k) { + return k * k * k; + }, + cubicOut: function (k) { + return --k * k * k + 1; + }, + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + quarticIn: function (k) { + return k * k * k * k; + }, + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + quinticIn: function (k) { + return k * k * k * k * k; + }, + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + }, + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) + * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + bounceIn: function (k) { + return 1 - easingFuncs.bounceOut(1 - k); + }, + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + bounceInOut: function (k) { + if (k < 0.5) { + return easingFuncs.bounceIn(k * 2) * 0.5; + } + return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + var _v0 = create(); + var _v1 = create(); + var _v2 = create(); + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t); + } + function cubicRootAt(p0, p1, p2, p3, val, roots) { + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + var n = 0; + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; + var t2 = -K / 2; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + var p0123 = (p123 - p012) * t + p012; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + return mathSqrt(d); + } + function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = cubicAt(x0, x1, x2, x3, t); + var y = cubicAt(y0, y1, y2, y3, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + var d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + return mathSqrt(d); + } + function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = quadraticAt(x0, x1, x2, t); + var y = quadraticAt(y0, y1, y2, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + + var regexp = /cubic-bezier\(([0-9,\.e ]+)\)/; + function createCubicEasingFunc(cubicEasingStr) { + var cubic = cubicEasingStr && regexp.exec(cubicEasingStr); + if (cubic) { + var points = cubic[1].split(','); + var a_1 = +trim(points[0]); + var b_1 = +trim(points[1]); + var c_1 = +trim(points[2]); + var d_1 = +trim(points[3]); + if (isNaN(a_1 + b_1 + c_1 + d_1)) { + return; + } + var roots_1 = []; + return function (p) { + return p <= 0 + ? 0 : p >= 1 + ? 1 + : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]); + }; + } + } + + var Clip = (function () { + function Clip(opts) { + this._inited = false; + this._startTime = 0; + this._pausedTime = 0; + this._paused = false; + this._life = opts.life || 1000; + this._delay = opts.delay || 0; + this.loop = opts.loop || false; + this.onframe = opts.onframe || noop; + this.ondestroy = opts.ondestroy || noop; + this.onrestart = opts.onrestart || noop; + opts.easing && this.setEasing(opts.easing); + } + Clip.prototype.step = function (globalTime, deltaTime) { + if (!this._inited) { + this._startTime = globalTime + this._delay; + this._inited = true; + } + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + var life = this._life; + var elapsedTime = globalTime - this._startTime - this._pausedTime; + var percent = elapsedTime / life; + if (percent < 0) { + percent = 0; + } + percent = Math.min(percent, 1); + var easingFunc = this.easingFunc; + var schedule = easingFunc ? easingFunc(percent) : percent; + this.onframe(schedule); + if (percent === 1) { + if (this.loop) { + var remainder = elapsedTime % life; + this._startTime = globalTime - remainder; + this._pausedTime = 0; + this.onrestart(); + } + else { + return true; + } + } + return false; + }; + Clip.prototype.pause = function () { + this._paused = true; + }; + Clip.prototype.resume = function () { + this._paused = false; + }; + Clip.prototype.setEasing = function (easing) { + this.easing = easing; + this.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + }; + return Clip; + }()); + + var Entry = (function () { + function Entry(val) { + this.value = val; + } + return Entry; + }()); + var LinkedList = (function () { + function LinkedList() { + this._len = 0; + } + LinkedList.prototype.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + LinkedList.prototype.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; + }; + LinkedList.prototype.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + LinkedList.prototype.len = function () { + return this._len; + }; + LinkedList.prototype.clear = function () { + this.head = this.tail = null; + this._len = 0; + }; + return LinkedList; + }()); + var LRU = (function () { + function LRU(maxSize) { + this._list = new LinkedList(); + this._maxSize = 10; + this._map = {}; + this._maxSize = maxSize; + } + LRU.prototype.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + var entry = this._lastRemovedEntry; + if (len >= this._maxSize && len > 0) { + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + if (entry) { + entry.value = value; + } + else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + return removed; + }; + LRU.prototype.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + return entry.value; + } + }; + LRU.prototype.clear = function () { + this._list.clear(); + this._map = {}; + }; + LRU.prototype.len = function () { + return this._list.len(); + }; + return LRU; + }()); + + var kCSSColorTable = { + 'transparent': [0, 0, 0, 0], 'aliceblue': [240, 248, 255, 1], + 'antiquewhite': [250, 235, 215, 1], 'aqua': [0, 255, 255, 1], + 'aquamarine': [127, 255, 212, 1], 'azure': [240, 255, 255, 1], + 'beige': [245, 245, 220, 1], 'bisque': [255, 228, 196, 1], + 'black': [0, 0, 0, 1], 'blanchedalmond': [255, 235, 205, 1], + 'blue': [0, 0, 255, 1], 'blueviolet': [138, 43, 226, 1], + 'brown': [165, 42, 42, 1], 'burlywood': [222, 184, 135, 1], + 'cadetblue': [95, 158, 160, 1], 'chartreuse': [127, 255, 0, 1], + 'chocolate': [210, 105, 30, 1], 'coral': [255, 127, 80, 1], + 'cornflowerblue': [100, 149, 237, 1], 'cornsilk': [255, 248, 220, 1], + 'crimson': [220, 20, 60, 1], 'cyan': [0, 255, 255, 1], + 'darkblue': [0, 0, 139, 1], 'darkcyan': [0, 139, 139, 1], + 'darkgoldenrod': [184, 134, 11, 1], 'darkgray': [169, 169, 169, 1], + 'darkgreen': [0, 100, 0, 1], 'darkgrey': [169, 169, 169, 1], + 'darkkhaki': [189, 183, 107, 1], 'darkmagenta': [139, 0, 139, 1], + 'darkolivegreen': [85, 107, 47, 1], 'darkorange': [255, 140, 0, 1], + 'darkorchid': [153, 50, 204, 1], 'darkred': [139, 0, 0, 1], + 'darksalmon': [233, 150, 122, 1], 'darkseagreen': [143, 188, 143, 1], + 'darkslateblue': [72, 61, 139, 1], 'darkslategray': [47, 79, 79, 1], + 'darkslategrey': [47, 79, 79, 1], 'darkturquoise': [0, 206, 209, 1], + 'darkviolet': [148, 0, 211, 1], 'deeppink': [255, 20, 147, 1], + 'deepskyblue': [0, 191, 255, 1], 'dimgray': [105, 105, 105, 1], + 'dimgrey': [105, 105, 105, 1], 'dodgerblue': [30, 144, 255, 1], + 'firebrick': [178, 34, 34, 1], 'floralwhite': [255, 250, 240, 1], + 'forestgreen': [34, 139, 34, 1], 'fuchsia': [255, 0, 255, 1], + 'gainsboro': [220, 220, 220, 1], 'ghostwhite': [248, 248, 255, 1], + 'gold': [255, 215, 0, 1], 'goldenrod': [218, 165, 32, 1], + 'gray': [128, 128, 128, 1], 'green': [0, 128, 0, 1], + 'greenyellow': [173, 255, 47, 1], 'grey': [128, 128, 128, 1], + 'honeydew': [240, 255, 240, 1], 'hotpink': [255, 105, 180, 1], + 'indianred': [205, 92, 92, 1], 'indigo': [75, 0, 130, 1], + 'ivory': [255, 255, 240, 1], 'khaki': [240, 230, 140, 1], + 'lavender': [230, 230, 250, 1], 'lavenderblush': [255, 240, 245, 1], + 'lawngreen': [124, 252, 0, 1], 'lemonchiffon': [255, 250, 205, 1], + 'lightblue': [173, 216, 230, 1], 'lightcoral': [240, 128, 128, 1], + 'lightcyan': [224, 255, 255, 1], 'lightgoldenrodyellow': [250, 250, 210, 1], + 'lightgray': [211, 211, 211, 1], 'lightgreen': [144, 238, 144, 1], + 'lightgrey': [211, 211, 211, 1], 'lightpink': [255, 182, 193, 1], + 'lightsalmon': [255, 160, 122, 1], 'lightseagreen': [32, 178, 170, 1], + 'lightskyblue': [135, 206, 250, 1], 'lightslategray': [119, 136, 153, 1], + 'lightslategrey': [119, 136, 153, 1], 'lightsteelblue': [176, 196, 222, 1], + 'lightyellow': [255, 255, 224, 1], 'lime': [0, 255, 0, 1], + 'limegreen': [50, 205, 50, 1], 'linen': [250, 240, 230, 1], + 'magenta': [255, 0, 255, 1], 'maroon': [128, 0, 0, 1], + 'mediumaquamarine': [102, 205, 170, 1], 'mediumblue': [0, 0, 205, 1], + 'mediumorchid': [186, 85, 211, 1], 'mediumpurple': [147, 112, 219, 1], + 'mediumseagreen': [60, 179, 113, 1], 'mediumslateblue': [123, 104, 238, 1], + 'mediumspringgreen': [0, 250, 154, 1], 'mediumturquoise': [72, 209, 204, 1], + 'mediumvioletred': [199, 21, 133, 1], 'midnightblue': [25, 25, 112, 1], + 'mintcream': [245, 255, 250, 1], 'mistyrose': [255, 228, 225, 1], + 'moccasin': [255, 228, 181, 1], 'navajowhite': [255, 222, 173, 1], + 'navy': [0, 0, 128, 1], 'oldlace': [253, 245, 230, 1], + 'olive': [128, 128, 0, 1], 'olivedrab': [107, 142, 35, 1], + 'orange': [255, 165, 0, 1], 'orangered': [255, 69, 0, 1], + 'orchid': [218, 112, 214, 1], 'palegoldenrod': [238, 232, 170, 1], + 'palegreen': [152, 251, 152, 1], 'paleturquoise': [175, 238, 238, 1], + 'palevioletred': [219, 112, 147, 1], 'papayawhip': [255, 239, 213, 1], + 'peachpuff': [255, 218, 185, 1], 'peru': [205, 133, 63, 1], + 'pink': [255, 192, 203, 1], 'plum': [221, 160, 221, 1], + 'powderblue': [176, 224, 230, 1], 'purple': [128, 0, 128, 1], + 'red': [255, 0, 0, 1], 'rosybrown': [188, 143, 143, 1], + 'royalblue': [65, 105, 225, 1], 'saddlebrown': [139, 69, 19, 1], + 'salmon': [250, 128, 114, 1], 'sandybrown': [244, 164, 96, 1], + 'seagreen': [46, 139, 87, 1], 'seashell': [255, 245, 238, 1], + 'sienna': [160, 82, 45, 1], 'silver': [192, 192, 192, 1], + 'skyblue': [135, 206, 235, 1], 'slateblue': [106, 90, 205, 1], + 'slategray': [112, 128, 144, 1], 'slategrey': [112, 128, 144, 1], + 'snow': [255, 250, 250, 1], 'springgreen': [0, 255, 127, 1], + 'steelblue': [70, 130, 180, 1], 'tan': [210, 180, 140, 1], + 'teal': [0, 128, 128, 1], 'thistle': [216, 191, 216, 1], + 'tomato': [255, 99, 71, 1], 'turquoise': [64, 224, 208, 1], + 'violet': [238, 130, 238, 1], 'wheat': [245, 222, 179, 1], + 'white': [255, 255, 255, 1], 'whitesmoke': [245, 245, 245, 1], + 'yellow': [255, 255, 0, 1], 'yellowgreen': [154, 205, 50, 1] + }; + function clampCssByte(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; + } + function clampCssAngle(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 360 ? 360 : i; + } + function clampCssFloat(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; + } + function parseCssInt(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + function parseCssFloat(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + return m1; + } + function lerpNumber(a, b, p) { + return a + (b - a) * p; + } + function setRgba(out, r, g, b, a) { + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; + } + function copyRgba(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + var colorCache = new LRU(20); + var lastRemovedArr = null; + function putToCache(colorStr, rgbaArr) { + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); + } + function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + colorStr = colorStr + ''; + var str = colorStr.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + var strLen = str.length; + if (str.charAt(0) === '#') { + if (strLen === 4 || strLen === 5) { + var iv = parseInt(str.slice(1, 4), 16); + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else if (strLen === 7 || strLen === 9) { + var iv = parseInt(str.slice(1, 7), 16); + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + return; + } + var op = str.indexOf('('); + var ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === strLen) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return params.length === 3 + ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1) + : setRgba(rgbaArr, 0, 0, 0, 1); + } + alpha = parseCssFloat(params.pop()); + case 'rgb': + if (params.length >= 3) { + setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), params.length === 3 ? alpha : parseCssFloat(params[3])); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + rgba = rgba || []; + setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1); + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + return rgba; + } + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + var vMin = Math.min(R, G, B); + var vMax = Math.max(R, G, B); + var delta = vMax - vMin; + var L = (vMax + vMin) / 2; + var H; + var S; + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + if (H < 0) { + H += 1; + } + if (H > 1) { + H -= 1; + } + } + var hsla = [H * 360, S, L]; + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + return hsla; + } + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } + else if (colorArr[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + function toHex(color) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + function fastLerp(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + out = out || []; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)); + out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)); + return out; + } + var fastMapToColor = fastLerp; + function lerp$1(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + var color = stringify([ + clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], 'rgba'); + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + var mapToColor = lerp$1; + function modifyHSL(color, h, s, l) { + var colorArr = parse(color); + if (color) { + colorArr = rgba2hsla(colorArr); + h != null && (colorArr[0] = clampCssAngle(h)); + s != null && (colorArr[1] = parseCssFloat(s)); + l != null && (colorArr[2] = parseCssFloat(l)); + return stringify(hsla2rgba(colorArr), 'rgba'); + } + } + function modifyAlpha(color, alpha) { + var colorArr = parse(color); + if (colorArr && alpha != null) { + colorArr[3] = clampCssFloat(alpha); + return stringify(colorArr, 'rgba'); + } + } + function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; + } + function lum(color, backgroundLum) { + var arr = parse(color); + return arr + ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255 + + (1 - arr[3]) * backgroundLum + : 0; + } + function random() { + return stringify([ + Math.round(Math.random() * 255), + Math.round(Math.random() * 255), + Math.round(Math.random() * 255) + ], 'rgb'); + } + + var color = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parse, + lift: lift, + toHex: toHex, + fastLerp: fastLerp, + fastMapToColor: fastMapToColor, + lerp: lerp$1, + mapToColor: mapToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify, + lum: lum, + random: random + }); + + var mathRound = Math.round; + function normalizeColor(color) { + var opacity; + if (!color || color === 'transparent') { + color = 'none'; + } + else if (typeof color === 'string' && color.indexOf('rgba') > -1) { + var arr = parse(color); + if (arr) { + color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')'; + opacity = arr[3]; + } + } + return { + color: color, + opacity: opacity == null ? 1 : opacity + }; + } + var EPSILON$1 = 1e-4; + function isAroundZero$1(transform) { + return transform < EPSILON$1 && transform > -EPSILON$1; + } + function round3(transform) { + return mathRound(transform * 1e3) / 1e3; + } + function round4(transform) { + return mathRound(transform * 1e4) / 1e4; + } + function getMatrixStr(m) { + return 'matrix(' + + round3(m[0]) + ',' + + round3(m[1]) + ',' + + round3(m[2]) + ',' + + round3(m[3]) + ',' + + round4(m[4]) + ',' + + round4(m[5]) + + ')'; + } + var TEXT_ALIGN_TO_ANCHOR = { + left: 'start', + right: 'end', + center: 'middle', + middle: 'middle' + }; + function adjustTextY(y, lineHeight, textBaseline) { + if (textBaseline === 'top') { + y += lineHeight / 2; + } + else if (textBaseline === 'bottom') { + y -= lineHeight / 2; + } + return y; + } + function hasShadow(style) { + return style + && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY); + } + function getShadowKey(displayable) { + var style = displayable.style; + var globalScale = displayable.getGlobalScale(); + return [ + style.shadowColor, + (style.shadowBlur || 0).toFixed(2), + (style.shadowOffsetX || 0).toFixed(2), + (style.shadowOffsetY || 0).toFixed(2), + globalScale[0], + globalScale[1] + ].join(','); + } + function isImagePattern(val) { + return val && (!!val.image); + } + function isSVGPattern(val) { + return val && (!!val.svgElement); + } + function isPattern(val) { + return isImagePattern(val) || isSVGPattern(val); + } + function isLinearGradient(val) { + return val.type === 'linear'; + } + function isRadialGradient(val) { + return val.type === 'radial'; + } + function isGradient(val) { + return val && (val.type === 'linear' + || val.type === 'radial'); + } + function getIdURL(id) { + return "url(#" + id + ")"; + } + function getPathPrecision(el) { + var scale = el.getGlobalScale(); + var size = Math.max(scale[0], scale[1]); + return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1); + } + function getSRTTransformString(transform) { + var x = transform.x || 0; + var y = transform.y || 0; + var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE; + var scaleX = retrieve2(transform.scaleX, 1); + var scaleY = retrieve2(transform.scaleY, 1); + var skewX = transform.skewX || 0; + var skewY = transform.skewY || 0; + var res = []; + if (x || y) { + res.push("translate(" + x + "px," + y + "px)"); + } + if (rotation) { + res.push("rotate(" + rotation + ")"); + } + if (scaleX !== 1 || scaleY !== 1) { + res.push("scale(" + scaleX + "," + scaleY + ")"); + } + if (skewX || skewY) { + res.push("skew(" + mathRound(skewX * RADIAN_TO_DEGREE) + "deg, " + mathRound(skewY * RADIAN_TO_DEGREE) + "deg)"); + } + return res.join(' '); + } + var encodeBase64 = (function () { + if (env.hasGlobalWindow && isFunction(window.btoa)) { + return function (str) { + return window.btoa(unescape(encodeURIComponent(str))); + }; + } + if (typeof Buffer !== 'undefined') { + return function (str) { + return Buffer.from(str).toString('base64'); + }; + } + return function (str) { + if ("development" !== 'production') { + logError('Base64 isn\'t natively supported in the current environment.'); + } + return null; + }; + })(); + + var arraySlice = Array.prototype.slice; + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + function interpolate1DArray(out, p0, p1, percent) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + return out; + } + function interpolate2DArray(out, p0, p1, percent) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent); + } + } + return out; + } + function add1DArray(out, p0, p1, sign) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = p0[i] + p1[i] * sign; + } + return out; + } + function add2DArray(out, p0, p1, sign) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = p0[i][j] + p1[i][j] * sign; + } + } + return out; + } + function fillColorStops(val0, val1) { + var len0 = val0.length; + var len1 = val1.length; + var shorterArr = len0 > len1 ? val1 : val0; + var shorterLen = Math.min(len0, len1); + var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 }; + for (var i = shorterLen; i < Math.max(len0, len1); i++) { + shorterArr.push({ + offset: last.offset, + color: last.color.slice() + }); + } + } + function fillArray(val0, val1, arrDim) { + var arr0 = val0; + var arr1 = val1; + if (!arr0.push || !arr1.push) { + return; + } + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + arr0.length = arr1Len; + } + else { + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); + } + } + } + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } + else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } + } + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + return arraySlice.call(value); + } + return value; + } + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]) || 0; + rgba[1] = Math.floor(rgba[1]) || 0; + rgba[2] = Math.floor(rgba[2]) || 0; + rgba[3] = rgba[3] == null ? 1 : rgba[3]; + return 'rgba(' + rgba.join(',') + ')'; + } + function guessArrayDim(value) { + return isArrayLike(value && value[0]) ? 2 : 1; + } + var VALUE_TYPE_NUMBER = 0; + var VALUE_TYPE_1D_ARRAY = 1; + var VALUE_TYPE_2D_ARRAY = 2; + var VALUE_TYPE_COLOR = 3; + var VALUE_TYPE_LINEAR_GRADIENT = 4; + var VALUE_TYPE_RADIAL_GRADIENT = 5; + var VALUE_TYPE_UNKOWN = 6; + function isGradientValueType(valType) { + return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT; + } + function isArrayValueType(valType) { + return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY; + } + var tmpRgba = [0, 0, 0, 0]; + var Track = (function () { + function Track(propName) { + this.keyframes = []; + this.discrete = false; + this._invalid = false; + this._needsSort = false; + this._lastFr = 0; + this._lastFrP = 0; + this.propName = propName; + } + Track.prototype.isFinished = function () { + return this._finished; + }; + Track.prototype.setFinished = function () { + this._finished = true; + if (this._additiveTrack) { + this._additiveTrack.setFinished(); + } + }; + Track.prototype.needsAnimate = function () { + return this.keyframes.length >= 1; + }; + Track.prototype.getAdditiveTrack = function () { + return this._additiveTrack; + }; + Track.prototype.addKeyframe = function (time, rawValue, easing) { + this._needsSort = true; + var keyframes = this.keyframes; + var len = keyframes.length; + var discrete = false; + var valType = VALUE_TYPE_UNKOWN; + var value = rawValue; + if (isArrayLike(rawValue)) { + var arrayDim = guessArrayDim(rawValue); + valType = arrayDim; + if (arrayDim === 1 && !isNumber(rawValue[0]) + || arrayDim === 2 && !isNumber(rawValue[0][0])) { + discrete = true; + } + } + else { + if (isNumber(rawValue) && !eqNaN(rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else if (isString(rawValue)) { + if (!isNaN(+rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else { + var colorArray = parse(rawValue); + if (colorArray) { + value = colorArray; + valType = VALUE_TYPE_COLOR; + } + } + } + else if (isGradientObject(rawValue)) { + var parsedGradient = extend({}, value); + parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({ + offset: colorStop.offset, + color: parse(colorStop.color) + }); }); + if (isLinearGradient(rawValue)) { + valType = VALUE_TYPE_LINEAR_GRADIENT; + } + else if (isRadialGradient(rawValue)) { + valType = VALUE_TYPE_RADIAL_GRADIENT; + } + value = parsedGradient; + } + } + if (len === 0) { + this.valType = valType; + } + else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) { + discrete = true; + } + this.discrete = this.discrete || discrete; + var kf = { + time: time, + value: value, + rawValue: rawValue, + percent: 0 + }; + if (easing) { + kf.easing = easing; + kf.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + } + keyframes.push(kf); + return kf; + }; + Track.prototype.prepare = function (maxTime, additiveTrack) { + var kfs = this.keyframes; + if (this._needsSort) { + kfs.sort(function (a, b) { + return a.time - b.time; + }); + } + var valType = this.valType; + var kfsLen = kfs.length; + var lastKf = kfs[kfsLen - 1]; + var isDiscrete = this.discrete; + var isArr = isArrayValueType(valType); + var isGradient = isGradientValueType(valType); + for (var i = 0; i < kfsLen; i++) { + var kf = kfs[i]; + var value = kf.value; + var lastValue = lastKf.value; + kf.percent = kf.time / maxTime; + if (!isDiscrete) { + if (isArr && i !== kfsLen - 1) { + fillArray(value, lastValue, valType); + } + else if (isGradient) { + fillColorStops(value.colorStops, lastValue.colorStops); + } + } + } + if (!isDiscrete + && valType !== VALUE_TYPE_RADIAL_GRADIENT + && additiveTrack + && this.needsAnimate() + && additiveTrack.needsAnimate() + && valType === additiveTrack.valType + && !additiveTrack._finished) { + this._additiveTrack = additiveTrack; + var startValue = kfs[0].value; + for (var i = 0; i < kfsLen; i++) { + if (valType === VALUE_TYPE_NUMBER) { + kfs[i].additiveValue = kfs[i].value - startValue; + } + else if (valType === VALUE_TYPE_COLOR) { + kfs[i].additiveValue = + add1DArray([], kfs[i].value, startValue, -1); + } + else if (isArrayValueType(valType)) { + kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY + ? add1DArray([], kfs[i].value, startValue, -1) + : add2DArray([], kfs[i].value, startValue, -1); + } + } + } + }; + Track.prototype.step = function (target, percent) { + if (this._finished) { + return; + } + if (this._additiveTrack && this._additiveTrack._finished) { + this._additiveTrack = null; + } + var isAdditive = this._additiveTrack != null; + var valueKey = isAdditive ? 'additiveValue' : 'value'; + var valType = this.valType; + var keyframes = this.keyframes; + var kfsNum = keyframes.length; + var propName = this.propName; + var isValueColor = valType === VALUE_TYPE_COLOR; + var frameIdx; + var lastFrame = this._lastFr; + var mathMin = Math.min; + var frame; + var nextFrame; + if (kfsNum === 1) { + frame = nextFrame = keyframes[0]; + } + else { + if (percent < 0) { + frameIdx = 0; + } + else if (percent < this._lastFrP) { + var start = mathMin(lastFrame + 1, kfsNum - 1); + for (frameIdx = start; frameIdx >= 0; frameIdx--) { + if (keyframes[frameIdx].percent <= percent) { + break; + } + } + frameIdx = mathMin(frameIdx, kfsNum - 2); + } + else { + for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) { + if (keyframes[frameIdx].percent > percent) { + break; + } + } + frameIdx = mathMin(frameIdx - 1, kfsNum - 2); + } + nextFrame = keyframes[frameIdx + 1]; + frame = keyframes[frameIdx]; + } + if (!(frame && nextFrame)) { + return; + } + this._lastFr = frameIdx; + this._lastFrP = percent; + var interval = (nextFrame.percent - frame.percent); + var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1); + if (nextFrame.easingFunc) { + w = nextFrame.easingFunc(w); + } + var targetArr = isAdditive ? this._additiveValue + : (isValueColor ? tmpRgba : target[propName]); + if ((isArrayValueType(valType) || isValueColor) && !targetArr) { + targetArr = this._additiveValue = []; + } + if (this.discrete) { + target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue; + } + else if (isArrayValueType(valType)) { + valType === VALUE_TYPE_1D_ARRAY + ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) + : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + } + else if (isGradientValueType(valType)) { + var val = frame[valueKey]; + var nextVal_1 = nextFrame[valueKey]; + var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT; + target[propName] = { + type: isLinearGradient_1 ? 'linear' : 'radial', + x: interpolateNumber(val.x, nextVal_1.x, w), + y: interpolateNumber(val.y, nextVal_1.y, w), + colorStops: map(val.colorStops, function (colorStop, idx) { + var nextColorStop = nextVal_1.colorStops[idx]; + return { + offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w), + color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w)) + }; + }), + global: nextVal_1.global + }; + if (isLinearGradient_1) { + target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w); + target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w); + } + else { + target[propName].r = interpolateNumber(val.r, nextVal_1.r, w); + } + } + else if (isValueColor) { + interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } + else { + var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w); + if (isAdditive) { + this._additiveValue = value; + } + else { + target[propName] = value; + } + } + if (isAdditive) { + this._addToTarget(target); + } + }; + Track.prototype._addToTarget = function (target) { + var valType = this.valType; + var propName = this.propName; + var additiveValue = this._additiveValue; + if (valType === VALUE_TYPE_NUMBER) { + target[propName] = target[propName] + additiveValue; + } + else if (valType === VALUE_TYPE_COLOR) { + parse(target[propName], tmpRgba); + add1DArray(tmpRgba, tmpRgba, additiveValue, 1); + target[propName] = rgba2String(tmpRgba); + } + else if (valType === VALUE_TYPE_1D_ARRAY) { + add1DArray(target[propName], target[propName], additiveValue, 1); + } + else if (valType === VALUE_TYPE_2D_ARRAY) { + add2DArray(target[propName], target[propName], additiveValue, 1); + } + }; + return Track; + }()); + var Animator = (function () { + function Animator(target, loop, allowDiscreteAnimation, additiveTo) { + this._tracks = {}; + this._trackKeys = []; + this._maxTime = 0; + this._started = 0; + this._clip = null; + this._target = target; + this._loop = loop; + if (loop && additiveTo) { + logError('Can\' use additive animation on looped animation.'); + return; + } + this._additiveAnimators = additiveTo; + this._allowDiscrete = allowDiscreteAnimation; + } + Animator.prototype.getMaxTime = function () { + return this._maxTime; + }; + Animator.prototype.getDelay = function () { + return this._delay; + }; + Animator.prototype.getLoop = function () { + return this._loop; + }; + Animator.prototype.getTarget = function () { + return this._target; + }; + Animator.prototype.changeTarget = function (target) { + this._target = target; + }; + Animator.prototype.when = function (time, props, easing) { + return this.whenWithKeys(time, props, keys(props), easing); + }; + Animator.prototype.whenWithKeys = function (time, props, propNames, easing) { + var tracks = this._tracks; + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + var track = tracks[propName]; + if (!track) { + track = tracks[propName] = new Track(propName); + var initialValue = void 0; + var additiveTrack = this._getAdditiveTrack(propName); + if (additiveTrack) { + var addtiveTrackKfs = additiveTrack.keyframes; + var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1]; + initialValue = lastFinalKf && lastFinalKf.value; + if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) { + initialValue = rgba2String(initialValue); + } + } + else { + initialValue = this._target[propName]; + } + if (initialValue == null) { + continue; + } + if (time > 0) { + track.addKeyframe(0, cloneValue(initialValue), easing); + } + this._trackKeys.push(propName); + } + track.addKeyframe(time, cloneValue(props[propName]), easing); + } + this._maxTime = Math.max(this._maxTime, time); + return this; + }; + Animator.prototype.pause = function () { + this._clip.pause(); + this._paused = true; + }; + Animator.prototype.resume = function () { + this._clip.resume(); + this._paused = false; + }; + Animator.prototype.isPaused = function () { + return !!this._paused; + }; + Animator.prototype.duration = function (duration) { + this._maxTime = duration; + this._force = true; + return this; + }; + Animator.prototype._doneCallback = function () { + this._setTracksFinished(); + this._clip = null; + var doneList = this._doneCbs; + if (doneList) { + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + } + }; + Animator.prototype._abortedCallback = function () { + this._setTracksFinished(); + var animation = this.animation; + var abortedList = this._abortedCbs; + if (animation) { + animation.removeClip(this._clip); + } + this._clip = null; + if (abortedList) { + for (var i = 0; i < abortedList.length; i++) { + abortedList[i].call(this); + } + } + }; + Animator.prototype._setTracksFinished = function () { + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < tracksKeys.length; i++) { + tracks[tracksKeys[i]].setFinished(); + } + }; + Animator.prototype._getAdditiveTrack = function (trackName) { + var additiveTrack; + var additiveAnimators = this._additiveAnimators; + if (additiveAnimators) { + for (var i = 0; i < additiveAnimators.length; i++) { + var track = additiveAnimators[i].getTrack(trackName); + if (track) { + additiveTrack = track; + } + } + } + return additiveTrack; + }; + Animator.prototype.start = function (easing) { + if (this._started > 0) { + return; + } + this._started = 1; + var self = this; + var tracks = []; + var maxTime = this._maxTime || 0; + for (var i = 0; i < this._trackKeys.length; i++) { + var propName = this._trackKeys[i]; + var track = this._tracks[propName]; + var additiveTrack = this._getAdditiveTrack(propName); + var kfs = track.keyframes; + var kfsNum = kfs.length; + track.prepare(maxTime, additiveTrack); + if (track.needsAnimate()) { + if (!this._allowDiscrete && track.discrete) { + var lastKf = kfs[kfsNum - 1]; + if (lastKf) { + self._target[track.propName] = lastKf.rawValue; + } + track.setFinished(); + } + else { + tracks.push(track); + } + } + } + if (tracks.length || this._force) { + var clip = new Clip({ + life: maxTime, + loop: this._loop, + delay: this._delay || 0, + onframe: function (percent) { + self._started = 2; + var additiveAnimators = self._additiveAnimators; + if (additiveAnimators) { + var stillHasAdditiveAnimator = false; + for (var i = 0; i < additiveAnimators.length; i++) { + if (additiveAnimators[i]._clip) { + stillHasAdditiveAnimator = true; + break; + } + } + if (!stillHasAdditiveAnimator) { + self._additiveAnimators = null; + } + } + for (var i = 0; i < tracks.length; i++) { + tracks[i].step(self._target, percent); + } + var onframeList = self._onframeCbs; + if (onframeList) { + for (var i = 0; i < onframeList.length; i++) { + onframeList[i](self._target, percent); + } + } + }, + ondestroy: function () { + self._doneCallback(); + } + }); + this._clip = clip; + if (this.animation) { + this.animation.addClip(clip); + } + if (easing) { + clip.setEasing(easing); + } + } + else { + this._doneCallback(); + } + return this; + }; + Animator.prototype.stop = function (forwardToLast) { + if (!this._clip) { + return; + } + var clip = this._clip; + if (forwardToLast) { + clip.onframe(1); + } + this._abortedCallback(); + }; + Animator.prototype.delay = function (time) { + this._delay = time; + return this; + }; + Animator.prototype.during = function (cb) { + if (cb) { + if (!this._onframeCbs) { + this._onframeCbs = []; + } + this._onframeCbs.push(cb); + } + return this; + }; + Animator.prototype.done = function (cb) { + if (cb) { + if (!this._doneCbs) { + this._doneCbs = []; + } + this._doneCbs.push(cb); + } + return this; + }; + Animator.prototype.aborted = function (cb) { + if (cb) { + if (!this._abortedCbs) { + this._abortedCbs = []; + } + this._abortedCbs.push(cb); + } + return this; + }; + Animator.prototype.getClip = function () { + return this._clip; + }; + Animator.prototype.getTrack = function (propName) { + return this._tracks[propName]; + }; + Animator.prototype.getTracks = function () { + var _this = this; + return map(this._trackKeys, function (key) { return _this._tracks[key]; }); + }; + Animator.prototype.stopTracks = function (propNames, forwardToLast) { + if (!propNames.length || !this._clip) { + return true; + } + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < propNames.length; i++) { + var track = tracks[propNames[i]]; + if (track && !track.isFinished()) { + if (forwardToLast) { + track.step(this._target, 1); + } + else if (this._started === 1) { + track.step(this._target, 0); + } + track.setFinished(); + } + } + var allAborted = true; + for (var i = 0; i < tracksKeys.length; i++) { + if (!tracks[tracksKeys[i]].isFinished()) { + allAborted = false; + break; + } + } + if (allAborted) { + this._abortedCallback(); + } + return allAborted; + }; + Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) { + if (!target) { + return; + } + trackKeys = trackKeys || this._trackKeys; + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track || track.isFinished()) { + continue; + } + var kfs = track.keyframes; + var kf = kfs[firstOrLast ? 0 : kfs.length - 1]; + if (kf) { + target[propName] = cloneValue(kf.rawValue); + } + } + }; + Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { + trackKeys = trackKeys || keys(finalProps); + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track) { + continue; + } + var kfs = track.keyframes; + if (kfs.length > 1) { + var lastKf = kfs.pop(); + track.addKeyframe(lastKf.time, finalProps[propName]); + track.prepare(this._maxTime, track.getAdditiveTrack()); + } + } + }; + return Animator; + }()); + + function getTime() { + return new Date().getTime(); + } + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation(opts) { + var _this = _super.call(this) || this; + _this._running = false; + _this._time = 0; + _this._pausedTime = 0; + _this._pauseStart = 0; + _this._paused = false; + opts = opts || {}; + _this.stage = opts.stage || {}; + return _this; + } + Animation.prototype.addClip = function (clip) { + if (clip.animation) { + this.removeClip(clip); + } + if (!this._head) { + this._head = this._tail = clip; + } + else { + this._tail.next = clip; + clip.prev = this._tail; + clip.next = null; + this._tail = clip; + } + clip.animation = this; + }; + Animation.prototype.addAnimator = function (animator) { + animator.animation = this; + var clip = animator.getClip(); + if (clip) { + this.addClip(clip); + } + }; + Animation.prototype.removeClip = function (clip) { + if (!clip.animation) { + return; + } + var prev = clip.prev; + var next = clip.next; + if (prev) { + prev.next = next; + } + else { + this._head = next; + } + if (next) { + next.prev = prev; + } + else { + this._tail = prev; + } + clip.next = clip.prev = clip.animation = null; + }; + Animation.prototype.removeAnimator = function (animator) { + var clip = animator.getClip(); + if (clip) { + this.removeClip(clip); + } + animator.animation = null; + }; + Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { + var time = getTime() - this._pausedTime; + var delta = time - this._time; + var clip = this._head; + while (clip) { + var nextClip = clip.next; + var finished = clip.step(time, delta); + if (finished) { + clip.ondestroy(); + this.removeClip(clip); + clip = nextClip; + } + else { + clip = nextClip; + } + } + this._time = time; + if (!notTriggerFrameAndStageUpdate) { + this.trigger('frame', delta); + this.stage.update && this.stage.update(); + } + }; + Animation.prototype._startLoop = function () { + var self = this; + this._running = true; + function step() { + if (self._running) { + requestAnimationFrame$1(step); + !self._paused && self.update(); + } + } + requestAnimationFrame$1(step); + }; + Animation.prototype.start = function () { + if (this._running) { + return; + } + this._time = getTime(); + this._pausedTime = 0; + this._startLoop(); + }; + Animation.prototype.stop = function () { + this._running = false; + }; + Animation.prototype.pause = function () { + if (!this._paused) { + this._pauseStart = getTime(); + this._paused = true; + } + }; + Animation.prototype.resume = function () { + if (this._paused) { + this._pausedTime += getTime() - this._pauseStart; + this._paused = false; + } + }; + Animation.prototype.clear = function () { + var clip = this._head; + while (clip) { + var nextClip = clip.next; + clip.prev = clip.next = clip.animation = null; + clip = nextClip; + } + this._head = this._tail = null; + }; + Animation.prototype.isFinished = function () { + return this._head == null; + }; + Animation.prototype.animate = function (target, options) { + options = options || {}; + this.start(); + var animator = new Animator(target, options.loop); + this.addAnimator(animator); + return animator; + }; + return Animation; + }(Eventful)); + + var TOUCH_CLICK_DELAY = 300; + var globalEventSupported = env.domSupported; + var localNativeListenerNames = (function () { + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + var pointerEventNameMap = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 + }; + var pointerHandlerNames = map(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; + }); + return { + mouse: mouseHandlerNames, + touch: touchHandlerNames, + pointer: pointerHandlerNames + }; + })(); + var globalNativeListenerNames = { + mouse: ['mousemove', 'mouseup'], + pointer: ['pointermove', 'pointerup'] + }; + var wheelEventSupported = false; + function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; + } + function setTouchTimer(scope) { + scope.touching = true; + if (scope.touchTimer != null) { + clearTimeout(scope.touchTimer); + scope.touchTimer = null; + } + scope.touchTimer = setTimeout(function () { + scope.touching = false; + scope.touchTimer = null; + }, 700); + } + function markTouch(event) { + event && (event.zrByTouch = true); + } + function normalizeGlobalEvent(instance, event) { + return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); + } + function isLocalEl(instance, el) { + var elTmp = el; + var isLocal = false; + while (elTmp && elTmp.nodeType !== 9 + && !(isLocal = elTmp.domBelongToZr + || (elTmp !== el && elTmp === instance.painterRoot))) { + elTmp = elTmp.parentNode; + } + return isLocal; + } + var FakeGlobalEvent = (function () { + function FakeGlobalEvent(instance, event) { + this.stopPropagation = noop; + this.stopImmediatePropagation = noop; + this.preventDefault = noop; + this.type = event.type; + this.target = this.currentTarget = instance.dom; + this.pointerType = event.pointerType; + this.clientX = event.clientX; + this.clientY = event.clientY; + } + return FakeGlobalEvent; + }()); + var localDOMHandlers = { + mousedown: function (event) { + event = normalizeEvent(this.dom, event); + this.__mayPointerCapture = [event.zrX, event.zrY]; + this.trigger('mousedown', event); + }, + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + var downPoint = this.__mayPointerCapture; + if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { + this.__togglePointerCapture(true); + } + this.trigger('mousemove', event); + }, + mouseup: function (event) { + event = normalizeEvent(this.dom, event); + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + }, + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + var element = event.toElement || event.relatedTarget; + if (!isLocalEl(this, element)) { + if (this.__pointerCapturing) { + event.zrEventControl = 'no_globalout'; + } + this.trigger('mouseout', event); + } + }, + wheel: function (event) { + wheelEventSupported = true; + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + mousewheel: function (event) { + if (wheelEventSupported) { + return; + } + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + touchstart: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.__lastTouchMoment = new Date(); + this.handler.processGesture(event, 'start'); + localDOMHandlers.mousemove.call(this, event); + localDOMHandlers.mousedown.call(this, event); + }, + touchmove: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'change'); + localDOMHandlers.mousemove.call(this, event); + }, + touchend: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'end'); + localDOMHandlers.mouseup.call(this, event); + if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { + localDOMHandlers.click.call(this, event); + } + }, + pointerdown: function (event) { + localDOMHandlers.mousedown.call(this, event); + }, + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + localDOMHandlers.mouseup.call(this, event); + }, + pointerout: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mouseout.call(this, event); + } + } + }; + each(['click', 'dblclick', 'contextmenu'], function (name) { + localDOMHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; + }); + var globalDOMHandlers = { + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + globalDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + globalDOMHandlers.mouseup.call(this, event); + }, + mousemove: function (event) { + this.trigger('mousemove', event); + }, + mouseup: function (event) { + var pointerCaptureReleasing = this.__pointerCapturing; + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + if (pointerCaptureReleasing) { + event.zrEventControl = 'only_globalout'; + this.trigger('mouseout', event); + } + } + }; + function mountLocalDOMEventListeners(instance, scope) { + var domHandlers = scope.domHandlers; + if (env.pointerEventsSupported) { + each(localNativeListenerNames.pointer, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + }); + }); + } + else { + if (env.touchEventsSupported) { + each(localNativeListenerNames.touch, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + setTouchTimer(scope); + }); + }); + } + each(localNativeListenerNames.mouse, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + event = getNativeEvent(event); + if (!scope.touching) { + domHandlers[nativeEventName].call(instance, event); + } + }); + }); + } + } + function mountGlobalDOMEventListeners(instance, scope) { + if (env.pointerEventsSupported) { + each(globalNativeListenerNames.pointer, mount); + } + else if (!env.touchEventsSupported) { + each(globalNativeListenerNames.mouse, mount); + } + function mount(nativeEventName) { + function nativeEventListener(event) { + event = getNativeEvent(event); + if (!isLocalEl(instance, event.target)) { + event = normalizeGlobalEvent(instance, event); + scope.domHandlers[nativeEventName].call(instance, event); + } + } + mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true }); + } + } + function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { + scope.mounted[nativeEventName] = listener; + scope.listenerOpts[nativeEventName] = opt; + addEventListener(scope.domTarget, nativeEventName, listener, opt); + } + function unmountDOMEventListeners(scope) { + var mounted = scope.mounted; + for (var nativeEventName in mounted) { + if (mounted.hasOwnProperty(nativeEventName)) { + removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); + } + } + scope.mounted = {}; + } + var DOMHandlerScope = (function () { + function DOMHandlerScope(domTarget, domHandlers) { + this.mounted = {}; + this.listenerOpts = {}; + this.touching = false; + this.domTarget = domTarget; + this.domHandlers = domHandlers; + } + return DOMHandlerScope; + }()); + var HandlerDomProxy = (function (_super) { + __extends(HandlerDomProxy, _super); + function HandlerDomProxy(dom, painterRoot) { + var _this = _super.call(this) || this; + _this.__pointerCapturing = false; + _this.dom = dom; + _this.painterRoot = painterRoot; + _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); + if (globalEventSupported) { + _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); + } + mountLocalDOMEventListeners(_this, _this._localHandlerScope); + return _this; + } + HandlerDomProxy.prototype.dispose = function () { + unmountDOMEventListeners(this._localHandlerScope); + if (globalEventSupported) { + unmountDOMEventListeners(this._globalHandlerScope); + } + }; + HandlerDomProxy.prototype.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); + }; + HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { + this.__mayPointerCapture = null; + if (globalEventSupported + && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { + this.__pointerCapturing = isPointerCapturing; + var globalHandlerScope = this._globalHandlerScope; + isPointerCapturing + ? mountGlobalDOMEventListeners(this, globalHandlerScope) + : unmountDOMEventListeners(globalHandlerScope); + } + }; + return HandlerDomProxy; + }(Eventful)); + + var dpr = 1; + if (env.hasGlobalWindow) { + dpr = Math.max(window.devicePixelRatio + || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI) + || 1, 1); + } + var devicePixelRatio = dpr; + var DARK_MODE_THRESHOLD = 0.4; + var DARK_LABEL_COLOR = '#333'; + var LIGHT_LABEL_COLOR = '#ccc'; + var LIGHTER_LABEL_COLOR = '#eee'; + + var mIdentity = identity; + var EPSILON$2 = 5e-5; + function isNotAroundZero$1(val) { + return val > EPSILON$2 || val < -EPSILON$2; + } + var scaleTmp = []; + var tmpTransform = []; + var originTransform = create$1(); + var abs = Math.abs; + var Transformable = (function () { + function Transformable() { + } + Transformable.prototype.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); + }; + Transformable.prototype.setPosition = function (arr) { + this.x = arr[0]; + this.y = arr[1]; + }; + Transformable.prototype.setScale = function (arr) { + this.scaleX = arr[0]; + this.scaleY = arr[1]; + }; + Transformable.prototype.setSkew = function (arr) { + this.skewX = arr[0]; + this.skewY = arr[1]; + }; + Transformable.prototype.setOrigin = function (arr) { + this.originX = arr[0]; + this.originY = arr[1]; + }; + Transformable.prototype.needLocalTransform = function () { + return isNotAroundZero$1(this.rotation) + || isNotAroundZero$1(this.x) + || isNotAroundZero$1(this.y) + || isNotAroundZero$1(this.scaleX - 1) + || isNotAroundZero$1(this.scaleY - 1) + || isNotAroundZero$1(this.skewX) + || isNotAroundZero$1(this.skewY); + }; + Transformable.prototype.updateTransform = function () { + var parentTransform = this.parent && this.parent.transform; + var needLocalTransform = this.needLocalTransform(); + var m = this.transform; + if (!(needLocalTransform || parentTransform)) { + m && mIdentity(m); + return; + } + m = m || create$1(); + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + if (parentTransform) { + if (needLocalTransform) { + mul$1(m, parentTransform, m); + } + else { + copy$1(m, parentTransform); + } + } + this.transform = m; + this._resolveGlobalScaleRatio(m); + }; + Transformable.prototype._resolveGlobalScaleRatio = function (m) { + var globalScaleRatio = this.globalScaleRatio; + if (globalScaleRatio != null && globalScaleRatio !== 1) { + this.getGlobalScale(scaleTmp); + var relX = scaleTmp[0] < 0 ? -1 : 1; + var relY = scaleTmp[1] < 0 ? -1 : 1; + var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; + var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; + m[0] *= sx; + m[1] *= sx; + m[2] *= sy; + m[3] *= sy; + } + this.invTransform = this.invTransform || create$1(); + invert(this.invTransform, m); + }; + Transformable.prototype.getComputedTransform = function () { + var transformNode = this; + var ancestors = []; + while (transformNode) { + ancestors.push(transformNode); + transformNode = transformNode.parent; + } + while (transformNode = ancestors.pop()) { + transformNode.updateTransform(); + } + return this.transform; + }; + Transformable.prototype.setLocalTransform = function (m) { + if (!m) { + return; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var rotation = Math.atan2(m[1], m[0]); + var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]); + sy = Math.sqrt(sy) * Math.cos(shearX); + sx = Math.sqrt(sx); + this.skewX = shearX; + this.skewY = 0; + this.rotation = -rotation; + this.x = +m[4]; + this.y = +m[5]; + this.scaleX = sx; + this.scaleY = sy; + this.originX = 0; + this.originY = 0; + }; + Transformable.prototype.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + mul$1(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var ox = this.originX; + var oy = this.originY; + if (ox || oy) { + originTransform[4] = ox; + originTransform[5] = oy; + mul$1(tmpTransform, m, originTransform); + tmpTransform[4] -= ox; + tmpTransform[5] -= oy; + m = tmpTransform; + } + this.setLocalTransform(m); + }; + Transformable.prototype.getGlobalScale = function (out) { + var m = this.transform; + out = out || []; + if (!m) { + out[0] = 1; + out[1] = 1; + return out; + } + out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + out[0] = -out[0]; + } + if (m[3] < 0) { + out[1] = -out[1]; + } + return out; + }; + Transformable.prototype.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform(v2, v2, invTransform); + } + return v2; + }; + Transformable.prototype.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform(v2, v2, transform); + } + return v2; + }; + Transformable.prototype.getLineScale = function () { + var m = this.transform; + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + }; + Transformable.prototype.copyTransform = function (source) { + copyTransform(this, source); + }; + Transformable.getLocalTransform = function (target, m) { + m = m || []; + var ox = target.originX || 0; + var oy = target.originY || 0; + var sx = target.scaleX; + var sy = target.scaleY; + var ax = target.anchorX; + var ay = target.anchorY; + var rotation = target.rotation || 0; + var x = target.x; + var y = target.y; + var skewX = target.skewX ? Math.tan(target.skewX) : 0; + var skewY = target.skewY ? Math.tan(-target.skewY) : 0; + if (ox || oy || ax || ay) { + var dx = ox + ax; + var dy = oy + ay; + m[4] = -dx * sx - skewX * dy * sy; + m[5] = -dy * sy - skewY * dx * sx; + } + else { + m[4] = m[5] = 0; + } + m[0] = sx; + m[3] = sy; + m[1] = skewY * sx; + m[2] = skewX * sy; + rotation && rotate(m, m, rotation); + m[4] += ox + x; + m[5] += oy + y; + return m; + }; + Transformable.initDefaultProps = (function () { + var proto = Transformable.prototype; + proto.scaleX = + proto.scaleY = + proto.globalScaleRatio = 1; + proto.x = + proto.y = + proto.originX = + proto.originY = + proto.skewX = + proto.skewY = + proto.rotation = + proto.anchorX = + proto.anchorY = 0; + })(); + return Transformable; + }()); + var TRANSFORMABLE_PROPS = [ + 'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY' + ]; + function copyTransform(target, source) { + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var propName = TRANSFORMABLE_PROPS[i]; + target[propName] = source[propName]; + } + } + + var textWidthCache = {}; + function getWidth(text, font) { + font = font || DEFAULT_FONT; + var cacheOfFont = textWidthCache[font]; + if (!cacheOfFont) { + cacheOfFont = textWidthCache[font] = new LRU(500); + } + var width = cacheOfFont.get(text); + if (width == null) { + width = platformApi.measureText(text, font).width; + cacheOfFont.put(text, width); + } + return width; + } + function innerGetBoundingRect(text, font, textAlign, textBaseline) { + var width = getWidth(text, font); + var height = getLineHeight(font); + var x = adjustTextX(0, width, textAlign); + var y = adjustTextY$1(0, height, textBaseline); + var rect = new BoundingRect(x, y, width, height); + return rect; + } + function getBoundingRect(text, font, textAlign, textBaseline) { + var textLines = ((text || '') + '').split('\n'); + var len = textLines.length; + if (len === 1) { + return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); + } + else { + var uniondRect = new BoundingRect(0, 0, 0, 0); + for (var i = 0; i < textLines.length; i++) { + var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); + i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); + } + return uniondRect; + } + } + function adjustTextX(x, width, textAlign) { + if (textAlign === 'right') { + x -= width; + } + else if (textAlign === 'center') { + x -= width / 2; + } + return x; + } + function adjustTextY$1(y, height, verticalAlign) { + if (verticalAlign === 'middle') { + y -= height / 2; + } + else if (verticalAlign === 'bottom') { + y -= height; + } + return y; + } + function getLineHeight(font) { + return getWidth('国', font); + } + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + function calculateTextPosition(out, opts, rect) { + var textPosition = opts.position || 'inside'; + var distance = opts.distance != null ? opts.distance : 5; + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + var x = rect.x; + var y = rect.y; + var textAlign = 'left'; + var textVerticalAlign = 'top'; + if (textPosition instanceof Array) { + x += parsePercent(textPosition[0], rect.width); + y += parsePercent(textPosition[1], rect.height); + textAlign = null; + textVerticalAlign = null; + } + else { + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + } + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + } + + var PRESERVED_NORMAL_STATE = '__zr_normal__'; + var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']); + var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = true; + return obj; + }, { ignore: false }); + var tmpTextPosCalcRes = {}; + var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); + var Element = (function () { + function Element(props) { + this.id = guid(); + this.animators = []; + this.currentStates = []; + this.states = {}; + this._init(props); + } + Element.prototype._init = function (props) { + this.attr(props); + }; + Element.prototype.drift = function (dx, dy, e) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + this.decomposeTransform(); + this.markRedraw(); + }; + Element.prototype.beforeUpdate = function () { }; + Element.prototype.afterUpdate = function () { }; + Element.prototype.update = function () { + this.updateTransform(); + if (this.__dirty) { + this.updateInnerText(); + } + }; + Element.prototype.updateInnerText = function (forceUpdate) { + var textEl = this._textContent; + if (textEl && (!textEl.ignore || forceUpdate)) { + if (!this.textConfig) { + this.textConfig = {}; + } + var textConfig = this.textConfig; + var isLocal = textConfig.local; + var innerTransformable = textEl.innerTransformable; + var textAlign = void 0; + var textVerticalAlign = void 0; + var textStyleChanged = false; + innerTransformable.parent = isLocal ? this : null; + var innerOrigin = false; + innerTransformable.copyTransform(textEl); + if (textConfig.position != null) { + var layoutRect = tmpBoundingRect; + if (textConfig.layoutRect) { + layoutRect.copy(textConfig.layoutRect); + } + else { + layoutRect.copy(this.getBoundingRect()); + } + if (!isLocal) { + layoutRect.applyTransform(this.transform); + } + if (this.calculateTextPosition) { + this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + else { + calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + innerTransformable.x = tmpTextPosCalcRes.x; + innerTransformable.y = tmpTextPosCalcRes.y; + textAlign = tmpTextPosCalcRes.align; + textVerticalAlign = tmpTextPosCalcRes.verticalAlign; + var textOrigin = textConfig.origin; + if (textOrigin && textConfig.rotation != null) { + var relOriginX = void 0; + var relOriginY = void 0; + if (textOrigin === 'center') { + relOriginX = layoutRect.width * 0.5; + relOriginY = layoutRect.height * 0.5; + } + else { + relOriginX = parsePercent(textOrigin[0], layoutRect.width); + relOriginY = parsePercent(textOrigin[1], layoutRect.height); + } + innerOrigin = true; + innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x); + innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y); + } + } + if (textConfig.rotation != null) { + innerTransformable.rotation = textConfig.rotation; + } + var textOffset = textConfig.offset; + if (textOffset) { + innerTransformable.x += textOffset[0]; + innerTransformable.y += textOffset[1]; + if (!innerOrigin) { + innerTransformable.originX = -textOffset[0]; + innerTransformable.originY = -textOffset[1]; + } + } + var isInside = textConfig.inside == null + ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0) + : textConfig.inside; + var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); + var textFill = void 0; + var textStroke = void 0; + var autoStroke = void 0; + if (isInside && this.canBeInsideText()) { + textFill = textConfig.insideFill; + textStroke = textConfig.insideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getInsideTextFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getInsideTextStroke(textFill); + autoStroke = true; + } + } + else { + textFill = textConfig.outsideFill; + textStroke = textConfig.outsideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getOutsideFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getOutsideStroke(textFill); + autoStroke = true; + } + } + textFill = textFill || '#000'; + if (textFill !== innerTextDefaultStyle.fill + || textStroke !== innerTextDefaultStyle.stroke + || autoStroke !== innerTextDefaultStyle.autoStroke + || textAlign !== innerTextDefaultStyle.align + || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { + textStyleChanged = true; + innerTextDefaultStyle.fill = textFill; + innerTextDefaultStyle.stroke = textStroke; + innerTextDefaultStyle.autoStroke = autoStroke; + innerTextDefaultStyle.align = textAlign; + innerTextDefaultStyle.verticalAlign = textVerticalAlign; + textEl.setDefaultTextStyle(innerTextDefaultStyle); + } + textEl.__dirty |= REDRAW_BIT; + if (textStyleChanged) { + textEl.dirtyStyle(true); + } + } + }; + Element.prototype.canBeInsideText = function () { + return true; + }; + Element.prototype.getInsideTextFill = function () { + return '#fff'; + }; + Element.prototype.getInsideTextStroke = function (textFill) { + return '#000'; + }; + Element.prototype.getOutsideFill = function () { + return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; + }; + Element.prototype.getOutsideStroke = function (textFill) { + var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); + var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor); + if (!colorArr) { + colorArr = [255, 255, 255, 1]; + } + var alpha = colorArr[3]; + var isDark = this.__zr.isDarkMode(); + for (var i = 0; i < 3; i++) { + colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); + } + colorArr[3] = 1; + return stringify(colorArr, 'rgba'); + }; + Element.prototype.traverse = function (cb, context) { }; + Element.prototype.attrKV = function (key, value) { + if (key === 'textConfig') { + this.setTextConfig(value); + } + else if (key === 'textContent') { + this.setTextContent(value); + } + else if (key === 'clipPath') { + this.setClipPath(value); + } + else if (key === 'extra') { + this.extra = this.extra || {}; + extend(this.extra, value); + } + else { + this[key] = value; + } + }; + Element.prototype.hide = function () { + this.ignore = true; + this.markRedraw(); + }; + Element.prototype.show = function () { + this.ignore = false; + this.markRedraw(); + }; + Element.prototype.attr = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.attrKV(keyOrObj, value); + } + else if (isObject(keyOrObj)) { + var obj = keyOrObj; + var keysArr = keys(obj); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + this.attrKV(key, keyOrObj[key]); + } + } + this.markRedraw(); + return this; + }; + Element.prototype.saveCurrentToNormalState = function (toState) { + this._innerSaveToNormal(toState); + var normalState = this._normalState; + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var fromStateTransition = animator.__fromStateTransition; + if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { + continue; + } + var targetName = animator.targetName; + var target = targetName + ? normalState[targetName] : normalState; + animator.saveTo(target); + } + }; + Element.prototype._innerSaveToNormal = function (toState) { + var normalState = this._normalState; + if (!normalState) { + normalState = this._normalState = {}; + } + if (toState.textConfig && !normalState.textConfig) { + normalState.textConfig = this.textConfig; + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); + }; + Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) { + for (var i = 0; i < primaryKeys.length; i++) { + var key = primaryKeys[i]; + if (toState[key] != null && !(key in normalState)) { + normalState[key] = this[key]; + } + } + }; + Element.prototype.hasState = function () { + return this.currentStates.length > 0; + }; + Element.prototype.getState = function (name) { + return this.states[name]; + }; + Element.prototype.ensureState = function (name) { + var states = this.states; + if (!states[name]) { + states[name] = {}; + } + return states[name]; + }; + Element.prototype.clearStates = function (noAnimation) { + this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); + }; + Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) { + var toNormalState = stateName === PRESERVED_NORMAL_STATE; + var hasStates = this.hasState(); + if (!hasStates && toNormalState) { + return; + } + var currentStates = this.currentStates; + var animationCfg = this.stateTransition; + if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { + return; + } + var state; + if (this.stateProxy && !toNormalState) { + state = this.stateProxy(stateName); + } + if (!state) { + state = (this.states && this.states[stateName]); + } + if (!state && !toNormalState) { + logError("State " + stateName + " not exists."); + return; + } + if (!toNormalState) { + this.saveCurrentToNormalState(state); + } + var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (toNormalState) { + this.currentStates = []; + this._normalState = {}; + } + else { + if (!keepCurrentStates) { + this.currentStates = [stateName]; + } + else { + this.currentStates.push(stateName); + } + } + this._updateAnimationTargets(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + return state; + }; + Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) { + if (!states.length) { + this.clearStates(); + } + else { + var stateObjects = []; + var currentStates = this.currentStates; + var len = states.length; + var notChange = len === currentStates.length; + if (notChange) { + for (var i = 0; i < len; i++) { + if (states[i] !== currentStates[i]) { + notChange = false; + break; + } + } + } + if (notChange) { + return; + } + for (var i = 0; i < len; i++) { + var stateName = states[i]; + var stateObj = void 0; + if (this.stateProxy) { + stateObj = this.stateProxy(stateName, states); + } + if (!stateObj) { + stateObj = this.states[stateName]; + } + if (stateObj) { + stateObjects.push(stateObj); + } + } + var lastStateObj = stateObjects[len - 1]; + var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + var mergedState = this._mergeStates(stateObjects); + var animationCfg = this.stateTransition; + this.saveCurrentToNormalState(mergedState); + this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useStates(states, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useStates(states, noAnimation, useHoverLayer); + } + this._updateAnimationTargets(); + this.currentStates = states.slice(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + } + }; + Element.prototype._updateAnimationTargets = function () { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + if (animator.targetName) { + animator.changeTarget(this[animator.targetName]); + } + } + }; + Element.prototype.removeState = function (state) { + var idx = indexOf(this.currentStates, state); + if (idx >= 0) { + var currentStates = this.currentStates.slice(); + currentStates.splice(idx, 1); + this.useStates(currentStates); + } + }; + Element.prototype.replaceState = function (oldState, newState, forceAdd) { + var currentStates = this.currentStates.slice(); + var idx = indexOf(currentStates, oldState); + var newStateExists = indexOf(currentStates, newState) >= 0; + if (idx >= 0) { + if (!newStateExists) { + currentStates[idx] = newState; + } + else { + currentStates.splice(idx, 1); + } + } + else if (forceAdd && !newStateExists) { + currentStates.push(newState); + } + this.useStates(currentStates); + }; + Element.prototype.toggleState = function (state, enable) { + if (enable) { + this.useState(state, true); + } + else { + this.removeState(state); + } + }; + Element.prototype._mergeStates = function (states) { + var mergedState = {}; + var mergedTextConfig; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + extend(mergedState, state); + if (state.textConfig) { + mergedTextConfig = mergedTextConfig || {}; + extend(mergedTextConfig, state.textConfig); + } + } + if (mergedTextConfig) { + mergedState.textConfig = mergedTextConfig; + } + return mergedState; + }; + Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + var needsRestoreToNormal = !(state && keepCurrentStates); + if (state && state.textConfig) { + this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); + extend(this.textConfig, state.textConfig); + } + else if (needsRestoreToNormal) { + if (normalState.textConfig) { + this.textConfig = normalState.textConfig; + } + } + var transitionTarget = {}; + var hasTransition = false; + for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) { + var key = PRIMARY_STATES_KEYS[i]; + var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; + if (state && state[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = state[key]; + } + else { + this[key] = state[key]; + } + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = normalState[key]; + } + else { + this[key] = normalState[key]; + } + } + } + } + if (!transition) { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var targetName = animator.targetName; + if (!animator.getLoop()) { + animator.__changeFinalValue(targetName + ? (state || normalState)[targetName] + : (state || normalState)); + } + } + } + if (hasTransition) { + this._transitionState(stateName, transitionTarget, animationCfg); + } + }; + Element.prototype._attachComponent = function (componentEl) { + if (componentEl.__zr && !componentEl.__hostTarget) { + if ("development" !== 'production') { + throw new Error('Text element has been added to zrender.'); + } + return; + } + if (componentEl === this) { + if ("development" !== 'production') { + throw new Error('Recursive component attachment.'); + } + return; + } + var zr = this.__zr; + if (zr) { + componentEl.addSelfToZr(zr); + } + componentEl.__zr = zr; + componentEl.__hostTarget = this; + }; + Element.prototype._detachComponent = function (componentEl) { + if (componentEl.__zr) { + componentEl.removeSelfFromZr(componentEl.__zr); + } + componentEl.__zr = null; + componentEl.__hostTarget = null; + }; + Element.prototype.getClipPath = function () { + return this._clipPath; + }; + Element.prototype.setClipPath = function (clipPath) { + if (this._clipPath && this._clipPath !== clipPath) { + this.removeClipPath(); + } + this._attachComponent(clipPath); + this._clipPath = clipPath; + this.markRedraw(); + }; + Element.prototype.removeClipPath = function () { + var clipPath = this._clipPath; + if (clipPath) { + this._detachComponent(clipPath); + this._clipPath = null; + this.markRedraw(); + } + }; + Element.prototype.getTextContent = function () { + return this._textContent; + }; + Element.prototype.setTextContent = function (textEl) { + var previousTextContent = this._textContent; + if (previousTextContent === textEl) { + return; + } + if (previousTextContent && previousTextContent !== textEl) { + this.removeTextContent(); + } + if ("development" !== 'production') { + if (textEl.__zr && !textEl.__hostTarget) { + throw new Error('Text element has been added to zrender.'); + } + } + textEl.innerTransformable = new Transformable(); + this._attachComponent(textEl); + this._textContent = textEl; + this.markRedraw(); + }; + Element.prototype.setTextConfig = function (cfg) { + if (!this.textConfig) { + this.textConfig = {}; + } + extend(this.textConfig, cfg); + this.markRedraw(); + }; + Element.prototype.removeTextConfig = function () { + this.textConfig = null; + this.markRedraw(); + }; + Element.prototype.removeTextContent = function () { + var textEl = this._textContent; + if (textEl) { + textEl.innerTransformable = null; + this._detachComponent(textEl); + this._textContent = null; + this._innerTextDefaultStyle = null; + this.markRedraw(); + } + }; + Element.prototype.getTextGuideLine = function () { + return this._textGuide; + }; + Element.prototype.setTextGuideLine = function (guideLine) { + if (this._textGuide && this._textGuide !== guideLine) { + this.removeTextGuideLine(); + } + this._attachComponent(guideLine); + this._textGuide = guideLine; + this.markRedraw(); + }; + Element.prototype.removeTextGuideLine = function () { + var textGuide = this._textGuide; + if (textGuide) { + this._detachComponent(textGuide); + this._textGuide = null; + this.markRedraw(); + } + }; + Element.prototype.markRedraw = function () { + this.__dirty |= REDRAW_BIT; + var zr = this.__zr; + if (zr) { + if (this.__inHover) { + zr.refreshHover(); + } + else { + zr.refresh(); + } + } + if (this.__hostTarget) { + this.__hostTarget.markRedraw(); + } + }; + Element.prototype.dirty = function () { + this.markRedraw(); + }; + Element.prototype._toggleHoverLayerFlag = function (inHover) { + this.__inHover = inHover; + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.__inHover = inHover; + } + if (textGuide) { + textGuide.__inHover = inHover; + } + }; + Element.prototype.addSelfToZr = function (zr) { + if (this.__zr === zr) { + return; + } + this.__zr = zr; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.addSelfToZr(zr); + } + if (this._textContent) { + this._textContent.addSelfToZr(zr); + } + if (this._textGuide) { + this._textGuide.addSelfToZr(zr); + } + }; + Element.prototype.removeSelfFromZr = function (zr) { + if (!this.__zr) { + return; + } + this.__zr = null; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.removeSelfFromZr(zr); + } + if (this._textContent) { + this._textContent.removeSelfFromZr(zr); + } + if (this._textGuide) { + this._textGuide.removeSelfFromZr(zr); + } + }; + Element.prototype.animate = function (key, loop, allowDiscreteAnimation) { + var target = key ? this[key] : this; + if ("development" !== 'production') { + if (!target) { + logError('Property "' + + key + + '" is not existed in element ' + + this.id); + return; + } + } + var animator = new Animator(target, loop, allowDiscreteAnimation); + key && (animator.targetName = key); + this.addAnimator(animator, key); + return animator; + }; + Element.prototype.addAnimator = function (animator, key) { + var zr = this.__zr; + var el = this; + animator.during(function () { + el.updateDuringAnimation(key); + }).done(function () { + var animators = el.animators; + var idx = indexOf(animators, animator); + if (idx >= 0) { + animators.splice(idx, 1); + } + }); + this.animators.push(animator); + if (zr) { + zr.animation.addAnimator(animator); + } + zr && zr.wakeUp(); + }; + Element.prototype.updateDuringAnimation = function (key) { + this.markRedraw(); + }; + Element.prototype.stopAnimation = function (scope, forwardToLast) { + var animators = this.animators; + var len = animators.length; + var leftAnimators = []; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + if (!scope || scope === animator.scope) { + animator.stop(forwardToLast); + } + else { + leftAnimators.push(animator); + } + } + this.animators = leftAnimators; + return this; + }; + Element.prototype.animateTo = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps); + }; + Element.prototype.animateFrom = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps, true); + }; + Element.prototype._transitionState = function (stateName, target, cfg, animationProps) { + var animators = animateTo(this, target, cfg, animationProps); + for (var i = 0; i < animators.length; i++) { + animators[i].__fromStateTransition = stateName; + } + }; + Element.prototype.getBoundingRect = function () { + return null; + }; + Element.prototype.getPaintRect = function () { + return null; + }; + Element.initDefaultProps = (function () { + var elProto = Element.prototype; + elProto.type = 'element'; + elProto.name = ''; + elProto.ignore = + elProto.silent = + elProto.isGroup = + elProto.draggable = + elProto.dragging = + elProto.ignoreClip = + elProto.__inHover = false; + elProto.__dirty = REDRAW_BIT; + var logs = {}; + function logDeprecatedError(key, xKey, yKey) { + if (!logs[key + xKey + yKey]) { + console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead"); + logs[key + xKey + yKey] = true; + } + } + function createLegacyProperty(key, privateKey, xKey, yKey) { + Object.defineProperty(elProto, key, { + get: function () { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + if (!this[privateKey]) { + var pos = this[privateKey] = []; + enhanceArray(this, pos); + } + return this[privateKey]; + }, + set: function (pos) { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + this[xKey] = pos[0]; + this[yKey] = pos[1]; + this[privateKey] = pos; + enhanceArray(this, pos); + } + }); + function enhanceArray(self, pos) { + Object.defineProperty(pos, 0, { + get: function () { + return self[xKey]; + }, + set: function (val) { + self[xKey] = val; + } + }); + Object.defineProperty(pos, 1, { + get: function () { + return self[yKey]; + }, + set: function (val) { + self[yKey] = val; + } + }); + } + } + if (Object.defineProperty) { + createLegacyProperty('position', '_legacyPos', 'x', 'y'); + createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY'); + createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY'); + } + })(); + return Element; + }()); + mixin(Element, Eventful); + mixin(Element, Transformable); + function animateTo(animatable, target, cfg, animationProps, reverse) { + cfg = cfg || {}; + var animators = []; + animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse); + var finishCount = animators.length; + var doneHappened = false; + var cfgDone = cfg.done; + var cfgAborted = cfg.aborted; + var doneCb = function () { + doneHappened = true; + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + var abortedCb = function () { + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + if (!finishCount) { + cfgDone && cfgDone(); + } + if (animators.length > 0 && cfg.during) { + animators[0].during(function (target, percent) { + cfg.during(percent); + }); + } + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; + if (doneCb) { + animator.done(doneCb); + } + if (abortedCb) { + animator.aborted(abortedCb); + } + if (cfg.force) { + animator.duration(cfg.duration); + } + animator.start(cfg.easing); + } + return animators; + } + function copyArrShallow(source, target, len) { + for (var i = 0; i < len; i++) { + source[i] = target[i]; + } + } + function is2DArray(value) { + return isArrayLike(value[0]); + } + function copyValue(target, source, key) { + if (isArrayLike(source[key])) { + if (!isArrayLike(target[key])) { + target[key] = []; + } + if (isTypedArray(source[key])) { + var len = source[key].length; + if (target[key].length !== len) { + target[key] = new (source[key].constructor)(len); + copyArrShallow(target[key], source[key], len); + } + } + else { + var sourceArr = source[key]; + var targetArr = target[key]; + var len0 = sourceArr.length; + if (is2DArray(sourceArr)) { + var len1 = sourceArr[0].length; + for (var i = 0; i < len0; i++) { + if (!targetArr[i]) { + targetArr[i] = Array.prototype.slice.call(sourceArr[i]); + } + else { + copyArrShallow(targetArr[i], sourceArr[i], len1); + } + } + } + else { + copyArrShallow(targetArr, sourceArr, len0); + } + targetArr.length = sourceArr.length; + } + } + else { + target[key] = source[key]; + } + } + function isValueSame(val1, val2) { + return val1 === val2 + || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2); + } + function is1DArraySame(arr0, arr1) { + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + return true; + } + function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) { + var targetKeys = keys(target); + var duration = cfg.duration; + var delay = cfg.delay; + var additive = cfg.additive; + var setToFinal = cfg.setToFinal; + var animateAll = !isObject(animationProps); + var existsAnimators = animatable.animators; + var animationKeys = []; + for (var k = 0; k < targetKeys.length; k++) { + var innerKey = targetKeys[k]; + var targetVal = target[innerKey]; + if (targetVal != null && animateObj[innerKey] != null + && (animateAll || animationProps[innerKey])) { + if (isObject(targetVal) + && !isArrayLike(targetVal) + && !isGradientObject(targetVal)) { + if (topKey) { + if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + } + continue; + } + animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse); + } + else { + animationKeys.push(innerKey); + } + } + else if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + animationKeys.push(innerKey); + } + } + var keyLen = animationKeys.length; + if (!additive && keyLen) { + for (var i = 0; i < existsAnimators.length; i++) { + var animator = existsAnimators[i]; + if (animator.targetName === topKey) { + var allAborted = animator.stopTracks(animationKeys); + if (allAborted) { + var idx = indexOf(existsAnimators, animator); + existsAnimators.splice(idx, 1); + } + } + } + } + if (!cfg.force) { + animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); }); + keyLen = animationKeys.length; + } + if (keyLen > 0 + || (cfg.force && !animators.length)) { + var revertedSource = void 0; + var reversedTarget = void 0; + var sourceClone = void 0; + if (reverse) { + reversedTarget = {}; + if (setToFinal) { + revertedSource = {}; + } + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + reversedTarget[innerKey] = animateObj[innerKey]; + if (setToFinal) { + revertedSource[innerKey] = target[innerKey]; + } + else { + animateObj[innerKey] = target[innerKey]; + } + } + } + else if (setToFinal) { + sourceClone = {}; + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + sourceClone[innerKey] = cloneValue(animateObj[innerKey]); + copyValue(animateObj, target, innerKey); + } + } + var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null); + animator.targetName = topKey; + if (cfg.scope) { + animator.scope = cfg.scope; + } + if (setToFinal && revertedSource) { + animator.whenWithKeys(0, revertedSource, animationKeys); + } + if (sourceClone) { + animator.whenWithKeys(0, sourceClone, animationKeys); + } + animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0); + animatable.addAnimator(animator, topKey); + animators.push(animator); + } + } + + var Group = (function (_super) { + __extends(Group, _super); + function Group(opts) { + var _this = _super.call(this) || this; + _this.isGroup = true; + _this._children = []; + _this.attr(opts); + return _this; + } + Group.prototype.childrenRef = function () { + return this._children; + }; + Group.prototype.children = function () { + return this._children.slice(); + }; + Group.prototype.childAt = function (idx) { + return this._children[idx]; + }; + Group.prototype.childOfName = function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }; + Group.prototype.childCount = function () { + return this._children.length; + }; + Group.prototype.add = function (child) { + if (child) { + if (child !== this && child.parent !== this) { + this._children.push(child); + this._doAdd(child); + } + if ("development" !== 'production') { + if (child.__hostTarget) { + throw 'This elemenet has been used as an attachment'; + } + } + } + return this; + }; + Group.prototype.addBefore = function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + var children = this._children; + var idx = children.indexOf(nextSibling); + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + return this; + }; + Group.prototype.replace = function (oldChild, newChild) { + var idx = indexOf(this._children, oldChild); + if (idx >= 0) { + this.replaceAt(newChild, idx); + } + return this; + }; + Group.prototype.replaceAt = function (child, index) { + var children = this._children; + var old = children[index]; + if (child && child !== this && child.parent !== this && child !== old) { + children[index] = child; + old.parent = null; + var zr = this.__zr; + if (zr) { + old.removeSelfFromZr(zr); + } + this._doAdd(child); + } + return this; + }; + Group.prototype._doAdd = function (child) { + if (child.parent) { + child.parent.remove(child); + } + child.parent = this; + var zr = this.__zr; + if (zr && zr !== child.__zr) { + child.addSelfToZr(zr); + } + zr && zr.refresh(); + }; + Group.prototype.remove = function (child) { + var zr = this.__zr; + var children = this._children; + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + child.parent = null; + if (zr) { + child.removeSelfFromZr(zr); + } + zr && zr.refresh(); + return this; + }; + Group.prototype.removeAll = function () { + var children = this._children; + var zr = this.__zr; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (zr) { + child.removeSelfFromZr(zr); + } + child.parent = null; + } + children.length = 0; + return this; + }; + Group.prototype.eachChild = function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }; + Group.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + var stopped = cb.call(context, child); + if (child.isGroup && !stopped) { + child.traverse(cb, context); + } + } + return this; + }; + Group.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.addSelfToZr(zr); + } + }; + Group.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.removeSelfFromZr(zr); + } + }; + Group.prototype.getBoundingRect = function (includeChildren) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + BoundingRect.applyTransform(tmpRect, childRect, transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + }; + return Group; + }(Element)); + Group.prototype.type = 'group'; + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + var painterCtors = {}; + var instances = {}; + function delInstance(id) { + delete instances[id]; + } + function isDarkMode(backgroundColor) { + if (!backgroundColor) { + return false; + } + if (typeof backgroundColor === 'string') { + return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD; + } + else if (backgroundColor.colorStops) { + var colorStops = backgroundColor.colorStops; + var totalLum = 0; + var len = colorStops.length; + for (var i = 0; i < len; i++) { + totalLum += lum(colorStops[i].color, 1); + } + totalLum /= len; + return totalLum < DARK_MODE_THRESHOLD; + } + return false; + } + var ZRender = (function () { + function ZRender(id, dom, opts) { + var _this = this; + this._sleepAfterStill = 10; + this._stillFrameAccum = 0; + this._needsRefresh = true; + this._needsRefreshHover = true; + this._darkMode = false; + opts = opts || {}; + this.dom = dom; + this.id = id; + var storage = new Storage(); + var rendererType = opts.renderer || 'canvas'; + if (!painterCtors[rendererType]) { + rendererType = keys(painterCtors)[0]; + } + if ("development" !== 'production') { + if (!painterCtors[rendererType]) { + throw new Error("Renderer '" + rendererType + "' is not imported. Please import it first."); + } + } + opts.useDirtyRect = opts.useDirtyRect == null + ? false + : opts.useDirtyRect; + var painter = new painterCtors[rendererType](dom, storage, opts, id); + var ssrMode = opts.ssr || painter.ssrOnly; + this.storage = storage; + this.painter = painter; + var handerProxy = (!env.node && !env.worker && !ssrMode) + ? new HandlerDomProxy(painter.getViewportRoot(), painter.root) + : null; + var useCoarsePointer = opts.useCoarsePointer; + var usePointerSize = (useCoarsePointer == null || useCoarsePointer === 'auto') + ? env.touchEventsSupported + : !!useCoarsePointer; + var defaultPointerSize = 44; + var pointerSize; + if (usePointerSize) { + pointerSize = retrieve2(opts.pointerSize, defaultPointerSize); + } + this.handler = new Handler(storage, painter, handerProxy, painter.root, pointerSize); + this.animation = new Animation({ + stage: { + update: ssrMode ? null : function () { return _this._flush(true); } + } + }); + if (!ssrMode) { + this.animation.start(); + } + } + ZRender.prototype.add = function (el) { + if (!el) { + return; + } + this.storage.addRoot(el); + el.addSelfToZr(this); + this.refresh(); + }; + ZRender.prototype.remove = function (el) { + if (!el) { + return; + } + this.storage.delRoot(el); + el.removeSelfFromZr(this); + this.refresh(); + }; + ZRender.prototype.configLayer = function (zLevel, config) { + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this.refresh(); + }; + ZRender.prototype.setBackgroundColor = function (backgroundColor) { + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this.refresh(); + this._backgroundColor = backgroundColor; + this._darkMode = isDarkMode(backgroundColor); + }; + ZRender.prototype.getBackgroundColor = function () { + return this._backgroundColor; + }; + ZRender.prototype.setDarkMode = function (darkMode) { + this._darkMode = darkMode; + }; + ZRender.prototype.isDarkMode = function () { + return this._darkMode; + }; + ZRender.prototype.refreshImmediately = function (fromInside) { + if (!fromInside) { + this.animation.update(true); + } + this._needsRefresh = false; + this.painter.refresh(); + this._needsRefresh = false; + }; + ZRender.prototype.refresh = function () { + this._needsRefresh = true; + this.animation.start(); + }; + ZRender.prototype.flush = function () { + this._flush(false); + }; + ZRender.prototype._flush = function (fromInside) { + var triggerRendered; + var start = getTime(); + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(fromInside); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + var end = getTime(); + if (triggerRendered) { + this._stillFrameAccum = 0; + this.trigger('rendered', { + elapsedTime: end - start + }); + } + else if (this._sleepAfterStill > 0) { + this._stillFrameAccum++; + if (this._stillFrameAccum > this._sleepAfterStill) { + this.animation.stop(); + } + } + }; + ZRender.prototype.setSleepAfterStill = function (stillFramesCount) { + this._sleepAfterStill = stillFramesCount; + }; + ZRender.prototype.wakeUp = function () { + this.animation.start(); + this._stillFrameAccum = 0; + }; + ZRender.prototype.refreshHover = function () { + this._needsRefreshHover = true; + }; + ZRender.prototype.refreshHoverImmediately = function () { + this._needsRefreshHover = false; + if (this.painter.refreshHover && this.painter.getType() === 'canvas') { + this.painter.refreshHover(); + } + }; + ZRender.prototype.resize = function (opts) { + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }; + ZRender.prototype.clearAnimation = function () { + this.animation.clear(); + }; + ZRender.prototype.getWidth = function () { + return this.painter.getWidth(); + }; + ZRender.prototype.getHeight = function () { + return this.painter.getHeight(); + }; + ZRender.prototype.setCursorStyle = function (cursorStyle) { + this.handler.setCursorStyle(cursorStyle); + }; + ZRender.prototype.findHover = function (x, y) { + return this.handler.findHover(x, y); + }; + ZRender.prototype.on = function (eventName, eventHandler, context) { + this.handler.on(eventName, eventHandler, context); + return this; + }; + ZRender.prototype.off = function (eventName, eventHandler) { + this.handler.off(eventName, eventHandler); + }; + ZRender.prototype.trigger = function (eventName, event) { + this.handler.trigger(eventName, event); + }; + ZRender.prototype.clear = function () { + var roots = this.storage.getRoots(); + for (var i = 0; i < roots.length; i++) { + if (roots[i] instanceof Group) { + roots[i].removeSelfFromZr(this); + } + } + this.storage.delAllRoots(); + this.painter.clear(); + }; + ZRender.prototype.dispose = function () { + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = + this.storage = + this.painter = + this.handler = null; + delInstance(this.id); + }; + return ZRender; + }()); + function init(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + } + function dispose(zr) { + zr.dispose(); + } + function disposeAll() { + for (var key in instances) { + if (instances.hasOwnProperty(key)) { + instances[key].dispose(); + } + } + instances = {}; + } + function getInstance(id) { + return instances[id]; + } + function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; + } + var version = '5.4.3'; + + var zrender = /*#__PURE__*/Object.freeze({ + __proto__: null, + init: init, + dispose: dispose, + disposeAll: disposeAll, + getInstance: getInstance, + registerPainter: registerPainter, + version: version + }); + + var RADIAN_EPSILON = 1e-4; // Although chrome already enlarge this number to 100 for `toFixed`, but + // we sill follow the spec for compatibility. + + var ROUND_SUPPORTED_PRECISION_MAX = 20; + + function _trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + /** + * Linear mapping a value from domain to range + * @param val + * @param domain Domain extent domain[0] can be bigger than domain[1] + * @param range Range extent range[0] can be bigger than range[1] + * @param clamp Default to be false + */ + + + function linearMap(val, domain, range, clamp) { + var d0 = domain[0]; + var d1 = domain[1]; + var r0 = range[0]; + var r1 = range[1]; + var subDomain = d1 - d0; + var subRange = r1 - r0; + + if (subDomain === 0) { + return subRange === 0 ? r0 : (r0 + r1) / 2; + } // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + + + if (clamp) { + if (subDomain > 0) { + if (val <= d0) { + return r0; + } else if (val >= d1) { + return r1; + } + } else { + if (val >= d0) { + return r0; + } else if (val <= d1) { + return r1; + } + } + } else { + if (val === d0) { + return r0; + } + + if (val === d1) { + return r1; + } + } + + return (val - d0) / subDomain * subRange + r0; + } + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + */ + + function parsePercent$1(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + + case 'left': + case 'top': + percent = '0%'; + break; + + case 'right': + case 'bottom': + percent = '100%'; + break; + } + + if (isString(percent)) { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + } + function round(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } // Avoid range error + + + precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX); // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01' + + x = (+x).toFixed(precision); + return returnStr ? x : +x; + } + /** + * Inplacd asc sort arr. + * The input arr will be modified. + */ + + function asc(arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + } + /** + * Get precision. + */ + + function getPrecision(val) { + val = +val; + + if (isNaN(val)) { + return 0; + } // It is much faster than methods converting number to string as follows + // let tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + // Notice: + // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`. + // (see https://jsbench.me/2vkpcekkvw/1) + // (2) If the val is less than for example 1e-15, the result may be incorrect. + // (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`) + + + if (val > 1e-14) { + var e = 1; + + for (var i = 0; i < 15; i++, e *= 10) { + if (Math.round(val * e) / e === val) { + return i; + } + } + } + + return getPrecisionSafe(val); + } + /** + * Get precision with slow but safe method + */ + + function getPrecisionSafe(val) { + // toLowerCase for: '3.4E-12' + var str = val.toString().toLowerCase(); // Consider scientific notation: '3.4e-12' '3.4e+12' + + var eIndex = str.indexOf('e'); + var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0; + var significandPartLen = eIndex > 0 ? eIndex : str.length; + var dotIndex = str.indexOf('.'); + var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex; + return Math.max(0, decimalPartLen - exp); + } + /** + * Minimal dicernible data precisioin according to a single pixel. + */ + + function getPixelPrecision(dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); // toFixed() digits argument must be between 0 and 20. + + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; + } + /** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainder method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param idx index of the data to be processed in valueList + * @param precision integer number showing digits of precision + * @return percent ranging from 0 to 100 + */ + + function getPercentWithPrecision(valueList, idx, precision) { + if (!valueList[idx]) { + return 0; + } + + var seats = getPercentSeats(valueList, precision); + return seats[idx] || 0; + } + /** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainder method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param precision integer number showing digits of precision + * @return {Array} + */ + + function getPercentSeats(valueList, precision) { + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + + if (sum === 0) { + return []; + } + + var digits = Math.pow(10, precision); + var votesPerQuota = map(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + var seats = map(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + var remainder = map(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); // Has remainding votes. + + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } // Add a vote to max remainder. + + + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + + return map(seats, function (seat) { + return seat / digits; + }); + } + /** + * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004 + * See + */ + + function addSafe(val0, val1) { + var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1)); // const multiplier = Math.pow(10, maxPrecision); + // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier; + + var sum = val0 + val1; // // PENDING: support more? + + return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round(sum, maxPrecision); + } // Number.MAX_SAFE_INTEGER, ie do not support. + + var MAX_SAFE_INTEGER = 9007199254740991; + /** + * To 0 - 2 * PI, considering negative radian. + */ + + function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + } + /** + * @param {type} radian + * @return {boolean} + */ + + function isRadianAroundZero(val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + } // eslint-disable-next-line + + var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line + + /** + * @param value valid type: number | string | Date, otherwise return `new Date(NaN)` + * These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see ). + * + Or other string format, including (all of which will be treated as local time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return date Never be null/undefined. If invalid, return `new Date(NaN)`. + */ + + function parseDate(value) { + if (value instanceof Date) { + return value; + } else if (isString(value)) { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + + if (!match) { + // return Invalid Date. + return new Date(NaN); + } // Use local time when no timezone offset is specified. + + + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0); + } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + + if (match[8].toUpperCase() !== 'Z') { + hour -= +match[8].slice(0, 3); + } + + return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0)); + } + } else if (value == null) { + return new Date(NaN); + } + + return new Date(Math.round(value)); + } + /** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param val + * @return + */ + + function quantity(val) { + return Math.pow(10, quantityExponent(val)); + } + /** + * Exponent of the quantity of a number + * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3 + * + * @param val non-negative value + * @return + */ + + function quantityExponent(val) { + if (val === 0) { + return 0; + } + + var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ + + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + + return exp; + } + /** + * find a “nice” number approximately equal to x. Round the number if round = true, + * take ceiling if round = false. The primary observation is that the “nicest” + * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param val Non-negative value. + * @param round + * @return Niced number + */ + + function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 10 + + var nf; + + if (round) { + if (f < 1.5) { + nf = 1; + } else if (f < 2.5) { + nf = 2; + } else if (f < 4) { + nf = 3; + } else if (f < 7) { + nf = 5; + } else { + nf = 10; + } + } else { + if (f < 1) { + nf = 1; + } else if (f < 2) { + nf = 2; + } else if (f < 3) { + nf = 3; + } else if (f < 5) { + nf = 5; + } else { + nf = 10; + } + } + + val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; + } + /** + * This code was copied from "d3.js" + * . + * See the license statement at the head of this file. + * @param ascArr + */ + + function quantile(ascArr, p) { + var H = (ascArr.length - 1) * p + 1; + var h = Math.floor(H); + var v = +ascArr[h - 1]; + var e = H - h; + return e ? v + e * (ascArr[h] - v) : v; + } + /** + * Order intervals asc, and split them when overlap. + * expect(numberUtil.reformIntervals([ + * {interval: [18, 62], close: [1, 1]}, + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [1, 1]}, + * {interval: [62, 150], close: [1, 1]}, + * {interval: [106, 150], close: [1, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ])).toEqual([ + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [0, 1]}, + * {interval: [18, 62], close: [0, 1]}, + * {interval: [62, 150], close: [0, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ]); + * @param list, where `close` mean open or close + * of the interval, and Infinity can be used. + * @return The origin list, which has been reformed. + */ + + function reformIntervals(list) { + list.sort(function (a, b) { + return littleThan(a, b, 0) ? -1 : 1; + }); + var curr = -Infinity; + var currClose = 1; + + for (var i = 0; i < list.length;) { + var interval = list[i].interval; + var close_1 = list[i].close; + + for (var lg = 0; lg < 2; lg++) { + if (interval[lg] <= curr) { + interval[lg] = curr; + close_1[lg] = !lg ? 1 - currClose : 1; + } + + curr = interval[lg]; + currClose = close_1[lg]; + } + + if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { + list.splice(i, 1); + } else { + i++; + } + } + + return list; + + function littleThan(a, b, lg) { + return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1)); + } + } + /** + * [Numeric is defined as]: + * `parseFloat(val) == val` + * For example: + * numeric: + * typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity, + * and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec) + * not-numeric: + * null, undefined, [], {}, true, false, 'NaN', NaN, '123ab', + * empty string, string with only white-spaces or line-terminal (see es spec), + * 0x12, '0x12', '-0x12', 012, '012', '-012', + * non-string, ... + * + * @test See full test cases in `test/ut/spec/util/number.js`. + * @return Must be a typeof number. If not numeric, return NaN. + */ + + function numericToNumber(val) { + var valFloat = parseFloat(val); + return valFloat == val // eslint-disable-line eqeqeq + && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '. + ? valFloat : NaN; + } + /** + * Definition of "numeric": see `numericToNumber`. + */ + + function isNumeric(val) { + return !isNaN(numericToNumber(val)); + } + /** + * Use random base to prevent users hard code depending on + * this auto generated marker id. + * @return An positive integer. + */ + + function getRandomIdBase() { + return Math.round(Math.random() * 9); + } + /** + * Get the greatest common divisor. + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getGreatestCommonDividor(a, b) { + if (b === 0) { + return a; + } + + return getGreatestCommonDividor(b, a % b); + } + /** + * Get the least common multiple. + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getLeastCommonMultiple(a, b) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + return a * b / getGreatestCommonDividor(a, b); + } + + var ECHARTS_PREFIX = '[ECharts] '; + var storedLogs = {}; + var hasConsole = typeof console !== 'undefined' // eslint-disable-next-line + && console.warn && console.log; + + function outputLog(type, str, onlyOnce) { + if (hasConsole) { + if (onlyOnce) { + if (storedLogs[str]) { + return; + } + + storedLogs[str] = true; + } // eslint-disable-next-line + + + console[type](ECHARTS_PREFIX + str); + } + } + + function log(str, onlyOnce) { + outputLog('log', str, onlyOnce); + } + function warn(str, onlyOnce) { + outputLog('warn', str, onlyOnce); + } + function error(str, onlyOnce) { + outputLog('error', str, onlyOnce); + } + function deprecateLog(str) { + if ("development" !== 'production') { + // Not display duplicate message. + outputLog('warn', 'DEPRECATED: ' + str, true); + } + } + function deprecateReplaceLog(oldOpt, newOpt, scope) { + if ("development" !== 'production') { + deprecateLog((scope ? "[" + scope + "]" : '') + (oldOpt + " is deprecated, use " + newOpt + " instead.")); + } + } + /** + * If in __DEV__ environment, get console printable message for users hint. + * Parameters are separated by ' '. + * @usage + * makePrintable('This is an error on', someVar, someObj); + * + * @param hintInfo anything about the current execution context to hint users. + * @throws Error + */ + + function makePrintable() { + var hintInfo = []; + + for (var _i = 0; _i < arguments.length; _i++) { + hintInfo[_i] = arguments[_i]; + } + + var msg = ''; + + if ("development" !== 'production') { + // Fuzzy stringify for print. + // This code only exist in dev environment. + var makePrintableStringIfPossible_1 = function (val) { + return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null; + }; + + msg = map(hintInfo, function (arg) { + if (isString(arg)) { + // Print without quotation mark for some statement. + return arg; + } else { + var printableStr = makePrintableStringIfPossible_1(arg); + + if (printableStr != null) { + return printableStr; + } else if (typeof JSON !== 'undefined' && JSON.stringify) { + try { + return JSON.stringify(arg, function (n, val) { + var printableStr = makePrintableStringIfPossible_1(val); + return printableStr == null ? val : printableStr; + }); // In most cases the info object is small, so do not line break. + } catch (err) { + return '?'; + } + } else { + return '?'; + } + } + }).join(' '); + } + + return msg; + } + /** + * @throws Error + */ + + function throwError(msg) { + throw new Error(msg); + } + + function interpolateNumber$1(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + /** + * Make the name displayable. But we should + * make sure it is not duplicated with user + * specified name, so use '\0'; + */ + + + var DUMMY_COMPONENT_NAME_PREFIX = 'series\0'; + var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0'; + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + + function normalizeToArray(value) { + return value instanceof Array ? value : value == null ? [] : [value]; + } + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * show: false, + * position: 'outside', + * fontSize: 18 + * }, + * emphasis: { + * label: { show: true } + * } + */ + + function defaultEmphasis(opt, key, subOpts) { + // Caution: performance sensitive. + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; // Default emphasis option from normal + + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + + if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } + } + var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([ + // 'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter', + // 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', + // // FIXME: deprecated, check and remove it. + // 'textStyle' + // ]); + + /** + * The method does not ensure performance. + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retrieves value from data. + */ + + function getDataItemValue(dataItem) { + return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; + } + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method determine if dataItem has extra option besides value + */ + + function isDataItemOption(dataItem) { + return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array + // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); + } + /** + * Mapping to existings for merge. + * + * Mode "normalMege": + * The mapping result (merge result) will keep the order of the existing + * component, rather than the order of new option. Because we should ensure + * some specified index reference (like xAxisIndex) keep work. + * And in most cases, "merge option" is used to update partial option but not + * be expected to change the order. + * + * Mode "replaceMege": + * (1) Only the id mapped components will be merged. + * (2) Other existing components (except internal components) will be removed. + * (3) Other new options will be used to create new component. + * (4) The index of the existing components will not be modified. + * That means their might be "hole" after the removal. + * The new components are created first at those available index. + * + * Mode "replaceAll": + * This mode try to support that reproduce an echarts instance from another + * echarts instance (via `getOption`) in some simple cases. + * In this scenario, the `result` index are exactly the consistent with the `newCmptOptions`, + * which ensures the component index referring (like `xAxisIndex: ?`) corrent. That is, + * the "hole" in `newCmptOptions` will also be kept. + * On the contrary, other modes try best to eliminate holes. + * PENDING: This is an experimental mode yet. + * + * @return See the comment of . + */ + + function mappingToExists(existings, newCmptOptions, mode) { + var isNormalMergeMode = mode === 'normalMerge'; + var isReplaceMergeMode = mode === 'replaceMerge'; + var isReplaceAllMode = mode === 'replaceAll'; + existings = existings || []; + newCmptOptions = (newCmptOptions || []).slice(); + var existingIdIdxMap = createHashMap(); // Validate id and name on user input option. + + each(newCmptOptions, function (cmptOption, index) { + if (!isObject(cmptOption)) { + newCmptOptions[index] = null; + return; + } + + if ("development" !== 'production') { + // There is some legacy case that name is set as `false`. + // But should work normally rather than throw error. + if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) { + warnInvalidateIdOrName(cmptOption.id); + } + + if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) { + warnInvalidateIdOrName(cmptOption.name); + } + } + }); + var result = prepareResult(existings, existingIdIdxMap, mode); + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingById(result, existings, existingIdIdxMap, newCmptOptions); + } + + if (isNormalMergeMode) { + mappingByName(result, newCmptOptions); + } + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingByIndex(result, newCmptOptions, isReplaceMergeMode); + } else if (isReplaceAllMode) { + mappingInReplaceAllMode(result, newCmptOptions); + } + + makeIdAndName(result); // The array `result` MUST NOT contain elided items, otherwise the + // forEach will omit those items and result in incorrect result. + + return result; + } + + function prepareResult(existings, existingIdIdxMap, mode) { + var result = []; + + if (mode === 'replaceAll') { + return result; + } // Do not use native `map` to in case that the array `existings` + // contains elided items, which will be omitted. + + + for (var index = 0; index < existings.length; index++) { + var existing = existings[index]; // Because of replaceMerge, `existing` may be null/undefined. + + if (existing && existing.id != null) { + existingIdIdxMap.set(existing.id, index); + } // For non-internal-componnets: + // Mode "normalMerge": all existings kept. + // Mode "replaceMerge": all existing removed unless mapped by id. + // For internal-components: + // go with "replaceMerge" approach in both mode. + + + result.push({ + existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing, + newOption: null, + keyInfo: null, + brandNew: null + }); + } + + return result; + } + + function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { + // Mapping by id if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.id == null) { + return; + } + + var optionId = makeComparableKey(cmptOption.id); + var existingIdx = existingIdIdxMap.get(optionId); + + if (existingIdx != null) { + var resultItem = result[existingIdx]; + assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); + resultItem.newOption = cmptOption; // In both mode, if id matched, new option will be merged to + // the existings rather than creating new component model. + + resultItem.existing = existings[existingIdx]; + newCmptOptions[index] = null; + } + }); + } + + function mappingByName(result, newCmptOptions) { + // Mapping by name if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.name == null) { + return; + } + + for (var i = 0; i < result.length; i++) { + var existing = result[i].existing; + + if (!result[i].newOption // Consider name: two map to one. + // Can not match when both ids existing but different. + && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) { + result[i].newOption = cmptOption; + newCmptOptions[index] = null; + return; + } + } + }); + } + + function mappingByIndex(result, newCmptOptions, brandNew) { + each(newCmptOptions, function (cmptOption) { + if (!cmptOption) { + return; + } // Find the first place that not mapped by id and not internal component (consider the "hole"). + + + var resultItem; + var nextIdx = 0; + + while ( // Be `!resultItem` only when `nextIdx >= result.length`. + (resultItem = result[nextIdx]) && ( // (1) Existing models that already have id should be able to mapped to. Because + // after mapping performed, model will always be assigned with an id if user not given. + // After that all models have id. + // (2) If new option has id, it can only set to a hole or append to the last. It should + // not be merged to the existings with different id. Because id should not be overwritten. + // (3) Name can be overwritten, because axis use name as 'show label text'. + resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. + resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) { + nextIdx++; + } + + if (resultItem) { + resultItem.newOption = cmptOption; + resultItem.brandNew = brandNew; + } else { + result.push({ + newOption: cmptOption, + brandNew: brandNew, + existing: null, + keyInfo: null + }); + } + + nextIdx++; + }); + } + + function mappingInReplaceAllMode(result, newCmptOptions) { + each(newCmptOptions, function (cmptOption) { + // The feature "reproduce" requires "hole" will also reproduced + // in case that component index referring are broken. + result.push({ + newOption: cmptOption, + brandNew: true, + existing: null, + keyInfo: null + }); + }); + } + /** + * Make id and name for mapping result (result of mappingToExists) + * into `keyInfo` field. + */ + + + function makeIdAndName(mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + // Ensure that each id is distinct. + var idMap = createHashMap(); + each(mapResult, function (item) { + var existing = item.existing; + existing && idMap.set(existing.id, item); + }); + each(mapResult, function (item) { + var opt = item.newOption; // Force ensure id not duplicated. + + assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id)); + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); // Make name and id. + + each(mapResult, function (item, index) { + var existing = item.existing; + var opt = item.newOption; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } // Name can be overwritten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + + + keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name // Avoid that different series has the same name, + // because name may be used like in color pallet. + : DUMMY_COMPONENT_NAME_PREFIX + index; + + if (existing) { + keyInfo.id = makeComparableKey(existing.id); + } else if (opt.id != null) { + keyInfo.id = makeComparableKey(opt.id); + } else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } while (idMap.get(keyInfo.id)); + } + + idMap.set(keyInfo.id, item); + }); + } + + function keyExistAndEqual(attr, obj1, obj2) { + var key1 = convertOptionIdName(obj1[attr], null); + var key2 = convertOptionIdName(obj2[attr], null); // See `MappingExistingItem`. `id` and `name` trade string equals to number. + + return key1 != null && key2 != null && key1 === key2; + } + /** + * @return return null if not exist. + */ + + + function makeComparableKey(val) { + if ("development" !== 'production') { + if (val == null) { + throw new Error(); + } + } + + return convertOptionIdName(val, ''); + } + + function convertOptionIdName(idOrName, defaultValue) { + if (idOrName == null) { + return defaultValue; + } + + return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue; + } + + function warnInvalidateIdOrName(idOrName) { + if ("development" !== 'production') { + warn('`' + idOrName + '` is invalid id or name. Must be a string or number.'); + } + } + + function isValidIdOrName(idOrName) { + return isStringSafe(idOrName) || isNumeric(idOrName); + } + + function isNameSpecified(componentModel) { + var name = componentModel.name; // Is specified when `indexOf` get -1 or > 0. + + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); + } + /** + * @public + * @param {Object} cmptOption + * @return {boolean} + */ + + function isComponentIdInternal(cmptOption) { + return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; + } + function makeInternalComponentId(idSuffix) { + return INTERNAL_COMPONENT_ID_PREFIX + idSuffix; + } + function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { + // Set mainType and complete subType. + each(mappingResult, function (item) { + var newOption = item.newOption; + + if (isObject(newOption)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); + } + }); + } + + function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { + var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType // Use determineSubType only when there is no existComponent. + : componentModelCtor.determineSubType(mainType, newCmptOption); // tooltip, markline, markpoint may always has no subType + + return subType; + } + /** + * A helper for removing duplicate items between batchA and batchB, + * and in themselves, and categorize by series. + * + * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @return result: [resultBatchA, resultBatchB] + */ + + + function compressBatches(batchA, batchB) { + var mapA = {}; + var mapB = {}; + makeMap(batchA || [], mapA); + makeMap(batchB || [], mapB, mapA); + return [mapToArray(mapA), mapToArray(mapB)]; + + function makeMap(sourceBatch, map, otherMap) { + for (var i = 0, len = sourceBatch.length; i < len; i++) { + var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null); + + if (seriesId == null) { + return; + } + + var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); + var otherDataIndices = otherMap && otherMap[seriesId]; + + for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { + var dataIndex = dataIndices[j]; + + if (otherDataIndices && otherDataIndices[dataIndex]) { + otherDataIndices[dataIndex] = null; + } else { + (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1; + } + } + } + } + + function mapToArray(map, isData) { + var result = []; + + for (var i in map) { + if (map.hasOwnProperty(i) && map[i] != null) { + if (isData) { + result.push(+i); + } else { + var dataIndices = mapToArray(map[i], true); + dataIndices.length && result.push({ + seriesId: i, + dataIndex: dataIndices + }); + } + } + } + + return result; + } + } + /** + * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name + * each of which can be Array or primary type. + * @return dataIndex If not found, return undefined/null. + */ + + function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) { + return data.indexOfRawIndex(value); + }) : data.indexOfRawIndex(payload.dataIndex); + } else if (payload.name != null) { + return isArray(payload.name) ? map(payload.name, function (value) { + return data.indexOfName(value); + }) : data.indexOfName(payload.name); + } + } + /** + * Enable property storage to any host object. + * Notice: Serialization is not supported. + * + * For example: + * let inner = zrUitl.makeInner(); + * + * function some1(hostObj) { + * inner(hostObj).someProperty = 1212; + * ... + * } + * function some2() { + * let fields = inner(this); + * fields.someProperty1 = 1212; + * fields.someProperty2 = 'xx'; + * ... + * } + * + * @return {Function} + */ + + function makeInner() { + var key = '__ec_inner_' + innerUniqueIndex++; + return function (hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; + } + var innerUniqueIndex = getRandomIdBase(); + /** + * The same behavior as `component.getReferringComponents`. + */ + + function parseFinder(ecModel, finderInput, opt) { + var _a = preParseFinder(finderInput, opt), + mainTypeSpecified = _a.mainTypeSpecified, + queryOptionMap = _a.queryOptionMap, + others = _a.others; + + var result = others; + var defaultMainType = opt ? opt.defaultMainType : null; + + if (!mainTypeSpecified && defaultMainType) { + queryOptionMap.set(defaultMainType, {}); + } + + queryOptionMap.each(function (queryOption, mainType) { + var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { + useDefault: defaultMainType === mainType, + enableAll: opt && opt.enableAll != null ? opt.enableAll : true, + enableNone: opt && opt.enableNone != null ? opt.enableNone : true + }); + result[mainType + 'Models'] = queryResult.models; + result[mainType + 'Model'] = queryResult.models[0]; + }); + return result; + } + function preParseFinder(finderInput, opt) { + var finder; + + if (isString(finderInput)) { + var obj = {}; + obj[finderInput + 'Index'] = 0; + finder = obj; + } else { + finder = finderInput; + } + + var queryOptionMap = createHashMap(); + var others = {}; + var mainTypeSpecified = false; + each(finder, function (value, key) { + // Exclude 'dataIndex' and other illgal keys. + if (key === 'dataIndex' || key === 'dataIndexInside') { + others[key] = value; + return; + } + + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || '').toLowerCase(); + + if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { + return; + } + + mainTypeSpecified = mainTypeSpecified || !!mainType; + var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); + queryOption[queryType] = value; + }); + return { + mainTypeSpecified: mainTypeSpecified, + queryOptionMap: queryOptionMap, + others: others + }; + } + var SINGLE_REFERRING = { + useDefault: true, + enableAll: false, + enableNone: false + }; + var MULTIPLE_REFERRING = { + useDefault: false, + enableAll: true, + enableNone: true + }; + function queryReferringComponents(ecModel, mainType, userOption, opt) { + opt = opt || SINGLE_REFERRING; + var indexOption = userOption.index; + var idOption = userOption.id; + var nameOption = userOption.name; + var result = { + models: null, + specified: indexOption != null || idOption != null || nameOption != null + }; + + if (!result.specified) { + // Use the first as default if `useDefault`. + var firstCmpt = void 0; + result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; + return result; + } + + if (indexOption === 'none' || indexOption === false) { + assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); + result.models = []; + return result; + } // `queryComponents` will return all components if + // both all of index/id/name are null/undefined. + + + if (indexOption === 'all') { + assert(opt.enableAll, '`"all"` is not a valid value on index option.'); + indexOption = idOption = nameOption = null; + } + + result.models = ecModel.queryComponents({ + mainType: mainType, + index: indexOption, + id: idOption, + name: nameOption + }); + return result; + } + function setAttribute(dom, key, value) { + dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; + } + function getAttribute(dom, key) { + return dom.getAttribute ? dom.getAttribute(key) : dom[key]; + } + function getTooltipRenderMode(renderModeOption) { + if (renderModeOption === 'auto') { + // Using html when `document` exists, use richText otherwise + return env.domSupported ? 'html' : 'richText'; + } else { + return renderModeOption || 'html'; + } + } + /** + * Group a list by key. + */ + + function groupData(array, getKey // return key + ) { + var buckets = createHashMap(); + var keys = []; + each(array, function (item) { + var key = getKey(item); + (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item); + }); + return { + keys: keys, + buckets: buckets + }; + } + /** + * Interpolate raw values of a series with percent + * + * @param data data + * @param labelModel label model of the text element + * @param sourceValue start value. May be null/undefined when init. + * @param targetValue end value + * @param percent 0~1 percentage; 0 uses start value while 1 uses end value + * @return interpolated values + * If `sourceValue` and `targetValue` are `number`, return `number`. + * If `sourceValue` and `targetValue` are `string`, return `string`. + * If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`. + * Other cases do not supported. + */ + + function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { + var isAutoPrecision = precision == null || precision === 'auto'; + + if (targetValue == null) { + return targetValue; + } + + if (isNumber(targetValue)) { + var value = interpolateNumber$1(sourceValue || 0, targetValue, percent); + return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision); + } else if (isString(targetValue)) { + return percent < 1 ? sourceValue : targetValue; + } else { + var interpolated = []; + var leftArr = sourceValue; + var rightArr = targetValue; + var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); + + for (var i = 0; i < length_1; ++i) { + var info = data.getDimensionInfo(i); // Don't interpolate ordinal dims + + if (info && info.type === 'ordinal') { + // In init, there is no `sourceValue`, but should better not to get undefined result. + interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; + } else { + var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; + var rightVal = rightArr[i]; + var value = interpolateNumber$1(leftVal, rightVal, percent); + interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision); + } + } + + return interpolated; + } + } + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___'; + /** + * Notice, parseClassType('') should returns {main: '', sub: ''} + * @public + */ + + function parseClassType(componentType) { + var ret = { + main: '', + sub: '' + }; + + if (componentType) { + var typeArr = componentType.split(TYPE_DELIMITER); + ret.main = typeArr[0] || ''; + ret.sub = typeArr[1] || ''; + } + + return ret; + } + /** + * @public + */ + + function checkClassType(componentType) { + assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); + } + + function isExtendedClass(clz) { + return !!(clz && clz[IS_EXTENDED_CLASS]); + } + /** + * Implements `ExtendableConstructor` for `rootClz`. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ExtendableConstructor + * enableClassExtend(Xxx as XxxConstructor); + * ``` + */ + + function enableClassExtend(rootClz, mandatoryMethods) { + rootClz.$constructor = rootClz; // FIXME: not necessary? + + rootClz.extend = function (proto) { + if ("development" !== 'production') { + each(mandatoryMethods, function (method) { + if (!proto[method]) { + console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.'); + } + }); + } + + var superClass = this; + var ExtendedClass; + + if (isESClass(superClass)) { + ExtendedClass = + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super.apply(this, arguments) || this; + } + + return class_1; + }(superClass); + } else { + // For backward compat, we both support ts class inheritance and this + // "extend" approach. + // The constructor should keep the same behavior as ts class inheritance: + // If this constructor/$constructor is not declared, auto invoke the super + // constructor. + // If this constructor/$constructor is declared, it is responsible for + // calling the super constructor. + ExtendedClass = function () { + (proto.$constructor || superClass).apply(this, arguments); + }; + + inherits(ExtendedClass, this); + } + + extend(ExtendedClass.prototype, proto); + ExtendedClass[IS_EXTENDED_CLASS] = true; + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + ExtendedClass.superClass = superClass; + return ExtendedClass; + }; + } + + function isESClass(fn) { + return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn)); + } + /** + * A work around to both support ts extend and this extend mechanism. + * on sub-class. + * @usage + * ```ts + * class Component { ... } + * classUtil.enableClassExtend(Component); + * classUtil.enableClassManagement(Component, {registerWhenExtend: true}); + * + * class Series extends Component { ... } + * // Without calling `markExtend`, `registerWhenExtend` will not work. + * Component.markExtend(Series); + * ``` + */ + + + function mountExtend(SubClz, SupperClz) { + SubClz.extend = SupperClz.extend; + } // A random offset. + + var classBase = Math.round(Math.random() * 10); + /** + * Implements `CheckableConstructor` for `target`. + * Can not use instanceof, consider different scope by + * cross domain or es module import in ec extensions. + * Mount a method "isInstance()" to Clz. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & CheckableConstructor; + * enableClassCheck(Xxx as XxxConstructor) + * ``` + */ + + function enableClassCheck(target) { + var classAttr = ['__\0is_clz', classBase++].join('_'); + target.prototype[classAttr] = true; + + if ("development" !== 'production') { + assert(!target.isInstance, 'The method "is" can not be defined.'); + } + + target.isInstance = function (obj) { + return !!(obj && obj[classAttr]); + }; + } // superCall should have class info, which can not be fetched from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, does not override method f, + // then when method of class C is called, dead loop occurred. + + function superCall(context, methodName) { + var args = []; + + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + /** + * Implements `ClassManager` for `target` + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ClassManager + * enableClassManagement(Xxx as XxxConstructor); + * ``` + */ + + + function enableClassManagement(target) { + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'a' + * or Object., when componentType is 'a.b' + */ + var storage = {}; + + target.registerClass = function (clz) { + // `type` should not be a "instance member". + // If using TS class, should better declared as `static type = 'series.pie'`. + // otherwise users have to mount `type` on prototype manually. + // For backward compat and enable instance visit type via `this.type`, + // we still support fetch `type` from prototype. + var componentFullType = clz.type || clz.prototype.type; + + if (componentFullType) { + checkClassType(componentFullType); // If only static type declared, we assign it to prototype mandatorily. + + clz.prototype.type = componentFullType; + var componentTypeInfo = parseClassType(componentFullType); + + if (!componentTypeInfo.sub) { + if ("development" !== 'production') { + if (storage[componentTypeInfo.main]) { + console.warn(componentTypeInfo.main + ' exists.'); + } + } + + storage[componentTypeInfo.main] = clz; + } else if (componentTypeInfo.sub !== IS_CONTAINER) { + var container = makeContainer(componentTypeInfo); + container[componentTypeInfo.sub] = clz; + } + } + + return clz; + }; + + target.getClass = function (mainType, subType, throwWhenNotFound) { + var clz = storage[mainType]; + + if (clz && clz[IS_CONTAINER]) { + clz = subType ? clz[subType] : null; + } + + if (throwWhenNotFound && !clz) { + throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' is used but not imported.'); + } + + return clz; + }; + + target.getClassesByMainType = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var result = []; + var obj = storage[componentTypeInfo.main]; + + if (obj && obj[IS_CONTAINER]) { + each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } else { + result.push(obj); + } + + return result; + }; + + target.hasClass = function (componentType) { + // Just consider componentType.main. + var componentTypeInfo = parseClassType(componentType); + return !!storage[componentTypeInfo.main]; + }; + /** + * @return Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + + + target.getAllClassMainTypes = function () { + var types = []; + each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + /** + * If a main type is container and has sub types + */ + + + target.hasSubTypes = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var obj = storage[componentTypeInfo.main]; + return obj && obj[IS_CONTAINER]; + }; + + function makeContainer(componentTypeInfo) { + var container = storage[componentTypeInfo.main]; + + if (!container || !container[IS_CONTAINER]) { + container = storage[componentTypeInfo.main] = {}; + container[IS_CONTAINER] = true; + } + + return container; + } + } // /** + // * @param {string|Array.} properties + // */ + // export function setReadOnly(obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // let value = obj[prop]; + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + // } + + function makeStyleMapper(properties, ignoreParent) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + + ignoreParent = ignoreParent || false; + return function (model, excludes, includes) { + var style = {}; + + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + + if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { + continue; + } + + var val = model.getShallow(propName, ignoreParent); + + if (val != null) { + style[properties[i][0]] = val; + } + } // TODO Text or image? + + + return style; + }; + } + + var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); + + var AreaStyleMixin = + /** @class */ + function () { + function AreaStyleMixin() {} + + AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + }; + + return AreaStyleMixin; + }(); + + var globalImageCache = new LRU(50); + function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } + else { + return newImageOrSrc; + } + } + function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) { + if (!newImageOrSrc) { + return image; + } + else if (typeof newImageOrSrc === 'string') { + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + var cachedImgObj = globalImageCache.get(newImageOrSrc); + var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload }; + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } + else { + image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad); + image.__zrImageSrc = newImageOrSrc; + globalImageCache.put(newImageOrSrc, image.__cachedImgObj = { + image: image, + pending: [pendingWrap] + }); + } + return image; + } + else { + return newImageOrSrc; + } + } + function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; + } + function isImageReady(image) { + return image && image.width && image.height; + } + + var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + function truncateText(text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + return ''; + } + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = truncateSingleLine(textLines[i], options); + } + return textLines.join('\n'); + } + function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = options || {}; + var preparedOpts = extend({}, options); + preparedOpts.font = font; + ellipsis = retrieve2(ellipsis, '...'); + preparedOpts.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0); + preparedOpts.cnCharWidth = getWidth('国', font); + var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font); + preparedOpts.placeholder = retrieve2(options.placeholder, ''); + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + var ellipsisWidth = getWidth(ellipsis, font); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + contentWidth = containerWidth - ellipsisWidth; + preparedOpts.ellipsis = ellipsis; + preparedOpts.ellipsisWidth = ellipsisWidth; + preparedOpts.contentWidth = contentWidth; + preparedOpts.containerWidth = containerWidth; + return preparedOpts; + } + function truncateSingleLine(textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + if (!containerWidth) { + return ''; + } + var lineWidth = getWidth(textLine, font); + if (lineWidth <= containerWidth) { + return textLine; + } + for (var j = 0;; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + if (textLine === '') { + textLine = options.placeholder; + } + return textLine; + } + function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; + } + function parsePlainText(text, style) { + text != null && (text += ''); + var overflow = style.overflow; + var padding = style.padding; + var font = style.font; + var truncate = overflow === 'truncate'; + var calculatedLineHeight = getLineHeight(font); + var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight); + var bgColorDrawn = !!(style.backgroundColor); + var truncateLineOverflow = style.lineOverflow === 'truncate'; + var width = style.width; + var lines; + if (width != null && (overflow === 'break' || overflow === 'breakAll')) { + lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : []; + } + else { + lines = text ? text.split('\n') : []; + } + var contentHeight = lines.length * lineHeight; + var height = retrieve2(style.height, contentHeight); + if (contentHeight > height && truncateLineOverflow) { + var lineCount = Math.floor(height / lineHeight); + lines = lines.slice(0, lineCount); + } + if (text && truncate && width != null) { + var options = prepareTruncateOptions(width, font, style.ellipsis, { + minChar: style.truncateMinChar, + placeholder: style.placeholder + }); + for (var i = 0; i < lines.length; i++) { + lines[i] = truncateSingleLine(lines[i], options); + } + } + var outerHeight = height; + var contentWidth = 0; + for (var i = 0; i < lines.length; i++) { + contentWidth = Math.max(getWidth(lines[i], font), contentWidth); + } + if (width == null) { + width = contentWidth; + } + var outerWidth = contentWidth; + if (padding) { + outerHeight += padding[0] + padding[2]; + outerWidth += padding[1] + padding[3]; + width += padding[1] + padding[3]; + } + if (bgColorDrawn) { + outerWidth = width; + } + return { + lines: lines, + height: height, + outerWidth: outerWidth, + outerHeight: outerHeight, + lineHeight: lineHeight, + calculatedLineHeight: calculatedLineHeight, + contentWidth: contentWidth, + contentHeight: contentHeight, + width: width + }; + } + var RichTextToken = (function () { + function RichTextToken() { + } + return RichTextToken; + }()); + var RichTextLine = (function () { + function RichTextLine(tokens) { + this.tokens = []; + if (tokens) { + this.tokens = tokens; + } + } + return RichTextLine; + }()); + var RichTextContentBlock = (function () { + function RichTextContentBlock() { + this.width = 0; + this.height = 0; + this.contentWidth = 0; + this.contentHeight = 0; + this.outerWidth = 0; + this.outerHeight = 0; + this.lines = []; + } + return RichTextContentBlock; + }()); + function parseRichText(text, style) { + var contentBlock = new RichTextContentBlock(); + text != null && (text += ''); + if (!text) { + return contentBlock; + } + var topWidth = style.width; + var topHeight = style.height; + var overflow = style.overflow; + var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null + ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' } + : null; + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo); + } + pushTokens(contentBlock, result[2], style, wrapInfo, result[1]); + lastIndex = STYLE_REG.lastIndex; + } + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo); + } + var pendingList = []; + var calculatedHeight = 0; + var calculatedWidth = 0; + var stlPadding = style.padding; + var truncate = overflow === 'truncate'; + var truncateLine = style.lineOverflow === 'truncate'; + function finishLine(line, lineWidth, lineHeight) { + line.width = lineWidth; + line.lineHeight = lineHeight; + calculatedHeight += lineHeight; + calculatedWidth = Math.max(calculatedWidth, lineWidth); + } + outer: for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var lineHeight = 0; + var lineWidth = 0; + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + var textPadding = token.textPadding = tokenStyle.padding; + var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0; + var font = token.font = tokenStyle.font || style.font; + token.contentHeight = getLineHeight(font); + var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight); + token.innerHeight = tokenHeight; + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight); + token.align = tokenStyle && tokenStyle.align || style.align; + token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle'; + if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) { + if (j > 0) { + line.tokens = line.tokens.slice(0, j); + finishLine(line, lineWidth, lineHeight); + contentBlock.lines = contentBlock.lines.slice(0, i + 1); + } + else { + contentBlock.lines = contentBlock.lines.slice(0, i); + } + break outer; + } + var styleTokenWidth = tokenStyle.width; + var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto'; + if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') { + token.percentWidth = styleTokenWidth; + pendingList.push(token); + token.contentWidth = getWidth(token.text, font); + } + else { + if (tokenWidthNotSpecified) { + var textBackgroundColor = tokenStyle.backgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height); + } + } + } + var remainTruncWidth = truncate && topWidth != null + ? topWidth - lineWidth : null; + if (remainTruncWidth != null && remainTruncWidth < token.width) { + if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) { + token.text = ''; + token.width = token.contentWidth = 0; + } + else { + token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar }); + token.width = token.contentWidth = getWidth(token.text, font); + } + } + else { + token.contentWidth = getWidth(token.text, font); + } + } + token.width += paddingH; + lineWidth += token.width; + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + finishLine(line, lineWidth, lineHeight); + } + contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight); + contentBlock.contentHeight = calculatedHeight; + contentBlock.contentWidth = calculatedWidth; + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width; + } + return contentBlock; + } + function pushTokens(block, str, style, wrapInfo, styleName) { + var isEmptyStr = str === ''; + var tokenStyle = styleName && style.rich[styleName] || {}; + var lines = block.lines; + var font = tokenStyle.font || style.font; + var newLine = false; + var strLines; + var linesWidths; + if (wrapInfo) { + var tokenPadding = tokenStyle.padding; + var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0; + if (tokenStyle.width != null && tokenStyle.width !== 'auto') { + var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH; + if (lines.length > 0) { + if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) { + strLines = str.split('\n'); + newLine = true; + } + } + wrapInfo.accumWidth = outerWidth_1; + } + else { + var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth); + wrapInfo.accumWidth = res.accumWidth + tokenPaddingH; + linesWidths = res.linesWidths; + strLines = res.lines; + } + } + else { + strLines = str.split('\n'); + } + for (var i = 0; i < strLines.length; i++) { + var text = strLines[i]; + var token = new RichTextToken(); + token.styleName = styleName; + token.text = text; + token.isLineHolder = !text && !isEmptyStr; + if (typeof tokenStyle.width === 'number') { + token.width = tokenStyle.width; + } + else { + token.width = linesWidths + ? linesWidths[i] + : getWidth(text, font); + } + if (!i && !newLine) { + var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens; + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } + else { + lines.push(new RichTextLine([token])); + } + } + } + function isAlphabeticLetter(ch) { + var code = ch.charCodeAt(0); + return code >= 0x20 && code <= 0x24F + || code >= 0x370 && code <= 0x10FF + || code >= 0x1200 && code <= 0x13FF + || code >= 0x1E00 && code <= 0x206F; + } + var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) { + obj[ch] = true; + return obj; + }, {}); + function isWordBreakChar(ch) { + if (isAlphabeticLetter(ch)) { + if (breakCharMap[ch]) { + return true; + } + return false; + } + return true; + } + function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) { + var lines = []; + var linesWidths = []; + var line = ''; + var currentWord = ''; + var currentWordWidth = 0; + var accumWidth = 0; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch === '\n') { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ''; + currentWord = ''; + currentWordWidth = 0; + accumWidth = 0; + continue; + } + var chWidth = getWidth(ch, font); + var inWord = isBreakAll ? false : !isWordBreakChar(ch); + if (!lines.length + ? lastAccumWidth + accumWidth + chWidth > lineWidth + : accumWidth + chWidth > lineWidth) { + if (!accumWidth) { + if (inWord) { + lines.push(currentWord); + linesWidths.push(currentWordWidth); + currentWord = ch; + currentWordWidth = chWidth; + } + else { + lines.push(ch); + linesWidths.push(chWidth); + } + } + else if (line || currentWord) { + if (inWord) { + if (!line) { + line = currentWord; + currentWord = ''; + currentWordWidth = 0; + accumWidth = currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth - currentWordWidth); + currentWord += ch; + currentWordWidth += chWidth; + line = ''; + accumWidth = currentWordWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ch; + accumWidth = chWidth; + } + } + continue; + } + accumWidth += chWidth; + if (inWord) { + currentWord += ch; + currentWordWidth += chWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + line += ch; + } + } + if (!lines.length && !line) { + line = text; + currentWord = ''; + currentWordWidth = 0; + } + if (currentWord) { + line += currentWord; + } + if (line) { + lines.push(line); + linesWidths.push(accumWidth); + } + if (lines.length === 1) { + accumWidth += lastAccumWidth; + } + return { + accumWidth: accumWidth, + lines: lines, + linesWidths: linesWidths + }; + } + + var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); + var DEFAULT_COMMON_STYLE = { + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: '#000', + opacity: 1, + blend: 'source-over' + }; + var DEFAULT_COMMON_ANIMATION_PROPS = { + style: { + shadowBlur: true, + shadowOffsetX: true, + shadowOffsetY: true, + shadowColor: true, + opacity: true + } + }; + DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; + var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible']; + var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible']; + var Displayable = (function (_super) { + __extends(Displayable, _super); + function Displayable(props) { + return _super.call(this, props) || this; + } + Displayable.prototype._init = function (props) { + var keysArr = keys(props); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if (key === 'style') { + this.useStyle(props[key]); + } + else { + _super.prototype.attrKV.call(this, key, props[key]); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Displayable.prototype.beforeBrush = function () { }; + Displayable.prototype.afterBrush = function () { }; + Displayable.prototype.innerBeforeBrush = function () { }; + Displayable.prototype.innerAfterBrush = function () { }; + Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { + var m = this.transform; + if (this.ignore + || this.invisible + || this.style.opacity === 0 + || (this.culling + && isDisplayableCulled(this, viewWidth, viewHeight)) + || (m && !m[0] && !m[3])) { + return false; + } + if (considerClipPath && this.__clipPaths) { + for (var i = 0; i < this.__clipPaths.length; ++i) { + if (this.__clipPaths[i].isZeroArea()) { + return false; + } + } + } + if (considerAncestors && this.parent) { + var parent_1 = this.parent; + while (parent_1) { + if (parent_1.ignore) { + return false; + } + parent_1 = parent_1.parent; + } + } + return true; + }; + Displayable.prototype.contain = function (x, y) { + return this.rectContain(x, y); + }; + Displayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + Displayable.prototype.rectContain = function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }; + Displayable.prototype.getPaintRect = function () { + var rect = this._paintRect; + if (!this._paintRect || this.__dirty) { + var transform = this.transform; + var elRect = this.getBoundingRect(); + var style = this.style; + var shadowSize = style.shadowBlur || 0; + var shadowOffsetX = style.shadowOffsetX || 0; + var shadowOffsetY = style.shadowOffsetY || 0; + rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); + if (transform) { + BoundingRect.applyTransform(rect, elRect, transform); + } + else { + rect.copy(elRect); + } + if (shadowSize || shadowOffsetX || shadowOffsetY) { + rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); + rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); + rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); + rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); + } + var tolerance = this.dirtyRectTolerance; + if (!rect.isZero()) { + rect.x = Math.floor(rect.x - tolerance); + rect.y = Math.floor(rect.y - tolerance); + rect.width = Math.ceil(rect.width + 1 + tolerance * 2); + rect.height = Math.ceil(rect.height + 1 + tolerance * 2); + } + } + return rect; + }; + Displayable.prototype.setPrevPaintRect = function (paintRect) { + if (paintRect) { + this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); + this._prevPaintRect.copy(paintRect); + } + else { + this._prevPaintRect = null; + } + }; + Displayable.prototype.getPrevPaintRect = function () { + return this._prevPaintRect; + }; + Displayable.prototype.animateStyle = function (loop) { + return this.animate('style', loop); + }; + Displayable.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else { + this.markRedraw(); + } + }; + Displayable.prototype.attrKV = function (key, value) { + if (key !== 'style') { + _super.prototype.attrKV.call(this, key, value); + } + else { + if (!this.style) { + this.useStyle(value); + } + else { + this.setStyle(value); + } + } + }; + Displayable.prototype.setStyle = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.style[keyOrObj] = value; + } + else { + extend(this.style, keyOrObj); + } + this.dirtyStyle(); + return this; + }; + Displayable.prototype.dirtyStyle = function (notRedraw) { + if (!notRedraw) { + this.markRedraw(); + } + this.__dirty |= STYLE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + }; + Displayable.prototype.dirty = function () { + this.dirtyStyle(); + }; + Displayable.prototype.styleChanged = function () { + return !!(this.__dirty & STYLE_CHANGED_BIT); + }; + Displayable.prototype.styleUpdated = function () { + this.__dirty &= ~STYLE_CHANGED_BIT; + }; + Displayable.prototype.createStyle = function (obj) { + return createObject(DEFAULT_COMMON_STYLE, obj); + }; + Displayable.prototype.useStyle = function (obj) { + if (!obj[STYLE_MAGIC_KEY]) { + obj = this.createStyle(obj); + } + if (this.__inHover) { + this.__hoverStyle = obj; + } + else { + this.style = obj; + } + this.dirtyStyle(); + }; + Displayable.prototype.isStyleObject = function (obj) { + return obj[STYLE_MAGIC_KEY]; + }; + Displayable.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.style && !normalState.style) { + normalState.style = this._mergeStyle(this.createStyle(), this.style); + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1); + }; + Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetStyle; + if (state && state.style) { + if (transition) { + if (keepCurrentStates) { + targetStyle = state.style; + } + else { + targetStyle = this._mergeStyle(this.createStyle(), normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else { + targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else if (needsRestoreToNormal) { + targetStyle = normalState.style; + } + if (targetStyle) { + if (transition) { + var sourceStyle = this.style; + this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); + if (needsRestoreToNormal) { + var changedKeys = keys(sourceStyle); + for (var i = 0; i < changedKeys.length; i++) { + var key = changedKeys[i]; + if (key in targetStyle) { + targetStyle[key] = targetStyle[key]; + this.style[key] = sourceStyle[key]; + } + } + } + var targetKeys = keys(targetStyle); + for (var i = 0; i < targetKeys.length; i++) { + var key = targetKeys[i]; + this.style[key] = this.style[key]; + } + this._transitionState(stateName, { + style: targetStyle + }, animationCfg, this.getAnimationStyleProps()); + } + else { + this.useStyle(targetStyle); + } + } + var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS$1; + for (var i = 0; i < statesKeys.length; i++) { + var key = statesKeys[i]; + if (state && state[key] != null) { + this[key] = state[key]; + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + this[key] = normalState[key]; + } + } + } + }; + Displayable.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedStyle; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.style) { + mergedStyle = mergedStyle || {}; + this._mergeStyle(mergedStyle, state.style); + } + } + if (mergedStyle) { + mergedState.style = mergedStyle; + } + return mergedState; + }; + Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { + extend(targetStyle, sourceStyle); + return targetStyle; + }; + Displayable.prototype.getAnimationStyleProps = function () { + return DEFAULT_COMMON_ANIMATION_PROPS; + }; + Displayable.initDefaultProps = (function () { + var dispProto = Displayable.prototype; + dispProto.type = 'displayable'; + dispProto.invisible = false; + dispProto.z = 0; + dispProto.z2 = 0; + dispProto.zlevel = 0; + dispProto.culling = false; + dispProto.cursor = 'pointer'; + dispProto.rectHover = false; + dispProto.incremental = false; + dispProto._rect = null; + dispProto.dirtyRectTolerance = 0; + dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT; + })(); + return Displayable; + }(Element)); + var tmpRect$1 = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + function isDisplayableCulled(el, width, height) { + tmpRect$1.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect$1.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect$1.intersect(viewRect); + } + + var mathMin$1 = Math.min; + var mathMax$1 = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI2 = Math.PI * 2; + var start = create(); + var end = create(); + var extremity = create(); + function fromPoints(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + for (var i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin$1(left, p[0]); + right = mathMax$1(right, p[0]); + top = mathMin$1(top, p[1]); + bottom = mathMax$1(bottom, p[1]); + } + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + function fromLine(x0, y0, x1, y1, min, max) { + min[0] = mathMin$1(x0, x1); + min[1] = mathMin$1(y0, y1); + max[0] = mathMax$1(x0, x1); + max[1] = mathMax$1(y0, y1); + } + var xDim = []; + var yDim = []; + function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) { + var cubicExtrema$1 = cubicExtrema; + var cubicAt$1 = cubicAt; + var n = cubicExtrema$1(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + for (var i = 0; i < n; i++) { + var x = cubicAt$1(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin$1(x, min[0]); + max[0] = mathMax$1(x, max[0]); + } + n = cubicExtrema$1(y0, y1, y2, y3, yDim); + for (var i = 0; i < n; i++) { + var y = cubicAt$1(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin$1(y, min[1]); + max[1] = mathMax$1(y, max[1]); + } + min[0] = mathMin$1(x0, min[0]); + max[0] = mathMax$1(x0, max[0]); + min[0] = mathMin$1(x3, min[0]); + max[0] = mathMax$1(x3, max[0]); + min[1] = mathMin$1(y0, min[1]); + max[1] = mathMax$1(y0, max[1]); + min[1] = mathMin$1(y3, min[1]); + max[1] = mathMax$1(y3, max[1]); + } + function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum$1 = quadraticExtremum; + var quadraticAt$1 = quadraticAt; + var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0); + var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0); + var x = quadraticAt$1(x0, x1, x2, tx); + var y = quadraticAt$1(y0, y1, y2, ty); + min[0] = mathMin$1(x0, x2, x); + min[1] = mathMin$1(y0, y2, y); + max[0] = mathMax$1(x0, x2, x); + max[1] = mathMax$1(y0, y2, y); + } + function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) { + var vec2Min = min; + var vec2Max = max; + var diff = Math.abs(startAngle - endAngle); + if (diff % PI2 < 1e-4 && diff > 1e-4) { + min$1[0] = x - rx; + min$1[1] = y - ry; + max$1[0] = x + rx; + max$1[1] = y + ry; + return; + } + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + vec2Min(min$1, start, end); + vec2Max(max$1, start, end); + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + vec2Min(min$1, extremity, min$1); + vec2Max(max$1, extremity, max$1); + } + } + } + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + R: 7 + }; + var tmpOutX = []; + var tmpOutY = []; + var min$1 = []; + var max$1 = []; + var min2 = []; + var max2 = []; + var mathMin$2 = Math.min; + var mathMax$2 = Math.max; + var mathCos$1 = Math.cos; + var mathSin$1 = Math.sin; + var mathAbs = Math.abs; + var PI = Math.PI; + var PI2$1 = PI * 2; + var hasTypedArray = typeof Float32Array !== 'undefined'; + var tmpAngles = []; + function modPI2(radian) { + var n = Math.round(radian / PI * 1e8) / 1e8; + return (n % 2) * PI; + } + function normalizeArcAngles(angles, anticlockwise) { + var newStartAngle = modPI2(angles[0]); + if (newStartAngle < 0) { + newStartAngle += PI2$1; + } + var delta = newStartAngle - angles[0]; + var newEndAngle = angles[1]; + newEndAngle += delta; + if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) { + newEndAngle = newStartAngle + PI2$1; + } + else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) { + newEndAngle = newStartAngle - PI2$1; + } + else if (!anticlockwise && newStartAngle > newEndAngle) { + newEndAngle = newStartAngle + (PI2$1 - modPI2(newStartAngle - newEndAngle)); + } + else if (anticlockwise && newStartAngle < newEndAngle) { + newEndAngle = newStartAngle - (PI2$1 - modPI2(newEndAngle - newStartAngle)); + } + angles[0] = newStartAngle; + angles[1] = newEndAngle; + } + var PathProxy = (function () { + function PathProxy(notSaveData) { + this.dpr = 1; + this._xi = 0; + this._yi = 0; + this._x0 = 0; + this._y0 = 0; + this._len = 0; + if (notSaveData) { + this._saveData = false; + } + if (this._saveData) { + this.data = []; + } + } + PathProxy.prototype.increaseVersion = function () { + this._version++; + }; + PathProxy.prototype.getVersion = function () { + return this._version; + }; + PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { + segmentIgnoreThreshold = segmentIgnoreThreshold || 0; + if (segmentIgnoreThreshold > 0) { + this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0; + this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0; + } + }; + PathProxy.prototype.setDPR = function (dpr) { + this.dpr = dpr; + }; + PathProxy.prototype.setContext = function (ctx) { + this._ctx = ctx; + }; + PathProxy.prototype.getContext = function () { + return this._ctx; + }; + PathProxy.prototype.beginPath = function () { + this._ctx && this._ctx.beginPath(); + this.reset(); + return this; + }; + PathProxy.prototype.reset = function () { + if (this._saveData) { + this._len = 0; + } + if (this._pathSegLen) { + this._pathSegLen = null; + this._pathLen = 0; + } + this._version++; + }; + PathProxy.prototype.moveTo = function (x, y) { + this._drawPendingPt(); + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + this._x0 = x; + this._y0 = y; + this._xi = x; + this._yi = y; + return this; + }; + PathProxy.prototype.lineTo = function (x, y) { + var dx = mathAbs(x - this._xi); + var dy = mathAbs(y - this._yi); + var exceedUnit = dx > this._ux || dy > this._uy; + this.addData(CMD.L, x, y); + if (this._ctx && exceedUnit) { + this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + this._pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > this._pendingPtDist) { + this._pendingPtX = x; + this._pendingPtY = y; + this._pendingPtDist = d2; + } + } + return this; + }; + PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) { + this._drawPendingPt(); + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }; + PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) { + this._drawPendingPt(); + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }; + PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this._drawPendingPt(); + tmpAngles[0] = startAngle; + tmpAngles[1] = endAngle; + normalizeArcAngles(tmpAngles, anticlockwise); + startAngle = tmpAngles[0]; + endAngle = tmpAngles[1]; + var delta = endAngle - startAngle; + this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + this._xi = mathCos$1(endAngle) * r + cx; + this._yi = mathSin$1(endAngle) * r + cy; + return this; + }; + PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { + this._drawPendingPt(); + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }; + PathProxy.prototype.rect = function (x, y, w, h) { + this._drawPendingPt(); + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }; + PathProxy.prototype.closePath = function () { + this._drawPendingPt(); + this.addData(CMD.Z); + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + ctx.closePath(); + } + this._xi = x0; + this._yi = y0; + return this; + }; + PathProxy.prototype.fill = function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }; + PathProxy.prototype.stroke = function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }; + PathProxy.prototype.len = function () { + return this._len; + }; + PathProxy.prototype.setData = function (data) { + var len = data.length; + if (!(this.data && this.data.length === len) && hasTypedArray) { + this.data = new Float32Array(len); + } + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + this._len = len; + }; + PathProxy.prototype.appendPath = function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }; + PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { + if (!this._saveData) { + return; + } + var data = this.data; + if (this._len + arguments.length > data.length) { + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + }; + PathProxy.prototype._drawPendingPt = function () { + if (this._pendingPtDist > 0) { + this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY); + this._pendingPtDist = 0; + } + }; + PathProxy.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }; + PathProxy.prototype.toStatic = function () { + if (!this._saveData) { + return; + } + this._drawPendingPt(); + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray && this._len > 11) { + this.data = new Float32Array(data); + } + } + }; + PathProxy.prototype.getBoundingRect = function () { + min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var i; + for (i = 0; i < this._len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]); + }; + PathProxy.prototype._calculateLength = function () { + var data = this.data; + var len = this._len; + var ux = this._ux; + var uy = this._uy; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + if (!this._pathSegLen) { + this._pathSegLen = []; + } + var pathSegLen = this._pathSegLen; + var pathTotalLen = 0; + var segCount = 0; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + var l = -1; + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + break; + case CMD.L: { + var x2 = data[i++]; + var y2 = data[i++]; + var dx = x2 - xi; + var dy = y2 - yi; + if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) { + l = Math.sqrt(dx * dx + dy * dy); + xi = x2; + yi = y2; + } + break; + } + case CMD.C: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3 = data[i++]; + var y3 = data[i++]; + l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var delta = data[i++]; + var endAngle = delta + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta)); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: { + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + l = width * 2 + height * 2; + break; + } + case CMD.Z: { + var dx = x0 - xi; + var dy = y0 - yi; + l = Math.sqrt(dx * dx + dy * dy); + xi = x0; + yi = y0; + break; + } + } + if (l >= 0) { + pathSegLen[segCount++] = l; + pathTotalLen += l; + } + } + this._pathLen = pathTotalLen; + return pathTotalLen; + }; + PathProxy.prototype.rebuildPath = function (ctx, percent) { + var d = this.data; + var ux = this._ux; + var uy = this._uy; + var len = this._len; + var x0; + var y0; + var xi; + var yi; + var x; + var y; + var drawPart = percent < 1; + var pathSegLen; + var pathTotalLen; + var accumLength = 0; + var segCount = 0; + var displayedLength; + var pendingPtDist = 0; + var pendingPtX; + var pendingPtY; + if (drawPart) { + if (!this._pathSegLen) { + this._calculateLength(); + } + pathSegLen = this._pathSegLen; + pathTotalLen = this._pathLen; + displayedLength = percent * pathTotalLen; + if (!displayedLength) { + return; + } + } + lo: for (var i = 0; i < len;) { + var cmd = d[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = d[i]; + yi = d[i + 1]; + x0 = xi; + y0 = yi; + } + if (cmd !== CMD.L && pendingPtDist > 0) { + ctx.lineTo(pendingPtX, pendingPtY); + pendingPtDist = 0; + } + switch (cmd) { + case CMD.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD.L: { + x = d[i++]; + y = d[i++]; + var dx = mathAbs(x - xi); + var dy = mathAbs(y - yi); + if (dx > ux || dy > uy) { + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); + break lo; + } + accumLength += l; + } + ctx.lineTo(x, y); + xi = x; + yi = y; + pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > pendingPtDist) { + pendingPtX = x; + pendingPtY = y; + pendingPtDist = d2; + } + } + break; + } + case CMD.C: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + var x3 = d[i++]; + var y3 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); + cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); + ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); + break lo; + } + accumLength += l; + } + ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + quadraticSubdivide(xi, x1, x2, t, tmpOutX); + quadraticSubdivide(yi, y1, y2, t, tmpOutY); + ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); + break lo; + } + accumLength += l; + } + ctx.quadraticCurveTo(x1, y1, x2, y2); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var startAngle = d[i++]; + var delta = d[i++]; + var psi = d[i++]; + var anticlockwise = !d[i++]; + var r = (rx > ry) ? rx : ry; + var isEllipse = mathAbs(rx - ry) > 1e-3; + var endAngle = startAngle + delta; + var breakBuild = false; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + endAngle = startAngle + delta * (displayedLength - accumLength) / l; + breakBuild = true; + } + accumLength += l; + } + if (isEllipse && ctx.ellipse) { + ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); + } + else { + ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + } + if (breakBuild) { + break lo; + } + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + x = d[i++]; + y = d[i++]; + var width = d[i++]; + var height = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var d_1 = displayedLength - accumLength; + ctx.moveTo(x, y); + ctx.lineTo(x + mathMin$2(d_1, width), y); + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x + width, y + mathMin$2(d_1, height)); + } + d_1 -= height; + if (d_1 > 0) { + ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height); + } + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x, y + mathMax$2(height - d_1, 0)); + } + break lo; + } + accumLength += l; + } + ctx.rect(x, y, width, height); + break; + case CMD.Z: + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); + break lo; + } + accumLength += l; + } + ctx.closePath(); + xi = x0; + yi = y0; + } + } + }; + PathProxy.prototype.clone = function () { + var newProxy = new PathProxy(); + var data = this.data; + newProxy.data = data.slice ? data.slice() + : Array.prototype.slice.call(data); + newProxy._len = this._len; + return newProxy; + }; + PathProxy.CMD = CMD; + PathProxy.initDefaultProps = (function () { + var proto = PathProxy.prototype; + proto._saveData = true; + proto._ux = 0; + proto._uy = 0; + proto._pendingPtDist = 0; + proto._version = 0; + })(); + return PathProxy; + }()); + + function containStroke(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + if ((y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l)) { + return false; + } + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + + function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) { + return false; + } + var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null); + return d <= _l / 2; + } + + function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) { + return false; + } + var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null); + return d <= _l / 2; + } + + var PI2$2 = Math.PI * 2; + function normalizeRadian(angle) { + angle %= PI2$2; + if (angle < 0) { + angle += PI2$2; + } + return angle; + } + + var PI2$3 = Math.PI * 2; + function containStroke$3(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) { + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$3; + } + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$3; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle); + } + + function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var t = (y - y0) / (y1 - y0); + var dir = y1 < y0 ? 1 : -1; + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + var x_ = t * (x1 - x0) + x0; + return x_ === x ? Infinity : x_ > x ? dir : 0; + } + + var CMD$1 = PathProxy.CMD; + var PI2$4 = Math.PI * 2; + var EPSILON$3 = 1e-4; + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON$3; + } + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + if ((y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3)) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_ = void 0; + var y1_ = void 0; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var unit = (t === 0 || t === 1) ? 0.5 : 1; + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema === 2) { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } + else { + w += y3 < y1_ ? unit : -unit; + } + } + else { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } + } + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + if ((y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2)) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } + else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } + else { + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { + return 0; + } + return y2 < y0 ? unit : -unit; + } + } + } + function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + var dTheta = Math.abs(startAngle - endAngle); + if (dTheta < 1e-4) { + return 0; + } + if (dTheta >= PI2$4 - 1e-4) { + startAngle = 0; + endAngle = PI2$4; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } + else { + return 0; + } + } + if (startAngle > endAngle) { + var tmp_1 = startAngle; + startAngle = endAngle; + endAngle = tmp_1; + } + if (startAngle < 0) { + startAngle += PI2$4; + endAngle += PI2$4; + } + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2$4 + angle; + } + if ((angle >= startAngle && angle <= endAngle) + || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + function containPath(path, lineWidth, isStroke, x, y) { + var data = path.data; + var len = path.len(); + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (cmd === CMD$1.M && i > 1) { + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + } + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$1.M: + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$1(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.Q: + if (isStroke) { + if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; + if (!isFirst) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + x0 = x1; + y0 = y1; + } + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$3(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) { + return true; + } + } + else { + w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + x1 = x0 + width; + y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, x0, y0, x, y); + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + function contain(pathProxy, x, y) { + return containPath(pathProxy, 0, false, x, y); + } + function containStroke$4(pathProxy, lineWidth, x, y) { + return containPath(pathProxy, lineWidth, true, x, y); + } + + var DEFAULT_PATH_STYLE = defaults({ + fill: '#000', + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: 'butt', + miterLimit: 10, + strokeNoScale: false, + strokeFirst: false + }, DEFAULT_COMMON_STYLE); + var DEFAULT_PATH_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + strokePercent: true, + fillOpacity: true, + strokeOpacity: true, + lineDashOffset: true, + lineWidth: true, + miterLimit: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible', + 'culling', 'z', 'z2', 'zlevel', 'parent' + ]); + var Path = (function (_super) { + __extends(Path, _super); + function Path(opts) { + return _super.call(this, opts) || this; + } + Path.prototype.update = function () { + var _this = this; + _super.prototype.update.call(this); + var style = this.style; + if (style.decal) { + var decalEl = this._decalEl = this._decalEl || new Path(); + if (decalEl.buildPath === Path.prototype.buildPath) { + decalEl.buildPath = function (ctx) { + _this.buildPath(ctx, _this.shape); + }; + } + decalEl.silent = true; + var decalElStyle = decalEl.style; + for (var key in style) { + if (decalElStyle[key] !== style[key]) { + decalElStyle[key] = style[key]; + } + } + decalElStyle.fill = style.fill ? style.decal : null; + decalElStyle.decal = null; + decalElStyle.shadowColor = null; + style.strokeFirst && (decalElStyle.stroke = null); + for (var i = 0; i < pathCopyParams.length; ++i) { + decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; + } + decalEl.__dirty |= REDRAW_BIT; + } + else if (this._decalEl) { + this._decalEl = null; + } + }; + Path.prototype.getDecalElement = function () { + return this._decalEl; + }; + Path.prototype._init = function (props) { + var keysArr = keys(props); + this.shape = this.getDefaultShape(); + var defaultStyle = this.getDefaultStyle(); + if (defaultStyle) { + this.useStyle(defaultStyle); + } + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + var value = props[key]; + if (key === 'style') { + if (!this.style) { + this.useStyle(value); + } + else { + extend(this.style, value); + } + } + else if (key === 'shape') { + extend(this.shape, value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Path.prototype.getDefaultStyle = function () { + return null; + }; + Path.prototype.getDefaultShape = function () { + return {}; + }; + Path.prototype.canBeInsideText = function () { + return this.hasFill(); + }; + Path.prototype.getInsideTextFill = function () { + var pathFill = this.style.fill; + if (pathFill !== 'none') { + if (isString(pathFill)) { + var fillLum = lum(pathFill, 0); + if (fillLum > 0.5) { + return DARK_LABEL_COLOR; + } + else if (fillLum > 0.2) { + return LIGHTER_LABEL_COLOR; + } + return LIGHT_LABEL_COLOR; + } + else if (pathFill) { + return LIGHT_LABEL_COLOR; + } + } + return DARK_LABEL_COLOR; + }; + Path.prototype.getInsideTextStroke = function (textFill) { + var pathFill = this.style.fill; + if (isString(pathFill)) { + var zr = this.__zr; + var isDarkMode = !!(zr && zr.isDarkMode()); + var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; + if (isDarkMode === isDarkLabel) { + return pathFill; + } + } + }; + Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { }; + Path.prototype.pathUpdated = function () { + this.__dirty &= ~SHAPE_CHANGED_BIT; + }; + Path.prototype.getUpdatedPathProxy = function (inBatch) { + !this.path && this.createPathProxy(); + this.path.beginPath(); + this.buildPath(this.path, this.shape, inBatch); + return this.path; + }; + Path.prototype.createPathProxy = function () { + this.path = new PathProxy(false); + }; + Path.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + }; + Path.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + Path.prototype.getBoundingRect = function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var firstInvoke = false; + if (!this.path) { + firstInvoke = true; + this.createPathProxy(); + } + var path = this.path; + if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) { + path.beginPath(); + this.buildPath(path, this.shape, false); + this.pathUpdated(); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + if (this.hasStroke() && this.path && this.path.len() > 0) { + var rectStroke = this._rectStroke || (this._rectStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectStroke.copy(rect); + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + var w = style.lineWidth; + if (!this.hasFill()) { + var strokeContainThreshold = this.strokeContainThreshold; + w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); + } + if (lineScale > 1e-10) { + rectStroke.width += w / lineScale; + rectStroke.height += w / lineScale; + rectStroke.x -= w / lineScale / 2; + rectStroke.y -= w / lineScale / 2; + } + } + return rectStroke; + } + return rect; + }; + Path.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + if (rect.contain(x, y)) { + var pathProxy = this.path; + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + if (lineScale > 1e-10) { + if (!this.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) { + return true; + } + } + } + if (this.hasFill()) { + return contain(pathProxy, x, y); + } + } + return false; + }; + Path.prototype.dirtyShape = function () { + this.__dirty |= SHAPE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + if (this._decalEl) { + this._decalEl.dirtyShape(); + } + this.markRedraw(); + }; + Path.prototype.dirty = function () { + this.dirtyStyle(); + this.dirtyShape(); + }; + Path.prototype.animateShape = function (loop) { + return this.animate('shape', loop); + }; + Path.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else if (targetKey === 'shape') { + this.dirtyShape(); + } + else { + this.markRedraw(); + } + }; + Path.prototype.attrKV = function (key, value) { + if (key === 'shape') { + this.setShape(value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + }; + Path.prototype.setShape = function (keyOrObj, value) { + var shape = this.shape; + if (!shape) { + shape = this.shape = {}; + } + if (typeof keyOrObj === 'string') { + shape[keyOrObj] = value; + } + else { + extend(shape, keyOrObj); + } + this.dirtyShape(); + return this; + }; + Path.prototype.shapeChanged = function () { + return !!(this.__dirty & SHAPE_CHANGED_BIT); + }; + Path.prototype.createStyle = function (obj) { + return createObject(DEFAULT_PATH_STYLE, obj); + }; + Path.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.shape && !normalState.shape) { + normalState.shape = extend({}, this.shape); + } + }; + Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetShape; + if (state && state.shape) { + if (transition) { + if (keepCurrentStates) { + targetShape = state.shape; + } + else { + targetShape = extend({}, normalState.shape); + extend(targetShape, state.shape); + } + } + else { + targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); + extend(targetShape, state.shape); + } + } + else if (needsRestoreToNormal) { + targetShape = normalState.shape; + } + if (targetShape) { + if (transition) { + this.shape = extend({}, this.shape); + var targetShapePrimaryProps = {}; + var shapeKeys = keys(targetShape); + for (var i = 0; i < shapeKeys.length; i++) { + var key = shapeKeys[i]; + if (typeof targetShape[key] === 'object') { + this.shape[key] = targetShape[key]; + } + else { + targetShapePrimaryProps[key] = targetShape[key]; + } + } + this._transitionState(stateName, { + shape: targetShapePrimaryProps + }, animationCfg); + } + else { + this.shape = targetShape; + this.dirtyShape(); + } + } + }; + Path.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedShape; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.shape) { + mergedShape = mergedShape || {}; + this._mergeStyle(mergedShape, state.shape); + } + } + if (mergedShape) { + mergedState.shape = mergedShape; + } + return mergedState; + }; + Path.prototype.getAnimationStyleProps = function () { + return DEFAULT_PATH_ANIMATION_PROPS; + }; + Path.prototype.isZeroArea = function () { + return false; + }; + Path.extend = function (defaultProps) { + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + defaultProps.init && defaultProps.init.call(_this, opts); + return _this; + } + Sub.prototype.getDefaultStyle = function () { + return clone(defaultProps.style); + }; + Sub.prototype.getDefaultShape = function () { + return clone(defaultProps.shape); + }; + return Sub; + }(Path)); + for (var key in defaultProps) { + if (typeof defaultProps[key] === 'function') { + Sub.prototype[key] = defaultProps[key]; + } + } + return Sub; + }; + Path.initDefaultProps = (function () { + var pathProto = Path.prototype; + pathProto.type = 'path'; + pathProto.strokeContainThreshold = 5; + pathProto.segmentIgnoreThreshold = 0; + pathProto.subPixelOptimize = false; + pathProto.autoBatch = false; + pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT; + })(); + return Path; + }(Displayable)); + + var DEFAULT_TSPAN_STYLE = defaults({ + strokeFirst: true, + font: DEFAULT_FONT, + x: 0, + y: 0, + textAlign: 'left', + textBaseline: 'top', + miterLimit: 2 + }, DEFAULT_PATH_STYLE); + var TSpan = (function (_super) { + __extends(TSpan, _super); + function TSpan() { + return _super !== null && _super.apply(this, arguments) || this; + } + TSpan.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + }; + TSpan.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + TSpan.prototype.createStyle = function (obj) { + return createObject(DEFAULT_TSPAN_STYLE, obj); + }; + TSpan.prototype.setBoundingRect = function (rect) { + this._rect = rect; + }; + TSpan.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline); + rect.x += style.x || 0; + rect.y += style.y || 0; + if (this.hasStroke()) { + var w = style.lineWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + this._rect = rect; + } + return this._rect; + }; + TSpan.initDefaultProps = (function () { + var tspanProto = TSpan.prototype; + tspanProto.dirtyRectTolerance = 10; + })(); + return TSpan; + }(Displayable)); + TSpan.prototype.type = 'tspan'; + + var DEFAULT_IMAGE_STYLE = defaults({ + x: 0, + y: 0 + }, DEFAULT_COMMON_STYLE); + var DEFAULT_IMAGE_ANIMATION_PROPS = { + style: defaults({ + x: true, + y: true, + width: true, + height: true, + sx: true, + sy: true, + sWidth: true, + sHeight: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + function isImageLike(source) { + return !!(source + && typeof source !== 'string' + && source.width && source.height); + } + var ZRImage = (function (_super) { + __extends(ZRImage, _super); + function ZRImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZRImage.prototype.createStyle = function (obj) { + return createObject(DEFAULT_IMAGE_STYLE, obj); + }; + ZRImage.prototype._getSize = function (dim) { + var style = this.style; + var size = style[dim]; + if (size != null) { + return size; + } + var imageSource = isImageLike(style.image) + ? style.image : this.__image; + if (!imageSource) { + return 0; + } + var otherDim = dim === 'width' ? 'height' : 'width'; + var otherDimSize = style[otherDim]; + if (otherDimSize == null) { + return imageSource[dim]; + } + else { + return imageSource[dim] / imageSource[otherDim] * otherDimSize; + } + }; + ZRImage.prototype.getWidth = function () { + return this._getSize('width'); + }; + ZRImage.prototype.getHeight = function () { + return this._getSize('height'); + }; + ZRImage.prototype.getAnimationStyleProps = function () { + return DEFAULT_IMAGE_ANIMATION_PROPS; + }; + ZRImage.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight()); + } + return this._rect; + }; + return ZRImage; + }(Displayable)); + ZRImage.prototype.type = 'image'; + + function buildPath(ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); + } + + var round$1 = Math.round; + function subPixelOptimizeLine(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var x1 = inputShape.x1; + var x2 = inputShape.x2; + var y1 = inputShape.y1; + var y2 = inputShape.y2; + outputShape.x1 = x1; + outputShape.x2 = x2; + outputShape.y1 = y1; + outputShape.y2 = y2; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + if (round$1(x1 * 2) === round$1(x2 * 2)) { + outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true); + } + if (round$1(y1 * 2) === round$1(y2 * 2)) { + outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true); + } + return outputShape; + } + function subPixelOptimizeRect(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var originX = inputShape.x; + var originY = inputShape.y; + var originWidth = inputShape.width; + var originHeight = inputShape.height; + outputShape.x = originX; + outputShape.y = originY; + outputShape.width = originWidth; + outputShape.height = originHeight; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + outputShape.x = subPixelOptimize(originX, lineWidth, true); + outputShape.y = subPixelOptimize(originY, lineWidth, true); + outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); + outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); + return outputShape; + } + function subPixelOptimize(position, lineWidth, positiveOrNegative) { + if (!lineWidth) { + return position; + } + var doubledPosition = round$1(position * 2); + return (doubledPosition + round$1(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + } + + var RectShape = (function () { + function RectShape() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + return RectShape; + }()); + var subPixelOptimizeOutputShape = {}; + var Rect = (function (_super) { + __extends(Rect, _super); + function Rect(opts) { + return _super.call(this, opts) || this; + } + Rect.prototype.getDefaultShape = function () { + return new RectShape(); + }; + Rect.prototype.buildPath = function (ctx, shape) { + var x; + var y; + var width; + var height; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style); + x = optimizedShape.x; + y = optimizedShape.y; + width = optimizedShape.width; + height = optimizedShape.height; + optimizedShape.r = shape.r; + shape = optimizedShape; + } + else { + x = shape.x; + y = shape.y; + width = shape.width; + height = shape.height; + } + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + buildPath(ctx, shape); + } + }; + Rect.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height; + }; + return Rect; + }(Path)); + Rect.prototype.type = 'rect'; + + var DEFAULT_RICH_TEXT_COLOR = { + fill: '#000' + }; + var DEFAULT_STROKE_LINE_WIDTH = 2; + var DEFAULT_TEXT_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + fillOpacity: true, + strokeOpacity: true, + lineWidth: true, + fontSize: true, + lineHeight: true, + width: true, + height: true, + textShadowColor: true, + textShadowBlur: true, + textShadowOffsetX: true, + textShadowOffsetY: true, + backgroundColor: true, + padding: true, + borderColor: true, + borderWidth: true, + borderRadius: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var ZRText = (function (_super) { + __extends(ZRText, _super); + function ZRText(opts) { + var _this = _super.call(this) || this; + _this.type = 'text'; + _this._children = []; + _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR; + _this.attr(opts); + return _this; + } + ZRText.prototype.childrenRef = function () { + return this._children; + }; + ZRText.prototype.update = function () { + _super.prototype.update.call(this); + if (this.styleChanged()) { + this._updateSubTexts(); + } + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.zlevel = this.zlevel; + child.z = this.z; + child.z2 = this.z2; + child.culling = this.culling; + child.cursor = this.cursor; + child.invisible = this.invisible; + } + }; + ZRText.prototype.updateTransform = function () { + var innerTransformable = this.innerTransformable; + if (innerTransformable) { + innerTransformable.updateTransform(); + if (innerTransformable.transform) { + this.transform = innerTransformable.transform; + } + } + else { + _super.prototype.updateTransform.call(this); + } + }; + ZRText.prototype.getLocalTransform = function (m) { + var innerTransformable = this.innerTransformable; + return innerTransformable + ? innerTransformable.getLocalTransform(m) + : _super.prototype.getLocalTransform.call(this, m); + }; + ZRText.prototype.getComputedTransform = function () { + if (this.__hostTarget) { + this.__hostTarget.getComputedTransform(); + this.__hostTarget.updateInnerText(true); + } + return _super.prototype.getComputedTransform.call(this); + }; + ZRText.prototype._updateSubTexts = function () { + this._childCursor = 0; + normalizeTextStyle(this.style); + this.style.rich + ? this._updateRichTexts() + : this._updatePlainTexts(); + this._children.length = this._childCursor; + this.styleUpdated(); + }; + ZRText.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = zr; + } + }; + ZRText.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = null; + } + }; + ZRText.prototype.getBoundingRect = function () { + if (this.styleChanged()) { + this._updateSubTexts(); + } + if (!this._rect) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + this._rect = rect || tmpRect; + } + return this._rect; + }; + ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) { + this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR; + }; + ZRText.prototype.setTextContent = function (textContent) { + if ("development" !== 'production') { + throw new Error('Can\'t attach text on another text'); + } + }; + ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) { + if (!sourceStyle) { + return targetStyle; + } + var sourceRich = sourceStyle.rich; + var targetRich = targetStyle.rich || (sourceRich && {}); + extend(targetStyle, sourceStyle); + if (sourceRich && targetRich) { + this._mergeRich(targetRich, sourceRich); + targetStyle.rich = targetRich; + } + else if (targetRich) { + targetStyle.rich = targetRich; + } + return targetStyle; + }; + ZRText.prototype._mergeRich = function (targetRich, sourceRich) { + var richNames = keys(sourceRich); + for (var i = 0; i < richNames.length; i++) { + var richName = richNames[i]; + targetRich[richName] = targetRich[richName] || {}; + extend(targetRich[richName], sourceRich[richName]); + } + }; + ZRText.prototype.getAnimationStyleProps = function () { + return DEFAULT_TEXT_ANIMATION_PROPS; + }; + ZRText.prototype._getOrCreateChild = function (Ctor) { + var child = this._children[this._childCursor]; + if (!child || !(child instanceof Ctor)) { + child = new Ctor(); + } + this._children[this._childCursor++] = child; + child.__zr = this.__zr; + child.parent = this; + return child; + }; + ZRText.prototype._updatePlainTexts = function () { + var style = this.style; + var textFont = style.font || DEFAULT_FONT; + var textPadding = style.padding; + var text = getStyleText(style); + var contentBlock = parsePlainText(text, style); + var needDrawBg = needDrawBackground(style); + var bgColorDrawn = !!(style.backgroundColor); + var outerHeight = contentBlock.outerHeight; + var outerWidth = contentBlock.outerWidth; + var contentWidth = contentBlock.contentWidth; + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + var defaultStyle = this._defaultStyle; + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.align || defaultStyle.align || 'left'; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top'; + var textX = baseX; + var textY = adjustTextY$1(baseY, contentBlock.contentHeight, verticalAlign); + if (needDrawBg || textPadding) { + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + textY += lineHeight / 2; + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + if (verticalAlign === 'top') { + textY += textPadding[0]; + } + else if (verticalAlign === 'bottom') { + textY -= textPadding[2]; + } + } + var defaultLineWidth = 0; + var useDefaultFill = false; + var textFill = getFill('fill' in style + ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in style + ? style.stroke + : (!bgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) + ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = style.textShadowBlur > 0; + var fixedBoundingRect = style.width != null + && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll'); + var calculatedLineHeight = contentBlock.calculatedLineHeight; + for (var i = 0; i < textLines.length; i++) { + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + subElStyle.text = textLines[i]; + subElStyle.x = textX; + subElStyle.y = textY; + if (textAlign) { + subElStyle.textAlign = textAlign; + } + subElStyle.textBaseline = 'middle'; + subElStyle.opacity = style.opacity; + subElStyle.strokeFirst = true; + if (hasShadow) { + subElStyle.shadowBlur = style.textShadowBlur || 0; + subElStyle.shadowColor = style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = style.textShadowOffsetY || 0; + } + subElStyle.stroke = textStroke; + subElStyle.fill = textFill; + if (textStroke) { + subElStyle.lineWidth = style.lineWidth || defaultLineWidth; + subElStyle.lineDash = style.lineDash; + subElStyle.lineDashOffset = style.lineDashOffset || 0; + } + subElStyle.font = textFont; + setSeparateFont(subElStyle, style); + textY += lineHeight; + if (fixedBoundingRect) { + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, style.width, subElStyle.textAlign), adjustTextY$1(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight)); + } + } + }; + ZRText.prototype._updateRichTexts = function () { + var style = this.style; + var text = getStyleText(style); + var contentBlock = parseRichText(text, style); + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.padding; + var baseX = style.x || 0; + var baseY = style.y || 0; + var defaultStyle = this._defaultStyle; + var textAlign = style.align || defaultStyle.align; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign; + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + if (needDrawBackground(style)) { + this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + var bgColorDrawn = !!(style.backgroundColor); + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var remainedWidth = line.width; + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token = void 0; + while (leftIndex < tokenCount + && (token = tokens[leftIndex], !token.align || token.align === 'left')) { + this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn); + remainedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + while (rightIndex >= 0 + && (token = tokens[rightIndex], token.align === 'right')) { + this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn); + remainedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn); + lineXLeft += token.width; + leftIndex++; + } + lineTop += lineHeight; + } + }; + ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) { + var tokenStyle = style.rich[token.styleName] || {}; + tokenStyle.text = token.text; + var verticalAlign = token.verticalAlign; + var y = lineTop + lineHeight / 2; + if (verticalAlign === 'top') { + y = lineTop + token.height / 2; + } + else if (verticalAlign === 'bottom') { + y = lineTop + lineHeight - token.height / 2; + } + var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle); + needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right' + ? x - token.width + : textAlign === 'center' + ? x - token.width / 2 + : x, y - token.height / 2, token.width, token.height); + var bgColorDrawn = !!tokenStyle.backgroundColor; + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[0] - token.innerHeight / 2; + } + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + var defaultStyle = this._defaultStyle; + var useDefaultFill = false; + var defaultLineWidth = 0; + var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill + : 'fill' in style ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke + : 'stroke' in style ? style.stroke + : (!bgColorDrawn + && !parentBgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = tokenStyle.textShadowBlur > 0 + || style.textShadowBlur > 0; + subElStyle.text = token.text; + subElStyle.x = x; + subElStyle.y = y; + if (hasShadow) { + subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0; + subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0; + } + subElStyle.textAlign = textAlign; + subElStyle.textBaseline = 'middle'; + subElStyle.font = token.font || DEFAULT_FONT; + subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1); + setSeparateFont(subElStyle, tokenStyle); + if (textStroke) { + subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth); + subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash); + subElStyle.lineDashOffset = style.lineDashOffset || 0; + subElStyle.stroke = textStroke; + } + if (textFill) { + subElStyle.fill = textFill; + } + var textWidth = token.contentWidth; + var textHeight = token.contentHeight; + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight)); + }; + ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) { + var textBackgroundColor = style.backgroundColor; + var textBorderWidth = style.borderWidth; + var textBorderColor = style.borderColor; + var isImageBg = textBackgroundColor && textBackgroundColor.image; + var isPlainOrGradientBg = textBackgroundColor && !isImageBg; + var textBorderRadius = style.borderRadius; + var self = this; + var rectEl; + var imgEl; + if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) { + rectEl = this._getOrCreateChild(Rect); + rectEl.useStyle(rectEl.createStyle()); + rectEl.style.fill = null; + var rectShape = rectEl.shape; + rectShape.x = x; + rectShape.y = y; + rectShape.width = width; + rectShape.height = height; + rectShape.r = textBorderRadius; + rectEl.dirtyShape(); + } + if (isPlainOrGradientBg) { + var rectStyle = rectEl.style; + rectStyle.fill = textBackgroundColor || null; + rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1); + } + else if (isImageBg) { + imgEl = this._getOrCreateChild(ZRImage); + imgEl.onload = function () { + self.dirtyStyle(); + }; + var imgStyle = imgEl.style; + imgStyle.image = textBackgroundColor.image; + imgStyle.x = x; + imgStyle.y = y; + imgStyle.width = width; + imgStyle.height = height; + } + if (textBorderWidth && textBorderColor) { + var rectStyle = rectEl.style; + rectStyle.lineWidth = textBorderWidth; + rectStyle.stroke = textBorderColor; + rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1); + rectStyle.lineDash = style.borderDash; + rectStyle.lineDashOffset = style.borderDashOffset || 0; + rectEl.strokeContainThreshold = 0; + if (rectEl.hasFill() && rectEl.hasStroke()) { + rectStyle.strokeFirst = true; + rectStyle.lineWidth *= 2; + } + } + var commonStyle = (rectEl || imgEl).style; + commonStyle.shadowBlur = style.shadowBlur || 0; + commonStyle.shadowColor = style.shadowColor || 'transparent'; + commonStyle.shadowOffsetX = style.shadowOffsetX || 0; + commonStyle.shadowOffsetY = style.shadowOffsetY || 0; + commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1); + }; + ZRText.makeFont = function (style) { + var font = ''; + if (hasSeparateFont(style)) { + font = [ + style.fontStyle, + style.fontWeight, + parseFontSize(style.fontSize), + style.fontFamily || 'sans-serif' + ].join(' '); + } + return font && trim(font) || style.textFont || style.font; + }; + return ZRText; + }(Displayable)); + var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 }; + var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 }; + var FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily']; + function parseFontSize(fontSize) { + if (typeof fontSize === 'string' + && (fontSize.indexOf('px') !== -1 + || fontSize.indexOf('rem') !== -1 + || fontSize.indexOf('em') !== -1)) { + return fontSize; + } + else if (!isNaN(+fontSize)) { + return fontSize + 'px'; + } + else { + return DEFAULT_FONT_SIZE + 'px'; + } + } + function setSeparateFont(targetStyle, sourceStyle) { + for (var i = 0; i < FONT_PARTS.length; i++) { + var fontProp = FONT_PARTS[i]; + var val = sourceStyle[fontProp]; + if (val != null) { + targetStyle[fontProp] = val; + } + } + } + function hasSeparateFont(style) { + return style.fontSize != null || style.fontFamily || style.fontWeight; + } + function normalizeTextStyle(style) { + normalizeStyle(style); + each(style.rich, normalizeStyle); + return style; + } + function normalizeStyle(style) { + if (style) { + style.font = ZRText.makeFont(style); + var textAlign = style.align; + textAlign === 'middle' && (textAlign = 'center'); + style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left'; + var verticalAlign = style.verticalAlign; + verticalAlign === 'center' && (verticalAlign = 'middle'); + style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top'; + var textPadding = style.padding; + if (textPadding) { + style.padding = normalizeCssArray(style.padding); + } + } + } + function getStroke(stroke, lineWidth) { + return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none') + ? null + : (stroke.image || stroke.colorStops) + ? '#000' + : stroke; + } + function getFill(fill) { + return (fill == null || fill === 'none') + ? null + : (fill.image || fill.colorStops) + ? '#000' + : fill; + } + function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === 'right' + ? (x - textPadding[1]) + : textAlign === 'center' + ? (x + textPadding[3] / 2 - textPadding[1] / 2) + : (x + textPadding[3]); + } + function getStyleText(style) { + var text = style.text; + text != null && (text += ''); + return text; + } + function needDrawBackground(style) { + return !!(style.backgroundColor + || style.lineHeight + || (style.borderWidth && style.borderColor)); + } + + var getECData = makeInner(); + var setCommonECData = function (seriesIndex, dataType, dataIdx, el) { + if (el) { + var ecData = getECData(el); // Add data index and series index for indexing the data by element + // Useful in tooltip + + ecData.dataIndex = dataIdx; + ecData.dataType = dataType; + ecData.seriesIndex = seriesIndex; // TODO: not store dataIndex on children. + + if (el.type === 'group') { + el.traverse(function (child) { + var childECData = getECData(child); + childECData.seriesIndex = seriesIndex; + childECData.dataIndex = dataIdx; + childECData.dataType = dataType; + }); + } + } + }; + + var _highlightNextDigit = 1; + var _highlightKeyMap = {}; + var getSavedStates = makeInner(); + var getComponentStates = makeInner(); + var HOVER_STATE_NORMAL = 0; + var HOVER_STATE_BLUR = 1; + var HOVER_STATE_EMPHASIS = 2; + var SPECIAL_STATES = ['emphasis', 'blur', 'select']; + var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select']; + var Z2_EMPHASIS_LIFT = 10; + var Z2_SELECT_LIFT = 9; + var HIGHLIGHT_ACTION_TYPE = 'highlight'; + var DOWNPLAY_ACTION_TYPE = 'downplay'; + var SELECT_ACTION_TYPE = 'select'; + var UNSELECT_ACTION_TYPE = 'unselect'; + var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect'; + + function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke !== 'none'; + } // Most lifted color are duplicated. + + + var liftedColorCache = new LRU(100); + + function liftColor(color$1) { + if (isString(color$1)) { + var liftedColor = liftedColorCache.get(color$1); + + if (!liftedColor) { + liftedColor = lift(color$1, -0.1); + liftedColorCache.put(color$1, liftedColor); + } + + return liftedColor; + } else if (isGradientObject(color$1)) { + var ret = extend({}, color$1); + ret.colorStops = map(color$1.colorStops, function (stop) { + return { + offset: stop.offset, + color: lift(stop.color, -0.1) + }; + }); + return ret; + } // Change nothing. + + + return color$1; + } + + function doChangeHoverState(el, stateName, hoverStateEnum) { + if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { + el.onHoverStateChange(stateName); + } + + el.hoverState = hoverStateEnum; + } + + function singleEnterEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS); + } + + function singleLeaveEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + if (el.hoverState === HOVER_STATE_EMPHASIS) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterBlur(el) { + doChangeHoverState(el, 'blur', HOVER_STATE_BLUR); + } + + function singleLeaveBlur(el) { + if (el.hoverState === HOVER_STATE_BLUR) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterSelect(el) { + el.selected = true; + } + + function singleLeaveSelect(el) { + el.selected = false; + } + + function updateElementState(el, updater, commonParam) { + updater(el, commonParam); + } + + function traverseUpdateState(el, updater, commonParam) { + updateElementState(el, updater, commonParam); + el.isGroup && el.traverse(function (child) { + updateElementState(child, updater, commonParam); + }); + } + + function setStatesFlag(el, stateName) { + switch (stateName) { + case 'emphasis': + el.hoverState = HOVER_STATE_EMPHASIS; + break; + + case 'normal': + el.hoverState = HOVER_STATE_NORMAL; + break; + + case 'blur': + el.hoverState = HOVER_STATE_BLUR; + break; + + case 'select': + el.selected = true; + } + } + + function getFromStateStyle(el, props, toStateName, defaultValue) { + var style = el.style; + var fromState = {}; + + for (var i = 0; i < props.length; i++) { + var propName = props[i]; + var val = style[propName]; + fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.__fromStateTransition // Don't consider the animation to emphasis state. + && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') { + animator.saveTo(fromState, props); + } + } + + return fromState; + } + + function createEmphasisDefaultState(el, stateName, targetStates, state) { + var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0; + var cloned = false; + + if (el instanceof Path) { + var store = getSavedStates(el); + var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; + var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; + + if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { + state = state || {}; + var emphasisStyle = state.style || {}; // inherit case + + if (emphasisStyle.fill === 'inherit') { + cloned = true; + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + emphasisStyle.fill = fromFill; + } // Apply default color lift + else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { + cloned = true; // Not modify the original value. + + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); // Already being applied 'emphasis'. DON'T lift color multiple times. + + emphasisStyle.fill = liftColor(fromFill); + } // Not highlight stroke if fill has been highlighted. + else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { + if (!cloned) { + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + } + + emphasisStyle.stroke = liftColor(fromStroke); + } + + state.style = emphasisStyle; + } + } + + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + if (!cloned) { + state = extend({}, state); + } + + var z2EmphasisLift = el.z2EmphasisLift; + state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); + } + } + + return state; + } + + function createSelectDefaultState(el, stateName, state) { + // const hasSelect = indexOf(el.currentStates, stateName) >= 0; + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + state = extend({}, state); + var z2SelectLift = el.z2SelectLift; + state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); + } + } + + return state; + } + + function createBlurDefaultState(el, stateName, state) { + var hasBlur = indexOf(el.currentStates, stateName) >= 0; + var currentOpacity = el.style.opacity; + var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, { + opacity: 1 + }) : null; + state = state || {}; + var blurStyle = state.style || {}; + + if (blurStyle.opacity == null) { + // clone state + state = extend({}, state); + blurStyle = extend({ + // Already being applied 'emphasis'. DON'T mul opacity multiple times. + opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 + }, blurStyle); + state.style = blurStyle; + } + + return state; + } + + function elementStateProxy(stateName, targetStates) { + var state = this.states[stateName]; + + if (this.style) { + if (stateName === 'emphasis') { + return createEmphasisDefaultState(this, stateName, targetStates, state); + } else if (stateName === 'blur') { + return createBlurDefaultState(this, stateName, state); + } else if (stateName === 'select') { + return createSelectDefaultState(this, stateName, state); + } + } + + return state; + } + /** + * Set hover style (namely "emphasis style") of element. + * @param el Should not be `zrender/graphic/Group`. + * @param focus 'self' | 'selfInSeries' | 'series' + */ + + + function setDefaultStateProxy(el) { + el.stateProxy = elementStateProxy; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (textContent) { + textContent.stateProxy = elementStateProxy; + } + + if (textGuide) { + textGuide.stateProxy = elementStateProxy; + } + } + function enterEmphasisWhenMouseOver(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasisWhenMouseOut(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterEmphasis(el, highlightDigit) { + el.__highByOuter |= 1 << (highlightDigit || 0); + traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasis(el, highlightDigit) { + !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterBlur(el) { + traverseUpdateState(el, singleEnterBlur); + } + function leaveBlur(el) { + traverseUpdateState(el, singleLeaveBlur); + } + function enterSelect(el) { + traverseUpdateState(el, singleEnterSelect); + } + function leaveSelect(el) { + traverseUpdateState(el, singleLeaveSelect); + } + + function shouldSilent(el, e) { + return el.__highDownSilentOnTouch && e.zrByTouch; + } + + function allLeaveBlur(api) { + var model = api.getModel(); + var leaveBlurredSeries = []; + var allComponentViews = []; + model.eachComponent(function (componentType, componentModel) { + var componentStates = getComponentStates(componentModel); + var isSeries = componentType === 'series'; + var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); + !isSeries && allComponentViews.push(view); + + if (componentStates.isBlured) { + // Leave blur anyway + view.group.traverse(function (child) { + singleLeaveBlur(child); + }); + isSeries && leaveBlurredSeries.push(componentModel); + } + + componentStates.isBlured = false; + }); + each(allComponentViews, function (view) { + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(leaveBlurredSeries, false, model); + } + }); + } + function blurSeries(targetSeriesIndex, focus, blurScope, api) { + var ecModel = api.getModel(); + blurScope = blurScope || 'coordinateSystem'; + + function leaveBlurOfIndices(data, dataIndices) { + for (var i = 0; i < dataIndices.length; i++) { + var itemEl = data.getItemGraphicEl(dataIndices[i]); + itemEl && leaveBlur(itemEl); + } + } + + if (targetSeriesIndex == null) { + return; + } + + if (!focus || focus === 'none') { + return; + } + + var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); + var targetCoordSys = targetSeriesModel.coordinateSystem; + + if (targetCoordSys && targetCoordSys.master) { + targetCoordSys = targetCoordSys.master; + } + + var blurredSeries = []; + ecModel.eachSeries(function (seriesModel) { + var sameSeries = targetSeriesModel === seriesModel; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.master) { + coordSys = coordSys.master; + } + + var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead. + + if (!( // Not blur other series if blurScope series + blurScope === 'series' && !sameSeries // Not blur other coordinate system if blurScope is coordinateSystem + || blurScope === 'coordinateSystem' && !sameCoordSys // Not blur self series if focus is series. + || focus === 'series' && sameSeries // TODO blurScope: coordinate system + )) { + var view = api.getViewOfSeriesModel(seriesModel); + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + + if (isArrayLike(focus)) { + leaveBlurOfIndices(seriesModel.getData(), focus); + } else if (isObject(focus)) { + var dataTypes = keys(focus); + + for (var d = 0; d < dataTypes.length; d++) { + leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); + } + } + + blurredSeries.push(seriesModel); + getComponentStates(seriesModel).isBlured = true; + } + }); + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(blurredSeries, true, ecModel); + } + }); + } + function blurComponent(componentMainType, componentIndex, api) { + if (componentMainType == null || componentIndex == null) { + return; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return; + } + + getComponentStates(componentModel).isBlured = true; + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.focusBlurEnabled) { + return; + } + + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + } + function blurSeriesFromHighlightPayload(seriesModel, payload, api) { + var seriesIndex = seriesModel.seriesIndex; + var data = seriesModel.getData(payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + var dataIndex = queryDataIndex(data, payload); // Pick the first one if there is multiple/none exists. + + dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0; + var el = data.getItemGraphicEl(dataIndex); + + if (!el) { + var count = data.count(); + var current = 0; // If data on dataIndex is NaN. + + while (!el && current < count) { + el = data.getItemGraphicEl(current++); + } + } + + if (el) { + var ecData = getECData(el); + blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api); + } else { + // If there is no element put on the data. Try getting it from raw option + // TODO Should put it on seriesModel? + var focus_1 = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + + if (focus_1 != null) { + blurSeries(seriesIndex, focus_1, blurScope, api); + } + } + } + function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) { + var ret = { + focusSelf: false, + dispatchers: null + }; + + if (componentMainType == null || componentMainType === 'series' || componentIndex == null || name == null) { + return ret; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return ret; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.findHighDownDispatchers) { + return ret; + } + + var dispatchers = view.findHighDownDispatchers(name); // At presnet, the component (like Geo) only blur inside itself. + // So we do not use `blurScope` in component. + + var focusSelf; + + for (var i = 0; i < dispatchers.length; i++) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatchers[i])) { + error('param should be highDownDispatcher'); + } + + if (getECData(dispatchers[i]).focus === 'self') { + focusSelf = true; + break; + } + } + + return { + focusSelf: focusSelf, + dispatchers: dispatchers + }; + } + function handleGlobalMouseOverForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + var ecData = getECData(dispatcher); + + var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api), + dispatchers = _a.dispatchers, + focusSelf = _a.focusSelf; // If `findHighDownDispatchers` is supported on the component, + // highlight/downplay elements with the same name. + + + if (dispatchers) { + if (focusSelf) { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } + + each(dispatchers, function (dispatcher) { + return enterEmphasisWhenMouseOver(dispatcher, e); + }); + } else { + // Try blur all in the related series. Then emphasis the hoverred. + // TODO. progressive mode. + blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api); + + if (ecData.focus === 'self') { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } // Other than series, component that not support `findHighDownDispatcher` will + // also use it. But in this case, highlight/downplay are only supported in + // mouse hover but not in dispatchAction. + + + enterEmphasisWhenMouseOver(dispatcher, e); + } + } + function handleGlobalMouseOutForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + allLeaveBlur(api); + var ecData = getECData(dispatcher); + var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers; + + if (dispatchers) { + each(dispatchers, function (dispatcher) { + return leaveEmphasisWhenMouseOut(dispatcher, e); + }); + } else { + leaveEmphasisWhenMouseOut(dispatcher, e); + } + } + function toggleSelectionFromPayload(seriesModel, payload, api) { + if (!isSelectChangePayload(payload)) { + return; + } + + var dataType = payload.dataType; + var data = seriesModel.getData(dataType); + var dataIndex = queryDataIndex(data, payload); + + if (!isArray(dataIndex)) { + dataIndex = [dataIndex]; + } + + seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType); + } + function updateSeriesElementSelection(seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + data.eachItemGraphicEl(function (el, idx) { + seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); + }); + }); + } + function getAllSelectedIndices(ecModel) { + var ret = []; + ecModel.eachSeries(function (seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + var dataIndices = seriesModel.getSelectedDataIndices(); + + if (dataIndices.length > 0) { + var item = { + dataIndex: dataIndices, + seriesIndex: seriesModel.seriesIndex + }; + + if (type != null) { + item.dataType = type; + } + + ret.push(item); + } + }); + }); + return ret; + } + /** + * Enable the function that mouseover will trigger the emphasis state. + * + * NOTE: + * This function should be used on the element with dataIndex, seriesIndex. + * + */ + + function enableHoverEmphasis(el, focus, blurScope) { + setAsHighDownDispatcher(el, true); + traverseUpdateState(el, setDefaultStateProxy); + enableHoverFocus(el, focus, blurScope); + } + function disableHoverEmphasis(el) { + setAsHighDownDispatcher(el, false); + } + function toggleHoverEmphasis(el, focus, blurScope, isDisabled) { + isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope); + } + function enableHoverFocus(el, focus, blurScope) { + var ecData = getECData(el); + + if (focus != null) { + // TODO dataIndex may be set after this function. This check is not useful. + // if (ecData.dataIndex == null) { + // if (__DEV__) { + // console.warn('focus can only been set on element with dataIndex'); + // } + // } + // else { + ecData.focus = focus; + ecData.blurScope = blurScope; // } + } else if (ecData.focus) { + ecData.focus = null; + } + } + var OTHER_STATES = ['emphasis', 'blur', 'select']; + var defaultStyleGetterMap = { + itemStyle: 'getItemStyle', + lineStyle: 'getLineStyle', + areaStyle: 'getAreaStyle' + }; + /** + * Set emphasis/blur/selected states of element. + */ + + function setStatesStylesFromModel(el, itemModel, styleType, // default itemStyle + getter) { + styleType = styleType || 'itemStyle'; + + for (var i = 0; i < OTHER_STATES.length; i++) { + var stateName = OTHER_STATES[i]; + var model = itemModel.getModel([stateName, styleType]); + var state = el.ensureState(stateName); // Let it throw error if getterType is not found. + + state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]](); + } + } + /** + * + * Set element as highlight / downplay dispatcher. + * It will be checked when element received mouseover event or from highlight action. + * It's in change of all highlight/downplay behavior of it's children. + * + * @param el + * @param el.highDownSilentOnTouch + * In touch device, mouseover event will be trigger on touchstart event + * (see module:zrender/dom/HandlerProxy). By this mechanism, we can + * conveniently use hoverStyle when tap on touch screen without additional + * code for compatibility. + * But if the chart/component has select feature, which usually also use + * hoverStyle, there might be conflict between 'select-highlight' and + * 'hover-highlight' especially when roam is enabled (see geo for example). + * In this case, `highDownSilentOnTouch` should be used to disable + * hover-highlight on touch device. + * @param asDispatcher If `false`, do not set as "highDownDispatcher". + */ + + function setAsHighDownDispatcher(el, asDispatcher) { + var disable = asDispatcher === false; + var extendedEl = el; // Make `highDownSilentOnTouch` and `onStateChange` only work after + // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly. + + if (el.highDownSilentOnTouch) { + extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; + } // Simple optimize, since this method might be + // called for each elements of a group in some cases. + + + if (!disable || extendedEl.__highDownDispatcher) { + // Emphasis, normal can be triggered manually by API or other components like hover link. + // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent); + // Also keep previous record. + extendedEl.__highByOuter = extendedEl.__highByOuter || 0; + extendedEl.__highDownDispatcher = !disable; + } + } + function isHighDownDispatcher(el) { + return !!(el && el.__highDownDispatcher); + } + /** + * Enable component highlight/downplay features: + * + hover link (within the same name) + * + focus blur in component + */ + + function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) { + var ecData = getECData(el); + ecData.componentMainType = componentModel.mainType; + ecData.componentIndex = componentModel.componentIndex; + ecData.componentHighDownName = componentHighDownName; + } + /** + * Support highlight/downplay record on each elements. + * For the case: hover highlight/downplay (legend, visualMap, ...) and + * user triggered highlight/downplay should not conflict. + * Only all of the highlightDigit cleared, return to normal. + * @param {string} highlightKey + * @return {number} highlightDigit + */ + + function getHighlightDigit(highlightKey) { + var highlightDigit = _highlightKeyMap[highlightKey]; + + if (highlightDigit == null && _highlightNextDigit <= 32) { + highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; + } + + return highlightDigit; + } + function isSelectChangePayload(payload) { + var payloadType = payload.type; + return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; + } + function isHighDownPayload(payload) { + var payloadType = payload.type; + return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; + } + function savePathStates(el) { + var store = getSavedStates(el); + store.normalFill = el.style.fill; + store.normalStroke = el.style.stroke; + var selectState = el.states.select || {}; + store.selectFill = selectState.style && selectState.style.fill || null; + store.selectStroke = selectState.style && selectState.style.stroke || null; + } + + var CMD$2 = PathProxy.CMD; + var points = [[], [], []]; + var mathSqrt$1 = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + if (!m) { + return; + } + var data = path.data; + var len = path.len(); + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + var M = CMD$2.M; + var C = CMD$2.C; + var L = CMD$2.L; + var R = CMD$2.R; + var A = CMD$2.A; + var Q = CMD$2.Q; + for (i = 0, j = 0; i < len;) { + cmd = data[i++]; + j = i; + nPoint = 0; + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt$1(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$1(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + data[i] *= sx; + data[i++] += x; + data[i] *= sy; + data[i++] += y; + data[i++] *= sx; + data[i++] *= sy; + data[i++] += angle; + data[i++] += angle; + i += 2; + j = i; + break; + case R: + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + for (k = 0; k < nPoint; k++) { + var p_1 = points[k]; + p_1[0] = data[i++]; + p_1[1] = data[i++]; + applyTransform(p_1, p_1, m); + data[j++] = p_1[0]; + data[j++] = p_1[1]; + } + } + path.increaseVersion(); + } + + var mathSqrt$2 = Math.sqrt; + var mathSin$2 = Math.sin; + var mathCos$2 = Math.cos; + var PI$1 = Math.PI; + function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + } + function vRatio(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + } + function vAngle(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + } + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI$1 / 180.0); + var xp = mathCos$2(psi) * (x1 - x2) / 2.0 + + mathSin$2(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0 + + mathCos$2(psi) * (y1 - y2) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= mathSqrt$2(lambda); + ry *= mathSqrt$2(lambda); + } + var f = (fa === fs ? -1 : 1) + * mathSqrt$2((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp))) || 0; + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + var cx = (x1 + x2) / 2.0 + + mathCos$2(psi) * cxp + - mathSin$2(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin$2(psi) * cxp + + mathCos$2(psi) * cyp; + var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); + var u = [(xp - cxp) / rx, (yp - cyp) / ry]; + var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; + var dTheta = vAngle(u, v); + if (vRatio(u, v) <= -1) { + dTheta = PI$1; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (dTheta < 0) { + var n = Math.round(dTheta / PI$1 * 1e6) / 1e6; + dTheta = PI$1 * 2 + (n % 2) * PI$1; + } + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; + var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + function createPathProxyFromString(data) { + var path = new PathProxy(); + if (!data) { + return path; + } + var cpx = 0; + var cpy = 0; + var subpathX = cpx; + var subpathY = cpy; + var prevCmd; + var CMD = PathProxy.CMD; + var cmdList = data.match(commandReg); + if (!cmdList) { + return path; + } + for (var l = 0; l < cmdList.length; l++) { + var cmdText = cmdList[l]; + var cmdStr = cmdText.charAt(0); + var cmd = void 0; + var p = cmdText.match(numberReg) || []; + var pLen = p.length; + for (var i = 0; i < pLen; i++) { + p[i] = parseFloat(p[i]); + } + var off = 0; + while (off < pLen) { + var ctlPtx = void 0; + var ctlPty = void 0; + var rx = void 0; + var ry = void 0; + var psi = void 0; + var fa = void 0; + var fs = void 0; + var x1 = cpx; + var y1 = cpy; + var len = void 0; + var pathData = void 0; + switch (cmdStr) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + } + } + if (cmdStr === 'z' || cmdStr === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + cpx = subpathX; + cpy = subpathY; + } + prevCmd = cmd; + } + path.toStatic(); + return path; + } + var SVGPath = (function (_super) { + __extends(SVGPath, _super); + function SVGPath() { + return _super !== null && _super.apply(this, arguments) || this; + } + SVGPath.prototype.applyTransform = function (m) { }; + return SVGPath; + }(Path)); + function isPathProxy(path) { + return path.setData != null; + } + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var innerOpts = extend({}, opts); + innerOpts.buildPath = function (path) { + if (isPathProxy(path)) { + path.setData(pathProxy.data); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + else { + var ctx = path; + pathProxy.rebuildPath(ctx, 1); + } + }; + innerOpts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirtyShape(); + }; + return innerOpts; + } + function createFromString(str, opts) { + return new SVGPath(createPathOptions(str, opts)); + } + function extendFromString(str, defaultOpts) { + var innerOpts = createPathOptions(str, defaultOpts); + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + _this.applyTransform = innerOpts.applyTransform; + _this.buildPath = innerOpts.buildPath; + return _this; + } + return Sub; + }(SVGPath)); + return Sub; + } + function mergePath(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + pathList.push(pathEl.getUpdatedPathProxy(true)); + } + var pathBundle = new Path(opts); + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + if (isPathProxy(path)) { + path.appendPath(pathList); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + }; + return pathBundle; + } + function clonePath(sourcePath, opts) { + opts = opts || {}; + var path = new Path(); + if (sourcePath.shape) { + path.setShape(sourcePath.shape); + } + path.setStyle(sourcePath.style); + if (opts.bakeTransform) { + transformPath(path.path, sourcePath.getComputedTransform()); + } + else { + if (opts.toLocal) { + path.setLocalTransform(sourcePath.getComputedTransform()); + } + else { + path.copyTransform(sourcePath); + } + } + path.buildPath = sourcePath.buildPath; + path.applyTransform = path.applyTransform; + path.z = sourcePath.z; + path.z2 = sourcePath.z2; + path.zlevel = sourcePath.zlevel; + return path; + } + + var CircleShape = (function () { + function CircleShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + } + return CircleShape; + }()); + var Circle = (function (_super) { + __extends(Circle, _super); + function Circle(opts) { + return _super.call(this, opts) || this; + } + Circle.prototype.getDefaultShape = function () { + return new CircleShape(); + }; + Circle.prototype.buildPath = function (ctx, shape) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2); + }; + return Circle; + }(Path)); + Circle.prototype.type = 'circle'; + + var EllipseShape = (function () { + function EllipseShape() { + this.cx = 0; + this.cy = 0; + this.rx = 0; + this.ry = 0; + } + return EllipseShape; + }()); + var Ellipse = (function (_super) { + __extends(Ellipse, _super); + function Ellipse(opts) { + return _super.call(this, opts) || this; + } + Ellipse.prototype.getDefaultShape = function () { + return new EllipseShape(); + }; + Ellipse.prototype.buildPath = function (ctx, shape) { + var k = 0.5522848; + var x = shape.cx; + var y = shape.cy; + var a = shape.rx; + var b = shape.ry; + var ox = a * k; + var oy = b * k; + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + }; + return Ellipse; + }(Path)); + Ellipse.prototype.type = 'ellipse'; + + var PI$2 = Math.PI; + var PI2$5 = PI$2 * 2; + var mathSin$3 = Math.sin; + var mathCos$3 = Math.cos; + var mathACos = Math.acos; + var mathATan2 = Math.atan2; + var mathAbs$1 = Math.abs; + var mathSqrt$3 = Math.sqrt; + var mathMax$3 = Math.max; + var mathMin$3 = Math.min; + var e = 1e-4; + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var dx10 = x1 - x0; + var dy10 = y1 - y0; + var dx32 = x3 - x2; + var dy32 = y3 - y2; + var t = dy32 * dx10 - dx32 * dy10; + if (t * t < e) { + return; + } + t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t; + return [x0 + t * dx10, y0 + t * dy10]; + } + function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) { + var x01 = x0 - x1; + var y01 = y0 - y1; + var lo = (clockwise ? cr : -cr) / mathSqrt$3(x01 * x01 + y01 * y01); + var ox = lo * y01; + var oy = -lo * x01; + var x11 = x0 + ox; + var y11 = y0 + oy; + var x10 = x1 + ox; + var y10 = y1 + oy; + var x00 = (x11 + x10) / 2; + var y00 = (y11 + y10) / 2; + var dx = x10 - x11; + var dy = y10 - y11; + var d2 = dx * dx + dy * dy; + var r = radius - cr; + var s = x11 * y10 - x10 * y11; + var d = (dy < 0 ? -1 : 1) * mathSqrt$3(mathMax$3(0, r * r * d2 - s * s)); + var cx0 = (s * dy - dx * d) / d2; + var cy0 = (-s * dx - dy * d) / d2; + var cx1 = (s * dy + dx * d) / d2; + var cy1 = (-s * dx + dy * d) / d2; + var dx0 = cx0 - x00; + var dy0 = cy0 - y00; + var dx1 = cx1 - x00; + var dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) { + cx0 = cx1; + cy0 = cy1; + } + return { + cx: cx0, + cy: cy0, + x0: -ox, + y0: -oy, + x1: cx0 * (radius / r - 1), + y1: cy0 * (radius / r - 1) + }; + } + function normalizeCornerRadius(cr) { + var arr; + if (isArray(cr)) { + var len = cr.length; + if (!len) { + return cr; + } + if (len === 1) { + arr = [cr[0], cr[0], 0, 0]; + } + else if (len === 2) { + arr = [cr[0], cr[0], cr[1], cr[1]]; + } + else if (len === 3) { + arr = cr.concat(cr[2]); + } + else { + arr = cr; + } + } + else { + arr = [cr, cr, cr, cr]; + } + return arr; + } + function buildPath$1(ctx, shape) { + var _a; + var radius = mathMax$3(shape.r, 0); + var innerRadius = mathMax$3(shape.r0 || 0, 0); + var hasRadius = radius > 0; + var hasInnerRadius = innerRadius > 0; + if (!hasRadius && !hasInnerRadius) { + return; + } + if (!hasRadius) { + radius = innerRadius; + innerRadius = 0; + } + if (innerRadius > radius) { + var tmp = radius; + radius = innerRadius; + innerRadius = tmp; + } + var startAngle = shape.startAngle, endAngle = shape.endAngle; + if (isNaN(startAngle) || isNaN(endAngle)) { + return; + } + var cx = shape.cx, cy = shape.cy; + var clockwise = !!shape.clockwise; + var arc = mathAbs$1(endAngle - startAngle); + var mod = arc > PI2$5 && arc % PI2$5; + mod > e && (arc = mod); + if (!(radius > e)) { + ctx.moveTo(cx, cy); + } + else if (arc > PI2$5 - e) { + ctx.moveTo(cx + radius * mathCos$3(startAngle), cy + radius * mathSin$3(startAngle)); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + if (innerRadius > e) { + ctx.moveTo(cx + innerRadius * mathCos$3(endAngle), cy + innerRadius * mathSin$3(endAngle)); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + else { + var icrStart = void 0; + var icrEnd = void 0; + var ocrStart = void 0; + var ocrEnd = void 0; + var ocrs = void 0; + var ocre = void 0; + var icrs = void 0; + var icre = void 0; + var ocrMax = void 0; + var icrMax = void 0; + var limitedOcrMax = void 0; + var limitedIcrMax = void 0; + var xre = void 0; + var yre = void 0; + var xirs = void 0; + var yirs = void 0; + var xrs = radius * mathCos$3(startAngle); + var yrs = radius * mathSin$3(startAngle); + var xire = innerRadius * mathCos$3(endAngle); + var yire = innerRadius * mathSin$3(endAngle); + var hasArc = arc > e; + if (hasArc) { + var cornerRadius = shape.cornerRadius; + if (cornerRadius) { + _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3]; + } + var halfRd = mathAbs$1(radius - innerRadius) / 2; + ocrs = mathMin$3(halfRd, ocrStart); + ocre = mathMin$3(halfRd, ocrEnd); + icrs = mathMin$3(halfRd, icrStart); + icre = mathMin$3(halfRd, icrEnd); + limitedOcrMax = ocrMax = mathMax$3(ocrs, ocre); + limitedIcrMax = icrMax = mathMax$3(icrs, icre); + if (ocrMax > e || icrMax > e) { + xre = radius * mathCos$3(endAngle); + yre = radius * mathSin$3(endAngle); + xirs = innerRadius * mathCos$3(startAngle); + yirs = innerRadius * mathSin$3(startAngle); + if (arc < PI$2) { + var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire); + if (it_1) { + var x0 = xrs - it_1[0]; + var y0 = yrs - it_1[1]; + var x1 = xre - it_1[0]; + var y1 = yre - it_1[1]; + var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$3(x0 * x0 + y0 * y0) * mathSqrt$3(x1 * x1 + y1 * y1))) / 2); + var b = mathSqrt$3(it_1[0] * it_1[0] + it_1[1] * it_1[1]); + limitedOcrMax = mathMin$3(ocrMax, (radius - b) / (a + 1)); + limitedIcrMax = mathMin$3(icrMax, (innerRadius - b) / (a - 1)); + } + } + } + } + if (!hasArc) { + ctx.moveTo(cx + xrs, cy + yrs); + } + else if (limitedOcrMax > e) { + var crStart = mathMin$3(ocrStart, limitedOcrMax); + var crEnd = mathMin$3(ocrEnd, limitedOcrMax); + var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise); + var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise); + ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedOcrMax < ocrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise); + crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.moveTo(cx + xrs, cy + yrs); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + } + if (!(innerRadius > e) || !hasArc) { + ctx.lineTo(cx + xire, cy + yire); + } + else if (limitedIcrMax > e) { + var crStart = mathMin$3(icrStart, limitedIcrMax); + var crEnd = mathMin$3(icrEnd, limitedIcrMax); + var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise); + var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise); + ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedIcrMax < icrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise); + crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.lineTo(cx + xire, cy + yire); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + ctx.closePath(); + } + + var SectorShape = (function () { + function SectorShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + this.cornerRadius = 0; + } + return SectorShape; + }()); + var Sector = (function (_super) { + __extends(Sector, _super); + function Sector(opts) { + return _super.call(this, opts) || this; + } + Sector.prototype.getDefaultShape = function () { + return new SectorShape(); + }; + Sector.prototype.buildPath = function (ctx, shape) { + buildPath$1(ctx, shape); + }; + Sector.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle + || this.shape.r === this.shape.r0; + }; + return Sector; + }(Path)); + Sector.prototype.type = 'sector'; + + var RingShape = (function () { + function RingShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.r0 = 0; + } + return RingShape; + }()); + var Ring = (function (_super) { + __extends(Ring, _super); + function Ring(opts) { + return _super.call(this, opts) || this; + } + Ring.prototype.getDefaultShape = function () { + return new RingShape(); + }; + Ring.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + }; + return Ring; + }(Path)); + Ring.prototype.type = 'ring'; + + function smoothBezier(points, smooth, isLoop, constraint) { + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + var min$1; + var max$1; + if (constraint) { + min$1 = [Infinity, Infinity]; + max$1 = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + min(min$1, min$1, points[i]); + max(max$1, max$1, points[i]); + } + min(min$1, min$1, constraint[0]); + max(max$1, max$1, constraint[1]); + } + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(clone$1(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + sub(v, nextPoint, prevPoint); + scale(v, v, smooth); + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + scale(v1, v, -d0); + scale(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max(cp0, cp0, min$1); + min(cp0, cp0, max$1); + max(cp1, cp1, min$1); + min(cp1, cp1, max$1); + } + cps.push(cp0); + cps.push(cp1); + } + if (isLoop) { + cps.push(cps.shift()); + } + return cps; + } + + function buildPath$2(ctx, shape, closePath) { + var smooth = shape.smooth; + var points = shape.points; + if (points && points.length >= 2) { + if (smooth) { + var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint); + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } + else { + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + closePath && ctx.closePath(); + } + } + + var PolygonShape = (function () { + function PolygonShape() { + this.points = null; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolygonShape; + }()); + var Polygon = (function (_super) { + __extends(Polygon, _super); + function Polygon(opts) { + return _super.call(this, opts) || this; + } + Polygon.prototype.getDefaultShape = function () { + return new PolygonShape(); + }; + Polygon.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, true); + }; + return Polygon; + }(Path)); + Polygon.prototype.type = 'polygon'; + + var PolylineShape = (function () { + function PolylineShape() { + this.points = null; + this.percent = 1; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolylineShape; + }()); + var Polyline = (function (_super) { + __extends(Polyline, _super); + function Polyline(opts) { + return _super.call(this, opts) || this; + } + Polyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Polyline.prototype.getDefaultShape = function () { + return new PolylineShape(); + }; + Polyline.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, false); + }; + return Polyline; + }(Path)); + Polyline.prototype.type = 'polyline'; + + var subPixelOptimizeOutputShape$1 = {}; + var LineShape = (function () { + function LineShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + return LineShape; + }()); + var Line = (function (_super) { + __extends(Line, _super); + function Line(opts) { + return _super.call(this, opts) || this; + } + Line.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Line.prototype.getDefaultShape = function () { + return new LineShape(); + }; + Line.prototype.buildPath = function (ctx, shape) { + var x1; + var y1; + var x2; + var y2; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style); + x1 = optimizedShape.x1; + y1 = optimizedShape.y1; + x2 = optimizedShape.x2; + y2 = optimizedShape.y2; + } + else { + x1 = shape.x1; + y1 = shape.y1; + x2 = shape.x2; + y2 = shape.y2; + } + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }; + Line.prototype.pointAt = function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + }; + return Line; + }(Path)); + Line.prototype.type = 'line'; + + var out = []; + var BezierCurveShape = (function () { + function BezierCurveShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.percent = 1; + } + return BezierCurveShape; + }()); + function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 != null || cpy2 != null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } + else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } + } + var BezierCurve = (function (_super) { + __extends(BezierCurve, _super); + function BezierCurve(opts) { + return _super.call(this, opts) || this; + } + BezierCurve.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + BezierCurve.prototype.getDefaultShape = function () { + return new BezierCurveShape(); + }; + BezierCurve.prototype.buildPath = function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide(x1, cpx1, x2, percent, out); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide(y1, cpy1, y2, percent, out); + cpy1 = out[1]; + y2 = out[2]; + } + ctx.quadraticCurveTo(cpx1, cpy1, x2, y2); + } + else { + if (percent < 1) { + cubicSubdivide(x1, cpx1, cpx2, x2, percent, out); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide(y1, cpy1, cpy2, y2, percent, out); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + } + }; + BezierCurve.prototype.pointAt = function (t) { + return someVectorAt(this.shape, t, false); + }; + BezierCurve.prototype.tangentAt = function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize(p, p); + }; + return BezierCurve; + }(Path)); + BezierCurve.prototype.type = 'bezier-curve'; + + var ArcShape = (function () { + function ArcShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + return ArcShape; + }()); + var Arc = (function (_super) { + __extends(Arc, _super); + function Arc(opts) { + return _super.call(this, opts) || this; + } + Arc.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Arc.prototype.getDefaultShape = function () { + return new ArcShape(); + }; + Arc.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + }; + return Arc; + }(Path)); + Arc.prototype.type = 'arc'; + + var CompoundPath = (function (_super) { + __extends(CompoundPath, _super); + function CompoundPath() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'compound'; + return _this; + } + CompoundPath.prototype._updatePathDirty = function () { + var paths = this.shape.paths; + var dirtyPath = this.shapeChanged(); + for (var i = 0; i < paths.length; i++) { + dirtyPath = dirtyPath || paths[i].shapeChanged(); + } + if (dirtyPath) { + this.dirtyShape(); + } + }; + CompoundPath.prototype.beforeBrush = function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); + } + }; + CompoundPath.prototype.buildPath = function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }; + CompoundPath.prototype.afterBrush = function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].pathUpdated(); + } + }; + CompoundPath.prototype.getBoundingRect = function () { + this._updatePathDirty.call(this); + return Path.prototype.getBoundingRect.call(this); + }; + return CompoundPath; + }(Path)); + + var Gradient = (function () { + function Gradient(colorStops) { + this.colorStops = colorStops || []; + } + Gradient.prototype.addColorStop = function (offset, color) { + this.colorStops.push({ + offset: offset, + color: color + }); + }; + return Gradient; + }()); + + var LinearGradient = (function (_super) { + __extends(LinearGradient, _super); + function LinearGradient(x, y, x2, y2, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0 : x; + _this.y = y == null ? 0 : y; + _this.x2 = x2 == null ? 1 : x2; + _this.y2 = y2 == null ? 0 : y2; + _this.type = 'linear'; + _this.global = globalCoord || false; + return _this; + } + return LinearGradient; + }(Gradient)); + + var RadialGradient = (function (_super) { + __extends(RadialGradient, _super); + function RadialGradient(x, y, r, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0.5 : x; + _this.y = y == null ? 0.5 : y; + _this.r = r == null ? 0.5 : r; + _this.type = 'radial'; + _this.global = globalCoord || false; + return _this; + } + return RadialGradient; + }(Gradient)); + + var extent = [0, 0]; + var extent2 = [0, 0]; + var minTv$1 = new Point(); + var maxTv$1 = new Point(); + var OrientedBoundingRect = (function () { + function OrientedBoundingRect(rect, transform) { + this._corners = []; + this._axes = []; + this._origin = [0, 0]; + for (var i = 0; i < 4; i++) { + this._corners[i] = new Point(); + } + for (var i = 0; i < 2; i++) { + this._axes[i] = new Point(); + } + if (rect) { + this.fromBoundingRect(rect, transform); + } + } + OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { + var corners = this._corners; + var axes = this._axes; + var x = rect.x; + var y = rect.y; + var x2 = x + rect.width; + var y2 = y + rect.height; + corners[0].set(x, y); + corners[1].set(x2, y); + corners[2].set(x2, y2); + corners[3].set(x, y2); + if (transform) { + for (var i = 0; i < 4; i++) { + corners[i].transform(transform); + } + } + Point.sub(axes[0], corners[1], corners[0]); + Point.sub(axes[1], corners[3], corners[0]); + axes[0].normalize(); + axes[1].normalize(); + for (var i = 0; i < 2; i++) { + this._origin[i] = axes[i].dot(corners[0]); + } + }; + OrientedBoundingRect.prototype.intersect = function (other, mtv) { + var overlapped = true; + var noMtv = !mtv; + minTv$1.set(Infinity, Infinity); + maxTv$1.set(0, 0); + if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!noMtv) { + Point.copy(mtv, overlapped ? minTv$1 : maxTv$1); + } + return overlapped; + }; + OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { + var overlapped = true; + for (var i = 0; i < 2; i++) { + var axis = this._axes[i]; + this._getProjMinMaxOnAxis(i, self._corners, extent); + this._getProjMinMaxOnAxis(i, other._corners, extent2); + if (extent[1] < extent2[0] || extent[0] > extent2[1]) { + overlapped = false; + if (noMtv) { + return overlapped; + } + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) > maxTv.len()) { + if (dist0 < dist1) { + Point.scale(maxTv, axis, -dist0 * inverse); + } + else { + Point.scale(maxTv, axis, dist1 * inverse); + } + } + } + else if (minTv) { + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) < minTv.len()) { + if (dist0 < dist1) { + Point.scale(minTv, axis, dist0 * inverse); + } + else { + Point.scale(minTv, axis, -dist1 * inverse); + } + } + } + } + return overlapped; + }; + OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { + var axis = this._axes[dim]; + var origin = this._origin; + var proj = corners[0].dot(axis) + origin[dim]; + var min = proj; + var max = proj; + for (var i = 1; i < corners.length; i++) { + var proj_1 = corners[i].dot(axis) + origin[dim]; + min = Math.min(proj_1, min); + max = Math.max(proj_1, max); + } + out[0] = min; + out[1] = max; + }; + return OrientedBoundingRect; + }()); + + var m = []; + var IncrementalDisplayable = (function (_super) { + __extends(IncrementalDisplayable, _super); + function IncrementalDisplayable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.notClear = true; + _this.incremental = true; + _this._displayables = []; + _this._temporaryDisplayables = []; + _this._cursor = 0; + return _this; + } + IncrementalDisplayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + IncrementalDisplayable.prototype.useStyle = function () { + this.style = {}; + }; + IncrementalDisplayable.prototype.getCursor = function () { + return this._cursor; + }; + IncrementalDisplayable.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length; + }; + IncrementalDisplayable.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.markRedraw(); + this.notClear = false; + }; + IncrementalDisplayable.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = []; + }; + IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } + else { + this._displayables.push(displayable); + } + this.markRedraw(); + }; + IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } + }; + IncrementalDisplayable.prototype.getDisplayables = function () { + return this._displayables; + }; + IncrementalDisplayable.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables; + }; + IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } + }; + IncrementalDisplayable.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + }; + IncrementalDisplayable.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; + }; + IncrementalDisplayable.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; + }; + return IncrementalDisplayable; + }(Displayable)); + + var transitionStore = makeInner(); + /** + * Return null if animation is disabled. + */ + + function getAnimationConfig(animationType, animatableModel, dataIndex, // Extra opts can override the option in animatable model. + extraOpts, // TODO It's only for pictorial bar now. + extraDelayParams) { + var animationPayload; // Check if there is global animation configuration from dataZoom/resize can override the config in option. + // If animation is enabled. Will use this animation config in payload. + // If animation is disabled. Just ignore it. + + if (animatableModel && animatableModel.ecModel) { + var updatePayload = animatableModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + var isUpdate = animationType === 'update'; + + if (animationEnabled) { + var duration = void 0; + var easing = void 0; + var delay = void 0; + + if (extraOpts) { + duration = retrieve2(extraOpts.duration, 200); + easing = retrieve2(extraOpts.easing, 'cubicOut'); + delay = 0; + } else { + duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); + easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); + delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); + } // animation from payload has highest priority. + + + if (animationPayload) { + animationPayload.duration != null && (duration = animationPayload.duration); + animationPayload.easing != null && (easing = animationPayload.easing); + animationPayload.delay != null && (delay = animationPayload.delay); + } + + if (isFunction(delay)) { + delay = delay(dataIndex, extraDelayParams); + } + + if (isFunction(duration)) { + duration = duration(dataIndex); + } + + var config = { + duration: duration || 0, + delay: delay, + easing: easing + }; + return config; + } else { + return null; + } + } + + function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { + var isFrom = false; + var removeOpt; + + if (isFunction(dataIndex)) { + during = cb; + cb = dataIndex; + dataIndex = null; + } else if (isObject(dataIndex)) { + cb = dataIndex.cb; + during = dataIndex.during; + isFrom = dataIndex.isFrom; + removeOpt = dataIndex.removeOpt; + dataIndex = dataIndex.dataIndex; + } + + var isRemove = animationType === 'leave'; + + if (!isRemove) { + // Must stop the remove animation. + el.stopAnimation('leave'); + } + + var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); + + if (animationConfig && animationConfig.duration > 0) { + var duration = animationConfig.duration; + var animationDelay = animationConfig.delay; + var animationEasing = animationConfig.easing; + var animateConfig = { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + // Set to final state in update/init animation. + // So the post processing based on the path shape can be done correctly. + setToFinal: !isRemove, + scope: animationType, + during: during + }; + isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); + } else { + el.stopAnimation(); // If `isFrom`, the props is the "from" props. + + !isFrom && el.attr(props); // Call during at least once. + + during && during(1); + cb && cb(); + } + } + /** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ + + + function updateProps(el, props, // TODO: TYPE AnimatableModel + animatableModel, dataIndex, cb, during) { + animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); + } + /** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + */ + + function initProps(el, props, animatableModel, dataIndex, cb, during) { + animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during); + } + /** + * If element is removed. + * It can determine if element is having remove animation. + */ + + function isElementRemoved(el) { + if (!el.__zr) { + return true; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.scope === 'leave') { + return true; + } + } + + return false; + } + /** + * Remove graphic element + */ + + function removeElement(el, props, animatableModel, dataIndex, cb, during) { + // Don't do remove animation twice. + if (isElementRemoved(el)) { + return; + } + + animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during); + } + + function fadeOutDisplayable(el, animatableModel, dataIndex, done) { + el.removeTextContent(); + el.removeTextGuideLine(); + removeElement(el, { + style: { + opacity: 0 + } + }, animatableModel, dataIndex, done); + } + + function removeElementWithFadeOut(el, animatableModel, dataIndex) { + function doRemove() { + el.parent && el.parent.remove(el); + } // Hide label and labelLine first + // TODO Also use fade out animation? + + + if (!el.isGroup) { + fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); + } else { + el.traverse(function (disp) { + if (!disp.isGroup) { + // Can invoke doRemove multiple times. + fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); + } + }); + } + } + /** + * Save old style for style transition in universalTransition module. + * It's used when element will be reused in each render. + * For chart like map, heatmap, which will always create new element. + * We don't need to save this because universalTransition can get old style from the old element + */ + + function saveOldStyle(el) { + transitionStore(el).oldStyle = el.style; + } + function getOldStyle(el) { + return transitionStore(el).oldStyle; + } + + var mathMax$4 = Math.max; + var mathMin$4 = Math.min; + var _customShapeMap = {}; + /** + * Extend shape with parameters + */ + + function extendShape(opts) { + return Path.extend(opts); + } + var extendPathFromString = extendFromString; + /** + * Extend path + */ + + function extendPath(pathData, opts) { + return extendPathFromString(pathData, opts); + } + /** + * Register a user defined shape. + * The shape class can be fetched by `getShapeClass` + * This method will overwrite the registered shapes, including + * the registered built-in shapes, if using the same `name`. + * The shape can be used in `custom series` and + * `graphic component` by declaring `{type: name}`. + * + * @param name + * @param ShapeClass Can be generated by `extendShape`. + */ + + function registerShape(name, ShapeClass) { + _customShapeMap[name] = ShapeClass; + } + /** + * Find shape class registered by `registerShape`. Usually used in + * fetching user defined shape. + * + * [Caution]: + * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared + * to use user registered shapes. + * Because the built-in shape (see `getBuiltInShape`) will be registered by + * `registerShape` by default. That enables users to get both built-in + * shapes as well as the shapes belonging to themsleves. But users can overwrite + * the built-in shapes by using names like 'circle', 'rect' via calling + * `registerShape`. So the echarts inner featrues should not fetch shapes from here + * in case that it is overwritten by users, except that some features, like + * `custom series`, `graphic component`, do it deliberately. + * + * (2) In the features like `custom series`, `graphic component`, the user input + * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic + * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names + * are reserved names, that is, if some user registers a shape named `'image'`, + * the shape will not be used. If we intending to add some more reserved names + * in feature, that might bring break changes (disable some existing user shape + * names). But that case probably rarely happens. So we don't make more mechanism + * to resolve this issue here. + * + * @param name + * @return The shape class. If not found, return nothing. + */ + + function getShapeClass(name) { + if (_customShapeMap.hasOwnProperty(name)) { + return _customShapeMap[name]; + } + } + /** + * Create a path element from path data string + * @param pathData + * @param opts + * @param rect + * @param layout 'center' or 'cover' default to be cover + */ + + function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, path.getBoundingRect()); + } + + resizePath(path, rect); + } + + return path; + } + /** + * Create a image element from image url + * @param imageUrl image url + * @param opts options + * @param rect constrain rect + * @param layout 'center' or 'cover'. Default to be 'cover' + */ + + function makeImage(imageUrl, rect, layout) { + var zrImg = new ZRImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + zrImg.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return zrImg; + } + /** + * Get position of centered element in bounding box. + * + * @param rect element local bounding box + * @param boundingRect constraint bounding box + * @return element position containing x, y, width, and height + */ + + function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + var width = rect.height * aspect; + var height; + + if (width <= rect.width) { + height = rect.height; + } else { + width = rect.width; + height = width / aspect; + } + + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; + } + + var mergePath$1 = mergePath; + /** + * Resize a path to fit the rect + * @param path + * @param rect + */ + + function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + var m = pathRect.calculateTransform(rect); + path.applyTransform(m); + } + /** + * Sub pixel optimize line for canvas + */ + + function subPixelOptimizeLine$1(shape, lineWidth) { + subPixelOptimizeLine(shape, shape, { + lineWidth: lineWidth + }); + return shape; + } + /** + * Sub pixel optimize rect for canvas + */ + + function subPixelOptimizeRect$1(param) { + subPixelOptimizeRect(param.shape, param.shape, param.style); + return param; + } + /** + * Sub pixel optimize for canvas + * + * @param position Coordinate, such as x, y + * @param lineWidth Should be nonnegative integer. + * @param positiveOrNegative Default false (negative). + * @return Optimized position. + */ + + var subPixelOptimize$1 = subPixelOptimize; + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param target + * @param [ancestor] + */ + + function getTransform(target, ancestor) { + var mat = identity([]); + + while (target && target !== ancestor) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + } + /** + * Apply transform to an vertex. + * @param target [x, y] + * @param transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param invert Whether use invert matrix. + * @return [x, y] + */ + + function applyTransform$1(target, transform, invert$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + + if (invert$1) { + transform = invert([], transform); + } + + return applyTransform([], target, transform); + } + /** + * @param direction 'left' 'right' 'top' 'bottom' + * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param invert Whether use invert matrix. + * @return Transformed direction. 'left' 'right' 'top' 'bottom' + */ + + function transformDirection(direction, transform, invert) { + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]); + var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0]; + vertex = applyTransform$1(vertex, transform, invert); + return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top'; + } + + function isNotGroup(el) { + return !el.isGroup; + } + + function isPath(el) { + return el.shape != null; + } + /** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ + + + function groupTransition(g1, g2, animatableModel) { + if (!g1 || !g2) { + return; + } + + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + + function getAnimatableProps(el) { + var obj = { + x: el.x, + y: el.y, + rotation: el.rotation + }; + + if (isPath(el)) { + obj.shape = extend({}, el.shape); + } + + return obj; + } + + var elMap1 = getElMap(g1); + g2.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + var oldEl = elMap1[el.anid]; + + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps(el, newProp, animatableModel, getECData(el).dataIndex); + } + } + }); + } + function clipPointsByRect(points, rect) { + // FIXME: This way might be incorrect when graphic clipped by a corner + // and when element has a border. + return map(points, function (point) { + var x = point[0]; + x = mathMax$4(x, rect.x); + x = mathMin$4(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$4(y, rect.y); + y = mathMin$4(y, rect.y + rect.height); + return [x, y]; + }); + } + /** + * Return a new clipped rect. If rect size are negative, return undefined. + */ + + function clipRectByRect(targetRect, rect) { + var x = mathMax$4(targetRect.x, rect.x); + var x2 = mathMin$4(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$4(targetRect.y, rect.y); + var y2 = mathMin$4(targetRect.y + targetRect.height, rect.y + rect.height); // If the total rect is cliped, nothing, including the border, + // should be painted. So return undefined. + + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } + } + function createIcon(iconStr, // Support 'image://' or 'path://' or direct svg path. + opt, rect) { + var innerOpts = extend({ + rectHover: true + }, opt); + var style = innerOpts.style = { + strokeNoScale: true + }; + rect = rect || { + x: -1, + y: -1, + width: 2, + height: 2 + }; + + if (iconStr) { + return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center'); + } + } + /** + * Return `true` if the given line (line `a`) and the given polygon + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function linePolygonIntersect(a1x, a1y, a2x, a2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + + if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + + p2 = p; + } + } + /** + * Return `true` if the given two lines (line `a` and line `b`) + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`. + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; // `vec_m` and `vec_n` are parallel iff + // existing `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + + var nmCrossProduct = crossProduct2d(nx, ny, mx, my); + + if (nearZero(nmCrossProduct)) { + return false; + } // `vec_m` and `vec_n` are intersect iff + // existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`, + // such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)` + // and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`. + + + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; + + if (q < 0 || q > 1) { + return false; + } + + var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + + if (p < 0 || p > 1) { + return false; + } + + return true; + } + /** + * Cross product of 2-dimension vector. + */ + + function crossProduct2d(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + + function nearZero(val) { + return val <= 1e-6 && val >= -1e-6; + } + + function setTooltipConfig(opt) { + var itemTooltipOption = opt.itemTooltipOption; + var componentModel = opt.componentModel; + var itemName = opt.itemName; + var itemTooltipOptionObj = isString(itemTooltipOption) ? { + formatter: itemTooltipOption + } : itemTooltipOption; + var mainType = componentModel.mainType; + var componentIndex = componentModel.componentIndex; + var formatterParams = { + componentType: mainType, + name: itemName, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = componentIndex; + var formatterParamsExtra = opt.formatterParamsExtra; + + if (formatterParamsExtra) { + each(keys(formatterParamsExtra), function (key) { + if (!hasOwn(formatterParams, key)) { + formatterParams[key] = formatterParamsExtra[key]; + formatterParams.$vars.push(key); + } + }); + } + + var ecData = getECData(opt.el); + ecData.componentMainType = mainType; + ecData.componentIndex = componentIndex; + ecData.tooltipConfig = { + name: itemName, + option: defaults({ + content: itemName, + formatterParams: formatterParams + }, itemTooltipOptionObj) + }; + } + + function traverseElement(el, cb) { + var stopped; // TODO + // Polyfill for fixing zrender group traverse don't visit it's root issue. + + if (el.isGroup) { + stopped = cb(el); + } + + if (!stopped) { + el.traverse(cb); + } + } + + function traverseElements(els, cb) { + if (els) { + if (isArray(els)) { + for (var i = 0; i < els.length; i++) { + traverseElement(els[i], cb); + } + } else { + traverseElement(els, cb); + } + } + } // Register built-in shapes. These shapes might be overwritten + // by users, although we do not recommend that. + + registerShape('circle', Circle); + registerShape('ellipse', Ellipse); + registerShape('sector', Sector); + registerShape('ring', Ring); + registerShape('polygon', Polygon); + registerShape('polyline', Polyline); + registerShape('rect', Rect); + registerShape('line', Line); + registerShape('bezierCurve', BezierCurve); + registerShape('arc', Arc); + + var graphic = /*#__PURE__*/Object.freeze({ + __proto__: null, + updateProps: updateProps, + initProps: initProps, + removeElement: removeElement, + removeElementWithFadeOut: removeElementWithFadeOut, + isElementRemoved: isElementRemoved, + extendShape: extendShape, + extendPath: extendPath, + registerShape: registerShape, + getShapeClass: getShapeClass, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + subPixelOptimizeLine: subPixelOptimizeLine$1, + subPixelOptimizeRect: subPixelOptimizeRect$1, + subPixelOptimize: subPixelOptimize$1, + getTransform: getTransform, + applyTransform: applyTransform$1, + transformDirection: transformDirection, + groupTransition: groupTransition, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + createIcon: createIcon, + linePolygonIntersect: linePolygonIntersect, + lineLineIntersect: lineLineIntersect, + setTooltipConfig: setTooltipConfig, + traverseElements: traverseElements, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect, + OrientedBoundingRect: OrientedBoundingRect, + Point: Point, + Path: Path + }); + + var EMPTY_OBJ = {}; + function setLabelText(label, labelTexts) { + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var text = labelTexts[stateName]; + var state = label.ensureState(stateName); + state.style = state.style || {}; + state.style.text = text; + } + + var oldStates = label.currentStates.slice(); + label.clearStates(true); + label.setStyle({ + text: labelTexts.normal + }); + label.useStates(oldStates, true); + } + + function getLabelText(opt, stateModels, interpolatedValue) { + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + var normalModel = stateModels.normal; + var baseText; + + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? { + interpolatedValue: interpolatedValue + } : null); + } + + if (baseText == null) { + baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; + } + + var statesText = { + normal: baseText + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = stateModels[stateName]; + statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText); + } + + return statesText; + } + + function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified // TODO specified position? + ) { + opt = opt || EMPTY_OBJ; + var isSetOnText = targetEl instanceof ZRText; + var needsCreateText = false; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateModel = labelStatesModels[DISPLAY_STATES[i]]; + + if (stateModel && stateModel.getShallow('show')) { + needsCreateText = true; + break; + } + } + + var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); + + if (needsCreateText) { + if (!isSetOnText) { + // Reuse the previous + if (!textContent) { + textContent = new ZRText(); + targetEl.setTextContent(textContent); + } // Use same state proxy + + + if (targetEl.stateProxy) { + textContent.stateProxy = targetEl.stateProxy; + } + } + + var labelStatesTexts = getLabelText(opt, labelStatesModels); + var normalModel = labelStatesModels.normal; + var showNormal = !!normalModel.getShallow('show'); + var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); + normalStyle.text = labelStatesTexts.normal; + + if (!isSetOnText) { + // Always create new + targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = labelStatesModels[stateName]; + + if (stateModel) { + var stateObj = textContent.ensureState(stateName); + var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal); + + if (stateShow !== showNormal) { + stateObj.ignore = !stateShow; + } + + stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); + stateObj.style.text = labelStatesTexts[stateName]; + + if (!isSetOnText) { + var targetElEmphasisState = targetEl.ensureState(stateName); + targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); + } + } + } // PENDING: if there is many requirements that emphasis position + // need to be different from normal position, we might consider + // auto silent is those cases. + + + textContent.silent = !!normalModel.getShallow('silent'); // Keep x and y + + if (textContent.style.x != null) { + normalStyle.x = textContent.style.x; + } + + if (textContent.style.y != null) { + normalStyle.y = textContent.style.y; + } + + textContent.ignore = !showNormal; // Always create new style. + + textContent.useStyle(normalStyle); + textContent.dirty(); + + if (opt.enableTextSetter) { + labelInner(textContent).setLabelText = function (interpolatedValue) { + var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue); + setLabelText(textContent, labelStatesTexts); + }; + } + } else if (textContent) { + // Not display rich text. + textContent.ignore = true; + } + + targetEl.dirty(); + } + function getLabelStatesModels(itemModel, labelName) { + labelName = labelName || 'label'; + var statesModels = { + normal: itemModel.getModel(labelName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelName]); + } + + return statesModels; + } + /** + * Set basic textStyle properties. + */ + + function createTextStyle(textStyleModel, specifiedTextStyle, // Fixed style in the code. Can't be set by model. + opt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender. + ) { + var textStyle = {}; + setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); + + return textStyle; + } + function createTextConfig(textStyleModel, opt, isNotNormal) { + opt = opt || {}; + var textConfig = {}; + var labelPosition; + var labelRotate = textStyleModel.getShallow('rotate'); + var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5); + var labelOffset = textStyleModel.getShallow('offset'); + labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used + // in bar series, and magric type should be considered. + + labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top'); + + if (labelPosition != null) { + textConfig.position = labelPosition; + } + + if (labelOffset != null) { + textConfig.offset = labelOffset; + } + + if (labelRotate != null) { + labelRotate *= Math.PI / 180; + textConfig.rotation = labelRotate; + } + + if (labelDistance != null) { + textConfig.distance = labelDistance; + } // fill and auto is determined by the color of path fill if it's not specified by developers. + + + textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto'; + return textConfig; + } + /** + * The uniform entry of set text style, that is, retrieve style definitions + * from `model` and set to `textStyle` object. + * + * Never in merge mode, but in overwrite mode, that is, all of the text style + * properties will be set. (Consider the states of normal and emphasis and + * default value can be adopted, merge would make the logic too complicated + * to manage.) + */ + + function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { + // Consider there will be abnormal when merge hover style to normal style if given default value. + opt = opt || EMPTY_OBJ; + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + + if (richItemNames) { + richResult = {}; + + for (var name_1 in richItemNames) { + if (richItemNames.hasOwnProperty(name_1)) { + // Cascade is supported in rich. + var richTextStyle = textStyleModel.getModel(['rich', name_1]); // In rich, never `disableBox`. + // FIXME: consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`, + // the default color `'blue'` will not be adopted if no color declared in `rich`. + // That might confuses users. So probably we should put `textStyleModel` as the + // root ancestor of the `richTextStyle`. But that would be a break change. + + setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); + } + } + } + + if (richResult) { + textStyle.rich = richResult; + } + + var overflow = textStyleModel.get('overflow'); + + if (overflow) { + textStyle.overflow = overflow; + } + + var margin = textStyleModel.get('minMargin'); + + if (margin != null) { + textStyle.margin = margin; + } + + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); + } // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + // TODO TextStyleModel + + + function getRichItemNames(textStyleModel) { + // Use object to remove duplicated names. + var richItemNameMap; + + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + + if (rich) { + richItemNameMap = richItemNameMap || {}; + var richKeys = keys(rich); + + for (var i = 0; i < richKeys.length; i++) { + var richKey = richKeys[i]; + richItemNameMap[richKey] = 1; + } + } + + textStyleModel = textStyleModel.parentModel; + } + + return richItemNameMap; + } + + var TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY']; + var TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign']; + var TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + + function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { + // In merge mode, default value should not be given. + globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; + var inheritColor = opt && opt.inheritColor; + var fillColor = textStyleModel.getShallow('color'); + var strokeColor = textStyleModel.getShallow('textBorderColor'); + var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity); + + if (fillColor === 'inherit' || fillColor === 'auto') { + if ("development" !== 'production') { + if (fillColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + fillColor = inheritColor; + } else { + fillColor = null; + } + } + + if (strokeColor === 'inherit' || strokeColor === 'auto') { + if ("development" !== 'production') { + if (strokeColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + strokeColor = inheritColor; + } else { + strokeColor = null; + } + } + + if (!isAttached) { + // Only use default global textStyle.color if text is individual. + // Otherwise it will use the strategy of attached text color because text may be on a path. + fillColor = fillColor || globalTextStyle.color; + strokeColor = strokeColor || globalTextStyle.textBorderColor; + } + + if (fillColor != null) { + textStyle.fill = fillColor; + } + + if (strokeColor != null) { + textStyle.stroke = strokeColor; + } + + var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth); + + if (textBorderWidth != null) { + textStyle.lineWidth = textBorderWidth; + } + + var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType); + + if (textBorderType != null) { + textStyle.lineDash = textBorderType; + } + + var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset); + + if (textBorderDashOffset != null) { + textStyle.lineDashOffset = textBorderDashOffset; + } + + if (!isNotNormal && opacity == null && !inRich) { + opacity = opt && opt.defaultOpacity; + } + + if (opacity != null) { + textStyle.opacity = opacity; + } // TODO + + + if (!isNotNormal && !isAttached) { + // Set default finally. + if (textStyle.fill == null && opt.inheritColor) { + textStyle.fill = opt.inheritColor; + } + } // Do not use `getFont` here, because merge should be supported, where + // part of these properties may be changed in emphasis style, and the + // others should remain their original value got from normal style. + + + for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { + var key = TEXT_PROPS_WITH_GLOBAL[i]; + var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); + + if (val != null) { + textStyle[key] = val; + } + } + + for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { + var key = TEXT_PROPS_SELF[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + if (textStyle.verticalAlign == null) { + var baseline = textStyleModel.getShallow('baseline'); + + if (baseline != null) { + textStyle.verticalAlign = baseline; + } + } + + if (!isBlock || !opt.disableBox) { + for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { + var key = TEXT_PROPS_BOX[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + var borderType = textStyleModel.getShallow('borderType'); + + if (borderType != null) { + textStyle.borderDash = borderType; + } + + if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.backgroundColor === 'auto') { + deprecateReplaceLog('backgroundColor: \'auto\'', 'backgroundColor: \'inherit\''); + } + } + + textStyle.backgroundColor = inheritColor; + } + + if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.borderColor === 'auto') { + deprecateReplaceLog('borderColor: \'auto\'', 'borderColor: \'inherit\''); + } + } + + textStyle.borderColor = inheritColor; + } + } + } + + function getFont(opt, ecModel) { + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return trim([// FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' ')); + } + var labelInner = makeInner(); + function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) { + if (!label) { + return; + } + + var obj = labelInner(label); + obj.prevValue = obj.value; + obj.value = value; + var normalLabelModel = labelStatesModels.normal; + obj.valueAnimation = normalLabelModel.get('valueAnimation'); + + if (obj.valueAnimation) { + obj.precision = normalLabelModel.get('precision'); + obj.defaultInterpolatedText = getDefaultText; + obj.statesModels = labelStatesModels; + } + } + function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) { + var labelInnerStore = labelInner(textEl); + + if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) { + // Value not changed, no new label animation + return; + } + + var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText; // Consider the case that being animating, do not use the `obj.value`, + // Otherwise it will jump to the `obj.value` when this new animation started. + + var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue); + var targetValue = labelInnerStore.value; + + function during(percent) { + var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent); + labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated; + var labelText = getLabelText({ + labelDataIndex: dataIndex, + labelFetcher: labelFetcher, + defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + '' + }, labelInnerStore.statesModels, interpolated); + setLabelText(textEl, labelText); + } + + textEl.percent = 0; + (labelInnerStore.prevValue == null ? initProps : updateProps)(textEl, { + // percent is used to prevent animation from being aborted #15916 + percent: 1 + }, animatableModel, dataIndex, null, during); + } + + var PATH_COLOR = ['textStyle', 'color']; + var textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow']; // TODO Performance improvement? + + var tmpText = new ZRText(); + + var TextStyleMixin = + /** @class */ + function () { + function TextStyleMixin() {} + /** + * Get color property or get color from option.textStyle.color + */ + // TODO Callback + + + TextStyleMixin.prototype.getTextColor = function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); + }; + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + + + TextStyleMixin.prototype.getFont = function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }; + + TextStyleMixin.prototype.getTextRect = function (text) { + var style = { + text: text, + verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline') + }; + + for (var i = 0; i < textStyleParams.length; i++) { + style[textStyleParams[i]] = this.getShallow(textStyleParams[i]); + } + + tmpText.useStyle(style); + tmpText.update(); + return tmpText.getBoundingRect(); + }; + + return TextStyleMixin; + }(); + + var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); + + var LineStyleMixin = + /** @class */ + function () { + function LineStyleMixin() {} + + LineStyleMixin.prototype.getLineStyle = function (excludes) { + return getLineStyle(this, excludes); + }; + + return LineStyleMixin; + }(); + + var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); + + var ItemStyleMixin = + /** @class */ + function () { + function ItemStyleMixin() {} + + ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) { + return getItemStyle(this, excludes, includes); + }; + + return ItemStyleMixin; + }(); + + var Model = + /** @class */ + function () { + function Model(option, parentModel, ecModel) { + this.parentModel = parentModel; + this.ecModel = ecModel; + this.option = option; // Simple optimization + // if (this.init) { + // if (arguments.length <= 4) { + // this.init(option, parentModel, ecModel, extraOpt); + // } + // else { + // this.init.apply(this, arguments); + // } + // } + } + + Model.prototype.init = function (option, parentModel, ecModel) { + var rest = []; + + for (var _i = 3; _i < arguments.length; _i++) { + rest[_i - 3] = arguments[_i]; + } + }; + /** + * Merge the input option to me. + */ + + + Model.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + }; // `path` can be 'a.b.c', so the return value type have to be `ModelOption` + // TODO: TYPE strict key check? + // get(path: string | string[], ignoreParent?: boolean): ModelOption; + + + Model.prototype.get = function (path, ignoreParent) { + if (path == null) { + return this.option; + } + + return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); + }; + + Model.prototype.getShallow = function (key, ignoreParent) { + var option = this.option; + var val = option == null ? option : option[key]; + + if (val == null && !ignoreParent) { + var parentModel = this.parentModel; + + if (parentModel) { + // FIXME:TS do not know how to make it works + val = parentModel.getShallow(key); + } + } + + return val; + }; // `path` can be 'a.b.c', so the return value type have to be `Model` + // getModel(path: string | string[], parentModel?: Model): Model; + // TODO 'a.b.c' is deprecated + + + Model.prototype.getModel = function (path, parentModel) { + var hasPath = path != null; + var pathFinal = hasPath ? this.parsePath(path) : null; + var obj = hasPath ? this._doGet(pathFinal) : this.option; + parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); + return new Model(obj, parentModel, this.ecModel); + }; + /** + * If model has option + */ + + + Model.prototype.isEmpty = function () { + return this.option == null; + }; + + Model.prototype.restoreData = function () {}; // Pending + + + Model.prototype.clone = function () { + var Ctor = this.constructor; + return new Ctor(clone(this.option)); + }; // setReadOnly(properties): void { + // clazzUtil.setReadOnly(this, properties); + // } + // If path is null/undefined, return null/undefined. + + + Model.prototype.parsePath = function (path) { + if (typeof path === 'string') { + return path.split('.'); + } + + return path; + }; // Resolve path for parent. Perhaps useful when parent use a different property. + // Default to be a identity resolver. + // Can be modified to a different resolver. + + + Model.prototype.resolveParentPath = function (path) { + return path; + }; // FIXME:TS check whether put this method here + + + Model.prototype.isAnimationEnabled = function () { + if (!env.node && this.option) { + if (this.option.animation != null) { + return !!this.option.animation; + } else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + }; + + Model.prototype._doGet = function (pathArr, parentModel) { + var obj = this.option; + + if (!pathArr) { + return obj; + } + + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } // obj could be number/string/... (like 0) + + + obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null; + + if (obj == null) { + break; + } + } + + if (obj == null && parentModel) { + obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); + } + + return obj; + }; + + return Model; + }(); + + enableClassExtend(Model); + enableClassCheck(Model); + mixin(Model, LineStyleMixin); + mixin(Model, ItemStyleMixin); + mixin(Model, AreaStyleMixin); + mixin(Model, TextStyleMixin); + + var base = Math.round(Math.random() * 10); + /** + * @public + * @param {string} type + * @return {string} + */ + + function getUID(type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [type || '', base++].join('_'); + } + /** + * Implements `SubTypeDefaulterManager` for `target`. + */ + + function enableSubTypeDefaulter(target) { + var subTypeDefaulters = {}; + + target.registerSubTypeDefaulter = function (componentType, defaulter) { + var componentTypeInfo = parseClassType(componentType); + subTypeDefaulters[componentTypeInfo.main] = defaulter; + }; + + target.determineSubType = function (componentType, option) { + var type = option.type; + + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + + if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + + return type; + }; + } + /** + * Implements `TopologicalTravelable` for `entity`. + * + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * If there is circular dependencey, Error will be thrown. + */ + + function enableTopologicalTravel(entity, dependencyGetter) { + /** + * @param targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param fullNameList By which we can build dependency graph. + * @param callback Params: componentType, dependencies. + * @param context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var noEntryList = result.noEntryList; + var targetNameSet = {}; + each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (noEntryList.length) { + var currComponentType = noEntryList.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + + each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); + } + + each(targetNameSet, function () { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Circular dependency may exists: ', targetNameSet, targetNameList, fullNameList); + } + + throw new Error(errMsg); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + + if (graph[succComponentType].entryCount === 0) { + noEntryList.push(succComponentType); + } + } // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + + + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + each(fullNameList, function (name) { + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + each(availableDeps, function (dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + + var thatItem = createDependencyGraphItem(graph, dependentName); + + if (indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + return { + graph: graph, + noEntryList: noEntryList + }; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = { + predecessor: [], + successor: [] + }; + } + + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + each(originalDeps, function (dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + } + function inheritDefaultOption(superOption, subOption) { + // See also `model/Component.ts#getDefaultOption` + return merge(merge({}, superOption, true), subOption, true); + } + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * Language: English. + */ + var langEN = { + time: { + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + legend: { + selector: { + all: 'All', + inverse: 'Inv' + } + }, + toolbox: { + brush: { + title: { + rect: 'Box Select', + polygon: 'Lasso Select', + lineX: 'Horizontally Select', + lineY: 'Vertically Select', + keep: 'Keep Selections', + clear: 'Clear Selections' + } + }, + dataView: { + title: 'Data View', + lang: ['Data View', 'Close', 'Refresh'] + }, + dataZoom: { + title: { + zoom: 'Zoom', + back: 'Zoom Reset' + } + }, + magicType: { + title: { + line: 'Switch to Line Chart', + bar: 'Switch to Bar Chart', + stack: 'Stack', + tiled: 'Tile' + } + }, + restore: { + title: 'Restore' + }, + saveAsImage: { + title: 'Save as Image', + lang: ['Right Click to Save Image'] + } + }, + series: { + typeNames: { + pie: 'Pie chart', + bar: 'Bar chart', + line: 'Line chart', + scatter: 'Scatter plot', + effectScatter: 'Ripple scatter plot', + radar: 'Radar chart', + tree: 'Tree', + treemap: 'Treemap', + boxplot: 'Boxplot', + candlestick: 'Candlestick', + k: 'K line chart', + heatmap: 'Heat map', + map: 'Map', + parallel: 'Parallel coordinate map', + lines: 'Line graph', + graph: 'Relationship graph', + sankey: 'Sankey diagram', + funnel: 'Funnel chart', + gauge: 'Gauge', + pictorialBar: 'Pictorial bar', + themeRiver: 'Theme River Map', + sunburst: 'Sunburst' + } + }, + aria: { + general: { + withTitle: 'This is a chart about "{title}"', + withoutTitle: 'This is a chart' + }, + series: { + single: { + prefix: '', + withName: ' with type {seriesType} named {seriesName}.', + withoutName: ' with type {seriesType}.' + }, + multiple: { + prefix: '. It consists of {seriesCount} series count.', + withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.', + withoutName: ' The {seriesId} series is a {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'The data is as follows: ', + partialData: 'The first {displayCnt} items are: ', + withName: 'the data for {name} is {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } + }; + + /* + * 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. + */ + + /* + * 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. + */ + var langZH = { + time: { + month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六'] + }, + legend: { + selector: { + all: '全选', + inverse: '反选' + } + }, + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } + }; + + var LOCALE_ZH = 'ZH'; + var LOCALE_EN = 'EN'; + var DEFAULT_LOCALE = LOCALE_EN; + var localeStorage = {}; + var localeModels = {}; + var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () { + var langStr = ( + /* eslint-disable-next-line */ + document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase(); + return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; + }(); + function registerLocale(locale, localeObj) { + locale = locale.toUpperCase(); + localeModels[locale] = new Model(localeObj); + localeStorage[locale] = localeObj; + } // export function getLocale(locale: string) { + // return localeStorage[locale]; + // } + + function createLocaleObject(locale) { + if (isString(locale)) { + var localeObj = localeStorage[locale.toUpperCase()] || {}; + + if (locale === LOCALE_ZH || locale === LOCALE_EN) { + return clone(localeObj); + } else { + return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } else { + return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } + function getLocaleModel(lang) { + return localeModels[lang]; + } + function getDefaultLocaleModel() { + return localeModels[DEFAULT_LOCALE]; + } // Default locale + + registerLocale(LOCALE_EN, langEN); + registerLocale(LOCALE_ZH, langZH); + + var ONE_SECOND = 1000; + var ONE_MINUTE = ONE_SECOND * 60; + var ONE_HOUR = ONE_MINUTE * 60; + var ONE_DAY = ONE_HOUR * 24; + var ONE_YEAR = ONE_DAY * 365; + var defaultLeveledFormatter = { + year: '{yyyy}', + month: '{MMM}', + day: '{d}', + hour: '{HH}:{mm}', + minute: '{HH}:{mm}', + second: '{HH}:{mm}:{ss}', + millisecond: '{HH}:{mm}:{ss} {SSS}', + none: '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}' + }; + var fullDayFormatter = '{yyyy}-{MM}-{dd}'; + var fullLeveledFormatter = { + year: '{yyyy}', + month: '{yyyy}-{MM}', + day: fullDayFormatter, + hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour, + minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute, + second: fullDayFormatter + ' ' + defaultLeveledFormatter.second, + millisecond: defaultLeveledFormatter.none + }; + var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond']; + var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond']; + function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; + } + function getPrimaryTimeUnit(timeUnit) { + switch (timeUnit) { + case 'half-year': + case 'quarter': + return 'month'; + + case 'week': + case 'half-week': + return 'day'; + + case 'half-day': + case 'quarter-day': + return 'hour'; + + default: + // year, minutes, second, milliseconds + return timeUnit; + } + } + function isPrimaryTimeUnit(timeUnit) { + return timeUnit === getPrimaryTimeUnit(timeUnit); + } + function getDefaultFormatPrecisionOfInterval(timeUnit) { + switch (timeUnit) { + case 'year': + case 'month': + return 'day'; + + case 'millisecond': + return 'millisecond'; + + default: + // Also for day, hour, minute, second + return 'second'; + } + } + function format( // Note: The result based on `isUTC` are totally different, which can not be just simply + // substituted by the result without `isUTC`. So we make the param `isUTC` mandatory. + time, template, isUTC, lang) { + var date = parseDate(time); + var y = date[fullYearGetterName(isUTC)](); + var M = date[monthGetterName(isUTC)]() + 1; + var q = Math.floor((M - 1) / 3) + 1; + var d = date[dateGetterName(isUTC)](); + var e = date['get' + (isUTC ? 'UTC' : '') + 'Day'](); + var H = date[hoursGetterName(isUTC)](); + var h = (H - 1) % 12 + 1; + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); + var timeModel = localeModel.getModel('time'); + var month = timeModel.get('month'); + var monthAbbr = timeModel.get('monthAbbr'); + var dayOfWeek = timeModel.get('dayOfWeek'); + var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr'); + return (template || '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, y % 100 + '').replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ''); + } + function leveledFormat(tick, idx, formatter, lang, isUTC) { + var template = null; + + if (isString(formatter)) { + // Single formatter for all units at all levels + template = formatter; + } else if (isFunction(formatter)) { + // Callback formatter + template = formatter(tick.value, idx, { + level: tick.level + }); + } else { + var defaults$1 = extend({}, defaultLeveledFormatter); + + if (tick.level > 0) { + for (var i = 0; i < primaryTimeUnits.length; ++i) { + defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; + } + } + + var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units + : defaults(formatter, defaults$1) : defaults$1; + var unit = getUnitFromValue(tick.value, isUTC); + + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + } else if (mergedFormatter.inherit) { + // Unit formatter is not defined and should inherit from bigger units + var targetId = timeUnits.indexOf(unit); + + for (var i = targetId - 1; i >= 0; --i) { + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + break; + } + } + + template = template || defaults$1.none; + } + + if (isArray(template)) { + var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; + levelId = Math.min(levelId, template.length - 1); + template = template[levelId]; + } + } + + return format(new Date(tick.value), template, isUTC, lang); + } + function getUnitFromValue(value, isUTC) { + var date = parseDate(value); + var M = date[monthGetterName(isUTC)]() + 1; + var d = date[dateGetterName(isUTC)](); + var h = date[hoursGetterName(isUTC)](); + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var isSecond = S === 0; + var isMinute = isSecond && s === 0; + var isHour = isMinute && m === 0; + var isDay = isHour && h === 0; + var isMonth = isDay && d === 1; + var isYear = isMonth && M === 1; + + if (isYear) { + return 'year'; + } else if (isMonth) { + return 'month'; + } else if (isDay) { + return 'day'; + } else if (isHour) { + return 'hour'; + } else if (isMinute) { + return 'minute'; + } else if (isSecond) { + return 'second'; + } else { + return 'millisecond'; + } + } + function getUnitValue(value, unit, isUTC) { + var date = isNumber(value) ? parseDate(value) : value; + unit = unit || getUnitFromValue(value, isUTC); + + switch (unit) { + case 'year': + return date[fullYearGetterName(isUTC)](); + + case 'half-year': + return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; + + case 'quarter': + return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); + + case 'month': + return date[monthGetterName(isUTC)](); + + case 'day': + return date[dateGetterName(isUTC)](); + + case 'half-day': + return date[hoursGetterName(isUTC)]() / 24; + + case 'hour': + return date[hoursGetterName(isUTC)](); + + case 'minute': + return date[minutesGetterName(isUTC)](); + + case 'second': + return date[secondsGetterName(isUTC)](); + + case 'millisecond': + return date[millisecondsGetterName(isUTC)](); + } + } + function fullYearGetterName(isUTC) { + return isUTC ? 'getUTCFullYear' : 'getFullYear'; + } + function monthGetterName(isUTC) { + return isUTC ? 'getUTCMonth' : 'getMonth'; + } + function dateGetterName(isUTC) { + return isUTC ? 'getUTCDate' : 'getDate'; + } + function hoursGetterName(isUTC) { + return isUTC ? 'getUTCHours' : 'getHours'; + } + function minutesGetterName(isUTC) { + return isUTC ? 'getUTCMinutes' : 'getMinutes'; + } + function secondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; + } + function millisecondsGetterName(isUTC) { + return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds'; + } + function fullYearSetterName(isUTC) { + return isUTC ? 'setUTCFullYear' : 'setFullYear'; + } + function monthSetterName(isUTC) { + return isUTC ? 'setUTCMonth' : 'setMonth'; + } + function dateSetterName(isUTC) { + return isUTC ? 'setUTCDate' : 'setDate'; + } + function hoursSetterName(isUTC) { + return isUTC ? 'setUTCHours' : 'setHours'; + } + function minutesSetterName(isUTC) { + return isUTC ? 'setUTCMinutes' : 'setMinutes'; + } + function secondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; + } + function millisecondsSetterName(isUTC) { + return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds'; + } + + function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) { + var textEl = new ZRText({ + style: { + text: text, + font: font, + align: align, + verticalAlign: verticalAlign, + padding: padding, + rich: rich, + overflow: truncate ? 'truncate' : null, + lineHeight: lineHeight + } + }); + return textEl.getBoundingRect(); + } + + /** + * Add a comma each three digit. + */ + + function addCommas(x) { + if (!isNumeric(x)) { + return isString(x) ? x : '-'; + } + + var parts = (x + '').split('.'); + return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : ''); + } + function toCamelCase(str, upperCaseFirst) { + str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) { + return group1.toUpperCase(); + }); + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + + return str; + } + var normalizeCssArray$1 = normalizeCssArray; + /** + * Make value user readable for tooltip and label. + * "User readable": + * Try to not print programmer-specific text like NaN, Infinity, null, undefined. + * Avoid to display an empty string, which users can not recognize there is + * a value and it might look like a bug. + */ + + function makeValueReadable(value, valueType, useUTC) { + var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'; + + function stringToUserReadable(str) { + return str && trim(str) ? str : '-'; + } + + function isNumberUserReadable(num) { + return !!(num != null && !isNaN(num) && isFinite(num)); + } + + var isTypeTime = valueType === 'time'; + var isValueDate = value instanceof Date; + + if (isTypeTime || isValueDate) { + var date = isTypeTime ? parseDate(value) : value; + + if (!isNaN(+date)) { + return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); + } else if (isValueDate) { + return '-'; + } // In other cases, continue to try to display the value in the following code. + + } + + if (valueType === 'ordinal') { + return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-'; + } // By default. + + + var numericResult = numericToNumber(value); + return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-'; + } + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + var wrapVar = function (varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + }; + /** + * Template formatter + * @param {Array.|Object} paramsList + */ + + + function formatTpl(tpl, paramsList, encode) { + if (!isArray(paramsList)) { + paramsList = [paramsList]; + } + + var seriesLen = paramsList.length; + + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars || []; + + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); + } + } + + return tpl; + } + /** + * simple Template formatter + */ + + function formatTplSimple(tpl, param, encode) { + each(param, function (value, key) { + tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value); + }); + return tpl; + } + function getTooltipMarker(inOpt, extraCssText) { + var opt = isString(inOpt) ? { + color: inOpt, + extraCssText: extraCssText + } : inOpt || {}; + var color = opt.color; + var type = opt.type; + extraCssText = opt.extraCssText; + var renderMode = opt.renderMode || 'html'; + + if (!color) { + return ''; + } + + if (renderMode === 'html') { + return type === 'subItem' ? '' : ''; + } else { + // Should better not to auto generate style name by auto-increment number here. + // Because this util is usually called in tooltip formatter, which is probably + // called repeatedly when mouse move and the auto-increment number increases fast. + // Users can make their own style name by theirselves, make it unique and readable. + var markerId = opt.markerId || 'markerX'; + return { + renderMode: renderMode, + content: '{' + markerId + '|} ', + style: type === 'subItem' ? { + width: 4, + height: 4, + borderRadius: 2, + backgroundColor: color + } : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: color + } + }; + } + } + /** + * @deprecated Use `time/format` instead. + * ISO Date format + * @param {string} tpl + * @param {number} value + * @param {boolean} [isUTC=false] Default in local time. + * see `module:echarts/scale/Time` + * and `module:echarts/util/number#parseDate`. + * @inner + */ + + function formatTime(tpl, value, isUTC) { + if ("development" !== 'production') { + deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format'); + } + + if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') { + tpl = 'MM-dd\nyyyy'; + } + + var date = parseDate(value); + var getUTC = isUTC ? 'getUTC' : 'get'; + var y = date[getUTC + 'FullYear'](); + var M = date[getUTC + 'Month']() + 1; + var d = date[getUTC + 'Date'](); + var h = date[getUTC + 'Hours'](); + var m = date[getUTC + 'Minutes'](); + var s = date[getUTC + 'Seconds'](); + var S = date[getUTC + 'Milliseconds'](); + tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3)); + return tpl; + } + /** + * Capital first + * @param {string} str + * @return {string} + */ + + function capitalFirst(str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + } + /** + * @return Never be null/undefined. + */ + + function convertToColorString(color, defaultColor) { + defaultColor = defaultColor || 'transparent'; + return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; + } + /** + * open new tab + * @param link url + * @param target blank or self + */ + + function windowOpen(link, target) { + /* global window */ + if (target === '_blank' || target === 'blank') { + var blank = window.open(); + blank.opener = null; + blank.location.href = link; + } else { + window.open(link, target); + } + } + + var each$1 = each; + /** + * @public + */ + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + /** + * @public + */ + + var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']]; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + + if (maxWidth == null) { + maxWidth = Infinity; + } + + if (maxHeight == null) { + maxHeight = Infinity; + } + + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0); + nextX = x + moveX; // Wrap when width exceeds maxWidth or meet a `newline` group + // FIXME compare before adding gap? + + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } else { + // FIXME: consider rect.y is not `0`? + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } else { + var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0); + nextY = y + moveY; // Wrap when width exceeds maxHeight or meet a `newline` group + + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + child.x = x; + child.y = y; + child.markRedraw(); + orient === 'horizontal' ? x = nextX + gap : y = nextY + gap; + }); + } + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + + var box = boxLayout; + /** + * VBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var vbox = curry(boxLayout, 'vertical'); + /** + * HBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var hbox = curry(boxLayout, 'horizontal'); + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + */ + + function getAvailableSize(positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var x = parsePercent$1(positionInfo.left, containerWidth); + var y = parsePercent$1(positionInfo.top, containerHeight); + var x2 = parsePercent$1(positionInfo.right, containerWidth); + var y2 = parsePercent$1(positionInfo.bottom, containerHeight); + (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight); + margin = normalizeCssArray$1(margin || 0); + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + } + /** + * Parse position info. + */ + + function getLayoutRect(positionInfo, containerRect, margin) { + margin = normalizeCssArray$1(margin || 0); + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var left = parsePercent$1(positionInfo.left, containerWidth); + var top = parsePercent$1(positionInfo.top, containerHeight); + var right = parsePercent$1(positionInfo.right, containerWidth); + var bottom = parsePercent$1(positionInfo.bottom, containerHeight); + var width = parsePercent$1(positionInfo.width, containerWidth); + var height = parsePercent$1(positionInfo.height, containerHeight); + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; // If width is not specified, calculate width from left and right + + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + if (aspect != null) { + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } else { + height = containerHeight * 0.8; + } + } // Calculate width or height with given aspect + + + if (isNaN(width)) { + width = aspect * height; + } + + if (isNaN(height)) { + height = width / aspect; + } + } // If left is not specified, calculate left from right and width + + + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } // Align left and top + + + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } // If something is wrong and left, top, width, height are calculated as NaN + + + left = left || 0; + top = top || 0; + + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - horizontalMargin - left - (right || 0); + } + + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + } + /** + * Position a zr element in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * Logic: + * 1. Scale (against origin point in parent coord) + * 2. Rotate (against origin point in parent coord) + * 3. Translate (with el.position by this method) + * So this method only fixes the last step 'Translate', which does not affect + * scaling and rotating. + * + * If be called repeatedly with the same input el, the same result will be gotten. + * + * Return true if the layout happened. + * + * @param el Should have `getBoundingRect` method. + * @param positionInfo + * @param positionInfo.left + * @param positionInfo.top + * @param positionInfo.right + * @param positionInfo.bottom + * @param positionInfo.width Only for opt.boundingModel: 'raw' + * @param positionInfo.height Only for opt.boundingModel: 'raw' + * @param containerRect + * @param margin + * @param opt + * @param opt.hv Only horizontal or only vertical. Default to be [1, 1] + * @param opt.boundingMode + * Specify how to calculate boundingRect when locating. + * 'all': Position the boundingRect that is transformed and uioned + * both itself and its descendants. + * This mode simplies confine the elements in the bounding + * of their container (e.g., using 'right: 0'). + * 'raw': Position the boundingRect that is not transformed and only itself. + * This mode is useful when you want a element can overflow its + * container. (Consider a rotated circle needs to be located in a corner.) + * In this mode positionInfo.width/height can only be number. + */ + + function positionElement(el, positionInfo, containerRect, margin, opt, out) { + var h = !opt || !opt.hv || opt.hv[0]; + var v = !opt || !opt.hv || opt.hv[1]; + var boundingMode = opt && opt.boundingMode || 'all'; + out = out || el; + out.x = el.x; + out.y = el.y; + + if (!h && !v) { + return false; + } + + var rect; + + if (boundingMode === 'raw') { + rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect(); + } else { + rect = el.getBoundingRect(); + + if (el.needLocalTransform()) { + var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el, + // which should not be modified. + + rect = rect.clone(); + rect.applyTransform(transform); + } + } // The real width and height can not be specified but calculated by the given el. + + + var layoutRect = getLayoutRect(defaults({ + width: rect.width, + height: rect.height + }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform + // (see zrender/core/Transformable#getLocalTransform), + // we can just only modify el.position to get final result. + + var dx = h ? layoutRect.x - rect.x : 0; + var dy = v ? layoutRect.y - rect.y : 0; + + if (boundingMode === 'raw') { + out.x = dx; + out.y = dy; + } else { + out.x += dx; + out.y += dy; + } + + if (out === el) { + el.markRedraw(); + } + + return true; + } + /** + * @param option Contains some of the properties in HV_NAMES. + * @param hvIdx 0: horizontal; 1: vertical. + */ + + function sizeCalculable(option, hvIdx) { + return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null; + } + function fetchLayoutMode(ins) { + var layoutMode = ins.layoutMode || ins.constructor.layoutMode; + return isObject(layoutMode) ? layoutMode : layoutMode ? { + type: layoutMode + } : null; + } + /** + * Consider Case: + * When default option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * let inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param targetOption + * @param newOption + * @param opt + */ + + function mergeLayoutParam(targetOption, newOption, opt) { + var ignoreSize = opt && opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + var hResult = merge(HV_NAMES[0], 0); + var vResult = merge(HV_NAMES[1], 1); + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + + function merge(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + each$1(names, function (name) { + merged[name] = targetOption[name]; + }); + each$1(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + + return merged; + } // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + + + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } else { + // Chose another param from targetOption by priority. + for (var i = 0; i < names.length; i++) { + var name_1 = names[i]; + + if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { + newParams[name_1] = targetOption[name_1]; + break; + } + } + + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each$1(names, function (name) { + target[name] = source[name]; + }); + } + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + */ + + function getLayoutParams(source) { + return copyLayoutParams({}, source); + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + + function copyLayoutParams(target, source) { + source && target && each$1(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + } + + var inner = makeInner(); + + var ComponentModel = + /** @class */ + function (_super) { + __extends(ComponentModel, _super); + + function ComponentModel(option, parentModel, ecModel) { + var _this = _super.call(this, option, parentModel, ecModel) || this; + + _this.uid = getUID('ec_cpt_model'); + return _this; + } + + ComponentModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + + ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + ComponentModel.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }; + /** + * Called immediately after `init` or `mergeOption` of this instance called. + */ + + + ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {}; + /** + * [How to declare defaultOption]: + * + * (A) If using class declaration in typescript (since echarts 5): + * ```ts + * import {ComponentOption} from '../model/option.js'; + * export interface XxxOption extends ComponentOption { + * aaa: number + * } + * export class XxxModel extends Component { + * static type = 'xxx'; + * static defaultOption: XxxOption = { + * aaa: 123 + * } + * } + * Component.registerClass(XxxModel); + * ``` + * ```ts + * import {inheritDefaultOption} from '../util/component.js'; + * import {XxxModel, XxxOption} from './XxxModel.js'; + * export interface XxxSubOption extends XxxOption { + * bbb: number + * } + * class XxxSubModel extends XxxModel { + * static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, { + * bbb: 456 + * }) + * fn() { + * let opt = this.getDefaultOption(); + * // opt is {aaa: 123, bbb: 456} + * } + * } + * ``` + * + * (B) If using class extend (previous approach in echarts 3 & 4): + * ```js + * let XxxComponent = Component.extend({ + * defaultOption: { + * xx: 123 + * } + * }) + * ``` + * ```js + * let XxxSubComponent = XxxComponent.extend({ + * defaultOption: { + * yy: 456 + * }, + * fn: function () { + * let opt = this.getDefaultOption(); + * // opt is {xx: 123, yy: 456} + * } + * }) + * ``` + */ + + + ComponentModel.prototype.getDefaultOption = function () { + var ctor = this.constructor; // If using class declaration, it is different to travel super class + // in legacy env and auto merge defaultOption. So if using class + // declaration, defaultOption should be merged manually. + + if (!isExtendedClass(ctor)) { + // When using ts class, defaultOption must be declared as static. + return ctor.defaultOption; + } // FIXME: remove this approach? + + + var fields = inner(this); + + if (!fields.defaultOption) { + var optList = []; + var clz = ctor; + + while (clz) { + var opt = clz.prototype.defaultOption; + opt && optList.push(opt); + clz = clz.superClass; + } + + var defaultOption = {}; + + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + + fields.defaultOption = defaultOption; + } + + return fields.defaultOption; + }; + /** + * Notice: always force to input param `useDefault` in case that forget to consider it. + * The same behavior as `modelUtil.parseFinder`. + * + * @param useDefault In many cases like series refer axis and axis refer grid, + * If axis index / axis id not specified, use the first target as default. + * In other cases like dataZoom refer axis, if not specified, measn no refer. + */ + + + ComponentModel.prototype.getReferringComponents = function (mainType, opt) { + var indexKey = mainType + 'Index'; + var idKey = mainType + 'Id'; + return queryReferringComponents(this.ecModel, mainType, { + index: this.get(indexKey, true), + id: this.get(idKey, true) + }, opt); + }; + + ComponentModel.prototype.getBoxLayoutParams = function () { + // Consider itself having box layout configs. + var boxLayoutModel = this; + return { + left: boxLayoutModel.get('left'), + top: boxLayoutModel.get('top'), + right: boxLayoutModel.get('right'), + bottom: boxLayoutModel.get('bottom'), + width: boxLayoutModel.get('width'), + height: boxLayoutModel.get('height') + }; + }; + /** + * Get key for zlevel. + * If developers don't configure zlevel. We will assign zlevel to series based on the key. + * For example, lines with trail effect and progressive series will in an individual zlevel. + */ + + + ComponentModel.prototype.getZLevelKey = function () { + return ''; + }; + + ComponentModel.prototype.setZLevel = function (zlevel) { + this.option.zlevel = zlevel; + }; + + ComponentModel.protoInitialize = function () { + var proto = ComponentModel.prototype; + proto.type = 'component'; + proto.id = ''; + proto.name = ''; + proto.mainType = ''; + proto.subType = ''; + proto.componentIndex = 0; + }(); + + return ComponentModel; + }(Model); + + mountExtend(ComponentModel, Model); + enableClassManagement(ComponentModel); + enableSubTypeDefaulter(ComponentModel); + enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + each(ComponentModel.getClassesByMainType(componentType), function (clz) { + deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); + }); // Ensure main type. + + deps = map(deps, function (type) { + return parseClassType(type).main; + }); // Hack dataset for convenience. + + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + + return deps; + } + + /* + * 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. + */ + + /* + * 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. + */ + var platform = ''; // Navigator not exists in node + + if (typeof navigator !== 'undefined') { + /* global navigator */ + platform = navigator.platform || ''; + } + + var decalColor = 'rgba(0, 0, 0, 0.2)'; + var globalDefault = { + darkMode: 'auto', + // backgroundColor: 'rgba(0,0,0,0)', + colorBy: 'series', + color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + aria: { + decal: { + decals: [{ + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: decalColor, + symbol: 'circle', + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: 0.8 + }, { + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [4, 3], + rotation: -Math.PI / 4 + }, { + color: decalColor, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: decalColor, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: decalColor, + symbol: 'triangle', + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: 0.75 + }] + } + }, + // If xAxis and yAxis declared, grid is created by default. + // grid: {}, + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + stateAnimation: { + duration: 300, + easing: 'cubicOut' + }, + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicInOut', + animationEasingUpdate: 'cubicInOut', + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example . + hoverLayerThreshold: 3000, + // See: module:echarts/scale/Time + useUTC: false + }; + + var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'seriesName']); + var SOURCE_FORMAT_ORIGINAL = 'original'; + var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; + var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; + var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; + var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; + var SOURCE_FORMAT_UNKNOWN = 'unknown'; + var SERIES_LAYOUT_BY_COLUMN = 'column'; + var SERIES_LAYOUT_BY_ROW = 'row'; + + var BE_ORDINAL = { + Must: 1, + Might: 2, + Not: 3 // Other cases + + }; + var innerGlobalModel = makeInner(); + /** + * MUST be called before mergeOption of all series. + */ + + function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + innerGlobalModel(ecModel).datasetMap = createHashMap(); + } + /** + * [The strategy of the arrengment of data dimensions for dataset]: + * "value way": all axes are non-category axes. So series one by one take + * several (the number is coordSysDims.length) dimensions from dataset. + * The result of data arrengment of data dimensions like: + * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y | + * "category way": at least one axis is category axis. So the the first data + * dimension is always mapped to the first category axis and shared by + * all of the series. The other data dimensions are taken by series like + * "value way" does. + * The result of data arrengment of data dimensions like: + * | ser_shared_x | ser0_y | ser1_y | ser2_y | + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel || !coordDimensions) { + return encode; + } + + var encodeItemName = []; + var encodeSeriesName = []; + var ecModel = seriesModel.ecModel; + var datasetMap = innerGlobalModel(ecModel).datasetMap; + var key = datasetModel.uid + '_' + source.seriesLayoutBy; + var baseCategoryDimIndex; + var categoryWayValueDimStart; + coordDimensions = coordDimensions.slice(); + each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) { + var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { + name: coordDimInfoLoose + }; + + if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) { + baseCategoryDimIndex = coordDimIdx; + categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); + } + + encode[coordDimInfo.name] = []; + }); + var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { + categoryWayDim: categoryWayValueDimStart, + valueWayDim: 0 + }); // TODO + // Auto detect first time axis and do arrangement. + + each(coordDimensions, function (coordDimInfo, coordDimIdx) { + var coordDimName = coordDimInfo.name; + var count = getDataDimCountOnCoordDim(coordDimInfo); // In value way. + + if (baseCategoryDimIndex == null) { + var start = datasetRecord.valueWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.valueWayDim += count; // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when multiple series share one dimension + // category axis, series name should better use + // the other dimension name. On the other hand, use + // both dimensions name. + } // In category way, the first category axis. + else if (baseCategoryDimIndex === coordDimIdx) { + pushDim(encode[coordDimName], 0, count); + pushDim(encodeItemName, 0, count); + } // In category way, the other axis. + else { + var start = datasetRecord.categoryWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.categoryWayDim += count; + } + }); + + function pushDim(dimIdxArr, idxFrom, idxCount) { + for (var i = 0; i < idxCount; i++) { + dimIdxArr.push(idxFrom + i); + } + } + + function getDataDimCountOnCoordDim(coordDimInfo) { + var dimsDef = coordDimInfo.dimsDef; + return dimsDef ? dimsDef.length : 1; + } + + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + return encode; + } + /** + * Work for data like [{name: ..., value: ...}, ...]. + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel) { + return encode; + } + + var sourceFormat = source.sourceFormat; + var dimensionsDefine = source.dimensionsDefine; + var potentialNameDimIndex; + + if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + each(dimensionsDefine, function (dim, idx) { + if ((isObject(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + + var idxResult = function () { + var idxRes0 = {}; + var idxRes1 = {}; + var guessRecords = []; // 5 is an experience value. + + for (var i = 0, len = Math.min(5, dimCount); i < len; i++) { + var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); + guessRecords.push(guessResult); + var isPureNumber = guessResult === BE_ORDINAL.Not; // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim, + // and then find a name dim with the priority: + // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself". + + if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { + idxRes0.v = i; + } + + if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { + idxRes0.n = i; + } + + if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { + return idxRes0; + } // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not), + // find the first BE_ORDINAL.Might as the value dim, + // and then find a name dim with the priority: + // "other dim" > "the value dim itself". + // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be + // treated as number. + + + if (!isPureNumber) { + if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { + idxRes1.v = i; + } + + if (idxRes1.n == null || idxRes1.n === idxRes1.v) { + idxRes1.n = i; + } + } + } + + function fulfilled(idxResult) { + return idxResult.v != null && idxResult.n != null; + } + + return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; + }(); + + if (idxResult) { + encode.value = [idxResult.v]; // `potentialNameDimIndex` has highest priority. + + var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; // By default, label uses itemName in charts. + // So we don't set encodeLabel here. + + encode.itemName = [nameDimIndex]; + encode.seriesName = [nameDimIndex]; + } + + return encode; + } + /** + * @return If return null/undefined, indicate that should not use datasetModel. + */ + + function querySeriesUpstreamDatasetModel(seriesModel) { + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = seriesModel.get('data', true); + + if (!thisData) { + return queryReferringComponents(seriesModel.ecModel, 'dataset', { + index: seriesModel.get('datasetIndex', true), + id: seriesModel.get('datasetId', true) + }, SINGLE_REFERRING).models[0]; + } + } + /** + * @return Always return an array event empty. + */ + + function queryDatasetUpstreamDatasetModels(datasetModel) { + // Only these attributes declared, we by defualt reference to `datasetIndex: 0`. + // Otherwise, no reference. + if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) { + return []; + } + + return queryReferringComponents(datasetModel.ecModel, 'dataset', { + index: datasetModel.get('fromDatasetIndex', true), + id: datasetModel.get('fromDatasetId', true) + }, SINGLE_REFERRING).models; + } + /** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + */ + + function guessOrdinal(source, dimIndex) { + return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); + } // dimIndex may be overflow source data. + // return {BE_ORDINAL} + + function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { + var result; // Experience value. + + var maxLoop = 5; + + if (isTypedArray(data)) { + return BE_ORDINAL.Not; + } // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + + + var dimName; + var dimType; + + if (dimensionsDefine) { + var dimDefItem = dimensionsDefine[dimIndex]; + + if (isObject(dimDefItem)) { + dimName = dimDefItem.name; + dimType = dimDefItem.type; + } else if (isString(dimDefItem)) { + dimName = dimDefItem; + } + } + + if (dimType != null) { + return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = dataArrayRows[dimIndex]; + + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } else { + for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { + var row = dataArrayRows[startIndex + i]; + + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var dataObjectRows = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { + var item = dataObjectRows[i]; + + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + var dataKeyedColumns = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + var sample = dataKeyedColumns[dimName]; + + if (!sample || isTypedArray(sample)) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var dataOriginal = data; + + for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { + var item = dataOriginal[i]; + var val = getDataItemValue(item); + + if (!isArray(val)) { + return BE_ORDINAL.Not; + } + + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + + function detectValue(val) { + var beStr = isString(val); // Consider usage convenience, '1', '2' will be treated as "number". + // `isFinit('')` get `true`. + + if (val != null && isFinite(val) && val !== '') { + return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; + } else if (beStr && val !== '-') { + return BE_ORDINAL.Must; + } + } + + return BE_ORDINAL.Not; + } + + var internalOptionCreatorMap = createHashMap(); + function registerInternalOptionCreator(mainType, creator) { + assert(internalOptionCreatorMap.get(mainType) == null && creator); + internalOptionCreatorMap.set(mainType, creator); + } + function concatInternalOptions(ecModel, mainType, newCmptOptionList) { + var internalOptionCreator = internalOptionCreatorMap.get(mainType); + + if (!internalOptionCreator) { + return newCmptOptionList; + } + + var internalOptions = internalOptionCreator(ecModel); + + if (!internalOptions) { + return newCmptOptionList; + } + + if ("development" !== 'production') { + for (var i = 0; i < internalOptions.length; i++) { + assert(isComponentIdInternal(internalOptions[i])); + } + } + + return newCmptOptionList.concat(internalOptions); + } + + var innerColor = makeInner(); + var innerDecal = makeInner(); + + var PaletteMixin = + /** @class */ + function () { + function PaletteMixin() {} + + PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) { + var defaultPalette = normalizeToArray(this.get('color', true)); + var layeredPalette = this.get('colorLayer', true); + return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); + }; + + PaletteMixin.prototype.clearColorPalette = function () { + clearPalette(this, innerColor); + }; + + return PaletteMixin; + }(); + + function getDecalFromPalette(ecModel, name, scope, requestNum) { + var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum); + } + + function getNearestPalette(palettes, requestColorNum) { + var paletteNum = palettes.length; // TODO palettes must be in order + + for (var i = 0; i < paletteNum; i++) { + if (palettes[i].length > requestColorNum) { + return palettes[i]; + } + } + + return palettes[paletteNum - 1]; + } + /** + * @param name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param scope default this. + * @return Can be null/undefined + */ + + + function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) { + scope = scope || that; + var scopeFields = inner(scope); + var paletteIdx = scopeFields.paletteIdx || 0; + var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; // Use `hasOwnProperty` to avoid conflict with Object.prototype. + + if (paletteNameMap.hasOwnProperty(name)) { + return paletteNameMap[name]; + } + + var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); // In case can't find in layered color palette. + + palette = palette || defaultPalette; + + if (!palette || !palette.length) { + return; + } + + var pickedPaletteItem = palette[paletteIdx]; + + if (name) { + paletteNameMap[name] = pickedPaletteItem; + } + + scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; + return pickedPaletteItem; + } + + function clearPalette(that, inner) { + inner(that).paletteIdx = 0; + inner(that).paletteNameMap = {}; + } + + // Internal method names: + // ----------------------- + + var reCreateSeriesIndices; + var assertSeriesInitialized; + var initBase; + var OPTION_INNER_KEY = '\0_ec_inner'; + var OPTION_INNER_VALUE = 1; + var BUITIN_COMPONENTS_MAP = { + grid: 'GridComponent', + polar: 'PolarComponent', + geo: 'GeoComponent', + singleAxis: 'SingleAxisComponent', + parallel: 'ParallelComponent', + calendar: 'CalendarComponent', + graphic: 'GraphicComponent', + toolbox: 'ToolboxComponent', + tooltip: 'TooltipComponent', + axisPointer: 'AxisPointerComponent', + brush: 'BrushComponent', + title: 'TitleComponent', + timeline: 'TimelineComponent', + markPoint: 'MarkPointComponent', + markLine: 'MarkLineComponent', + markArea: 'MarkAreaComponent', + legend: 'LegendComponent', + dataZoom: 'DataZoomComponent', + visualMap: 'VisualMapComponent', + // aria: 'AriaComponent', + // dataset: 'DatasetComponent', + // Dependencies + xAxis: 'GridComponent', + yAxis: 'GridComponent', + angleAxis: 'PolarComponent', + radiusAxis: 'PolarComponent' + }; + var BUILTIN_CHARTS_MAP = { + line: 'LineChart', + bar: 'BarChart', + pie: 'PieChart', + scatter: 'ScatterChart', + radar: 'RadarChart', + map: 'MapChart', + tree: 'TreeChart', + treemap: 'TreemapChart', + graph: 'GraphChart', + gauge: 'GaugeChart', + funnel: 'FunnelChart', + parallel: 'ParallelChart', + sankey: 'SankeyChart', + boxplot: 'BoxplotChart', + candlestick: 'CandlestickChart', + effectScatter: 'EffectScatterChart', + lines: 'LinesChart', + heatmap: 'HeatmapChart', + pictorialBar: 'PictorialBarChart', + themeRiver: 'ThemeRiverChart', + sunburst: 'SunburstChart', + custom: 'CustomChart' + }; + var componetsMissingLogPrinted = {}; + + function checkMissingComponents(option) { + each(option, function (componentOption, mainType) { + if (!ComponentModel.hasClass(mainType)) { + var componentImportName = BUITIN_COMPONENTS_MAP[mainType]; + + if (componentImportName && !componetsMissingLogPrinted[componentImportName]) { + error("Component " + mainType + " is used but not imported.\nimport { " + componentImportName + " } from 'echarts/components';\necharts.use([" + componentImportName + "]);"); + componetsMissingLogPrinted[componentImportName] = true; + } + } + }); + } + + var GlobalModel = + /** @class */ + function (_super) { + __extends(GlobalModel, _super); + + function GlobalModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) { + theme = theme || {}; + this.option = null; // Mark as not initialized. + + this._theme = new Model(theme); + this._locale = new Model(locale); + this._optionManager = optionManager; + }; + + GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) { + if ("development" !== 'production') { + assert(option != null, 'option is null/undefined'); + assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()'); + } + + var innerOpt = normalizeSetOptionInput(opts); + + this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt); + + this._resetOption(null, innerOpt); + }; + /** + * @param type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return Whether option changed. + */ + + + GlobalModel.prototype.resetOption = function (type, opt) { + return this._resetOption(type, normalizeSetOptionInput(opt)); + }; + + GlobalModel.prototype._resetOption = function (type, opt) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if ("development" !== 'production') { + checkMissingComponents(baseOption); + } + + if (!this.option || type === 'recreate') { + initBase(this, baseOption); + } else { + this.restoreData(); + + this._mergeOption(baseOption, opt); + } + + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`, + // it should better not have the same props with `MediaUnit['option']`. + // Because either `option2` or `MediaUnit['option']` will be always merged to "current option" + // rather than original "baseOption". If they both override a prop, the result might be + // unexpected when media state changed after `setOption` called. + // If we really need to modify a props in each `MediaUnit['option']`, use the full version + // (`{baseOption, media}`) in `setOption`. + // For `timeline`, the case is the same. + + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + + if (timelineOption) { + optionChanged = true; + + this._mergeOption(timelineOption, opt); + } + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this); + + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + optionChanged = true; + + this._mergeOption(mediaOption, opt); + }, this); + } + } + + return optionChanged; + }; + + GlobalModel.prototype.mergeOption = function (option) { + this._mergeOption(option, null); + }; + + GlobalModel.prototype._mergeOption = function (newOption, opt) { + var option = this.option; + var componentsMap = this._componentsMap; + var componentsCount = this._componentsCount; + var newCmptTypes = []; + var newCmptTypeMap = createHashMap(); + var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; + resetSourceDefaulter(this); // If no component class, merge directly. + // For example: color, animaiton options, etc. + + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + // globalSettingTask.dirty(); + option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true); + } else if (mainType) { + newCmptTypes.push(mainType); + newCmptTypeMap.set(mainType, true); + } + }); + + if (replaceMergeMainTypeMap) { + // If there is a mainType `xxx` in `replaceMerge` but not declared in option, + // we trade it as it is declared in option as `{xxx: []}`. Because: + // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`. + // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`. + replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) { + if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { + newCmptTypes.push(mainTypeInReplaceMerge); + newCmptTypeMap.set(mainTypeInReplaceMerge, true); + } + }); + } + + ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); + + function visitComponent(mainType) { + var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); + var oldCmptList = componentsMap.get(mainType); + var mergeMode = // `!oldCmptList` means init. See the comment in `mappingToExists` + !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge'; + var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); // Set mainType and complete subType. + + setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); // Empty it before the travel, in order to prevent `this._componentsMap` + // from being used in the `init`/`mergeOption`/`optionUpdated` of some + // components, which is probably incorrect logic. + + option[mainType] = null; + componentsMap.set(mainType, null); + componentsCount.set(mainType, 0); + var optionsByMainType = []; + var cmptsByMainType = []; + var cmptsCountByMainType = 0; + var tooltipExists; + var tooltipWarningLogged; + each(mappingResult, function (resultItem, index) { + var componentModel = resultItem.existing; + var newCmptOption = resultItem.newOption; + + if (!newCmptOption) { + if (componentModel) { + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } // If no both `resultItem.exist` and `resultItem.option`, + // either it is in `replaceMerge` and not matched by any id, + // or it has been removed in previous `replaceMerge` and left a "hole" in this component index. + + } else { + var isSeriesType = mainType === 'series'; + var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists + ); + + if (!ComponentModelClass) { + if ("development" !== 'production') { + var subType = resultItem.keyInfo.subType; + var seriesImportName = BUILTIN_CHARTS_MAP[subType]; + + if (!componetsMissingLogPrinted[subType]) { + componetsMissingLogPrinted[subType] = true; + + if (seriesImportName) { + error("Series " + subType + " is used but not imported.\nimport { " + seriesImportName + " } from 'echarts/charts';\necharts.use([" + seriesImportName + "]);"); + } else { + error("Unknown series " + subType); + } + } + } + + return; + } // TODO Before multiple tooltips get supported, we do this check to avoid unexpected exception. + + + if (mainType === 'tooltip') { + if (tooltipExists) { + if ("development" !== 'production') { + if (!tooltipWarningLogged) { + warn('Currently only one tooltip component is allowed.'); + tooltipWarningLogged = true; + } + } + + return; + } + + tooltipExists = true; + } + + if (componentModel && componentModel.constructor === ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; // componentModel.settingTask && componentModel.settingTask.dirty(); + + componentModel.mergeOption(newCmptOption, this); + componentModel.optionUpdated(newCmptOption, false); + } else { + // PENDING Global as parent ? + var extraOpt = extend({ + componentIndex: index + }, resultItem.keyInfo); + componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); // Assign `keyInfo` + + extend(componentModel, extraOpt); + + if (resultItem.brandNew) { + componentModel.__requireNewView = true; + } + + componentModel.init(newCmptOption, this, this); // Call optionUpdated after init. + // newCmptOption has been used as componentModel.option + // and may be merged with theme and default, so pass null + // to avoid confusion. + + componentModel.optionUpdated(null, true); + } + } + + if (componentModel) { + optionsByMainType.push(componentModel.option); + cmptsByMainType.push(componentModel); + cmptsCountByMainType++; + } else { + // Always do assign to avoid elided item in array. + optionsByMainType.push(void 0); + cmptsByMainType.push(void 0); + } + }, this); + option[mainType] = optionsByMainType; + componentsMap.set(mainType, cmptsByMainType); + componentsCount.set(mainType, cmptsCountByMainType); // Backup series for filtering. + + if (mainType === 'series') { + reCreateSeriesIndices(this); + } + } // If no series declared, ensure `_seriesIndices` initialized. + + + if (!this._seriesIndices) { + reCreateSeriesIndices(this); + } + }; + /** + * Get option for output (cloned option and inner info removed) + */ + + + GlobalModel.prototype.getOption = function () { + var option = clone(this.option); + each(option, function (optInMainType, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(optInMainType); // Inner cmpts need to be removed. + // Inner cmpts might not be at last since ec5.0, but still + // compatible for users: if inner cmpt at last, splice the returned array. + + var realLen = opts.length; + var metNonInner = false; + + for (var i = realLen - 1; i >= 0; i--) { + // Remove options with inner id. + if (opts[i] && !isComponentIdInternal(opts[i])) { + metNonInner = true; + } else { + opts[i] = null; + !metNonInner && realLen--; + } + } + + opts.length = realLen; + option[mainType] = opts; + } + }); + delete option[OPTION_INNER_KEY]; + return option; + }; + + GlobalModel.prototype.getTheme = function () { + return this._theme; + }; + + GlobalModel.prototype.getLocaleModel = function () { + return this._locale; + }; + + GlobalModel.prototype.setUpdatePayload = function (payload) { + this._payload = payload; + }; + + GlobalModel.prototype.getUpdatePayload = function () { + return this._payload; + }; + /** + * @param idx If not specified, return the first one. + */ + + + GlobalModel.prototype.getComponent = function (mainType, idx) { + var list = this._componentsMap.get(mainType); + + if (list) { + var cmpt = list[idx || 0]; + + if (cmpt) { + return cmpt; + } else if (idx == null) { + for (var i = 0; i < list.length; i++) { + if (list[i]) { + return list[i]; + } + } + } + } + }; + /** + * @return Never be null/undefined. + */ + + + GlobalModel.prototype.queryComponents = function (condition) { + var mainType = condition.mainType; + + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cmpts = this._componentsMap.get(mainType); + + if (!cmpts || !cmpts.length) { + return []; + } + + var result; + + if (index != null) { + result = []; + each(normalizeToArray(index), function (idx) { + cmpts[idx] && result.push(cmpts[idx]); + }); + } else if (id != null) { + result = queryByIdOrName('id', id, cmpts); + } else if (name != null) { + result = queryByIdOrName('name', name, cmpts); + } else { + // Return all non-empty components in that mainType + result = filter(cmpts, function (cmpt) { + return !!cmpt; + }); + } + + return filterBySubType(result, condition); + }; + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * let result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * let result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * let result = findComponents( + * {mainType: 'series', + * filter: function (model, index) {...}} + * ); + * // result like [component0, componnet1, ...] + */ + + + GlobalModel.prototype.findComponents = function (condition) { + var query = condition.query; + var mainType = condition.mainType; + var queryCond = getQueryCond(query); + var result = queryCond ? this.queryComponents(queryCond) // Retrieve all non-empty components. + : filter(this._componentsMap.get(mainType), function (cmpt) { + return !!cmpt; + }); + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } : null; + } + + function doFilter(res) { + return condition.filter ? filter(res, condition.filter) : res; + } + }; + + GlobalModel.prototype.eachComponent = function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (isFunction(mainType)) { + var ctxForAll_1 = cb; + var cbForAll_1 = mainType; + componentsMap.each(function (cmpts, componentType) { + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex); + } + }); + } else { + var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null; + + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cb.call(context, cmpt, cmpt.componentIndex); + } + } + }; + /** + * Get series list before filtered by name. + */ + + + GlobalModel.prototype.getSeriesByName = function (name) { + var nameStr = convertOptionIdName(name, null); + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && nameStr != null && oneSeries.name === nameStr; + }); + }; + /** + * Get series list before filtered by index. + */ + + + GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) { + return this._componentsMap.get('series')[seriesIndex]; + }; + /** + * Get series list before filtered by type. + * FIXME: rename to getRawSeriesByType? + */ + + + GlobalModel.prototype.getSeriesByType = function (subType) { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && oneSeries.subType === subType; + }); + }; + /** + * Get all series before filtered. + */ + + + GlobalModel.prototype.getSeries = function () { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries; + }); + }; + /** + * Count series before filtered. + */ + + + GlobalModel.prototype.getSeriesCount = function () { + return this._componentsCount.get('series'); + }; + /** + * After filtering, series may be different + * from raw series. + */ + + + GlobalModel.prototype.eachSeries = function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + cb.call(context, series, rawSeriesIndex); + }, this); + }; + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + + + GlobalModel.prototype.eachRawSeries = function (cb, context) { + each(this._componentsMap.get('series'), function (series) { + series && cb.call(context, series, series.componentIndex); + }); + }; + /** + * After filtering, series may be different. + * from raw series. + */ + + + GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }; + /** + * Iterate raw series before filtered of given type. + */ + + + GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }; + + GlobalModel.prototype.isSeriesFiltered = function (seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }; + + GlobalModel.prototype.getCurrentSeriesIndices = function () { + return (this._seriesIndices || []).slice(); + }; + + GlobalModel.prototype.filterSeries = function (cb, context) { + assertSeriesInitialized(this); + var newSeriesIndices = []; + each(this._seriesIndices, function (seriesRawIdx) { + var series = this._componentsMap.get('series')[seriesRawIdx]; + + cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); + }, this); + this._seriesIndices = newSeriesIndices; + this._seriesIndicesMap = createHashMap(newSeriesIndices); + }; + + GlobalModel.prototype.restoreData = function (payload) { + reCreateSeriesIndices(this); + var componentsMap = this._componentsMap; + var componentTypes = []; + componentsMap.each(function (components, componentType) { + if (ComponentModel.hasClass(componentType)) { + componentTypes.push(componentType); + } + }); + ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) { + each(componentsMap.get(componentType), function (component) { + if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) { + component.restoreData(); + } + }); + }); + }; + + GlobalModel.internalField = function () { + reCreateSeriesIndices = function (ecModel) { + var seriesIndices = ecModel._seriesIndices = []; + each(ecModel._componentsMap.get('series'), function (series) { + // series may have been removed by `replaceMerge`. + series && seriesIndices.push(series.componentIndex); + }); + ecModel._seriesIndicesMap = createHashMap(seriesIndices); + }; + + assertSeriesInitialized = function (ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if ("development" !== 'production') { + if (!ecModel._seriesIndices) { + throw new Error('Option should contains series.'); + } + } + }; + + initBase = function (ecModel, baseOption) { + // Using OPTION_INNER_KEY to mark that this option cannot be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbidden. + ecModel.option = {}; + ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; // Init with series: [], in case of calling findSeries method + // before series initialized. + + ecModel._componentsMap = createHashMap({ + series: [] + }); + ecModel._componentsCount = createHashMap(); // If user spefied `option.aria`, aria will be enable. This detection should be + // performed before theme and globalDefault merge. + + var airaOption = baseOption.aria; + + if (isObject(airaOption) && airaOption.enabled == null) { + airaOption.enabled = true; + } + + mergeTheme(baseOption, ecModel._theme.option); // TODO Needs clone when merging to the unexisted property + + merge(baseOption, globalDefault, false); + + ecModel._mergeOption(baseOption, null); + }; + }(); + + return GlobalModel; + }(Model); + + function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seriesIndex; + var id = payload.seriesId; + var name_1 = payload.seriesName; + return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; + } + } + + function mergeTheme(option, theme) { + // PENDING + // NOT use `colorLayer` in theme if option has `color` + var notMergeColorLayer = option.color && !option.colorLayer; + each(theme, function (themeItem, name) { + if (name === 'colorLayer' && notMergeColorLayer) { + return; + } // If it is component model mainType, the model handles that merge later. + // otherwise, merge them here. + + + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === 'object') { + option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false); + } else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); + } + + function queryByIdOrName(attr, idOrName, cmpts) { + // Here is a break from echarts4: string and number are + // treated as equal. + if (isArray(idOrName)) { + var keyMap_1 = createHashMap(); + each(idOrName, function (idOrNameItem) { + if (idOrNameItem != null) { + var idName = convertOptionIdName(idOrNameItem, null); + idName != null && keyMap_1.set(idOrNameItem, true); + } + }); + return filter(cmpts, function (cmpt) { + return cmpt && keyMap_1.get(cmpt[attr]); + }); + } else { + var idName_1 = convertOptionIdName(idOrName, null); + return filter(cmpts, function (cmpt) { + return cmpt && idName_1 != null && cmpt[attr] === idName_1; + }); + } + } + + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) { + return cmpt && cmpt.subType === condition.subType; + }) : components; + } + + function normalizeSetOptionInput(opts) { + var replaceMergeMainTypeMap = createHashMap(); + opts && each(normalizeToArray(opts.replaceMerge), function (mainType) { + if ("development" !== 'production') { + assert(ComponentModel.hasClass(mainType), '"' + mainType + '" is not valid component main type in "replaceMerge"'); + } + + replaceMergeMainTypeMap.set(mainType, true); + }); + return { + replaceMergeMainTypeMap: replaceMergeMainTypeMap + }; + } + + mixin(GlobalModel, PaletteMixin); + + var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', // 'getModel', + 'getOption', // 'getViewOfComponentModel', + // 'getViewOfSeriesModel', + 'getId', 'updateLabelLayout']; + + var ExtensionAPI = + /** @class */ + function () { + function ExtensionAPI(ecInstance) { + each(availableMethods, function (methodName) { + this[methodName] = bind(ecInstance[methodName], ecInstance); + }, this); + } + + return ExtensionAPI; + }(); + + var coordinateSystemCreators = {}; + + var CoordinateSystemManager = + /** @class */ + function () { + function CoordinateSystemManager() { + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype.create = function (ecModel, api) { + var coordinateSystems = []; + each(coordinateSystemCreators, function (creator, type) { + var list = creator.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + this._coordinateSystems = coordinateSystems; + }; + + CoordinateSystemManager.prototype.update = function (ecModel, api) { + each(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }; + + CoordinateSystemManager.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice(); + }; + + CoordinateSystemManager.register = function (type, creator) { + coordinateSystemCreators[type] = creator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + return CoordinateSystemManager; + }(); + + var QUERY_REG = /^(min|max)?(.+)$/; // Key: mainType + // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>; + + /** + * TERM EXPLANATIONS: + * See `ECOption` and `ECUnitOption` in `src/util/types.ts`. + */ + + var OptionManager = + /** @class */ + function () { + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + function OptionManager(api) { + this._timelineOptions = []; + this._mediaList = []; + /** + * -1, means default. + * empty means no media. + */ + + this._currentMediaIndices = []; + this._api = api; + } + + OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) { + if (rawOption) { + // That set dat primitive is dangerous if user reuse the data when setOption again. + each(normalizeToArray(rawOption.series), function (series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + each(normalizeToArray(rawOption.dataset), function (dataset) { + dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); + }); + } // Caution: some series modify option data, if do not clone, + // it should ensure that the repeat modify correctly + // (create a new object when modify itself). + + + rawOption = clone(rawOption); // FIXME + // If some property is set in timeline options or media option but + // not set in baseOption, a warning should be given. + + var optionBackup = this._optionBackup; + var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup); + this._newBaseOption = newParsedOption.baseOption; // For setOption at second time (using merge mode); + + if (optionBackup) { + // FIXME + // the restore merge solution is essentially incorrect. + // the mapping can not be 100% consistent with ecModel, which probably brings + // potential bug! + // The first merge is delayed, because in most cases, users do not call `setOption` twice. + // let fakeCmptsMap = this._fakeCmptsMap; + // if (!fakeCmptsMap) { + // fakeCmptsMap = this._fakeCmptsMap = createHashMap(); + // mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null); + // } + // mergeToBackupOption( + // fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt + // ); + // For simplicity, timeline options and media options do not support merge, + // that is, if you `setOption` twice and both has timeline options, the latter + // timeline options will not be merged to the former, but just substitute them. + if (newParsedOption.timelineOptions.length) { + optionBackup.timelineOptions = newParsedOption.timelineOptions; + } + + if (newParsedOption.mediaList.length) { + optionBackup.mediaList = newParsedOption.mediaList; + } + + if (newParsedOption.mediaDefault) { + optionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } else { + this._optionBackup = newParsedOption; + } + }; + + OptionManager.prototype.mountOption = function (isRecreate) { + var optionBackup = this._optionBackup; + this._timelineOptions = optionBackup.timelineOptions; + this._mediaList = optionBackup.mediaList; + this._mediaDefault = optionBackup.mediaDefault; + this._currentMediaIndices = []; + return clone(isRecreate // this._optionBackup.baseOption, which is created at the first `setOption` + // called, and is merged into every new option by inner method `mergeToBackupOption` + // each time `setOption` called, can be only used in `isRecreate`, because + // its reliability is under suspicion. In other cases option merge is + // performed by `model.mergeOption`. + ? optionBackup.baseOption : this._newBaseOption); + }; + + OptionManager.prototype.getTimelineOption = function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel) { + option = clone( // FIXME:TS as TimelineModel or quivlant interface + timelineOptions[timelineModel.getCurrentIndex()]); + } + } + + return option; + }; + + OptionManager.prototype.getMediaOption = function (ecModel) { + var ecWidth = this._api.getWidth(); + + var ecHeight = this._api.getHeight(); + + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; // No media defined. + + if (!mediaList.length && !mediaDefault) { + return result; + } // Multi media may be applied, the latter defined media has higher priority. + + + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } // FIXME + // Whether mediaDefault should force users to provide? Otherwise + // the change by media query can not be recorvered. + + + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone(index === -1 ? mediaDefault.option : mediaList[index].option); + }); + } // Otherwise return nothing. + + + this._currentMediaIndices = indices; + return result; + }; + + return OptionManager; + }(); + /** + * [RAW_OPTION_PATTERNS] + * (Note: "series: []" represents all other props in `ECUnitOption`) + * + * (1) No prop "baseOption" declared: + * Root option is used as "baseOption" (except prop "options" and "media"). + * ```js + * option = { + * series: [], + * timeline: {}, + * options: [], + * }; + * option = { + * series: [], + * media: {}, + * }; + * option = { + * series: [], + * timeline: {}, + * options: [], + * media: {}, + * } + * ``` + * + * (2) Prop "baseOption" declared: + * If "baseOption" declared, `ECUnitOption` props can only be declared + * inside "baseOption" except prop "timeline" (compat ec2). + * ```js + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * }; + * option = { + * baseOption: { + * series: [], + * }, + * media: [] + * }; + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * media: [] + * }; + * option = { + * // ec3 compat ec2: allow (only) `timeline` declared + * // outside baseOption. Keep this setting for compat. + * timeline: {}, + * baseOption: { + * series: [], + * }, + * options: [], + * media: [] + * }; + * ``` + */ + + + function parseRawOption( // `rawOption` May be modified + rawOption, optionPreprocessorFuncs, isNew) { + var mediaList = []; + var mediaDefault; + var baseOption; + var declaredBaseOption = rawOption.baseOption; // Compatible with ec2, [RAW_OPTION_PATTERNS] above. + + var timelineOnRoot = rawOption.timeline; + var timelineOptionsOnRoot = rawOption.options; + var mediaOnRoot = rawOption.media; + var hasMedia = !!rawOption.media; + var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); + + if (declaredBaseOption) { + baseOption = declaredBaseOption; // For merge option. + + if (!baseOption.timeline) { + baseOption.timeline = timelineOnRoot; + } + } // For convenience, enable to use the root option as the `baseOption`: + // `{ ...normalOptionProps, media: [{ ... }, { ... }] }` + else { + if (hasTimeline || hasMedia) { + rawOption.options = rawOption.media = null; + } + + baseOption = rawOption; + } + + if (hasMedia) { + if (isArray(mediaOnRoot)) { + each(mediaOnRoot, function (singleMedia) { + if ("development" !== 'production') { + // Real case of wrong config. + if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) { + error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }'); + } + } + + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } else { + if ("development" !== 'production') { + // Real case of wrong config. + error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }'); + } + } + } + + doPreprocess(baseOption); + each(timelineOptionsOnRoot, function (option) { + return doPreprocess(option); + }); + each(mediaList, function (media) { + return doPreprocess(media.option); + }); + + function doPreprocess(option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option, isNew); + }); + } + + return { + baseOption: baseOption, + timelineOptions: timelineOptionsOnRoot || [], + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + /** + * @see + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + + + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lower case for convenience. + + }; + var applicable = true; + each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicable = false; + } + }); + return applicable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } else if (operator === 'max') { + return real <= expect; + } else { + // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + var each$2 = each; + var isObject$1 = isObject; + var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine']; + + function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + + if (!itemStyleOpt) { + return; + } + + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.normal." + styleName, styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + + normalItemStyleOpt[styleName] = null; + } + + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.emphasis." + styleName, "emphasis." + styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + + emphasisItemStyleOpt[styleName] = null; + } + } + } + + function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + + if (normalOpt) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("'normal' hierarchy in " + optType + " has been removed since 4.0. All style properties are configured in " + optType + " directly now."); + } // Timeline controlStyle has other properties besides normal and emphasis + + + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } else { + opt[optType] = normalOpt; + } + } + + if (emphasisOpt) { + if ("development" !== 'production') { + deprecateLog(optType + ".emphasis has been changed to emphasis." + optType + " since 4.0"); + } + + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; // Also compat the case user mix the style and focus together in ec3 style + // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } } + + if (emphasisOpt.focus) { + opt.emphasis.focus = emphasisOpt.focus; + } + + if (emphasisOpt.blurScope) { + opt.emphasis.blurScope = emphasisOpt.blurScope; + } + } + } + } + + function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, 'itemStyle'); + convertNormalEmphasis(opt, 'lineStyle'); + convertNormalEmphasis(opt, 'areaStyle'); + convertNormalEmphasis(opt, 'label'); + convertNormalEmphasis(opt, 'labelLine'); // treemap + + convertNormalEmphasis(opt, 'upperLabel'); // graph + + convertNormalEmphasis(opt, 'edgeLabel'); + } + + function compatTextStyle(opt, propName) { + // Check whether is not object (string\null\undefined ...) + var labelOptSingle = isObject$1(opt) && opt[propName]; + var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle; + + if (textStyle) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("textStyle hierarchy in " + propName + " has been removed since 4.0. All textStyle properties are configured in " + propName + " directly now."); + } + + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var textPropName = TEXT_STYLE_OPTIONS[i]; + + if (textStyle.hasOwnProperty(textPropName)) { + labelOptSingle[textPropName] = textStyle[textPropName]; + } + } + } + } + + function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, 'label'); + opt.emphasis && compatTextStyle(opt.emphasis, 'label'); + } + } + + function processSeries(seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + compatTextStyle(seriesOpt, 'label'); // treemap + + compatTextStyle(seriesOpt, 'upperLabel'); // graph + + compatTextStyle(seriesOpt, 'edgeLabel'); + + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, 'label'); // treemap + + compatTextStyle(seriesOpt.emphasis, 'upperLabel'); // graph + + compatTextStyle(seriesOpt.emphasis, 'edgeLabel'); + } + + var markPoint = seriesOpt.markPoint; + + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + + var markLine = seriesOpt.markLine; + + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + + var markArea = seriesOpt.markArea; + + if (markArea) { + compatEC3CommonStyles(markArea); + } + + var data = seriesOpt.data; // Break with ec3: if `setOption` again, there may be no `type` in option, + // then the backward compat based on option type will not be performed. + + if (seriesOpt.type === 'graph') { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + + each(seriesOpt.categories, function (opt) { + removeEC3NormalStatus(opt); + }); + } + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } // mark point data + + + markPoint = seriesOpt.markPoint; + + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } // mark line data + + + markLine = seriesOpt.markLine; + + if (markLine && markLine.data) { + var mlData = markLine.data; + + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } else { + compatEC3CommonStyles(mlData[i]); + } + } + } // Series + + + if (seriesOpt.type === 'gauge') { + compatTextStyle(seriesOpt, 'axisLabel'); + compatTextStyle(seriesOpt, 'title'); + compatTextStyle(seriesOpt, 'detail'); + } else if (seriesOpt.type === 'treemap') { + convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle'); + each(seriesOpt.levels, function (opt) { + removeEC3NormalStatus(opt); + }); + } else if (seriesOpt.type === 'tree') { + removeEC3NormalStatus(seriesOpt.leaves); + } // sunburst starts from ec4, so it does not need to compat levels. + + } + + function toArr(o) { + return isArray(o) ? o : o ? [o] : []; + } + + function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; + } + + function globalCompatStyle(option, isTheme) { + each$2(toArr(option.series), function (seriesOpt) { + isObject$1(seriesOpt) && processSeries(seriesOpt); + }); + var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar']; + isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis'); + each$2(axes, function (axisName) { + each$2(toArr(option[axisName]), function (axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, 'axisLabel'); + compatTextStyle(axisOpt.axisPointer, 'label'); + } + }); + }); + each$2(toArr(option.parallel), function (parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, 'axisLabel'); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label'); + }); + each$2(toArr(option.calendar), function (calendarOpt) { + convertNormalEmphasis(calendarOpt, 'itemStyle'); + compatTextStyle(calendarOpt, 'dayLabel'); + compatTextStyle(calendarOpt, 'monthLabel'); + compatTextStyle(calendarOpt, 'yearLabel'); + }); // radar.name.textStyle + + each$2(toArr(option.radar), function (radarOpt) { + compatTextStyle(radarOpt, 'name'); // Use axisName instead of name because component has name property + + if (radarOpt.name && radarOpt.axisName == null) { + radarOpt.axisName = radarOpt.name; + delete radarOpt.name; + + if ("development" !== 'production') { + deprecateLog('name property in radar component has been changed to axisName'); + } + } + + if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { + radarOpt.axisNameGap = radarOpt.nameGap; + delete radarOpt.nameGap; + + if ("development" !== 'production') { + deprecateLog('nameGap property in radar component has been changed to axisNameGap'); + } + } + + if ("development" !== 'production') { + each$2(radarOpt.indicator, function (indicatorOpt) { + if (indicatorOpt.text) { + deprecateReplaceLog('text', 'name', 'radar.indicator'); + } + }); + } + }); + each$2(toArr(option.geo), function (geoOpt) { + if (isObject$1(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$2(toArr(geoOpt.regions), function (regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + each$2(toArr(option.timeline), function (timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, 'label'); + convertNormalEmphasis(timelineOpt, 'itemStyle'); + convertNormalEmphasis(timelineOpt, 'controlStyle', true); + var data = timelineOpt.data; + isArray(data) && each(data, function (item) { + if (isObject(item)) { + convertNormalEmphasis(item, 'label'); + convertNormalEmphasis(item, 'itemStyle'); + } + }); + }); + each$2(toArr(option.toolbox), function (toolboxOpt) { + convertNormalEmphasis(toolboxOpt, 'iconStyle'); + each$2(toolboxOpt.feature, function (featureOpt) { + convertNormalEmphasis(featureOpt, 'iconStyle'); + }); + }); + compatTextStyle(toObj(option.axisPointer), 'label'); + compatTextStyle(toObj(option.tooltip).axisPointer, 'label'); // Clean logs + // storedLogs = {}; + } + + function get(opt, path) { + var pathArr = path.split(','); + var obj = opt; + + for (var i = 0; i < pathArr.length; i++) { + obj = obj && obj[pathArr[i]]; + + if (obj == null) { + break; + } + } + + return obj; + } + + function set$1(opt, path, val, overwrite) { + var pathArr = path.split(','); + var obj = opt; + var key; + var i = 0; + + for (; i < pathArr.length - 1; i++) { + key = pathArr[i]; + + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } + + if (overwrite || obj[pathArr[i]] == null) { + obj[pathArr[i]] = val; + } + } + + function compatLayoutProperties(option) { + option && each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']]; + var COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline']; + var BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']]; + + function compatBarItemStyle(option) { + var itemStyle = option && option.itemStyle; + + if (itemStyle) { + for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { + var oldName = BAR_ITEM_STYLE_MAP[i][1]; + var newName = BAR_ITEM_STYLE_MAP[i][0]; + + if (itemStyle[oldName] != null) { + itemStyle[newName] = itemStyle[oldName]; + + if ("development" !== 'production') { + deprecateReplaceLog(oldName, newName); + } + } + } + } + } + + function compatPieLabel(option) { + if (!option) { + return; + } + + if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) { + if ("development" !== 'production') { + deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie'); + } + + option.edgeDistance = option.margin; + } + } + + function compatSunburstState(option) { + if (!option) { + return; + } + + if (option.downplay && !option.blur) { + option.blur = option.downplay; + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'blur', 'sunburst'); + } + } + } + + function compatGraphFocus(option) { + if (!option) { + return; + } + + if (option.focusNodeAdjacency != null) { + option.emphasis = option.emphasis || {}; + + if (option.emphasis.focus == null) { + if ("development" !== 'production') { + deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \'adjacency\'}', 'graph/sankey'); + } + + option.emphasis.focus = 'adjacency'; + } + } + } + + function traverseTree(data, cb) { + if (data) { + for (var i = 0; i < data.length; i++) { + cb(data[i]); + data[i] && traverseTree(data[i].children, cb); + } + } + } + + function globalBackwardCompat(option, isTheme) { + globalCompatStyle(option, isTheme); // Make sure series array for model initialization. + + option.series = normalizeToArray(option.series); + each(option.series, function (seriesOpt) { + if (!isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + if (seriesType === 'line') { + if (seriesOpt.clipOverflow != null) { + seriesOpt.clip = seriesOpt.clipOverflow; + + if ("development" !== 'production') { + deprecateReplaceLog('clipOverflow', 'clip', 'line'); + } + } + } else if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + + if ("development" !== 'production') { + deprecateReplaceLog('clockWise', 'clockwise'); + } + } + + compatPieLabel(seriesOpt.label); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatPieLabel(data[i]); + } + } + + if (seriesOpt.hoverOffset != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis.scaleSize = null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize'); + } + + seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; + } + } + } else if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null && set$1(seriesOpt, 'itemStyle.color', pointerColor); + } else if (seriesType === 'bar') { + compatBarItemStyle(seriesOpt); + compatBarItemStyle(seriesOpt.backgroundStyle); + compatBarItemStyle(seriesOpt.emphasis); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + if (typeof data[i] === 'object') { + compatBarItemStyle(data[i]); + compatBarItemStyle(data[i] && data[i].emphasis); + } + } + } + } else if (seriesType === 'sunburst') { + var highlightPolicy = seriesOpt.highlightPolicy; + + if (highlightPolicy) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (!seriesOpt.emphasis.focus) { + seriesOpt.emphasis.focus = highlightPolicy; + + if ("development" !== 'production') { + deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst'); + } + } + } + + compatSunburstState(seriesOpt); + traverseTree(seriesOpt.data, compatSunburstState); + } else if (seriesType === 'graph' || seriesType === 'sankey') { + compatGraphFocus(seriesOpt); // TODO nodes, edges? + } else if (seriesType === 'map') { + if (seriesOpt.mapType && !seriesOpt.map) { + if ("development" !== 'production') { + deprecateReplaceLog('mapType', 'map', 'map'); + } + + seriesOpt.map = seriesOpt.mapType; + } + + if (seriesOpt.mapLocation) { + if ("development" !== 'production') { + deprecateLog('`mapLocation` is not used anymore.'); + } + + defaults(seriesOpt, seriesOpt.mapLocation); + } + } + + if (seriesOpt.hoverAnimation != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverAnimation', 'emphasis.scale'); + } + + seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; + } + } + + compatLayoutProperties(seriesOpt); + }); // dataRange has changed to visualMap + + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + + if (options) { + if (!isArray(options)) { + options = [options]; + } + + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + } + + // data processing stage is blocked in stream. + // See + // (2) Only register once when import repeatedly. + // Should be executed after series is filtered and before stack calculation. + + function dataStack(ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); // Compatible: when `stack` is set as '', do not stack. + + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + var stackInfo = { + // Used for calculate axis extent automatically. + // TODO: Type getCalculationInfo return more specific type? + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; // If stacked on axis that do not support data stack. + + if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { + return; + } + + stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel); + stackInfoList.push(stackInfo); + } + }); + stackInfoMap.each(calculateStack); + } + + function calculateStack(stackInfoList) { + each(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; + var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign'; // Should not write on raw data, because stack series model list changes + // depending on legend selection. + + targetData.modify(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + + if (isNaN(sum)) { + return resultNaN; + } + + var byValue; + var stackedDataRawIndex; + + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } // If stackOver is NaN, chart view will render point on value start. + + + var stackedOver = NaN; + + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; // Has been optimized by inverted indices on `stackedByDimension`. + + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data + + if (stackStrategy === 'all' // single stack group + || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack + || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack + ) { + // The sum has to be very small to be affected by the + // floating arithmetic problem. An incorrect result will probably + // cause axis min/max to be filtered incorrectly. + sum = addSafe(sum, val); + stackedOver = val; + break; + } + } + } + + resultVal[0] = sum; + resultVal[1] = stackedOver; + return resultVal; + }); + }); + } + + var SourceImpl = + /** @class */ + function () { + function SourceImpl(fields) { + this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; // Visit config + + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + this.startIndex = fields.startIndex || 0; + this.dimensionsDetectedCount = fields.dimensionsDetectedCount; + this.metaRawOption = fields.metaRawOption; + var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine; + + if (dimensionsDefine) { + for (var i = 0; i < dimensionsDefine.length; i++) { + var dim = dimensionsDefine[i]; + + if (dim.type == null) { + if (guessOrdinal(this, i) === BE_ORDINAL.Must) { + dim.type = 'ordinal'; + } + } + } + } + } + + return SourceImpl; + }(); + + function isSourceInstance(val) { + return val instanceof SourceImpl; + } + /** + * Create a source from option. + * NOTE: Created source is immutable. Don't change any properties in it. + */ + + function createSource(sourceData, thisMetaRawOption, // can be null. If not provided, auto detect it from `sourceData`. + sourceFormat) { + sourceFormat = sourceFormat || detectSourceFormat(sourceData); + var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; + var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); + var source = new SourceImpl({ + data: sourceData, + sourceFormat: sourceFormat, + seriesLayoutBy: seriesLayoutBy, + dimensionsDefine: determined.dimensionsDefine, + startIndex: determined.startIndex, + dimensionsDetectedCount: determined.dimensionsDetectedCount, + metaRawOption: clone(thisMetaRawOption) + }); + return source; + } + /** + * Wrap original series data for some compatibility cases. + */ + + function createSourceFromSeriesDataOption(data) { + return new SourceImpl({ + data: data, + sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL + }); + } + /** + * Clone source but excludes source data. + */ + + function cloneSourceShallow(source) { + return new SourceImpl({ + data: source.data, + sourceFormat: source.sourceFormat, + seriesLayoutBy: source.seriesLayoutBy, + dimensionsDefine: clone(source.dimensionsDefine), + startIndex: source.startIndex, + dimensionsDetectedCount: source.dimensionsDetectedCount + }); + } + /** + * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`. + */ + + function detectSourceFormat(data) { + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } else if (isArray(data)) { + // FIXME Whether tolerate null in top level array? + if (data.length === 0) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + } + + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + + if (item == null) { + continue; + } else if (isArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } else if (isObject(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } else if (isObject(data)) { + for (var key in data) { + if (hasOwn(data, key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + + return sourceFormat; + } + /** + * Determine the source definitions from data standalone dimensions definitions + * are not specified. + */ + + function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, // standalone raw dimensions definition, like: + // { + // dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }] + // } + // in `dataset` or `series` + dimensionsDefine) { + var dimensionsDetectedCount; + var startIndex; // PENDING: Could data be null/undefined here? + // currently, if `dataset.source` not specified, error thrown. + // if `series.data` not specified, nothing rendered without error thrown. + // Should test these cases. + + if (!data) { + return { + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + startIndex: startIndex, + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; // Rule: Most of the first line are string: it is header. + // Caution: consider a line with 5 string and 1 number, + // it still can not be sure it is a head, because the + // 5 string may be 5 values of category columns. + + if (sourceHeader === 'auto' || sourceHeader == null) { + arrayRowsTravelFirst(function (val) { + // '-' is regarded as null/undefined. + if (val != null && val !== '-') { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } else { + startIndex = 0; + } + } // 10 is an experience number, avoid long loop. + + }, seriesLayoutBy, dataArrayRows, 10); + } else { + startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; + } + + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function (val, index) { + dimensionsDefine[index] = val != null ? val + '' : ''; + }, seriesLayoutBy, dataArrayRows, Infinity); + } + + dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + each(data, function (colArr, key) { + dimensionsDefine.push(key); + }); + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectedCount = isArray(value0) && value0.length || 1; + } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.'); + } + } + + return { + startIndex: startIndex, + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + + while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line + + + if (obj) { + return keys(obj); + } + } // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], + // which is reasonable. But dimension name is duplicated. + // Returns undefined or an array contains only object without null/undefined or string. + + + function normalizeDimensionsOption(dimensionsDefine) { + if (!dimensionsDefine) { + // The meaning of null/undefined is different from empty array. + return; + } + + var nameMap = createHashMap(); + return map(dimensionsDefine, function (rawItem, index) { + rawItem = isObject(rawItem) ? rawItem : { + name: rawItem + }; // Other fields will be discarded. + + var item = { + name: rawItem.name, + displayName: rawItem.displayName, + type: rawItem.type + }; // User can set null in dimensions. + // We don't auto specify name, otherwise a given name may + // cause it to be referred unexpectedly. + + if (item.name == null) { + return item; + } // Also consider number form like 2012. + + + item.name += ''; // User may also specify displayName. + // displayName will always exists except user not + // specified or dim name is not specified or detected. + // (A auto generated dim name will not be used as + // displayName). + + if (item.displayName == null) { + item.displayName = item.name; + } + + var exist = nameMap.get(item.name); + + if (!exist) { + nameMap.set(item.name, { + count: 1 + }); + } else { + item.name += '-' + exist.count++; + } + + return item; + }); + } + + function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } else { + var value0 = data[0] || []; + + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } + } + + function shouldRetrieveDataByName(source) { + var sourceFormat = source.sourceFormat; + return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS; + } + + /* + * 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. + */ + + /* + * 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. + */ + var _a, _b, _c; // TODO + var providerMethods; + var mountMethods; + /** + * If normal array used, mutable chunk size is supported. + * If typed array used, chunk size must be fixed. + */ + + var DefaultDataProvider = + /** @class */ + function () { + function DefaultDataProvider(sourceParam, dimSize) { + // let source: Source; + var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; // declare source is Source; + + this._source = source; + var data = this._data = source.data; // Typed array. TODO IE10+? + + if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + if (dimSize == null) { + throw new Error('Typed array data must specify dimension size'); + } + } + + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + + mountMethods(this, data, source); + } + + DefaultDataProvider.prototype.getSource = function () { + return this._source; + }; + + DefaultDataProvider.prototype.count = function () { + return 0; + }; + + DefaultDataProvider.prototype.getItem = function (idx, out) { + return; + }; + + DefaultDataProvider.prototype.appendData = function (newData) {}; + + DefaultDataProvider.prototype.clean = function () {}; + + DefaultDataProvider.protoInitialize = function () { + // PENDING: To avoid potential incompat (e.g., prototype + // is visited somewhere), still init them on prototype. + var proto = DefaultDataProvider.prototype; + proto.pure = false; + proto.persistent = true; + }(); + + DefaultDataProvider.internalField = function () { + var _a; + + mountMethods = function (provider, data, source) { + var sourceFormat = source.sourceFormat; + var seriesLayoutBy = source.seriesLayoutBy; + var startIndex = source.startIndex; + var dimsDef = source.dimensionsDefine; + var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(methods, 'Invalide sourceFormat: ' + sourceFormat); + } + + extend(provider, methods); + + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + provider.getItem = getItemForTypedArray; + provider.count = countForTypedArray; + provider.fillStorage = fillStorageForTypedArray; + } else { + var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); + provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef); + var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); + provider.count = bind(rawCounter, null, data, startIndex, dimsDef); + } + }; + + var getItemForTypedArray = function (idx, out) { + idx = idx - this._offset; + out = out || []; + var data = this._data; + var dimSize = this._dimSize; + var offset = dimSize * idx; + + for (var i = 0; i < dimSize; i++) { + out[i] = data[offset + i]; + } + + return out; + }; + + var fillStorageForTypedArray = function (start, end, storage, extent) { + var data = this._data; + var dimSize = this._dimSize; + + for (var dim = 0; dim < dimSize; dim++) { + var dimExtent = extent[dim]; + var min = dimExtent[0] == null ? Infinity : dimExtent[0]; + var max = dimExtent[1] == null ? -Infinity : dimExtent[1]; + var count = end - start; + var arr = storage[dim]; + + for (var i = 0; i < count; i++) { + // appendData with TypedArray will always do replace in provider. + var val = data[i * dimSize + dim]; + arr[start + i] = val; + val < min && (min = val); + val > max && (max = val); + } + + dimExtent[0] = min; + dimExtent[1] = max; + } + }; + + var countForTypedArray = function () { + return this._data ? this._data.length / this._dimSize : 0; + }; + + providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = { + pure: true, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = { + pure: true, + appendData: function (newData) { + var data = this._data; + each(newData, function (newCol, key) { + var oldCol = data[key] || (data[key] = []); + + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, _a[SOURCE_FORMAT_ORIGINAL] = { + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_TYPED_ARRAY] = { + persistent: false, + pure: true, + appendData: function (newData) { + if ("development" !== 'production') { + assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray'); + } + + this._data = newData; + }, + // Clean self if data is already used. + clean: function () { + // PENDING + this._offset += this.count(); + this._data = null; + } + }, _a); + + function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } + } + }(); + + return DefaultDataProvider; + }(); + + var getItemSimply = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx]; + }; + + var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx + startIndex]; + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx, out) { + idx += startIndex; + var item = out || []; + var data = rawData; + + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item[i] = row ? row[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx, out) { + var item = out || []; + + for (var i = 0; i < dimsDef.length; i++) { + var dimName = dimsDef[i].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + item[i] = col ? col[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); + function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { + var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not support get item on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var countSimply = function (rawData, startIndex, dimsDef) { + return rawData.length; + }; + + var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) { + return Math.max(0, rawData.length - startIndex); + }, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) { + var row = rawData[0]; + return row ? Math.max(0, row.length - startIndex) : 0; + }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) { + var dimName = dimsDef[0].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + return col ? col.length : 0; + }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); + function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { + var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not support count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var getRawValueSimply = function (dataItem, dimIndex, property) { + return dataItem[dimIndex]; + }; + + var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, property) { + return dataItem[property]; + }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, property) { + // FIXME: In some case (markpoint in geo (geo-map.html)), + // dataItem is {coord: [...]} + var value = getDataItemValue(dataItem); + return !(value instanceof Array) ? value : value[dimIndex]; + }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); + function getRawSourceValueGetter(sourceFormat) { + var method = rawSourceValueGetterMap[sourceFormat]; + + if ("development" !== 'production') { + assert(method, 'Do not support get value on "' + sourceFormat + '".'); + } + + return method; + } + + function getMethodMapKey(sourceFormat, seriesLayoutBy) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat; + } // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem, + // Consider persistent. + // Caution: why use raw value to display on label or tooltip? + // A reason is to avoid format. For example time value we do not know + // how to format is expected. More over, if stack is used, calculated + // value may be 0.91000000001, which have brings trouble to display. + // TODO: consider how to treat null/undefined/NaN when display? + + + function retrieveRawValue(data, dataIndex, // If dimIndex is null/undefined, return OptionDataItem. + // Otherwise, return OptionDataValue. + dim) { + if (!data) { + return; + } // Consider data may be not persistent. + + + var dataItem = data.getRawDataItem(dataIndex); + + if (dataItem == null) { + return; + } + + var store = data.getStore(); + var sourceFormat = store.getSource().sourceFormat; + + if (dim != null) { + var dimIndex = data.getDimensionIndex(dim); + var property = store.getDimensionProperty(dimIndex); + return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property); + } else { + var result = dataItem; + + if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + result = getDataItemValue(dataItem); + } + + return result; + } + } + + var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; + + var DataFormatMixin = + /** @class */ + function () { + function DataFormatMixin() {} + /** + * Get params for formatter + */ + + + DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var style = data.getItemVisual(dataIndex, 'style'); + var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill']; + var borderColor = style && style.stroke; + var mainType = this.mainType; + var isSeries = mainType === 'series'; + var userOutput = data.userOutput && data.userOutput.get(); + return { + componentType: mainType, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: isSeries ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: isSeries ? this.id : null, + seriesName: isSeries ? this.name : null, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType: dataType, + value: rawValue, + color: color, + borderColor: borderColor, + dimensionNames: userOutput ? userOutput.fullDimensions : null, + encode: userOutput ? userOutput.encode : null, + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }; + /** + * Format label + * @param dataIndex + * @param status 'normal' by default + * @param dataType + * @param labelDimIndex Only used in some chart that + * use formatter in different dimensions, like radar. + * @param formatter Formatter given outside. + * @return return null/undefined if no formatter + */ + + + DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { + status = status || 'normal'; + var data = this.getData(dataType); + var params = this.getDataParams(dataIndex, dataType); + + if (extendParams) { + params.value = extendParams.interpolatedValue; + } + + if (labelDimIndex != null && isArray(params.value)) { + params.value = params.value[labelDimIndex]; + } + + if (!formatter) { + var itemModel = data.getItemModel(dataIndex); // @ts-ignore + + formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']); + } + + if (isFunction(formatter)) { + params.status = status; + params.dimensionIndex = labelDimIndex; + return formatter(params); + } else if (isString(formatter)) { + var str = formatTpl(formatter, params); // Support 'aaa{@[3]}bbb{@product}ccc'. + // Do not support '}' in dim name util have to. + + return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) { + var len = dimStr.length; + var dimLoose = dimStr; + + if (dimLoose.charAt(0) === '[' && dimLoose.charAt(len - 1) === ']') { + dimLoose = +dimLoose.slice(1, len - 1); // Also support: '[]' => 0 + + if ("development" !== 'production') { + if (isNaN(dimLoose)) { + error("Invalide label formatter: @" + dimStr + ", only support @[0], @[1], @[2], ..."); + } + } + } + + var val = retrieveRawValue(data, dataIndex, dimLoose); + + if (extendParams && isArray(extendParams.interpolatedValue)) { + var dimIndex = data.getDimensionIndex(dimLoose); + + if (dimIndex >= 0) { + val = extendParams.interpolatedValue[dimIndex]; + } + } + + return val != null ? val + '' : ''; + }); + } + }; + /** + * Get raw value in option + */ + + + DataFormatMixin.prototype.getRawValue = function (idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }; + /** + * Should be implemented. + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {string} [dataType] + */ + + + DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // Empty function + return; + }; + + return DataFormatMixin; + }(); + // but guess little chance has been used outside. Do we need to backward + // compat it? + // type TooltipFormatResultLegacyObject = { + // // `html` means the markup language text, either in 'html' or 'richText'. + // // The name `html` is not appropriate because in 'richText' it is not a HTML + // // string. But still support it for backward compatibility. + // html: string; + // markers: Dictionary; + // }; + + /** + * For backward compat, normalize the return from `formatTooltip`. + */ + + function normalizeTooltipFormatResult(result) { + var markupText; // let markers: Dictionary; + + var markupFragment; + + if (isObject(result)) { + if (result.type) { + markupFragment = result; + } else { + if ("development" !== 'production') { + console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result)); + } + } // else { + // markupText = (result as TooltipFormatResultLegacyObject).html; + // markers = (result as TooltipFormatResultLegacyObject).markers; + // if (markersExisting) { + // markers = zrUtil.merge(markersExisting, markers); + // } + // } + + } else { + markupText = result; + } + + return { + text: markupText, + // markers: markers || markersExisting, + frag: markupFragment + }; + } + + /** + * @param {Object} define + * @return See the return of `createTask`. + */ + + function createTask(define) { + return new Task(define); + } + + var Task = + /** @class */ + function () { + function Task(define) { + define = define || {}; + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + this._dirty = true; + } + /** + * @param step Specified step. + * @param skip Skip customer perform call. + * @param modBy Sampling window size. + * @param modDataCount Sampling count. + * @return whether unfinished. + */ + + + Task.prototype.perform = function (performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; // TODO some refactor. + // Pull data. Must pull data each time, because context.data + // may be updated by Series.setData. + + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + + var planResult; + + if (this._plan && !skip) { + planResult = this._plan(this.context); + } // Support sharding by mod, which changes the render sequence and makes the rendered graphic + // elements uniformed distributed when progress, especially when moving or zooming. + + + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = 'reset'; + } + + function normalizeModBy(val) { + !(val >= 1) && (val = 1); // jshint ignore:line + + return val; + } + + var forceFirstProgress; + + if (this._dirty || planResult === 'reset') { + this._dirty = false; + forceFirstProgress = this._doReset(skip); + } + + this._modBy = modBy; + this._modDataCount = modDataCount; + var step = performArgs && performArgs.step; + + if (upTask) { + if ("development" !== 'production') { + assert(upTask._outputDueEnd != null); + } + + this._dueEnd = upTask._outputDueEnd; + } // DataTask or overallTask + else { + if ("development" !== 'production') { + assert(!this._progress || this._count); + } + + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } // Note: Stubs, that its host overall task let it has progress, has progress. + // If no progress, pass index from upstream to downstream each time plan called. + + + if (this._progress) { + var start = this._dueIndex; + var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); + + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + this._doProgress(progress[i], start, end, modBy, modDataCount); + } + } else { + this._doProgress(progress, start, end, modBy, modDataCount); + } + } + + this._dueIndex = end; // If no `outputDueEnd`, assume that output data and + // input data is the same, so use `dueIndex` as `outputDueEnd`. + + var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; + + if ("development" !== 'production') { + // ??? Can not rollback. + assert(outputDueEnd >= this._outputDueEnd); + } + + this._outputDueEnd = outputDueEnd; + } else { + // (1) Some overall task has no progress. + // (2) Stubs, that its host overall task do not let it has progress, has no progress. + // This should always be performed so it can be passed to downstream. + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; + } + + return this.unfinished(); + }; + + Task.prototype.dirty = function () { + this._dirty = true; + this._onDirty && this._onDirty(this.context); + }; + + Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + this._callingProgress = progress; + + this._callingProgress({ + start: start, + end: end, + count: end - start, + next: iterator.next + }, this.context); + }; + + Task.prototype._doReset = function (skip) { + this._dueIndex = this._outputDueEnd = this._dueEnd = 0; + this._settedOutputEnd = null; + var progress; + var forceFirstProgress; + + if (!skip && this._reset) { + progress = this._reset(this.context); + + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } // To simplify no progress checking, array must has item. + + + if (isArray(progress) && !progress.length) { + progress = null; + } + } + + this._progress = progress; + this._modBy = this._modDataCount = null; + var downstream = this._downstream; + downstream && downstream.dirty(); + return forceFirstProgress; + }; + + Task.prototype.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd; + }; + /** + * @param downTask The downstream task. + * @return The downstream task. + */ + + + Task.prototype.pipe = function (downTask) { + if ("development" !== 'production') { + assert(downTask && !downTask._disposed && downTask !== this); + } // If already downstream, do not dirty downTask. + + + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } + }; + + Task.prototype.dispose = function () { + if (this._disposed) { + return; + } + + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + this._dirty = false; + this._disposed = true; + }; + + Task.prototype.getUpstream = function () { + return this._upstream; + }; + + Task.prototype.getDownstream = function () { + return this._downstream; + }; + + Task.prototype.setOutputEnd = function (end) { + // This only happens in dataTask, dataZoom, map, currently. + // where dataZoom do not set end each time, but only set + // when reset. So we should record the set end, in case + // that the stub of dataZoom perform again and earse the + // set end by upstream. + this._outputDueEnd = this._settedOutputEnd = end; + }; + + return Task; + }(); + + var iterator = function () { + var end; + var current; + var modBy; + var modDataCount; + var winCount; + var it = { + reset: function (s, e, sStep, sCount) { + current = s; + end = e; + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; + } + }; + return it; + + function sequentialNext() { + return current < end ? current++ : null; + } + + function modNext() { + var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); + var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case), + // Use normal linear rendering mode. + : current; + current++; + return result; + } + }(); // ----------------------------------------------------------------------------- + // For stream debug (Should be commented out after used!) + // @usage: printTask(this, 'begin'); + // @usage: printTask(this, null, {someExtraProp}); + // @usage: Use `__idxInPipeline` as conditional breakpiont. + // + // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void { + // window.ecTaskUID == null && (window.ecTaskUID = 0); + // task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); + // task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); + // let props = []; + // if (task.__pipeline) { + // let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; + // props.push({text: '__idxInPipeline/total', value: val}); + // } else { + // let stubCount = 0; + // task.agentStubMap.each(() => stubCount++); + // props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); + // } + // props.push({text: 'uid', value: task.uidDebug}); + // if (task.__pipeline) { + // props.push({text: 'pipelineId', value: task.__pipeline.id}); + // task.agent && props.push( + // {text: 'stubFor', value: task.agent.uidDebug} + // ); + // } + // props.push( + // {text: 'dirty', value: task._dirty}, + // {text: 'dueIndex', value: task._dueIndex}, + // {text: 'dueEnd', value: task._dueEnd}, + // {text: 'outputDueEnd', value: task._outputDueEnd} + // ); + // if (extra) { + // Object.keys(extra).forEach(key => { + // props.push({text: key, value: extra[key]}); + // }); + // } + // let args = ['color: blue']; + // let msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( + // args.push('color: green', 'color: red'), + // `${item.text}: %c${item.value}` + // )).join('%c, '); + // console.log.apply(console, [msg].concat(args)); + // // console.log(this); + // }; + // window.printPipeline = function (task: any, prefix: string) { + // const pipeline = task.__pipeline; + // let currTask = pipeline.head; + // while (currTask) { + // window.printTask(currTask, prefix); + // currTask = currTask._downstream; + // } + // }; + // window.showChain = function (chainHeadTask) { + // var chain = []; + // var task = chainHeadTask; + // while (task) { + // chain.push({ + // task: task, + // up: task._upstream, + // down: task._downstream, + // idxInPipeline: task.__idxInPipeline + // }); + // task = task._downstream; + // } + // return chain; + // }; + // window.findTaskInChain = function (task, chainHeadTask) { + // let chain = window.showChain(chainHeadTask); + // let result = []; + // for (let i = 0; i < chain.length; i++) { + // let chainItem = chain[i]; + // if (chainItem.task === task) { + // result.push(i); + // } + // } + // return result; + // }; + // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) { + // let chainA = window.showChain(chainHeadTaskA); + // for (let i = 0; i < chainA.length; i++) { + // console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB)); + // } + // }; + + /** + * Convert raw the value in to inner value in List. + * + * [Performance sensitive] + * + * [Caution]: this is the key logic of user value parser. + * For backward compatibility, do not modify it until you have to! + */ + + function parseDataValue(value, // For high performance, do not omit the second param. + opt) { + // Performance sensitive. + var dimType = opt && opt.type; + + if (dimType === 'ordinal') { + // If given value is a category string + return value; + } + + if (dimType === 'time' // spead up when using timestamp + && !isNumber(value) && value != null && value !== '-') { + value = +parseDate(value); + } // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + // number-like string (like ' 123 ') can be converted to a number. + // where null/undefined or other string will be converted to NaN. + + + return value == null || value === '' ? NaN // If string (like '-'), using '+' parse to NaN + // If object, also parse to NaN + : +value; + } + var valueParserMap = createHashMap({ + 'number': function (val) { + // Do not use `numericToNumber` here. We have `numericToNumber` by default. + // Here the number parser can have loose rule: + // enable to cut suffix: "120px" => 120, "14%" => 14. + return parseFloat(val); + }, + 'time': function (val) { + // return timestamp. + return +parseDate(val); + }, + 'trim': function (val) { + return isString(val) ? trim(val) : val; + } + }); + function getRawValueParser(type) { + return valueParserMap.get(type); + } + var ORDER_COMPARISON_OP_MAP = { + lt: function (lval, rval) { + return lval < rval; + }, + lte: function (lval, rval) { + return lval <= rval; + }, + gt: function (lval, rval) { + return lval > rval; + }, + gte: function (lval, rval) { + return lval >= rval; + } + }; + + var FilterOrderComparator = + /** @class */ + function () { + function FilterOrderComparator(op, rval) { + if (!isNumber(rval)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'rvalue of "<", ">", "<=", ">=" can only be number in filter.'; + } + + throwError(errMsg); + } + + this._opFn = ORDER_COMPARISON_OP_MAP[op]; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterOrderComparator.prototype.evaluate = function (lval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); + }; + + return FilterOrderComparator; + }(); + + var SortOrderComparator = + /** @class */ + function () { + /** + * @param order by default: 'asc' + * @param incomparable by default: Always on the tail. + * That is, if 'asc' => 'max', if 'desc' => 'min' + * See the definition of "incomparable" in [SORT_COMPARISON_RULE]. + */ + function SortOrderComparator(order, incomparable) { + var isDesc = order === 'desc'; + this._resultLT = isDesc ? 1 : -1; + + if (incomparable == null) { + incomparable = isDesc ? 'min' : 'max'; + } + + this._incomparable = incomparable === 'min' ? -Infinity : Infinity; + } // See [SORT_COMPARISON_RULE]. + // Performance sensitive. + + + SortOrderComparator.prototype.evaluate = function (lval, rval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); + var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); + var lvalNotNumeric = isNaN(lvalFloat); + var rvalNotNumeric = isNaN(rvalFloat); + + if (lvalNotNumeric) { + lvalFloat = this._incomparable; + } + + if (rvalNotNumeric) { + rvalFloat = this._incomparable; + } + + if (lvalNotNumeric && rvalNotNumeric) { + var lvalIsStr = isString(lval); + var rvalIsStr = isString(rval); + + if (lvalIsStr) { + lvalFloat = rvalIsStr ? lval : 0; + } + + if (rvalIsStr) { + rvalFloat = lvalIsStr ? rval : 0; + } + } + + return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; + }; + + return SortOrderComparator; + }(); + + var FilterEqualityComparator = + /** @class */ + function () { + function FilterEqualityComparator(isEq, rval) { + this._rval = rval; + this._isEQ = isEq; + this._rvalTypeof = typeof rval; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterEqualityComparator.prototype.evaluate = function (lval) { + var eqResult = lval === this._rval; + + if (!eqResult) { + var lvalTypeof = typeof lval; + + if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) { + eqResult = numericToNumber(lval) === this._rvalFloat; + } + } + + return this._isEQ ? eqResult : !eqResult; + }; + + return FilterEqualityComparator; + }(); + /** + * [FILTER_COMPARISON_RULE] + * `lt`|`lte`|`gt`|`gte`: + * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare. + * `eq`: + * + If same type, compare with `===`. + * + If there is one number, convert to number (`numericToNumber`) to compare. + * + Else return `false`. + * `ne`: + * + Not `eq`. + * + * + * [SORT_COMPARISON_RULE] + * All the values are grouped into three categories: + * + "numeric" (number and numeric string) + * + "non-numeric-string" (string that excluding numeric string) + * + "others" + * "numeric" vs "numeric": values are ordered by number order. + * "non-numeric-string" vs "non-numeric-string": values are ordered by ES spec (#sec-abstract-relational-comparison). + * "others" vs "others": do not change order (always return 0). + * "numeric" vs "non-numeric-string": "non-numeric-string" is treated as "incomparable". + * "number" vs "others": "others" is treated as "incomparable". + * "non-numeric-string" vs "others": "others" is treated as "incomparable". + * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). + * MEMO: + * Non-numeric string sort makes sense when we need to put the items with the same tag together. + * But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, + * So we treat "numeric-string" sorted by number order rather than string comparison. + * + * + * [CHECK_LIST_OF_THE_RULE_DESIGN] + * + Do not support string comparison until required. And also need to + * avoid the misleading of "2" > "12". + * + Should avoid the misleading case: + * `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. + * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... + * + Only "numeric" can be converted to comparable number, otherwise converted to NaN. + * See `util/number.ts#numericToNumber`. + * + * @return If `op` is not `RelationalOperator`, return null; + */ + + + function createFilterComparator(op, rval) { + return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; + } + + /** + * TODO: disable writable. + * This structure will be exposed to users. + */ + + var ExternalSource = + /** @class */ + function () { + function ExternalSource() {} + + ExternalSource.prototype.getRawData = function () { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.getRawDataItem = function (dataIndex) { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.cloneRawData = function () { + return; + }; + /** + * @return If dimension not found, return null/undefined. + */ + + + ExternalSource.prototype.getDimensionInfo = function (dim) { + return; + }; + /** + * dimensions defined if and only if either: + * (a) dataset.dimensions are declared. + * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`). + * If dimensions are defined, `dimensionInfoAll` is corresponding to + * the defined dimensions. + * Otherwise, `dimensionInfoAll` is determined by data columns. + * @return Always return an array (even empty array). + */ + + + ExternalSource.prototype.cloneAllDimensionInfo = function () { + return; + }; + + ExternalSource.prototype.count = function () { + return; + }; + /** + * Only support by dimension index. + * No need to support by dimension name in transform function, + * because transform function is not case-specific, no need to use name literally. + */ + + + ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) { + return; + }; + + ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) { + return; + }; + + ExternalSource.prototype.convertValue = function (rawVal, dimInfo) { + return parseDataValue(rawVal, dimInfo); + }; + + return ExternalSource; + }(); + + function createExternalSource(internalSource, externalTransform) { + var extSource = new ExternalSource(); + var data = internalSource.data; + var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; + var sourceHeaderCount = internalSource.startIndex; + var errMsg = ''; + + if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { + // For the logic simplicity in transformer, only 'culumn' is + // supported in data transform. Otherwise, the `dimensionsDefine` + // might be detected by 'row', which probably confuses users. + if ("development" !== 'production') { + errMsg = '`seriesLayoutBy` of upstream dataset can only be "column" in data transform.'; + } + + throwError(errMsg); + } // [MEMO] + // Create a new dimensions structure for exposing. + // Do not expose all dimension info to users directly. + // Because the dimension is probably auto detected from data and not might reliable. + // Should not lead the transformers to think that is reliable and return it. + // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + + + var dimensions = []; + var dimsByName = {}; + var dimsDef = internalSource.dimensionsDefine; + + if (dimsDef) { + each(dimsDef, function (dimDef, idx) { + var name = dimDef.name; + var dimDefExt = { + index: idx, + name: name, + displayName: dimDef.displayName + }; + dimensions.push(dimDefExt); // Users probably do not specify dimension name. For simplicity, data transform + // does not generate dimension name. + + if (name != null) { + // Dimension name should not be duplicated. + // For simplicity, data transform forbids name duplication, do not generate + // new name like module `completeDimensions.ts` did, but just tell users. + var errMsg_1 = ''; + + if (hasOwn(dimsByName, name)) { + if ("development" !== 'production') { + errMsg_1 = 'dimension name "' + name + '" duplicated.'; + } + + throwError(errMsg_1); + } + + dimsByName[name] = dimDefExt; + } + }); + } // If dimension definitions are not defined and can not be detected. + // e.g., pure data `[[11, 22], ...]`. + else { + for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { + // Do not generete name or anything others. The consequence process in + // `transform` or `series` probably have there own name generation strategry. + dimensions.push({ + index: i + }); + } + } // Implement public methods: + + + var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + + if (externalTransform.__isBuiltIn) { + extSource.getRawDataItem = function (dataIndex) { + return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + }; + + extSource.getRawData = bind(getRawData, null, internalSource); + } + + extSource.cloneRawData = bind(cloneRawData, null, internalSource); + var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions); + var rawValueGetter = getRawSourceValueGetter(sourceFormat); + + extSource.retrieveValue = function (dataIndex, dimIndex) { + var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + return retrieveValueFromItem(rawItem, dimIndex); + }; + + var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) { + if (dataItem == null) { + return; + } + + var dimDef = dimensions[dimIndex]; // When `dimIndex` is `null`, `rawValueGetter` return the whole item. + + if (dimDef) { + return rawValueGetter(dataItem, dimIndex, dimDef.name); + } + }; + + extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName); + extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions); + return extSource; + } + + function getRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`getRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + return upstream.data; + } + + function cloneRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + var data = upstream.data; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(data[i].slice()); + } + + return result; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(extend({}, data[i])); + } + + return result; + } + } + + function getDimensionInfo(dimensions, dimsByName, dim) { + if (dim == null) { + return; + } // Keep the same logic as `List::getDimension` did. + + + if (isNumber(dim) // If being a number-like string but not being defined a dimension name. + || !isNaN(dim) && !hasOwn(dimsByName, dim)) { + return dimensions[dim]; + } else if (hasOwn(dimsByName, dim)) { + return dimsByName[dim]; + } + } + + function cloneAllDimensionInfo(dimensions) { + return clone(dimensions); + } + + var externalTransformMap = createHashMap(); + function registerExternalTransform(externalTransform) { + externalTransform = clone(externalTransform); + var type = externalTransform.type; + var errMsg = ''; + + if (!type) { + if ("development" !== 'production') { + errMsg = 'Must have a `type` when `registerTransform`.'; + } + + throwError(errMsg); + } + + var typeParsed = type.split(':'); + + if (typeParsed.length !== 2) { + if ("development" !== 'production') { + errMsg = 'Name must include namespace like "ns:regression".'; + } + + throwError(errMsg); + } // Namespace 'echarts:xxx' is official namespace, where the transforms should + // be called directly via 'xxx' rather than 'echarts:xxx'. + + + var isBuiltIn = false; + + if (typeParsed[0] === 'echarts') { + type = typeParsed[1]; + isBuiltIn = true; + } + + externalTransform.__isBuiltIn = isBuiltIn; + externalTransformMap.set(type, externalTransform); + } + function applyDataTransform(rawTransOption, sourceList, infoForPrint) { + var pipedTransOption = normalizeToArray(rawTransOption); + var pipeLen = pipedTransOption.length; + var errMsg = ''; + + if (!pipeLen) { + if ("development" !== 'production') { + errMsg = 'If `transform` declared, it should at least contain one transform.'; + } + + throwError(errMsg); + } + + for (var i = 0, len = pipeLen; i < len; i++) { + var transOption = pipedTransOption[i]; + sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i); // piped transform only support single input, except the fist one. + // piped transform only support single output, except the last one. + + if (i !== len - 1) { + sourceList.length = Math.max(sourceList.length, 1); + } + } + + return sourceList; + } + + function applySingleDataTransform(transOption, upSourceList, infoForPrint, // If `pipeIndex` is null/undefined, no piped transform. + pipeIndex) { + var errMsg = ''; + + if (!upSourceList.length) { + if ("development" !== 'production') { + errMsg = 'Must have at least one upstream dataset.'; + } + + throwError(errMsg); + } + + if (!isObject(transOption)) { + if ("development" !== 'production') { + errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.'; + } + + throwError(errMsg); + } + + var transType = transOption.type; + var externalTransform = externalTransformMap.get(transType); + + if (!externalTransform) { + if ("development" !== 'production') { + errMsg = 'Can not find transform on type "' + transType + '".'; + } + + throwError(errMsg); + } // Prepare source + + + var extUpSourceList = map(upSourceList, function (upSource) { + return createExternalSource(upSource, externalTransform); + }); + var resultList = normalizeToArray(externalTransform.transform({ + upstream: extUpSourceList[0], + upstreamList: extUpSourceList, + config: clone(transOption.config) + })); + + if ("development" !== 'production') { + if (transOption.print) { + var printStrArr = map(resultList, function (extSource) { + var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : ''; + return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\n'); + }).join('\n'); + log(printStrArr); + } + } + + return map(resultList, function (result, resultIndex) { + var errMsg = ''; + + if (!isObject(result)) { + if ("development" !== 'production') { + errMsg = 'A transform should not return some empty results.'; + } + + throwError(errMsg); + } + + if (!result.data) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be not be null or undefined'; + } + + throwError(errMsg); + } + + var sourceFormat = detectSourceFormat(result.data); + + if (!isSupportedSourceFormat(sourceFormat)) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be array rows or object rows.'; + } + + throwError(errMsg); + } + + var resultMetaRawOption; + var firstUpSource = upSourceList[0]; + /** + * Intuitively, the end users known the content of the original `dataset.source`, + * calucating the transform result in mind. + * Suppose the original `dataset.source` is: + * ```js + * [ + * ['product', '2012', '2013', '2014', '2015'], + * ['AAA', 41.1, 30.4, 65.1, 53.3], + * ['BBB', 86.5, 92.1, 85.7, 83.1], + * ['CCC', 24.1, 67.2, 79.5, 86.4] + * ] + * ``` + * The dimension info have to be detected from the source data. + * Some of the transformers (like filter, sort) will follow the dimension info + * of upstream, while others use new dimensions (like aggregate). + * Transformer can output a field `dimensions` to define the its own output dimensions. + * We also allow transformers to ignore the output `dimensions` field, and + * inherit the upstream dimensions definition. It can reduce the burden of handling + * dimensions in transformers. + * + * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + */ + + if (firstUpSource && resultIndex === 0 // If transformer returns `dimensions`, it means that the transformer has different + // dimensions definitions. We do not inherit anything from upstream. + && !result.dimensions) { + var startIndex = firstUpSource.startIndex; // We copy the header of upstream to the result, because: + // (1) The returned data always does not contain header line and can not be used + // as dimension-detection. In this case we can not use "detected dimensions" of + // upstream directly, because it might be detected based on different `seriesLayoutBy`. + // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`. + // So the original detected header should be add to the result, otherwise they can not be read. + + if (startIndex) { + result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); + } + + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: startIndex, + dimensions: firstUpSource.metaRawOption.dimensions + }; + } else { + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: 0, + dimensions: result.dimensions + }; + } + + return createSource(result.data, resultMetaRawOption, null); + }); + } + + function isSupportedSourceFormat(sourceFormat) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; + } + + var UNDEFINED = 'undefined'; + /* global Float64Array, Int32Array, Uint32Array, Uint16Array */ + // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is + // different from the Ctor of typed array. + + var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; + var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; + var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array; + var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array; + /** + * Multi dimensional data store + */ + + var dataCtors = { + 'float': CtorFloat64Array, + 'int': CtorInt32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': CtorFloat64Array + }; + var defaultDimValueGetters; + + function getIndicesCtor(rawCount) { + // The possible max value in this._indicies is always this._rawCount despite of filtering. + return rawCount > 65535 ? CtorUint32Array : CtorUint16Array; + } + + function getInitialExtent() { + return [Infinity, -Infinity]; + } + + function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; // Only shallow clone is enough when Array. + + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); + } + + function prepareStore(store, dimIdx, dimType, end, append) { + var DataCtor = dataCtors[dimType || 'float']; + + if (append) { + var oldStore = store[dimIdx]; + var oldLen = oldStore && oldStore.length; + + if (!(oldLen === end)) { + var newStore = new DataCtor(end); // The cost of the copy is probably inconsiderable + // within the initial chunkSize. + + for (var j = 0; j < oldLen; j++) { + newStore[j] = oldStore[j]; + } + + store[dimIdx] = newStore; + } + } else { + store[dimIdx] = new DataCtor(end); + } + } + /** + * Basically, DataStore API keep immutable. + */ + + var DataStore = + /** @class */ + function () { + function DataStore() { + this._chunks = []; // It will not be calculated until needed. + + this._rawExtent = []; + this._extent = []; + this._count = 0; + this._rawCount = 0; + this._calcDimNameToIdx = createHashMap(); + } + /** + * Initialize from data + */ + + + DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) { + if ("development" !== 'production') { + assert(isFunction(provider.getItem) && isFunction(provider.count), 'Invalid data provider.'); + } + + this._provider = provider; // Clear + + this._chunks = []; + this._indices = null; + this.getRawIndex = this._getRawIdxIdentity; + var source = provider.getSource(); + var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat]; // Default dim value getter + + this._dimValueGetter = dimValueGetter || defaultGetter; // Reset raw extent. + + this._rawExtent = []; + var willRetrieveDataByName = shouldRetrieveDataByName(source); + this._dimensions = map(inputDimensions, function (dim) { + if ("development" !== 'production') { + if (willRetrieveDataByName) { + assert(dim.property != null); + } + } + + return { + // Only pick these two props. Not leak other properties like orderMeta. + type: dim.type, + property: dim.property + }; + }); + + this._initDataFromProvider(0, provider.count()); + }; + + DataStore.prototype.getProvider = function () { + return this._provider; + }; + /** + * Caution: even when a `source` instance owned by a series, the created data store + * may still be shared by different sereis (the source hash does not use all `source` + * props, see `sourceManager`). In this case, the `source` props that are not used in + * hash (like `source.dimensionDefine`) probably only belongs to a certain series and + * thus should not be fetch here. + */ + + + DataStore.prototype.getSource = function () { + return this._provider.getSource(); + }; + /** + * @caution Only used in dataStack. + */ + + + DataStore.prototype.ensureCalculationDimension = function (dimName, type) { + var calcDimNameToIdx = this._calcDimNameToIdx; + var dimensions = this._dimensions; + var calcDimIdx = calcDimNameToIdx.get(dimName); + + if (calcDimIdx != null) { + if (dimensions[calcDimIdx].type === type) { + return calcDimIdx; + } + } else { + calcDimIdx = dimensions.length; + } + + dimensions[calcDimIdx] = { + type: type + }; + calcDimNameToIdx.set(dimName, calcDimIdx); + this._chunks[calcDimIdx] = new dataCtors[type || 'float'](this._rawCount); + this._rawExtent[calcDimIdx] = getInitialExtent(); + return calcDimIdx; + }; + + DataStore.prototype.collectOrdinalMeta = function (dimIdx, ordinalMeta) { + var chunk = this._chunks[dimIdx]; + var dim = this._dimensions[dimIdx]; + var rawExtents = this._rawExtent; + var offset = dim.ordinalOffset || 0; + var len = chunk.length; + + if (offset === 0) { + // We need to reset the rawExtent if collect is from start. + // Because this dimension may be guessed as number and calcuating a wrong extent. + rawExtents[dimIdx] = getInitialExtent(); + } + + var dimRawExtent = rawExtents[dimIdx]; // Parse from previous data offset. len may be changed after appendData + + for (var i = offset; i < len; i++) { + var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]); + + if (!isNaN(val)) { + dimRawExtent[0] = Math.min(val, dimRawExtent[0]); + dimRawExtent[1] = Math.max(val, dimRawExtent[1]); + } + } + + dim.ordinalMeta = ordinalMeta; + dim.ordinalOffset = len; + dim.type = 'ordinal'; // Force to be ordinal + }; + + DataStore.prototype.getOrdinalMeta = function (dimIdx) { + var dimInfo = this._dimensions[dimIdx]; + var ordinalMeta = dimInfo.ordinalMeta; + return ordinalMeta; + }; + + DataStore.prototype.getDimensionProperty = function (dimIndex) { + var item = this._dimensions[dimIndex]; + return item && item.property; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + DataStore.prototype.appendData = function (data) { + if ("development" !== 'production') { + assert(!this._indices, 'appendData can only be called on raw data.'); + } + + var provider = this._provider; + var start = this.count(); + provider.appendData(data); + var end = provider.count(); + + if (!provider.persistent) { + end += start; + } + + if (start < end) { + this._initDataFromProvider(start, end, true); + } + + return [start, end]; + }; + + DataStore.prototype.appendValues = function (values, minFillLen) { + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var start = this.count(); + var end = start + Math.max(values.length, minFillLen || 0); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + prepareStore(chunks, i, dim.type, end, true); + } + + var emptyDataItem = []; + + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx); + chunks[dimIdx][idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + + this._rawCount = this._count = end; + return { + start: start, + end: end + }; + }; + + DataStore.prototype._initDataFromProvider = function (start, end, append) { + var provider = this._provider; + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var dimNames = map(dimensions, function (dim) { + return dim.property; + }); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + + if (!rawExtent[i]) { + rawExtent[i] = getInitialExtent(); + } + + prepareStore(chunks, i, dim.type, end, append); + } + + if (provider.fillStorage) { + provider.fillStorage(start, end, chunks, rawExtent); + } else { + var dataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + dataItem = provider.getItem(idx, dataItem); // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dimStorage = chunks[dimIdx]; // PENDING NULL is empty or zero + + var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx); + + dimStorage[idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + } + + if (!provider.persistent && provider.clean) { + // Clean unused data if data source is typed array. + provider.clean(); + } + + this._rawCount = this._count = end; // Reset data extent + + this._extent = []; + }; + + DataStore.prototype.count = function () { + return this._count; + }; + /** + * Get value. Return NaN if idx is out of range. + */ + + + DataStore.prototype.get = function (dim, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + + DataStore.prototype.getValues = function (dimensions, idx) { + var values = []; + var dimArr = []; + + if (idx == null) { + idx = dimensions; // TODO get all from store? + + dimensions = []; // All dimensions + + for (var i = 0; i < this._dimensions.length; i++) { + dimArr.push(i); + } + } else { + dimArr = dimensions; + } + + for (var i = 0, len = dimArr.length; i < len; i++) { + values.push(this.get(dimArr[i], idx)); + } + + return values; + }; + /** + * @param dim concrete dim + */ + + + DataStore.prototype.getByRawIndex = function (dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[rawIdx] : NaN; + }; + /** + * Get sum of data in one dimension + */ + + + DataStore.prototype.getSum = function (dim) { + var dimData = this._chunks[dim]; + var sum = 0; + + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i); + + if (!isNaN(value)) { + sum += value; + } + } + } + + return sum; + }; + /** + * Get median of data in one dimension + */ + + + DataStore.prototype.getMedian = function (dim) { + var dimDataArray = []; // map all data of one dimension + + this.each([dim], function (val) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); // TODO + // Use quick select? + + var sortedDimDataArray = dimDataArray.sort(function (a, b) { + return a - b; + }); + var len = this.count(); // calculate median + + return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; + }; + /** + * Retrieve the index with given raw data index. + */ + + + DataStore.prototype.indexOfRawIndex = function (rawIndex) { + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + + if (!this._indices) { + return rawIndex; + } // Indices are ascending + + + var indices = this._indices; // If rawIndex === dataIndex + + var rawDataIndex = indices[rawIndex]; + + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + + var left = 0; + var right = this._count - 1; + + while (left <= right) { + var mid = (left + right) / 2 | 0; + + if (indices[mid] < rawIndex) { + left = mid + 1; + } else if (indices[mid] > rawIndex) { + right = mid - 1; + } else { + return mid; + } + } + + return -1; + }; + /** + * Retrieve the index of nearest value. + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices have + * the same value, they are put to the result. + */ + + + DataStore.prototype.indicesOfNearest = function (dim, value, maxDistance) { + var chunks = this._chunks; + var dimData = chunks[dim]; + var nearestIndices = []; + + if (!dimData) { + return nearestIndices; + } + + if (maxDistance == null) { + maxDistance = Infinity; + } + + var minDist = Infinity; + var minDiff = -1; + var nearestIndicesLen = 0; // Check the test case of `test/ut/spec/data/SeriesData.js`. + + for (var i = 0, len = this.count(); i < len; i++) { + var dataIndex = this.getRawIndex(i); + var diff = value - dimData[dataIndex]; + var dist = Math.abs(diff); + + if (dist <= maxDistance) { + // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`, + // we'd better not push both of them to `nearestIndices`, otherwise it is easy to + // get more than one item in `nearestIndices` (more specifically, in `tooltip`). + // So we choose the one that `diff >= 0` in this case. + // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them + // should be push to `nearestIndices`. + if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + nearestIndicesLen = 0; + } + + if (diff === minDiff) { + nearestIndices[nearestIndicesLen++] = i; + } + } + } + + nearestIndices.length = nearestIndicesLen; + return nearestIndices; + }; + + DataStore.prototype.getIndices = function () { + var newIndices; + var indices = this._indices; + + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`. + + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } else { + var Ctor = getIndicesCtor(this._rawCount); + newIndices = new Ctor(this.count()); + + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + + return newIndices; + }; + /** + * Data filter. + */ + + + DataStore.prototype.filter = function (dims, cb) { + if (!this._count) { + return this; + } + + var newStore = this.clone(); + var count = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dims.length; + var offset = 0; + var dim0 = dims[0]; + var chunks = newStore._chunks; + + for (var i = 0; i < count; i++) { + var keep = void 0; + var rawIdx = newStore.getRawIndex(i); // Simple optimization + + if (dimSize === 0) { + keep = cb(i); + } else if (dimSize === 1) { + var val = chunks[dim0][rawIdx]; + keep = cb(val, i); + } else { + var k = 0; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } + + value[k] = i; + keep = cb.apply(null, value); + } + + if (keep) { + newIndices[offset++] = rawIdx; + } + } // Set indices after filtered. + + + if (offset < count) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + DataStore.prototype.selectRange = function (range) { + var newStore = this.clone(); + var len = newStore._count; + + if (!len) { + return this; + } + + var dims = keys(range); + var dimSize = dims.length; + + if (!dimSize) { + return this; + } + + var originalCount = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(originalCount); + var offset = 0; + var dim0 = dims[0]; + var min = range[dim0][0]; + var max = range[dim0][1]; + var storeArr = newStore._chunks; + var quickFinished = false; + + if (!newStore._indices) { + // Extreme optimization for common case. About 2x faster in chrome. + var idx = 0; + + if (dimSize === 1) { + var dimStorage = storeArr[dims[0]]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; // NaN will not be filtered. Consider the case, in line chart, empty + // value indicates the line should be broken. But for the case like + // scatter plot, a data item with empty value will not be rendered, + // but the axis extent may be effected if some other dim of the data + // item has value. Fortunately it is not a significant negative effect. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } else if (dimSize === 2) { + var dimStorage = storeArr[dims[0]]; + var dimStorage2 = storeArr[dims[1]]; + var min2 = range[dims[1]][0]; + var max2 = range[dims[1]][1]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + var val2 = dimStorage2[i]; // Do not filter NaN, see comment above. + + if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } + } + + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = newStore.getRawIndex(i); + var val = storeArr[dims[0]][rawIndex]; // Do not filter NaN, see comment above. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = rawIndex; + } + } + } else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = newStore.getRawIndex(i); + + for (var k = 0; k < dimSize; k++) { + var dimk = dims[k]; + var val = storeArr[dimk][rawIndex]; // Do not filter NaN, see comment above. + + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + + if (keep) { + newIndices[offset++] = newStore.getRawIndex(i); + } + } + } + } // Set indices after filtered. + + + if (offset < originalCount) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; // /** + // * Data mapping to a plain array + // */ + // mapArray(dims: DimensionIndex[], cb: MapArrayCb): any[] { + // const result: any[] = []; + // this.each(dims, function () { + // result.push(cb && (cb as MapArrayCb).apply(null, arguments)); + // }); + // return result; + // } + + /** + * Data mapping to a new List with given dimensions + */ + + + DataStore.prototype.map = function (dims, cb) { + // TODO only clone picked chunks. + var target = this.clone(dims); + + this._updateDims(target, dims, cb); + + return target; + }; + /** + * @caution Danger!! Only used in dataStack. + */ + + + DataStore.prototype.modify = function (dims, cb) { + this._updateDims(this, dims, cb); + }; + + DataStore.prototype._updateDims = function (target, dims, cb) { + var targetChunks = target._chunks; + var tmpRetValue = []; + var dimSize = dims.length; + var dataCount = target.count(); + var values = []; + var rawExtent = target._rawExtent; + + for (var i = 0; i < dims.length; i++) { + rawExtent[dims[i]] = getInitialExtent(); + } + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + var rawIndex = target.getRawIndex(dataIndex); + + for (var k = 0; k < dimSize; k++) { + values[k] = targetChunks[dims[k]][rawIndex]; + } + + values[dimSize] = dataIndex; + var retValue = cb && cb.apply(null, values); + + if (retValue != null) { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + + for (var i = 0; i < retValue.length; i++) { + var dim = dims[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + var dimStore = targetChunks[dim]; + + if (dimStore) { + dimStore[rawIndex] = val; + } + + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + DataStore.prototype.lttbDownSample = function (valueDimension, rate) { + var target = this.clone([valueDimension], true); + var targetStorage = target._chunks; + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var sampledIndex = 0; + var frameSize = Math.floor(1 / rate); + var currentRawIndex = this.getRawIndex(0); + var maxArea; + var area; + var nextRawIndex; + var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len)); // First frame use the first data. + + newIndices[sampledIndex++] = currentRawIndex; + + for (var i = 1; i < len - 1; i += frameSize) { + var nextFrameStart = Math.min(i + frameSize, len - 1); + var nextFrameEnd = Math.min(i + frameSize * 2, len); + var avgX = (nextFrameEnd + nextFrameStart) / 2; + var avgY = 0; + + for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + continue; + } + + avgY += y; + } + + avgY /= nextFrameEnd - nextFrameStart; + var frameStart = i; + var frameEnd = Math.min(i + frameSize, len); + var pointAX = i - 1; + var pointAY = dimStore[currentRawIndex]; + maxArea = -1; + nextRawIndex = frameStart; + var firstNaNIndex = -1; + var countNaN = 0; // Find a point from current frame that construct a triangle with largest area with previous selected point + // And the average of next frame. + + for (var idx = frameStart; idx < frameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + countNaN++; + + if (firstNaNIndex < 0) { + firstNaNIndex = rawIndex; + } + + continue; + } // Calculate triangle area over three buckets + + + area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); + + if (area > maxArea) { + maxArea = area; + nextRawIndex = rawIndex; // Next a is this b + } + } + + if (countNaN > 0 && countNaN < frameEnd - frameStart) { + // Append first NaN point in every bucket. + // It is necessary to ensure the correct order of indices. + newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex); + nextRawIndex = Math.max(firstNaNIndex, nextRawIndex); + } + + newIndices[sampledIndex++] = nextRawIndex; + currentRawIndex = nextRawIndex; // This a is the next a (chosen b) + } // First frame use the last data. + + + newIndices[sampledIndex++] = this.getRawIndex(len - 1); + target._count = sampledIndex; + target._indices = newIndices; + target.getRawIndex = this._getRawIdx; + return target; + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + DataStore.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var target = this.clone([dimension], true); + var targetStorage = target._chunks; + var frameValues = []; + var frameSize = Math.floor(1 / rate); + var dimStore = targetStorage[dimension]; + var len = this.count(); + var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent(); + var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize)); + var offset = 0; + + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + + for (var k = 0; k < frameSize; k++) { + var dataIdx = this.getRawIndex(i + k); + frameValues[k] = dimStore[dataIdx]; + } + + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)); // Only write value on the filtered data + + dimStore[sampleFrameIdx] = value; + + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + + newIndices[offset++] = sampleFrameIdx; + } + + target._count = offset; + target._indices = newIndices; + + target._updateGetRawIdx(); + + return target; + }; + /** + * Data iteration + * @param ctx default this + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + + + DataStore.prototype.each = function (dims, cb) { + if (!this._count) { + return; + } + + var dimSize = dims.length; + var chunks = this._chunks; + + for (var i = 0, len = this.count(); i < len; i++) { + var rawIdx = this.getRawIndex(i); // Simple optimization + + switch (dimSize) { + case 0: + cb(i); + break; + + case 1: + cb(chunks[dims[0]][rawIdx], i); + break; + + case 2: + cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i); + break; + + default: + var k = 0; + var value = []; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } // Index + + + value[k] = i; + cb.apply(null, value); + } + } + }; + /** + * Get extent of data in one dimension + */ + + + DataStore.prototype.getDataExtent = function (dim) { + // Make sure use concrete dim as cache name. + var dimData = this._chunks[dim]; + var initialExtent = getInitialExtent(); + + if (!dimData) { + return initialExtent; + } // Make more strict checkings to ensure hitting cache. + + + var currEnd = this.count(); // Consider the most cases when using data zoom, `getDataExtent` + // happened before filtering. We cache raw extent, which is not + // necessary to be cleared and recalculated when restore data. + + var useRaw = !this._indices; + var dimExtent; + + if (useRaw) { + return this._rawExtent[dim].slice(); + } + + dimExtent = this._extent[dim]; + + if (dimExtent) { + return dimExtent.slice(); + } + + dimExtent = initialExtent; + var min = dimExtent[0]; + var max = dimExtent[1]; + + for (var i = 0; i < currEnd; i++) { + var rawIdx = this.getRawIndex(i); + var value = dimData[rawIdx]; + value < min && (min = value); + value > max && (max = value); + } + + dimExtent = [min, max]; + this._extent[dim] = dimExtent; + return dimExtent; + }; + /** + * Get raw data item + */ + + + DataStore.prototype.getRawDataItem = function (idx) { + var rawIdx = this.getRawIndex(idx); + + if (!this._provider.persistent) { + var val = []; + var chunks = this._chunks; + + for (var i = 0; i < chunks.length; i++) { + val.push(chunks[i][rawIdx]); + } + + return val; + } else { + return this._provider.getItem(rawIdx); + } + }; + /** + * Clone shallow. + * + * @param clonedDims Determine which dims to clone. Will share the data if not specified. + */ + + + DataStore.prototype.clone = function (clonedDims, ignoreIndices) { + var target = new DataStore(); + var chunks = this._chunks; + var clonedDimsMap = clonedDims && reduce(clonedDims, function (obj, dimIdx) { + obj[dimIdx] = true; + return obj; + }, {}); + + if (clonedDimsMap) { + for (var i = 0; i < chunks.length; i++) { + // Not clone if dim is not picked. + target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]); + } + } else { + target._chunks = chunks; + } + + this._copyCommonProps(target); + + if (!ignoreIndices) { + target._indices = this._cloneIndices(); + } + + target._updateGetRawIdx(); + + return target; + }; + + DataStore.prototype._copyCommonProps = function (target) { + target._count = this._count; + target._rawCount = this._rawCount; + target._provider = this._provider; + target._dimensions = this._dimensions; + target._extent = clone(this._extent); + target._rawExtent = clone(this._rawExtent); + }; + + DataStore.prototype._cloneIndices = function () { + if (this._indices) { + var Ctor = this._indices.constructor; + var indices = void 0; + + if (Ctor === Array) { + var thisCount = this._indices.length; + indices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + indices[i] = this._indices[i]; + } + } else { + indices = new Ctor(this._indices); + } + + return indices; + } + + return null; + }; + + DataStore.prototype._getRawIdxIdentity = function (idx) { + return idx; + }; + + DataStore.prototype._getRawIdx = function (idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + + return -1; + }; + + DataStore.prototype._updateGetRawIdx = function () { + this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity; + }; + + DataStore.internalField = function () { + function getDimValueSimply(dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]); + } + + defaultDimValueGetters = { + arrayRows: getDimValueSimply, + objectRows: function (dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[property], this._dimensions[dimIndex]); + }, + keyedColumns: getDimValueSimply, + original: function (dataItem, property, dataIndex, dimIndex) { + // Performance sensitive, do not use modelUtil.getDataItemValue. + // If dataItem is an plain object with no value field, the let `value` + // will be assigned with the object, but it will be tread correctly + // in the `convertValue`. + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); + return parseDataValue(value instanceof Array ? value[dimIndex] // If value is a single number or something else not array. + : value, this._dimensions[dimIndex]); + }, + typedArray: function (dataItem, property, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + }; + }(); + + return DataStore; + }(); + + /** + * [REQUIREMENT_MEMO]: + * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option. + * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and + * `root-dataset`. Them on `series` has higher priority. + * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might + * confuse users: whether those props indicate how to visit the upstream source or visit + * the transform result source, and some transforms has nothing to do with these props, + * and some transforms might have multiple upstream. + * (3) Transforms should specify `metaRawOption` in each output, just like they can be + * declared in `root-dataset`. + * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms. + * That is for reducing complexity in transforms. + * PENDING: Whether to provide transposition transform? + * + * [IMPLEMENTAION_MEMO]: + * "sourceVisitConfig" are calculated from `metaRawOption` and `data`. + * They will not be calculated until `source` is about to be visited (to prevent from + * duplicate calcuation). `source` is visited only in series and input to transforms. + * + * [DIMENSION_INHERIT_RULE]: + * By default the dimensions are inherited from ancestors, unless a transform return + * a new dimensions definition. + * Consider the case: + * ```js + * dataset: [{ + * source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * dataset: [{ + * dimension: ['Product', 'Sales', 'Prise'], + * source: [ ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * ``` + * The two types of option should have the same behavior after transform. + * + * + * [SCENARIO]: + * (1) Provide source data directly: + * ```js + * series: { + * encode: {...}, + * dimensions: [...] + * seriesLayoutBy: 'row', + * data: [[...]] + * } + * ``` + * (2) Series refer to dataset. + * ```js + * series: [{ + * encode: {...} + * // Ignore datasetIndex means `datasetIndex: 0` + * // and the dimensions defination in dataset is used + * }, { + * encode: {...}, + * seriesLayoutBy: 'column', + * datasetIndex: 1 + * }] + * ``` + * (3) dataset transform + * ```js + * dataset: [{ + * source: [...] + * }, { + * source: [...] + * }, { + * // By default from 0. + * transform: { type: 'filter', config: {...} } + * }, { + * // Piped. + * transform: [ + * { type: 'filter', config: {...} }, + * { type: 'sort', config: {...} } + * ] + * }, { + * id: 'regressionData', + * fromDatasetIndex: 1, + * // Third-party transform + * transform: { type: 'ecStat:regression', config: {...} } + * }, { + * // retrieve the extra result. + * id: 'regressionFormula', + * fromDatasetId: 'regressionData', + * fromTransformResult: 1 + * }] + * ``` + */ + + var SourceManager = + /** @class */ + function () { + function SourceManager(sourceHost) { + // Cached source. Do not repeat calculating if not dirty. + this._sourceList = []; + this._storeList = []; // version sign of each upstream source manager. + + this._upstreamSignList = []; + this._versionSignBase = 0; + this._dirty = true; + this._sourceHost = sourceHost; + } + /** + * Mark dirty. + */ + + + SourceManager.prototype.dirty = function () { + this._setLocalSource([], []); + + this._storeList = []; + this._dirty = true; + }; + + SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) { + this._sourceList = sourceList; + this._upstreamSignList = upstreamSignList; + this._versionSignBase++; + + if (this._versionSignBase > 9e10) { + this._versionSignBase = 0; + } + }; + /** + * For detecting whether the upstream source is dirty, so that + * the local cached source (in `_sourceList`) should be discarded. + */ + + + SourceManager.prototype._getVersionSign = function () { + return this._sourceHost.uid + '_' + this._versionSignBase; + }; + /** + * Always return a source instance. Otherwise throw error. + */ + + + SourceManager.prototype.prepareSource = function () { + // For the case that call `setOption` multiple time but no data changed, + // cache the result source to prevent from repeating transform. + if (this._isDirty()) { + this._createSource(); + + this._dirty = false; + } + }; + + SourceManager.prototype._createSource = function () { + this._setLocalSource([], []); + + var sourceHost = this._sourceHost; + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + var hasUpstream = !!upSourceMgrList.length; + var resultSourceList; + var upstreamSignList; + + if (isSeries(sourceHost)) { + var seriesModel = sourceHost; + var data = void 0; + var sourceFormat = void 0; + var upSource = void 0; // Has upstream dataset + + if (hasUpstream) { + var upSourceMgr = upSourceMgrList[0]; + upSourceMgr.prepareSource(); + upSource = upSourceMgr.getSource(); + data = upSource.data; + sourceFormat = upSource.sourceFormat; + upstreamSignList = [upSourceMgr._getVersionSign()]; + } // Series data is from own. + else { + data = seriesModel.get('data', true); + sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + upstreamSignList = []; + } // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root. + + + var newMetaRawOption = this._getSourceMetaRawOption() || {}; + var upMetaRawOption = upSource && upSource.metaRawOption || {}; + var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null; + var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader); // Note here we should not use `upSource.dimensionsDefine`. Consider the case: + // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`, + // but series need `seriesLayoutBy: 'row'`. + + var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); // We share source with dataset as much as possible + // to avoid extra memory cost of high dimensional data. + + var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; + resultSourceList = needsCreateSource ? [createSource(data, { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }, sourceFormat)] : []; + } else { + var datasetModel = sourceHost; // Has upstream dataset. + + if (hasUpstream) { + var result = this._applyTransform(upSourceMgrList); + + resultSourceList = result.sourceList; + upstreamSignList = result.upstreamSignList; + } // Is root dataset. + else { + var sourceData = datasetModel.get('source', true); + resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)]; + upstreamSignList = []; + } + } + + if ("development" !== 'production') { + assert(resultSourceList && upstreamSignList); + } + + this._setLocalSource(resultSourceList, upstreamSignList); + }; + + SourceManager.prototype._applyTransform = function (upMgrList) { + var datasetModel = this._sourceHost; + var transformOption = datasetModel.get('transform', true); + var fromTransformResult = datasetModel.get('fromTransformResult', true); + + if ("development" !== 'production') { + assert(fromTransformResult != null || transformOption != null); + } + + if (fromTransformResult != null) { + var errMsg = ''; + + if (upMgrList.length !== 1) { + if ("development" !== 'production') { + errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset'; + } + + doThrow(errMsg); + } + } + + var sourceList; + var upSourceList = []; + var upstreamSignList = []; + each(upMgrList, function (upMgr) { + upMgr.prepareSource(); + var upSource = upMgr.getSource(fromTransformResult || 0); + var errMsg = ''; + + if (fromTransformResult != null && !upSource) { + if ("development" !== 'production') { + errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult; + } + + doThrow(errMsg); + } + + upSourceList.push(upSource); + upstreamSignList.push(upMgr._getVersionSign()); + }); + + if (transformOption) { + sourceList = applyDataTransform(transformOption, upSourceList, { + datasetIndex: datasetModel.componentIndex + }); + } else if (fromTransformResult != null) { + sourceList = [cloneSourceShallow(upSourceList[0])]; + } + + return { + sourceList: sourceList, + upstreamSignList: upstreamSignList + }; + }; + + SourceManager.prototype._isDirty = function () { + if (this._dirty) { + return true; + } // All sourceList is from the some upstream. + + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + for (var i = 0; i < upSourceMgrList.length; i++) { + var upSrcMgr = upSourceMgrList[i]; + + if ( // Consider the case that there is ancestor diry, call it recursively. + // The performance is probably not an issue because usually the chain is not long. + upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) { + return true; + } + } + }; + /** + * @param sourceIndex By default 0, means "main source". + * In most cases there is only one source. + */ + + + SourceManager.prototype.getSource = function (sourceIndex) { + sourceIndex = sourceIndex || 0; + var source = this._sourceList[sourceIndex]; + + if (!source) { + // Series may share source instance with dataset. + var upSourceMgrList = this._getUpstreamSourceManagers(); + + return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex); + } + + return source; + }; + /** + * + * Get a data store which can be shared across series. + * Only available for series. + * + * @param seriesDimRequest Dimensions that are generated in series. + * Should have been sorted by `storeDimIndex` asc. + */ + + + SourceManager.prototype.getSharedDataStore = function (seriesDimRequest) { + if ("development" !== 'production') { + assert(isSeries(this._sourceHost), 'Can only call getDataStore on series source manager.'); + } + + var schema = seriesDimRequest.makeStoreSchema(); + return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash); + }; + + SourceManager.prototype._innerGetDataStore = function (storeDims, seriesSource, sourceReadKey) { + // TODO Can use other sourceIndex? + var sourceIndex = 0; + var storeList = this._storeList; + var cachedStoreMap = storeList[sourceIndex]; + + if (!cachedStoreMap) { + cachedStoreMap = storeList[sourceIndex] = {}; + } + + var cachedStore = cachedStoreMap[sourceReadKey]; + + if (!cachedStore) { + var upSourceMgr = this._getUpstreamSourceManagers()[0]; + + if (isSeries(this._sourceHost) && upSourceMgr) { + cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey); + } else { + cachedStore = new DataStore(); // Always create store from source of series. + + cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims); + } + + cachedStoreMap[sourceReadKey] = cachedStore; + } + + return cachedStore; + }; + /** + * PENDING: Is it fast enough? + * If no upstream, return empty array. + */ + + + SourceManager.prototype._getUpstreamSourceManagers = function () { + // Always get the relationship from the raw option. + // Do not cache the link of the dependency graph, so that + // there is no need to update them when change happens. + var sourceHost = this._sourceHost; + + if (isSeries(sourceHost)) { + var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); + return !datasetModel ? [] : [datasetModel.getSourceManager()]; + } else { + return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) { + return datasetModel.getSourceManager(); + }); + } + }; + + SourceManager.prototype._getSourceMetaRawOption = function () { + var sourceHost = this._sourceHost; + var seriesLayoutBy; + var sourceHeader; + var dimensions; + + if (isSeries(sourceHost)) { + seriesLayoutBy = sourceHost.get('seriesLayoutBy', true); + sourceHeader = sourceHost.get('sourceHeader', true); + dimensions = sourceHost.get('dimensions', true); + } // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them. + else if (!this._getUpstreamSourceManagers().length) { + var model = sourceHost; + seriesLayoutBy = model.get('seriesLayoutBy', true); + sourceHeader = model.get('sourceHeader', true); + dimensions = model.get('dimensions', true); + } + + return { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }; + }; + + return SourceManager; + }(); + // disable the transform merge, but do not disable transform clone from rawOption. + + function disableTransformOptionMerge(datasetModel) { + var transformOption = datasetModel.option.transform; + transformOption && setAsPrimitive(datasetModel.option.transform); + } + + function isSeries(sourceHost) { + // Avoid circular dependency with Series.ts + return sourceHost.mainType === 'series'; + } + + function doThrow(errMsg) { + throw new Error(errMsg); + } + + var TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1'; // TODO: more textStyle option + + function getTooltipTextStyle(textStyle, renderMode) { + var nameFontColor = textStyle.color || '#6e7079'; + var nameFontSize = textStyle.fontSize || 12; + var nameFontWeight = textStyle.fontWeight || '400'; + var valueFontColor = textStyle.color || '#464646'; + var valueFontSize = textStyle.fontSize || 14; + var valueFontWeight = textStyle.fontWeight || '900'; + + if (renderMode === 'html') { + // `textStyle` is probably from user input, should be encoded to reduce security risk. + return { + // eslint-disable-next-line max-len + nameStyle: "font-size:" + encodeHTML(nameFontSize + '') + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ''), + // eslint-disable-next-line max-len + valueStyle: "font-size:" + encodeHTML(valueFontSize + '') + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + '') + }; + } else { + return { + nameStyle: { + fontSize: nameFontSize, + fill: nameFontColor, + fontWeight: nameFontWeight + }, + valueStyle: { + fontSize: valueFontSize, + fill: valueFontColor, + fontWeight: valueFontWeight + } + }; + } + } // See `TooltipMarkupLayoutIntent['innerGapLevel']`. + // (value from UI design) + + + var HTML_GAPS = [0, 10, 20, 30]; + var RICH_TEXT_GAPS = ['', '\n', '\n\n', '\n\n\n']; // eslint-disable-next-line max-len + + function createTooltipMarkup(type, option) { + option.type = type; + return option; + } + + function isSectionFragment(frag) { + return frag.type === 'section'; + } + + function getBuilder(frag) { + return isSectionFragment(frag) ? buildSection : buildNameValue; + } + + function getBlockGapLevel(frag) { + if (isSectionFragment(frag)) { + var gapLevel_1 = 0; + var subBlockLen = frag.blocks.length; + var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader; + each(frag.blocks, function (subBlock) { + var subGapLevel = getBlockGapLevel(subBlock); // If the some of the sub-blocks have some gaps (like 10px) inside, this block + // should use a larger gap (like 20px) to distinguish those sub-blocks. + + if (subGapLevel >= gapLevel_1) { + gapLevel_1 = subGapLevel + +(hasInnerGap_1 && ( // 0 always can not be readable gap level. + !subGapLevel // If no header, always keep the sub gap level. Otherwise + // look weird in case `multipleSeries`. + || isSectionFragment(subBlock) && !subBlock.noHeader)); + } + }); + return gapLevel_1; + } + + return 0; + } + + function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var noHeader = fragment.noHeader; + var gaps = getGap(getBlockGapLevel(fragment)); + var subMarkupTextList = []; + var subBlocks = fragment.blocks || []; + assert(!subBlocks || isArray(subBlocks)); + subBlocks = subBlocks || []; + var orderMode = ctx.orderMode; + + if (fragment.sortBlocks && orderMode) { + subBlocks = subBlocks.slice(); + var orderMap = { + valueAsc: 'asc', + valueDesc: 'desc' + }; + + if (hasOwn(orderMap, orderMode)) { + var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); + subBlocks.sort(function (a, b) { + return comparator_1.evaluate(a.sortParam, b.sortParam); + }); + } // FIXME 'seriesDesc' necessary? + else if (orderMode === 'seriesDesc') { + subBlocks.reverse(); + } + } + + each(subBlocks, function (subBlock, idx) { + var valueFormatter = fragment.valueFormatter; + var subMarkupText = getBuilder(subBlock)( // Inherit valueFormatter + valueFormatter ? extend(extend({}, ctx), { + valueFormatter: valueFormatter + }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle); + subMarkupText != null && subMarkupTextList.push(subMarkupText); + }); + var subMarkupText = ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(subMarkupTextList.join(''), noHeader ? topMarginForOuterGap : gaps.html); + + if (noHeader) { + return subMarkupText; + } + + var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC); + var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; + + if (ctx.renderMode === 'richText') { + return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; + } else { + return wrapBlockHTML("
" + encodeHTML(displayableHeader) + '
' + subMarkupText, topMarginForOuterGap); + } + } + + function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var renderMode = ctx.renderMode; + var noName = fragment.noName; + var noValue = fragment.noValue; + var noMarker = !fragment.markerType; + var name = fragment.name; + var useUTC = ctx.useUTC; + + var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function (value) { + value = isArray(value) ? value : [value]; + return map(value, function (val, idx) { + return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); + }); + }; + + if (noName && noValue) { + return; + } + + var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || '#333', renderMode); + var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC); + var valueTypeOption = fragment.valueType; + var readableValueList = noValue ? [] : valueFormatter(fragment.value); + var valueAlignRight = !noMarker || !noName; // It little weird if only value next to marker but far from marker. + + var valueCloseToMarker = !noMarker && noName; + + var _a = getTooltipTextStyle(toolTipTextStyle, renderMode), + nameStyle = _a.nameStyle, + valueStyle = _a.valueStyle; + + return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle)) // Value has commas inside, so use ' ' as delimiter for multiple values. + + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML((noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); + } + /** + * @return markupText. null/undefined means no content. + */ + + + function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { + if (!fragment) { + return; + } + + var builder = getBuilder(fragment); + var ctx = { + useUTC: useUTC, + renderMode: renderMode, + orderMode: orderMode, + markupStyleCreator: markupStyleCreator, + valueFormatter: fragment.valueFormatter + }; + return builder(ctx, fragment, 0, toolTipTextStyle); + } + + function getGap(gapLevel) { + return { + html: HTML_GAPS[gapLevel], + richText: RICH_TEXT_GAPS[gapLevel] + }; + } + + function wrapBlockHTML(encodedContent, topGap) { + var clearfix = '
'; + var marginCSS = "margin: " + topGap + "px 0 0"; + return "
" + encodedContent + clearfix + '
'; + } + + function wrapInlineNameHTML(name, leftHasMarker, style) { + var marginCss = leftHasMarker ? 'margin-left:2px' : ''; + return "" + encodeHTML(name) + ''; + } + + function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { + // Do not too close to marker, considering there are multiple values separated by spaces. + var paddingStr = valueCloseToMarker ? '10px' : '20px'; + var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ''; + valueList = isArray(valueList) ? valueList : [valueList]; + return "" // Value has commas inside, so use ' ' as delimiter for multiple values. + + map(valueList, function (value) { + return encodeHTML(value); + }).join('  ') + ''; + } + + function wrapInlineNameRichText(ctx, name, style) { + return ctx.markupStyleCreator.wrapRichTextStyle(name, style); + } + + function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) { + var styles = [style]; + var paddingLeft = valueCloseToMarker ? 10 : 20; + alignRight && styles.push({ + padding: [0, 0, 0, paddingLeft], + align: 'right' + }); // Value has commas inside, so use ' ' as delimiter for multiple values. + + return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join(' ') : values, styles); + } + + function retrieveVisualColorForTooltipMarker(series, dataIndex) { + var style = series.getData().getItemVisual(dataIndex, 'style'); + var color = style[series.visualDrawType]; + return convertToColorString(color); + } + function getPaddingFromTooltipModel(model, renderMode) { + var padding = model.get('padding'); + return padding != null ? padding // We give slightly different to look pretty. + : renderMode === 'richText' ? [8, 10] : 10; + } + /** + * The major feature is generate styles for `renderMode: 'richText'`. + * But it also serves `renderMode: 'html'` to provide + * "renderMode-independent" API. + */ + + var TooltipMarkupStyleCreator = + /** @class */ + function () { + function TooltipMarkupStyleCreator() { + this.richTextStyles = {}; // Notice that "generate a style name" usually happens repeatedly when mouse is moving and + // a tooltip is displayed. So we put the `_nextStyleNameId` as a member of each creator + // rather than static shared by all creators (which will cause it increase to fast). + + this._nextStyleNameId = getRandomIdBase(); + } + + TooltipMarkupStyleCreator.prototype._generateStyleName = function () { + return '__EC_aUTo_' + this._nextStyleNameId++; + }; + + TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) { + var markerId = renderMode === 'richText' ? this._generateStyleName() : null; + var marker = getTooltipMarker({ + color: colorStr, + type: markerType, + renderMode: renderMode, + markerId: markerId + }); + + if (isString(marker)) { + return marker; + } else { + if ("development" !== 'production') { + assert(markerId); + } + + this.richTextStyles[markerId] = marker.style; + return marker.content; + } + }; + /** + * @usage + * ```ts + * const styledText = markupStyleCreator.wrapRichTextStyle([ + * // The styles will be auto merged. + * { + * fontSize: 12, + * color: 'blue' + * }, + * { + * padding: 20 + * } + * ]); + * ``` + */ + + + TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) { + var finalStl = {}; + + if (isArray(styles)) { + each(styles, function (stl) { + return extend(finalStl, stl); + }); + } else { + extend(finalStl, styles); + } + + var styleName = this._generateStyleName(); + + this.richTextStyles[styleName] = finalStl; + return "{" + styleName + "|" + text + "}"; + }; + + return TooltipMarkupStyleCreator; + }(); + + function defaultSeriesFormatTooltip(opt) { + var series = opt.series; + var dataIndex = opt.dataIndex; + var multipleSeries = opt.multipleSeries; + var data = series.getData(); + var tooltipDims = data.mapDimensionsAll('defaultedTooltip'); + var tooltipDimLen = tooltipDims.length; + var value = series.getRawValue(dataIndex); + var isValueArr = isArray(value); + var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); // Complicated rule for pretty tooltip. + + var inlineValue; + var inlineValueType; + var subBlocks; + var sortParam; + + if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { + var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); + inlineValue = formatArrResult.inlineValues; + inlineValueType = formatArrResult.inlineValueTypes; + subBlocks = formatArrResult.blocks; // Only support tooltip sort by the first inline value. It's enough in most cases. + + sortParam = formatArrResult.inlineValues[0]; + } else if (tooltipDimLen) { + var dimInfo = data.getDimensionInfo(tooltipDims[0]); + sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); + inlineValueType = dimInfo.type; + } else { + sortParam = inlineValue = isValueArr ? value[0] : value; + } // Do not show generated series name. It might not be readable. + + + var seriesNameSpecified = isNameSpecified(series); + var seriesName = seriesNameSpecified && series.name || ''; + var itemName = data.getName(dataIndex); + var inlineName = multipleSeries ? seriesName : itemName; + return createTooltipMarkup('section', { + header: seriesName, + // When series name is not specified, do not show a header line with only '-'. + // This case always happens in tooltip.trigger: 'item'. + noHeader: multipleSeries || !seriesNameSpecified, + sortParam: sortParam, + blocks: [createTooltipMarkup('nameValue', { + markerType: 'item', + markerColor: markerColor, + // Do not mix display seriesName and itemName in one tooltip, + // which might confuses users. + name: inlineName, + // name dimension might be auto assigned, where the name might + // be not readable. So we check trim here. + noName: !trim(inlineName), + value: inlineValue, + valueType: inlineValueType + })].concat(subBlocks || []) + }); + } + + function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { + // check: category-no-encode-has-axis-data in dataset.html + var data = series.getData(); + var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, false); + var inlineValues = []; + var inlineValueTypes = []; + var blocks = []; + tooltipDims.length ? each(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) // By default, all dims is used on tooltip. + : each(value, setEachItem); + + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); // If `dimInfo.tooltip` is not set, show tooltip. + + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + + if (isValueMultipleLine) { + blocks.push(createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: colorStr, + name: dimInfo.displayName, + value: val, + valueType: dimInfo.type + })); + } else { + inlineValues.push(val); + inlineValueTypes.push(dimInfo.type); + } + } + + return { + inlineValues: inlineValues, + inlineValueTypes: inlineValueTypes, + blocks: blocks + }; + } + + var inner$1 = makeInner(); + + function getSelectionKey(data, dataIndex) { + return data.getName(dataIndex) || data.getId(dataIndex); + } + + var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled'; + + var SeriesModel = + /** @class */ + function (_super) { + __extends(SeriesModel, _super); + + function SeriesModel() { + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, + // the class members must not be initialized in constructor or declaration place. + // Otherwise there is bad case: + // class A {xxx = 1;} + // enableClassExtend(A); + // class B extends A {} + // var C = B.extend({xxx: 5}); + // var c = new C(); + // console.log(c.xxx); // expect 5 but always 1. + var _this = _super !== null && _super.apply(this, arguments) || this; // --------------------------------------- + // Props about data selection + // --------------------------------------- + + + _this._selectedDataIndicesMap = {}; + return _this; + } + + SeriesModel.prototype.init = function (option, parentModel, ecModel) { + this.seriesIndex = this.componentIndex; + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = { + model: this + }; + this.mergeDefaultAndTheme(option, ecModel); + var sourceManager = inner$1(this).sourceManager = new SourceManager(this); + sourceManager.prepareSource(); + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + + if ("development" !== 'production') { + assert(data, 'getInitialData returned invalid data.'); + } + + inner$1(this).dataBeforeProcessed = data; // If we reverse the order (make data firstly, and then make + // dataBeforeProcessed by cloneShallow), cloneShallow will + // cause data.graph.data !== data when using + // module:echarts/data/Graph or module:echarts/data/Tree. + // See module:echarts/data/helper/linkSeriesData + // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model + // init or merge stage, because the data can be restored. So we do not `restoreData` + // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. + // Call `seriesModel.getRawData()` instead. + // this.restoreData(); + + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + /** + * Util for merge default and theme to option + */ + + + SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; // Backward compat: using subType on theme. + // But if name duplicate between series subType + // (for example: parallel) add component mainType, + // add suffix 'Series'. + + var themeSubType = this.subType; + + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += 'Series'; + } + + merge(option, ecModel.getTheme().get(this.subType)); + merge(option, this.getDefaultOption()); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + this.fillDataTextStyle(option.data); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) { + // this.settingTask.dirty(); + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + + var sourceManager = inner$1(this).sourceManager; + sourceManager.dirty(); + sourceManager.prepareSource(); + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + inner$1(this).dataBeforeProcessed = data; + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + + SeriesModel.prototype.fillDataTextStyle = function (data) { + // Default data label emphasis `show` + // FIXME Tree structure data ? + // FIXME Performance ? + if (data && !isTypedArray(data)) { + var props = ['show']; + + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], 'label', props); + } + } + } + }; + /** + * Init a data structure from data related option in series + * Must be overridden. + */ + + + SeriesModel.prototype.getInitialData = function (option, ecModel) { + return; + }; + /** + * Append data to list + */ + + + SeriesModel.prototype.appendData = function (params) { + // FIXME ??? + // (1) If data from dataset, forbidden append. + // (2) support append data of dataset. + var data = this.getRawData(); + data.appendData(params.data); + }; + /** + * Consider some method like `filter`, `map` need make new data, + * We should make sure that `seriesModel.getData()` get correct + * data in the stream procedure. So we fetch data from upstream + * each time `task.perform` called. + */ + + + SeriesModel.prototype.getData = function (dataType) { + var task = getCurrentTask(this); + + if (task) { + var data = task.context.data; + return dataType == null ? data : data.getLinkedData(dataType); + } else { + // When series is not alive (that may happen when click toolbox + // restore or setOption with not merge mode), series data may + // be still need to judge animation or something when graphic + // elements want to know whether fade out. + return inner$1(this).data; + } + }; + + SeriesModel.prototype.getAllData = function () { + var mainData = this.getData(); + return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ + data: mainData + }]; + }; + + SeriesModel.prototype.setData = function (data) { + var task = getCurrentTask(this); + + if (task) { + var context = task.context; // Consider case: filter, data sample. + // FIXME:TS never used, so comment it + // if (context.data !== data && task.modifyOutputEnd) { + // task.setOutputEnd(data.count()); + // } + + context.outputData = data; // Caution: setData should update context.data, + // Because getData may be called multiply in a + // single stage and expect to get the data just + // set. (For example, AxisProxy, x y both call + // getData and setDate sequentially). + // So the context.data should be fetched from + // upstream each time when a stage starts to be + // performed. + + if (task !== this.dataTask) { + context.data = data; + } + } + + inner$1(this).data = data; + }; + + SeriesModel.prototype.getEncode = function () { + var encode = this.get('encode', true); + + if (encode) { + return createHashMap(encode); + } + }; + + SeriesModel.prototype.getSourceManager = function () { + return inner$1(this).sourceManager; + }; + + SeriesModel.prototype.getSource = function () { + return this.getSourceManager().getSource(); + }; + /** + * Get data before processed + */ + + + SeriesModel.prototype.getRawData = function () { + return inner$1(this).dataBeforeProcessed; + }; + + SeriesModel.prototype.getColorBy = function () { + var colorBy = this.get('colorBy'); + return colorBy || 'series'; + }; + + SeriesModel.prototype.isColorBySeries = function () { + return this.getColorBy() === 'series'; + }; + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overridden for some chart. + * @return {type} description + */ + + + SeriesModel.prototype.getBaseAxis = function () { + var coordSys = this.coordinateSystem; // @ts-ignore + + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }; + /** + * Default tooltip formatter + * + * @param dataIndex + * @param multipleSeries + * @param dataType + * @param renderMode valid values: 'html'(by default) and 'richText'. + * 'html' is used for rendering tooltip in extra DOM form, and the result + * string is used as DOM HTML content. + * 'richText' is used for rendering tooltip in rich text form, for those where + * DOM operation is not supported. + * @return formatted tooltip with `html` and `markers` + * Notice: The override method can also return string + */ + + + SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + return defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + }; + + SeriesModel.prototype.isAnimationEnabled = function () { + var ecModel = this.ecModel; // Disable animation if using echarts in node but not give ssr flag. + // In ssr mode, renderToString will generate svg with css animation. + + if (env.node && !(ecModel && ecModel.ssr)) { + return false; + } + + var animationEnabled = this.getShallow('animation'); + + if (animationEnabled) { + if (this.getData().count() > this.getShallow('animationThreshold')) { + animationEnabled = false; + } + } + + return !!animationEnabled; + }; + + SeriesModel.prototype.restoreData = function () { + this.dataTask.dirty(); + }; + + SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) { + var ecModel = this.ecModel; // PENDING + + var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); + + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + + return color; + }; + /** + * Use `data.mapDimensionsAll(coordDim)` instead. + * @deprecated + */ + + + SeriesModel.prototype.coordDimToDataDim = function (coordDim) { + return this.getRawData().mapDimensionsAll(coordDim); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressive = function () { + return this.get('progressive'); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressiveThreshold = function () { + return this.get('progressiveThreshold'); + }; // PENGING If selectedMode is null ? + + + SeriesModel.prototype.select = function (innerDataIndices, dataType) { + this._innerSelect(this.getData(dataType), innerDataIndices); + }; + + SeriesModel.prototype.unselect = function (innerDataIndices, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return; + } + + var selectedMode = this.option.selectedMode; + var data = this.getData(dataType); + + if (selectedMode === 'series' || selectedMap === 'all') { + this.option.selectedMap = {}; + this._selectedDataIndicesMap = {}; + return; + } + + for (var i = 0; i < innerDataIndices.length; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + } + }; + + SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) { + var tmpArr = []; + + for (var i = 0; i < innerDataIndices.length; i++) { + tmpArr[0] = innerDataIndices[i]; + this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); + } + }; + + SeriesModel.prototype.getSelectedDataIndices = function () { + if (this.option.selectedMap === 'all') { + return [].slice.call(this.getData().getIndices()); + } + + var selectedDataIndicesMap = this._selectedDataIndicesMap; + var nameOrIds = keys(selectedDataIndicesMap); + var dataIndices = []; + + for (var i = 0; i < nameOrIds.length; i++) { + var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; + + if (dataIndex >= 0) { + dataIndices.push(dataIndex); + } + } + + return dataIndices; + }; + + SeriesModel.prototype.isSelected = function (dataIndex, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return false; + } + + var data = this.getData(dataType); + return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']); + }; + + SeriesModel.prototype.isUniversalTransitionEnabled = function () { + if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { + return true; + } + + var universalTransitionOpt = this.option.universalTransition; // Quick reject + + if (!universalTransitionOpt) { + return false; + } + + if (universalTransitionOpt === true) { + return true; + } // Can be simply 'universalTransition: true' + + + return universalTransitionOpt && universalTransitionOpt.enabled; + }; + + SeriesModel.prototype._innerSelect = function (data, innerDataIndices) { + var _a, _b; + + var option = this.option; + var selectedMode = option.selectedMode; + var len = innerDataIndices.length; + + if (!selectedMode || !len) { + return; + } + + if (selectedMode === 'series') { + option.selectedMap = 'all'; + } else if (selectedMode === 'multiple') { + if (!isObject(option.selectedMap)) { + option.selectedMap = {}; + } + + var selectedMap = option.selectedMap; + + for (var i = 0; i < len; i++) { + var dataIndex = innerDataIndices[i]; // TODO different types of data share same object. + + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = true; + this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); + } + } else if (selectedMode === 'single' || selectedMode === true) { + var lastDataIndex = innerDataIndices[len - 1]; + var nameOrId = getSelectionKey(data, lastDataIndex); + option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); + this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); + } + }; + + SeriesModel.prototype._initSelectedMapFromData = function (data) { + // Ignore select info in data if selectedMap exists. + // NOTE It's only for legacy usage. edge data is not supported. + if (this.option.selectedMap) { + return; + } + + var dataIndices = []; + + if (data.hasItemOption) { + data.each(function (idx) { + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem.selected) { + dataIndices.push(idx); + } + }); + } + + if (dataIndices.length > 0) { + this._innerSelect(data, dataIndices); + } + }; // /** + // * @see {module:echarts/stream/Scheduler} + // */ + // abstract pipeTask: null + + + SeriesModel.registerClass = function (clz) { + return ComponentModel.registerClass(clz); + }; + + SeriesModel.protoInitialize = function () { + var proto = SeriesModel.prototype; + proto.type = 'series.__base__'; + proto.seriesIndex = 0; + proto.ignoreStyleOnData = false; + proto.hasSymbolVisual = false; + proto.defaultSymbol = 'circle'; // Make sure the values can be accessed! + + proto.visualStyleAccessPath = 'itemStyle'; + proto.visualDrawType = 'fill'; + }(); + + return SeriesModel; + }(ComponentModel); + + mixin(SeriesModel, DataFormatMixin); + mixin(SeriesModel, PaletteMixin); + mountExtend(SeriesModel, ComponentModel); + /** + * MUST be called after `prepareSource` called + * Here we need to make auto series, especially for auto legend. But we + * do not modify series.name in option to avoid side effects. + */ + + function autoSeriesName(seriesModel) { + // User specified name has higher priority, otherwise it may cause + // series can not be queried unexpectedly. + var name = seriesModel.name; + + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } + } + + function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimensionsAll('seriesName'); + var nameArr = []; + each(dataDims, function (dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(' '); + } + + function dataTaskCount(context) { + return context.model.getRawData().count(); + } + + function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; + } + + function dataTaskProgress(param, context) { + // Avoid repeat cloneShallow when data just created in reset. + if (context.outputData && param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } + } // TODO refactor + + + function wrapData(data, seriesModel) { + each(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) { + data.wrapMethod(methodName, curry(onDataChange, seriesModel)); + }); + } + + function onDataChange(seriesModel, newList) { + var task = getCurrentTask(seriesModel); + + if (task) { + // Consider case: filter, selectRange + task.setOutputEnd((newList || this).count()); + } + + return newList; + } + + function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + + if (pipeline) { + // When pipline finished, the currrentTask keep the last + // task (renderTask). + var task = pipeline.currentTask; + + if (task) { + var agentStubMap = task.agentStubMap; + + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + + return task; + } + } + + var ComponentView = + /** @class */ + function () { + function ComponentView() { + this.group = new Group(); + this.uid = getUID('viewComponent'); + } + + ComponentView.prototype.init = function (ecModel, api) {}; + + ComponentView.prototype.render = function (model, ecModel, api, payload) {}; + + ComponentView.prototype.dispose = function (ecModel, api) {}; + + ComponentView.prototype.updateView = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {// Do nothing; + }; + /** + * Hook for toggle blur target series. + * Can be used in marker for blur or leave blur the markers + */ + + + ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {// Do nothing; + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ComponentView.prototype.eachRendered = function (cb) { + var group = this.group; + + if (group) { + group.traverse(cb); + } + }; + + return ComponentView; + }(); + enableClassExtend(ComponentView); + enableClassManagement(ComponentView); + + /** + * @return {string} If large mode changed, return string 'reset'; + */ + + function createRenderPlanner() { + var inner = makeInner(); + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + var originalLarge = !!fields.large; + var originalProgressive = !!fields.progressiveRender; // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + + var large = fields.large = !!(pipelineContext && pipelineContext.large); + var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); + return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset'; + }; + } + + var inner$2 = makeInner(); + var renderPlanner = createRenderPlanner(); + + var ChartView = + /** @class */ + function () { + function ChartView() { + this.group = new Group(); + this.uid = getUID('viewChart'); + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = { + view: this + }; + } + + ChartView.prototype.init = function (ecModel, api) {}; + + ChartView.prototype.render = function (seriesModel, ecModel, api, payload) { + if ("development" !== 'production') { + throw new Error('render method must been implemented'); + } + }; + /** + * Highlight series or specified data item. + */ + + + ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'emphasis'); + }; + /** + * Downplay series or specified data item. + */ + + + ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'normal'); + }; + /** + * Remove self. + */ + + + ChartView.prototype.remove = function (ecModel, api) { + this.group.removeAll(); + }; + /** + * Dispose self. + */ + + + ChartView.prototype.dispose = function (ecModel, api) {}; + + ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ChartView.prototype.eachRendered = function (cb) { + traverseElements(this.group, cb); + }; + + ChartView.markUpdateMethod = function (payload, methodName) { + inner$2(payload).updateMethod = methodName; + }; + + ChartView.protoInitialize = function () { + var proto = ChartView.prototype; + proto.type = 'chart'; + }(); + + return ChartView; + }(); + /** + * Set state of single element + */ + + function elSetState(el, state, highlightDigit) { + if (el && isHighDownDispatcher(el)) { + (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit); + } + } + + function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; + + if (dataIndex != null) { + each(normalizeToArray(dataIndex), function (dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); + }); + } else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state, highlightDigit); + }); + } + } + + enableClassExtend(ChartView, ['dispose']); + enableClassManagement(ChartView); + + function renderTaskPlan(context) { + return renderPlanner(context.model); + } + + function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; // FIXME: remove updateView updateVisual + + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + var updateMethod = payload && inner$2(payload).updateMethod; + var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount + // is less than progressive threshold. + : 'render'; + + if (methodName !== 'render') { + view[methodName](seriesModel, ecModel, api, payload); + } + + return progressMethodMap[methodName]; + } + + var progressMethodMap = { + incrementalPrepareRender: { + progress: function (params, context) { + context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function (params, context) { + context.view.render(context.model, context.ecModel, context.api, context.payload); + } + } + }; + + /* + * 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. + */ + + /* + * 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. + */ + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + var THROTTLE_TYPE = '\0__throttleType'; + /** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ + + function throttle(fn, delay, debounce) { + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + delay = delay || 0; + + function exec() { + lastExec = new Date().getTime(); + timer = null; + fn.apply(scope, args || []); + } + + var cb = function () { + var cbArgs = []; + + for (var _i = 0; _i < arguments.length; _i++) { + cbArgs[_i] = arguments[_i]; + } + + currCall = new Date().getTime(); + scope = this; + args = cbArgs; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + clearTimeout(timer); // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } else { + if (diff >= 0) { + exec(); + } else { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + /** + * Clear throttle. + * @public + */ + + + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + /** + * Enable debounce once. + */ + + + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + + return cb; + } + /** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + */ + + function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || !throttleType) { + return obj[fnAttr] = originFn; + } + + fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + + return fn; + } + /** + * Clear throttle. Example see throttle.createOrUpdate. + */ + + function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + + if (fn && fn[ORIGIN_METHOD]) { + // Clear throttle + fn.clear && fn.clear(); + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + } + + var inner$3 = makeInner(); + var defaultStyleMappers = { + itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), + lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) + }; + var defaultColorKey = { + lineStyle: 'stroke', + itemStyle: 'fill' + }; + + function getStyleMapper(seriesModel, stylePath) { + var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; + + if (!styleMapper) { + console.warn("Unknown style type '" + stylePath + "'."); + return defaultStyleMappers.itemStyle; + } + + return styleMapper; + } + + function getDefaultColorKey(seriesModel, stylePath) { + // return defaultColorKey[stylePath] || + var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; + + if (!colorKey) { + console.warn("Unknown style type '" + stylePath + "'."); + return 'fill'; + } + + return colorKey; + } + + var seriesStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var styleModel = seriesModel.getModel(stylePath); + var getStyle = getStyleMapper(seriesModel, stylePath); + var globalStyle = getStyle(styleModel); + var decalOption = styleModel.getShallow('decal'); + + if (decalOption) { + data.setVisual('decal', decalOption); + decalOption.dirty = true; + } // TODO + + + var colorKey = getDefaultColorKey(seriesModel, stylePath); + var color = globalStyle[colorKey]; // TODO style callback + + var colorCallback = isFunction(color) ? color : null; + var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto'; // Get from color palette by default. + + if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { + // Note: If some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Because some scenarios users need to make some series + // transparent or as background, which should better not effect the palette. + var colorPalette = seriesModel.getColorFromPalette( // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount()); + + if (!globalStyle[colorKey]) { + globalStyle[colorKey] = colorPalette; + data.setVisual('colorFromPalette', true); + } + + globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill; + globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke; + } + + data.setVisual('style', globalStyle); + data.setVisual('drawType', colorKey); // Only visible series has each data be visual encoded + + if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { + data.setVisual('colorFromPalette', false); + return { + dataEach: function (data, idx) { + var dataParams = seriesModel.getDataParams(idx); + var itemStyle = extend({}, globalStyle); + itemStyle[colorKey] = colorCallback(dataParams); + data.setItemVisual(idx, 'style', itemStyle); + } + }; + } + } + }; + var sharedModel = new Model(); + var dataStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var getStyle = getStyleMapper(seriesModel, stylePath); + var colorKey = data.getVisual('drawType'); + return { + dataEach: data.hasItemOption ? function (data, idx) { + // Not use getItemModel for performance considuration + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem[stylePath]) { + sharedModel.option = rawItem[stylePath]; + var style = getStyle(sharedModel); + var existsStyle = data.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + if (sharedModel.option.decal) { + data.setItemVisual(idx, 'decal', sharedModel.option.decal); + sharedModel.option.decal.dirty = true; + } + + if (colorKey in style) { + data.setItemVisual(idx, 'colorFromPalette', false); + } + } + } : null + }; + } + }; // Pick color from palette for the data which has not been set with color yet. + // Note: do not support stream rendering. No such cases yet. + + var dataColorPaletteTask = { + performRawSeries: true, + overallReset: function (ecModel) { + // Each type of series uses one scope. + // Pie and funnel are using different scopes. + var paletteScopeGroupByType = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var colorBy = seriesModel.getColorBy(); + + if (seriesModel.isColorBySeries()) { + return; + } + + var key = seriesModel.type + '-' + colorBy; + var colorScope = paletteScopeGroupByType.get(key); + + if (!colorScope) { + colorScope = {}; + paletteScopeGroupByType.set(key, colorScope); + } + + inner$3(seriesModel).scope = colorScope; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + var colorScope = inner$3(seriesModel).scope; + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + var colorKey = getDefaultColorKey(seriesModel, stylePath); + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); // Iterate on data before filtered. To make sure color from palette can be + // Consistent when toggling legend. + + dataAll.each(function (rawIdx) { + var idx = idxMap[rawIdx]; + var fromPalette = data.getItemVisual(idx, 'colorFromPalette'); // Get color from palette for each data only when the color is inherited from series color, which is + // also picked from color palette. So following situation is not in the case: + // 1. series.itemStyle.color is set + // 2. color is encoded by visualMap + + if (fromPalette) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + var name_1 = dataAll.getName(rawIdx) || rawIdx + ''; + var dataCount = dataAll.count(); + itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); + } + }); + }); + } + }; + + var PI$3 = Math.PI; + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + + function defaultLoading(api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + textColor: '#000', + fontSize: 12, + fontWeight: 'normal', + fontStyle: 'normal', + fontFamily: 'sans-serif', + maskColor: 'rgba(255, 255, 255, 0.8)', + showSpinner: true, + color: '#5470c6', + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var group = new Group(); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + group.add(mask); + var textContent = new ZRText({ + style: { + text: opts.text, + fill: opts.textColor, + fontSize: opts.fontSize, + fontWeight: opts.fontWeight, + fontStyle: opts.fontStyle, + fontFamily: opts.fontFamily + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new Rect({ + style: { + fill: 'none' + }, + textContent: textContent, + textConfig: { + position: 'right', + distance: 10 + }, + zlevel: opts.zlevel, + z: 10001 + }); + group.add(labelRect); + var arc; + + if (opts.showSpinner) { + arc = new Arc({ + shape: { + startAngle: -PI$3 / 2, + endAngle: -PI$3 / 2 + 0.1, + r: opts.spinnerRadius + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: opts.lineWidth + }, + zlevel: opts.zlevel, + z: 10001 + }); + arc.animateShape(true).when(1000, { + endAngle: PI$3 * 3 / 2 + }).start('circularInOut'); + arc.animateShape(true).when(1000, { + startAngle: PI$3 * 3 / 2 + }).delay(300).start('circularInOut'); + group.add(arc); + } // Inject resize + + + group.resize = function () { + var textWidth = textContent.getBoundingRect().width; + var r = opts.showSpinner ? opts.spinnerRadius : 0; // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2 + // textDistance needs to be calculated when both animation and text exist + + var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) // only show the text + + (opts.showSpinner ? 0 : textWidth / 2) // only show the spinner + + (textWidth ? 0 : r); + var cy = api.getHeight() / 2; + opts.showSpinner && arc.setShape({ + cx: cx, + cy: cy + }); + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + + group.resize(); + return group; + } + + var Scheduler = + /** @class */ + function () { + function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) { + // key: handlerUID + this._stageTaskMap = createHashMap(); + this.ecInstance = ecInstance; + this.api = api; // Fix current processors in case that in some rear cases that + // processors might be registered after echarts instance created. + // Register processors incrementally for a echarts instance is + // not supported by this stream architecture. + + dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + } + + Scheduler.prototype.restoreData = function (ecModel, payload) { + // TODO: Only restore needed series and components, but not all components. + // Currently `restoreData` of all of the series and component will be called. + // But some independent components like `title`, `legend`, `graphic`, `toolbox`, + // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`, + // and some components like coordinate system, axes, dataZoom, visualMap only + // need their target series refresh. + // (1) If we are implementing this feature some day, we should consider these cases: + // if a data processor depends on a component (e.g., dataZoomProcessor depends + // on the settings of `dataZoom`), it should be re-performed if the component + // is modified by `setOption`. + // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`, + // it should be re-performed when the result array of `getTargetSeries` changed. + // We use `dependencies` to cover these issues. + // (3) How to update target series when coordinate system related components modified. + // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty, + // and this case all of the tasks will be set as dirty. + ecModel.restoreData(payload); // Theoretically an overall task not only depends on each of its target series, but also + // depends on all of the series. + // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks + // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure + // that the overall task is set as dirty and to be performed, otherwise it probably cause + // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it + // probably cause state chaos (consider `dataZoomProcessor`). + + this._stageTaskMap.each(function (taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); + }; // If seriesModel provided, incremental threshold is check by series data. + + + Scheduler.prototype.getPerformArgs = function (task, isBlock) { + // For overall task + if (!task.__pipeline) { + return; + } + + var pipeline = this._pipelineMap.get(task.__pipeline.id); + + var pCtx = pipeline.context; + var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; + return { + step: step, + modBy: modBy, + modDataCount: modDataCount + }; + }; + + Scheduler.prototype.getPipeline = function (pipelineId) { + return this._pipelineMap.get(pipelineId); + }; + /** + * Current, progressive rendering starts from visual and layout. + * Always detect render mode in the same stage, avoiding that incorrect + * detection caused by data filtering. + * Caution: + * `updateStreamModes` use `seriesModel.getData()`. + */ + + + Scheduler.prototype.updateStreamModes = function (seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + + var data = seriesModel.getData(); + var dataLen = data.count(); // `progressiveRender` means that can render progressively in each + // animation frame. Note that some types of series do not provide + // `view.incrementalPrepareRender` but support `chart.appendData`. We + // use the term `incremental` but not `progressive` to describe the + // case that `chart.appendData`. + + var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; + var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint. + // see `test/candlestick-large3.html` + + var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null; + seriesModel.pipelineContext = pipeline.context = { + progressiveRender: progressiveRender, + modDataCount: modDataCount, + large: large + }; + }; + + Scheduler.prototype.restorePipelines = function (ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + + scheduler._pipe(seriesModel, seriesModel.dataTask); + }); + }; + + Scheduler.prototype.prepareStageTasks = function () { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.api.getModel(); + var api = this.api; + each(this._allHandlers, function (handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); + var errMsg = ''; + + if ("development" !== 'production') { + // Currently do not need to support to sepecify them both. + errMsg = '"reset" and "overallReset" must not be both specified.'; + } + + assert(!(handler.reset && handler.overallReset), errMsg); + handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); + handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); + }, this); + }; + + Scheduler.prototype.prepareView = function (view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + context.model = model; + context.ecModel = ecModel; + context.api = api; + renderTask.__block = !view.incrementalPrepareRender; + + this._pipe(model, renderTask); + }; + + Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) { + // If we do not use `block` here, it should be considered when to update modes. + this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { + block: true + }); + }; + + Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) { + this._performStageTasks(this._visualHandlers, ecModel, payload, opt); + }; + + Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished = false; + var scheduler = this; + each(stageHandlers, function (stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + + if (overallTask) { + var overallNeedDirty_1; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function (stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty_1 = true; + } + }); + overallNeedDirty_1 && overallTask.dirty(); + scheduler.updatePayload(overallTask, payload); + var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); // Execute stubs firstly, which may set the overall task dirty, + // then execute the overall task. And stub will call seriesModel.setData, + // which ensures that in the overallTask seriesModel.getData() will not + // return incorrect data. + + agentStubMap.each(function (stub) { + stub.perform(performArgs_1); + }); + + if (overallTask.perform(performArgs_1)) { + unfinished = true; + } + } else if (seriesTaskMap) { + seriesTaskMap.each(function (task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + + var performArgs = scheduler.getPerformArgs(task, opt.block); // FIXME + // if intending to declare `performRawSeries` in handlers, only + // stream-independent (specifically, data item independent) operations can be + // performed. Because if a series is filtered, most of the tasks will not + // be performed. A stream-dependent operation probably cause wrong biz logic. + // Perhaps we should not provide a separate callback for this case instead + // of providing the config `performRawSeries`. The stream-dependent operations + // and stream-independent operations should better not be mixed. + + performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); + scheduler.updatePayload(task, payload); + + if (task.perform(performArgs)) { + unfinished = true; + } + }); + } + }); + + function needSetDirty(opt, task) { + return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id)); + } + + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.performSeriesTasks = function (ecModel) { + var unfinished; + ecModel.eachSeries(function (seriesModel) { + // Progress to the end for dataInit and dataRestore. + unfinished = seriesModel.dataTask.perform() || unfinished; + }); + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.plan = function () { + // Travel pipelines, check block. + this._pipelineMap.each(function (pipeline) { + var task = pipeline.tail; + + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + + task = task.getUpstream(); + } while (task); + }); + }; + + Scheduler.prototype.updatePayload = function (task, payload) { + payload !== 'remain' && (task.context.payload = payload); + }; + + Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily, + // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`, + // it works but it may cause other irrelevant charts blocked. + + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } else if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, create); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + + function create(seriesModel) { + var pipelineId = seriesModel.uid; // Init tasks for each seriesModel only once. + // Reuse original task instance. + + var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel: ecModel, + api: api, + // PENDING: `useClearVisual` not used? + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler: scheduler + }; + + scheduler._pipe(seriesModel, task); + } + }; + + Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask // For overall task, the function only be called on reset stage. + || createTask({ + reset: overallTaskReset + }); + overallTask.context = { + ecModel: ecModel, + api: api, + overallReset: stageHandler.overallReset, + scheduler: scheduler + }; + var oldAgentStubMap = overallTask.agentStubMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newAgentStubMap = overallTask.agentStubMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var shouldOverallTaskDirty = false; // FIXME:TS never used, so comment it + // let modifyOutputEnd = stageHandler.modifyOutputEnd; + // An overall task with seriesType detected or has `getTargetSeries`, we add + // stub in each pipelines, it will set the overall task dirty when the pipeline + // progress. Moreover, to avoid call the overall task each frame (too frequent), + // we set the pipeline block. + + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '"createOnAllSeries" is not supported for "overallReset", ' + 'because it will block all streams.'; + } + + assert(!stageHandler.createOnAllSeries, errMsg); + + if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, createStub); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } // Otherwise, (usually it is legacy case), the overall task will only be + // executed when upstream is dirty. Otherwise the progressive rendering of all + // pipelines will be disabled unexpectedly. But it still needs stubs to receive + // dirty info from upstream. + else { + overallProgress = false; + each(ecModel.getSeries(), createStub); + } + + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || ( // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + shouldOverallTaskDirty = true, createTask({ + reset: stubReset, + onDirty: stubOnDirty + }))); + stub.context = { + model: seriesModel, + overallProgress: overallProgress // FIXME:TS never used, so comment it + // modifyOutputEnd: modifyOutputEnd + + }; + stub.agent = overallTask; + stub.__block = overallProgress; + + scheduler._pipe(seriesModel, stub); + } + + if (shouldOverallTaskDirty) { + overallTask.dirty(); + } + }; + + Scheduler.prototype._pipe = function (seriesModel, task) { + var pipelineId = seriesModel.uid; + + var pipeline = this._pipelineMap.get(pipelineId); + + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; + }; + + Scheduler.wrapStageHandler = function (stageHandler, visualType) { + if (isFunction(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + + stageHandler.uid = getUID('stageHandler'); + visualType && (stageHandler.visualType = visualType); + return stageHandler; + }; + return Scheduler; + }(); + + function overallTaskReset(context) { + context.overallReset(context.ecModel, context.api, context.payload); + } + + function stubReset(context) { + return context.overallProgress && stubProgress; + } + + function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); + } + + function stubOnDirty() { + this.agent && this.agent.dirty(); + } + + function seriesTaskPlan(context) { + return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; + } + + function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + + var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); + return resetDefines.length > 1 ? map(resetDefines, function (v, idx) { + return makeSeriesTaskProgress(idx); + }) : singleSeriesTaskProgress; + } + + var singleSeriesTaskProgress = makeSeriesTaskProgress(0); + + function makeSeriesTaskProgress(resetDefineIdx) { + return function (params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; + } + + function seriesTaskCount(context) { + return context.data.count(); + } + /** + * Only some legacy stage handlers (usually in echarts extensions) are pure function. + * To ensure that they can work normally, they should work in block mode, that is, + * they should not be started util the previous tasks finished. So they cause the + * progressive rendering disabled. We try to detect the series type, to narrow down + * the block range to only the series type they concern, but not all series. + */ + + + function detectSeriseType(legacyFunc) { + seriesType = null; + + try { + // Assume there is no async when calling `eachSeriesByType`. + legacyFunc(ecModelMock, apiMock); + } catch (e) {} + + return seriesType; + } + + var ecModelMock = {}; + var apiMock = {}; + var seriesType; + mockMethods(ecModelMock, GlobalModel); + mockMethods(apiMock, ExtensionAPI); + + ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) { + seriesType = type; + }; + + ecModelMock.eachComponent = function (cond) { + if (cond.mainType === 'series' && cond.subType) { + seriesType = cond.subType; + } + }; + + function mockMethods(target, Clz) { + /* eslint-disable */ + for (var name_1 in Clz.prototype) { + // Do not use hasOwnProperty + target[name_1] = noop; + } + /* eslint-enable */ + + } + + /* + * 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. + */ + + /* + * 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. + */ + var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; + var lightTheme = { + color: colorAll, + colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll] + }; + + /* + * 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. + */ + + /* + * 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. + */ + var contrastColor = '#B9B8CE'; + var backgroundColor = '#100C2A'; + + var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + color: '#484753' + } + }, + splitArea: { + areaStyle: { + color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)'] + } + }, + minorSplitLine: { + lineStyle: { + color: '#20203B' + } + } + }; + }; + + var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff']; + var theme = { + darkMode: true, + color: colorPalette, + backgroundColor: backgroundColor, + axisPointer: { + lineStyle: { + color: '#817f91' + }, + crossStyle: { + color: '#817f91' + }, + label: { + // TODO Contrast of label backgorundColor + color: '#fff' + } + }, + legend: { + textStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: '#EEF1FA' + }, + subtextStyle: { + color: '#B9B8CE' + } + }, + toolbox: { + iconStyle: { + borderColor: contrastColor + } + }, + dataZoom: { + borderColor: '#71708A', + textStyle: { + color: contrastColor + }, + brushStyle: { + color: 'rgba(135,163,206,0.3)' + }, + handleStyle: { + color: '#353450', + borderColor: '#C5CBE3' + }, + moveHandleStyle: { + color: '#B0B6C3', + opacity: 0.3 + }, + fillerColor: 'rgba(135,163,206,0.2)', + emphasis: { + handleStyle: { + borderColor: '#91B7F2', + color: '#4D587D' + }, + moveHandleStyle: { + color: '#636D9A', + opacity: 0.7 + } + }, + dataBackground: { + lineStyle: { + color: '#71708A', + width: 1 + }, + areaStyle: { + color: '#71708A' + } + }, + selectedDataBackground: { + lineStyle: { + color: '#87A3CE' + }, + areaStyle: { + color: '#87A3CE' + } + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + label: { + color: contrastColor + }, + controlStyle: { + color: contrastColor, + borderColor: contrastColor + } + }, + calendar: { + itemStyle: { + color: backgroundColor + }, + dayLabel: { + color: contrastColor + }, + monthLabel: { + color: contrastColor + }, + yearLabel: { + color: contrastColor + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + color: contrastColor + }, + axisLine: { + lineStyle: { + color: [[1, 'rgba(207,212,219,0.2)']] + } + }, + axisLabel: { + color: contrastColor + }, + detail: { + color: '#EEF1FA' + } + }, + candlestick: { + itemStyle: { + color: '#f64e56', + color0: '#54ea92', + borderColor: '#f64e56', + borderColor0: '#54ea92' // borderColor: '#ca2824', + // borderColor0: '#09a443' + + } + } + }; + theme.categoryAxis.splitLine.show = false; + + /** + * Usage of query: + * `chart.on('click', query, handler);` + * The `query` can be: + * + The component type query string, only `mainType` or `mainType.subType`, + * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'. + * + The component query object, like: + * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`, + * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`. + * + The data query object, like: + * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`. + * + The other query object (cmponent customized query), like: + * `{element: 'some'}` (only available in custom series). + * + * Caveat: If a prop in the `query` object is `null/undefined`, it is the + * same as there is no such prop in the `query` object. + */ + + var ECEventProcessor = + /** @class */ + function () { + function ECEventProcessor() {} + + ECEventProcessor.prototype.normalizeQuery = function (query) { + var cptQuery = {}; + var dataQuery = {}; + var otherQuery = {}; // `query` is `mainType` or `mainType.subType` of component. + + if (isString(query)) { + var condCptType = parseClassType(query); // `.main` and `.sub` may be ''. + + cptQuery.mainType = condCptType.main || null; + cptQuery.subType = condCptType.sub || null; + } // `query` is an object, convert to {mainType, index, name, id}. + else { + // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved, + // can not be used in `compomentModel.filterForExposedEvent`. + var suffixes_1 = ['Index', 'Name', 'Id']; + var dataKeys_1 = { + name: 1, + dataIndex: 1, + dataType: 1 + }; + each(query, function (val, key) { + var reserved = false; + + for (var i = 0; i < suffixes_1.length; i++) { + var propSuffix = suffixes_1[i]; + var suffixPos = key.lastIndexOf(propSuffix); + + if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { + var mainType = key.slice(0, suffixPos); // Consider `dataIndex`. + + if (mainType !== 'data') { + cptQuery.mainType = mainType; + cptQuery[propSuffix.toLowerCase()] = val; + reserved = true; + } + } + } + + if (dataKeys_1.hasOwnProperty(key)) { + dataQuery[key] = val; + reserved = true; + } + + if (!reserved) { + otherQuery[key] = val; + } + }); + } + + return { + cptQuery: cptQuery, + dataQuery: dataQuery, + otherQuery: otherQuery + }; + }; + + ECEventProcessor.prototype.filter = function (eventType, query) { + // They should be assigned before each trigger call. + var eventInfo = this.eventInfo; + + if (!eventInfo) { + return true; + } + + var targetEl = eventInfo.targetEl; + var packedEvent = eventInfo.packedEvent; + var model = eventInfo.model; + var view = eventInfo.view; // For event like 'globalout'. + + if (!model || !view) { + return true; + } + + var cptQuery = query.cptQuery; + var dataQuery = query.dataQuery; + return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); + + function check(query, host, prop, propOnHost) { + return query[prop] == null || host[propOnHost || prop] === query[prop]; + } + }; + + ECEventProcessor.prototype.afterTrigger = function () { + // Make sure the eventInfo won't be used in next trigger. + this.eventInfo = null; + }; + + return ECEventProcessor; + }(); + + var SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset']; + var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']); // Encoding visual for all series include which is filtered for legend drawing + + var seriesSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + + if (seriesModel.legendIcon) { + data.setVisual('legendIcon', seriesModel.legendIcon); + } + + if (!seriesModel.hasSymbolVisual) { + return; + } + + var symbolOptions = {}; + var symbolOptionsCb = {}; + var hasCallback = false; + + for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { + var symbolPropName = SYMBOL_PROPS_WITH_CB[i]; + var val = seriesModel.get(symbolPropName); + + if (isFunction(val)) { + hasCallback = true; + symbolOptionsCb[symbolPropName] = val; + } else { + symbolOptions[symbolPropName] = val; + } + } + + symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; + data.setVisual(extend({ + legendIcon: seriesModel.legendIcon || symbolOptions.symbol, + symbolKeepAspect: seriesModel.get('symbolKeepAspect') + }, symbolOptions)); // Only visible series has each data be visual encoded + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var symbolPropsCb = keys(symbolOptionsCb); + + function dataEach(data, idx) { + var rawValue = seriesModel.getRawValue(idx); + var params = seriesModel.getDataParams(idx); + + for (var i = 0; i < symbolPropsCb.length; i++) { + var symbolPropName = symbolPropsCb[i]; + data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params)); + } + } + + return { + dataEach: hasCallback ? dataEach : null + }; + } + }; + var dataSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (!seriesModel.hasSymbolVisual) { + return; + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + + for (var i = 0; i < SYMBOL_PROPS.length; i++) { + var symbolPropName = SYMBOL_PROPS[i]; + var val = itemModel.getShallow(symbolPropName, true); + + if (val != null) { + data.setItemVisual(idx, symbolPropName, val); + } + } + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function getItemVisualFromData(data, dataIndex, key) { + switch (key) { + case 'color': + var style = data.getItemVisual(dataIndex, 'style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getItemVisual(dataIndex, 'style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getItemVisual(dataIndex, key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function getVisualFromData(data, key) { + switch (key) { + case 'color': + var style = data.getVisual('style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getVisual('style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getVisual(key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function setItemVisualFromData(data, dataIndex, key, value) { + switch (key) { + case 'color': + // Make sure not sharing style object. + var style = data.ensureUniqueItemVisual(dataIndex, 'style'); + style[data.getVisual('drawType')] = value; // Mark the color has been changed, not from palette anymore + + data.setItemVisual(dataIndex, 'colorFromPalette', false); + break; + + case 'opacity': + data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value; + break; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + data.setItemVisual(dataIndex, key, value); + break; + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + // Includes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect + + function createLegacyDataSelectAction(seriesType, ecRegisterAction) { + function getSeriesIndices(ecModel, payload) { + var seriesIndices = []; + ecModel.eachComponent({ + mainType: 'series', + subType: seriesType, + query: payload + }, function (seriesModel) { + seriesIndices.push(seriesModel.seriesIndex); + }); + return seriesIndices; + } + + each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) { + ecRegisterAction(eventsMap[0], function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog(payload.type, eventsMap[1]); + } + + api.dispatchAction(extend(payload, { + type: eventsMap[1], + seriesIndex: getSeriesIndices(ecModel, payload) + })); + }); + }); + } + + function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { + var legacyEventName = type + eventPostfix; + + if (!ecIns.isSilent(legacyEventName)) { + if ("development" !== 'production') { + deprecateLog("event " + legacyEventName + " is deprecated."); + } + + ecModel.eachComponent({ + mainType: 'series', + subType: 'pie' + }, function (seriesModel) { + var seriesIndex = seriesModel.seriesIndex; + var selectedMap = seriesModel.option.selectedMap; + var selected = payload.selected; + + for (var i = 0; i < selected.length; i++) { + if (selected[i].seriesIndex === seriesIndex) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload.fromActionPayload); + ecIns.trigger(legacyEventName, { + type: legacyEventName, + seriesId: seriesModel.id, + name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), + selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) + }); + } + } + }); + } + } + + function handleLegacySelectEvents(messageCenter, ecIns, api) { + messageCenter.on('selectchanged', function (params) { + var ecModel = api.getModel(); + + if (params.isFromClick) { + handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params); + } else if (params.fromAction === 'select') { + handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params); + } else if (params.fromAction === 'unselect') { + handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params); + } + }); + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function findEventDispatcher(target, det, returnFirstMatch) { + var found; + + while (target) { + if (det(target)) { + found = target; + + if (returnFirstMatch) { + break; + } + } + + target = target.__hostTarget || target.parent; + } + + return found; + } + + var wmUniqueIndex = Math.round(Math.random() * 9); + var supportDefineProperty = typeof Object.defineProperty === 'function'; + var WeakMap = (function () { + function WeakMap() { + this._id = '__ec_inner_' + wmUniqueIndex++; + } + WeakMap.prototype.get = function (key) { + return this._guard(key)[this._id]; + }; + WeakMap.prototype.set = function (key, value) { + var target = this._guard(key); + if (supportDefineProperty) { + Object.defineProperty(target, this._id, { + value: value, + enumerable: false, + configurable: true + }); + } + else { + target[this._id] = value; + } + return this; + }; + WeakMap.prototype["delete"] = function (key) { + if (this.has(key)) { + delete this._guard(key)[this._id]; + return true; + } + return false; + }; + WeakMap.prototype.has = function (key) { + return !!this._guard(key)[this._id]; + }; + WeakMap.prototype._guard = function (key) { + if (key !== Object(key)) { + throw TypeError('Value of WeakMap is not a non-null object.'); + } + return key; + }; + return WeakMap; + }()); + + /** + * Triangle shape + * @inner + */ + + var Triangle = Path.extend({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + + var Diamond = Path.extend({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + /** + * Pin shape + * @inner + */ + + var Pin = Path.extend({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; // Height must be larger than width + + var h = Math.max(w, shape.height); + var r = w / 2; // Dist on y with tangent point and circle center + + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); // Dist on x with tangent point and circle center + + var dx = Math.cos(angle) * r; + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.moveTo(x - dx, cy + dy); + path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); + path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); + path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); + path.closePath(); + } + }); + /** + * Arrow shape + * @inner + */ + + var Arrow = Path.extend({ + type: 'arrow', + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + /** + * Map of path constructors + */ + // TODO Use function to build symbol path. + + var symbolCtors = { + line: Line, + rect: Rect, + roundRect: Rect, + square: Rect, + circle: Circle, + diamond: Diamond, + pin: Pin, + arrow: Arrow, + triangle: Triangle + }; + var symbolShapeMakers = { + line: function (x, y, w, h, shape) { + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + var symbolBuildProxies = {}; + each(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); + }); + var SymbolClz = Path.extend({ + type: 'symbol', + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + calculateTextPosition: function (out, config, rect) { + var res = calculateTextPosition(out, config, rect); + var shape = this.shape; + + if (shape && shape.symbolType === 'pin' && config.position === 'inside') { + res.y = rect.y + rect.height * 0.4; + } + + return res; + }, + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + + if (symbolType !== 'none') { + var proxySymbol = symbolBuildProxies[symbolType]; + + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + + symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); + proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); + } + } + }); // Provide setColor helper method to avoid determine if set the fill or stroke outside + + function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + + if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; // TODO Same width with lineStyle in LineView + + symbolStyle.lineWidth = 2; + } else if (this.shape.symbolType === 'line') { + symbolStyle.stroke = color; + } else { + symbolStyle.fill = color; + } + + this.markRedraw(); + } + } + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + */ + + + function createSymbol(symbolType, x, y, w, h, color, // whether to keep the ratio of w/h, + keepAspect) { + // TODO Support image object, DynamicImage. + var isEmpty = symbolType.indexOf('empty') === 0; + + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; // TODO Should deprecate setColor + + symbolPath.setColor = symbolPathSetColor; + + if (color) { + symbolPath.setColor(color); + } + + return symbolPath; + } + function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + + return [symbolSize[0] || 0, symbolSize[1] || 0]; + } + function normalizeSymbolOffset(symbolOffset, symbolSize) { + if (symbolOffset == null) { + return; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } + + return [parsePercent$1(symbolOffset[0], symbolSize[0]) || 0, parsePercent$1(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; + } + + function isSafeNum(num) { + return isFinite(num); + } + function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + x = isSafeNum(x) ? x : 0; + x2 = isSafeNum(x2) ? x2 : 1; + y = isSafeNum(y) ? y : 0; + y2 = isSafeNum(y2) ? y2 : 0; + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + return canvasGradient; + } + function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + x = isSafeNum(x) ? x : 0.5; + y = isSafeNum(y) ? y : 0.5; + r = r >= 0 && isSafeNum(r) ? r : 0.5; + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + return canvasGradient; + } + function getCanvasGradient(ctx, obj, rect) { + var canvasGradient = obj.type === 'radial' + ? createRadialGradient(ctx, obj, rect) + : createLinearGradient(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color); + } + return canvasGradient; + } + function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) { + return false; + } + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + return false; + } + function parseInt10(val) { + return parseInt(val, 10); + } + function getSize(root, whIdx, opts) { + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0)) | 0; + } + + function normalizeLineDash(lineType, lineWidth) { + if (!lineType || lineType === 'solid' || !(lineWidth > 0)) { + return null; + } + return lineType === 'dashed' + ? [4 * lineWidth, 2 * lineWidth] + : lineType === 'dotted' + ? [lineWidth] + : isNumber(lineType) + ? [lineType] : isArray(lineType) ? lineType : null; + } + function getLineDash(el) { + var style = el.style; + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + if (lineDash) { + var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_1 && lineScale_1 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / lineScale_1; + }); + lineDashOffset /= lineScale_1; + } + } + return [lineDash, lineDashOffset]; + } + + var pathProxyForDraw = new PathProxy(true); + function styleHasStroke(style) { + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + } + function isValidStrokeFillStyle(strokeOrFill) { + return typeof strokeOrFill === 'string' && strokeOrFill !== 'none'; + } + function styleHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + function doFillPath(ctx, style) { + if (style.fillOpacity != null && style.fillOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.fillOpacity * style.opacity; + ctx.fill(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.fill(); + } + } + function doStrokePath(ctx, style) { + if (style.strokeOpacity != null && style.strokeOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.strokeOpacity * style.opacity; + ctx.stroke(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.stroke(); + } + } + function createCanvasPattern(ctx, pattern, el) { + var image = createOrUpdateImage(pattern.image, pattern.__image, el); + if (isImageReady(image)) { + var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat'); + if (typeof DOMMatrix === 'function' + && canvasPattern + && canvasPattern.setTransform) { + var matrix = new DOMMatrix(); + matrix.translateSelf((pattern.x || 0), (pattern.y || 0)); + matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE); + matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1)); + canvasPattern.setTransform(matrix); + } + return canvasPattern; + } + } + function brushPath(ctx, el, style, inBatch) { + var _a; + var hasStroke = styleHasStroke(style); + var hasFill = styleHasFill(style); + var strokePercent = style.strokePercent; + var strokePart = strokePercent < 1; + var firstDraw = !el.path; + if ((!el.silent || strokePart) && firstDraw) { + el.createPathProxy(); + } + var path = el.path || pathProxyForDraw; + var dirtyFlag = el.__dirty; + if (!inBatch) { + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!fill.colorStops; + var hasStrokeGradient = hasStroke && !!stroke.colorStops; + var hasFillPattern = hasFill && !!fill.image; + var hasStrokePattern = hasStroke && !!stroke.image; + var fillGradient = void 0; + var strokeGradient = void 0; + var fillPattern = void 0; + var strokePattern = void 0; + var rect = void 0; + if (hasFillGradient || hasStrokeGradient) { + rect = el.getBoundingRect(); + } + if (hasFillGradient) { + fillGradient = dirtyFlag + ? getCanvasGradient(ctx, fill, rect) + : el.__canvasFillGradient; + el.__canvasFillGradient = fillGradient; + } + if (hasStrokeGradient) { + strokeGradient = dirtyFlag + ? getCanvasGradient(ctx, stroke, rect) + : el.__canvasStrokeGradient; + el.__canvasStrokeGradient = strokeGradient; + } + if (hasFillPattern) { + fillPattern = (dirtyFlag || !el.__canvasFillPattern) + ? createCanvasPattern(ctx, fill, el) + : el.__canvasFillPattern; + el.__canvasFillPattern = fillPattern; + } + if (hasStrokePattern) { + strokePattern = (dirtyFlag || !el.__canvasStrokePattern) + ? createCanvasPattern(ctx, stroke, el) + : el.__canvasStrokePattern; + el.__canvasStrokePattern = fillPattern; + } + if (hasFillGradient) { + ctx.fillStyle = fillGradient; + } + else if (hasFillPattern) { + if (fillPattern) { + ctx.fillStyle = fillPattern; + } + else { + hasFill = false; + } + } + if (hasStrokeGradient) { + ctx.strokeStyle = strokeGradient; + } + else if (hasStrokePattern) { + if (strokePattern) { + ctx.strokeStyle = strokePattern; + } + else { + hasStroke = false; + } + } + } + var scale = el.getGlobalScale(); + path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold); + var lineDash; + var lineDashOffset; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + var needsRebuild = true; + if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) { + path.setDPR(ctx.dpr); + if (strokePart) { + path.setContext(null); + } + else { + path.setContext(ctx); + needsRebuild = false; + } + path.reset(); + el.buildPath(path, el.shape, inBatch); + path.toStatic(); + el.pathUpdated(); + } + if (needsRebuild) { + path.rebuildPath(ctx, strokePart ? strokePercent : 1); + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (!inBatch) { + if (style.strokeFirst) { + if (hasStroke) { + doStrokePath(ctx, style); + } + if (hasFill) { + doFillPath(ctx, style); + } + } + else { + if (hasFill) { + doFillPath(ctx, style); + } + if (hasStroke) { + doStrokePath(ctx, style); + } + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + function brushImage(ctx, el, style) { + var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload); + if (!image || !isImageReady(image)) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var width = el.getWidth(); + var height = el.getHeight(); + var aspect = image.width / image.height; + if (width == null && height != null) { + width = height * aspect; + } + else if (height == null && width != null) { + height = width / aspect; + } + else if (width == null && height == null) { + width = image.width; + height = image.height; + } + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height); + } + else { + ctx.drawImage(image, x, y, width, height); + } + } + function brushText(ctx, el, style) { + var _a; + var text = style.text; + text != null && (text += ''); + if (text) { + ctx.font = style.font || DEFAULT_FONT; + ctx.textAlign = style.textAlign; + ctx.textBaseline = style.textBaseline; + var lineDash = void 0; + var lineDashOffset = void 0; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (style.strokeFirst) { + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + } + else { + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + } + var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + var STROKE_PROPS = [ + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] + ]; + function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) { + var styleChanged = false; + if (!forceSetAll) { + prevStyle = prevStyle || {}; + if (style === prevStyle) { + return false; + } + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + flushPathDrawn(ctx, scope); + styleChanged = true; + var opacity = Math.max(Math.min(style.opacity, 1), 0); + ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity; + } + if (forceSetAll || style.blend !== prevStyle.blend) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend; + } + for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) { + var propName = SHADOW_NUMBER_PROPS[i]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = ctx.dpr * (style[propName] || 0); + } + } + if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor; + } + return styleChanged; + } + function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) { + var style = getStyle(el, scope.inHover); + var prevStyle = forceSetAll + ? null + : (prevEl && getStyle(prevEl, scope.inHover) || {}); + if (style === prevStyle) { + return false; + } + var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope); + if (forceSetAll || style.fill !== prevStyle.fill) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill); + } + if (forceSetAll || style.stroke !== prevStyle.stroke) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke); + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + if (el.hasStroke()) { + var lineWidth = style.lineWidth; + var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1); + if (ctx.lineWidth !== newLineWidth) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.lineWidth = newLineWidth; + } + } + for (var i = 0; i < STROKE_PROPS.length; i++) { + var prop = STROKE_PROPS[i]; + var propName = prop[0]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = style[propName] || prop[1]; + } + } + return styleChanged; + } + function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) { + return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope); + } + function setContextTransform(ctx, el) { + var m = el.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } + else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + } + function updateClipStatus(clipPaths, ctx, scope) { + var allClipped = false; + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + allClipped = allClipped || clipPath.isZeroArea(); + setContextTransform(ctx, clipPath); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + } + scope.allClipped = allClipped; + } + function isTransformChanged(m0, m1) { + if (m0 && m1) { + return m0[0] !== m1[0] + || m0[1] !== m1[1] + || m0[2] !== m1[2] + || m0[3] !== m1[3] + || m0[4] !== m1[4] + || m0[5] !== m1[5]; + } + else if (!m0 && !m1) { + return false; + } + return true; + } + var DRAW_TYPE_PATH = 1; + var DRAW_TYPE_IMAGE = 2; + var DRAW_TYPE_TEXT = 3; + var DRAW_TYPE_INCREMENTAL = 4; + function canPathBatch(style) { + var hasFill = styleHasFill(style); + var hasStroke = styleHasStroke(style); + return !(style.lineDash + || !(+hasFill ^ +hasStroke) + || (hasFill && typeof style.fill !== 'string') + || (hasStroke && typeof style.stroke !== 'string') + || style.strokePercent < 1 + || style.strokeOpacity < 1 + || style.fillOpacity < 1); + } + function flushPathDrawn(ctx, scope) { + scope.batchFill && ctx.fill(); + scope.batchStroke && ctx.stroke(); + scope.batchFill = ''; + scope.batchStroke = ''; + } + function getStyle(el, inHover) { + return inHover ? (el.__hoverStyle || el.style) : el.style; + } + function brushSingle(ctx, el) { + brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true); + } + function brush(ctx, el, scope, isLast) { + var m = el.transform; + if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) { + el.__dirty &= ~REDRAW_BIT; + el.__isRendered = false; + return; + } + var clipPaths = el.__clipPaths; + var prevElClipPaths = scope.prevElClipPaths; + var forceSetTransform = false; + var forceSetStyle = false; + if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) { + if (prevElClipPaths && prevElClipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.restore(); + forceSetStyle = forceSetTransform = true; + scope.prevElClipPaths = null; + scope.allClipped = false; + scope.prevEl = null; + } + if (clipPaths && clipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.save(); + updateClipStatus(clipPaths, ctx, scope); + forceSetTransform = true; + } + scope.prevElClipPaths = clipPaths; + } + if (scope.allClipped) { + el.__isRendered = false; + return; + } + el.beforeBrush && el.beforeBrush(); + el.innerBeforeBrush(); + var prevEl = scope.prevEl; + if (!prevEl) { + forceSetStyle = forceSetTransform = true; + } + var canBatchPath = el instanceof Path + && el.autoBatch + && canPathBatch(el.style); + if (forceSetTransform || isTransformChanged(m, prevEl.transform)) { + flushPathDrawn(ctx, scope); + setContextTransform(ctx, el); + } + else if (!canBatchPath) { + flushPathDrawn(ctx, scope); + } + var style = getStyle(el, scope.inHover); + if (el instanceof Path) { + if (scope.lastDrawType !== DRAW_TYPE_PATH) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_PATH; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) { + ctx.beginPath(); + } + brushPath(ctx, el, style, canBatchPath); + if (canBatchPath) { + scope.batchFill = style.fill || ''; + scope.batchStroke = style.stroke || ''; + } + } + else { + if (el instanceof TSpan) { + if (scope.lastDrawType !== DRAW_TYPE_TEXT) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_TEXT; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + brushText(ctx, el, style); + } + else if (el instanceof ZRImage) { + if (scope.lastDrawType !== DRAW_TYPE_IMAGE) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_IMAGE; + } + bindImageStyle(ctx, el, prevEl, forceSetStyle, scope); + brushImage(ctx, el, style); + } + else if (el.getTemporalDisplayables) { + if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_INCREMENTAL; + } + brushIncremental(ctx, el, scope); + } + } + if (canBatchPath && isLast) { + flushPathDrawn(ctx, scope); + } + el.innerAfterBrush(); + el.afterBrush && el.afterBrush(); + scope.prevEl = el; + el.__dirty = 0; + el.__isRendered = true; + } + function brushIncremental(ctx, el, scope) { + var displayables = el.getDisplayables(); + var temporalDisplayables = el.getTemporalDisplayables(); + ctx.save(); + var innerScope = { + prevElClipPaths: null, + prevEl: null, + allClipped: false, + viewWidth: scope.viewWidth, + viewHeight: scope.viewHeight, + inHover: scope.inHover + }; + var i; + var len; + for (i = el.getCursor(), len = displayables.length; i < len; i++) { + var displayable = displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i === len - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) { + var displayable = temporalDisplayables[i_1]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i_1 === len_1 - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + el.clearTemporalDisplayables(); + el.notClear = true; + ctx.restore(); + } + + var decalMap = new WeakMap(); + var decalCache = new LRU(100); + var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight']; + /** + * Create or update pattern image from decal options + * + * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal + * @return {Pattern} pattern with generated image, null if no decal + */ + + function createOrUpdatePatternFromDecal(decalObject, api) { + if (decalObject === 'none') { + return null; + } + + var dpr = api.getDevicePixelRatio(); + var zr = api.getZr(); + var isSVG = zr.painter.type === 'svg'; + + if (decalObject.dirty) { + decalMap["delete"](decalObject); + } + + var oldPattern = decalMap.get(decalObject); + + if (oldPattern) { + return oldPattern; + } + + var decalOpt = defaults(decalObject, { + symbol: 'rect', + symbolSize: 1, + symbolKeepAspect: true, + color: 'rgba(0, 0, 0, 0.2)', + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + + if (decalOpt.backgroundColor === 'none') { + decalOpt.backgroundColor = null; + } + + var pattern = { + repeat: 'repeat' + }; + setPatternnSource(pattern); + pattern.rotation = decalOpt.rotation; + pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; + decalMap.set(decalObject, pattern); + decalObject.dirty = false; + return pattern; + + function setPatternnSource(pattern) { + var keys = [dpr]; + var isValidKey = true; + + for (var i = 0; i < decalKeys.length; ++i) { + var value = decalOpt[decalKeys[i]]; + + if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== 'boolean') { + isValidKey = false; + break; + } + + keys.push(value); + } + + var cacheKey; + + if (isValidKey) { + cacheKey = keys.join(',') + (isSVG ? '-svg' : ''); + var cache = decalCache.get(cacheKey); + + if (cache) { + isSVG ? pattern.svgElement = cache : pattern.image = cache; + } + } + + var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); + var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); + var symbolArray = normalizeSymbolArray(decalOpt.symbol); + var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); + var lineBlockLengthY = getLineBlockLengthY(dashArrayY); + var canvas = !isSVG && platformApi.createCanvas(); + var svgRoot = isSVG && { + tag: 'g', + attrs: {}, + key: 'dcl', + children: [] + }; + var pSize = getPatternSize(); + var ctx; + + if (canvas) { + canvas.width = pSize.width * dpr; + canvas.height = pSize.height * dpr; + ctx = canvas.getContext('2d'); + } + + brushDecal(); + + if (isValidKey) { + decalCache.put(cacheKey, canvas || svgRoot); + } + + pattern.image = canvas; + pattern.svgElement = svgRoot; + pattern.svgWidth = pSize.width; + pattern.svgHeight = pSize.height; + /** + * Get minimum length that can make a repeatable pattern. + * + * @return {Object} pattern width and height + */ + + function getPatternSize() { + /** + * For example, if dash is [[3, 2], [2, 1]] for X, it looks like + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * So the minimum length of X is 15, + * which is the least common multiple of `3 + 2` and `2 + 1` + * |--- --- --- |--- --- ... + * |-- -- -- -- -- |-- -- -- ... + */ + var width = 1; + + for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) { + width = getLeastCommonMultiple(width, lineBlockLengthsX[i]); + } + + var symbolRepeats = 1; + + for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) { + symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length); + } + + width *= symbolRepeats; + var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; + + if ("development" !== 'production') { + var warn = function (attrName) { + /* eslint-disable-next-line */ + console.warn("Calculated decal size is greater than " + attrName + " due to decal option settings so " + attrName + " is used for the decal size. Please consider changing the decal option to make a smaller decal or set " + attrName + " to be larger to avoid incontinuity."); + }; + + if (width > decalOpt.maxTileWidth) { + warn('maxTileWidth'); + } + + if (height > decalOpt.maxTileHeight) { + warn('maxTileHeight'); + } + } + + return { + width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), + height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) + }; + } + + function brushDecal() { + if (ctx) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + if (decalOpt.backgroundColor) { + ctx.fillStyle = decalOpt.backgroundColor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + } + + var ySum = 0; + + for (var i = 0; i < dashArrayY.length; ++i) { + ySum += dashArrayY[i]; + } + + if (ySum <= 0) { + // dashArrayY is 0, draw nothing + return; + } + + var y = -lineBlockLengthY; + var yId = 0; + var yIdTotal = 0; + var xId0 = 0; + + while (y < pSize.height) { + if (yId % 2 === 0) { + var symbolYId = yIdTotal / 2 % symbolArray.length; + var x = 0; + var xId1 = 0; + var xId1Total = 0; + + while (x < pSize.width * 2) { + var xSum = 0; + + for (var i = 0; i < dashArrayX[xId0].length; ++i) { + xSum += dashArrayX[xId0][i]; + } + + if (xSum <= 0) { + // Skip empty line + break; + } // E.g., [15, 5, 20, 5] draws only for 15 and 20 + + + if (xId1 % 2 === 0) { + var size = (1 - decalOpt.symbolSize) * 0.5; + var left = x + dashArrayX[xId0][xId1] * size; + var top_1 = y + dashArrayY[yId] * size; + var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; + var height = dashArrayY[yId] * decalOpt.symbolSize; + var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; + brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); + } + + x += dashArrayX[xId0][xId1]; + ++xId1Total; + ++xId1; + + if (xId1 === dashArrayX[xId0].length) { + xId1 = 0; + } + } + + ++xId0; + + if (xId0 === dashArrayX.length) { + xId0 = 0; + } + } + + y += dashArrayY[yId]; + ++yIdTotal; + ++yId; + + if (yId === dashArrayY.length) { + yId = 0; + } + } + + function brushSymbol(x, y, width, height, symbolType) { + var scale = isSVG ? 1 : dpr; + var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect); + + if (isSVG) { + var symbolVNode = zr.painter.renderOneToVNode(symbol); + + if (symbolVNode) { + svgRoot.children.push(symbolVNode); + } + } else { + // Paint to canvas for all other renderers. + brushSingle(ctx, symbol); + } + } + } + } + } + /** + * Convert symbol array into normalized array + * + * @param {string | (string | string[])[]} symbol symbol input + * @return {string[][]} normolized symbol array + */ + + function normalizeSymbolArray(symbol) { + if (!symbol || symbol.length === 0) { + return [['rect']]; + } + + if (isString(symbol)) { + return [[symbol]]; + } + + var isAllString = true; + + for (var i = 0; i < symbol.length; ++i) { + if (!isString(symbol[i])) { + isAllString = false; + break; + } + } + + if (isAllString) { + return normalizeSymbolArray([symbol]); + } + + var result = []; + + for (var i = 0; i < symbol.length; ++i) { + if (isString(symbol[i])) { + result.push([symbol[i]]); + } else { + result.push(symbol[i]); + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayX} dash dash input + * @return {number[][]} normolized dash array + */ + + + function normalizeDashArrayX(dash) { + if (!dash || dash.length === 0) { + return [[0, 0]]; + } + + if (isNumber(dash)) { + var dashValue = Math.ceil(dash); + return [[dashValue, dashValue]]; + } + /** + * [20, 5] should be normalized into [[20, 5]], + * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]] + */ + + + var isAllNumber = true; + + for (var i = 0; i < dash.length; ++i) { + if (!isNumber(dash[i])) { + isAllNumber = false; + break; + } + } + + if (isAllNumber) { + return normalizeDashArrayX([dash]); + } + + var result = []; + + for (var i = 0; i < dash.length; ++i) { + if (isNumber(dash[i])) { + var dashValue = Math.ceil(dash[i]); + result.push([dashValue, dashValue]); + } else { + var dashValue = map(dash[i], function (n) { + return Math.ceil(n); + }); + + if (dashValue.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // so normalize it to be [4, 2, 1, 4, 2, 1] + result.push(dashValue.concat(dashValue)); + } else { + result.push(dashValue); + } + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayY} dash dash input + * @return {number[]} normolized dash array + */ + + + function normalizeDashArrayY(dash) { + if (!dash || typeof dash === 'object' && dash.length === 0) { + return [0, 0]; + } + + if (isNumber(dash)) { + var dashValue_1 = Math.ceil(dash); + return [dashValue_1, dashValue_1]; + } + + var dashValue = map(dash, function (n) { + return Math.ceil(n); + }); + return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; + } + /** + * Get block length of each line. A block is the length of dash line and space. + * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after + * that, so the block length of this line is 5. + * + * @param {number[][]} dash dash array of X or Y + * @return {number[]} block length of each line + */ + + + function getLineBlockLengthX(dash) { + return map(dash, function (line) { + return getLineBlockLengthY(line); + }); + } + + function getLineBlockLengthY(dash) { + var blockLength = 0; + + for (var i = 0; i < dash.length; ++i) { + blockLength += dash[i]; + } + + if (dash.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // So total length is (4 + 2 + 1) * 2 + return blockLength * 2; + } + + return blockLength; + } + + function decalVisual(ecModel, api) { + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + if (data.hasItemVisual()) { + data.each(function (idx) { + var decal = data.getItemVisual(idx, 'decal'); + + if (decal) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var decal = data.getVisual('decal'); + + if (decal) { + var style = data.getVisual('style'); + style.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var lifecycle = new Eventful(); + + // The implementations will be registered when installing the component. + // Avoid these code being bundled to the core module. + + var implsStore = {}; // TODO Type + + function registerImpl(name, impl) { + if ("development" !== 'production') { + if (implsStore[name]) { + error("Already has an implementation of " + name + "."); + } + } + + implsStore[name] = impl; + } + function getImpl(name) { + if ("development" !== 'production') { + if (!implsStore[name]) { + error("Implementation of " + name + " doesn't exists."); + } + } + + return implsStore[name]; + } + + var version$1 = '5.4.2'; + var dependencies = { + zrender: '5.4.3' + }; + 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; + 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 ("development" !== 'production') { + var root = + /* eslint-disable-next-line */ + env.hasGlobalWindow ? window : global; + defaultRenderer = root.__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer); + var devUseDirtyRect = root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__; + defaultUseDirtyRect = devUseDirtyRect == null ? defaultUseDirtyRect : devUseDirtyRect; + } + + var zr = _this._zr = 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 && globalBackwardCompat(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; + } + + sort(visualFuncs, prioritySortFunc); + sort(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 ("development" !== '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 ("development" !== 'production') { + deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas'); + } + + return this.renderToCanvas(opts); + }; + + ECharts.prototype.renderToCanvas = function (opts) { + opts = opts || {}; + var painter = this._zr.painter; + + if ("development" !== '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 ("development" !== '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$1, 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 = 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 += '' + item.dom + ''; + }); + 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 Rect({ + shape: { + x: 0, + y: 0, + width: width, + height: height + }, + style: { + fill: opts.connectedBackgroundColor + } + })); + } + + each(canvasList_1, function (item) { + var img = new ZRImage({ + 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 = 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 ("development" !== 'production') { + warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.')); + } + } + } else { + if ("development" !== '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 = parseFinder(ecModel, finder, { + defaultMainType: 'series' + }); + var seriesModel = parsedFinder.seriesModel; + + if ("development" !== '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) || {}; + 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 ("development" !== '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) { + 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$1[chart.id]; + }; + /** + * Resize the chart + */ + + + ECharts.prototype.resize = function (opts) { + if (this[IN_MAIN_PROCESS_KEY]) { + if ("development" !== '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 ("development" !== '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 ("development" !== '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 ("development" !== '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(normalizeToArray(excludeSeriesId), function (id) { + var modelId = 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 = 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 ("development" !== '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 = 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(); + }); + } + + function allocateZlevels(ecModel) { + var componentZLevels = []; + var seriesZLevels = []; + var hasSeperateZLevel = false; + ecModel.eachComponent(function (componentType, componentModel) { + var zlevel = componentModel.get('zlevel') || 0; + var z = componentModel.get('z') || 0; + var zlevelKey = componentModel.getZLevelKey(); + hasSeperateZLevel = hasSeperateZLevel || !!zlevelKey; + (componentType === 'series' ? seriesZLevels : componentZLevels).push({ + zlevel: zlevel, + z: z, + idx: componentModel.componentIndex, + type: componentType, + key: zlevelKey + }); + }); + + if (hasSeperateZLevel) { + // Series after component + var zLevels = componentZLevels.concat(seriesZLevels); + var lastSeriesZLevel_1; + var lastSeriesKey_1; + sort(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 (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 (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 (isElementRemoved(el)) { + return; + } + + if (el instanceof 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$1, 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); + } + + this.on.call(this, eventName, wrapped, ctx); + }; + + var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu']; + + function disposedWarning(id) { + if ("development" !== '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$1 = {}; + 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. + */ + + function init$1(dom, theme, opts) { + var isClient = !(opts && opts.ssr); + + if (isClient) { + if ("development" !== 'production') { + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + } + + var existInstance = getInstanceByDom(dom); + + if (existInstance) { + if ("development" !== 'production') { + warn('There is a chart instance already initialized on the dom.'); + } + + return existInstance; + } + + if ("development" !== '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$1[chart.id] = chart; + isClient && 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]); + * ``` + */ + + 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; + } + /** + * @deprecated + */ + + function disConnect(groupId) { + connectedGroups[groupId] = false; + } + /** + * Alias and backward compatibility + */ + + var disconnect = disConnect; + /** + * Dispose a chart instance + */ + + function dispose$1(chart) { + if (isString(chart)) { + chart = instances$1[chart]; + } else if (!(chart instanceof ECharts)) { + // Try to treat as dom + chart = getInstanceByDom(chart); + } + + if (chart instanceof ECharts && !chart.isDisposed()) { + chart.dispose(); + } + } + function getInstanceByDom(dom) { + return instances$1[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; + } + function getInstanceById(key) { + return instances$1[key]; + } + /** + * Register theme + */ + + function registerTheme(name, theme) { + themeStorage[name] = theme; + } + /** + * Register option preprocessor + */ + + function registerPreprocessor(preprocessorFunc) { + if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { + optionPreprocessorFuncs.push(preprocessorFunc); + } + } + function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); + } + /** + * Register postIniter + * @param {Function} postInitFunc + */ + + function registerPostInit(postInitFunc) { + registerUpdateLifecycle('afterinit', postInitFunc); + } + /** + * Register postUpdater + * @param {Function} postUpdateFunc + */ + + function registerPostUpdate(postUpdateFunc) { + registerUpdateLifecycle('afterupdate', postUpdateFunc); + } + function registerUpdateLifecycle(name, cb) { + lifecycle.on(name, cb); + } + 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; + } + function registerCoordinateSystem(type, coordSysCreator) { + CoordinateSystemManager.register(type, coordSysCreator); + } + /** + * Get dimensions of specified coordinate system. + * @param {string} type + * @return {Array.} + */ + + function getCoordinateSystemDimensions(type) { + var coordSysCreator = CoordinateSystemManager.get(type); + + if (coordSysCreator) { + return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice(); + } + } + + function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); + } + + function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); + } + var registeredTasks = []; + + function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction(priority) || isObject(priority)) { + fn = priority; + priority = defaultPriority; + } + + if ("development" !== '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); + } + + 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); + * }); + */ + + function setCanvasCreator(creator) { + if ("development" !== 'production') { + deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.'); + } + + setPlatformAPI({ + createCanvas: creator + }); + } + /** + * The parameters and usage: see `geoSourceManager.registerMap`. + * Compatible with previous `echarts.registerMap`. + */ + + function registerMap(mapName, geoJson, specialAreas) { + var registerMap = getImpl('registerMap'); + registerMap && registerMap(mapName, geoJson, specialAreas); + } + function getMap(mapName) { + var getMap = getImpl('getMap'); + return getMap && getMap(mapName); + } + var registerTransform = registerExternalTransform; + /** + * Globa dispatchAction to a specified chart instance. + */ + // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters[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, decalVisual); + registerPreprocessor(globalBackwardCompat); + registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); + registerLoading('default', defaultLoading); // 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', theme); // For backward compatibility, where the namespace `dataTool` will + // be mounted on `echarts` is the extension `dataTool` is imported. + + var dataTool = {}; + + var extensions = []; + var extensionRegisters = { + registerPreprocessor: registerPreprocessor, + registerProcessor: registerProcessor, + registerPostInit: registerPostInit, + registerPostUpdate: registerPostUpdate, + registerUpdateLifecycle: registerUpdateLifecycle, + registerAction: registerAction, + registerCoordinateSystem: registerCoordinateSystem, + registerLayout: registerLayout, + registerVisual: registerVisual, + registerTransform: registerTransform, + registerLoading: registerLoading, + registerMap: registerMap, + registerImpl: registerImpl, + PRIORITY: PRIORITY, + ComponentModel: ComponentModel, + ComponentView: ComponentView, + SeriesModel: SeriesModel, + ChartView: ChartView, + // TODO Use ComponentModel and SeriesModel instead of Constructor + registerComponentModel: function (ComponentModelClass) { + ComponentModel.registerClass(ComponentModelClass); + }, + registerComponentView: function (ComponentViewClass) { + ComponentView.registerClass(ComponentViewClass); + }, + registerSeriesModel: function (SeriesModelClass) { + SeriesModel.registerClass(SeriesModelClass); + }, + registerChartView: function (ChartViewClass) { + ChartView.registerClass(ChartViewClass); + }, + registerSubTypeDefaulter: function (componentType, defaulter) { + ComponentModel.registerSubTypeDefaulter(componentType, defaulter); + }, + registerPainter: function (painterType, PainterCtor) { + registerPainter(painterType, PainterCtor); + } + }; + function use(ext) { + if (isArray(ext)) { + // use([ChartLine, ChartBar]); + each(ext, function (singleExt) { + use(singleExt); + }); + return; + } + + if (indexOf(extensions, ext) >= 0) { + return; + } + + extensions.push(ext); + + if (isFunction(ext)) { + ext = { + install: ext + }; + } + + ext.install(extensionRegisters); + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { + return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; + } + + function defaultKeyGetter(item) { + return item; + } + + var DataDiffer = + /** @class */ + function () { + /** + * @param context Can be visited by this.context in callback. + */ + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, // By default: 'oneToOne'. + diffMode) { + this._old = oldArr; + this._new = newArr; + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; // Visible in callback via `this.context`; + + this.context = context; + this._diffModeMultiple = diffMode === 'multiple'; + } + /** + * Callback function when add a data + */ + + + DataDiffer.prototype.add = function (func) { + this._add = func; + return this; + }; + /** + * Callback function when update a data + */ + + + DataDiffer.prototype.update = function (func) { + this._update = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToOne = function (func) { + this._updateManyToOne = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateOneToMany = function (func) { + this._updateOneToMany = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToMany = function (func) { + this._updateManyToMany = func; + return this; + }; + /** + * Callback function when remove a data + */ + + + DataDiffer.prototype.remove = function (func) { + this._remove = func; + return this; + }; + + DataDiffer.prototype.execute = function () { + this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne'](); + }; + + DataDiffer.prototype._executeOneToOne = function () { + var oldArr = this._old; + var newArr = this._new; + var newDataIndexMap = {}; + var oldDataKeyArr = new Array(oldArr.length); + var newDataKeyArr = new Array(newArr.length); + + this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); // idx can never be empty array here. see 'set null' logic below. + + if (newIdxMapValLen > 1) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var newIdx = newIdxMapVal.shift(); + + if (newIdxMapVal.length === 1) { + newDataIndexMap[oldKey] = newIdxMapVal[0]; + } + + this._update && this._update(newIdx, i); + } else if (newIdxMapValLen === 1) { + newDataIndexMap[oldKey] = null; + this._update && this._update(newIdxMapVal, i); + } else { + this._remove && this._remove(i); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + /** + * For example, consider the case: + * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], + * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], + * Where: + * o0, o1, n0 has key 'a' (many to one) + * o5, n4, n5, n6 has key 'b' (one to many) + * o2, n1 has key 'c' (one to one) + * n2, n3 has key 'd' (add) + * o3, o4 has key 'e' (remove) + * o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) + * Then: + * (The order of the following directives are not ensured.) + * this._updateManyToOne(n0, [o0, o1]); + * this._updateOneToMany([n4, n5, n6], o5); + * this._update(n1, o2); + * this._remove(o3); + * this._remove(o4); + * this._remove(o6); + * this._remove(o7); + * this._add(n2); + * this._add(n3); + * this._add(n7); + * this._add(n8); + */ + + + DataDiffer.prototype._executeMultiple = function () { + var oldArr = this._old; + var newArr = this._new; + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + + this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldDataKeyArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var oldIdxMapVal = oldDataIndexMap[oldKey]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { + this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { + this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { + this._update && this._update(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) { + this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1) { + for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { + this._remove && this._remove(oldIdxMapVal[i_1]); + } + } else { + this._remove && this._remove(oldIdxMapVal); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + + DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) { + for (var i = 0; i < newDataKeyArr.length; i++) { + var newKey = newDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[newKey]; + var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (idxMapValLen > 1) { + for (var j = 0; j < idxMapValLen; j++) { + this._add && this._add(newIdxMapVal[j]); + } + } else if (idxMapValLen === 1) { + this._add && this._add(newIdxMapVal); + } // Support both `newDataKeyArr` are duplication removed or not removed. + + + newDataIndexMap[newKey] = null; + } + }; + + DataDiffer.prototype._initIndexMap = function (arr, // Can be null. + map, // In 'byKey', the output `keyArr` is duplication removed. + // In 'byIndex', the output `keyArr` is not duplication removed and + // its indices are accurately corresponding to `arr`. + keyArr, keyGetterName) { + var cbModeMultiple = this._diffModeMultiple; + + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + this[keyGetterName](arr[i], i); + + if (!cbModeMultiple) { + keyArr[i] = key; + } + + if (!map) { + continue; + } + + var idxMapVal = map[key]; + var idxMapValLen = dataIndexMapValueLength(idxMapVal); + + if (idxMapValLen === 0) { + // Simple optimize: in most cases, one index has one key, + // do not need array. + map[key] = i; + + if (cbModeMultiple) { + keyArr.push(key); + } + } else if (idxMapValLen === 1) { + map[key] = [idxMapVal, i]; + } else { + idxMapVal.push(i); + } + } + }; + + return DataDiffer; + }(); + + var DimensionUserOuput = + /** @class */ + function () { + function DimensionUserOuput(encode, dimRequest) { + this._encode = encode; + this._schema = dimRequest; + } + + DimensionUserOuput.prototype.get = function () { + return { + // Do not generate full dimension name until fist used. + fullDimensions: this._getFullDimensionNames(), + encode: this._encode + }; + }; + /** + * Get all data store dimension names. + * Theoretically a series data store is defined both by series and used dataset (if any). + * If some dimensions are omitted for performance reason in `this.dimensions`, + * the dimension name may not be auto-generated if user does not specify a dimension name. + * In this case, the dimension name is `null`/`undefined`. + */ + + + DimensionUserOuput.prototype._getFullDimensionNames = function () { + if (!this._cachedDimNames) { + this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []; + } + + return this._cachedDimNames; + }; + + return DimensionUserOuput; + }(); + function summarizeDimensions(data, schema) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; + var userOutputEncode = {}; + each(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + var coordDim = dimItem.coordDim; + + if (coordDim) { + if ("development" !== 'production') { + assert(VISUAL_DIMENSIONS.get(coordDim) == null); + } + + var coordDimIndex = dimItem.coordDimIndex; + getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; + + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label, + // because when dataset is used, it is hard to guess which dimension + // can be value dimension. If both show x, y on label is not look good, + // and conventionally y axis is focused more. + + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } // User output encode do not contain generated coords. + // And it only has index. User can use index to retrieve value from the raw item array. + + + getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name); + } + + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + + VISUAL_DIMENSIONS.each(function (v, otherDim) { + var encodeArr = getOrCreateEncodeArr(encode, otherDim); + var dimIndex = dimItem.otherDims[otherDim]; + + if (dimIndex != null && dimIndex !== false) { + encodeArr[dimIndex] = dimItem.name; + } + }); + }); + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + notExtraCoordDimMap.each(function (v, coordDim) { + var dimArr = encode[coordDim]; + encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data + // dim canot on more than one coordDim. + + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) { + return data.getDimensionInfo(dimName).storeDimIndex; + }); + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + var encodeLabel = encode.label; // FIXME `encode.label` is not recommended, because formatter cannot be set + // in this way. Use label.formatter instead. Maybe remove this approach someday. + + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + + var encodeTooltip = encode.tooltip; + + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + summary.userOutput = new DimensionUserOuput(userOutputEncode, schema); + return summary; + } + + function getOrCreateEncodeArr(encode, dim) { + if (!encode.hasOwnProperty(dim)) { + encode[dim] = []; + } + + return encode[dim]; + } // FIXME:TS should be type `AxisType` + + + function getDimensionTypeByAxis(axisType) { + return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float'; + } + + function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); + } // function findTheLastDimMayLabel(data) { + // // Get last value dim + // let dimensions = data.dimensions.slice(); + // let valueType; + // let valueDim; + // while (dimensions.length && ( + // valueDim = dimensions.pop(), + // valueType = data.getDimensionInfo(valueDim).type, + // valueType === 'ordinal' || valueType === 'time' + // )) {} // jshint ignore:line + // return valueDim; + // } + + var SeriesDimensionDefine = + /** @class */ + function () { + /** + * @param opt All of the fields will be shallow copied. + */ + function SeriesDimensionDefine(opt) { + /** + * The format of `otherDims` is: + * ```js + * { + * tooltip?: number + * label?: number + * itemName?: number + * seriesName?: number + * } + * ``` + * + * A `series.encode` can specified these fields: + * ```js + * encode: { + * // "3, 1, 5" is the index of data dimension. + * tooltip: [3, 1, 5], + * label: [0, 3], + * ... + * } + * ``` + * `otherDims` is the parse result of the `series.encode` above, like: + * ```js + * // Suppose the index of this data dimension is `3`. + * this.otherDims = { + * // `3` is at the index `0` of the `encode.tooltip` + * tooltip: 0, + * // `3` is at the index `1` of the `encode.label` + * label: 1 + * }; + * ``` + * + * This prop should never be `null`/`undefined` after initialized. + */ + this.otherDims = {}; + + if (opt != null) { + extend(this, opt); + } + } + + return SeriesDimensionDefine; + }(); + + var inner$4 = makeInner(); + var dimTypeShort = { + float: 'f', + int: 'i', + ordinal: 'o', + number: 'n', + time: 't' + }; + /** + * Represents the dimension requirement of a series. + * + * NOTICE: + * When there are too many dimensions in dataset and many series, only the used dimensions + * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`. + * But users may query data by other unused dimension names. + * In this case, users can only query data if and only if they have defined dimension names + * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from + * `source` dimensions. + */ + + var SeriesDataSchema = + /** @class */ + function () { + function SeriesDataSchema(opt) { + this.dimensions = opt.dimensions; + this._dimOmitted = opt.dimensionOmitted; + this.source = opt.source; + this._fullDimCount = opt.fullDimensionCount; + + this._updateDimOmitted(opt.dimensionOmitted); + } + + SeriesDataSchema.prototype.isDimensionOmitted = function () { + return this._dimOmitted; + }; + + SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) { + this._dimOmitted = dimensionOmitted; + + if (!dimensionOmitted) { + return; + } + + if (!this._dimNameMap) { + this._dimNameMap = ensureSourceDimNameMap(this.source); + } + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Get index by user defined dimension name (i.e., not internal generate name). + * That is, get index from `dimensionsDefine`. + * If no `dimensionsDefine`, or no name get, return -1. + */ + + + SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) { + return retrieve2(this._dimNameMap.get(dimName), -1); + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Notice: may return `null`/`undefined` if user not specify dimension names. + */ + + + SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) { + var dimensionsDefine = this.source.dimensionsDefine; + + if (dimensionsDefine) { + return dimensionsDefine[dimIndex]; + } + }; + + SeriesDataSchema.prototype.makeStoreSchema = function () { + var dimCount = this._fullDimCount; + var willRetrieveDataByName = shouldRetrieveDataByName(this.source); + var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); // If source don't have dimensions or series don't omit unsed dimensions. + // Generate from seriesDimList directly + + var dimHash = ''; + var dims = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { + var property = void 0; + var type = void 0; + var ordinalMeta = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + property = willRetrieveDataByName ? seriesDimDef.name : null; + type = seriesDimDef.type; + ordinalMeta = seriesDimDef.ordinalMeta; + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + property = willRetrieveDataByName ? sourceDimDef.name : null; + type = sourceDimDef.type; + } + } + + dims.push({ + property: property, + type: type, + ordinalMeta: ordinalMeta + }); // If retrieving data by index, + // use to determine whether data can be shared. + // (Because in this case there might be no dimension name defined in dataset, but indices always exists). + // (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). + // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), + // use in hash. + + if (willRetrieveDataByName && property != null // For data stack, we have make sure each series has its own dim on this store. + // So we do not add property to hash to make sure they can share this store. + && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { + dimHash += makeHashStrict // Use escape character '`' in case that property name contains '$'. + ? property.replace(/\`/g, '`1').replace(/\$/g, '`2') // For better performance, when there are large dimensions, tolerant this defects that hardly meet. + : property; + } + + dimHash += '$'; + dimHash += dimTypeShort[type] || 'f'; + + if (ordinalMeta) { + dimHash += ordinalMeta.uid; + } + + dimHash += '$'; + } // Source from endpoint(usually series) will be read differently + // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different. + // So we use this three props as key. + + + var source = this.source; + var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$'); + return { + dimensions: dims, + hash: hash + }; + }; + + SeriesDataSchema.prototype.makeOutputDimensionNames = function () { + var result = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { + var name_1 = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + if (!seriesDimDef.isCalculationCoord) { + name_1 = seriesDimDef.name; + } + + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + name_1 = sourceDimDef.name; + } + } + + result.push(name_1); + } + + return result; + }; + + SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) { + this.dimensions.push(dimDef); + dimDef.isCalculationCoord = true; + this._fullDimCount++; // If append dimension on a data store, consider the store + // might be shared by different series, series dimensions not + // really map to store dimensions. + + this._updateDimOmitted(true); + }; + + return SeriesDataSchema; + }(); + function isSeriesDataSchema(schema) { + return schema instanceof SeriesDataSchema; + } + function createDimNameMap(dimsDef) { + var dataDimNameMap = createHashMap(); + + for (var i = 0; i < (dimsDef || []).length; i++) { + var dimDefItemRaw = dimsDef[i]; + var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; + + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + dataDimNameMap.set(userDimName, i); + } + } + + return dataDimNameMap; + } + function ensureSourceDimNameMap(source) { + var innerSource = inner$4(source); + return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); + } + function shouldOmitUnusedDimensions(dimCount) { + return dimCount > 30; + } + + var isObject$2 = isObject; + var map$1 = map; + var CtorInt32Array$1 = typeof Int32Array === 'undefined' ? Array : Int32Array; // Use prefix to avoid index to be the same as otherIdList[idx], + // which will cause weird update animation. + + var ID_PREFIX = 'e\0\0'; + var INDEX_NOT_FOUND = -1; // type SeriesDimensionIndex = DimensionIndex; + + var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_dimSummary', 'userOutput', '_rawData', '_dimValueGetter', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount']; + var CLONE_PROPERTIES = ['_approximateExtent']; // ----------------------------- + // Internal method declarations: + // ----------------------------- + + var prepareInvertedIndex; + var getId; + var getIdNameFromStore; + var normalizeDimensions; + var transferProperties; + var cloneListForMapAndSample; + var makeIdFromName; + + var SeriesData = + /** @class */ + function () { + /** + * @param dimensionsInput.dimensions + * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...]. + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + */ + function SeriesData(dimensionsInput, hostModel) { + this.type = 'list'; + this._dimOmitted = false; + this._nameList = []; + this._idList = []; // Models of data option is stored sparse for optimizing memory cost + // Never used yet (not used yet). + // private _optionModels: Model[] = []; + // Global visual properties after visual coding + + this._visual = {}; // Global layout properties. + + this._layout = {}; // Item visual properties after visual coding + + this._itemVisuals = []; // Item layout properties after layout + + this._itemLayouts = []; // Graphic elements + + this._graphicEls = []; // key: dim, value: extent + + this._approximateExtent = {}; + this._calculationInfo = {}; // Having detected that there is data item is non primitive type + // (in type `OptionDataItemObject`). + // Like `data: [ { value: xx, itemStyle: {...} }, ...]` + // At present it only happen in `SOURCE_FORMAT_ORIGINAL`. + + this.hasItemOption = false; // Methods that create a new list based on this list should be listed here. + // Notice that those method should `RETURN` the new list. + + this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'lttbDownSample', 'map']; // Methods that change indices of this list should be listed here. + + this.CHANGABLE_METHODS = ['filterSelf', 'selectRange']; + this.DOWNSAMPLE_METHODS = ['downSample', 'lttbDownSample']; + var dimensions; + var assignStoreDimIdx = false; + + if (isSeriesDataSchema(dimensionsInput)) { + dimensions = dimensionsInput.dimensions; + this._dimOmitted = dimensionsInput.isDimensionOmitted(); + this._schema = dimensionsInput; + } else { + assignStoreDimIdx = true; + dimensions = dimensionsInput; + } + + dimensions = dimensions || ['x', 'y']; + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + var needsHasOwn = false; + var emptyObj = {}; + + for (var i = 0; i < dimensions.length; i++) { + // Use the original dimensions[i], where other flag props may exists. + var dimInfoInput = dimensions[i]; + var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({ + name: dimInfoInput + }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput; + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'float'; + + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + + var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + + if (emptyObj[dimensionName] != null) { + needsHasOwn = true; + } + + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + + if (otherDims.itemName === 0) { + this._nameDimIdx = i; + } + + if (otherDims.itemId === 0) { + this._idDimIdx = i; + } + + if ("development" !== 'production') { + assert(assignStoreDimIdx || dimensionInfo.storeDimIndex >= 0); + } + + if (assignStoreDimIdx) { + dimensionInfo.storeDimIndex = i; + } + } + + this.dimensions = dimensionNames; + this._dimInfos = dimensionInfos; + + this._initGetDimensionInfo(needsHasOwn); + + this.hostModel = hostModel; + this._invertedIndicesMap = invertedIndicesMap; + + if (this._dimOmitted) { + var dimIdxToName_1 = this._dimIdxToName = createHashMap(); + each(dimensionNames, function (dimName) { + dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName); + }); + } + } + /** + * + * Get concrete dimension name by dimension name or dimension index. + * If input a dimension name, do not validate whether the dimension name exits. + * + * @caution + * @param dim Must make sure the dimension is `SeriesDimensionLoose`. + * Because only those dimensions will have auto-generated dimension names if not + * have a user-specified name, and other dimensions will get a return of null/undefined. + * + * @notice Because of this reason, should better use `getDimensionIndex` instead, for examples: + * ```js + * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx); + * ``` + * + * @return Concrete dim name. + */ + + + SeriesData.prototype.getDimension = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx == null) { + return dim; + } + + dimIdx = dim; + + if (!this._dimOmitted) { + return this.dimensions[dimIdx]; + } // Retrieve from series dimension definition because it probably contains + // generated dimension name (like 'x', 'y'). + + + var dimName = this._dimIdxToName.get(dimIdx); + + if (dimName != null) { + return dimName; + } + + var sourceDimDef = this._schema.getSourceDimension(dimIdx); + + if (sourceDimDef) { + return sourceDimDef.name; + } + }; + /** + * Get dimension index in data store. Return -1 if not found. + * Can be used to index value from getRawValue. + */ + + + SeriesData.prototype.getDimensionIndex = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx != null) { + return dimIdx; + } + + if (dim == null) { + return -1; + } + + var dimInfo = this._getDimInfo(dim); + + return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1; + }; + /** + * The meanings of the input parameter `dim`: + * + * + If dim is a number (e.g., `1`), it means the index of the dimension. + * For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'. + * + If dim is a number-like string (e.g., `"1"`): + * + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`, + * it means that concrete name. + * + If not, it will be converted to a number, which means the index of the dimension. + * (why? because of the backward compatibility. We have been tolerating number-like string in + * dimension setting, although now it seems that it is not a good idea.) + * For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`, + * if no dimension name is defined as `"1"`. + * + If dim is a not-number-like string, it means the concrete dim name. + * For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`, + * or customized in `dimensions` property of option like `"age"`. + * + * @return recognized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`). + */ + + + SeriesData.prototype._recognizeDimIndex = function (dim) { + if (isNumber(dim) // If being a number-like string but not being defined as a dimension name. + || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) { + return +dim; + } + }; + + SeriesData.prototype._getStoreDimIndex = function (dim) { + var dimIdx = this.getDimensionIndex(dim); + + if ("development" !== 'production') { + if (dimIdx == null) { + throw new Error('Unknown dimension ' + dim); + } + } + + return dimIdx; + }; + /** + * Get type and calculation info of particular dimension + * @param dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + + + SeriesData.prototype.getDimensionInfo = function (dim) { + // Do not clone, because there may be categories in dimInfo. + return this._getDimInfo(this.getDimension(dim)); + }; + + SeriesData.prototype._initGetDimensionInfo = function (needsHasOwn) { + var dimensionInfos = this._dimInfos; + this._getDimInfo = needsHasOwn ? function (dimName) { + return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : undefined; + } : function (dimName) { + return dimensionInfos[dimName]; + }; + }; + /** + * concrete dimension name list on coord. + */ + + + SeriesData.prototype.getDimensionsOnCoord = function () { + return this._dimSummary.dataDimsOnCoord.slice(); + }; + + SeriesData.prototype.mapDimension = function (coordDim, idx) { + var dimensionsSummary = this._dimSummary; + + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + + var dims = dimensionsSummary.encode[coordDim]; + return dims ? dims[idx] : null; + }; + + SeriesData.prototype.mapDimensionsAll = function (coordDim) { + var dimensionsSummary = this._dimSummary; + var dims = dimensionsSummary.encode[coordDim]; + return (dims || []).slice(); + }; + + SeriesData.prototype.getStore = function () { + return this._store; + }; + /** + * Initialize from data + * @param data source or data or data store. + * @param nameList The name of a datum is used on data diff and + * default label/tooltip. + * A name can be specified in encode.itemName, + * or dataItem.name (only for series option data), + * or provided in nameList from outside. + */ + + + SeriesData.prototype.initData = function (data, nameList, dimValueGetter) { + var _this = this; + + var store; + + if (data instanceof DataStore) { + store = data; + } + + if (!store) { + var dimensions = this.dimensions; + var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data; + store = new DataStore(); + var dimensionInfos = map$1(dimensions, function (dimName) { + return { + type: _this._dimInfos[dimName].type, + property: dimName + }; + }); + store.initData(provider, dimensionInfos, dimValueGetter); + } + + this._store = store; // Reset + + this._nameList = (nameList || []).slice(); + this._idList = []; + this._nameRepeatCount = {}; + + this._doInit(0, store.count()); // Cache summary info for fast visit. See "dimensionHelper". + // Needs to be initialized after store is prepared. + + + this._dimSummary = summarizeDimensions(this, this._schema); + this.userOutput = this._dimSummary.userOutput; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + SeriesData.prototype.appendData = function (data) { + var range = this._store.appendData(data); + + this._doInit(range[0], range[1]); + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + * This method does not modify `rawData` (`dataProvider`), but only + * add values to store. + * + * The final count will be increased by `Math.max(values.length, names.length)`. + * + * @param values That is the SourceType: 'arrayRows', like + * [ + * [12, 33, 44], + * [NaN, 43, 1], + * ['-', 'asdf', 0] + * ] + * Each item is exactly corresponding to a dimension. + */ + + + SeriesData.prototype.appendValues = function (values, names) { + var _a = this._store.appendValues(values, names.length), + start = _a.start, + end = _a.end; + + var shouldMakeIdFromName = this._shouldMakeIdFromName(); + + this._updateOrdinalMeta(); + + if (names) { + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; + this._nameList[idx] = names[sourceIdx]; + + if (shouldMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + }; + + SeriesData.prototype._updateOrdinalMeta = function () { + var store = this._store; + var dimensions = this.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = this._dimInfos[dimensions[i]]; + + if (dimInfo.ordinalMeta) { + store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta); + } + } + }; + + SeriesData.prototype._shouldMakeIdFromName = function () { + var provider = this._store.getProvider(); + + return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage; + }; + + SeriesData.prototype._doInit = function (start, end) { + if (start >= end) { + return; + } + + var store = this._store; + var provider = store.getProvider(); + + this._updateOrdinalMeta(); + + var nameList = this._nameList; + var idList = this._idList; + var sourceFormat = provider.getSource().sourceFormat; + var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // If dataItem is {name: ...} or {id: ...}, it has highest priority. + // This kind of ids and names are always stored `_nameList` and `_idList`. + + if (isFormatOriginal && !provider.pure) { + var sharedDataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + var dataItem = provider.getItem(idx, sharedDataItem); + + if (!this.hasItemOption && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + + if (dataItem) { + var itemName = dataItem.name; + + if (nameList[idx] == null && itemName != null) { + nameList[idx] = convertOptionIdName(itemName, null); + } + + var itemId = dataItem.id; + + if (idList[idx] == null && itemId != null) { + idList[idx] = convertOptionIdName(itemId, null); + } + } + } + } + + if (this._shouldMakeIdFromName()) { + for (var idx = start; idx < end; idx++) { + makeIdFromName(this, idx); + } + } + + prepareInvertedIndex(this); + }; + /** + * PENDING: In fact currently this function is only used to short-circuit + * the calling of `scale.unionExtentFromData` when data have been filtered by modules + * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on + * an axis, but if a "axis related data filter module" is used, the extent of the axis have + * been fixed and no need to calling `scale.unionExtentFromData` actually. + * But if we add "custom data filter" in future, which is not "axis related", this method may + * be still needed. + * + * Optimize for the scenario that data is filtered by a given extent. + * Consider that if data amount is more than hundreds of thousand, + * extent calculation will cost more than 10ms and the cache will + * be erased because of the filtering. + */ + + + SeriesData.prototype.getApproximateExtent = function (dim) { + return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + /** + * Calculate extent on a filtered data might be time consuming. + * Approximate extent is only used for: calculate extent of filtered data outside. + */ + + + SeriesData.prototype.setApproximateExtent = function (extent, dim) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); + }; + + SeriesData.prototype.getCalculationInfo = function (key) { + return this._calculationInfo[key]; + }; + + SeriesData.prototype.setCalculationInfo = function (key, value) { + isObject$2(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; + }; + /** + * @return Never be null/undefined. `number` will be converted to string. Because: + * In most cases, name is used in display, where returning a string is more convenient. + * In other cases, name is used in query (see `indexOfName`), where we can keep the + * rule that name `2` equals to name `'2'`. + */ + + + SeriesData.prototype.getName = function (idx) { + var rawIndex = this.getRawIndex(idx); + var name = this._nameList[rawIndex]; + + if (name == null && this._nameDimIdx != null) { + name = getIdNameFromStore(this, this._nameDimIdx, rawIndex); + } + + if (name == null) { + name = ''; + } + + return name; + }; + + SeriesData.prototype._getCategory = function (dimIdx, idx) { + var ordinal = this._store.get(dimIdx, idx); + + var ordinalMeta = this._store.getOrdinalMeta(dimIdx); + + if (ordinalMeta) { + return ordinalMeta.categories[ordinal]; + } + + return ordinal; + }; + /** + * @return Never null/undefined. `number` will be converted to string. Because: + * In all cases having encountered at present, id is used in making diff comparison, which + * are usually based on hash map. We can keep the rule that the internal id are always string + * (treat `2` is the same as `'2'`) to make the related logic simple. + */ + + + SeriesData.prototype.getId = function (idx) { + return getId(this, this.getRawIndex(idx)); + }; + + SeriesData.prototype.count = function () { + return this._store.count(); + }; + /** + * Get value. Return NaN if idx is out of range. + * + * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.get = function (dim, idx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.get(dimInfo.storeDimIndex, idx); + } + }; + /** + * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.getByRawIndex = function (dim, rawIdx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx); + } + }; + + SeriesData.prototype.getIndices = function () { + return this._store.getIndices(); + }; + + SeriesData.prototype.getDataExtent = function (dim) { + return this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getSum = function (dim) { + return this._store.getSum(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getMedian = function (dim) { + return this._store.getMedian(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getValues = function (dimensions, idx) { + var _this = this; + + var store = this._store; + return isArray(dimensions) ? store.getValues(map$1(dimensions, function (dim) { + return _this._getStoreDimIndex(dim); + }), idx) : store.getValues(dimensions); + }; + /** + * If value is NaN. Including '-' + * Only check the coord dimensions. + */ + + + SeriesData.prototype.hasValue = function (idx) { + var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord; + + for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) { + // Ordinal type originally can be string or number. + // But when an ordinal type is used on coord, it can + // not be string but only number. So we can also use isNaN. + if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) { + return false; + } + } + + return true; + }; + /** + * Retrieve the index with given name + */ + + + SeriesData.prototype.indexOfName = function (name) { + for (var i = 0, len = this._store.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + + return -1; + }; + + SeriesData.prototype.getRawIndex = function (idx) { + return this._store.getRawIndex(idx); + }; + + SeriesData.prototype.indexOfRawIndex = function (rawIndex) { + return this._store.indexOfRawIndex(rawIndex); + }; + /** + * Only support the dimension which inverted index created. + * Do not support other cases until required. + * @param dim concrete dim + * @param value ordinal index + * @return rawIndex + */ + + + SeriesData.prototype.rawIndexOf = function (dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + + if ("development" !== 'production') { + if (!invertedIndices) { + throw new Error('Do not supported yet'); + } + } + + var rawIndex = invertedIndices[value]; + + if (rawIndex == null || isNaN(rawIndex)) { + return INDEX_NOT_FOUND; + } + + return rawIndex; + }; + /** + * Retrieve the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + SeriesData.prototype.indicesOfNearest = function (dim, value, maxDistance) { + return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance); + }; + + SeriesData.prototype.each = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + + this._store.each(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + + SeriesData.prototype.filterSelf = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store = this._store.filter(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return this; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + SeriesData.prototype.selectRange = function (range) { + + var _this = this; + + var innerRange = {}; + var dims = keys(range); + each(dims, function (dim) { + var dimIdx = _this._getStoreDimIndex(dim); + + innerRange[dimIdx] = range[dim]; + }); + this._store = this._store.selectRange(innerRange); + return this; + }; + /* eslint-enable max-len */ + + + SeriesData.prototype.mapArray = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + ctx = ctx || this; + var result = []; + this.each(dims, function () { + result.push(cb && cb.apply(this, arguments)); + }, ctx); + return result; + }; + + SeriesData.prototype.map = function (dims, cb, ctx, ctxCompat) { + + var fCtx = ctx || ctxCompat || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + var list = cloneListForMapAndSample(this); + list._store = this._store.map(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return list; + }; + + SeriesData.prototype.modify = function (dims, cb, ctx, ctxCompat) { + var _this = this; // ctxCompat just for compat echarts3 + + + var fCtx = ctx || ctxCompat || this; + + if ("development" !== 'production') { + each(normalizeDimensions(dims), function (dim) { + var dimInfo = _this.getDimensionInfo(dim); + + if (!dimInfo.isCalculationCoord) { + console.error('Danger: only stack dimension can be modified'); + } + }); + } + + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); // If do shallow clone here, if there are too many stacked series, + // it still cost lots of memory, because `_store.dimensions` are not shared. + // We should consider there probably be shallow clone happen in each series + // in consequent filter/map. + + this._store.modify(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + SeriesData.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this); + list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex); + return list; + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + SeriesData.prototype.lttbDownSample = function (valueDimension, rate) { + var list = cloneListForMapAndSample(this); + list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate); + return list; + }; + + SeriesData.prototype.getRawDataItem = function (idx) { + return this._store.getRawDataItem(idx); + }; + /** + * Get model of one data item. + */ + // TODO: Type of data item + + + SeriesData.prototype.getItemModel = function (idx) { + var hostModel = this.hostModel; + var dataItem = this.getRawDataItem(idx); + return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); + }; + /** + * Create a data differ + */ + + + SeriesData.prototype.diff = function (otherList) { + var thisList = this; + return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function (idx) { + return getId(otherList, idx); + }, function (idx) { + return getId(thisList, idx); + }); + }; + /** + * Get visual property. + */ + + + SeriesData.prototype.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + SeriesData.prototype.setVisual = function (kvObj, val) { + this._visual = this._visual || {}; + + if (isObject$2(kvObj)) { + extend(this._visual, kvObj); + } else { + this._visual[kvObj] = val; + } + }; + /** + * Get visual property of single data item + */ + // eslint-disable-next-line + + + SeriesData.prototype.getItemVisual = function (idx, key) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + + if (val == null) { + // Use global visual property + return this.getVisual(key); + } + + return val; + }; + /** + * If exists visual property of single data item + */ + + + SeriesData.prototype.hasItemVisual = function () { + return this._itemVisuals.length > 0; + }; + /** + * Make sure itemVisual property is unique + */ + // TODO: use key to save visual to reduce memory. + + + SeriesData.prototype.ensureUniqueItemVisual = function (idx, key) { + var itemVisuals = this._itemVisuals; + var itemVisual = itemVisuals[idx]; + + if (!itemVisual) { + itemVisual = itemVisuals[idx] = {}; + } + + var val = itemVisual[key]; + + if (val == null) { + val = this.getVisual(key); // TODO Performance? + + if (isArray(val)) { + val = val.slice(); + } else if (isObject$2(val)) { + val = extend({}, val); + } + + itemVisual[key] = val; + } + + return val; + }; // eslint-disable-next-line + + + SeriesData.prototype.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject$2(key)) { + extend(itemVisual, key); + } else { + itemVisual[key] = value; + } + }; + /** + * Clear itemVisuals and list visual. + */ + + + SeriesData.prototype.clearAllVisual = function () { + this._visual = {}; + this._itemVisuals = []; + }; + + SeriesData.prototype.setLayout = function (key, val) { + isObject$2(key) ? extend(this._layout, key) : this._layout[key] = val; + }; + /** + * Get layout property. + */ + + + SeriesData.prototype.getLayout = function (key) { + return this._layout[key]; + }; + /** + * Get layout of single data item + */ + + + SeriesData.prototype.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }; + /** + * Set layout of single data item + */ + + + SeriesData.prototype.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout; + }; + /** + * Clear all layout of single data item + */ + + + SeriesData.prototype.clearItemLayouts = function () { + this._itemLayouts.length = 0; + }; + /** + * Set graphic element relative to data. It can be set as null + */ + + + SeriesData.prototype.setItemGraphicEl = function (idx, el) { + var seriesIndex = this.hostModel && this.hostModel.seriesIndex; + setCommonECData(seriesIndex, this.dataType, idx, el); + this._graphicEls[idx] = el; + }; + + SeriesData.prototype.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + SeriesData.prototype.eachItemGraphicEl = function (cb, context) { + each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + + + SeriesData.prototype.cloneShallow = function (list) { + if (!list) { + list = new SeriesData(this._schema ? this._schema : map$1(this.dimensions, this._getDimInfo, this), this.hostModel); + } + + transferProperties(list, this); + list._store = this._store; + return list; + }; + /** + * Wrap some method to add more feature + */ + + + SeriesData.prototype.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + + if (!isFunction(originalMethod)) { + return; + } + + this.__wrappedMethods = this.__wrappedMethods || []; + + this.__wrappedMethods.push(methodName); + + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.apply(this, [res].concat(slice(arguments))); + }; + }; // ---------------------------------------------------------- + // A work around for internal method visiting private member. + // ---------------------------------------------------------- + + + SeriesData.internalField = function () { + prepareInvertedIndex = function (data) { + var invertedIndicesMap = data._invertedIndicesMap; + each(invertedIndicesMap, function (invertedIndices, dim) { + var dimInfo = data._dimInfos[dim]; // Currently, only dimensions that has ordinalMeta can create inverted indices. + + var ordinalMeta = dimInfo.ordinalMeta; + var store = data._store; + + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array$1(ordinalMeta.categories.length); // The default value of TypedArray is 0. To avoid miss + // mapping to 0, we should set it as INDEX_NOT_FOUND. + + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = INDEX_NOT_FOUND; + } + + for (var i = 0; i < store.count(); i++) { + // Only support the case that all values are distinct. + invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i; + } + } + }); + }; + + getIdNameFromStore = function (data, dimIdx, idx) { + return convertOptionIdName(data._getCategory(dimIdx, idx), null); + }; + /** + * @see the comment of `List['getId']`. + */ + + + getId = function (data, rawIndex) { + var id = data._idList[rawIndex]; + + if (id == null && data._idDimIdx != null) { + id = getIdNameFromStore(data, data._idDimIdx, rawIndex); + } + + if (id == null) { + id = ID_PREFIX + rawIndex; + } + + return id; + }; + + normalizeDimensions = function (dimensions) { + if (!isArray(dimensions)) { + dimensions = dimensions != null ? [dimensions] : []; + } + + return dimensions; + }; + /** + * Data in excludeDimensions is copied, otherwise transferred. + */ + + + cloneListForMapAndSample = function (original) { + var list = new SeriesData(original._schema ? original._schema : map$1(original.dimensions, original._getDimInfo, original), original.hostModel); // FIXME If needs stackedOn, value may already been stacked + + transferProperties(list, original); + return list; + }; + + transferProperties = function (target, source) { + each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + target.__wrappedMethods = source.__wrappedMethods; + each(CLONE_PROPERTIES, function (propName) { + target[propName] = clone(source[propName]); + }); + target._calculationInfo = extend({}, source._calculationInfo); + }; + + makeIdFromName = function (data, idx) { + var nameList = data._nameList; + var idList = data._idList; + var nameDimIdx = data._nameDimIdx; + var idDimIdx = data._idDimIdx; + var name = nameList[idx]; + var id = idList[idx]; + + if (name == null && nameDimIdx != null) { + nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx); + } + + if (id == null && idDimIdx != null) { + idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx); + } + + if (id == null && name != null) { + var nameRepeatCount = data._nameRepeatCount; + var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; + id = name; + + if (nmCnt > 1) { + id += '__ec__' + nmCnt; + } + + idList[idx] = id; + } + }; + }(); + + return SeriesData; + }(); + + /** + * For outside usage compat (like echarts-gl are using it). + */ + + function createDimensions(source, opt) { + return prepareSeriesDataSchema(source, opt).dimensions; + } + /** + * This method builds the relationship between: + * + "what the coord sys or series requires (see `coordDimensions`)", + * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)" + * + "what the data source provids (see `source`)". + * + * Some guess strategy will be adapted if user does not define something. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @return The results are always sorted by `storeDimIndex` asc. + */ + + function prepareSeriesDataSchema( // TODO: TYPE completeDimensions type + source, opt) { + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + + opt = opt || {}; + var sysDims = opt.coordDimensions || []; + var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; + var coordDimNameMap = createHashMap(); + var resultList = []; + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); // Try to ignore unused dimensions if sharing a high dimension datastore + // 30 is an experience value. + + var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); + var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; + var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); + var encodeDef = opt.encodeDefine; + + if (!encodeDef && opt.encodeDefaulter) { + encodeDef = opt.encodeDefaulter(source, dimCount); + } + + var encodeDefMap = createHashMap(encodeDef); + var indicesMap = new CtorInt32Array(dimCount); + + for (var i = 0; i < indicesMap.length; i++) { + indicesMap[i] = -1; + } + + function getResultItem(dimIdx) { + var idx = indicesMap[dimIdx]; + + if (idx < 0) { + var dimDefItemRaw = dimsDef[dimIdx]; + var dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : { + name: dimDefItemRaw + }; + var resultItem = new SeriesDimensionDefine(); + var userDimName = dimDefItem.name; + + if (userDimName != null && dataDimNameMap.get(userDimName) != null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be displayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + } + + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + var newIdx = resultList.length; + indicesMap[dimIdx] = newIdx; + resultItem.storeDimIndex = dimIdx; + resultList.push(resultItem); + return resultItem; + } + + return resultList[idx]; + } + + if (!omitUnusedDimensions) { + for (var i = 0; i < dimCount; i++) { + getResultItem(i); + } + } // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`. + + + encodeDefMap.each(function (dataDimsRaw, coordDim) { + var dataDims = normalizeToArray(dataDimsRaw).slice(); // Note: It is allowed that `dataDims.length` is `0`, e.g., options is + // `{encode: {x: -1, y: 1}}`. Should not filter anything in + // this case. + + if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { + encodeDefMap.set(coordDim, false); + return; + } + + var validDataDims = encodeDefMap.set(coordDim, []); + each(dataDims, function (resultDimIdxOrName, idx) { + // The input resultDimIdx can be dim name or index. + var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; + + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(getResultItem(resultDimIdx), coordDim, idx); + } + }); + }); // Apply templates and default order from `sysDims`. + + var availDimIdx = 0; + each(sysDims, function (sysDimItemRaw) { + var coordDim; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + var sysDimItem; + + if (isString(sysDimItemRaw)) { + coordDim = sysDimItemRaw; + sysDimItem = {}; + } else { + sysDimItem = sysDimItemRaw; + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = extend({}, sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; // `coordDimIndex` should not be set directly. + + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + + var dataDims = encodeDefMap.get(coordDim); // negative resultDimIdx means no need to mapping. + + if (dataDims === false) { + return; + } + + dataDims = normalizeToArray(dataDims); // dimensions provides default dim sequences. + + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) { + availDimIdx++; + } + + availDimIdx < dimCount && dataDims.push(availDimIdx++); + } + } // Apply templates. + + + each(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = getResultItem(resultDimIdx); // Coordinate system has a higher priority on dim type than source. + + if (isUsingSourceDimensionsDef && sysDimItem.type != null) { + resultItem.type = sysDimItem.type; + } + + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { + name: sysDimItemDimsDefItem + }); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + + + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + + function applyDim(resultItem, coordDim, coordDimIndex) { + if (VISUAL_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } // Make sure the first extra dim is 'value'. + + + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; + var extra = generateCoord || 'value'; + + function ifNoNameFillWithCoordName(resultItem) { + if (resultItem.name == null) { + // Duplication will be removed in the next step. + resultItem.name = resultItem.coordDim; + } + } // Set dim `name` and other `coordDim` and other props. + + + if (!omitUnusedDimensions) { + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = getResultItem(resultDimIdx); + var coordDim = resultItem.coordDim; + + if (coordDim == null) { + // TODO no need to generate coordDim for isExtraCoord? + resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero); + resultItem.coordDimIndex = 0; // Series specified generateCoord is using out. + + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + + generateCoordCount--; + } + + ifNoNameFillWithCoordName(resultItem); + + if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must // Consider the case: + // { + // dataset: {source: [ + // ['2001', 123], + // ['2002', 456], + // ... + // ['The others', 987], + // ]}, + // series: {type: 'pie'} + // } + // The first column should better be treated as a "ordinal" although it + // might not be detected as an "ordinal" by `guessOrdinal`. + || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { + resultItem.type = 'ordinal'; + } + } + } else { + each(resultList, function (resultItem) { + // PENDING: guessOrdinal or let user specify type: 'ordinal' manually? + ifNoNameFillWithCoordName(resultItem); + }); // Sort dimensions: there are some rule that use the last dim as label, + // and for some latter travel process easier. + + resultList.sort(function (item0, item1) { + return item0.storeDimIndex - item1.storeDimIndex; + }); + } + + removeDuplication(resultList); + return new SeriesDataSchema({ + source: source, + dimensions: resultList, + fullDimensionCount: dimCount, + dimensionOmitted: omitUnusedDimensions + }); + } + + function removeDuplication(result) { + var duplicationMap = createHashMap(); + + for (var i = 0; i < result.length; i++) { + var dim = result[i]; + var dimOriginalName = dim.name; + var count = duplicationMap.get(dimOriginalName) || 0; + + if (count > 0) { + // Starts from 0. + dim.name = dimOriginalName + (count - 1); + } + + count++; + duplicationMap.set(dimOriginalName, count); + } + } // ??? TODO + // Originally detect dimCount by data[0]. Should we + // optimize it to only by sysDims and dimensions and encode. + // So only necessary dims will be initialized. + // But + // (1) custom series should be considered. where other dims + // may be visited. + // (2) sometimes user need to calculate bubble size or use visualMap + // on other dimensions besides coordSys needed. + // So, dims that is not used by system, should be shared in data store? + + + function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); + each(sysDims, function (sysDimItem) { + var sysDimItemDimsDef; + + if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { + dimCount = Math.max(dimCount, sysDimItemDimsDef.length); + } + }); + return dimCount; + } + + function genCoordDimName(name, map, fromZero) { + if (fromZero || map.hasKey(name)) { + var i = 0; + + while (map.hasKey(name + i)) { + i++; + } + + name += i; + } + + map.set(name, true); + return name; + } + + /** + * @class + * For example: + * { + * coordSysName: 'cartesian2d', + * coordSysDims: ['x', 'y', ...], + * axisMap: HashMap({ + * x: xAxisModel, + * y: yAxisModel + * }), + * categoryAxisMap: HashMap({ + * x: xAxisModel, + * y: undefined + * }), + * // The index of the first category axis in `coordSysDims`. + * // `null/undefined` means no category axis exists. + * firstCategoryDimIndex: 1, + * // To replace user specified encode. + * } + */ + + var CoordSysInfo = + /** @class */ + function () { + function CoordSysInfo(coordSysName) { + this.coordSysDims = []; + this.axisMap = createHashMap(); + this.categoryAxisMap = createHashMap(); + this.coordSysName = coordSysName; + } + + return CoordSysInfo; + }(); + + function getCoordSysInfoBySeries(seriesModel) { + var coordSysName = seriesModel.get('coordinateSystem'); + var result = new CoordSysInfo(coordSysName); + var fetch = fetchers[coordSysName]; + + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } + } + var fetchers = { + cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!xAxisModel) { + throw new Error('xAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '" not found'); + } + + if (!yAxisModel) { + throw new Error('yAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '" not found'); + } + } + + result.coordSysDims = ['x', 'y']; + axisMap.set('x', xAxisModel); + axisMap.set('y', yAxisModel); + + if (isCategory(xAxisModel)) { + categoryAxisMap.set('x', xAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(yAxisModel)) { + categoryAxisMap.set('y', yAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!singleAxisModel) { + throw new Error('singleAxis should be specified.'); + } + } + + result.coordSysDims = ['single']; + axisMap.set('single', singleAxisModel); + + if (isCategory(singleAxisModel)) { + categoryAxisMap.set('single', singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + polar: function (seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + if ("development" !== 'production') { + if (!angleAxisModel) { + throw new Error('angleAxis option not found'); + } + + if (!radiusAxisModel) { + throw new Error('radiusAxis option not found'); + } + } + + result.coordSysDims = ['radius', 'angle']; + axisMap.set('radius', radiusAxisModel); + axisMap.set('angle', angleAxisModel); + + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set('radius', radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(angleAxisModel)) { + categoryAxisMap.set('angle', angleAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + geo: function (seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ['lng', 'lat']; + }, + parallel: function (seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + each(parallelModel.parallelAxisIndex, function (axisIndex, index) { + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + + if (isCategory(axisModel)) { + categoryAxisMap.set(axisDim, axisModel); + + if (result.firstCategoryDimIndex == null) { + result.firstCategoryDimIndex = index; + } + } + }); + } + }; + + function isCategory(axisModel) { + return axisModel.get('type') === 'category'; + } + + /** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param seriesModel + * @param dimensionsInput The same as the input of . + * The input will be modified. + * @param opt + * @param opt.stackedCoordDimension Specify a coord dimension if needed. + * @param opt.byIndex=false + * @return calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ + + function enableDataStack(seriesModel, dimensionsInput, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; + var dimensionDefineList; + var schema; + var store; + + if (isLegacyDimensionsInput(dimensionsInput)) { + dimensionDefineList = dimensionsInput; + } else { + schema = dimensionsInput.schema; + dimensionDefineList = schema.dimensions; + store = dimensionsInput.store; + } // Compatibal: when `stack` is set as '', do not stack. + + + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + each(dimensionDefineList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionDefineList[index] = dimensionInfo = { + name: dimensionInfo + }; + } + + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } // Find the first stackable dimension as the stackedDimInfo. + + + if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { + stackedDimInfo = dimensionInfo; + } + } + }); + + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + + + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + // Also need to use seriesModel.id as postfix because different + // series may share same data store. The stack dimension needs to be distinguished. + stackResultDimension = '__\0ecstackresult_' + seriesModel.id; + stackedOverDimension = '__\0ecstackedover_' + seriesModel.id; // Create inverted index to fast query index by value. + + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + + var stackedDimCoordDim_1 = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex_1 = 0; + each(dimensionDefineList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim_1) { + stackedDimCoordIndex_1++; + } + }); + var stackedOverDimensionDefine = { + name: stackResultDimension, + coordDim: stackedDimCoordDim_1, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + }; + var stackResultDimensionDefine = { + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex_1 + 1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + 1 + }; + + if (schema) { + if (store) { + stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); + stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); + } + + schema.appendCalculationDimension(stackedOverDimensionDefine); + schema.appendCalculationDimension(stackResultDimensionDefine); + } else { + dimensionDefineList.push(stackedOverDimensionDefine); + dimensionDefineList.push(stackResultDimensionDefine); + } + } + + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; + } + + function isLegacyDimensionsInput(dimensionsInput) { + return !isSeriesDataSchema(dimensionsInput.schema); + } + + function isDimensionStacked(data, stackedDim) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); + } + function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; + } + + function getCoordSysDimDefs(seriesModel, coordSysInfo) { + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + var coordSysDimDefs; + + if (coordSysInfo && coordSysInfo.coordSysDims) { + coordSysDimDefs = map(coordSysInfo.coordSysDims, function (dim) { + var dimInfo = { + name: dim + }; + var axisModel = coordSysInfo.axisMap.get(dim); + + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); + } + + return dimInfo; + }); + } + + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y']; + } + + return coordSysDimDefs; + } + + function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) { + var firstCategoryDimIndex; + var hasNameEncode; + coordSysInfo && each(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); + + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + + if (createInvertedIndices) { + dimInfo.createInvertedIndices = true; + } + } + + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + + return firstCategoryDimIndex; + } + /** + * Caution: there are side effects to `sourceManager` in this method. + * Should better only be called in `Series['getInitialData']`. + */ + + + function createSeriesData(sourceRaw, seriesModel, opt) { + opt = opt || {}; + var sourceManager = seriesModel.getSourceManager(); + var source; + var isOriginalSource = false; + + if (sourceRaw) { + isOriginalSource = true; + source = createSourceFromSeriesDataOption(sourceRaw); + } else { + source = sourceManager.getSource(); // Is series.data. not dataset. + + isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; + } + + var coordSysInfo = getCoordSysInfoBySeries(seriesModel); + var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); + var useEncodeDefaulter = opt.useEncodeDefaulter; + var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null; + var createDimensionOptions = { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord, + encodeDefine: seriesModel.getEncode(), + encodeDefaulter: encodeDefaulter, + canOmitUnusedDimensions: !isOriginalSource + }; + var schema = prepareSeriesDataSchema(source, createDimensionOptions); + var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo); + var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; + var stackCalculationInfo = enableDataStack(seriesModel, { + schema: schema, + store: store + }); + var data = new SeriesData(schema, seriesModel); + data.setCalculationInfo(stackCalculationInfo); + var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } : null; + data.hasItemOption = false; + data.initData( // Try to reuse the data store in sourceManager if using dataset. + isOriginalSource ? source : store, null, dimValueGetter); + return data; + } + + function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return !isArray(getDataItemValue(sampleItem)); + } + } + + function firstDataNotNull(arr) { + var i = 0; + + while (i < arr.length && arr[i] == null) { + i++; + } + + return arr[i]; + } + + var Scale = + /** @class */ + function () { + function Scale(setting) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } + + Scale.prototype.getSetting = function (name) { + return this._setting[name]; + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Get extent + * + * Extent is always in increase order. + */ + + + Scale.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Set extent + */ + + + Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + + if (!isNaN(start)) { + thisExtent[0] = start; + } + + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + /** + * If value is in extent range + */ + + + Scale.prototype.isInExtentRange = function (value) { + return this._extent[0] <= value && this._extent[1] >= value; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.isBlank = function () { + return this._isBlank; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; + }; + + return Scale; + }(); + + enableClassManagement(Scale); + + var uidBase = 0; + + var OrdinalMeta = + /** @class */ + function () { + function OrdinalMeta(opt) { + this.categories = opt.categories || []; + this._needCollect = opt.needCollect; + this._deduplication = opt.deduplication; + this.uid = ++uidBase; + } + + OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map(data, getName); + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); + }; + + OrdinalMeta.prototype.getOrdinal = function (category) { + // @ts-ignore + return this._getOrCreateMap().get(category); + }; + /** + * @return The ordinal. If not found, return NaN. + */ + + + OrdinalMeta.prototype.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + + if (!isString(category) && !needCollect) { + return category; + } // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + + + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + + var map = this._getOrCreateMap(); // @ts-ignore + + + index = map.get(category); + + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; // @ts-ignore + + map.set(category, index); + } else { + index = NaN; + } + } + + return index; + }; // Consider big data, do not create map until needed. + + + OrdinalMeta.prototype._getOrCreateMap = function () { + return this._map || (this._map = createHashMap(this.categories)); + }; + + return OrdinalMeta; + }(); + + function getName(obj) { + if (isObject(obj) && obj.value != null) { + return obj.value; + } else { + return obj + ''; + } + } + + function isValueNice(val) { + var exp10 = Math.pow(10, quantityExponent(Math.abs(val))); + var f = Math.abs(val / exp10); + return f === 0 || f === 1 || f === 2 || f === 3 || f === 5; + } + function isIntervalOrLogScale(scale) { + return scale.type === 'interval' || scale.type === 'log'; + } + /** + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. + */ + + function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + var interval = result.interval = nice(span / splitNumber, true); + + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } // Tow more digital for tick. + + + var precision = result.intervalPrecision = getIntervalPrecision(interval); // Niced extent inside original extent + + var niceTickExtent = result.niceTickExtent = [round(Math.ceil(extent[0] / interval) * interval, precision), round(Math.floor(extent[1] / interval) * interval, precision)]; + fixExtent(niceTickExtent, extent); + return result; + } + function increaseInterval(interval) { + var exp10 = Math.pow(10, quantityExponent(interval)); // Increase interval + + var f = interval / exp10; + + if (!f) { + f = 1; + } else if (f === 2) { + f = 3; + } else if (f === 3) { + f = 5; + } else { + // f is 1 or 5 + f *= 2; + } + + return round(f * exp10); + } + /** + * @return interval precision + */ + + function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecision(interval) + 2; + } + + function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); + } // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. + + + function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } + } + function contain$1(val, extent) { + return val >= extent[0] && val <= extent[1]; + } + function normalize$1(val, extent) { + if (extent[1] === extent[0]) { + return 0.5; + } + + return (val - extent[0]) / (extent[1] - extent[0]); + } + function scale$2(val, extent) { + return val * (extent[1] - extent[0]) + extent[0]; + } + + var OrdinalScale = + /** @class */ + function (_super) { + __extends(OrdinalScale, _super); + + function OrdinalScale(setting) { + var _this = _super.call(this, setting) || this; + + _this.type = 'ordinal'; + + var ordinalMeta = _this.getSetting('ordinalMeta'); // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + + + if (!ordinalMeta) { + ordinalMeta = new OrdinalMeta({}); + } + + if (isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({ + categories: map(ordinalMeta, function (item) { + return isObject(item) ? item.value : item; + }) + }); + } + + _this._ordinalMeta = ordinalMeta; + _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + return _this; + } + + OrdinalScale.prototype.parse = function (val) { + // Caution: Math.round(null) will return `0` rather than `NaN` + if (val == null) { + return NaN; + } + + return isString(val) ? this._ordinalMeta.getOrdinal(val) // val might be float. + : Math.round(val); + }; + + OrdinalScale.prototype.contain = function (rank) { + rank = this.parse(rank); + return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null; + }; + /** + * Normalize given rank or name to linear [0, 1] + * @param val raw ordinal number. + * @return normalized value in [0, 1]. + */ + + + OrdinalScale.prototype.normalize = function (val) { + val = this._getTickNumber(this.parse(val)); + return normalize$1(val, this._extent); + }; + /** + * @param val normalized value in [0, 1]. + * @return raw ordinal number. + */ + + + OrdinalScale.prototype.scale = function (val) { + val = Math.round(scale$2(val, this._extent)); + return this.getRawOrdinalNumber(val); + }; + + OrdinalScale.prototype.getTicks = function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push({ + value: rank + }); + rank++; + } + + return ticks; + }; + + OrdinalScale.prototype.getMinorTicks = function (splitNumber) { + // Not support. + return; + }; + /** + * @see `Ordinal['_ordinalNumbersByTick']` + */ + + + OrdinalScale.prototype.setSortInfo = function (info) { + if (info == null) { + this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; + return; + } + + var infoOrdinalNumbers = info.ordinalNumbers; + var ordinalsByTick = this._ordinalNumbersByTick = []; + var ticksByOrdinal = this._ticksByOrdinalNumber = []; // Unnecessary support negative tick in `realtimeSort`. + + var tickNum = 0; + var allCategoryLen = this._ordinalMeta.categories.length; + + for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) { + var ordinalNumber = infoOrdinalNumbers[tickNum]; + ordinalsByTick[tickNum] = ordinalNumber; + ticksByOrdinal[ordinalNumber] = tickNum; + } // Handle that `series.data` only covers part of the `axis.category.data`. + + + var unusedOrdinal = 0; + + for (; tickNum < allCategoryLen; ++tickNum) { + while (ticksByOrdinal[unusedOrdinal] != null) { + unusedOrdinal++; + } + ordinalsByTick.push(unusedOrdinal); + ticksByOrdinal[unusedOrdinal] = tickNum; + } + }; + + OrdinalScale.prototype._getTickNumber = function (ordinal) { + var ticksByOrdinalNumber = this._ticksByOrdinalNumber; // also support ordinal out of range of `ordinalMeta.categories.length`, + // where ordinal numbers are used as tick value directly. + + return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; + }; + /** + * @usage + * ```js + * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal); + * + * // case0 + * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber]; + * // case1 + * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber]; + * // case2 + * const coord = axis.dataToCoord(ordinalNumber); + * ``` + * + * @param {OrdinalNumber} tickNumber index of display + */ + + + OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) { + var ordinalNumbersByTick = this._ordinalNumbersByTick; // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`., + // where ordinal numbers are used as tick value directly. + + return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; + }; + /** + * Get item on tick + */ + + + OrdinalScale.prototype.getLabel = function (tick) { + if (!this.isBlank()) { + var ordinalNumber = this.getRawOrdinalNumber(tick.value); + var cateogry = this._ordinalMeta.categories[ordinalNumber]; // Note that if no data, ordinalMeta.categories is an empty array. + // Return empty if it's not exist. + + return cateogry == null ? '' : cateogry + ''; + } + }; + + OrdinalScale.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1; + }; + + OrdinalScale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * @override + * If value is in extent range + */ + + + OrdinalScale.prototype.isInExtentRange = function (value) { + value = this._getTickNumber(value); + return this._extent[0] <= value && this._extent[1] >= value; + }; + + OrdinalScale.prototype.getOrdinalMeta = function () { + return this._ordinalMeta; + }; + + OrdinalScale.prototype.calcNiceTicks = function () {}; + + OrdinalScale.prototype.calcNiceExtent = function () {}; + + OrdinalScale.type = 'ordinal'; + return OrdinalScale; + }(Scale); + + Scale.registerClass(OrdinalScale); + + var roundNumber = round; + + var IntervalScale = + /** @class */ + function (_super) { + __extends(IntervalScale, _super); + + function IntervalScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'interval'; // Step is calculated in adjustExtent. + + _this._interval = 0; + _this._intervalPrecision = 2; + return _this; + } + + IntervalScale.prototype.parse = function (val) { + return val; + }; + + IntervalScale.prototype.contain = function (val) { + return contain$1(val, this._extent); + }; + + IntervalScale.prototype.normalize = function (val) { + return normalize$1(val, this._extent); + }; + + IntervalScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + IntervalScale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; // start,end may be a Number like '25',so... + + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }; + + IntervalScale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // unionExtent may called by it's sub classes + + this.setExtent(extent[0], extent[1]); + }; + + IntervalScale.prototype.getInterval = function () { + return this._interval; + }; + + IntervalScale.prototype.setInterval = function (interval) { + this._interval = interval; // Dropped auto calculated niceExtent and use user-set extent. + // We assume user wants to set both interval, min, max to get a better result. + + this._niceExtent = this._extent.slice(); + this._intervalPrecision = getIntervalPrecision(interval); + }; + /** + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + + + IntervalScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var niceTickExtent = this._niceExtent; + var intervalPrecision = this._intervalPrecision; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } // Consider this case: using dataZoom toolbox, zoom and zoom. + + + var safeLimit = 10000; + + if (extent[0] < niceTickExtent[0]) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[0] + }); + } + } + + var tick = niceTickExtent[0]; + + while (tick <= niceTickExtent[1]) { + ticks.push({ + value: tick + }); // Avoid rounding error + + tick = roundNumber(tick + interval, intervalPrecision); + + if (tick === ticks[ticks.length - 1].value) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + + if (ticks.length > safeLimit) { + return []; + } + } // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + + + var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; + + if (extent[1] > lastNiceTick) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(lastNiceTick + interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[1] + }); + } + } + + return ticks; + }; + + IntervalScale.prototype.getMinorTicks = function (splitNumber) { + var ticks = this.getTicks(true); + var minorTicks = []; + var extent = this.getExtent(); + + for (var i = 1; i < ticks.length; i++) { + var nextTick = ticks[i]; + var prevTick = ticks[i - 1]; + var count = 0; + var minorTicksGroup = []; + var interval = nextTick.value - prevTick.value; + var minorInterval = interval / splitNumber; + + while (count < splitNumber - 1) { + var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval); // For the first and last interval. The count may be less than splitNumber. + + if (minorTick > extent[0] && minorTick < extent[1]) { + minorTicksGroup.push(minorTick); + } + + count++; + } + + minorTicks.push(minorTicksGroup); + } + + return minorTicks; + }; + /** + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. + */ + + + IntervalScale.prototype.getLabel = function (data, opt) { + if (data == null) { + return ''; + } + + var precision = opt && opt.precision; + + if (precision == null) { + precision = getPrecision(data.value) || 0; + } else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + + + var dataNum = roundNumber(data.value, precision, true); + return addCommas(dataNum); + }; + /** + * @param splitNumber By default `5`. + */ + + + IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (!isFinite(span)) { + return; + } // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + + + if (span < 0) { + span = -span; + extent.reverse(); + } + + var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }; + + IntervalScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + // Note that extents can be both negative. See #13154 + var expandSize = Math.abs(extent[0]); // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } else { + extent[0] -= expandSize / 2; + } + } else { + extent[1] = 1; + } + } + + var span = extent[1] - extent[0]; // If there are no data and extent are [Infinity, -Infinity] + + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); // let extent = this._extent; + + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); + } + + if (!opt.fixMax) { + extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); + } + }; + + IntervalScale.prototype.setNiceExtent = function (min, max) { + this._niceExtent = [min, max]; + }; + + IntervalScale.type = 'interval'; + return IntervalScale; + }(Scale); + + Scale.registerClass(IntervalScale); + + /* global Float32Array */ + + var supportFloat32Array = typeof Float32Array !== 'undefined'; + var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; + function createFloat32Array(arg) { + if (isArray(arg)) { + // Return self directly if don't support TypedArray. + return supportFloat32Array ? new Float32Array(arg) : arg; + } // Else is number + + + return new Float32ArrayCtor(arg); + } + + var STACK_PREFIX = '__ec_stack_'; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; + } + + function getAxisKey(axis) { + return axis.dim + axis.index; + } + /** + * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined. + */ + + + function getLayoutOnAxis(opt) { + var params = []; + var baseAxis = opt.axis; + var axisKey = 'axis0'; + + if (baseAxis.type !== 'category') { + return; + } + + var bandWidth = baseAxis.getBandWidth(); + + for (var i = 0; i < opt.count || 0; i++) { + params.push(defaults({ + bandWidth: bandWidth, + axisKey: axisKey, + stackId: STACK_PREFIX + i + }, opt)); + } + + var widthAndOffsets = doCalBarWidthAndOffset(params); + var result = []; + + for (var i = 0; i < opt.count; i++) { + var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; + item.offsetCenter = item.offset + item.width / 2; + result.push(item); + } + + return result; + } + function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; + } + /** + * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent + * values. + * This works for time axes, value axes, and log axes. + * For a single time axis, return value is in the form like + * {'x_0': [1000000]}. + * The value of 1000000 is in milliseconds. + */ + + function getValueAxesMinGaps(barSeries) { + /** + * Map from axis.index to values. + * For a single time axis, axisValues is in the form like + * {'x_0': [1495555200000, 1495641600000, 1495728000000]}. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = {}; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + if (baseAxis.type !== 'time' && baseAxis.type !== 'value') { + return; + } + + var data = seriesModel.getData(); + var key = baseAxis.dim + '_' + baseAxis.index; + var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var store = data.getStore(); + + for (var i = 0, cnt = store.count(); i < cnt; ++i) { + var value = store.get(dimIdx, i); + + if (!axisValues[key]) { + // No previous data for the axis + axisValues[key] = [value]; + } else { + // No value in previous series + axisValues[key].push(value); + } // Ignore duplicated time values in the same axis + + } + }); + var axisMinGaps = {}; + + for (var key in axisValues) { + if (axisValues.hasOwnProperty(key)) { + var valuesInAxis = axisValues[key]; + + if (valuesInAxis) { + // Sort axis values into ascending order to calculate gaps + valuesInAxis.sort(function (a, b) { + return a - b; + }); + var min = null; + + for (var j = 1; j < valuesInAxis.length; ++j) { + var delta = valuesInAxis[j] - valuesInAxis[j - 1]; + + if (delta > 0) { + // Ignore 0 delta because they are of the same axis value + min = min === null ? delta : Math.min(min, delta); + } + } // Set to null if only have one data + + + axisMinGaps[key] = min; + } + } + } + + return axisMinGaps; + } + + function makeColumnLayout(barSeries) { + var axisMinGaps = getValueAxesMinGaps(barSeries); + var seriesInfoList = []; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else if (baseAxis.type === 'value' || baseAxis.type === 'time') { + var key = baseAxis.dim + '_' + baseAxis.index; + var minGap = axisMinGaps[key]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value + } else { + var data = seriesModel.getData(); + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } + + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barMinWidth = parsePercent$1( // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis, + // the auto-calculated bar width might be less than 0.5 / 1. + seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barMinWidth: barMinWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + return doCalBarWidthAndOffset(seriesInfoList); + } + + function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + each(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: null, + gap: '20%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = seriesInfo.stackId; + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + + var barWidth = seriesInfo.barWidth; + + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barMinWidth = seriesInfo.barMinWidth; + barMinWidth && (stacks[stackId].minWidth = barMinWidth); + var barGap = seriesInfo.barGap; + barGap != null && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGapPercent = columnsOnAxis.categoryGap; + + if (categoryGapPercent == null) { + var columnCount = keys(stacks).length; // More columns in one group + // the spaces between group is smaller. Or the column will be too thin. + + categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%'; + } + + var categoryGap = parsePercent$1(categoryGapPercent, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column) { + var maxWidth = column.maxWidth; + var minWidth = column.minWidth; + + if (!column.width) { + var finalWidth = autoWidth; + + if (maxWidth && maxWidth < finalWidth) { + finalWidth = Math.min(maxWidth, remainedWidth); + } // `minWidth` has higher priority. `minWidth` decide that whether the + // bar is able to be visible. So `minWidth` should not be restricted + // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In + // the extreme cases for `value` axis, bars are allowed to overlap + // with each other if `minWidth` specified. + + + if (minWidth && minWidth > finalWidth) { + finalWidth = minWidth; + } + + if (finalWidth !== autoWidth) { + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + } else { + // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as + // CSS does. Because barWidth can be a percent value, where + // `barMaxWidth` can be used to restrict the final width. + var finalWidth = column.width; + + if (maxWidth) { + finalWidth = Math.min(finalWidth, maxWidth); + } // `minWidth` has higher priority, as described above + + + if (minWidth) { + finalWidth = Math.max(finalWidth, minWidth); + } + + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + bandWidth: bandWidth, + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + + if (result != null && seriesModel != null) { + return result[getSeriesStackId(seriesModel)]; + } + + return result; + } + } + function layout(seriesType, ecModel) { + var seriesModels = prepareLayoutBarSeries(seriesType, ecModel); + var barWidthAndOffset = makeColumnLayout(seriesModels); + each(seriesModels, function (seriesModel) { + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + data.setLayout({ + bandWidth: columnLayoutInfo.bandWidth, + offset: columnOffset, + size: columnWidth + }); + }); + } // TODO: Do not support stack in large mode yet. + + function createProgressiveLayout(seriesType) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + if (!isOnCartesian(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var valueAxis = cartesian.getOtherAxis(baseAxis); + var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis.dim)); + var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var drawBackground = seriesModel.get('showBackground', true); + var valueDim = data.mapDimension(valueAxis.dim); + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo('stackedOnSeries'); + var isValueAxisH = valueAxis.isHorizontal(); + var valueAxisStart = getValueAxisStart(baseAxis, valueAxis); + var isLarge = isInLargeMode(seriesModel); + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim); // Layout info. + + var columnWidth = data.getLayout('size'); + var columnOffset = data.getLayout('offset'); + return { + progress: function (params, data) { + var count = params.count; + var largePoints = isLarge && createFloat32Array(count * 3); + var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count * 3); + var largeDataIndices = isLarge && createFloat32Array(count); + var coordLayout = cartesian.master.getRect(); + var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height; + var dataIndex; + var store = data.getStore(); + var idxOffset = 0; + + while ((dataIndex = params.next()) != null) { + var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex); + var baseValue = store.get(baseDimIdx, dataIndex); + var baseCoord = valueAxisStart; + var startValue = void 0; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + + if (stacked) { + startValue = +value - store.get(valueDimIdx, dataIndex); + } + + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (isValueAxisH) { + var coord = cartesian.dataToPoint([value, baseValue]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([startValue, baseValue]); + baseCoord = startCoord[0]; + } + + x = baseCoord; + y = coord[1] + columnOffset; + width = coord[0] - baseCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + } else { + var coord = cartesian.dataToPoint([baseValue, value]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([baseValue, startValue]); + baseCoord = startCoord[1]; + } + + x = coord[0] + columnOffset; + y = baseCoord; + width = columnWidth; + height = coord[1] - baseCoord; + + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + } + + if (!isLarge) { + data.setItemLayout(dataIndex, { + x: x, + y: y, + width: width, + height: height + }); + } else { + largePoints[idxOffset] = x; + largePoints[idxOffset + 1] = y; + largePoints[idxOffset + 2] = isValueAxisH ? width : height; + + if (largeBackgroundPoints) { + largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x; + largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y; + largeBackgroundPoints[idxOffset + 2] = bgSize; + } + + largeDataIndices[dataIndex] = dataIndex; + } + + idxOffset += 3; + } + + if (isLarge) { + data.setLayout({ + largePoints: largePoints, + largeDataIndices: largeDataIndices, + largeBackgroundPoints: largeBackgroundPoints, + valueAxisHorizontal: isValueAxisH + }); + } + } + }; + } + }; + } + + function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + + function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; + } // See cases in `test/bar-start.html` and `#7412`, `#8747`. + + + function getValueAxisStart(baseAxis, valueAxis) { + return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? 1 : 0)); + } + + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + + if (a[mid][1] < x) { + lo = mid + 1; + } else { + hi = mid; + } + } + + return lo; + }; + + var TimeScale = + /** @class */ + function (_super) { + __extends(TimeScale, _super); + + function TimeScale(settings) { + var _this = _super.call(this, settings) || this; + + _this.type = 'time'; + return _this; + } + /** + * Get label is mainly for other components like dataZoom, tooltip. + */ + + + TimeScale.prototype.getLabel = function (tick) { + var useUTC = this.getSetting('useUTC'); + return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale')); + }; + + TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) { + var isUTC = this.getSetting('useUTC'); + var lang = this.getSetting('locale'); + return leveledFormat(tick, idx, labelFormatter, lang, isUTC); + }; + /** + * @override + */ + + + TimeScale.prototype.getTicks = function () { + var interval = this._interval; + var extent = this._extent; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } + + ticks.push({ + value: extent[0], + level: 0 + }); + var useUTC = this.getSetting('useUTC'); + var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); + ticks = ticks.concat(innerTicks); + ticks.push({ + value: extent[1], + level: 0 + }); + return ticks; + }; + + TimeScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } // If there are no data and extent are [Infinity, -Infinity] + + + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + }; + + TimeScale.prototype.calcNiceTicks = function (approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + this._approxInterval = span / approxTickNum; + + if (minInterval != null && this._approxInterval < minInterval) { + this._approxInterval = minInterval; + } + + if (maxInterval != null && this._approxInterval > maxInterval) { + this._approxInterval = maxInterval; + } + + var scaleIntervalsLen = scaleIntervals.length; + var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); // Interval that can be used to calculate ticks + + this._interval = scaleIntervals[idx][1]; // Min level used when picking ticks from top down. + // We check one more level to avoid the ticks are to sparse in some case. + + this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; + }; + + TimeScale.prototype.parse = function (val) { + // val might be float. + return isNumber(val) ? val : +parseDate(val); + }; + + TimeScale.prototype.contain = function (val) { + return contain$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.normalize = function (val) { + return normalize$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + TimeScale.type = 'time'; + return TimeScale; + }(IntervalScale); + /** + * This implementation was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + var scaleIntervals = [// Format interval + ['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y + ]; + + function isUnitValueSame(unit, valueA, valueB, isUTC) { + var dateA = parseDate(valueA); + var dateB = parseDate(valueB); + + var isSame = function (unit) { + return getUnitValue(dateA, unit, isUTC) === getUnitValue(dateB, unit, isUTC); + }; + + var isSameYear = function () { + return isSame('year'); + }; // const isSameHalfYear = () => isSameYear() && isSame('half-year'); + // const isSameQuater = () => isSameYear() && isSame('quarter'); + + + var isSameMonth = function () { + return isSameYear() && isSame('month'); + }; + + var isSameDay = function () { + return isSameMonth() && isSame('day'); + }; // const isSameHalfDay = () => isSameDay() && isSame('half-day'); + + + var isSameHour = function () { + return isSameDay() && isSame('hour'); + }; + + var isSameMinute = function () { + return isSameHour() && isSame('minute'); + }; + + var isSameSecond = function () { + return isSameMinute() && isSame('second'); + }; + + var isSameMilliSecond = function () { + return isSameSecond() && isSame('millisecond'); + }; + + switch (unit) { + case 'year': + return isSameYear(); + + case 'month': + return isSameMonth(); + + case 'day': + return isSameDay(); + + case 'hour': + return isSameHour(); + + case 'minute': + return isSameMinute(); + + case 'second': + return isSameSecond(); + + case 'millisecond': + return isSameMilliSecond(); + } + } // const primaryUnitGetters = { + // year: fullYearGetterName(), + // month: monthGetterName(), + // day: dateGetterName(), + // hour: hoursGetterName(), + // minute: minutesGetterName(), + // second: secondsGetterName(), + // millisecond: millisecondsGetterName() + // }; + // const primaryUnitUTCGetters = { + // year: fullYearGetterName(true), + // month: monthGetterName(true), + // day: dateGetterName(true), + // hour: hoursGetterName(true), + // minute: minutesGetterName(true), + // second: secondsGetterName(true), + // millisecond: millisecondsGetterName(true) + // }; + // function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) { + // step = step || 1; + // switch (getPrimaryTimeUnit(unitName)) { + // case 'year': + // date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step); + // break; + // case 'month': + // date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step); + // break; + // case 'day': + // date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step); + // break; + // case 'hour': + // date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step); + // break; + // case 'minute': + // date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step); + // break; + // case 'second': + // date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step); + // break; + // case 'millisecond': + // date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step); + // break; + // } + // return date.getTime(); + // } + // const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]]; + // const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]]; + // const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]]; + + + function getDateInterval(approxInterval, daysInMonth) { + approxInterval /= ONE_DAY; + return approxInterval > 16 ? 16 // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick between two months. + : approxInterval > 7.5 ? 7 // TODO week 7 or day 8? + : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; + } + + function getMonthInterval(approxInterval) { + var APPROX_ONE_MONTH = 30 * ONE_DAY; + approxInterval /= APPROX_ONE_MONTH; + return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; + } + + function getHourInterval(approxInterval) { + approxInterval /= ONE_HOUR; + return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; + } + + function getMinutesAndSecondsInterval(approxInterval, isMinutes) { + approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; + return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; + } + + function getMillisecondsInterval(approxInterval) { + return nice(approxInterval, true); + } + + function getFirstTimestampOfUnit(date, unitName, isUTC) { + var outDate = new Date(date); + + switch (getPrimaryTimeUnit(unitName)) { + case 'year': + case 'month': + outDate[monthSetterName(isUTC)](0); + + case 'day': + outDate[dateSetterName(isUTC)](1); + + case 'hour': + outDate[hoursSetterName(isUTC)](0); + + case 'minute': + outDate[minutesSetterName(isUTC)](0); + + case 'second': + outDate[secondsSetterName(isUTC)](0); + outDate[millisecondsSetterName(isUTC)](0); + } + + return outDate.getTime(); + } + + function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { + var safeLimit = 10000; + var unitNames = timeUnits; + var iter = 0; + + function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { + var date = new Date(minTimestamp); + var dateTime = minTimestamp; + var d = date[getMethodName](); // if (isDate) { + // d -= 1; // Starts with 0; PENDING + // } + + while (dateTime < maxTimestamp && dateTime <= extent[1]) { + out.push({ + value: dateTime + }); + d += interval; + date[setMethodName](d); + dateTime = date.getTime(); + } // This extra tick is for calcuating ticks of next level. Will not been added to the final result + + + out.push({ + value: dateTime, + notAdd: true + }); + } + + function addLevelTicks(unitName, lastLevelTicks, levelTicks) { + var newAddedTicks = []; + var isFirstLevel = !lastLevelTicks.length; + + if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { + return; + } + + if (isFirstLevel) { + lastLevelTicks = [{ + // TODO Optimize. Not include so may ticks. + value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) + }, { + value: extent[1] + }]; + } + + for (var i = 0; i < lastLevelTicks.length - 1; i++) { + var startTick = lastLevelTicks[i].value; + var endTick = lastLevelTicks[i + 1].value; + + if (startTick === endTick) { + continue; + } + + var interval = void 0; + var getterName = void 0; + var setterName = void 0; + var isDate = false; + + switch (unitName) { + case 'year': + interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); + getterName = fullYearGetterName(isUTC); + setterName = fullYearSetterName(isUTC); + break; + + case 'half-year': + case 'quarter': + case 'month': + interval = getMonthInterval(approxInterval); + getterName = monthGetterName(isUTC); + setterName = monthSetterName(isUTC); + break; + + case 'week': // PENDING If week is added. Ignore day. + + case 'half-week': + case 'day': + interval = getDateInterval(approxInterval); // Use 32 days and let interval been 16 + + getterName = dateGetterName(isUTC); + setterName = dateSetterName(isUTC); + isDate = true; + break; + + case 'half-day': + case 'quarter-day': + case 'hour': + interval = getHourInterval(approxInterval); + getterName = hoursGetterName(isUTC); + setterName = hoursSetterName(isUTC); + break; + + case 'minute': + interval = getMinutesAndSecondsInterval(approxInterval, true); + getterName = minutesGetterName(isUTC); + setterName = minutesSetterName(isUTC); + break; + + case 'second': + interval = getMinutesAndSecondsInterval(approxInterval, false); + getterName = secondsGetterName(isUTC); + setterName = secondsSetterName(isUTC); + break; + + case 'millisecond': + interval = getMillisecondsInterval(approxInterval); + getterName = millisecondsGetterName(isUTC); + setterName = millisecondsSetterName(isUTC); + break; + } + + addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); + + if (unitName === 'year' && levelTicks.length > 1 && i === 0) { + // Add nearest years to the left extent. + levelTicks.unshift({ + value: levelTicks[0].value - interval + }); + } + } + + for (var i = 0; i < newAddedTicks.length; i++) { + levelTicks.push(newAddedTicks[i]); + } // newAddedTicks.length && console.log(unitName, newAddedTicks); + + + return newAddedTicks; + } + + var levelsTicks = []; + var currentLevelTicks = []; + var tickCount = 0; + var lastLevelTickCount = 0; + + for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { + var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); + + if (!isPrimaryTimeUnit(unitNames[i])) { + // TODO + continue; + } + + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; + + if (primaryTimeUnit !== nextPrimaryTimeUnit) { + if (currentLevelTicks.length) { + lastLevelTickCount = tickCount; // Remove the duplicate so the tick count can be precisely. + + currentLevelTicks.sort(function (a, b) { + return a.value - b.value; + }); + var levelTicksRemoveDuplicated = []; + + for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { + var tickValue = currentLevelTicks[i_1].value; + + if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { + levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); + + if (tickValue >= extent[0] && tickValue <= extent[1]) { + tickCount++; + } + } + } + + var targetTickNum = (extent[1] - extent[0]) / approxInterval; // Added too much in this level and not too less in last level + + if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { + break; + } // Only treat primary time unit as one level. + + + levelsTicks.push(levelTicksRemoveDuplicated); + + if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { + break; + } + } // Reset if next unitName is primary + + + currentLevelTicks = []; + } + } + + if ("development" !== 'production') { + if (iter >= safeLimit) { + warn('Exceed safe limit.'); + } + } + + var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) { + return filter(levelTicks, function (tick) { + return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; + }); + }), function (levelTicks) { + return levelTicks.length > 0; + }); + var ticks = []; + var maxLevel = levelsTicksInExtent.length - 1; + + for (var i = 0; i < levelsTicksInExtent.length; ++i) { + var levelTicks = levelsTicksInExtent[i]; + + for (var k = 0; k < levelTicks.length; ++k) { + ticks.push({ + value: levelTicks[k].value, + level: maxLevel - i + }); + } + } + + ticks.sort(function (a, b) { + return a.value - b.value; + }); // Remove duplicates + + var result = []; + + for (var i = 0; i < ticks.length; ++i) { + if (i === 0 || ticks[i].value !== ticks[i - 1].value) { + result.push(ticks[i]); + } + } + + return result; + } + + Scale.registerClass(TimeScale); + + var scaleProto = Scale.prototype; // FIXME:TS refactor: not good to call it directly with `this`? + + var intervalScaleProto = IntervalScale.prototype; + var roundingErrorFix = round; + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow$1 = Math.pow; + var mathLog = Math.log; + + var LogScale = + /** @class */ + function (_super) { + __extends(LogScale, _super); + + function LogScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'log'; + _this.base = 10; + _this._originalScale = new IntervalScale(); // FIXME:TS actually used by `IntervalScale` + + _this._interval = 0; + return _this; + } + /** + * @param Whether expand the ticks to niced extent. + */ + + + LogScale.prototype.getTicks = function (expandToNicedExtent) { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + return map(ticks, function (tick) { + var val = tick.value; + var powVal = round(mathPow$1(this.base, val)); // Fix #4158 + + powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; + powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; + return { + value: powVal + }; + }, this); + }; + + LogScale.prototype.setExtent = function (start, end) { + var base = mathLog(this.base); // log(-Infinity) is NaN, so safe guard here + + start = mathLog(Math.max(0, start)) / base; + end = mathLog(Math.max(0, end)) / base; + intervalScaleProto.setExtent.call(this, start, end); + }; + /** + * @return {number} end + */ + + + LogScale.prototype.getExtent = function () { + var base = this.base; + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow$1(base, extent[0]); + extent[1] = mathPow$1(base, extent[1]); // Fix #4158 + + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + return extent; + }; + + LogScale.prototype.unionExtent = function (extent) { + this._originalScale.unionExtent(extent); + + var base = this.base; + extent[0] = mathLog(extent[0]) / mathLog(base); + extent[1] = mathLog(extent[1]) / mathLog(base); + scaleProto.unionExtent.call(this, extent); + }; + + LogScale.prototype.unionExtentFromData = function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Update interval and extent of intervals for nice ticks + * @param approxTickNum default 10 Given approx tick number + */ + + + LogScale.prototype.calcNiceTicks = function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (span === Infinity || span <= 0) { + return; + } + + var interval = quantity(span); + var err = approxTickNum / span * interval; // Filter ticks to get closer to the desired count. + + if (err <= 0.5) { + interval *= 10; + } // Interval should be integer + + + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + + var niceExtent = [round(mathCeil(extent[0] / interval) * interval), round(mathFloor(extent[1] / interval) * interval)]; + this._interval = interval; + this._niceExtent = niceExtent; + }; + + LogScale.prototype.calcNiceExtent = function (opt) { + intervalScaleProto.calcNiceExtent.call(this, opt); + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; + }; + + LogScale.prototype.parse = function (val) { + return val; + }; + + LogScale.prototype.contain = function (val) { + val = mathLog(val) / mathLog(this.base); + return contain$1(val, this._extent); + }; + + LogScale.prototype.normalize = function (val) { + val = mathLog(val) / mathLog(this.base); + return normalize$1(val, this._extent); + }; + + LogScale.prototype.scale = function (val) { + val = scale$2(val, this._extent); + return mathPow$1(this.base, val); + }; + + LogScale.type = 'log'; + return LogScale; + }(Scale); + + var proto = LogScale.prototype; + proto.getMinorTicks = intervalScaleProto.getMinorTicks; + proto.getLabel = intervalScaleProto.getLabel; + + function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecision(originalVal)); + } + + Scale.registerClass(LogScale); + + var ScaleRawExtentInfo = + /** @class */ + function () { + function ScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + this._prepareParams(scale, model, originalExtent); + } + /** + * Parameters depending on outside (like model, user callback) + * are prepared and fixed here. + */ + + + ScaleRawExtentInfo.prototype._prepareParams = function (scale, model, // Usually: data extent from all series on this axis. + dataExtent) { + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + + this._dataMin = dataExtent[0]; + this._dataMax = dataExtent[1]; + var isOrdinal = this._isOrdinal = scale.type === 'ordinal'; + this._needCrossZero = scale.type === 'interval' && model.getNeedCrossZero && model.getNeedCrossZero(); + var modelMinRaw = this._modelMinRaw = model.get('min', true); + + if (isFunction(modelMinRaw)) { + // This callback always provides users the full data extent (before data is filtered). + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMinRaw !== 'dataMin') { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw); + } + + var modelMaxRaw = this._modelMaxRaw = model.get('max', true); + + if (isFunction(modelMaxRaw)) { + // This callback always provides users the full data extent (before data is filtered). + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMaxRaw !== 'dataMax') { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw); + } + + if (isOrdinal) { + // FIXME: there is a flaw here: if there is no "block" data processor like `dataZoom`, + // and progressive rendering is using, here the category result might just only contain + // the processed chunk rather than the entire result. + this._axisDataLen = model.getCategories().length; + } else { + var boundaryGap = model.get('boundaryGap'); + var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; + + if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') { + if ("development" !== 'production') { + console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., "20%". Currently, ' + 'boundaryGap is set to be 0.'); + } + + this._boundaryGapInner = [0, 0]; + } else { + this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)]; + } + } + }; + /** + * Calculate extent by prepared parameters. + * This method has no external dependency and can be called duplicatedly, + * getting the same result. + * If parameters changed, should call this method to recalcuate. + */ + + + ScaleRawExtentInfo.prototype.calculate = function () { + // Notice: When min/max is not set (that is, when there are null/undefined, + // which is the most common case), these cases should be ensured: + // (1) For 'ordinal', show all axis.data. + // (2) For others: + // + `boundaryGap` is applied (if min/max set, boundaryGap is + // disabled). + // + If `needCrossZero`, min/max should be zero, otherwise, min/max should + // be the result that originalExtent enlarged by boundaryGap. + // (3) If no data, it should be ensured that `scale.setBlank` is set. + var isOrdinal = this._isOrdinal; + var dataMin = this._dataMin; + var dataMax = this._dataMax; + var axisDataLen = this._axisDataLen; + var boundaryGapInner = this._boundaryGapInner; + var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax', + // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`. + + var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum; + var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum; // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed. + + var minFixed = min != null; + var maxFixed = max != null; + + if (min == null) { + min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; + } + + if (max == null) { + max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; + } + + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen; // If data extent modified, need to recalculated to ensure cross zero. + + if (this._needCrossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !minFixed) { + min = 0; // minFixed = true; + } // Axis is under zero and max is not set + + + if (min < 0 && max < 0 && !maxFixed) { + max = 0; // maxFixed = true; + } // PENDING: + // When `needCrossZero` and all data is positive/negative, should it be ensured + // that the results processed by boundaryGap are positive/negative? + // If so, here `minFixed`/`maxFixed` need to be set. + + } + + var determinedMin = this._determinedMin; + var determinedMax = this._determinedMax; + + if (determinedMin != null) { + min = determinedMin; + minFixed = true; + } + + if (determinedMax != null) { + max = determinedMax; + maxFixed = true; + } // Ensure min/max be finite number or NaN here. (not to be null/undefined) + // `NaN` means min/max axis is blank. + + + return { + min: min, + max: max, + minFixed: minFixed, + maxFixed: maxFixed, + isBlank: isBlank + }; + }; + + ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) { + if ("development" !== 'production') { + assert(!this.frozen); + } + + this[DATA_MIN_MAX_ATTR[minMaxName]] = val; + }; + + ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) { + var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; + + if ("development" !== 'production') { + assert(!this.frozen // Earse them usually means logic flaw. + && this[attr] == null); + } + + this[attr] = val; + }; + + ScaleRawExtentInfo.prototype.freeze = function () { + // @ts-ignore + this.frozen = true; + }; + + return ScaleRawExtentInfo; + }(); + var DETERMINED_MIN_MAX_ATTR = { + min: '_determinedMin', + max: '_determinedMax' + }; + var DATA_MIN_MAX_ATTR = { + min: '_dataMin', + max: '_dataMax' + }; + /** + * Get scale min max and related info only depends on model settings. + * This method can be called after coordinate system created. + * For example, in data processing stage. + * + * Scale extent info probably be required multiple times during a workflow. + * For example: + * (1) `dataZoom` depends it to get the axis extent in "100%" state. + * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified. + * (3) `coordSys.update` use it to finally decide the scale extent. + * But the callback of `min`/`max` should not be called multiple times. + * The code below should not be implemented repeatedly either. + * So we cache the result in the scale instance, which will be recreated at the beginning + * of the workflow (because `scale` instance will be recreated each round of the workflow). + */ + + function ensureScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + // Do not permit to recreate. + var rawExtentInfo = scale.rawExtentInfo; + + if (rawExtentInfo) { + return rawExtentInfo; + } + + rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent); // @ts-ignore + + scale.rawExtentInfo = rawExtentInfo; + return rawExtentInfo; + } + function parseAxisModelMinMax(scale, minMax) { + return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax); + } + + /** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + * + * Caution: + * Precondition of calling this method: + * The scale extent has been initialized using series data extent via + * `scale.setExtent` or `scale.unionExtentFromData`; + */ + + function getScaleExtent(scale, model) { + var scaleType = scale.type; + var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate(); + scale.setBlank(rawExtentResult.isBlank); + var min = rawExtentResult.min; + var max = rawExtentResult.max; // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + + var ecModel = model.ecModel; + + if (ecModel && scaleType === 'time' + /* || scaleType === 'interval' */ + ) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries_1 = false; + each(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; + }); + + if (isBaseAxisAndHasBarSeries_1) { + // Calculate placement of bars on axis. TODO should be decoupled + // with barLayout + var barWidthAndOffset = makeColumnLayout(barSeriesModels); // Adjust axis min and max to account for overflow + + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + + return { + extent: [min, max], + // "fix" means "fixed", the value should not be + // changed in the subsequent steps. + fixMin: rawExtentResult.minFixed, + fixMax: rawExtentResult.maxFixed + }; + } + + function adjustScaleForOverflow(min, max, model, // Only support cartesian coord yet. + barWidthAndOffset) { + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = axisExtent[1] - axisExtent[0]; // Get bars on current base axis and calculate min and max overflow + + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + + if (barsOnCurrentAxis === undefined) { + return { + min: min, + max: max + }; + } + + var minOverflow = Infinity; + each(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; // Calculate required buffer based on old range and overflow + + var oldRange = max - min; + var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; + var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + return { + min: min, + max: max + }; + } // Precondition of calling this method: + // The scale extent has been initialized using series data extent via + // `scale.setExtent` or `scale.unionExtentFromData`; + + + function niceScaleExtent(scale, inModel) { + var model = inModel; + var extentInfo = getScaleExtent(scale, model); + var extent = extentInfo.extent; + var splitNumber = model.get('splitNumber'); + + if (scale instanceof LogScale) { + scale.base = model.get('logBase'); + } + + var scaleType = scale.type; + var interval = model.get('interval'); + var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time'; + scale.setExtent(extent[0], extent[1]); + scale.calcNiceExtent({ + splitNumber: splitNumber, + fixMin: extentInfo.fixMin, + fixMax: extentInfo.fixMax, + minInterval: isIntervalOrTime ? model.get('minInterval') : null, + maxInterval: isIntervalOrTime ? model.get('maxInterval') : null + }); // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + } + /** + * @param axisType Default retrieve from model.type + */ + + function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); + } + } + } + /** + * Check if the axis cross 0 + */ + + function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !(min > 0 && max > 0 || min < 0 && max < 0); + } + /** + * @param axis + * @return Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not required. + * return: {string} label string. + */ + + function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + + if (axis.scale.type === 'time') { + return function (tpl) { + return function (tick, idx) { + return axis.scale.getFormattedLabel(tick, idx, tpl); + }; + }(labelFormatter); + } else if (isString(labelFormatter)) { + return function (tpl) { + return function (tick) { + // For category axis, get raw value; for numeric axis, + // get formatted label like '1,333,444'. + var label = axis.scale.getLabel(tick); + var text = tpl.replace('{value}', label != null ? label : ''); + return text; + }; + }(labelFormatter); + } else if (isFunction(labelFormatter)) { + return function (cb) { + return function (tick, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tick.value - categoryTickStart; + } + + return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { + level: tick.level + } : null); + }; + }(labelFormatter); + } else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } + } + function getAxisRawValue(axis, tick) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value; + } + /** + * @param axis + * @return Be null/undefined if no labels. + */ + + function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + + if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) { + return; + } + + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); // Optimize for large category data, avoid call `getTicks()`. + + if (scale instanceof OrdinalScale) { + tickCount = scale.count(); + } else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + var rect; + var step = 1; // Simple optimization for large amount of labels + + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + + for (var i = 0; i < tickCount; i += step) { + var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { + value: categoryScaleExtent[0] + i + }; + var label = labelFormatter(tick, i); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + rect ? rect.union(singleRect) : rect = singleRect; + } + + return rect; + } + + function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var beforeWidth = textRect.width; + var beforeHeight = textRect.height; + var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); + var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); + var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); + return rotatedRect; + } + /** + * @param model axisLabelModel or axisTickModel + * @return {number|String} Can be null|'auto'|number|function + */ + + + function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; + } + /** + * Set `categoryInterval` as 0 implicitly indicates that + * show all labels regardless of overlap. + * @param {Object} axis axisModel.axis + */ + + function shouldShowAllLabels(axis) { + return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0; + } + function getDataDimensionsOnAxis(data, axisDim) { + // Remove duplicated dat dimensions caused by `getStackedDimension`. + var dataDimMap = {}; // Currently `mapDimensionsAll` will contain stack result dimension ('__\0ecstackresult'). + // PENDING: is it reasonable? Do we need to remove the original dim from "coord dim" since + // there has been stacked result dim? + + each(data.mapDimensionsAll(axisDim), function (dataDim) { + // For example, the extent of the original dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should NOT include [0.1, 0.5], + // because there is no graphic corresponding to [0.1, 0.5]. + // See the case in `test/area-stack.html` `main1`, where area line + // stack needs `yAxis` not start from 0. + dataDimMap[getStackedDimension(data, dataDim)] = true; + }); + return keys(dataDimMap); + } + function unionAxisExtentFromData(dataExtent, data, axisDim) { + if (data) { + each(getDataDimensionsOnAxis(data, axisDim), function (dim) { + var seriesExtent = data.getApproximateExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + } + + /* + * 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. + */ + + /* + * 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. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var AxisModelCommonMixin = + /** @class */ + function () { + function AxisModelCommonMixin() {} + + AxisModelCommonMixin.prototype.getNeedCrossZero = function () { + var option = this.option; + return !option.scale; + }; + /** + * Should be implemented by each axis model if necessary. + * @return coordinate system model + */ + + + AxisModelCommonMixin.prototype.getCoordSysModel = function () { + return; + }; + + return AxisModelCommonMixin; + }(); + + /** + * Create a multi dimension List structure from seriesModel. + */ + + function createList(seriesModel) { + return createSeriesData(null, seriesModel); + } // export function createGraph(seriesModel) { + var dataStack$1 = { + isDimensionStacked: isDimensionStacked, + enableDataStack: enableDataStack, + getStackedDimension: getStackedDimension + }; + /** + * Create scale + * @param {Array.} dataExtent + * @param {Object|module:echarts/Model} option If `optoin.type` + * is secified, it can only be `'value'` currently. + */ + + function createScale(dataExtent, option) { + var axisModel = option; + + if (!(option instanceof Model)) { + axisModel = new Model(option); // FIXME + // Currently AxisModelCommonMixin has nothing to do with the + // the requirements of `axisHelper.createScaleByModel`. For + // example the methods `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel is required + // for `'time'` axis. But occasionally echarts-gl happened + // to only use `'value'` axis. + // zrUtil.mixin(axisModel, AxisModelCommonMixin); + } + + var scale = createScaleByModel(axisModel); + scale.setExtent(dataExtent[0], dataExtent[1]); + niceScaleExtent(scale, axisModel); + return scale; + } + /** + * Mixin common methods to axis model, + * + * Include methods + * `getFormattedLabels() => Array.` + * `getCategories() => Array.` + * `getMin(origin: boolean) => number` + * `getMax(origin: boolean) => number` + * `getNeedCrossZero() => boolean` + */ + + function mixinAxisModelCommonMethods(Model) { + mixin(Model, AxisModelCommonMixin); + } + function createTextStyle$1(textStyleModel, opts) { + opts = opts || {}; + return createTextStyle(textStyleModel, null, null, opts.state !== 'normal'); + } + + var helper = /*#__PURE__*/Object.freeze({ + __proto__: null, + createList: createList, + getLayoutRect: getLayoutRect, + dataStack: dataStack$1, + createScale: createScale, + mixinAxisModelCommonMethods: mixinAxisModelCommonMethods, + getECData: getECData, + createTextStyle: createTextStyle$1, + createDimensions: createDimensions, + createSymbol: createSymbol, + enableHoverEmphasis: enableHoverEmphasis + }); + + var EPSILON$4 = 1e-8; + function isAroundEqual$1(a, b) { + return Math.abs(a - b) < EPSILON$4; + } + function contain$2(points, x, y) { + var w = 0; + var p = points[0]; + if (!p) { + return false; + } + for (var i = 1; i < points.length; i++) { + var p2 = points[i]; + w += windingLine(p[0], p[1], p2[0], p2[1], x, y); + p = p2; + } + var p0 = points[0]; + if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + return w !== 0; + } + + var TMP_TRANSFORM = []; + + function transformPoints(points, transform) { + for (var p = 0; p < points.length; p++) { + applyTransform(points[p], points[p], transform); + } + } + + function updateBBoxFromPoints(points, min$1, max$1, projection) { + for (var i = 0; i < points.length; i++) { + var p = points[i]; + + if (projection) { + // projection may return null point. + p = projection.project(p); + } + + if (p && isFinite(p[0]) && isFinite(p[1])) { + min(min$1, min$1, p); + max(max$1, max$1, p); + } + } + } + + function centroid(points) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = points.length; + var x0 = points[len - 1][0]; + var y0 = points[len - 1][1]; // Polygon should been closed. + + for (var i = 0; i < len; i++) { + var x1 = points[i][0]; + var y1 = points[i][1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + x0 = x1; + y0 = y1; + } + + return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0]; + } + + var Region = + /** @class */ + function () { + function Region(name) { + this.name = name; + } + + Region.prototype.setCenter = function (center) { + this._center = center; + }; + /** + * Get center point in data unit. That is, + * for GeoJSONRegion, the unit is lat/lng, + * for GeoSVGRegion, the unit is SVG local coord. + */ + + + Region.prototype.getCenter = function () { + var center = this._center; + + if (!center) { + // In most cases there are no need to calculate this center. + // So calculate only when called. + center = this._center = this.calcCenter(); + } + + return center; + }; + + return Region; + }(); + + var GeoJSONPolygonGeometry = + /** @class */ + function () { + function GeoJSONPolygonGeometry(exterior, interiors) { + this.type = 'polygon'; + this.exterior = exterior; + this.interiors = interiors; + } + + return GeoJSONPolygonGeometry; + }(); + + var GeoJSONLineStringGeometry = + /** @class */ + function () { + function GeoJSONLineStringGeometry(points) { + this.type = 'linestring'; + this.points = points; + } + + return GeoJSONLineStringGeometry; + }(); + + var GeoJSONRegion = + /** @class */ + function (_super) { + __extends(GeoJSONRegion, _super); + + function GeoJSONRegion(name, geometries, cp) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoJSON'; + _this.geometries = geometries; + _this._center = cp && [cp[0], cp[1]]; + return _this; + } + + GeoJSONRegion.prototype.calcCenter = function () { + var geometries = this.geometries; + var largestGeo; + var largestGeoSize = 0; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + var exterior = geo.exterior; // Simple trick to use points count instead of polygon area as region size. + // Ignore linestring + + var size = exterior && exterior.length; + + if (size > largestGeoSize) { + largestGeo = geo; + largestGeoSize = size; + } + } + + if (largestGeo) { + return centroid(largestGeo.exterior); + } // from bounding rect by default. + + + var rect = this.getBoundingRect(); + return [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.getBoundingRect = function (projection) { + var rect = this._rect; // Always recalculate if using projection. + + if (rect && !projection) { + return rect; + } + + var min = [Infinity, Infinity]; + var max = [-Infinity, -Infinity]; + var geometries = this.geometries; + each(geometries, function (geo) { + if (geo.type === 'polygon') { + // Doesn't consider hole + updateBBoxFromPoints(geo.exterior, min, max, projection); + } else { + each(geo.points, function (points) { + updateBBoxFromPoints(points, min, max, projection); + }); + } + }); // Normalie invalid bounding. + + if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + + if (!projection) { + this._rect = rect; + } + + return rect; + }; + + GeoJSONRegion.prototype.contain = function (coord) { + var rect = this.getBoundingRect(); + var geometries = this.geometries; + + if (!rect.contain(coord[0], coord[1])) { + return false; + } + + loopGeo: for (var i = 0, len = geometries.length; i < len; i++) { + var geo = geometries[i]; // Only support polygon. + + if (geo.type !== 'polygon') { + continue; + } + + var exterior = geo.exterior; + var interiors = geo.interiors; + + if (contain$2(exterior, coord[0], coord[1])) { + // Not in the region if point is in the hole. + for (var k = 0; k < (interiors ? interiors.length : 0); k++) { + if (contain$2(interiors[k], coord[0], coord[1])) { + continue loopGeo; + } + } + + return true; + } + } + + return false; + }; + /** + * Transform the raw coords to target bounding. + * @param x + * @param y + * @param width + * @param height + */ + + + GeoJSONRegion.prototype.transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var aspect = rect.width / rect.height; + + if (!width) { + width = aspect * height; + } else if (!height) { + height = width / aspect; + } + + var target = new BoundingRect(x, y, width, height); + var transform = rect.calculateTransform(target); + var geometries = this.geometries; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + + if (geo.type === 'polygon') { + transformPoints(geo.exterior, transform); + each(geo.interiors, function (interior) { + transformPoints(interior, transform); + }); + } else { + each(geo.points, function (points) { + transformPoints(points, transform); + }); + } + } + + rect = this._rect; + rect.copy(target); // Update center + + this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.cloneShallow = function (name) { + name == null && (name = this.name); + var newRegion = new GeoJSONRegion(name, this.geometries, this._center); + newRegion._rect = this._rect; + newRegion.transformTo = null; // Simply avoid to be called. + + return newRegion; + }; + + return GeoJSONRegion; + }(Region); + + var GeoSVGRegion = + /** @class */ + function (_super) { + __extends(GeoSVGRegion, _super); + + function GeoSVGRegion(name, elOnlyForCalculate) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoSVG'; + _this._elOnlyForCalculate = elOnlyForCalculate; + return _this; + } + + GeoSVGRegion.prototype.calcCenter = function () { + var el = this._elOnlyForCalculate; + var rect = el.getBoundingRect(); + var center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + var mat = identity(TMP_TRANSFORM); + var target = el; + + while (target && !target.isGeoSVGGraphicRoot) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + invert(mat, mat); + applyTransform(center, center, mat); + return center; + }; + + return GeoSVGRegion; + }(Region); + + function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + + var jsonCompressed = json; + var encodeScale = jsonCompressed.UTF8Scale; + + if (encodeScale == null) { + encodeScale = 1024; + } + + var features = jsonCompressed.features; + each(features, function (feature) { + var geometry = feature.geometry; + var encodeOffsets = geometry.encodeOffsets; + var coordinates = geometry.coordinates; // Geometry may be appeded manually in the script after json loaded. + // In this case this geometry is usually not encoded. + + if (!encodeOffsets) { + return; + } + + switch (geometry.type) { + case 'LineString': + geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); + break; + + case 'Polygon': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiLineString': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiPolygon': + each(coordinates, function (rings, idx) { + return decodeRings(rings, encodeOffsets[idx], encodeScale); + }); + } + }); // Has been decoded + + jsonCompressed.UTF8Encoding = false; + return jsonCompressed; + } + + function decodeRings(rings, encodeOffsets, encodeScale) { + for (var c = 0; c < rings.length; c++) { + rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale); + } + } + + function decodeRing(coordinate, encodeOffsets, encodeScale) { + var result = []; + var prevX = encodeOffsets[0]; + var prevY = encodeOffsets[1]; + + for (var i = 0; i < coordinate.length; i += 2) { + var x = coordinate.charCodeAt(i) - 64; + var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding + + x = x >> 1 ^ -(x & 1); + y = y >> 1 ^ -(y & 1); // Delta deocding + + x += prevX; + y += prevY; + prevX = x; + prevY = y; // Dequantize + + result.push([x / encodeScale, y / encodeScale]); + } + + return result; + } + + function parseGeoJSON(geoJson, nameProperty) { + geoJson = decode(geoJson); + return map(filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; + }), function (featureObj) { + var properties = featureObj.properties; + var geo = featureObj.geometry; + var geometries = []; + + switch (geo.type) { + case 'Polygon': + var coordinates = geo.coordinates; // According to the GeoJSON specification. + // First must be exterior, and the rest are all interior(holes). + + geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); + break; + + case 'MultiPolygon': + each(geo.coordinates, function (item) { + if (item[0]) { + geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1))); + } + }); + break; + + case 'LineString': + geometries.push(new GeoJSONLineStringGeometry([geo.coordinates])); + break; + + case 'MultiLineString': + geometries.push(new GeoJSONLineStringGeometry(geo.coordinates)); + } + + var region = new GeoJSONRegion(properties[nameProperty || 'name'], geometries, properties.cp); + region.properties = properties; + return region; + }); + } + + var number = /*#__PURE__*/Object.freeze({ + __proto__: null, + linearMap: linearMap, + round: round, + asc: asc, + getPrecision: getPrecision, + getPrecisionSafe: getPrecisionSafe, + getPixelPrecision: getPixelPrecision, + getPercentWithPrecision: getPercentWithPrecision, + MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + remRadian: remRadian, + isRadianAroundZero: isRadianAroundZero, + parseDate: parseDate, + quantity: quantity, + quantityExponent: quantityExponent, + nice: nice, + quantile: quantile, + reformIntervals: reformIntervals, + isNumeric: isNumeric, + numericToNumber: numericToNumber + }); + + var time = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parseDate, + format: format + }); + + var graphic$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + extendShape: extendShape, + extendPath: extendPath, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + createIcon: createIcon, + updateProps: updateProps, + initProps: initProps, + getTransform: getTransform, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + registerShape: registerShape, + getShapeClass: getShapeClass, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect + }); + + var format$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + addCommas: addCommas, + toCamelCase: toCamelCase, + normalizeCssArray: normalizeCssArray$1, + encodeHTML: encodeHTML, + formatTpl: formatTpl, + getTooltipMarker: getTooltipMarker, + formatTime: formatTime, + capitalFirst: capitalFirst, + truncateText: truncateText, + getTextRect: getTextRect + }); + + var util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + map: map, + each: each, + indexOf: indexOf, + inherits: inherits, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + extend: extend, + defaults: defaults, + clone: clone, + merge: merge + }); + + var inner$5 = makeInner(); + function createAxisLabels(axis) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); + } + /** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array. + * tickCategoryInterval: number + * } + */ + + function createAxisTicks(axis, tickModel) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : { + ticks: map(axis.scale.getTicks(), function (tick) { + return tick.value; + }) + }; + } + + function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + return !labelModel.get('show') || axis.scale.isBlank() ? { + labels: [], + labelCategoryInterval: result.labelCategoryInterval + } : result; + } + + function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + + if (result) { + return result; + } + + var labels; + var numericLabelInterval; + + if (isFunction(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } else { + numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } // Cache to avoid calling interval function repeatedly. + + + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, + labelCategoryInterval: numericLabelInterval + }); + } + + function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + + if (result) { + return result; + } + + var ticks; + var tickCategoryInterval; // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + + if (isFunction(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } // Cache to avoid calling interval function repeatedly. + + + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, + tickCategoryInterval: tickCategoryInterval + }); + } + + function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map(ticks, function (tick, idx) { + return { + level: tick.level, + formattedLabel: labelFormatter(tick, idx), + rawLabel: axis.scale.getLabel(tick), + tickValue: tick.value + }; + }) + }; + } + + function getListCache(axis, prop) { + // Because key can be a function, and cache size always is small, we use array cache. + return inner$5(axis)[prop] || (inner$5(axis)[prop] = []); + } + + function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } + } + + function listCacheSet(cache, key, value) { + cache.push({ + key: key, + value: value + }); + return value; + } + + function makeAutoCategoryInterval(axis) { + var result = inner$5(axis).autoInterval; + return result != null ? result : inner$5(axis).autoInterval = axis.calculateCategoryInterval(); + } + /** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ + + + function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var step = 1; // Simple optimization. Empirical value: tick count should less than 40. + + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + var maxW = 0; + var maxH = 0; // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + + var rect = getBoundingRect(labelFormatter({ + value: tickValue + }), params.font, 'center', 'top'); // Magic number + + width = rect.width * 1.3; + height = rect.height * 1.3; // Min size, void long loop. + + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + + var dw = maxW / unitW; + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + var cache = inner$5(axis.model); + var axisExtent = axis.getExtent(); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + // For example, if all of the axis labels are `a, b, c, d, e, f, g`. + // The jitter will cause that sometimes the displayed labels are + // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1). + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval // If the axis change is caused by chart resize, the cache should not + // be used. Otherwise some hidden labels might not be shown again. + && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + cache.axisExtent0 = axisExtent[0]; + cache.axisExtent1 = axisExtent[1]; + } + + return interval; + } + + function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; + } + + function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + + + var showAllLabel = shouldShowAllLabels(axis); + var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel; + var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel; + + if (includeMinLabel && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + + + var tickValue = startTick; + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + + if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + + function addItem(tickValue) { + var tickObj = { + value: tickValue + }; + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tickObj), + rawLabel: ordinalScale.getLabel(tickObj), + tickValue: tickValue + }); + } + + return result; + } + + function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + each(ordinalScale.getTicks(), function (tick) { + var rawLabel = ordinalScale.getLabel(tick); + var tickValue = tick.value; + + if (categoryInterval(tick.value, rawLabel)) { + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tick), + rawLabel: rawLabel, + tickValue: tickValue + }); + } + }); + return result; + } + + var NORMALIZED_EXTENT = [0, 1]; + /** + * Base class of Axis. + */ + + var Axis = + /** @class */ + function () { + function Axis(dim, scale, extent) { + this.onBand = false; + this.inverse = false; + this.dim = dim; + this.scale = scale; + this._extent = extent || [0, 0]; + } + /** + * If axis extent contain given coord + */ + + + Axis.prototype.contain = function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }; + /** + * If axis extent contain given data + */ + + + Axis.prototype.containData = function (data) { + return this.scale.contain(data); + }; + /** + * Get coord extent. + */ + + + Axis.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Get precision used for formatting + */ + + + Axis.prototype.getPixelPrecision = function (dataExtent) { + return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); + }; + /** + * Set coord extent + */ + + + Axis.prototype.setExtent = function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }; + /** + * Convert data to coord. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.dataToCoord = function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, NORMALIZED_EXTENT, extent, clamp); + }; + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.coordToData = function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); + return this.scale.scale(t); + }; + /** + * Convert pixel point to data in axis + */ + + + Axis.prototype.pointToData = function (point, clamp) { + // Should be implemented in derived class if necessary. + return; + }; + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param opt.tickModel default: axis.model.getModel('axisTick') + * @param opt.clamp If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + */ + + + Axis.prototype.getTicksCoords = function (opt) { + opt = opt || {}; + var tickModel = opt.tickModel || this.getTickModel(); + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + var ticksCoords = map(ticks, function (tickVal) { + return { + coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), + tickValue: tickVal + }; + }, this); + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); + return ticksCoords; + }; + + Axis.prototype.getMinorTicksCoords = function () { + if (this.scale.type === 'ordinal') { + // Category axis doesn't support minor ticks + return []; + } + + var minorTickModel = this.model.getModel('minorTick'); + var splitNumber = minorTickModel.get('splitNumber'); // Protection. + + if (!(splitNumber > 0 && splitNumber < 100)) { + splitNumber = 5; + } + + var minorTicks = this.scale.getMinorTicks(splitNumber); + var minorTicksCoords = map(minorTicks, function (minorTicksGroup) { + return map(minorTicksGroup, function (minorTick) { + return { + coord: this.dataToCoord(minorTick), + tickValue: minorTick + }; + }, this); + }, this); + return minorTicksCoords; + }; + + Axis.prototype.getViewLabels = function () { + return createAxisLabels(this).labels; + }; + + Axis.prototype.getLabelModel = function () { + return this.model.getModel('axisLabel'); + }; + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overridden to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + */ + + + Axis.prototype.getTickModel = function () { + return this.model.getModel('axisTick'); + }; + /** + * Get width of band + */ + + + Axis.prototype.getBandWidth = function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); // Fix #2728, avoid NaN when only one data. + + len === 0 && (len = 1); + var size = Math.abs(axisExtent[1] - axisExtent[0]); + return Math.abs(size) / len; + }; + /** + * Only be called in category axis. + * Can be overridden, consider other axes like in 3D. + * @return Auto interval for cateogry axis tick and label + */ + + + Axis.prototype.calculateCategoryInterval = function () { + return calculateCategoryInterval(this); + }; + + return Axis; + }(); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } // If axis has labels [1, 2, 3, 4]. Bands on the axis are + // |---1---|---2---|---3---|---4---|. + // So the displayed ticks and splitLine/splitArea should between + // each data item, otherwise cause misleading (e.g., split tow bars + // of a single data item when there are two bar series). + // Also consider if tickCategoryInterval > 0 and onBand, ticks and + // splitLine/spliteArea should layout appropriately corresponding + // to displayed labels. (So we should not use `getBandWidth` in this + // case). + + + function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + + var axisExtent = axis.getExtent(); + var last; + var diffSize; + + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = { + coord: axisExtent[0] + }; + } else { + var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; + var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; + each(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift_1 / 2; + }); + var dataExtent = axis.scale.getExtent(); + diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; + last = { + coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize + }; + ticksCoords.push(last); + } + + var inverse = axisExtent[0] > axisExtent[1]; // Handling clamp. + + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); + } + + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({ + coord: axisExtent[0] + }); + } + + if (littleThan(axisExtent[1], last.coord)) { + clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); + } + + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({ + coord: axisExtent[1] + }); + } + + function littleThan(a, b) { + // Avoid rounding error cause calculated tick coord different with extent. + // It may cause an extra unnecessary tick added. + a = round(a); + b = round(b); + return inverse ? a > b : a < b; + } + } + + // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class. + // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example: + // class Bar3DModel extends ComponentModel {} + // export function install(registers) { registers.registerComponentModel(Bar3DModel); } + // echarts.use(install); + + function extendComponentModel(proto) { + var Model = ComponentModel.extend(proto); + ComponentModel.registerClass(Model); + return Model; + } + function extendComponentView(proto) { + var View = ComponentView.extend(proto); + ComponentView.registerClass(View); + return View; + } + function extendSeriesModel(proto) { + var Model = SeriesModel.extend(proto); + SeriesModel.registerClass(Model); + return Model; + } + function extendChartView(proto) { + var View = ChartView.extend(proto); + ChartView.registerClass(View); + return View; + } + + var PI2$6 = Math.PI * 2; + var CMD$3 = PathProxy.CMD; + var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left']; + + function getCandidateAnchor(pos, distance, rect, outPt, outDir) { + var width = rect.width; + var height = rect.height; + + switch (pos) { + case 'top': + outPt.set(rect.x + width / 2, rect.y - distance); + outDir.set(0, -1); + break; + + case 'bottom': + outPt.set(rect.x + width / 2, rect.y + height + distance); + outDir.set(0, 1); + break; + + case 'left': + outPt.set(rect.x - distance, rect.y + height / 2); + outDir.set(-1, 0); + break; + + case 'right': + outPt.set(rect.x + width + distance, rect.y + height / 2); + outDir.set(1, 0); + break; + } + } + + function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) { + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + x /= d; + y /= d; // Intersect point. + + var ox = x * r + cx; + var oy = y * r + cy; + + if (Math.abs(startAngle - endAngle) % PI2$6 < 1e-4) { + // Is a circle + out[0] = ox; + out[1] = oy; + return d - r; + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2$6; + } + + var angle = Math.atan2(y, x); + + if (angle < 0) { + angle += PI2$6; + } + + if (angle >= startAngle && angle <= endAngle || angle + PI2$6 >= startAngle && angle + PI2$6 <= endAngle) { + // Project point is on the arc. + out[0] = ox; + out[1] = oy; + return d - r; + } + + var x1 = r * Math.cos(startAngle) + cx; + var y1 = r * Math.sin(startAngle) + cy; + var x2 = r * Math.cos(endAngle) + cx; + var y2 = r * Math.sin(endAngle) + cy; + var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y); + var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y); + + if (d1 < d2) { + out[0] = x1; + out[1] = y1; + return Math.sqrt(d1); + } else { + out[0] = x2; + out[1] = y2; + return Math.sqrt(d2); + } + } + + function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { + var dx = x - x1; + var dy = y - y1; + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); + dx1 /= lineLen; + dy1 /= lineLen; // dot product + + var projectedLen = dx * dx1 + dy * dy1; + var t = projectedLen / lineLen; + + if (limitToEnds) { + t = Math.min(Math.max(t, 0), 1); + } + + t *= lineLen; + var ox = out[0] = x1 + t * dx1; + var oy = out[1] = y1 + t * dy1; + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + function projectPointToRect(x1, y1, width, height, x, y, out) { + if (width < 0) { + x1 = x1 + width; + width = -width; + } + + if (height < 0) { + y1 = y1 + height; + height = -height; + } + + var x2 = x1 + width; + var y2 = y1 + height; + var ox = out[0] = Math.min(Math.max(x, x1), x2); + var oy = out[1] = Math.min(Math.max(y, y1), y2); + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + var tmpPt = []; + + function nearestPointOnRect(pt, rect, out) { + var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt); + out.set(tmpPt[0], tmpPt[1]); + return dist; + } + /** + * Calculate min distance corresponding point. + * This method won't evaluate if point is in the path. + */ + + + function nearestPointOnPath(pt, path, out) { + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + var minDist = Infinity; + var data = path.data; + var x = pt.x; + var y = pt.y; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i === 1) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + + var d = minDist; + + switch (cmd) { + case CMD$3.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + + case CMD$3.L: + d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.C: + d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.Q: + d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; // TODO Arc 旋转 + + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令 + + if (i <= 1) { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + + + var _x = (x - cx) * ry / rx + cx; + + d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt); + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + + case CMD$3.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + d = projectPointToRect(x0, y0, width, height, x, y, tmpPt); + break; + + case CMD$3.Z: + d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true); + xi = x0; + yi = y0; + break; + } + + if (d < minDist) { + minDist = d; + out.set(tmpPt[0], tmpPt[1]); + } + } + + return minDist; + } // Temporal variable for intermediate usage. + + + var pt0 = new Point(); + var pt1 = new Point(); + var pt2 = new Point(); + var dir = new Point(); + var dir2 = new Point(); + /** + * Calculate a proper guide line based on the label position and graphic element definition + * @param label + * @param labelRect + * @param target + * @param targetRect + */ + + function updateLabelLinePoints(target, labelLineModel) { + if (!target) { + return; + } + + var labelLine = target.getTextGuideLine(); + var label = target.getTextContent(); // Needs to create text guide in each charts. + + if (!(label && labelLine)) { + return; + } + + var labelGuideConfig = target.textGuideLineConfig || {}; + var points = [[0, 0], [0, 0], [0, 0]]; + var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE; + var labelRect = label.getBoundingRect().clone(); + labelRect.applyTransform(label.getComputedTransform()); + var minDist = Infinity; + var anchorPoint = labelGuideConfig.anchor; + var targetTransform = target.getComputedTransform(); + var targetInversedTransform = targetTransform && invert([], targetTransform); + var len = labelLineModel.get('length2') || 0; + + if (anchorPoint) { + pt2.copy(anchorPoint); + } + + for (var i = 0; i < searchSpace.length; i++) { + var candidate = searchSpace[i]; + getCandidateAnchor(candidate, 0, labelRect, pt0, dir); + Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space. + + pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created. + + var boundingRect = target.getBoundingRect(); + var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path + + if (dist < minDist) { + minDist = dist; // Transform back to global space. + + pt1.transform(targetTransform); + pt2.transform(targetTransform); + pt2.toArray(points[0]); + pt1.toArray(points[1]); + pt0.toArray(points[2]); + } + } + + limitTurnAngle(points, labelLineModel.get('minTurnAngle')); + labelLine.setShape({ + points: points + }); + } // Temporal variable for the limitTurnAngle function + + var tmpArr = []; + var tmpProjPoint = new Point(); + /** + * Reduce the line segment attached to the label to limit the turn angle between two segments. + * @param linePoints + * @param minTurnAngle Radian of minimum turn angle. 0 - 180 + */ + + function limitTurnAngle(linePoints, minTurnAngle) { + if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { + return; + } + + minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be + // /pt1----pt2 (label) + // / + // pt0/ + + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt0, pt1); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(dir2); + var minTurnAngleCos = Math.cos(minTurnAngle); + + if (minTurnAngleCos < angleCos) { + // Smaller than minTurnAngle + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point + + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + /** + * Limit the angle of line and the surface + * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite + */ + + function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { + if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { + return; + } + + maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt1, pt0); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(surfaceNormal); + var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); + + if (angleCos < maxSurfaceAngleCos) { + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); + var HALF_PI = Math.PI / 2; + var angle2 = Math.acos(dir2.dot(surfaceNormal)); + var newAngle = HALF_PI + angle2 - maxSurfaceAngle; + + if (newAngle >= HALF_PI) { + // parallel + Point.copy(tmpProjPoint, pt2); + } else { + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + + function setLabelLineState(labelLine, ignore, stateName, stateModel) { + var isNormal = stateName === 'normal'; + var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display. + + stateObj.ignore = ignore; // Set smooth + + var smooth = stateModel.get('smooth'); + + if (smooth && smooth === true) { + smooth = 0.3; + } + + stateObj.shape = stateObj.shape || {}; + + if (smooth > 0) { + stateObj.shape.smooth = smooth; + } + + var styleObj = stateModel.getModel('lineStyle').getLineStyle(); + isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; + } + + function buildLabelLinePath(path, shape) { + var smooth = shape.smooth; + var points = shape.points; + + if (!points) { + return; + } + + path.moveTo(points[0][0], points[0][1]); + + if (smooth > 0 && points.length >= 3) { + var len1 = dist(points[0], points[1]); + var len2 = dist(points[1], points[2]); + + if (!len1 || !len2) { + path.lineTo(points[1][0], points[1][1]); + path.lineTo(points[2][0], points[2][1]); + return; + } + + var moveLen = Math.min(len1, len2) * smooth; + var midPoint0 = lerp([], points[1], points[0], moveLen / len1); + var midPoint2 = lerp([], points[1], points[2], moveLen / len2); + var midPoint1 = lerp([], midPoint0, midPoint2, 0.5); + path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); + path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]); + } else { + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i][0], points[i][1]); + } + } + } + /** + * Create a label line if necessary and set it's style. + */ + + + function setLabelLineStyle(targetEl, statesModels, defaultStyle) { + var labelLine = targetEl.getTextGuideLine(); + var label = targetEl.getTextContent(); + + if (!label) { + // Not show label line if there is no label. + if (labelLine) { + targetEl.removeTextGuideLine(); + } + + return; + } + + var normalModel = statesModels.normal; + var showNormal = normalModel.get('show'); + var labelIgnoreNormal = label.ignore; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; + var stateModel = statesModels[stateName]; + var isNormal = stateName === 'normal'; + + if (stateModel) { + var stateShow = stateModel.get('show'); + var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); + + if (isLabelIgnored // Not show when label is not shown in this state. + || !retrieve2(stateShow, showNormal) // Use normal state by default if not set. + ) { + var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName]; + + if (stateObj) { + stateObj.ignore = true; + } + + continue; + } // Create labelLine if not exists + + + if (!labelLine) { + labelLine = new Polyline(); + targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created. + // NOTE: NORMAL should always been the first! + + if (!isNormal && (labelIgnoreNormal || !showNormal)) { + setLabelLineState(labelLine, true, 'normal', statesModels.normal); + } // Use same state proxy. + + + if (targetEl.stateProxy) { + labelLine.stateProxy = targetEl.stateProxy; + } + } + + setLabelLineState(labelLine, false, stateName, stateModel); + } + } + + if (labelLine) { + defaults(labelLine.style, defaultStyle); // Not fill. + + labelLine.style.fill = null; + var showAbove = normalModel.get('showAbove'); + var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; + labelLineConfig.showAbove = showAbove || false; // Custom the buildPath. + + labelLine.buildPath = buildLabelLinePath; + } + } + function getLabelLineStatesModels(itemModel, labelLineName) { + labelLineName = labelLineName || 'labelLine'; + var statesModels = { + normal: itemModel.getModel(labelLineName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); + } + + return statesModels; + } + + function prepareLayoutList(input) { + var list = []; + + for (var i = 0; i < input.length; i++) { + var rawItem = input[i]; + + if (rawItem.defaultAttr.ignore) { + continue; + } + + var label = rawItem.label; + var transform = label.getComputedTransform(); // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el. + + var localRect = label.getBoundingRect(); + var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5; + var minMargin = label.style.margin || 0; + var globalRect = localRect.clone(); + globalRect.applyTransform(transform); + globalRect.x -= minMargin / 2; + globalRect.y -= minMargin / 2; + globalRect.width += minMargin; + globalRect.height += minMargin; + var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null; + list.push({ + label: label, + labelLine: rawItem.labelLine, + rect: globalRect, + localRect: localRect, + obb: obb, + priority: rawItem.priority, + defaultAttr: rawItem.defaultAttr, + layoutOption: rawItem.computedLayoutOption, + axisAligned: isAxisAligned, + transform: transform + }); + } + + return list; + } + + function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { + var len = list.length; + + if (len < 2) { + return; + } + + list.sort(function (a, b) { + return a.rect[xyDim] - b.rect[xyDim]; + }); + var lastPos = 0; + var delta; + var adjusted = false; + var totalShifts = 0; + + for (var i = 0; i < len; i++) { + var item = list[i]; + var rect = item.rect; + delta = rect[xyDim] - lastPos; + + if (delta < 0) { + // shiftForward(i, len, -delta); + rect[xyDim] -= delta; + item.label[xyDim] -= delta; + adjusted = true; + } + + var shift = Math.max(-delta, 0); + totalShifts += shift; + lastPos = rect[xyDim] + rect[sizeDim]; + } + + if (totalShifts > 0 && balanceShift) { + // Shift back to make the distribution more equally. + shiftList(-totalShifts / len, 0, len); + } // TODO bleedMargin? + + + var first = list[0]; + var last = list[len - 1]; + var minGap; + var maxGap; + updateMinMaxGap(); // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds. + + minGap < 0 && squeezeGaps(-minGap, 0.8); + maxGap < 0 && squeezeGaps(maxGap, 0.8); + updateMinMaxGap(); + takeBoundsGap(minGap, maxGap, 1); + takeBoundsGap(maxGap, minGap, -1); // Handle bailout when there is not enough space. + + updateMinMaxGap(); + + if (minGap < 0) { + squeezeWhenBailout(-minGap); + } + + if (maxGap < 0) { + squeezeWhenBailout(maxGap); + } + + function updateMinMaxGap() { + minGap = first.rect[xyDim] - minBound; + maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; + } + + function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { + if (gapThisBound < 0) { + // Move from other gap if can. + var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); + + if (moveFromMaxGap > 0) { + shiftList(moveFromMaxGap * moveDir, 0, len); + var remained = moveFromMaxGap + gapThisBound; + + if (remained < 0) { + squeezeGaps(-remained * moveDir, 1); + } + } else { + squeezeGaps(-gapThisBound * moveDir, 1); + } + } + } + + function shiftList(delta, start, end) { + if (delta !== 0) { + adjusted = true; + } + + for (var i = start; i < end; i++) { + var item = list[i]; + var rect = item.rect; + rect[xyDim] += delta; + item.label[xyDim] += delta; + } + } // Squeeze gaps if the labels exceed margin. + + + function squeezeGaps(delta, maxSqeezePercent) { + var gaps = []; + var totalGaps = 0; + + for (var i = 1; i < len; i++) { + var prevItemRect = list[i - 1].rect; + var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); + gaps.push(gap); + totalGaps += gap; + } + + if (!totalGaps) { + return; + } + + var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent); + + if (delta > 0) { + for (var i = 0; i < len - 1; i++) { + // Distribute the shift delta to all gaps. + var movement = gaps[i] * squeezePercent; // Forward + + shiftList(movement, 0, i + 1); + } + } else { + // Backward + for (var i = len - 1; i > 0; i--) { + // Distribute the shift delta to all gaps. + var movement = gaps[i - 1] * squeezePercent; + shiftList(-movement, i, len); + } + } + } + /** + * Squeeze to allow overlap if there is no more space available. + * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds. + */ + + + function squeezeWhenBailout(delta) { + var dir = delta < 0 ? -1 : 1; + delta = Math.abs(delta); + var moveForEachLabel = Math.ceil(delta / (len - 1)); + + for (var i = 0; i < len - 1; i++) { + if (dir > 0) { + // Forward + shiftList(moveForEachLabel, 0, i + 1); + } else { + // Backward + shiftList(-moveForEachLabel, len - i - 1, len); + } + + delta -= moveForEachLabel; + + if (delta <= 0) { + return; + } + } + } + + return adjusted; + } + /** + * Adjust labels on x direction to avoid overlap. + */ + + + function shiftLayoutOnX(list, leftBound, rightBound, // If average the shifts on all labels and add them to 0 + // TODO: Not sure if should enable it. + // Pros: The angle of lines will distribute more equally + // Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly. + balanceShift) { + return shiftLayout(list, 'x', 'width', leftBound, rightBound, balanceShift); + } + /** + * Adjust labels on y direction to avoid overlap. + */ + + function shiftLayoutOnY(list, topBound, bottomBound, // If average the shifts on all labels and add them to 0 + balanceShift) { + return shiftLayout(list, 'y', 'height', topBound, bottomBound, balanceShift); + } + function hideOverlap(labelList) { + var displayedLabels = []; // TODO, render overflow visible first, put in the displayedLabels. + + labelList.sort(function (a, b) { + return b.priority - a.priority; + }); + var globalRect = new BoundingRect(0, 0, 0, 0); + + function hideEl(el) { + if (!el.ignore) { + // Show on emphasis. + var emphasisState = el.ensureState('emphasis'); + + if (emphasisState.ignore == null) { + emphasisState.ignore = false; + } + } + + el.ignore = true; + } + + for (var i = 0; i < labelList.length; i++) { + var labelItem = labelList[i]; + var isAxisAligned = labelItem.axisAligned; + var localRect = labelItem.localRect; + var transform = labelItem.transform; + var label = labelItem.label; + var labelLine = labelItem.labelLine; + globalRect.copy(labelItem.rect); // Add a threshold because layout may be aligned precisely. + + globalRect.width -= 0.1; + globalRect.height -= 0.1; + globalRect.x += 0.05; + globalRect.y += 0.05; + var obb = labelItem.obb; + var overlapped = false; + + for (var j = 0; j < displayedLabels.length; j++) { + var existsTextCfg = displayedLabels[j]; // Fast rejection. + + if (!globalRect.intersect(existsTextCfg.rect)) { + continue; + } + + if (isAxisAligned && existsTextCfg.axisAligned) { + // Is overlapped + overlapped = true; + break; + } + + if (!existsTextCfg.obb) { + // If self is not axis aligned. But other is. + existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); + } + + if (!obb) { + // If self is axis aligned. But other is not. + obb = new OrientedBoundingRect(localRect, transform); + } + + if (obb.intersect(existsTextCfg.obb)) { + overlapped = true; + break; + } + } // TODO Callback to determine if this overlap should be handled? + + + if (overlapped) { + hideEl(label); + labelLine && hideEl(labelLine); + } else { + label.attr('ignore', labelItem.defaultAttr.ignore); + labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore); + displayedLabels.push(labelItem); + } + } + } + + function cloneArr(points) { + if (points) { + var newPoints = []; + + for (var i = 0; i < points.length; i++) { + newPoints.push(points[i].slice()); + } + + return newPoints; + } + } + + function prepareLayoutCallbackParams(labelItem, hostEl) { + var label = labelItem.label; + var labelLine = hostEl && hostEl.getTextGuideLine(); + return { + dataIndex: labelItem.dataIndex, + dataType: labelItem.dataType, + seriesIndex: labelItem.seriesModel.seriesIndex, + text: labelItem.label.style.text, + rect: labelItem.hostRect, + labelRect: labelItem.rect, + // x: labelAttr.x, + // y: labelAttr.y, + align: label.style.align, + verticalAlign: label.style.verticalAlign, + labelLinePoints: cloneArr(labelLine && labelLine.shape.points) + }; + } + + var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize']; + var dummyTransformable = new Transformable(); + var labelLayoutInnerStore = makeInner(); + var labelLineAnimationStore = makeInner(); + + function extendWithKeys(target, source, keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (source[key] != null) { + target[key] = source[key]; + } + } + } + + var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation']; + + var LabelManager = + /** @class */ + function () { + function LabelManager() { + this._labelList = []; + this._chartViewList = []; + } + + LabelManager.prototype.clearLabels = function () { + this._labelList = []; + this._chartViewList = []; + }; + /** + * Add label to manager + */ + + + LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) { + var labelStyle = label.style; + var hostEl = label.__hostTarget; + var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state. + + var labelTransform = label.getComputedTransform(); + var labelRect = label.getBoundingRect().plain(); + BoundingRect.applyTransform(labelRect, labelRect, labelTransform); + + if (labelTransform) { + dummyTransformable.setLocalTransform(labelTransform); + } else { + // Identity transform. + dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0; + dummyTransformable.scaleX = dummyTransformable.scaleY = 1; + } + + var host = label.__hostTarget; + var hostRect; + + if (host) { + hostRect = host.getBoundingRect().plain(); + var transform = host.getComputedTransform(); + BoundingRect.applyTransform(hostRect, hostRect, transform); + } + + var labelGuide = hostRect && host.getTextGuideLine(); + + this._labelList.push({ + label: label, + labelLine: labelGuide, + seriesModel: seriesModel, + dataIndex: dataIndex, + dataType: dataType, + layoutOption: layoutOption, + computedLayoutOption: null, + rect: labelRect, + hostRect: hostRect, + // Label with lower priority will be hidden when overlapped + // Use rect size as default priority + priority: hostRect ? hostRect.width * hostRect.height : 0, + // Save default label attributes. + // For restore if developers want get back to default value in callback. + defaultAttr: { + ignore: label.ignore, + labelGuideIgnore: labelGuide && labelGuide.ignore, + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY, + rotation: dummyTransformable.rotation, + style: { + x: labelStyle.x, + y: labelStyle.y, + align: labelStyle.align, + verticalAlign: labelStyle.verticalAlign, + width: labelStyle.width, + height: labelStyle.height, + fontSize: labelStyle.fontSize + }, + cursor: label.cursor, + attachedPos: textConfig.position, + attachedRot: textConfig.rotation + } + }); + }; + + LabelManager.prototype.addLabelsOfSeries = function (chartView) { + var _this = this; + + this._chartViewList.push(chartView); + + var seriesModel = chartView.__model; + var layoutOption = seriesModel.get('labelLayout'); + /** + * Ignore layouting if it's not specified anything. + */ + + if (!(isFunction(layoutOption) || keys(layoutOption).length)) { + return; + } + + chartView.group.traverse(function (child) { + if (child.ignore) { + return true; // Stop traverse descendants. + } // Only support label being hosted on graphic elements. + + + var textEl = child.getTextContent(); + var ecData = getECData(child); // Can only attach the text on the element with dataIndex + + if (textEl && !textEl.disableLabelLayout) { + _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption); + } + }); + }; + + LabelManager.prototype.updateLayoutConfig = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + + function createDragHandler(el, labelLineModel) { + return function () { + updateLabelLinePoints(el, labelLineModel); + }; + } + + for (var i = 0; i < this._labelList.length; i++) { + var labelItem = this._labelList[i]; + var label = labelItem.label; + var hostEl = label.__hostTarget; + var defaultLabelAttr = labelItem.defaultAttr; + var layoutOption = void 0; // TODO A global layout option? + + if (isFunction(labelItem.layoutOption)) { + layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl)); + } else { + layoutOption = labelItem.layoutOption; + } + + layoutOption = layoutOption || {}; + labelItem.computedLayoutOption = layoutOption; + var degreeToRadian = Math.PI / 180; // TODO hostEl should always exists. + // Or label should not have parent because the x, y is all in global space. + + if (hostEl) { + hostEl.setTextConfig({ + // Force to set local false. + local: false, + // Ignore position and rotation config on the host el if x or y is changed. + position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos, + // Ignore rotation config on the host el if rotation is changed. + rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot, + offset: [layoutOption.dx || 0, layoutOption.dy || 0] + }); + } + + var needsUpdateLabelLine = false; + + if (layoutOption.x != null) { + // TODO width of chart view. + label.x = parsePercent$1(layoutOption.x, width); + label.setStyle('x', 0); // Ignore movement in style. TODO: origin. + + needsUpdateLabelLine = true; + } else { + label.x = defaultLabelAttr.x; + label.setStyle('x', defaultLabelAttr.style.x); + } + + if (layoutOption.y != null) { + // TODO height of chart view. + label.y = parsePercent$1(layoutOption.y, height); + label.setStyle('y', 0); // Ignore movement in style. + + needsUpdateLabelLine = true; + } else { + label.y = defaultLabelAttr.y; + label.setStyle('y', defaultLabelAttr.style.y); + } + + if (layoutOption.labelLinePoints) { + var guideLine = hostEl.getTextGuideLine(); + + if (guideLine) { + guideLine.setShape({ + points: layoutOption.labelLinePoints + }); // Not update + + needsUpdateLabelLine = false; + } + } + + var labelLayoutStore = labelLayoutInnerStore(label); + labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine; + label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation; + label.scaleX = defaultLabelAttr.scaleX; + label.scaleY = defaultLabelAttr.scaleY; + + for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) { + var key = LABEL_OPTION_TO_STYLE_KEYS[k]; + label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]); + } + + if (layoutOption.draggable) { + label.draggable = true; + label.cursor = 'move'; + + if (hostEl) { + var hostModel = labelItem.seriesModel; + + if (labelItem.dataIndex != null) { + var data = labelItem.seriesModel.getData(labelItem.dataType); + hostModel = data.getItemModel(labelItem.dataIndex); + } + + label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine'))); + } + } else { + // TODO Other drag functions? + label.off('drag'); + label.cursor = defaultLabelAttr.cursor; + } + } + }; + + LabelManager.prototype.layout = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + var labelList = prepareLayoutList(this._labelList); + var labelsNeedsAdjustOnX = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftX'; + }); + var labelsNeedsAdjustOnY = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftY'; + }); + shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width); + shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height); + var labelsNeedsHideOverlap = filter(labelList, function (item) { + return item.layoutOption.hideOverlap; + }); + hideOverlap(labelsNeedsHideOverlap); + }; + /** + * Process all labels. Not only labels with layoutOption. + */ + + + LabelManager.prototype.processLabelsOverall = function () { + var _this = this; + + each(this._chartViewList, function (chartView) { + var seriesModel = chartView.__model; + var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate; + var animationEnabled = seriesModel.isAnimationEnabled(); + chartView.group.traverse(function (child) { + if (child.ignore && !child.forceLabelAnimation) { + return true; // Stop traverse descendants. + } + + var needsUpdateLabelLine = !ignoreLabelLineUpdate; + var label = child.getTextContent(); + + if (!needsUpdateLabelLine && label) { + needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine; + } + + if (needsUpdateLabelLine) { + _this._updateLabelLine(child, seriesModel); + } + + if (animationEnabled) { + _this._animateLabels(child, seriesModel); + } + }); + }); + }; + + LabelManager.prototype._updateLabelLine = function (el, seriesModel) { + // Only support label being hosted on graphic elements. + var textEl = el.getTextContent(); // Update label line style. + + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data. + + if (textEl && dataIndex != null) { + var data = seriesModel.getData(ecData.dataType); + var itemModel = data.getItemModel(dataIndex); + var defaultStyle = {}; + var visualStyle = data.getItemVisual(dataIndex, 'style'); + var visualType = data.getVisual('drawType'); // Default to be same with main color + + defaultStyle.stroke = visualStyle[visualType]; + var labelLineModel = itemModel.getModel('labelLine'); + setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle); + updateLabelLinePoints(el, labelLineModel); + } + }; + + LabelManager.prototype._animateLabels = function (el, seriesModel) { + var textEl = el.getTextContent(); + var guideLine = el.getTextGuideLine(); // Animate + + if (textEl // `forceLabelAnimation` has the highest priority + && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) { + var layoutStore = labelLayoutInnerStore(textEl); + var oldLayout = layoutStore.oldLayout; + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; + var newProps = { + x: textEl.x, + y: textEl.y, + rotation: textEl.rotation + }; + var data = seriesModel.getData(ecData.dataType); + + if (!oldLayout) { + textEl.attr(newProps); // Disable fade in animation if value animation is enabled. + + if (!labelInner(textEl).valueAnimation) { + var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation + + textEl.style.opacity = 0; + initProps(textEl, { + style: { + opacity: oldOpacity + } + }, seriesModel, dataIndex); + } + } else { + textEl.attr(oldLayout); // Make sure the animation from is in the right status. + + var prevStates = el.prevStates; + + if (prevStates) { + if (indexOf(prevStates, 'select') >= 0) { + textEl.attr(layoutStore.oldLayoutSelect); + } + + if (indexOf(prevStates, 'emphasis') >= 0) { + textEl.attr(layoutStore.oldLayoutEmphasis); + } + } + + updateProps(textEl, newProps, seriesModel, dataIndex); + } + + layoutStore.oldLayout = newProps; + + if (textEl.states.select) { + var layoutSelect = layoutStore.oldLayoutSelect = {}; + extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS); + } + + if (textEl.states.emphasis) { + var layoutEmphasis = layoutStore.oldLayoutEmphasis = {}; + extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS); + } + + animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel); + } + + if (guideLine && !guideLine.ignore && !guideLine.invisible) { + var layoutStore = labelLineAnimationStore(guideLine); + var oldLayout = layoutStore.oldLayout; + var newLayout = { + points: guideLine.shape.points + }; + + if (!oldLayout) { + guideLine.setShape(newLayout); + guideLine.style.strokePercent = 0; + initProps(guideLine, { + style: { + strokePercent: 1 + } + }, seriesModel); + } else { + guideLine.attr({ + shape: oldLayout + }); + updateProps(guideLine, { + shape: newLayout + }, seriesModel); + } + + layoutStore.oldLayout = newLayout; + } + }; + + return LabelManager; + }(); + + var getLabelManager = makeInner(); + function installLabelLayout(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var labelManager = getLabelManager(api).labelManager; + + if (!labelManager) { + labelManager = getLabelManager(api).labelManager = new LabelManager(); + } + + labelManager.clearLabels(); + }); + registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) { + var labelManager = getLabelManager(api).labelManager; + params.updatedSeries.forEach(function (series) { + labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series)); + }); + labelManager.updateLayoutConfig(api); + labelManager.layout(api); + labelManager.processLabelsOverall(); + }); + } + + var mathSin$4 = Math.sin; + var mathCos$4 = Math.cos; + var PI$4 = Math.PI; + var PI2$7 = Math.PI * 2; + var degree = 180 / PI$4; + var SVGPathRebuilder = (function () { + function SVGPathRebuilder() { + } + SVGPathRebuilder.prototype.reset = function (precision) { + this._start = true; + this._d = []; + this._str = ''; + this._p = Math.pow(10, precision || 4); + }; + SVGPathRebuilder.prototype.moveTo = function (x, y) { + this._add('M', x, y); + }; + SVGPathRebuilder.prototype.lineTo = function (x, y) { + this._add('L', x, y); + }; + SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) { + this._add('C', x, y, x2, y2, x3, y3); + }; + SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) { + this._add('Q', x, y, x2, y2); + }; + SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise); + }; + SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) { + var dTheta = endAngle - startAngle; + var clockwise = !anticlockwise; + var dThetaPositive = Math.abs(dTheta); + var isCircle = isAroundZero$1(dThetaPositive - PI2$7) + || (clockwise ? dTheta >= PI2$7 : -dTheta >= PI2$7); + var unifiedTheta = dTheta > 0 ? dTheta % PI2$7 : (dTheta % PI2$7 + PI2$7); + var large = false; + if (isCircle) { + large = true; + } + else if (isAroundZero$1(dThetaPositive)) { + large = false; + } + else { + large = (unifiedTheta >= PI$4) === !!clockwise; + } + var x0 = cx + rx * mathCos$4(startAngle); + var y0 = cy + ry * mathSin$4(startAngle); + if (this._start) { + this._add('M', x0, y0); + } + var xRot = Math.round(psi * degree); + if (isCircle) { + var p = 1 / this._p; + var dTheta_1 = (clockwise ? 1 : -1) * (PI2$7 - p); + this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos$4(startAngle + dTheta_1), cy + ry * mathSin$4(startAngle + dTheta_1)); + if (p > 1e-2) { + this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0); + } + } + else { + var x = cx + rx * mathCos$4(endAngle); + var y = cy + ry * mathSin$4(endAngle); + this._add('A', rx, ry, xRot, +large, +clockwise, x, y); + } + }; + SVGPathRebuilder.prototype.rect = function (x, y, w, h) { + this._add('M', x, y); + this._add('l', w, 0); + this._add('l', 0, h); + this._add('l', -w, 0); + this._add('Z'); + }; + SVGPathRebuilder.prototype.closePath = function () { + if (this._d.length > 0) { + this._add('Z'); + } + }; + SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) { + var vals = []; + var p = this._p; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isNaN(val)) { + this._invalid = true; + return; + } + vals.push(Math.round(val * p) / p); + } + this._d.push(cmd + vals.join(' ')); + this._start = cmd === 'Z'; + }; + SVGPathRebuilder.prototype.generateStr = function () { + this._str = this._invalid ? '' : this._d.join(''); + this._d = []; + }; + SVGPathRebuilder.prototype.getStr = function () { + return this._str; + }; + return SVGPathRebuilder; + }()); + + var NONE = 'none'; + var mathRound$1 = Math.round; + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== NONE; + } + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== NONE; + } + var strokeProps = ['lineCap', 'miterLimit', 'lineJoin']; + var svgStrokeProps = map(strokeProps, function (prop) { return "stroke-" + prop.toLowerCase(); }); + function mapStyleToAttrs(updateAttr, style, el, forceUpdate) { + var opacity = style.opacity == null ? 1 : style.opacity; + if (el instanceof ZRImage) { + updateAttr('opacity', opacity); + return; + } + if (pathHasFill(style)) { + var fill = normalizeColor(style.fill); + updateAttr('fill', fill.color); + var fillOpacity = style.fillOpacity != null + ? style.fillOpacity * fill.opacity * opacity + : fill.opacity * opacity; + if (forceUpdate || fillOpacity < 1) { + updateAttr('fill-opacity', fillOpacity); + } + } + else { + updateAttr('fill', NONE); + } + if (pathHasStroke(style)) { + var stroke = normalizeColor(style.stroke); + updateAttr('stroke', stroke.color); + var strokeScale = style.strokeNoScale + ? el.getLineScale() + : 1; + var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0); + var strokeOpacity = style.strokeOpacity != null + ? style.strokeOpacity * stroke.opacity * opacity + : stroke.opacity * opacity; + var strokeFirst = style.strokeFirst; + if (forceUpdate || strokeWidth !== 1) { + updateAttr('stroke-width', strokeWidth); + } + if (forceUpdate || strokeFirst) { + updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill'); + } + if (forceUpdate || strokeOpacity < 1) { + updateAttr('stroke-opacity', strokeOpacity); + } + if (style.lineDash) { + var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + if (lineDash) { + lineDashOffset = mathRound$1(lineDashOffset || 0); + updateAttr('stroke-dasharray', lineDash.join(',')); + if (lineDashOffset || forceUpdate) { + updateAttr('stroke-dashoffset', lineDashOffset); + } + } + } + else if (forceUpdate) { + updateAttr('stroke-dasharray', NONE); + } + for (var i = 0; i < strokeProps.length; i++) { + var propName = strokeProps[i]; + if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) { + var val = style[propName] || DEFAULT_PATH_STYLE[propName]; + val && updateAttr(svgStrokeProps[i], val); + } + } + } + else if (forceUpdate) { + updateAttr('stroke', NONE); + } + } + + var SVGNS = 'http://www.w3.org/2000/svg'; + var XLINKNS = 'http://www.w3.org/1999/xlink'; + var XMLNS = 'http://www.w3.org/2000/xmlns/'; + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'; + function createElement(name) { + return document.createElementNS(SVGNS, name); + } + function createVNode(tag, key, attrs, children, text) { + return { + tag: tag, + attrs: attrs || {}, + children: children, + text: text, + key: key + }; + } + function createElementOpen(name, attrs) { + var attrsStr = []; + if (attrs) { + for (var key in attrs) { + var val = attrs[key]; + var part = key; + if (val === false) { + continue; + } + else if (val !== true && val != null) { + part += "=\"" + val + "\""; + } + attrsStr.push(part); + } + } + return "<" + name + " " + attrsStr.join(' ') + ">"; + } + function createElementClose(name) { + return ""; + } + function vNodeToString(el, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + function convertElToString(el) { + var children = el.children, tag = el.tag, attrs = el.attrs, text = el.text; + return createElementOpen(tag, attrs) + + (tag !== 'style' ? encodeHTML(text) : text || '') + + (children ? "" + S + map(children, function (child) { return convertElToString(child); }).join(S) + S : '') + + createElementClose(tag); + } + return convertElToString(el); + } + function getCssString(selectorNodes, animationNodes, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + var bracketBegin = " {" + S; + var bracketEnd = S + "}"; + var selectors = map(keys(selectorNodes), function (className) { + return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) { + return attrName + ":" + selectorNodes[className][attrName] + ";"; + }).join(S) + bracketEnd; + }).join(S); + var animations = map(keys(animationNodes), function (animationName) { + return "@keyframes " + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) { + return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) { + var val = animationNodes[animationName][percent][attrName]; + if (attrName === 'd') { + val = "path(\"" + val + "\")"; + } + return attrName + ":" + val + ";"; + }).join(S) + bracketEnd; + }).join(S) + bracketEnd; + }).join(S); + if (!selectors && !animations) { + return ''; + } + return [''].join(S); + } + function createBrushScope(zrId) { + return { + zrId: zrId, + shadowCache: {}, + patternCache: {}, + gradientCache: {}, + clipPathCache: {}, + defs: {}, + cssNodes: {}, + cssAnims: {}, + cssClassIdx: 0, + cssAnimIdx: 0, + shadowIdx: 0, + gradientIdx: 0, + patternIdx: 0, + clipPathIdx: 0 + }; + } + function createSVGVNode(width, height, children, useViewBox) { + return createVNode('svg', 'root', { + 'width': width, + 'height': height, + 'xmlns': SVGNS, + 'xmlns:xlink': XLINKNS, + 'version': '1.1', + 'baseProfile': 'full', + 'viewBox': useViewBox ? "0 0 " + width + " " + height : false + }, children); + } + + var EASING_MAP = { + cubicIn: '0.32,0,0.67,0', + cubicOut: '0.33,1,0.68,1', + cubicInOut: '0.65,0,0.35,1', + quadraticIn: '0.11,0,0.5,0', + quadraticOut: '0.5,1,0.89,1', + quadraticInOut: '0.45,0,0.55,1', + quarticIn: '0.5,0,0.75,0', + quarticOut: '0.25,1,0.5,1', + quarticInOut: '0.76,0,0.24,1', + quinticIn: '0.64,0,0.78,0', + quinticOut: '0.22,1,0.36,1', + quinticInOut: '0.83,0,0.17,1', + sinusoidalIn: '0.12,0,0.39,0', + sinusoidalOut: '0.61,1,0.88,1', + sinusoidalInOut: '0.37,0,0.63,1', + exponentialIn: '0.7,0,0.84,0', + exponentialOut: '0.16,1,0.3,1', + exponentialInOut: '0.87,0,0.13,1', + circularIn: '0.55,0,1,0.45', + circularOut: '0,0.55,0.45,1', + circularInOut: '0.85,0,0.15,1' + }; + var transformOriginKey = 'transform-origin'; + function buildPathString(el, kfShape, path) { + var shape = extend({}, el.shape); + extend(shape, kfShape); + el.buildPath(path, shape); + var svgPathBuilder = new SVGPathRebuilder(); + svgPathBuilder.reset(getPathPrecision(el)); + path.rebuildPath(svgPathBuilder, 1); + svgPathBuilder.generateStr(); + return svgPathBuilder.getStr(); + } + function setTransformOrigin(target, transform) { + var originX = transform.originX, originY = transform.originY; + if (originX || originY) { + target[transformOriginKey] = originX + "px " + originY + "px"; + } + } + var ANIMATE_STYLE_MAP = { + fill: 'fill', + opacity: 'opacity', + lineWidth: 'stroke-width', + lineDashOffset: 'stroke-dashoffset' + }; + function addAnimation(cssAnim, scope) { + var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++; + scope.cssAnims[animationName] = cssAnim; + return animationName; + } + function createCompoundPathCSSAnimation(el, attrs, scope) { + var paths = el.shape.paths; + var composedAnim = {}; + var cssAnimationCfg; + var cssAnimationName; + each(paths, function (path) { + var subScope = createBrushScope(scope.zrId); + subScope.animation = true; + createCSSAnimation(path, {}, subScope, true); + var cssAnims = subScope.cssAnims; + var cssNodes = subScope.cssNodes; + var animNames = keys(cssAnims); + var len = animNames.length; + if (!len) { + return; + } + cssAnimationName = animNames[len - 1]; + var lastAnim = cssAnims[cssAnimationName]; + for (var percent in lastAnim) { + var kf = lastAnim[percent]; + composedAnim[percent] = composedAnim[percent] || { d: '' }; + composedAnim[percent].d += kf.d || ''; + } + for (var className in cssNodes) { + var val = cssNodes[className].animation; + if (val.indexOf(cssAnimationName) >= 0) { + cssAnimationCfg = val; + } + } + }); + if (!cssAnimationCfg) { + return; + } + attrs.d = false; + var animationName = addAnimation(composedAnim, scope); + return cssAnimationCfg.replace(cssAnimationName, animationName); + } + function getEasingFunc(easing) { + return isString(easing) + ? EASING_MAP[easing] + ? "cubic-bezier(" + EASING_MAP[easing] + ")" + : createCubicEasingFunc(easing) ? easing : '' + : ''; + } + function createCSSAnimation(el, attrs, scope, onlyShape) { + var animators = el.animators; + var len = animators.length; + var cssAnimations = []; + if (el instanceof CompoundPath) { + var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope); + if (animationCfg) { + cssAnimations.push(animationCfg); + } + else if (!len) { + return; + } + } + else if (!len) { + return; + } + var groupAnimators = {}; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var cfgArr = [animator.getMaxTime() / 1000 + 's']; + var easing = getEasingFunc(animator.getClip().easing); + var delay = animator.getDelay(); + if (easing) { + cfgArr.push(easing); + } + else { + cfgArr.push('linear'); + } + if (delay) { + cfgArr.push(delay / 1000 + 's'); + } + if (animator.getLoop()) { + cfgArr.push('infinite'); + } + var cfg = cfgArr.join(' '); + groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []]; + groupAnimators[cfg][1].push(animator); + } + function createSingleCSSAnimation(groupAnimator) { + var animators = groupAnimator[1]; + var len = animators.length; + var transformKfs = {}; + var shapeKfs = {}; + var finalKfs = {}; + var animationTimingFunctionAttrName = 'animation-timing-function'; + function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) { + var tracks = animator.getTracks(); + var maxTime = animator.getMaxTime(); + for (var k = 0; k < tracks.length; k++) { + var track = tracks[k]; + if (track.needsAnimate()) { + var kfs = track.keyframes; + var attrName = track.propName; + toCssAttrName && (attrName = toCssAttrName(attrName)); + if (attrName) { + for (var i = 0; i < kfs.length; i++) { + var kf = kfs[i]; + var percent = Math.round(kf.time / maxTime * 100) + '%'; + var kfEasing = getEasingFunc(kf.easing); + var rawValue = kf.rawValue; + if (isString(rawValue) || isNumber(rawValue)) { + cssKfs[percent] = cssKfs[percent] || {}; + cssKfs[percent][attrName] = kf.rawValue; + if (kfEasing) { + cssKfs[percent][animationTimingFunctionAttrName] = kfEasing; + } + } + } + } + } + } + } + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (!targetProp) { + !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs); + } + else if (targetProp === 'shape') { + saveAnimatorTrackToCssKfs(animator, shapeKfs); + } + } + for (var percent in transformKfs) { + var transform = {}; + copyTransform(transform, el); + extend(transform, transformKfs[percent]); + var str = getSRTTransformString(transform); + var timingFunction = transformKfs[percent][animationTimingFunctionAttrName]; + finalKfs[percent] = str ? { + transform: str + } : {}; + setTransformOrigin(finalKfs[percent], transform); + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + var path; + var canAnimateShape = true; + for (var percent in shapeKfs) { + finalKfs[percent] = finalKfs[percent] || {}; + var isFirst = !path; + var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName]; + if (isFirst) { + path = new PathProxy(); + } + var len_1 = path.len(); + path.reset(); + finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path); + var newLen = path.len(); + if (!isFirst && len_1 !== newLen) { + canAnimateShape = false; + break; + } + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + if (!canAnimateShape) { + for (var percent in finalKfs) { + delete finalKfs[percent].d; + } + } + if (!onlyShape) { + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (targetProp === 'style') { + saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { return ANIMATE_STYLE_MAP[propName]; }); + } + } + } + var percents = keys(finalKfs); + var allTransformOriginSame = true; + var transformOrigin; + for (var i = 1; i < percents.length; i++) { + var p0 = percents[i - 1]; + var p1 = percents[i]; + if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) { + allTransformOriginSame = false; + break; + } + transformOrigin = finalKfs[p0][transformOriginKey]; + } + if (allTransformOriginSame && transformOrigin) { + for (var percent in finalKfs) { + if (finalKfs[percent][transformOriginKey]) { + delete finalKfs[percent][transformOriginKey]; + } + } + attrs[transformOriginKey] = transformOrigin; + } + if (filter(percents, function (percent) { return keys(finalKfs[percent]).length > 0; }).length) { + var animationName = addAnimation(finalKfs, scope); + return animationName + " " + groupAnimator[0] + " both"; + } + } + for (var key in groupAnimators) { + var animationCfg = createSingleCSSAnimation(groupAnimators[key]); + if (animationCfg) { + cssAnimations.push(animationCfg); + } + } + if (cssAnimations.length) { + var className = scope.zrId + '-cls-' + scope.cssClassIdx++; + scope.cssNodes['.' + className] = { + animation: cssAnimations.join(',') + }; + attrs["class"] = className; + } + } + + var round$2 = Math.round; + function isImageLike$1(val) { + return val && isString(val.src); + } + function isCanvasLike(val) { + return val && isFunction(val.toDataURL); + } + function setStyleAttrs(attrs, style, el, scope) { + mapStyleToAttrs(function (key, val) { + var isFillStroke = key === 'fill' || key === 'stroke'; + if (isFillStroke && isGradient(val)) { + setGradient(style, attrs, key, scope); + } + else if (isFillStroke && isPattern(val)) { + setPattern(el, attrs, key, scope); + } + else { + attrs[key] = val; + } + }, style, el, false); + setShadow(el, attrs, scope); + } + function noRotateScale(m) { + return isAroundZero$1(m[0] - 1) + && isAroundZero$1(m[1]) + && isAroundZero$1(m[2]) + && isAroundZero$1(m[3] - 1); + } + function noTranslate(m) { + return isAroundZero$1(m[4]) && isAroundZero$1(m[5]); + } + function setTransform(attrs, m, compress) { + if (m && !(noTranslate(m) && noRotateScale(m))) { + var mul = compress ? 10 : 1e4; + attrs.transform = noRotateScale(m) + ? "translate(" + round$2(m[4] * mul) / mul + " " + round$2(m[5] * mul) / mul + ")" : getMatrixStr(m); + } + } + function convertPolyShape(shape, attrs, mul) { + var points = shape.points; + var strArr = []; + for (var i = 0; i < points.length; i++) { + strArr.push(round$2(points[i][0] * mul) / mul); + strArr.push(round$2(points[i][1] * mul) / mul); + } + attrs.points = strArr.join(' '); + } + function validatePolyShape(shape) { + return !shape.smooth; + } + function createAttrsConvert(desc) { + var normalizedDesc = map(desc, function (item) { + return (typeof item === 'string' ? [item, item] : item); + }); + return function (shape, attrs, mul) { + for (var i = 0; i < normalizedDesc.length; i++) { + var item = normalizedDesc[i]; + var val = shape[item[0]]; + if (val != null) { + attrs[item[1]] = round$2(val * mul) / mul; + } + } + }; + } + var builtinShapesDef = { + circle: [createAttrsConvert(['cx', 'cy', 'r'])], + polyline: [convertPolyShape, validatePolyShape], + polygon: [convertPolyShape, validatePolyShape] + }; + function hasShapeAnimation(el) { + var animators = el.animators; + for (var i = 0; i < animators.length; i++) { + if (animators[i].targetName === 'shape') { + return true; + } + } + return false; + } + function brushSVGPath(el, scope) { + var style = el.style; + var shape = el.shape; + var builtinShpDef = builtinShapesDef[el.type]; + var attrs = {}; + var needsAnimate = scope.animation; + var svgElType = 'path'; + var strokePercent = el.style.strokePercent; + var precision = (scope.compress && getPathPrecision(el)) || 4; + if (builtinShpDef + && !scope.willUpdate + && !(builtinShpDef[1] && !builtinShpDef[1](shape)) + && !(needsAnimate && hasShapeAnimation(el)) + && !(strokePercent < 1)) { + svgElType = el.type; + var mul = Math.pow(10, precision); + builtinShpDef[0](shape, attrs, mul); + } + else { + var needBuildPath = !el.path || el.shapeChanged(); + if (!el.path) { + el.createPathProxy(); + } + var path = el.path; + if (needBuildPath) { + path.beginPath(); + el.buildPath(path, el.shape); + el.pathUpdated(); + } + var pathVersion = path.getVersion(); + var elExt = el; + var svgPathBuilder = elExt.__svgPathBuilder; + if (elExt.__svgPathVersion !== pathVersion + || !svgPathBuilder + || strokePercent !== elExt.__svgPathStrokePercent) { + if (!svgPathBuilder) { + svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder(); + } + svgPathBuilder.reset(precision); + path.rebuildPath(svgPathBuilder, strokePercent); + svgPathBuilder.generateStr(); + elExt.__svgPathVersion = pathVersion; + elExt.__svgPathStrokePercent = strokePercent; + } + attrs.d = svgPathBuilder.getStr(); + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode(svgElType, el.id + '', attrs); + } + function brushSVGImage(el, scope) { + var style = el.style; + var image = style.image; + if (image && !isString(image)) { + if (isImageLike$1(image)) { + image = image.src; + } + else if (isCanvasLike(image)) { + image = image.toDataURL(); + } + } + if (!image) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var dw = style.width; + var dh = style.height; + var attrs = { + href: image, + width: dw, + height: dh + }; + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('image', el.id + '', attrs); + } + function brushSVGTSpan(el, scope) { + var style = el.style; + var text = style.text; + text != null && (text += ''); + if (!text || isNaN(style.x) || isNaN(style.y)) { + return; + } + var font = style.font || DEFAULT_FONT; + var x = style.x || 0; + var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline); + var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign] + || style.textAlign; + var attrs = { + 'dominant-baseline': 'central', + 'text-anchor': textAlign + }; + if (hasSeparateFont(style)) { + var separatedFontStr = ''; + var fontStyle = style.fontStyle; + var fontSize = parseFontSize(style.fontSize); + if (!parseFloat(fontSize)) { + return; + } + var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY; + var fontWeight = style.fontWeight; + separatedFontStr += "font-size:" + fontSize + ";font-family:" + fontFamily + ";"; + if (fontStyle && fontStyle !== 'normal') { + separatedFontStr += "font-style:" + fontStyle + ";"; + } + if (fontWeight && fontWeight !== 'normal') { + separatedFontStr += "font-weight:" + fontWeight + ";"; + } + attrs.style = separatedFontStr; + } + else { + attrs.style = "font: " + font; + } + if (text.match(/\s/)) { + attrs['xml:space'] = 'preserve'; + } + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('text', el.id + '', attrs, undefined, text); + } + function brush$1(el, scope) { + if (el instanceof Path) { + return brushSVGPath(el, scope); + } + else if (el instanceof ZRImage) { + return brushSVGImage(el, scope); + } + else if (el instanceof TSpan) { + return brushSVGTSpan(el, scope); + } + } + function setShadow(el, attrs, scope) { + var style = el.style; + if (hasShadow(style)) { + var shadowKey = getShadowKey(el); + var shadowCache = scope.shadowCache; + var shadowId = shadowCache[shadowKey]; + if (!shadowId) { + var globalScale = el.getGlobalScale(); + var scaleX = globalScale[0]; + var scaleY = globalScale[1]; + if (!scaleX || !scaleY) { + return; + } + var offsetX = style.shadowOffsetX || 0; + var offsetY = style.shadowOffsetY || 0; + var blur_1 = style.shadowBlur; + var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color; + var stdDx = blur_1 / 2 / scaleX; + var stdDy = blur_1 / 2 / scaleY; + var stdDeviation = stdDx + ' ' + stdDy; + shadowId = scope.zrId + '-s' + scope.shadowIdx++; + scope.defs[shadowId] = createVNode('filter', shadowId, { + 'id': shadowId, + 'x': '-100%', + 'y': '-100%', + 'width': '300%', + 'height': '300%' + }, [ + createVNode('feDropShadow', '', { + 'dx': offsetX / scaleX, + 'dy': offsetY / scaleY, + 'stdDeviation': stdDeviation, + 'flood-color': color, + 'flood-opacity': opacity + }) + ]); + shadowCache[shadowKey] = shadowId; + } + attrs.filter = getIdURL(shadowId); + } + } + function setGradient(style, attrs, target, scope) { + var val = style[target]; + var gradientTag; + var gradientAttrs = { + 'gradientUnits': val.global + ? 'userSpaceOnUse' + : 'objectBoundingBox' + }; + if (isLinearGradient(val)) { + gradientTag = 'linearGradient'; + gradientAttrs.x1 = val.x; + gradientAttrs.y1 = val.y; + gradientAttrs.x2 = val.x2; + gradientAttrs.y2 = val.y2; + } + else if (isRadialGradient(val)) { + gradientTag = 'radialGradient'; + gradientAttrs.cx = retrieve2(val.x, 0.5); + gradientAttrs.cy = retrieve2(val.y, 0.5); + gradientAttrs.r = retrieve2(val.r, 0.5); + } + else { + if ("development" !== 'production') { + logError('Illegal gradient type.'); + } + return; + } + var colors = val.colorStops; + var colorStops = []; + for (var i = 0, len = colors.length; i < len; ++i) { + var offset = round4(colors[i].offset) * 100 + '%'; + var stopColor = colors[i].color; + var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity; + var stopsAttrs = { + 'offset': offset + }; + stopsAttrs['stop-color'] = color; + if (opacity < 1) { + stopsAttrs['stop-opacity'] = opacity; + } + colorStops.push(createVNode('stop', i + '', stopsAttrs)); + } + var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops); + var gradientKey = vNodeToString(gradientVNode); + var gradientCache = scope.gradientCache; + var gradientId = gradientCache[gradientKey]; + if (!gradientId) { + gradientId = scope.zrId + '-g' + scope.gradientIdx++; + gradientCache[gradientKey] = gradientId; + gradientAttrs.id = gradientId; + scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops); + } + attrs[target] = getIdURL(gradientId); + } + function setPattern(el, attrs, target, scope) { + var val = el.style[target]; + var boundingRect = el.getBoundingRect(); + var patternAttrs = {}; + var repeat = val.repeat; + var noRepeat = repeat === 'no-repeat'; + var repeatX = repeat === 'repeat-x'; + var repeatY = repeat === 'repeat-y'; + var child; + if (isImagePattern(val)) { + var imageWidth_1 = val.imageWidth; + var imageHeight_1 = val.imageHeight; + var imageSrc = void 0; + var patternImage = val.image; + if (isString(patternImage)) { + imageSrc = patternImage; + } + else if (isImageLike$1(patternImage)) { + imageSrc = patternImage.src; + } + else if (isCanvasLike(patternImage)) { + imageSrc = patternImage.toDataURL(); + } + if (typeof Image === 'undefined') { + var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.'; + assert(imageWidth_1, errMsg); + assert(imageHeight_1, errMsg); + } + else if (imageWidth_1 == null || imageHeight_1 == null) { + var setSizeToVNode_1 = function (vNode, img) { + if (vNode) { + var svgEl = vNode.elm; + var width = imageWidth_1 || img.width; + var height = imageHeight_1 || img.height; + if (vNode.tag === 'pattern') { + if (repeatX) { + height = 1; + width /= boundingRect.width; + } + else if (repeatY) { + width = 1; + height /= boundingRect.height; + } + } + vNode.attrs.width = width; + vNode.attrs.height = height; + if (svgEl) { + svgEl.setAttribute('width', width); + svgEl.setAttribute('height', height); + } + } + }; + var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) { + noRepeat || setSizeToVNode_1(patternVNode, img); + setSizeToVNode_1(child, img); + }); + if (createdImage && createdImage.width && createdImage.height) { + imageWidth_1 = imageWidth_1 || createdImage.width; + imageHeight_1 = imageHeight_1 || createdImage.height; + } + } + child = createVNode('image', 'img', { + href: imageSrc, + width: imageWidth_1, + height: imageHeight_1 + }); + patternAttrs.width = imageWidth_1; + patternAttrs.height = imageHeight_1; + } + else if (val.svgElement) { + child = clone(val.svgElement); + patternAttrs.width = val.svgWidth; + patternAttrs.height = val.svgHeight; + } + if (!child) { + return; + } + var patternWidth; + var patternHeight; + if (noRepeat) { + patternWidth = patternHeight = 1; + } + else if (repeatX) { + patternHeight = 1; + patternWidth = patternAttrs.width / boundingRect.width; + } + else if (repeatY) { + patternWidth = 1; + patternHeight = patternAttrs.height / boundingRect.height; + } + else { + patternAttrs.patternUnits = 'userSpaceOnUse'; + } + if (patternWidth != null && !isNaN(patternWidth)) { + patternAttrs.width = patternWidth; + } + if (patternHeight != null && !isNaN(patternHeight)) { + patternAttrs.height = patternHeight; + } + var patternTransform = getSRTTransformString(val); + patternTransform && (patternAttrs.patternTransform = patternTransform); + var patternVNode = createVNode('pattern', '', patternAttrs, [child]); + var patternKey = vNodeToString(patternVNode); + var patternCache = scope.patternCache; + var patternId = patternCache[patternKey]; + if (!patternId) { + patternId = scope.zrId + '-p' + scope.patternIdx++; + patternCache[patternKey] = patternId; + patternAttrs.id = patternId; + patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]); + } + attrs[target] = getIdURL(patternId); + } + function setClipPath(clipPath, attrs, scope) { + var clipPathCache = scope.clipPathCache, defs = scope.defs; + var clipPathId = clipPathCache[clipPath.id]; + if (!clipPathId) { + clipPathId = scope.zrId + '-c' + scope.clipPathIdx++; + var clipPathAttrs = { + id: clipPathId + }; + clipPathCache[clipPath.id] = clipPathId; + defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]); + } + attrs['clip-path'] = getIdURL(clipPathId); + } + + function createTextNode(text) { + return document.createTextNode(text); + } + function insertBefore(parentNode, newNode, referenceNode) { + parentNode.insertBefore(newNode, referenceNode); + } + function removeChild(node, child) { + node.removeChild(child); + } + function appendChild(node, child) { + node.appendChild(child); + } + function parentNode(node) { + return node.parentNode; + } + function nextSibling(node) { + return node.nextSibling; + } + function setTextContent(node, text) { + node.textContent = text; + } + + var colonChar = 58; + var xChar = 120; + var emptyNode = createVNode('', ''); + function isUndef(s) { + return s === undefined; + } + function isDef(s) { + return s !== undefined; + } + function createKeyToOldIdx(children, beginIdx, endIdx) { + var map = {}; + for (var i = beginIdx; i <= endIdx; ++i) { + var key = children[i].key; + if (key !== undefined) { + if ("development" !== 'production') { + if (map[key] != null) { + console.error("Duplicate key " + key); + } + } + map[key] = i; + } + } + return map; + } + function sameVnode(vnode1, vnode2) { + var isSameKey = vnode1.key === vnode2.key; + var isSameTag = vnode1.tag === vnode2.tag; + return isSameTag && isSameKey; + } + function createElm(vnode) { + var i; + var children = vnode.children; + var tag = vnode.tag; + if (isDef(tag)) { + var elm = (vnode.elm = createElement(tag)); + updateAttrs(emptyNode, vnode); + if (isArray(children)) { + for (i = 0; i < children.length; ++i) { + var ch = children[i]; + if (ch != null) { + appendChild(elm, createElm(ch)); + } + } + } + else if (isDef(vnode.text) && !isObject(vnode.text)) { + appendChild(elm, createTextNode(vnode.text)); + } + } + else { + vnode.elm = createTextNode(vnode.text); + } + return vnode.elm; + } + function addVnodes(parentElm, before, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + insertBefore(parentElm, createElm(ch), before); + } + } + } + function removeVnodes(parentElm, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + if (isDef(ch.tag)) { + var parent_1 = parentNode(ch.elm); + removeChild(parent_1, ch.elm); + } + else { + removeChild(parentElm, ch.elm); + } + } + } + } + function updateAttrs(oldVnode, vnode) { + var key; + var elm = vnode.elm; + var oldAttrs = oldVnode && oldVnode.attrs || {}; + var attrs = vnode.attrs || {}; + if (oldAttrs === attrs) { + return; + } + for (key in attrs) { + var cur = attrs[key]; + var old = oldAttrs[key]; + if (old !== cur) { + if (cur === true) { + elm.setAttribute(key, ''); + } + else if (cur === false) { + elm.removeAttribute(key); + } + else { + if (key.charCodeAt(0) !== xChar) { + elm.setAttribute(key, cur); + } + else if (key === 'xmlns:xlink' || key === 'xmlns') { + elm.setAttributeNS(XMLNS, key, cur); + } + else if (key.charCodeAt(3) === colonChar) { + elm.setAttributeNS(XML_NAMESPACE, key, cur); + } + else if (key.charCodeAt(5) === colonChar) { + elm.setAttributeNS(XLINKNS, key, cur); + } + else { + elm.setAttribute(key, cur); + } + } + } + } + for (key in oldAttrs) { + if (!(key in attrs)) { + elm.removeAttribute(key); + } + } + } + function updateChildren(parentElm, oldCh, newCh) { + var oldStartIdx = 0; + var newStartIdx = 0; + var oldEndIdx = oldCh.length - 1; + var oldStartVnode = oldCh[0]; + var oldEndVnode = oldCh[oldEndIdx]; + var newEndIdx = newCh.length - 1; + var newStartVnode = newCh[0]; + var newEndVnode = newCh[newEndIdx]; + var oldKeyToIdx; + var idxInOld; + var elmToMove; + var before; + while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { + if (oldStartVnode == null) { + oldStartVnode = oldCh[++oldStartIdx]; + } + else if (oldEndVnode == null) { + oldEndVnode = oldCh[--oldEndIdx]; + } + else if (newStartVnode == null) { + newStartVnode = newCh[++newStartIdx]; + } + else if (newEndVnode == null) { + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldStartVnode, newStartVnode)) { + patchVnode(oldStartVnode, newStartVnode); + oldStartVnode = oldCh[++oldStartIdx]; + newStartVnode = newCh[++newStartIdx]; + } + else if (sameVnode(oldEndVnode, newEndVnode)) { + patchVnode(oldEndVnode, newEndVnode); + oldEndVnode = oldCh[--oldEndIdx]; + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldStartVnode, newEndVnode)) { + patchVnode(oldStartVnode, newEndVnode); + insertBefore(parentElm, oldStartVnode.elm, nextSibling(oldEndVnode.elm)); + oldStartVnode = oldCh[++oldStartIdx]; + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldEndVnode, newStartVnode)) { + patchVnode(oldEndVnode, newStartVnode); + insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); + oldEndVnode = oldCh[--oldEndIdx]; + newStartVnode = newCh[++newStartIdx]; + } + else { + if (isUndef(oldKeyToIdx)) { + oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); + } + idxInOld = oldKeyToIdx[newStartVnode.key]; + if (isUndef(idxInOld)) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } + else { + elmToMove = oldCh[idxInOld]; + if (elmToMove.tag !== newStartVnode.tag) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } + else { + patchVnode(elmToMove, newStartVnode); + oldCh[idxInOld] = undefined; + insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm); + } + } + newStartVnode = newCh[++newStartIdx]; + } + } + if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) { + if (oldStartIdx > oldEndIdx) { + before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm; + addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); + } + else { + removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); + } + } + } + function patchVnode(oldVnode, vnode) { + var elm = (vnode.elm = oldVnode.elm); + var oldCh = oldVnode.children; + var ch = vnode.children; + if (oldVnode === vnode) { + return; + } + updateAttrs(oldVnode, vnode); + if (isUndef(vnode.text)) { + if (isDef(oldCh) && isDef(ch)) { + if (oldCh !== ch) { + updateChildren(elm, oldCh, ch); + } + } + else if (isDef(ch)) { + if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + addVnodes(elm, null, ch, 0, ch.length - 1); + } + else if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } + else if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + } + else if (oldVnode.text !== vnode.text) { + if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } + setTextContent(elm, vnode.text); + } + } + function patch(oldVnode, vnode) { + if (sameVnode(oldVnode, vnode)) { + patchVnode(oldVnode, vnode); + } + else { + var elm = oldVnode.elm; + var parent_2 = parentNode(elm); + createElm(vnode); + if (parent_2 !== null) { + insertBefore(parent_2, vnode.elm, nextSibling(elm)); + removeVnodes(parent_2, [oldVnode], 0, 0); + } + } + return vnode; + } + + var svgId = 0; + var SVGPainter = (function () { + function SVGPainter(root, storage, opts) { + this.type = 'svg'; + this.refreshHover = createMethodNotSupport('refreshHover'); + this.configLayer = createMethodNotSupport('configLayer'); + this.storage = storage; + this._opts = opts = extend({}, opts); + this.root = root; + this._id = 'zr' + svgId++; + this._oldVNode = createSVGVNode(opts.width, opts.height); + if (root && !opts.ssr) { + var viewport = this._viewport = document.createElement('div'); + viewport.style.cssText = 'position:relative;overflow:hidden'; + var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg'); + updateAttrs(null, this._oldVNode); + viewport.appendChild(svgDom); + root.appendChild(viewport); + } + this.resize(opts.width, opts.height); + } + SVGPainter.prototype.getType = function () { + return this.type; + }; + SVGPainter.prototype.getViewportRoot = function () { + return this._viewport; + }; + SVGPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + SVGPainter.prototype.getSvgDom = function () { + return this._svgDom; + }; + SVGPainter.prototype.refresh = function () { + if (this.root) { + var vnode = this.renderToVNode({ + willUpdate: true + }); + vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none'; + patch(this._oldVNode, vnode); + this._oldVNode = vnode; + } + }; + SVGPainter.prototype.renderOneToVNode = function (el) { + return brush$1(el, createBrushScope(this._id)); + }; + SVGPainter.prototype.renderToVNode = function (opts) { + opts = opts || {}; + var list = this.storage.getDisplayList(true); + var width = this._width; + var height = this._height; + var scope = createBrushScope(this._id); + scope.animation = opts.animation; + scope.willUpdate = opts.willUpdate; + scope.compress = opts.compress; + var children = []; + var bgVNode = this._bgVNode = createBackgroundVNode(width, height, this._backgroundColor, scope); + bgVNode && children.push(bgVNode); + var mainVNode = !opts.compress + ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null; + this._paintList(list, scope, mainVNode ? mainVNode.children : children); + mainVNode && children.push(mainVNode); + var defs = map(keys(scope.defs), function (id) { return scope.defs[id]; }); + if (defs.length) { + children.push(createVNode('defs', 'defs', {}, defs)); + } + if (opts.animation) { + var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, { newline: true }); + if (animationCssStr) { + var styleNode = createVNode('style', 'stl', {}, [], animationCssStr); + children.push(styleNode); + } + } + return createSVGVNode(width, height, children, opts.useViewBox); + }; + SVGPainter.prototype.renderToString = function (opts) { + opts = opts || {}; + return vNodeToString(this.renderToVNode({ + animation: retrieve2(opts.cssAnimation, true), + willUpdate: false, + compress: true, + useViewBox: retrieve2(opts.useViewBox, true) + }), { newline: true }); + }; + SVGPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + }; + SVGPainter.prototype.getSvgRoot = function () { + return this._mainVNode && this._mainVNode.elm; + }; + SVGPainter.prototype._paintList = function (list, scope, out) { + var listLen = list.length; + var clipPathsGroupsStack = []; + var clipPathsGroupsStackDepth = 0; + var currentClipPathGroup; + var prevClipPaths; + var clipGroupNodeIdx = 0; + for (var i = 0; i < listLen; i++) { + var displayable = list[i]; + if (!displayable.invisible) { + var clipPaths = displayable.__clipPaths; + var len = clipPaths && clipPaths.length || 0; + var prevLen = prevClipPaths && prevClipPaths.length || 0; + var lca = void 0; + for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) { + if (clipPaths && prevClipPaths + && clipPaths[lca] === prevClipPaths[lca]) { + break; + } + } + for (var i_1 = prevLen - 1; i_1 > lca; i_1--) { + clipPathsGroupsStackDepth--; + currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1]; + } + for (var i_2 = lca + 1; i_2 < len; i_2++) { + var groupAttrs = {}; + setClipPath(clipPaths[i_2], groupAttrs, scope); + var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []); + (currentClipPathGroup ? currentClipPathGroup.children : out).push(g); + clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g; + currentClipPathGroup = g; + } + prevClipPaths = clipPaths; + var ret = brush$1(displayable, scope); + if (ret) { + (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret); + } + } + } + }; + SVGPainter.prototype.resize = function (width, height) { + var opts = this._opts; + var root = this.root; + var viewport = this._viewport; + width != null && (opts.width = width); + height != null && (opts.height = height); + if (root && viewport) { + viewport.style.display = 'none'; + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + viewport.style.display = ''; + } + if (this._width !== width || this._height !== height) { + this._width = width; + this._height = height; + if (viewport) { + var viewportStyle = viewport.style; + viewportStyle.width = width + 'px'; + viewportStyle.height = height + 'px'; + } + if (!isPattern(this._backgroundColor)) { + var svgDom = this._svgDom; + if (svgDom) { + svgDom.setAttribute('width', width); + svgDom.setAttribute('height', height); + } + var bgEl = this._bgVNode && this._bgVNode.elm; + if (bgEl) { + bgEl.setAttribute('width', width); + bgEl.setAttribute('height', height); + } + } + else { + this.refresh(); + } + } + }; + SVGPainter.prototype.getWidth = function () { + return this._width; + }; + SVGPainter.prototype.getHeight = function () { + return this._height; + }; + SVGPainter.prototype.dispose = function () { + if (this.root) { + this.root.innerHTML = ''; + } + this._svgDom = + this._viewport = + this.storage = + this._oldVNode = + this._bgVNode = + this._mainVNode = null; + }; + SVGPainter.prototype.clear = function () { + if (this._svgDom) { + this._svgDom.innerHTML = null; + } + this._oldVNode = null; + }; + SVGPainter.prototype.toDataURL = function (base64) { + var str = this.renderToString(); + var prefix = 'data:image/svg+xml;'; + if (base64) { + str = encodeBase64(str); + return str && prefix + 'base64,' + str; + } + return prefix + 'charset=UTF-8,' + encodeURIComponent(str); + }; + return SVGPainter; + }()); + function createMethodNotSupport(method) { + return function () { + if ("development" !== 'production') { + logError('In SVG mode painter not support method "' + method + '"'); + } + }; + } + function createBackgroundVNode(width, height, backgroundColor, scope) { + var bgVNode; + if (backgroundColor && backgroundColor !== 'none') { + bgVNode = createVNode('rect', 'bg', { + width: width, + height: height, + x: '0', + y: '0', + id: '0' + }); + if (isGradient(backgroundColor)) { + setGradient({ fill: backgroundColor }, bgVNode.attrs, 'fill', scope); + } + else if (isPattern(backgroundColor)) { + setPattern({ + style: { + fill: backgroundColor + }, + dirty: noop, + getBoundingRect: function () { return ({ width: width, height: height }); } + }, bgVNode.attrs, 'fill', scope); + } + else { + var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity; + bgVNode.attrs.fill = color; + opacity < 1 && (bgVNode.attrs['fill-opacity'] = opacity); + } + } + return bgVNode; + } + + function install(registers) { + registers.registerPainter('svg', SVGPainter); + } + + function createDom(id, painter, dpr) { + var newDom = platformApi.createCanvas(); + var width = painter.getWidth(); + var height = painter.getHeight(); + var newDomStyle = newDom.style; + if (newDomStyle) { + newDomStyle.position = 'absolute'; + newDomStyle.left = '0'; + newDomStyle.top = '0'; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.setAttribute('data-zr-dom-id', id); + } + newDom.width = width * dpr; + newDom.height = height * dpr; + return newDom; + } + var Layer = (function (_super) { + __extends(Layer, _super); + function Layer(id, painter, dpr) { + var _this = _super.call(this) || this; + _this.motionBlur = false; + _this.lastFrameAlpha = 0.7; + _this.dpr = 1; + _this.virtual = false; + _this.config = {}; + _this.incremental = false; + _this.zlevel = 0; + _this.maxRepaintRectCount = 5; + _this.__dirty = true; + _this.__firstTimePaint = true; + _this.__used = false; + _this.__drawIndex = 0; + _this.__startIndex = 0; + _this.__endIndex = 0; + _this.__prevStartIndex = null; + _this.__prevEndIndex = null; + var dom; + dpr = dpr || devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, painter, dpr); + } + else if (isObject(id)) { + dom = id; + id = dom.id; + } + _this.id = id; + _this.dom = dom; + var domStyle = dom.style; + if (domStyle) { + disableUserSelect(dom); + dom.onselectstart = function () { return false; }; + domStyle.padding = '0'; + domStyle.margin = '0'; + domStyle.borderWidth = '0'; + } + _this.painter = painter; + _this.dpr = dpr; + return _this; + } + Layer.prototype.getElementCount = function () { + return this.__endIndex - this.__startIndex; + }; + Layer.prototype.afterBrush = function () { + this.__prevStartIndex = this.__startIndex; + this.__prevEndIndex = this.__endIndex; + }; + Layer.prototype.initContext = function () { + this.ctx = this.dom.getContext('2d'); + this.ctx.dpr = this.dpr; + }; + Layer.prototype.setUnpainted = function () { + this.__firstTimePaint = true; + }; + Layer.prototype.createBackBuffer = function () { + var dpr = this.dpr; + this.domBack = createDom('back-' + this.id, this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + }; + Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) { + if (this.__firstTimePaint) { + this.__firstTimePaint = false; + return null; + } + var mergedRepaintRects = []; + var maxRepaintRectCount = this.maxRepaintRectCount; + var full = false; + var pendingRect = new BoundingRect(0, 0, 0, 0); + function addRectToMergePool(rect) { + if (!rect.isFinite() || rect.isZero()) { + return; + } + if (mergedRepaintRects.length === 0) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + else { + var isMerged = false; + var minDeltaArea = Infinity; + var bestRectToMergeIdx = 0; + for (var i = 0; i < mergedRepaintRects.length; ++i) { + var mergedRect = mergedRepaintRects[i]; + if (mergedRect.intersect(rect)) { + var pendingRect_1 = new BoundingRect(0, 0, 0, 0); + pendingRect_1.copy(mergedRect); + pendingRect_1.union(rect); + mergedRepaintRects[i] = pendingRect_1; + isMerged = true; + break; + } + else if (full) { + pendingRect.copy(rect); + pendingRect.union(mergedRect); + var aArea = rect.width * rect.height; + var bArea = mergedRect.width * mergedRect.height; + var pendingArea = pendingRect.width * pendingRect.height; + var deltaArea = pendingArea - aArea - bArea; + if (deltaArea < minDeltaArea) { + minDeltaArea = deltaArea; + bestRectToMergeIdx = i; + } + } + } + if (full) { + mergedRepaintRects[bestRectToMergeIdx].union(rect); + isMerged = true; + } + if (!isMerged) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + if (!full) { + full = mergedRepaintRects.length >= maxRepaintRectCount; + } + } + } + for (var i = this.__startIndex; i < this.__endIndex; ++i) { + var el = displayList[i]; + if (el) { + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint) + ? el.getPrevPaintRect() + : null; + if (prevRect) { + addRectToMergePool(prevRect); + } + var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered) + ? el.getPaintRect() + : null; + if (curRect) { + addRectToMergePool(curRect); + } + } + } + for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) { + var el = prevList[i]; + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + if (el && (!shouldPaint || !el.__zr) && el.__isRendered) { + var prevRect = el.getPrevPaintRect(); + if (prevRect) { + addRectToMergePool(prevRect); + } + } + } + var hasIntersections; + do { + hasIntersections = false; + for (var i = 0; i < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].isZero()) { + mergedRepaintRects.splice(i, 1); + continue; + } + for (var j = i + 1; j < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) { + hasIntersections = true; + mergedRepaintRects[i].union(mergedRepaintRects[j]); + mergedRepaintRects.splice(j, 1); + } + else { + j++; + } + } + i++; + } + } while (hasIntersections); + this._paintRects = mergedRepaintRects; + return mergedRepaintRects; + }; + Layer.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice(); + }; + Layer.prototype.resize = function (width, height) { + var dpr = this.dpr; + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + dom.width = width * dpr; + dom.height = height * dpr; + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }; + Layer.prototype.clear = function (clearAll, clearColor, repaintRects) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + var dpr = this.dpr; + var self = this; + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr); + } + var domBack = this.domBack; + function doClear(x, y, width, height) { + ctx.clearRect(x, y, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern = void 0; + if (isGradientObject(clearColor)) { + var shouldCache = clearColor.global || (clearColor.__width === width + && clearColor.__height === height); + clearColorGradientOrPattern = shouldCache + && clearColor.__canvasGradient + || getCanvasGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + clearColor.__canvasGradient = clearColorGradientOrPattern; + clearColor.__width = width; + clearColor.__height = height; + } + else if (isImagePatternObject(clearColor)) { + clearColor.scaleX = clearColor.scaleX || dpr; + clearColor.scaleY = clearColor.scaleY || dpr; + clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, { + dirty: function () { + self.setUnpainted(); + self.__painter.refresh(); + } + }); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(x, y, width, height); + ctx.restore(); + } + if (haveMotionBLur) { + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, x, y, width, height); + ctx.restore(); + } + } + if (!repaintRects || haveMotionBLur) { + doClear(0, 0, width, height); + } + else if (repaintRects.length) { + each(repaintRects, function (rect) { + doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + }); + } + }; + return Layer; + }(Eventful)); + + var HOVER_LAYER_ZLEVEL = 1e5; + var CANVAS_ZLEVEL = 314159; + var EL_AFTER_INCREMENTAL_INC = 0.01; + var INCREMENTAL_INC = 0.001; + function isLayerValid(layer) { + if (!layer) { + return false; + } + if (layer.__builtin__) { + return true; + } + if (typeof (layer.resize) !== 'function' + || typeof (layer.refresh) !== 'function') { + return false; + } + return true; + } + function createRoot(width, height) { + var domRoot = document.createElement('div'); + domRoot.style.cssText = [ + 'position:relative', + 'width:' + width + 'px', + 'height:' + height + 'px', + 'padding:0', + 'margin:0', + 'border-width:0' + ].join(';') + ';'; + return domRoot; + } + var CanvasPainter = (function () { + function CanvasPainter(root, storage, opts, id) { + this.type = 'canvas'; + this._zlevelList = []; + this._prevDisplayList = []; + this._layers = {}; + this._layerConfig = {}; + this._needsManuallyCompositing = false; + this.type = 'canvas'; + var singleCanvas = !root.nodeName + || root.nodeName.toUpperCase() === 'CANVAS'; + this._opts = opts = extend({}, opts || {}); + this.dpr = opts.devicePixelRatio || devicePixelRatio; + this._singleCanvas = singleCanvas; + this.root = root; + var rootStyle = root.style; + if (rootStyle) { + disableUserSelect(root); + root.innerHTML = ''; + } + this.storage = storage; + var zlevelList = this._zlevelList; + this._prevDisplayList = []; + var layers = this._layers; + if (!singleCanvas) { + this._width = getSize(root, 0, opts); + this._height = getSize(root, 1, opts); + var domRoot = this._domRoot = createRoot(this._width, this._height); + root.appendChild(domRoot); + } + else { + var rootCanvas = root; + var width = rootCanvas.width; + var height = rootCanvas.height; + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + rootCanvas.width = width * this.dpr; + rootCanvas.height = height * this.dpr; + this._width = width; + this._height = height; + var mainLayer = new Layer(rootCanvas, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + zlevelList.push(CANVAS_ZLEVEL); + this._domRoot = root; + } + } + CanvasPainter.prototype.getType = function () { + return 'canvas'; + }; + CanvasPainter.prototype.isSingleCanvas = function () { + return this._singleCanvas; + }; + CanvasPainter.prototype.getViewportRoot = function () { + return this._domRoot; + }; + CanvasPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + CanvasPainter.prototype.refresh = function (paintAll) { + var list = this.storage.getDisplayList(true); + var prevList = this._prevDisplayList; + var zlevelList = this._zlevelList; + this._redrawId = Math.random(); + this._paintList(list, prevList, paintAll, this._redrawId); + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + if (this._opts.useDirtyRect) { + this._prevDisplayList = list.slice(); + } + return this; + }; + CanvasPainter.prototype.refreshHover = function () { + this._paintHoverList(this.storage.getDisplayList(false)); + }; + CanvasPainter.prototype._paintHoverList = function (list) { + var len = list.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + if (!len) { + return; + } + var scope = { + inHover: true, + viewWidth: this._width, + viewHeight: this._height + }; + var ctx; + for (var i = 0; i < len; i++) { + var el = list[i]; + if (el.__inHover) { + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + if (!ctx) { + ctx = hoverLayer.ctx; + ctx.save(); + } + brush(ctx, el, scope, i === len - 1); + } + } + if (ctx) { + ctx.restore(); + } + }; + CanvasPainter.prototype.getHoverLayer = function () { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }; + CanvasPainter.prototype.paintOne = function (ctx, el) { + brushSingle(ctx, el); + }; + CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + paintAll = paintAll || false; + this._updateLayerStatus(list); + var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover; + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + if (needsRefreshHover) { + this._paintHoverList(list); + } + if (!finished) { + var self_1 = this; + requestAnimationFrame$1(function () { + self_1._paintList(list, prevList, paintAll, redrawId); + }); + } + else { + this.eachLayer(function (layer) { + layer.afterBrush && layer.afterBrush(); + }); + } + }; + CanvasPainter.prototype._compositeManually = function () { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + this.eachBuiltinLayer(function (layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }; + CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) { + var _this = this; + var layerList = []; + var useDirtyRect = this._opts.useDirtyRect; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ + && layer !== this._hoverlayer + && (layer.__dirty || paintAll)) { + layerList.push(layer); + } + } + var finished = true; + var needsRefreshHover = false; + var _loop_1 = function (k) { + var layer = layerList[k]; + var ctx = layer.ctx; + var repaintRects = useDirtyRect + && layer.createRepaintRects(list, prevList, this_1._width, this_1._height); + var start = paintAll ? layer.__startIndex : layer.__drawIndex; + var useTimer = !paintAll && layer.incremental && Date.now; + var startTime = useTimer && Date.now(); + var clearColor = layer.zlevel === this_1._zlevelList[0] + ? this_1._backgroundColor : null; + if (layer.__startIndex === layer.__endIndex) { + layer.clear(false, clearColor, repaintRects); + } + else if (start === layer.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer.clear(false, clearColor, repaintRects); + } + } + if (start === -1) { + console.error('For some unknown reason. drawIndex is -1'); + start = layer.__startIndex; + } + var i; + var repaint = function (repaintRect) { + var scope = { + inHover: false, + allClipped: false, + prevEl: null, + viewWidth: _this._width, + viewHeight: _this._height + }; + for (i = start; i < layer.__endIndex; i++) { + var el = list[i]; + if (el.__inHover) { + needsRefreshHover = true; + } + _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1); + if (useTimer) { + var dTime = Date.now() - startTime; + if (dTime > 15) { + break; + } + } + } + if (scope.prevElClipPaths) { + ctx.restore(); + } + }; + if (repaintRects) { + if (repaintRects.length === 0) { + i = layer.__endIndex; + } + else { + var dpr = this_1.dpr; + for (var r = 0; r < repaintRects.length; ++r) { + var rect = repaintRects[r]; + ctx.save(); + ctx.beginPath(); + ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + ctx.clip(); + repaint(rect); + ctx.restore(); + } + } + } + else { + ctx.save(); + repaint(); + ctx.restore(); + } + layer.__drawIndex = i; + if (layer.__drawIndex < layer.__endIndex) { + finished = false; + } + }; + var this_1 = this; + for (var k = 0; k < layerList.length; k++) { + _loop_1(k); + } + if (env.wxa) { + each(this._layers, function (layer) { + if (layer && layer.ctx && layer.ctx.draw) { + layer.ctx.draw(); + } + }); + } + return { + finished: finished, + needsRefreshHover: needsRefreshHover + }; + }; + CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { + var ctx = currentLayer.ctx; + if (useDirtyRect) { + var paintRect = el.getPaintRect(); + if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { + brush(ctx, el, scope, isLast); + el.setPrevPaintRect(paintRect); + } + } + else { + brush(ctx, el, scope, isLast); + } + }; + CanvasPainter.prototype.getLayer = function (zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } + else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { + merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); + } + if (virtual) { + layer.virtual = virtual; + } + this.insertLayer(zlevel, layer); + layer.initContext(); + } + return layer; + }; + CanvasPainter.prototype.insertLayer = function (zlevel, layer) { + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var domRoot = this._domRoot; + var prevLayer = null; + var i = -1; + if (layersMap[zlevel]) { + if ("development" !== 'production') { + logError('ZLevel ' + zlevel + ' has been used already'); + } + return; + } + if (!isLayerValid(layer)) { + if ("development" !== 'production') { + logError('Layer of zlevel ' + zlevel + ' is not valid'); + } + return; + } + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if (zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + layersMap[zlevel] = layer; + if (!layer.virtual) { + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore(layer.dom, prevDom.nextSibling); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + } + layer.__painter = this; + }; + CanvasPainter.prototype.eachLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }; + CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.eachOtherLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.getLayers = function () { + return this._layers; + }; + CanvasPainter.prototype._updateLayerStatus = function (list) { + this.eachBuiltinLayer(function (layer, z) { + layer.__dirty = layer.__used = false; + }); + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + if (this._singleCanvas) { + for (var i_1 = 1; i_1 < list.length; i_1++) { + var el = list[i_1]; + if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + var prevLayer = null; + var incrementalLayerCount = 0; + var prevZlevel; + var i; + for (i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer = void 0; + if (prevZlevel !== zlevel) { + prevZlevel = zlevel; + incrementalLayerCount = 0; + } + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } + else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + if (!layer.__builtin__) { + logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); + } + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } + else { + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if ((el.__dirty & REDRAW_BIT) && !el.__inHover) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + layer.__drawIndex = i; + } + } + } + updatePrevLayer(i); + this.eachBuiltinLayer(function (layer, z) { + if (!layer.__used && layer.getElementCount() > 0) { + layer.__dirty = true; + layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; + } + if (layer.__dirty && layer.__drawIndex < 0) { + layer.__drawIndex = layer.__startIndex; + } + }); + }; + CanvasPainter.prototype.clear = function () { + this.eachBuiltinLayer(this._clearLayer); + return this; + }; + CanvasPainter.prototype._clearLayer = function (layer) { + layer.clear(); + }; + CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + each(this._layers, function (layer) { + layer.setUnpainted(); + }); + }; + CanvasPainter.prototype.configLayer = function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + merge(layerConfig[zlevel], config, true); + } + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }; + CanvasPainter.prototype.delLayer = function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + zlevelList.splice(indexOf(zlevelList, zlevel), 1); + }; + CanvasPainter.prototype.resize = function (width, height) { + if (!this._domRoot.style) { + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } + else { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + var opts = this._opts; + var root = this.root; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + domRoot.style.display = ''; + if (this._width !== width || height !== this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + this.refresh(true); + } + this._width = width; + this._height = height; + } + return this; + }; + CanvasPainter.prototype.clearLayer = function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }; + CanvasPainter.prototype.dispose = function () { + this.root.innerHTML = ''; + this.root = + this.storage = + this._domRoot = + this._layers = null; + }; + CanvasPainter.prototype.getRenderedCanvas = function (opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + var ctx = imageLayer.ctx; + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + var width_1 = imageLayer.dom.width; + var height_1 = imageLayer.dom.height; + this.eachLayer(function (layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width_1, height_1); + } + else if (layer.renderToCanvas) { + ctx.save(); + layer.renderToCanvas(ctx); + ctx.restore(); + } + }); + } + else { + var scope = { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }; + var displayList = this.storage.getDisplayList(true); + for (var i = 0, len = displayList.length; i < len; i++) { + var el = displayList[i]; + brush(ctx, el, scope, i === len - 1); + } + } + return imageLayer.dom; + }; + CanvasPainter.prototype.getWidth = function () { + return this._width; + }; + CanvasPainter.prototype.getHeight = function () { + return this._height; + }; + return CanvasPainter; + }()); + + function install$1(registers) { + registers.registerPainter('canvas', CanvasPainter); + } + + var LineSeriesModel = + /** @class */ + function (_super) { + __extends(LineSeriesModel, _super); + + function LineSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LineSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + LineSeriesModel.prototype.getInitialData = function (option) { + if ("development" !== 'production') { + var coordSys = option.coordinateSystem; + + if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { + throw new Error('Line not support coordinateSystem besides cartesian and polar'); + } + } + + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + LineSeriesModel.prototype.getLegendIcon = function (opt) { + var group = new Group(); + var line = createSymbol('line', 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false); + group.add(line); + line.setStyle(opt.lineStyle); + var visualType = this.getData().getVisual('symbol'); + var visualRotate = this.getData().getVisual('symbolRotate'); + var symbolType = visualType === 'none' ? 'circle' : visualType; // Symbol size is 80% when there is a line + + var size = opt.itemHeight * 0.8; + var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill); + group.add(symbol); + symbol.setStyle(opt.itemStyle); + var symbolRotate = opt.iconRotate === 'inherit' ? visualRotate : opt.iconRotate || 0; + symbol.rotation = symbolRotate * Math.PI / 180; + symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symbolType.indexOf('empty') > -1) { + symbol.style.stroke = symbol.style.fill; + symbol.style.fill = '#fff'; + symbol.style.lineWidth = 2; + } + + return group; + }; + + LineSeriesModel.type = 'series.line'; + LineSeriesModel.dependencies = ['grid', 'polar']; + LineSeriesModel.defaultOption = { + // zlevel: 0, + z: 3, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + clip: true, + label: { + position: 'top' + }, + // itemStyle: { + // }, + endLabel: { + show: false, + valueAnimation: true, + distance: 8 + }, + lineStyle: { + width: 2, + type: 'solid' + }, + emphasis: { + scale: true + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: 'emptyCircle', + symbolSize: 4, + symbolRotate: null, + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: 'auto', + // Whether to connect break point. + connectNulls: false, + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. + sampling: 'none', + animationEasing: 'linear', + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity, + universalTransition: { + divideShape: 'clone' + }, + triggerLineEvent: false + }; + return LineSeriesModel; + }(SeriesModel); + + /** + * @return label string. Not null/undefined + */ + + function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + var len = labelDims.length; // Simple optimization (in lots of cases, label dims length is 1) + + if (len === 1) { + var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); + return rawVal != null ? rawVal + '' : null; + } else if (len) { + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); + } + + return vals.join(' '); + } + } + function getDefaultInterpolatedLabel(data, interpolatedValue) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + + if (!isArray(interpolatedValue)) { + return interpolatedValue + ''; + } + + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + var dimIndex = data.getDimensionIndex(labelDims[i]); + + if (dimIndex >= 0) { + vals.push(interpolatedValue[dimIndex]); + } + } + + return vals.join(' '); + } + + var Symbol = + /** @class */ + function (_super) { + __extends(Symbol, _super); + + function Symbol(data, idx, seriesScope, opts) { + var _this = _super.call(this) || this; + + _this.updateData(data, idx, seriesScope, opts); + + return _this; + } + + Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { + // Remove paths created before + this.removeAll(); // let symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); + symbolPath.attr({ + z2: 100, + culling: true, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }); // Rewrite drift method + + symbolPath.drift = driftSymbol; + this._symbolType = symbolType; + this.add(symbolPath); + }; + /** + * Stop animation + * @param {boolean} toLastFrame + */ + + + Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(null, toLastFrame); + }; + + Symbol.prototype.getSymbolType = function () { + return this._symbolType; + }; + /** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ + + + Symbol.prototype.getSymbolPath = function () { + return this.childAt(0); + }; + /** + * Highlight symbol + */ + + + Symbol.prototype.highlight = function () { + enterEmphasis(this.childAt(0)); + }; + /** + * Downplay symbol + */ + + + Symbol.prototype.downplay = function () { + leaveEmphasis(this.childAt(0)); + }; + /** + * @param {number} zlevel + * @param {number} z + */ + + + Symbol.prototype.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + Symbol.prototype.setDraggable = function (draggable, hasCursorOption) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor; + }; + /** + * Update symbol properties + */ + + + Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { + this.silent = false; + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = Symbol.getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + var disableAnimation = opts && opts.disableAnimation; + + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + var target = { + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }; + disableAnimation ? symbolPath.attr(target) : updateProps(symbolPath, target, seriesModel, idx); + saveOldStyle(symbolPath); + } + + this._updateCommon(data, idx, symbolSize, seriesScope, opts); + + if (isInit) { + var symbolPath = this.childAt(0); + + if (!disableAnimation) { + var target = { + scaleX: this._sizeX, + scaleY: this._sizeY, + style: { + // Always fadeIn. Because it has fadeOut animation when symbol is removed.. + opacity: symbolPath.style.opacity + } + }; + symbolPath.scaleX = symbolPath.scaleY = 0; + symbolPath.style.opacity = 0; + initProps(symbolPath, target, seriesModel, idx); + } + } + + if (disableAnimation) { + // Must stop leave transition manually if don't call initProps or updateProps. + this.childAt(0).stopAnimation('leave'); + } + }; + + Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var emphasisItemStyle; + var blurItemStyle; + var selectItemStyle; + var focus; + var blurScope; + var emphasisDisabled; + var labelStatesModels; + var hoverScale; + var cursorStyle; + + if (seriesScope) { + emphasisItemStyle = seriesScope.emphasisItemStyle; + blurItemStyle = seriesScope.blurItemStyle; + selectItemStyle = seriesScope.selectItemStyle; + focus = seriesScope.focus; + blurScope = seriesScope.blurScope; + labelStatesModels = seriesScope.labelStatesModels; + hoverScale = seriesScope.hoverScale; + cursorStyle = seriesScope.cursorStyle; + emphasisDisabled = seriesScope.emphasisDisabled; + } + + if (!seriesScope || data.hasItemOption) { + var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + emphasisDisabled = emphasisModel.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + hoverScale = emphasisModel.getShallow('scale'); + cursorStyle = itemModel.getShallow('cursor'); + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + symbolPath.x = symbolOffset[0]; + symbolPath.y = symbolOffset[1]; + } + + cursorStyle && symbolPath.attr('cursor', cursorStyle); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + if (symbolPath.__isEmptyBrush) { + // fill and stroke will be swapped if it's empty. + // So we cloned a new style to avoid it affecting the original style in visual storage. + // TODO Better implementation. No empty logic! + symbolPath.useStyle(extend({}, symbolStyle)); + } else { + symbolPath.useStyle(symbolStyle); + } // Disable decal because symbol scale will been applied on the decal. + + + symbolPath.style.decal = null; + symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); + symbolPath.style.strokeNoScale = true; + } + + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = this._z2; + + if (liftZ != null) { + if (z2Origin == null) { + this._z2 = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + this._z2 = null; + } + + var useNameLabel = opts && opts.useNameLabel; + setLabelStyle(symbolPath, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + inheritColor: visualColor, + defaultOpacity: symbolStyle.opacity + }); // Do not execute util needed. + + function getLabelDefaultText(idx) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + + this._sizeX = symbolSize[0] / 2; + this._sizeY = symbolSize[1] / 2; + var emphasisState = symbolPath.ensureState('emphasis'); + emphasisState.style = emphasisItemStyle; + symbolPath.ensureState('select').style = selectItemStyle; + symbolPath.ensureState('blur').style = blurItemStyle; // null / undefined / true means to use default strategy. + // 0 / false / negative number / NaN / Infinity means no scale. + + var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY) // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down + : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1; // always set scale to allow resetting + + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + this.setSymbolScale(1); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Symbol.prototype.setSymbolScale = function (scale) { + this.scaleX = this.scaleY = scale; + }; + + Symbol.prototype.fadeOut = function (cb, seriesModel, opt) { + var symbolPath = this.childAt(0); + var dataIndex = getECData(this).dataIndex; + var animationOpt = opt && opt.animation; // Avoid mistaken hover when fading out + + this.silent = symbolPath.silent = true; // Not show text when animating + + if (opt && opt.fadeLabel) { + var textContent = symbolPath.getTextContent(); + + if (textContent) { + removeElement(textContent, { + style: { + opacity: 0 + } + }, seriesModel, { + dataIndex: dataIndex, + removeOpt: animationOpt, + cb: function () { + symbolPath.removeTextContent(); + } + }); + } + } else { + symbolPath.removeTextContent(); + } + + removeElement(symbolPath, { + style: { + opacity: 0 + }, + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: dataIndex, + cb: cb, + removeOpt: animationOpt + }); + }; + + Symbol.getSymbolSize = function (data, idx) { + return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + }; + + return Symbol; + }(Group); + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none'; + } + + function normalizeUpdateOpt(opt) { + if (opt != null && !isObject(opt)) { + opt = { + isIgnore: opt + }; + } + + return opt || {}; + } + + function makeSeriesScope(data) { + var seriesModel = data.hostModel; + var emphasisModel = seriesModel.getModel('emphasis'); + return { + emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(), + blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(), + selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(), + focus: emphasisModel.get('focus'), + blurScope: emphasisModel.get('blurScope'), + emphasisDisabled: emphasisModel.get('disabled'), + hoverScale: emphasisModel.get('scale'), + labelStatesModels: getLabelStatesModels(seriesModel), + cursorStyle: seriesModel.get('cursor') + }; + } + + var SymbolDraw = + /** @class */ + function () { + function SymbolDraw(SymbolCtor) { + this.group = new Group(); + this._SymbolCtor = SymbolCtor || Symbol; + } + /** + * Update symbols draw by new data + */ + + + SymbolDraw.prototype.updateData = function (data, opt) { + // Remove progressive els. + this._progressiveEls = null; + opt = normalizeUpdateOpt(opt); + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._SymbolCtor; + var disableAnimation = opt.disableAnimation; + var seriesScope = makeSeriesScope(data); + var symbolUpdateOpt = { + disableAnimation: disableAnimation + }; + + var getSymbolPoint = opt.getSymbolPoint || function (idx) { + return data.getItemLayout(idx); + }; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + + if (!oldData) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + var point = getSymbolPoint(newIdx); + + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = getSymbolPoint(newIdx); + + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + + var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle'; + var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType(); + + if (!symbolEl // Create a new if symbol type changed. + || oldSymbolType && oldSymbolType !== newSymbolType) { + group.remove(symbolEl); + symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + } else { + symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); + var target = { + x: point[0], + y: point[1] + }; + disableAnimation ? symbolEl.attr(target) : updateProps(symbolEl, target, seriesModel); + } // Add back + + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }, seriesModel); + }).execute(); + this._getSymbolPoint = getSymbolPoint; + this._data = data; + }; + + SymbolDraw.prototype.updateLayout = function () { + var _this = this; + + var data = this._data; + + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = _this._getSymbolPoint(idx); + + el.setPosition(point); + el.markRedraw(); + }); + } + }; + + SymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); + }; + /** + * Update symbols draw by new data + */ + + SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + // Clear + this._progressiveEls = []; + opt = normalizeUpdateOpt(opt); + + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._SymbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.setPosition(point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + SymbolDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + SymbolDraw.prototype.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; // Incremental model do not have this._data. + + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }, data.hostModel); + }); + } else { + group.removeAll(); + } + }; + return SymbolDraw; + }(); + + function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var dims = map(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + var stacked = false; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0] + /* , dims[1] */ + )) { + // jshint ignore:line + stacked = true; + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1] + /* , dims[0] */ + )) { + // jshint ignore:line + stacked = true; + dims[1] = stackResultDim; + } + + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; + } + + function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + + if (valueOrigin === 'start') { + valueStart = extent[0]; + } else if (valueOrigin === 'end') { + valueStart = extent[1]; + } // If origin is specified as a number, use it as + // valueStart directly + else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { + valueStart = valueOrigin; + } // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } // If is one positive, and one negative, onZero shall be true + + } + + return valueStart; + } + + function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + return coordSys.dataToPoint(stackedData); + } + + function diffData(oldData, newData) { + var diffResult = []; + newData.diff(oldData).add(function (idx) { + diffResult.push({ + cmd: '+', + idx: idx + }); + }).update(function (newIdx, oldIdx) { + diffResult.push({ + cmd: '=', + idx: oldIdx, + idx1: newIdx + }); + }).remove(function (idx) { + diffResult.push({ + cmd: '-', + idx: idx + }); + }).execute(); + return diffResult; + } + + function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { + var diff = diffData(oldData, newData); // let newIdList = newData.mapArray(newData.getId); + // let oldIdList = oldData.mapArray(oldData.getId); + // convertToIntId(newIdList, oldIdList); + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; // Points for stacking base line + + var currStackedPoints = []; + var nextStackedPoints = []; + var status = []; + var sortedIndices = []; + var rawIndices = []; + var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + + var oldPoints = oldData.getLayout('points') || []; + var newPoints = newData.getLayout('points') || []; + + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + var oldIdx2 = void 0; + var newIdx2 = void 0; // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + + switch (diffItem.cmd) { + case '=': + oldIdx2 = diffItem.idx * 2; + newIdx2 = diffItem.idx1 * 2; + var currentX = oldPoints[oldIdx2]; + var currentY = oldPoints[oldIdx2 + 1]; + var nextX = newPoints[newIdx2]; + var nextY = newPoints[newIdx2 + 1]; // If previous data is NaN, use next point directly + + if (isNaN(currentX) || isNaN(currentY)) { + currentX = nextX; + currentY = nextY; + } + + currPoints.push(currentX, currentY); + nextPoints.push(nextX, nextY); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + + case '+': + var newIdx = diffItem.idx; + var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; + var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); + newIdx2 = newIdx * 2; + currPoints.push(oldPt[0], oldPt[1]); + nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); + var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); + currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(newIdx)); + break; + + case '-': + pointAdded = false; + } // Original indices + + + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } // Diff result may be crossed if all items are changed + // Sort by data index + + + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + var len = currPoints.length; + var sortedCurrPoints = createFloat32Array(len); + var sortedNextPoints = createFloat32Array(len); + var sortedCurrStackedPoints = createFloat32Array(len); + var sortedNextStackedPoints = createFloat32Array(len); + var sortedStatus = []; + + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + var i2 = i * 2; + var idx2 = idx * 2; + sortedCurrPoints[i2] = currPoints[idx2]; + sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; + sortedNextPoints[i2] = nextPoints[idx2]; + sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; + sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; + sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; + sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; + sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + status: sortedStatus + }; + } + + var mathMin$5 = Math.min; + var mathMax$5 = Math.max; + + function isPointNull(x, y) { + return isNaN(x) || isNaN(y); + } + /** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ + + + function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { + var prevX; + var prevY; + var cpx0; + var cpy0; + var cpx1; + var cpy1; + var idx = start; + var k = 0; + + for (; k < segLen; k++) { + var x = points[idx * 2]; + var y = points[idx * 2 + 1]; + + if (idx >= allLen || idx < 0) { + break; + } + + if (isPointNull(x, y)) { + if (connectNulls) { + idx += dir; + continue; + } + + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); + cpx0 = x; + cpy0 = y; + } else { + var dx = x - prevX; + var dy = y - prevY; // Ignore tiny segment. + + if (dx * dx + dy * dy < 0.5) { + idx += dir; + continue; + } + + if (smooth > 0) { + var nextIdx = idx + dir; + var nextX = points[nextIdx * 2]; + var nextY = points[nextIdx * 2 + 1]; // Ignore duplicate point + + while (nextX === x && nextY === y && k < segLen) { + k++; + nextIdx += dir; + idx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + x = points[idx * 2]; + y = points[idx * 2 + 1]; + dx = x - prevX; + dy = y - prevY; + } + + var tmpK = k + 1; + + if (connectNulls) { + // Find next point not null + while (isPointNull(nextX, nextY) && tmpK < segLen) { + tmpK++; + nextIdx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + } + } + + var ratioNextSeg = 0.5; + var vx = 0; + var vy = 0; + var nextCpx0 = void 0; + var nextCpy0 = void 0; // Is last point + + if (tmpK >= segLen || isPointNull(nextX, nextY)) { + cpx1 = x; + cpy1 = y; + } else { + vx = nextX - prevX; + vy = nextY - prevY; + var dx0 = x - prevX; + var dx1 = nextX - x; + var dy0 = y - prevY; + var dy1 = nextY - y; + var lenPrevSeg = void 0; + var lenNextSeg = void 0; + + if (smoothMonotone === 'x') { + lenPrevSeg = Math.abs(dx0); + lenNextSeg = Math.abs(dx1); + var dir_1 = vx > 0 ? 1 : -1; + cpx1 = x - dir_1 * lenPrevSeg * smooth; + cpy1 = y; + nextCpx0 = x + dir_1 * lenNextSeg * smooth; + nextCpy0 = y; + } else if (smoothMonotone === 'y') { + lenPrevSeg = Math.abs(dy0); + lenNextSeg = Math.abs(dy1); + var dir_2 = vy > 0 ? 1 : -1; + cpx1 = x; + cpy1 = y - dir_2 * lenPrevSeg * smooth; + nextCpx0 = x; + nextCpy0 = y + dir_2 * lenNextSeg * smooth; + } else { + lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); + lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); // Use ratio of seg length + + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + cpx1 = x - vx * smooth * (1 - ratioNextSeg); + cpy1 = y - vy * smooth * (1 - ratioNextSeg); // cp0 of next segment + + nextCpx0 = x + vx * smooth * ratioNextSeg; + nextCpy0 = y + vy * smooth * ratioNextSeg; // Smooth constraint between point and next point. + // Avoid exceeding extreme after smoothing. + + nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x)); + nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y)); + nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x)); + nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y)); // Reclaculate cp1 based on the adjusted cp0 of next seg. + + vx = nextCpx0 - x; + vy = nextCpy0 - y; + cpx1 = x - vx * lenPrevSeg / lenNextSeg; + cpy1 = y - vy * lenPrevSeg / lenNextSeg; // Smooth constraint between point and prev point. + // Avoid exceeding extreme after smoothing. + + cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x)); + cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y)); + cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x)); + cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y)); // Adjust next cp0 again. + + vx = x - cpx1; + vy = y - cpy1; + nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; + nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; + } + } + + ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); + cpx0 = nextCpx0; + cpy0 = nextCpy0; + } else { + ctx.lineTo(x, y); + } + } + + prevX = x; + prevY = y; + idx += dir; + } + + return k; + } + + var ECPolylineShape = + /** @class */ + function () { + function ECPolylineShape() { + this.smooth = 0; + this.smoothConstraint = true; + } + + return ECPolylineShape; + }(); + + var ECPolyline = + /** @class */ + function (_super) { + __extends(ECPolyline, _super); + + function ECPolyline(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polyline'; + return _this; + } + + ECPolyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECPolyline.prototype.getDefaultShape = function () { + return new ECPolylineShape(); + }; + + ECPolyline.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var i = 0; + var len = points.length / 2; // const result = getBoundingBox(points, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; + } + }; + + ECPolyline.prototype.getPointOn = function (xOrY, dim) { + if (!this.path) { + this.createPathProxy(); + this.buildPath(this.path, this.shape); + } + + var path = this.path; + var data = path.data; + var CMD = PathProxy.CMD; + var x0; + var y0; + var isDimX = dim === 'x'; + var roots = []; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + var x = void 0; + var y = void 0; + var x2 = void 0; + var y2 = void 0; + var x3 = void 0; + var y3 = void 0; + var t = void 0; + + switch (cmd) { + case CMD.M: + x0 = data[i++]; + y0 = data[i++]; + break; + + case CMD.L: + x = data[i++]; + y = data[i++]; + t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); + + if (t <= 1 && t >= 0) { + var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; + return isDimX ? [xOrY, val] : [val, xOrY]; + } + + x0 = x; + y0 = y; + break; + + case CMD.C: + x = data[i++]; + y = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + x3 = data[i++]; + y3 = data[i++]; + var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); + + if (nRoot > 0) { + for (var i_1 = 0; i_1 < nRoot; i_1++) { + var t_1 = roots[i_1]; + + if (t_1 <= 1 && t_1 >= 0) { + var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); + return isDimX ? [xOrY, val] : [val, xOrY]; + } + } + } + + x0 = x3; + y0 = y3; + break; + } + } + }; + + return ECPolyline; + }(Path); + + var ECPolygonShape = + /** @class */ + function (_super) { + __extends(ECPolygonShape, _super); + + function ECPolygonShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return ECPolygonShape; + }(ECPolylineShape); + + var ECPolygon = + /** @class */ + function (_super) { + __extends(ECPolygon, _super); + + function ECPolygon(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polygon'; + return _this; + } + + ECPolygon.prototype.getDefaultShape = function () { + return new ECPolygonShape(); + }; + + ECPolygon.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + var i = 0; + var len = points.length / 2; + var smoothMonotone = shape.smoothMonotone; + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); + drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); + i += k + 1; + ctx.closePath(); + } + }; + + return ECPolygon; + }(Path); + + function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { + var rect = cartesian.getArea(); + var x = rect.x; + var y = rect.y; + var width = rect.width; + var height = rect.height; + var lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; // Expand the clip path a bit to avoid the border is clipped and looks thinner + + x -= lineWidth / 2; + y -= lineWidth / 2; + width += lineWidth; + height += lineWidth; // fix: https://github.com/apache/incubator-echarts/issues/11369 + + x = Math.floor(x); + width = Math.round(width); + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isAxisInversed = baseAxis.inverse; + + if (isHorizontal) { + if (isAxisInversed) { + clipPath.shape.x += width; + } + + clipPath.shape.width = 0; + } else { + if (!isAxisInversed) { + clipPath.shape.y += height; + } + + clipPath.shape.height = 0; + } + + var duringCb = isFunction(during) ? function (percent) { + during(percent, clipPath); + } : null; + initProps(clipPath, { + shape: { + width: width, + height: height, + x: x, + y: y + } + }, seriesModel, null, done, duringCb); + } + + return clipPath; + } + + function createPolarClipPath(polar, hasAnimation, seriesModel) { + var sectorArea = polar.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + + var r0 = round(sectorArea.r0, 1); + var r = round(sectorArea.r, 1); + var clipPath = new Sector({ + shape: { + cx: round(polar.cx, 1), + cy: round(polar.cy, 1), + r0: r0, + r: r, + startAngle: sectorArea.startAngle, + endAngle: sectorArea.endAngle, + clockwise: sectorArea.clockwise + } + }); + + if (hasAnimation) { + var isRadial = polar.getBaseAxis().dim === 'angle'; + + if (isRadial) { + clipPath.shape.endAngle = sectorArea.startAngle; + } else { + clipPath.shape.r = r0; + } + + initProps(clipPath, { + shape: { + endAngle: sectorArea.endAngle, + r: r + } + }, seriesModel); + } + + return clipPath; + } + + function createClipPath(coordSys, hasAnimation, seriesModel, done, during) { + if (!coordSys) { + return null; + } else if (coordSys.type === 'polar') { + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } else if (coordSys.type === 'cartesian2d') { + return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during); + } + + return null; + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function isCoordinateSystemType(coordSys, type) { + return coordSys.type === type; + } + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + + for (var i = 0; i < points1.length; i++) { + if (points1[i] !== points2[i]) { + return; + } + } + + return true; + } + + function bboxFromPoints(points) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (!isNaN(x)) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + } + + if (!isNaN(y)) { + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + } + + return [[minX, minY], [maxX, maxY]]; + } + + function getBoundingDiff(points1, points2) { + var _a = bboxFromPoints(points1), + min1 = _a[0], + max1 = _a[1]; + + var _b = bboxFromPoints(points2), + min2 = _b[0], + max2 = _b[1]; // Get a max value from each corner of two boundings. + + + return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); + } + + function getSmooth(smooth) { + return isNumber(smooth) ? smooth : smooth ? 0.5 : 0; + } + + function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + + var len = data.count(); + var points = createFloat32Array(len * 2); + + for (var idx = 0; idx < len; idx++) { + var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); + points[idx * 2] = pt[0]; + points[idx * 2 + 1] = pt[1]; + } + + return points; + } + + function turnPointsIntoStep(points, coordSys, stepTurnAt, connectNulls) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1; + var stepPoints = []; + var i = 0; + var stepPt = []; + var pt = []; + var nextPt = []; + var filteredPoints = []; + + if (connectNulls) { + for (i = 0; i < points.length; i += 2) { + if (!isNaN(points[i]) && !isNaN(points[i + 1])) { + filteredPoints.push(points[i], points[i + 1]); + } + } + + points = filteredPoints; + } + + for (i = 0; i < points.length - 2; i += 2) { + nextPt[0] = points[i + 2]; + nextPt[1] = points[i + 3]; + pt[0] = points[i]; + pt[1] = points[i + 1]; + stepPoints.push(pt[0], pt[1]); + + switch (stepTurnAt) { + case 'end': + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + break; + + case 'middle': + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + stepPoints.push(stepPt2[0], stepPt2[1]); + break; + + default: + // default is start + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + } + } // Last points + + + stepPoints.push(points[i++], points[i++]); + return stepPoints; + } + /** + * Clip color stops to edge. Avoid creating too large gradients. + * Which may lead to blurry when GPU acceleration is enabled. See #15680 + * + * The stops has been sorted from small to large. + */ + + + function clipColorStops(colorStops, maxSize) { + var newColorStops = []; + var len = colorStops.length; // coord will always < 0 in prevOutOfRangeColorStop. + + var prevOutOfRangeColorStop; + var prevInRangeColorStop; + + function lerpStop(stop0, stop1, clippedCoord) { + var coord0 = stop0.coord; + var p = (clippedCoord - coord0) / (stop1.coord - coord0); + var color = lerp$1(p, [stop0.color, stop1.color]); + return { + coord: clippedCoord, + color: color + }; + } + + for (var i = 0; i < len; i++) { + var stop_1 = colorStops[i]; + var coord = stop_1.coord; + + if (coord < 0) { + prevOutOfRangeColorStop = stop_1; + } else if (coord > maxSize) { + if (prevInRangeColorStop) { + newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize)); + } else if (prevOutOfRangeColorStop) { + // If there are two stops and coord range is between these two stops + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize)); + } // All following stop will be out of range. So just ignore them. + + + break; + } else { + if (prevOutOfRangeColorStop) { + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0)); // Reset + + prevOutOfRangeColorStop = null; + } + + newColorStops.push(stop_1); + prevInRangeColorStop = stop_1; + } + } + + return newColorStops; + } + + function getVisualGradient(data, coordSys, api) { + var visualMetaList = data.getVisual('visualMeta'); + + if (!visualMetaList || !visualMetaList.length || !data.count()) { + // When data.count() is 0, gradient range can not be calculated. + return; + } + + if (coordSys.type !== 'cartesian2d') { + if ("development" !== 'production') { + console.warn('Visual map on line style is only supported on cartesian2d.'); + } + + return; + } + + var coordDim; + var visualMeta; + + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension); + coordDim = dimInfo && dimInfo.coordDim; // Can only be x or y + + if (coordDim === 'x' || coordDim === 'y') { + visualMeta = visualMetaList[i]; + break; + } + } + + if (!visualMeta) { + if ("development" !== 'production') { + console.warn('Visual map on line style only support x or y dimension.'); + } + + return; + } // If the area to be rendered is bigger than area defined by LinearGradient, + // the canvas spec prescribes that the color of the first stop and the last + // stop should be used. But if two stops are added at offset 0, in effect + // browsers use the color of the second stop to render area outside + // LinearGradient. So we can only infinitesimally extend area defined in + // LinearGradient to render `outerColors`. + + + var axis = coordSys.getAxis(coordDim); // dataToCoord mapping may not be linear, but must be monotonic. + + var colorStops = map(visualMeta.stops, function (stop) { + // offset will be calculated later. + return { + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + + var colorStopsInRange = clipColorStops(colorStops, coordDim === 'x' ? api.getWidth() : api.getHeight()); + var inRangeStopLen = colorStopsInRange.length; + + if (!inRangeStopLen && stopLen) { + // All stops are out of range. All will be the same color. + return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color; + } + + var tinyExtent = 10; // Arbitrary value: 10px + + var minCoord = colorStopsInRange[0].coord - tinyExtent; + var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + + if (coordSpan < 1e-3) { + return 'transparent'; + } + + each(colorStopsInRange, function (stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStopsInRange.push({ + // NOTE: inRangeStopLen may still be 0 if stoplen is zero. + offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5, + color: outerColors[1] || 'transparent' + }); + colorStopsInRange.unshift({ + offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5, + color: outerColors[0] || 'transparent' + }); + var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true); + gradient[coordDim] = minCoord; + gradient[coordDim + '2'] = maxCoord; + return gradient; + } + + function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get('showAllSymbol'); + var isAuto = showAllSymbol === 'auto'; + + if (showAllSymbol && !isAuto) { + return; + } + + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (!categoryAxis) { + return; + } // Note that category label interval strategy might bring some weird effect + // in some scenario: users may wonder why some of the symbols are not + // displayed. So we show all symbols as possible as we can. + + + if (isAuto // Simplify the logic, do not determine label overlap here. + && canShowAllSymbolForCategory(categoryAxis, data)) { + return; + } // Otherwise follow the label interval strategy on category axis. + + + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + each(categoryAxis.getViewLabels(), function (labelItem) { + var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue); + labelMap[ordinalNumber] = 1; + }); + return function (dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; + } + + function canShowAllSymbolForCategory(categoryAxis, data) { + // In most cases, line is monotonous on category axis, and the label size + // is close with each other. So we check the symbol size and some of the + // label size alone with the category axis to estimate whether all symbol + // can be shown without overlap. + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); // 0/0 is NaN. + // Sampling some points, max 5. + + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (Symbol.getSymbolSize(data, dataIndex // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] // Empirical number + * 1.5 > availSize) { + return false; + } + } + + return true; + } + + function isPointNull$1(x, y) { + return isNaN(x) || isNaN(y); + } + + function getLastIndexNotNull(points) { + var len = points.length / 2; + + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + return len - 1; + } + + function getPointAtIndex(points, idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + + function getIndexRange(points, xOrY, dim) { + var len = points.length / 2; + var dimIdx = dim === 'x' ? 0 : 1; + var a; + var b; + var prevIndex = 0; + var nextIndex = -1; + + for (var i = 0; i < len; i++) { + b = points[i * 2 + dimIdx]; + + if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) { + continue; + } + + if (i === 0) { + a = b; + continue; + } + + if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { + nextIndex = i; + break; + } + + prevIndex = i; + a = b; + } + + return { + range: [prevIndex, nextIndex], + t: (xOrY - a) / (b - a) + }; + } + + function anyStateShowEndLabel(seriesModel) { + if (seriesModel.get(['endLabel', 'show'])) { + return true; + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + if (seriesModel.get([SPECIAL_STATES[i], 'endLabel', 'show'])) { + return true; + } + } + + return false; + } + + function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var endLabelModel_1 = seriesModel.getModel('endLabel'); + var valueAnimation_1 = endLabelModel_1.get('valueAnimation'); + var data_1 = seriesModel.getData(); + var labelAnimationRecord_1 = { + lastFrameIndex: 0 + }; + var during = anyStateShowEndLabel(seriesModel) ? function (percent, clipRect) { + lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); + } : null; + var isHorizontal = coordSys.getBaseAxis().isHorizontal(); + var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () { + var endLabel = lineView._endLabel; + + if (endLabel && hasAnimation) { + if (labelAnimationRecord_1.originalX != null) { + endLabel.attr({ + x: labelAnimationRecord_1.originalX, + y: labelAnimationRecord_1.originalY + }); + } + } + }, during); // Expand clip shape to avoid clipping when line value exceeds axis + + if (!seriesModel.get('clip', true)) { + var rectShape = clipPath.shape; + var expandSize = Math.max(rectShape.width, rectShape.height); + + if (isHorizontal) { + rectShape.y -= expandSize; + rectShape.height += expandSize * 2; + } else { + rectShape.x -= expandSize; + rectShape.width += expandSize * 2; + } + } // Set to the final frame. To make sure label layout is right. + + + if (during) { + during(1, clipPath); + } + + return clipPath; + } else { + if ("development" !== 'production') { + if (seriesModel.get(['endLabel', 'show'])) { + console.warn('endLabel is not supported for lines in polar systems.'); + } + } + + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } + } + + function getEndLabelStateSpecified(endLabelModel, coordSys) { + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center'; + var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom'; + return { + normal: { + align: endLabelModel.get('align') || align, + verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign + } + }; + } + + var LineView = + /** @class */ + function (_super) { + __extends(LineView, _super); + + function LineView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + LineView.prototype.init = function () { + var lineGroup = new Group(); + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }; + + LineView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var areaStyleModel = seriesModel.getModel('areaStyle'); + var points = data.getLayout('points') || []; + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + var lineGroup = this._lineGroup; + var hasAnimation = !ecModel.ssr && seriesModel.isAnimationEnabled(); + var isAreaChart = !areaStyleModel.isEmpty(); + var valueOrigin = areaStyleModel.get('origin'); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); + var showSymbol = seriesModel.get('showSymbol'); + var connectNulls = seriesModel.get('connectNulls'); + var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); // Remove temporary symbols + + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); // Remove previous created symbols if showSymbol changed to false + + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); // FIXME step not support polar + + var step = !isCoordSysPolar ? seriesModel.get('step') : false; + var clipShapeForSymbol; + + if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) { + clipShapeForSymbol = coordSys.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + // See #7913 and `test/dataZoom-clip.html`. + + if (clipShapeForSymbol.width != null) { + clipShapeForSymbol.x -= 0.1; + clipShapeForSymbol.y -= 0.1; + clipShapeForSymbol.width += 0.2; + clipShapeForSymbol.height += 0.2; + } else if (clipShapeForSymbol.r0) { + clipShapeForSymbol.r0 -= 0.5; + clipShapeForSymbol.r += 0.5; + } + } + + this._clipShapeForSymbol = clipShapeForSymbol; + var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual('style')[data.getVisual('drawType')]; // Initialization animation or coordinate system changed + + if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); + + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline = this._newPolyline(points); + + if (isAreaChart) { + polygon = this._newPolygon(points, stackedOnPoints); + } // If areaStyle is removed + else if (polygon) { + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } // Update clipPath + + + var oldClipPath = lineGroup.getClipPath(); + + if (oldClipPath) { + var newClipPath = createLineClipPath(this, coordSys, false, seriesModel); + initProps(oldClipPath, { + shape: newClipPath.shape + }, seriesModel); + } else { + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } // Always update, or it is wrong in the case turning on legend + // because points are not changed. + + + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); // In the case data zoom triggered refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing. + + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) { + if (hasAnimation) { + this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls); + } else { + // Not do it in update with animation + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + polyline.useStyle(defaults( // Use color in lineStyle first + lineStyleModel.getLineStyle(), { + fill: 'none', + stroke: visualColor, + lineJoin: 'bevel' + })); + setStatesStylesFromModel(polyline, seriesModel, 'lineStyle'); + + if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') { + var emphasisLineStyle = polyline.getState('emphasis').style; + emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1; + } // Needs seriesIndex for focus + + + getECData(polyline).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled); + var smooth = getSmooth(seriesModel.get('smooth')); + var smoothMonotone = seriesModel.get('smoothMonotone'); + polyline.setShape({ + smooth: smooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + + if (polygon) { + var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + var stackedOnSmooth = 0; + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: visualColor, + opacity: 0.7, + lineJoin: 'bevel', + decal: data.getVisual('style').decal + })); + + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + setStatesStylesFromModel(polygon, seriesModel, 'areaStyle'); // Needs seriesIndex for focus + + getECData(polygon).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled); + } + + var changePolyState = function (toState) { + _this._changePolyState(toState); + }; + + data.eachItemGraphicEl(function (el) { + // Switch polyline / polygon state if element changed its state. + el && (el.onHoverStateChange = changePolyState); + }); + this._polyline.onHoverStateChange = changePolyState; + this._data = data; // Save the coordinate system for transition animation when data changed + + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + + if (seriesModel.get('triggerLineEvent')) { + this.packEventData(seriesModel, polyline); + polygon && this.packEventData(seriesModel, polygon); + } + }; + + LineView.prototype.packEventData = function (seriesModel, el) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'line', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'line' + }; + }; + + LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('emphasis'); + + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var points = data.getLayout('points'); + var symbol = data.getItemGraphicEl(dataIndex); + + if (!symbol) { + // Create a temporary symbol if it is not exists + var x = points[dataIndex * 2]; + var y = points[dataIndex * 2 + 1]; + + if (isNaN(x) || isNaN(y)) { + // Null data + return; + } // fix #11360: shouldn't draw symbol outside clipShapeForSymbol + + + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { + return; + } + + var zlevel = seriesModel.get('zlevel') || 0; + var z = seriesModel.get('z') || 0; + symbol = new Symbol(data, dataIndex); + symbol.x = x; + symbol.y = y; + symbol.setZ(zlevel, z); // ensure label text of the temporary symbol is in front of line and area polygon + + var symbolLabel = symbol.getSymbolPath().getTextContent(); + + if (symbolLabel) { + symbolLabel.zlevel = zlevel; + symbolLabel.z = z; + symbolLabel.z2 = this._polyline.z2 + 1; + } + + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); // Stop scale animation + + symbol.stopSymbolAnimation(true); + this.group.add(symbol); + } + + symbol.highlight(); + } else { + // Highlight whole series + ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('normal'); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } else { + symbol.downplay(); + } + } + } else { + // FIXME + // can not downplay completely. + // Downplay whole series + ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype._changePolyState = function (toState) { + var polygon = this._polygon; + setStatesFlag(this._polyline, toState); + polygon && setStatesFlag(polygon, toState); + }; + + LineView.prototype._newPolyline = function (points) { + var polyline = this._polyline; // Remove previous created polyline + + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new ECPolyline({ + shape: { + points: points + }, + segmentIgnoreThreshold: 2, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + return polyline; + }; + + LineView.prototype._newPolygon = function (points, stackedOnPoints) { + var polygon = this._polygon; // Remove previous created polygon + + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new ECPolygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + segmentIgnoreThreshold: 2 + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }; + + LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) { + var isHorizontalOrRadial; + var isCoordSysPolar; + var baseAxis = coordSys.getBaseAxis(); + var isAxisInverse = baseAxis.inverse; + + if (coordSys.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + isCoordSysPolar = false; + } else if (coordSys.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + isCoordSysPolar = true; + } + + var seriesModel = data.hostModel; + var seriesDuration = seriesModel.get('animationDuration'); + + if (isFunction(seriesDuration)) { + seriesDuration = seriesDuration(null); + } + + var seriesDelay = seriesModel.get('animationDelay') || 0; + var seriesDelayValue = isFunction(seriesDelay) ? seriesDelay(null) : seriesDelay; + data.eachItemGraphicEl(function (symbol, idx) { + var el = symbol; + + if (el) { + var point = [symbol.x, symbol.y]; + var start = void 0; + var end = void 0; + var current = void 0; + + if (clipShape) { + if (isCoordSysPolar) { + var polarClip = clipShape; + var coord = coordSys.pointToCoord(point); + + if (isHorizontalOrRadial) { + start = polarClip.startAngle; + end = polarClip.endAngle; + current = -coord[1] / 180 * Math.PI; + } else { + start = polarClip.r0; + end = polarClip.r; + current = coord[0]; + } + } else { + var gridClip = clipShape; + + if (isHorizontalOrRadial) { + start = gridClip.x; + end = gridClip.x + gridClip.width; + current = symbol.x; + } else { + start = gridClip.y + gridClip.height; + end = gridClip.y; + current = symbol.y; + } + } + } + + var ratio = end === start ? 0 : (current - start) / (end - start); + + if (isAxisInverse) { + ratio = 1 - ratio; + } + + var delay = isFunction(seriesDelay) ? seriesDelay(idx) : seriesDuration * ratio + seriesDelayValue; + var symbolPath = el.getSymbolPath(); + var text = symbolPath.getTextContent(); + el.attr({ + scaleX: 0, + scaleY: 0 + }); + el.animateTo({ + scaleX: 1, + scaleY: 1 + }, { + duration: 200, + setToFinal: true, + delay: delay + }); + + if (text) { + text.animateFrom({ + style: { + opacity: 0 + } + }, { + duration: 300, + delay: delay + }); + } + + symbolPath.disableLabelAnimation = true; + } + }); + }; + + LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) { + var endLabelModel = seriesModel.getModel('endLabel'); + + if (anyStateShowEndLabel(seriesModel)) { + var data_2 = seriesModel.getData(); + var polyline = this._polyline; // series may be filtered. + + var points = data_2.getLayout('points'); + + if (!points) { + polyline.removeTextContent(); + this._endLabel = null; + return; + } + + var endLabel = this._endLabel; + + if (!endLabel) { + endLabel = this._endLabel = new ZRText({ + z2: 200 // should be higher than item symbol + + }); + endLabel.ignoreClip = true; + polyline.setTextContent(this._endLabel); + polyline.disableLabelAnimation = true; + } // Find last non-NaN data to display data + + + var dataIndex = getLastIndexNotNull(points); + + if (dataIndex >= 0) { + setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), { + inheritColor: inheritColor, + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: function (dataIndex, opt, interpolatedValue) { + return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex); + }, + enableTextSetter: true + }, getEndLabelStateSpecified(endLabelModel, coordSys)); + polyline.textConfig.position = null; + } + } else if (this._endLabel) { + this._polyline.removeTextContent(); + + this._endLabel = null; + } + }; + + LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { + var endLabel = this._endLabel; + var polyline = this._polyline; + + if (endLabel) { + // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render. + // The label is not prepared at this time. + if (percent < 1 && animationRecord.originalX == null) { + animationRecord.originalX = endLabel.x; + animationRecord.originalY = endLabel.y; + } + + var points = data.getLayout('points'); + var seriesModel = data.hostModel; + var connectNulls = seriesModel.get('connectNulls'); + var precision = endLabelModel.get('precision'); + var distance = endLabelModel.get('distance') || 0; + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var clipShape = clipRect.shape; + var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; + var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); + var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); + var dim = isHorizontal ? 'x' : 'y'; + var dataIndexRange = getIndexRange(points, xOrY, dim); + var indices = dataIndexRange.range; + var diff = indices[1] - indices[0]; + var value = void 0; + + if (diff >= 1) { + // diff > 1 && connectNulls, which is on the null data. + if (diff > 1 && !connectNulls) { + var pt = getPointAtIndex(points, indices[0]); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + valueAnimation && (value = seriesModel.getRawValue(indices[0])); + } else { + var pt = polyline.getPointOn(xOrY, dim); + pt && endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + var startValue = seriesModel.getRawValue(indices[0]); + var endValue = seriesModel.getRawValue(indices[1]); + valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); + } + + animationRecord.lastFrameIndex = indices[0]; + } else { + // If diff <= 0, which is the range is not found(Include NaN) + // Choose the first point or last point. + var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; + var pt = getPointAtIndex(points, idx); + valueAnimation && (value = seriesModel.getRawValue(idx)); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + } + + if (valueAnimation) { + labelInner(endLabel).setLabelText(value); + } + } + }; + /** + * @private + */ + // FIXME Two value axis + + + LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin); + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + + if (step) { + // TODO If stacked series is not step + current = turnPointsIntoStep(diff.current, coordSys, step, connectNulls); + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step, connectNulls); + next = turnPointsIntoStep(diff.next, coordSys, step, connectNulls); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step, connectNulls); + } // Don't apply animation if diff is large. + // For better result and avoid memory explosion problems like + // https://github.com/apache/incubator-echarts/issues/12229 + + + if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) { + polyline.stopAnimation(); + polyline.setShape({ + points: next + }); + + if (polygon) { + polygon.stopAnimation(); + polygon.setShape({ + points: next, + stackedOnPoints: stackedOnNext + }); + } + + return; + } + + polyline.shape.__points = diff.current; + polyline.shape.points = current; + var target = { + shape: { + points: next + } + }; // Also animate the original points. + // If points reference is changed when turning into step line. + + if (diff.current !== current) { + target.shape.__points = diff.next; + } // Stop previous animation. + + + polyline.stopAnimation(); + updateProps(polyline, target, seriesModel); + + if (polygon) { + polygon.setShape({ + // Reuse the points with polyline. + points: current, + stackedOnPoints: stackedOnCurrent + }); + polygon.stopAnimation(); + updateProps(polygon, { + shape: { + stackedOnPoints: stackedOnNext + } + }, seriesModel); // If use attr directly in updateProps. + + if (polyline.shape.points !== polygon.shape.points) { + polygon.shape.points = polyline.shape.points; + } + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + polygon && polygon.dirtyShape(); + var points = polyline.shape.__points; + + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + var offset = updatedDataInfo[i].ptIdx * 2; + el.x = points[offset]; + el.y = points[offset + 1]; + el.markRedraw(); + } + }); + } + }; + + LineView.prototype.remove = function (ecModel) { + var group = this.group; + var oldData = this._data; + + this._lineGroup.removeAll(); + + this._symbolDraw.remove(true); // Remove temporary created elements when highlighting + + + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null; + }; + + LineView.type = 'line'; + return LineView; + }(ChartView); + + function pointsLayout(seriesType, forceStoreInTypedArray) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var pipelineContext = seriesModel.pipelineContext; + var useTypedArray = forceStoreInTypedArray || pipelineContext.large; + + if (!coordSys) { + return; + } + + var dims = map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0])) { + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1])) { + dims[1] = stackResultDim; + } + + var store = data.getStore(); + var dimIdx0 = data.getDimensionIndex(dims[0]); + var dimIdx1 = data.getDimensionIndex(dims[1]); + return dimLen && { + progress: function (params, data) { + var segCount = params.end - params.start; + var points = useTypedArray && createFloat32Array(segCount * dimLen); + var tmpIn = []; + var tmpOut = []; + + for (var i = params.start, offset = 0; i < params.end; i++) { + var point = void 0; + + if (dimLen === 1) { + var x = store.get(dimIdx0, i); // NOTE: Make sure the second parameter is null to use default strategy. + + point = coordSys.dataToPoint(x, null, tmpOut); + } else { + tmpIn[0] = store.get(dimIdx0, i); + tmpIn[1] = store.get(dimIdx1, i); // Let coordinate system to handle the NaN data. + + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + } + + if (useTypedArray) { + points[offset++] = point[0]; + points[offset++] = point[1]; + } else { + data.setItemLayout(i, point.slice()); + } + } + + useTypedArray && data.setLayout('points', points); + } + }; + } + }; + } + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } // Return NaN if count is 0 + + + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + + return sum; + }, + max: function (frame) { + var max = -Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } + }; + + var indexSampler = function (frame) { + return Math.round(frame.length / 2); + }; + + function dataSample(seriesType) { + return { + seriesType: seriesType, + // FIXME:TS never used, so comment it + // modifyOutputEnd: true, + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + var count = data.count(); // Only cartesian2d support down sampling. Disable it when there is few data. + + if (count > 10 && coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + var dpr = api.getDevicePixelRatio(); // Coordinste system has been resized + + var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); + var rate = Math.round(count / size); + + if (isFinite(rate) && rate > 1) { + if (sampling === 'lttb') { + seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } + + var sampler = void 0; + + if (isString(sampling)) { + sampler = samplers[sampling]; + } else if (isFunction(sampling)) { + sampler = sampling; + } + + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler)); + } + } + } + } + }; + } + + function install$2(registers) { + registers.registerChartView(LineView); + registers.registerSeriesModel(LineSeriesModel); + registers.registerLayout(pointsLayout('line', true)); + registers.registerVisual({ + seriesType: 'line', + reset: function (seriesModel) { + var data = seriesModel.getData(); // Visual coding for legend + + var lineStyle = seriesModel.getModel('lineStyle').getLineStyle(); + + if (lineStyle && !lineStyle.stroke) { + // Fill in visual should be palette color if + // has color callback + lineStyle.stroke = data.getVisual('style').fill; + } + + data.setVisual('legendLineStyle', lineStyle); + } + }); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line')); + } + + var BaseBarSeriesModel = + /** @class */ + function (_super) { + __extends(BaseBarSeriesModel, _super); + + function BaseBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BaseBarSeriesModel.type; + return _this; + } + + BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + BaseBarSeriesModel.prototype.getMarkerPosition = function (value, dims, startingAtTick) { + var coordSys = this.coordinateSystem; + + if (coordSys && coordSys.clampData) { + // PENDING if clamp ? + var clampData_1 = coordSys.clampData(value); + var pt_1 = coordSys.dataToPoint(clampData_1); + + if (startingAtTick) { + each(coordSys.getAxes(), function (axis, idx) { + // If axis type is category, use tick coords instead + if (axis.type === 'category' && dims != null) { + var tickCoords = axis.getTicksCoords(); + var targetTickId = clampData_1[idx]; // The index of rightmost tick of markArea is 1 larger than x1/y1 index + + var isEnd = dims[idx] === 'x1' || dims[idx] === 'y1'; + + if (isEnd) { + targetTickId += 1; + } // The only contains one tick, tickCoords is + // like [{coord: 0, tickValue: 0}, {coord: 0}] + // to the length should always be larger than 1 + + + if (tickCoords.length < 2) { + return; + } else if (tickCoords.length === 2) { + // The left value and right value of the axis are + // the same. coord is 0 in both items. Use the max + // value of the axis as the coord + pt_1[idx] = axis.toGlobalCoord(axis.getExtent()[isEnd ? 1 : 0]); + return; + } + + var leftCoord = void 0; + var coord = void 0; + var stepTickValue = 1; + + for (var i = 0; i < tickCoords.length; i++) { + var tickCoord = tickCoords[i].coord; // The last item of tickCoords doesn't contain + // tickValue + + var tickValue = i === tickCoords.length - 1 ? tickCoords[i - 1].tickValue + stepTickValue : tickCoords[i].tickValue; + + if (tickValue === targetTickId) { + coord = tickCoord; + break; + } else if (tickValue < targetTickId) { + leftCoord = tickCoord; + } else if (leftCoord != null && tickValue > targetTickId) { + coord = (tickCoord + leftCoord) / 2; + break; + } + + if (i === 1) { + // Here we assume the step of category axes is + // the same + stepTickValue = tickValue - tickCoords[0].tickValue; + } + } + + if (coord == null) { + if (!leftCoord) { + // targetTickId is smaller than all tick ids in the + // visible area, use the leftmost tick coord + coord = tickCoords[0].coord; + } else if (leftCoord) { + // targetTickId is larger than all tick ids in the + // visible area, use the rightmost tick coord + coord = tickCoords[tickCoords.length - 1].coord; + } + } + + pt_1[idx] = axis.toGlobalCoord(coord); + } + }); + } else { + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt_1[offsetIndex] += offset + size / 2; + } + + return pt_1; + } + + return [NaN, NaN]; + }; + + BaseBarSeriesModel.type = 'series.__base_bar__'; + BaseBarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + barMinHeight: 0, + barMinAngle: 0, + // cursor: null, + large: false, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: 'mod' + }; + return BaseBarSeriesModel; + }(SeriesModel); + + SeriesModel.registerClass(BaseBarSeriesModel); + + var BarSeriesModel = + /** @class */ + function (_super) { + __extends(BarSeriesModel, _super); + + function BarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BarSeriesModel.type; + return _this; + } + + BarSeriesModel.prototype.getInitialData = function () { + return createSeriesData(null, this, { + useEncodeDefaulter: true, + createInvertedIndices: !!this.get('realtimeSort', true) || null + }); + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressive = function () { + // Do not support progressive in normal mode. + return this.get('large') ? this.get('progressive') : false; + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressiveThreshold = function () { + // Do not support progressive in normal mode. + var progressiveThreshold = this.get('progressiveThreshold'); + var largeThreshold = this.get('largeThreshold'); + + if (largeThreshold > progressiveThreshold) { + progressiveThreshold = largeThreshold; + } + + return progressiveThreshold; + }; + + BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.rect(data.getItemLayout(dataIndex)); + }; + + BarSeriesModel.type = 'series.bar'; + BarSeriesModel.dependencies = ['grid', 'polar']; + BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + // If clipped + // Only available on cartesian2d + clip: true, + roundCap: false, + showBackground: false, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)', + borderColor: null, + borderWidth: 0, + borderType: 'solid', + borderRadius: 0, + shadowBlur: 0, + shadowColor: null, + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + realtimeSort: false + }); + return BarSeriesModel; + }(BaseBarSeriesModel); + + /** + * Sausage: similar to sector, but have half circle on both sides + */ + + var SausageShape = + /** @class */ + function () { + function SausageShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + + return SausageShape; + }(); + + var SausagePath = + /** @class */ + function (_super) { + __extends(SausagePath, _super); + + function SausagePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'sausage'; + return _this; + } + + SausagePath.prototype.getDefaultShape = function () { + return new SausageShape(); + }; + + SausagePath.prototype.buildPath = function (ctx, shape) { + var cx = shape.cx; + var cy = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var dr = (r - r0) * 0.5; + var rCenter = r0 + dr; + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var PI2 = Math.PI * 2; + var lessThanCircle = clockwise ? endAngle - startAngle < PI2 : startAngle - endAngle < PI2; + + if (!lessThanCircle) { + // Normalize angles + startAngle = endAngle - (clockwise ? PI2 : -PI2); + } + + var unitStartX = Math.cos(startAngle); + var unitStartY = Math.sin(startAngle); + var unitEndX = Math.cos(endAngle); + var unitEndY = Math.sin(endAngle); + + if (lessThanCircle) { + ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy); + ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise); + } else { + ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy); + } + + ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise); + ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise); + + if (r0 !== 0) { + ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise); + } // ctx.closePath(); + + }; + + return SausagePath; + }(Path); + + function createSectorCalculateTextPosition(positionMapping, opts) { + opts = opts || {}; + var isRoundCap = opts.isRoundCap; + return function (out, opts, boundingRect) { + var textPosition = opts.position; + + if (!textPosition || textPosition instanceof Array) { + return calculateTextPosition(out, opts, boundingRect); + } + + var mappedSectorPosition = positionMapping(textPosition); + var distance = opts.distance != null ? opts.distance : 5; + var sector = this.shape; + var cx = sector.cx; + var cy = sector.cy; + var r = sector.r; + var r0 = sector.r0; + var middleR = (r + r0) / 2; + var startAngle = sector.startAngle; + var endAngle = sector.endAngle; + var middleAngle = (startAngle + endAngle) / 2; + var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0; + var mathCos = Math.cos; + var mathSin = Math.sin; // base position: top-left + + var x = cx + r * mathCos(startAngle); + var y = cy + r * mathSin(startAngle); + var textAlign = 'left'; + var textVerticalAlign = 'top'; + + switch (mappedSectorPosition) { + case 'startArc': + x = cx + (r0 - distance) * mathCos(middleAngle); + y = cy + (r0 - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'insideStartArc': + x = cx + (r0 + distance) * mathCos(middleAngle); + y = cy + (r0 + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'startAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + case 'insideStartAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'middle': + x = cx + middleR * mathCos(middleAngle); + y = cy + middleR * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + + case 'endArc': + x = cx + (r + distance) * mathCos(middleAngle); + y = cy + (r + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'insideEndArc': + x = cx + (r - distance) * mathCos(middleAngle); + y = cy + (r - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'endAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'insideEndAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + default: + return calculateTextPosition(out, opts, boundingRect); + } + + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + }; + } + function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) { + if (isNumber(rotateType)) { + // user-set rotation + sector.setTextConfig({ + rotation: rotateType + }); + return; + } else if (isArray(textPosition)) { + // user-set position, use 0 as auto rotation + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var shape = sector.shape; + var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle; + var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle; + var middleAngle = (startAngle + endAngle) / 2; + var anchorAngle; + var mappedSectorPosition = positionMapping(textPosition); + + switch (mappedSectorPosition) { + case 'startArc': + case 'insideStartArc': + case 'middle': + case 'insideEndArc': + case 'endArc': + anchorAngle = middleAngle; + break; + + case 'startAngle': + case 'insideStartAngle': + anchorAngle = startAngle; + break; + + case 'endAngle': + case 'insideEndAngle': + anchorAngle = endAngle; + break; + + default: + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var rotate = Math.PI * 1.5 - anchorAngle; + /** + * TODO: labels with rotate > Math.PI / 2 should be rotate another + * half round flipped to increase readability. However, only middle + * position supports this for now, because in other positions, the + * anchor point is not at the center of the text, so the positions + * after rotating is not as expected. + */ + + if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) { + rotate -= Math.PI; + } + + sector.setTextConfig({ + rotation: rotate + }); + } + + function adjustAngleDistanceX(angle, distance, isEnd) { + return distance * Math.sin(angle) * (isEnd ? -1 : 1); + } + + function adjustAngleDistanceY(angle, distance, isEnd) { + return distance * Math.cos(angle) * (isEnd ? 1 : -1); + } + + function getSectorCornerRadius(model, shape, zeroIfNull) { + var cornerRadius = model.get('borderRadius'); + + if (cornerRadius == null) { + return zeroIfNull ? { + cornerRadius: 0 + } : null; + } + + if (!isArray(cornerRadius)) { + cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius]; + } + + var dr = Math.abs(shape.r || 0 - shape.r0 || 0); + return { + cornerRadius: map(cornerRadius, function (cr) { + return parsePercent(cr, dr); + }) + }; + } + + var mathMax$6 = Math.max; + var mathMin$6 = Math.min; + + function getClipArea(coord, data) { + var coordSysClipArea = coord.getArea && coord.getArea(); + + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var baseAxis = coord.getBaseAxis(); // When boundaryGap is false or using time axis. bar may exceed the grid. + // We should not clip this part. + // See test/bar2.html + + if (baseAxis.type !== 'category' || !baseAxis.onBand) { + var expandWidth = data.getLayout('bandWidth'); + + if (baseAxis.isHorizontal()) { + coordSysClipArea.x -= expandWidth; + coordSysClipArea.width += expandWidth * 2; + } else { + coordSysClipArea.y -= expandWidth; + coordSysClipArea.height += expandWidth * 2; + } + } + } + + return coordSysClipArea; + } + + var BarView = + /** @class */ + function (_super) { + __extends(BarView, _super); + + function BarView() { + var _this = _super.call(this) || this; + + _this.type = BarView.type; + _this._isFirstFrame = true; + return _this; + } + + BarView.prototype.render = function (seriesModel, ecModel, api, payload) { + this._model = seriesModel; + + this._removeOnRenderedListener(api); + + this._updateDrawMode(seriesModel); + + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload); + } else if ("development" !== 'production') { + warn('Only cartesian2d and polar supported for bar.'); + } + }; + + BarView.prototype.incrementalPrepareRender = function (seriesModel) { + this._clear(); + + this._updateDrawMode(seriesModel); // incremental also need to clip, otherwise might be overlow. + // But must not set clip in each frame, otherwise all of the children will be marked redraw. + + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype.incrementalRender = function (params, seriesModel) { + // Reset + this._progressiveEls = []; // Do not support progressive in normal mode. + + this._incrementalRenderLarge(params, seriesModel); + }; + + BarView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + BarView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var coord = seriesModel.coordinateSystem; + var baseAxis = coord.getBaseAxis(); + var isHorizontalOrRadial; + + if (coord.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + } else if (coord.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + } + + var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; + var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord); + + if (realtimeSortCfg) { + this._enableRealtimeSort(realtimeSortCfg, data, api); + } + + var needsClip = seriesModel.get('clip', true) || realtimeSortCfg; + var coordSysClipArea = getClipArea(coord, data); // If there is clipPath created in large mode. Remove it. + + group.removeClipPath(); // We don't use clipPath in normal mode because we needs a perfect animation + // And don't want the label are clipped. + + var roundCap = seriesModel.get('roundCap', true); + var drawBackground = seriesModel.get('showBackground', true); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var barBorderRadius = backgroundModel.get('borderRadius') || 0; + var bgEls = []; + var oldBgEls = this._backgroundEls; + var isInitSort = payload && payload.isInitSort; + var isChangeOrder = payload && payload.type === 'changeAxisOrder'; + + function createBackground(dataIndex) { + var bgLayout = getLayout[coord.type](data, dataIndex); + var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout); + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } else { + bgEl.setShape('cornerRadius', barBorderRadius); + } + + bgEls[dataIndex] = bgEl; + return bgEl; + } + data.diff(oldData).add(function (dataIndex) { + var itemModel = data.getItemModel(dataIndex); + var layout = getLayout[coord.type](data, dataIndex, itemModel); + + if (drawBackground) { + createBackground(dataIndex); + } // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in "axisProxy". + + + if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout)) { + return; + } + + var isClipped = false; + + if (needsClip) { + // Clip will modify the layout params. + // And return a boolean to determine if the shape are fully clipped. + isClipped = clip[coord.type](coordSysClipArea, layout); + } + + var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap); + + if (realtimeSortCfg) { + /** + * Force label animation because even if the element is + * ignored because it's clipped, it may not be clipped after + * changing order. Then, if not using forceLabelAnimation, + * the label animation was never started, in which case, + * the label will be the final value and doesn't have label + * animation. + */ + el.forceLabelAnimation = true; + } + + updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false); + } else { + initProps(el, { + shape: layout + }, seriesModel, dataIndex); + } + + data.setItemGraphicEl(dataIndex, el); + group.add(el); + el.ignore = isClipped; + }).update(function (newIndex, oldIndex) { + var itemModel = data.getItemModel(newIndex); + var layout = getLayout[coord.type](data, newIndex, itemModel); + + if (drawBackground) { + var bgEl = void 0; + + if (oldBgEls.length === 0) { + bgEl = createBackground(oldIndex); + } else { + bgEl = oldBgEls[oldIndex]; + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } else { + bgEl.setShape('cornerRadius', barBorderRadius); + } + + bgEls[newIndex] = bgEl; + } + + var bgLayout = getLayout[coord.type](data, newIndex); + var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord); + updateProps(bgEl, { + shape: shape + }, animationModel, newIndex); + } + + var el = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout)) { + group.remove(el); + return; + } + + var isClipped = false; + + if (needsClip) { + isClipped = clip[coord.type](coordSysClipArea, layout); + + if (isClipped) { + group.remove(el); + } + } + + if (!el) { + el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap); + } else { + saveOldStyle(el); + } + + if (realtimeSortCfg) { + el.forceLabelAnimation = true; + } + + if (isChangeOrder) { + var textEl = el.getTextContent(); + + if (textEl) { + var labelInnerStore = labelInner(textEl); + + if (labelInnerStore.prevValue != null) { + /** + * Set preValue to be value so that no new label + * should be started, otherwise, it will take a full + * `animationDurationUpdate` time to finish the + * animation, which is not expected. + */ + labelInnerStore.prevValue = labelInnerStore.value; + } + } + } // Not change anything if only order changed. + // Especially not change label. + else { + updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + } + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder); + } else { + updateProps(el, { + shape: layout + }, seriesModel, newIndex, null); + } + + data.setItemGraphicEl(newIndex, el); + el.ignore = isClipped; + group.add(el); + }).remove(function (dataIndex) { + var el = oldData.getItemGraphicEl(dataIndex); + el && removeElementWithFadeOut(el, seriesModel, dataIndex); + }).execute(); + var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group()); + bgGroup.removeAll(); + + for (var i = 0; i < bgEls.length; ++i) { + bgGroup.add(bgEls[i]); + } + + group.add(bgGroup); + this._backgroundEls = bgEls; + this._data = data; + }; + + BarView.prototype._renderLarge = function (seriesModel, ecModel, api) { + this._clear(); + + createLarge(seriesModel, this.group); + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype._incrementalRenderLarge = function (params, seriesModel) { + this._removeBackground(); + + createLarge(seriesModel, this.group, this._progressiveEls, true); + }; + + BarView.prototype._updateLargeClip = function (seriesModel) { + // Use clipPath in large mode. + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + var group = this.group; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + }; + + BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) { + var _this = this; // If no data in the first frame, wait for data to initSort + + + if (!data.count()) { + return; + } + + var baseAxis = realtimeSortCfg.baseAxis; + + if (this._isFirstFrame) { + this._dispatchInitSort(data, realtimeSortCfg, api); + + this._isFirstFrame = false; + } else { + var orderMapping_1 = function (idx) { + var el = data.getItemGraphicEl(idx); + var shape = el && el.shape; + return shape && // The result should be consistent with the initial sort by data value. + // Do not support the case that both positive and negative exist. + Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width) // If data is NaN, shape.xxx may be NaN, so use || 0 here in case + || 0; + }; + + this._onRendered = function () { + _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api); + }; + + api.getZr().on('rendered', this._onRendered); + } + }; + + BarView.prototype._dataSort = function (data, baseAxis, orderMapping) { + var info = []; + data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) { + var mappedValue = orderMapping(dataIdx); + mappedValue = mappedValue == null ? NaN : mappedValue; + info.push({ + dataIndex: dataIdx, + mappedValue: mappedValue, + ordinalNumber: ordinalNumber + }); + }); + info.sort(function (a, b) { + // If NaN, it will be treated as min val. + return b.mappedValue - a.mappedValue; + }); + return { + ordinalNumbers: map(info, function (item) { + return item.ordinalNumber; + }) + }; + }; + + BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) { + var scale = baseAxis.scale; + var ordinalDataDim = data.mapDimension(baseAxis.dim); + var lastValue = Number.MAX_VALUE; + + for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) { + var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum)); + var value = rawIdx < 0 // If some tick have no bar, the tick will be treated as min. + ? Number.MIN_VALUE // PENDING: if dataZoom on baseAxis exits, is it a performance issue? + : orderMapping(data.indexOfRawIndex(rawIdx)); + + if (value > lastValue) { + return true; + } + + lastValue = value; + } + + return false; + }; + /* + * Consider the case when A and B changed order, whose representing + * bars are both out of sight, we don't wish to trigger reorder action + * as long as the order in the view doesn't change. + */ + + + BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) { + var scale = baseAxis.scale; + var extent = scale.getExtent(); + var tickNum = Math.max(0, extent[0]); + var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1); + + for (; tickNum <= tickMax; ++tickNum) { + if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) { + return true; + } + } + }; + + BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) { + if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) { + return; + } + + var sortInfo = this._dataSort(data, baseAxis, orderMapping); + + if (this._isOrderDifferentInView(sortInfo, baseAxis)) { + this._removeOnRenderedListener(api); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + axisId: baseAxis.index, + sortInfo: sortInfo + }); + } + }; + + BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) { + var baseAxis = realtimeSortCfg.baseAxis; + + var sortResult = this._dataSort(data, baseAxis, function (dataIdx) { + return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx); + }); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + isInitSort: true, + axisId: baseAxis.index, + sortInfo: sortResult + }); + }; + + BarView.prototype.remove = function (ecModel, api) { + this._clear(this._model); + + this._removeOnRenderedListener(api); + }; + + BarView.prototype.dispose = function (ecModel, api) { + this._removeOnRenderedListener(api); + }; + + BarView.prototype._removeOnRenderedListener = function (api) { + if (this._onRendered) { + api.getZr().off('rendered', this._onRendered); + this._onRendered = null; + } + }; + + BarView.prototype._clear = function (model) { + var group = this.group; + var data = this._data; + + if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) { + this._removeBackground(); + + this._backgroundEls = []; + data.eachItemGraphicEl(function (el) { + removeElementWithFadeOut(el, model, getECData(el).dataIndex); + }); + } else { + group.removeAll(); + } + + this._data = null; + this._isFirstFrame = true; + }; + + BarView.prototype._removeBackground = function () { + this.group.remove(this._backgroundGroup); + this._backgroundGroup = null; + }; + + BarView.type = 'bar'; + return BarView; + }(ChartView); + + var clip = { + cartesian2d: function (coordSysBoundingRect, layout) { + var signWidth = layout.width < 0 ? -1 : 1; + var signHeight = layout.height < 0 ? -1 : 1; // Needs positive width and height + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width; + var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height; + var x = mathMax$6(layout.x, coordSysBoundingRect.x); + var x2 = mathMin$6(layout.x + layout.width, coordSysX2); + var y = mathMax$6(layout.y, coordSysBoundingRect.y); + var y2 = mathMin$6(layout.y + layout.height, coordSysY2); + var xClipped = x2 < x; + var yClipped = y2 < y; // When xClipped or yClipped, the element will be marked as `ignore`. + // But we should also place the element at the edge of the coord sys bounding rect. + // Because if data changed and the bar shows again, its transition animation + // will begin at this place. + + layout.x = xClipped && x > coordSysX2 ? x2 : x; + layout.y = yClipped && y > coordSysY2 ? y2 : y; + layout.width = xClipped ? 0 : x2 - x; + layout.height = yClipped ? 0 : y2 - y; // Reverse back + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + return xClipped || yClipped; + }, + polar: function (coordSysClipArea, layout) { + var signR = layout.r0 <= layout.r ? 1 : -1; // Make sure r is larger than r0 + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + var r = mathMin$6(layout.r, coordSysClipArea.r); + var r0 = mathMax$6(layout.r0, coordSysClipArea.r0); + layout.r = r; + layout.r0 = r0; + var clipped = r - r0 < 0; // Reverse back + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + return clipped; + } + }; + var elementCreator = { + cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) { + var rect = new Rect({ + shape: extend({}, layout), + z2: 1 + }); + rect.__dataIndex = newIndex; + rect.name = 'item'; + + if (animationModel) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + rectShape[animateProperty] = 0; + } + + return rect; + }, + polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) { + var ShapeClass = !isRadial && roundCap ? SausagePath : Sector; + var sector = new ShapeClass({ + shape: layout, + z2: 1 + }); + sector.name = 'item'; + var positionMap = createPolarPositionMapping(isRadial); + sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, { + isRoundCap: ShapeClass === SausagePath + }); // Animation + + if (animationModel) { + var sectorShape = sector.shape; + var animateProperty = isRadial ? 'r' : 'endAngle'; + var animateTarget = {}; + sectorShape[animateProperty] = isRadial ? layout.r0 : layout.startAngle; + animateTarget[animateProperty] = layout[animateProperty]; + (isUpdate ? updateProps : initProps)(sector, { + shape: animateTarget // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue + + }, animationModel); + } + + return sector; + } + }; + + function shouldRealtimeSort(seriesModel, coordSys) { + var realtimeSortOption = seriesModel.get('realtimeSort', true); + var baseAxis = coordSys.getBaseAxis(); + + if ("development" !== 'production') { + if (realtimeSortOption) { + if (baseAxis.type !== 'category') { + warn('`realtimeSort` will not work because this bar series is not based on a category axis.'); + } + + if (coordSys.type !== 'cartesian2d') { + warn('`realtimeSort` will not work because this bar series is not on cartesian2d.'); + } + } + } + + if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') { + return { + baseAxis: baseAxis, + otherAxis: coordSys.getOtherAxis(baseAxis) + }; + } + } + + function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) { + var seriesTarget; + var axisTarget; + + if (isHorizontal) { + axisTarget = { + x: layout.x, + width: layout.width + }; + seriesTarget = { + y: layout.y, + height: layout.height + }; + } else { + axisTarget = { + y: layout.y, + height: layout.height + }; + seriesTarget = { + x: layout.x, + width: layout.width + }; + } + + if (!isChangeOrder) { + // Keep the original growth animation if only axis order changed. + // Not start a new animation. + (isUpdate ? updateProps : initProps)(el, { + shape: seriesTarget + }, seriesAnimationModel, newIndex, null); + } + + var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null; + (isUpdate ? updateProps : initProps)(el, { + shape: axisTarget + }, axisAnimationModel, newIndex); + } + + function checkPropertiesNotValid(obj, props) { + for (var i = 0; i < props.length; i++) { + if (!isFinite(obj[props[i]])) { + return true; + } + } + + return false; + } + + var rectPropties = ['x', 'y', 'width', 'height']; + var polarPropties = ['cx', 'cy', 'r', 'startAngle', 'endAngle']; + var isValidLayout = { + cartesian2d: function (layout) { + return !checkPropertiesNotValid(layout, rectPropties); + }, + polar: function (layout) { + return !checkPropertiesNotValid(layout, polarPropties); + } + }; + var getLayout = { + // itemModel is only used to get borderWidth, which is not needed + // when calculating bar background layout. + cartesian2d: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0; // fix layout with lineWidth + + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + return { + x: layout.x + signX * fixedLineWidth / 2, + y: layout.y + signY * fixedLineWidth / 2, + width: layout.width - signX * fixedLineWidth, + height: layout.height - signY * fixedLineWidth + }; + }, + polar: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + return { + cx: layout.cx, + cy: layout.cy, + r0: layout.r0, + r: layout.r, + startAngle: layout.startAngle, + endAngle: layout.endAngle, + clockwise: layout.clockwise + }; + } + }; + + function isZeroOnPolar(layout) { + return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle; + } + + function createPolarPositionMapping(isRadial) { + return function (isRadial) { + var arcOrAngle = isRadial ? 'Arc' : 'Angle'; + return function (position) { + switch (position) { + case 'start': + case 'insideStart': + case 'end': + case 'insideEnd': + return position + arcOrAngle; + + default: + return position; + } + }; + }(isRadial); + } + + function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, isPolar) { + var style = data.getItemVisual(dataIndex, 'style'); + + if (!isPolar) { + var borderRadius = itemModel.get(['itemStyle', 'borderRadius']) || 0; + el.setShape('r', borderRadius); + } else if (!seriesModel.get('roundCap')) { + var sectorShape = el.shape; + var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true); + extend(sectorShape, cornerRadius); + el.setShape(sectorShape); + } + + el.useStyle(style); + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && el.attr('cursor', cursorStyle); + var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout.r >= layout.r0 ? 'endArc' : 'startArc' : layout.endAngle >= layout.startAngle ? 'endAngle' : 'startAngle' : isHorizontalOrRadial ? layout.height >= 0 ? 'bottom' : 'top' : layout.width >= 0 ? 'right' : 'left'; + var labelStatesModels = getLabelStatesModels(itemModel); + setLabelStyle(el, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), + inheritColor: style.fill, + defaultOpacity: style.opacity, + defaultOutsidePosition: labelPositionOutside + }); + var label = el.getTextContent(); + + if (isPolar && label) { + var position = itemModel.get(['label', 'position']); + el.textConfig.inside = position === 'middle' ? true : null; + setSectorTextRotation(el, position === 'outside' ? labelPositionOutside : position, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(['label', 'rotate'])); + } + + setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) { + return getDefaultInterpolatedLabel(data, value); + }); + var emphasisModel = itemModel.getModel(['emphasis']); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + setStatesStylesFromModel(el, itemModel); + + if (isZeroOnPolar(layout)) { + el.style.fill = 'none'; + el.style.stroke = 'none'; + each(el.states, function (state) { + if (state.style) { + state.style.fill = state.style.stroke = 'none'; + } + }); + } + } // In case width or height are too small. + + + function getLineWidth(itemModel, rawLayout) { + // Has no border. + var borderColor = itemModel.get(['itemStyle', 'borderColor']); + + if (!borderColor || borderColor === 'none') { + return 0; + } + + var lineWidth = itemModel.get(['itemStyle', 'borderWidth']) || 0; // width or height may be NaN for empty data + + var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width); + var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height); + return Math.min(lineWidth, width, height); + } + + var LagePathShape = + /** @class */ + function () { + function LagePathShape() {} + + return LagePathShape; + }(); + + var LargePath = + /** @class */ + function (_super) { + __extends(LargePath, _super); + + function LargePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeBar'; + return _this; + } + + LargePath.prototype.getDefaultShape = function () { + return new LagePathShape(); + }; + + LargePath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + var baseDimIdx = this.baseDimIdx; + var valueDimIdx = 1 - this.baseDimIdx; + var startPoint = []; + var size = []; + var barWidth = this.barWidth; + + for (var i = 0; i < points.length; i += 3) { + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[i + 2]; + startPoint[baseDimIdx] = points[i + baseDimIdx]; + startPoint[valueDimIdx] = points[i + valueDimIdx]; + ctx.rect(startPoint[0], startPoint[1], size[0], size[1]); + } + }; + + return LargePath; + }(Path); + + function createLarge(seriesModel, group, progressiveEls, incremental) { + // TODO support polar + var data = seriesModel.getData(); + var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0; + var largeDataIndices = data.getLayout('largeDataIndices'); + var barWidth = data.getLayout('size'); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var bgPoints = data.getLayout('largeBackgroundPoints'); + + if (bgPoints) { + var bgEl = new LargePath({ + shape: { + points: bgPoints + }, + incremental: !!incremental, + silent: true, + z2: 0 + }); + bgEl.baseDimIdx = baseDimIdx; + bgEl.largeDataIndices = largeDataIndices; + bgEl.barWidth = barWidth; + bgEl.useStyle(backgroundModel.getItemStyle()); + group.add(bgEl); + progressiveEls && progressiveEls.push(bgEl); + } + + var el = new LargePath({ + shape: { + points: data.getLayout('largePoints') + }, + incremental: !!incremental, + ignoreCoarsePointer: true, + z2: 1 + }); + el.baseDimIdx = baseDimIdx; + el.largeDataIndices = largeDataIndices; + el.barWidth = barWidth; + group.add(el); + el.useStyle(data.getVisual('style')); // Enable tooltip and user mouse/touch event handlers. + + getECData(el).seriesIndex = seriesModel.seriesIndex; + + if (!seriesModel.get('silent')) { + el.on('mousedown', largePathUpdateDataIndex); + el.on('mousemove', largePathUpdateDataIndex); + } + + progressiveEls && progressiveEls.push(el); + } // Use throttle to avoid frequently traverse to find dataIndex. + + + var largePathUpdateDataIndex = throttle(function (event) { + var largePath = this; + var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY); + getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null; + }, 30, false); + + function largePathFindDataIndex(largePath, x, y) { + var baseDimIdx = largePath.baseDimIdx; + var valueDimIdx = 1 - baseDimIdx; + var points = largePath.shape.points; + var largeDataIndices = largePath.largeDataIndices; + var startPoint = []; + var size = []; + var barWidth = largePath.barWidth; + + for (var i = 0, len = points.length / 3; i < len; i++) { + var ii = i * 3; + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[ii + 2]; + startPoint[baseDimIdx] = points[ii + baseDimIdx]; + startPoint[valueDimIdx] = points[ii + valueDimIdx]; + + if (size[valueDimIdx] < 0) { + startPoint[valueDimIdx] += size[valueDimIdx]; + size[valueDimIdx] = -size[valueDimIdx]; + } + + if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) { + return largeDataIndices[i]; + } + } + + return -1; + } + + function createBackgroundShape(isHorizontalOrRadial, layout, coord) { + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var rectShape = layout; + var coordLayout = coord.getArea(); + return { + x: isHorizontalOrRadial ? rectShape.x : coordLayout.x, + y: isHorizontalOrRadial ? coordLayout.y : rectShape.y, + width: isHorizontalOrRadial ? rectShape.width : coordLayout.width, + height: isHorizontalOrRadial ? coordLayout.height : rectShape.height + }; + } else { + var coordLayout = coord.getArea(); + var sectorShape = layout; + return { + cx: coordLayout.cx, + cy: coordLayout.cy, + r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0, + r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r, + startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0, + endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2 + }; + } + } + + function createBackgroundEl(coord, isHorizontalOrRadial, layout) { + var ElementClz = coord.type === 'polar' ? Sector : Rect; + return new ElementClz({ + shape: createBackgroundShape(isHorizontalOrRadial, layout, coord), + silent: true, + z2: 0 + }); + } + + function install$3(registers) { + registers.registerChartView(BarView); + registers.registerSeriesModel(BarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'bar')); // Do layout after other overall layout, which can prepare some information. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar')); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar')); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'changeAxisOrder', + event: 'changeAxisOrder', + update: 'update' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + if (payload.sortInfo) { + componentModel.axis.setCategorySortInfo(payload.sortInfo); + } + }); + }); + } + + var PI2$8 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + function getViewRect(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getBasicPieLayout(seriesModel, api) { + var viewRect = getViewRect(seriesModel, api); // center can be string or number when coordinateSystem is specified + + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + var width = parsePercent$1(viewRect.width, api.getWidth()); + var height = parsePercent$1(viewRect.height, api.getHeight()); + var size = Math.min(width, height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var cx; + var cy; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys) { + // percentage is not allowed when coordinate system is specified + var point = coordSys.dataToPoint(center); + cx = point[0] || 0; + cy = point[1] || 0; + } else { + if (!isArray(center)) { + center = [center, center]; + } + + cx = parsePercent$1(center[0], width) + viewRect.x; + cy = parsePercent$1(center[1], height) + viewRect.y; + } + + return { + cx: cx, + cy: cy, + r0: r0, + r: r + }; + } + function pieLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var viewRect = getViewRect(seriesModel, api); + + var _a = getBasicPieLayout(seriesModel, api), + cx = _a.cx, + cy = _a.cy, + r = _a.r, + r0 = _a.r0; + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + var minAngle = seriesModel.get('minAngle') * RADIAN; + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + var sum = data.getSum(valueDim); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var clockwise = seriesModel.get('clockwise'); + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max] + + var extent = data.getDataExtent(valueDim); + extent[0] = 0; // In the case some sector angle is smaller than minAngle + + var restAngle = PI2$8; + var valueSumLargerThanMinAngle = 0; + var currentAngle = startAngle; + var dir = clockwise ? 1 : -1; + data.setLayout({ + viewRect: viewRect, + r: r + }); + data.each(valueDim, function (value, idx) { + var angle; + + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? NaN : r + }); + return; + } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + + + if (roseType !== 'area') { + angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + } else { + angle = PI2$8 / validDataCount; + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? linearMap(value, extent, [r0, r]) : r + }); + currentAngle = endAngle; + }); // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + + if (restAngle < PI2$8 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle_1 = PI2$8 / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_1 = data.getItemLayout(idx); + layout_1.angle = angle_1; + layout_1.startAngle = startAngle + dir * idx * angle_1; + layout_1.endAngle = startAngle + dir * (idx + 1) * angle_1; + } + }); + } else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_2 = data.getItemLayout(idx); + var angle = layout_2.angle === minAngle ? minAngle : value * unitRadian; + layout_2.startAngle = currentAngle; + layout_2.endAngle = currentAngle + dir * angle; + currentAngle += dir * angle; + } + }); + } + } + }); + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function dataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); // If in any legend component the status is not selected. + + for (var i = 0; i < legendModels.length; i++) { + // @ts-ignore FIXME: LegendModel + if (!legendModels[i].isSelected(name)) { + return false; + } + } + + return true; + }); + } + }; + } + + var RADIAN$1 = Math.PI / 180; + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { + if (list.length < 2) { + return; + } + + function recalculateXOnSemiToAlignOnEllipseCurve(semi) { + var rB = semi.rB; + var rB2 = rB * rB; + + for (var i = 0; i < semi.list.length; i++) { + var item = semi.list[i]; + var dy = Math.abs(item.label.y - cy); // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; + var rA2 = rA * rA; // Use ellipse implicit function to calculate x + + var dx = Math.sqrt((1 - Math.abs(dy * dy / rB2)) * rA2); + var newX = cx + (dx + item.len2) * dir; + var deltaX = newX - item.label.x; + var newTargetWidth = item.targetTextWidth - deltaX * dir; // text x is changed, so need to recalculate width. + + constrainTextWidth(item, newTargetWidth, true); + item.label.x = newX; + } + } // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve. + + + function recalculateX(items) { + // Extremes of + var topSemi = { + list: [], + maxY: 0 + }; + var bottomSemi = { + list: [], + maxY: 0 + }; + + for (var i = 0; i < items.length; i++) { + if (items[i].labelAlignTo !== 'none') { + continue; + } + + var item = items[i]; + var semi = item.label.y > cy ? bottomSemi : topSemi; + var dy = Math.abs(item.label.y - cy); + + if (dy >= semi.maxY) { + var dx = item.label.x - cx - item.len2 * dir; // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; // Canculate rB based on the topest / bottemest label. + + var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA; + semi.rB = rB; + semi.maxY = dy; + } + + semi.list.push(item); + } + + recalculateXOnSemiToAlignOnEllipseCurve(topSemi); + recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); + } + + var len = list.length; + + for (var i = 0; i < len; i++) { + if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') { + var dx = list[i].label.x - farthestX; + list[i].linePoints[1][0] += dx; + list[i].label.x = farthestX; + } + } + + if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { + recalculateX(list); + } + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { + var leftList = []; + var rightList = []; + var leftmostX = Number.MAX_VALUE; + var rightmostX = -Number.MAX_VALUE; + + for (var i = 0; i < labelLayoutList.length; i++) { + var label = labelLayoutList[i].label; + + if (isPositionCenter(labelLayoutList[i])) { + continue; + } + + if (label.x < cx) { + leftmostX = Math.min(leftmostX, label.x); + leftList.push(labelLayoutList[i]); + } else { + rightmostX = Math.max(rightmostX, label.x); + rightList.push(labelLayoutList[i]); + } + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + if (layout.labelStyleWidth != null) { + continue; + } + + var label = layout.label; + var linePoints = layout.linePoints; + var targetTextWidth = void 0; + + if (layout.labelAlignTo === 'edge') { + if (label.x < cx) { + targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance; + } else { + targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance; + } + } else if (layout.labelAlignTo === 'labelLine') { + if (label.x < cx) { + targetTextWidth = leftmostX - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin; + } + } else { + if (label.x < cx) { + targetTextWidth = label.x - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin; + } + } + + layout.targetTextWidth = targetTextWidth; + constrainTextWidth(layout, targetTextWidth); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + var label = layout.label; + var linePoints = layout.linePoints; + var isAlignToEdge = layout.labelAlignTo === 'edge'; + var padding = label.style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; // textRect.width already contains paddingH if bgColor is set + + var extraPaddingH = label.style.backgroundColor ? 0 : paddingH; + var realTextWidth = layout.rect.width + extraPaddingH; + var dist = linePoints[1][0] - linePoints[2][0]; + + if (isAlignToEdge) { + if (label.x < cx) { + linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance; + } else { + linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance; + } + } else { + if (label.x < cx) { + linePoints[2][0] = label.x + layout.labelDistance; + } else { + linePoints[2][0] = label.x - layout.labelDistance; + } + + linePoints[1][0] = linePoints[2][0] + dist; + } + + linePoints[1][1] = linePoints[2][1] = label.y; + } + } + } + /** + * Set max width of each label, and then wrap each label to the max width. + * + * @param layout label layout + * @param availableWidth max width for the label to display + * @param forceRecalculate recaculate the text layout even if the current width + * is smaller than `availableWidth`. This is useful when the text was previously + * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in + * which case, previous wrapping should be redo. + */ + + + function constrainTextWidth(layout, availableWidth, forceRecalculate) { + if (forceRecalculate === void 0) { + forceRecalculate = false; + } + + if (layout.labelStyleWidth != null) { + // User-defined style.width has the highest priority. + return; + } + + var label = layout.label; + var style = label.style; + var textRect = layout.rect; + var bgColor = style.backgroundColor; + var padding = style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; + var overflow = style.overflow; // textRect.width already contains paddingH if bgColor is set + + var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH); + + if (availableWidth < oldOuterWidth || forceRecalculate) { + var oldHeight = textRect.height; + + if (overflow && overflow.match('break')) { + // Temporarily set background to be null to calculate + // the bounding box without background. + label.setStyle('backgroundColor', null); // Set constraining width + + label.setStyle('width', availableWidth - paddingH); // This is the real bounding box of the text without padding. + + var innerRect = label.getBoundingRect(); + label.setStyle('width', Math.ceil(innerRect.width)); + label.setStyle('backgroundColor', bgColor); + } else { + var availableInnerWidth = availableWidth - paddingH; + var newWidth = availableWidth < oldOuterWidth // Current text is too wide, use `availableWidth` as max width. + ? availableInnerWidth : // Current available width is enough, but the text may have + // already been wrapped with a smaller available width. + forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth // Current available is larger than text width, + // so don't constrain width (otherwise it may have + // empty space in the background). + ? null // Current available is smaller than text width, so + // use the current available width as constraining + // width. + : availableInnerWidth : // Current available width is enough, so no need to + // constrain. + null; + label.setStyle('width', newWidth); + } + + var newRect = label.getBoundingRect(); + textRect.width = newRect.width; + var margin = (label.style.margin || 0) + 2.1; + textRect.height = newRect.height + margin; + textRect.y -= (textRect.height - oldHeight) / 2; + } + } + + function isPositionCenter(sectorShape) { + // Not change x for center label + return sectorShape.position === 'center'; + } + + function pieLabelLayout(seriesModel) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN$1; + var viewRect = data.getLayout('viewRect'); + var r = data.getLayout('r'); + var viewWidth = viewRect.width; + var viewLeft = viewRect.x; + var viewTop = viewRect.y; + var viewHeight = viewRect.height; + + function setNotShow(el) { + el.ignore = true; + } + + function isLabelShown(label) { + if (!label.ignore) { + return true; + } + + for (var key in label.states) { + if (label.states[key].ignore === false) { + return true; + } + } + + return false; + } + + data.each(function (idx) { + var sector = data.getItemGraphicEl(idx); + var sectorShape = sector.shape; + var label = sector.getTextContent(); + var labelLine = sector.getTextGuideLine(); + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis + + var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']); + var labelDistance = labelModel.get('distanceToLabelLine'); + var labelAlignTo = labelModel.get('alignTo'); + var edgeDistance = parsePercent$1(labelModel.get('edgeDistance'), viewWidth); + var bleedMargin = labelModel.get('bleedMargin'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + labelLineLen = parsePercent$1(labelLineLen, viewWidth); + var labelLineLen2 = labelLineModel.get('length2'); + labelLineLen2 = parsePercent$1(labelLineLen2, viewWidth); + + if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { + each(label.states, setNotShow); + label.ignore = true; + + if (labelLine) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } + + return; + } + + if (!isLabelShown(label)) { + return; + } + + var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; + var nx = Math.cos(midAngle); + var ny = Math.sin(midAngle); + var textX; + var textY; + var linePoints; + var textAlign; + cx = sectorShape.cx; + cy = sectorShape.cy; + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + + if (labelPosition === 'center') { + textX = sectorShape.cx; + textY = sectorShape.cy; + textAlign = 'center'; + } else { + var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; + var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; + textX = x1 + nx * 3; + textY = y1 + ny * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); + var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); + var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; + var y3 = y2; + + if (labelAlignTo === 'edge') { + // Adjust textX because text align of edge is opposite + textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; + } else { + textX = x3 + (nx < 0 ? -labelDistance : labelDistance); + } + + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right'; + } + + var PI = Math.PI; + var labelRotate = 0; + var rotate = labelModel.get('rotate'); + + if (isNumber(rotate)) { + labelRotate = rotate * (PI / 180); + } else if (labelPosition === 'center') { + labelRotate = 0; + } else if (rotate === 'radial' || rotate === true) { + var radialAngle = nx < 0 ? -midAngle + PI : -midAngle; + labelRotate = radialAngle; + } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') { + var rad = Math.atan2(nx, ny); + + if (rad < 0) { + rad = PI * 2 + rad; + } + + var isDown = ny > 0; + + if (isDown) { + rad = PI + rad; + } + + labelRotate = rad - PI; + } + + hasLabelRotate = !!labelRotate; + label.x = textX; + label.y = textY; + label.rotation = labelRotate; + label.setStyle({ + verticalAlign: 'middle' + }); // Not sectorShape the inside label + + if (!isLabelInside) { + var textRect = label.getBoundingRect().clone(); + textRect.applyTransform(label.getComputedTransform()); // Text has a default 1px stroke. Exclude this. + + var margin = (label.style.margin || 0) + 2.1; + textRect.y -= margin / 2; + textRect.height += margin; + labelLayoutList.push({ + label: label, + labelLine: labelLine, + position: labelPosition, + len: labelLineLen, + len2: labelLineLen2, + minTurnAngle: labelLineModel.get('minTurnAngle'), + maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'), + surfaceNormal: new Point(nx, ny), + linePoints: linePoints, + textAlign: textAlign, + labelDistance: labelDistance, + labelAlignTo: labelAlignTo, + edgeDistance: edgeDistance, + bleedMargin: bleedMargin, + rect: textRect, + unconstrainedWidth: textRect.width, + labelStyleWidth: label.style.width + }); + } else { + label.setStyle({ + align: textAlign + }); + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + sector.setTextConfig({ + inside: isLabelInside + }); + }); + + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + var labelLine = layout.labelLine; + var notShowLabel = isNaN(label.x) || isNaN(label.y); + + if (label) { + label.setStyle({ + align: layout.textAlign + }); + + if (notShowLabel) { + each(label.states, setNotShow); + label.ignore = true; + } + + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + if (labelLine) { + var linePoints = layout.linePoints; + + if (notShowLabel || !linePoints) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } else { + limitTurnAngle(linePoints, layout.minTurnAngle); + limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle); + labelLine.setShape({ + points: linePoints + }); // Set the anchor to the midpoint of sector + + label.__hostTarget.textGuideLineConfig = { + anchor: new Point(linePoints[0][0], linePoints[0][1]) + }; + } + } + } + } + + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var PiePiece = + /** @class */ + function (_super) { + __extends(PiePiece, _super); + + function PiePiece(data, idx, startAngle) { + var _this = _super.call(this) || this; + + _this.z2 = 2; + var text = new ZRText(); + + _this.setTextContent(text); + + _this.updateData(data, idx, startAngle, true); + + return _this; + } + + PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { + var sector = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = data.getItemLayout(idx); // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified. + // see `setItemLayout` in `pieLayout.ts`. + + var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout); // Ignore NaN data. + + if (isNaN(sectorShape.startAngle)) { + // Use NaN shape to avoid drawing shape. + sector.setShape(sectorShape); + return; + } + + if (firstCreate) { + sector.setShape(sectorShape); + var animationType = seriesModel.getShallow('animationType'); + + if (seriesModel.ecModel.ssr) { + // Use scale animation in SSR mode(opacity?) + // Because CSS SVG animation doesn't support very customized shape animation. + initProps(sector, { + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: idx, + isFrom: true + }); + sector.originX = sectorShape.cx; + sector.originY = sectorShape.cy; + } else if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } // Expansion + else { + if (startAngle != null) { + sector.setShape({ + startAngle: startAngle, + endAngle: startAngle + }); + initProps(sector, { + shape: { + startAngle: layout.startAngle, + endAngle: layout.endAngle + } + }, seriesModel, idx); + } else { + sector.shape.endAngle = layout.startAngle; + updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + } + } else { + saveOldStyle(sector); // Transition animation from the old shape + + updateProps(sector, { + shape: sectorShape + }, seriesModel, idx); + } + + sector.useStyle(data.getItemVisual(idx, 'style')); + setStatesStylesFromModel(sector, itemModel); + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var offset = seriesModel.get('selectedOffset'); + var dx = Math.cos(midAngle) * offset; + var dy = Math.sin(midAngle) * offset; + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + this._updateLabel(seriesModel, data, idx); + + sector.ensureState('emphasis').shape = extend({ + r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) + }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); + extend(sector.ensureState('select'), { + x: dx, + y: dy, + shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) + }); + extend(sector.ensureState('blur'), { + shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) + }); + var labelLine = sector.getTextGuideLine(); + var labelText = sector.getTextContent(); + labelLine && extend(labelLine.ensureState('select'), { + x: dx, + y: dy + }); // TODO: needs dx, dy in zrender? + + extend(labelText.ensureState('select'), { + x: dx, + y: dy + }); + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { + var sector = this; + var itemModel = data.getItemModel(idx); + var labelLineModel = itemModel.getModel('labelLine'); + var style = data.getItemVisual(idx, 'style'); + var visualColor = style && style.fill; + var visualOpacity = style && style.opacity; + setLabelStyle(sector, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) + }); + var labelText = sector.getTextContent(); // Set textConfig on sector. + + sector.setTextConfig({ + // reset position, rotation + position: null, + rotation: null + }); // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + labelText.attr({ + z2: 10 + }); + var labelPosition = seriesModel.get(['label', 'position']); + + if (labelPosition !== 'outside' && labelPosition !== 'outer') { + sector.removeTextGuideLine(); + } else { + var polyline = this.getTextGuideLine(); + + if (!polyline) { + polyline = new Polyline(); + this.setTextGuideLine(polyline); + } // Default use item visual color + + + setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { + stroke: visualColor, + opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) + }); + } + }; + + return PiePiece; + }(Sector); // Pie view + + + var PieView = + /** @class */ + function (_super) { + __extends(PieView, _super); + + function PieView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.ignoreLabelLineUpdate = true; + return _this; + } + + PieView.prototype.render = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var startAngle; // First render + + if (!oldData && data.count() > 0) { + var shape = data.getItemLayout(0); + + for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { + shape = data.getItemLayout(s); + } + + if (shape) { + startAngle = shape.startAngle; + } + } // remove empty-circle if it exists + + + if (this._emptyCircleSector) { + group.remove(this._emptyCircleSector); + } // when all data are filtered, show lightgray empty circle + + + if (data.count() === 0 && seriesModel.get('showEmptyCircle')) { + var sector = new Sector({ + shape: getBasicPieLayout(seriesModel, api) + }); + sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle()); + this._emptyCircleSector = sector; + group.add(sector); + } + + data.diff(oldData).add(function (idx) { + var piePiece = new PiePiece(data, idx, startAngle); + data.setItemGraphicEl(idx, piePiece); + group.add(piePiece); + }).update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + piePiece.updateData(data, newIdx, startAngle); + piePiece.off('click'); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }).remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piePiece, seriesModel, idx); + }).execute(); + pieLabelLayout(seriesModel); // Always use initial animation. + + if (seriesModel.get('animationTypeUpdate') !== 'expansion') { + this._data = data; + } + }; + + PieView.prototype.dispose = function () {}; + + PieView.prototype.containPoint = function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + PieView.type = 'pie'; + return PieView; + }(ChartView); + + /** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + */ + + function createSeriesDataSimply(seriesModel, opt, nameList) { + opt = isArray(opt) && { + coordDimensions: opt + } || extend({ + encodeDefine: seriesModel.getEncode() + }, opt); + var source = seriesModel.getSource(); + var dimensions = prepareSeriesDataSchema(source, opt).dimensions; + var list = new SeriesData(dimensions, seriesModel); + list.initData(source, nameList); + return list; + } + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * LegendVisualProvider is an bridge that pick encoded color from data and + * provide to the legend component. + */ + var LegendVisualProvider = + /** @class */ + function () { + function LegendVisualProvider( // Function to get data after filtered. It stores all the encoding info + getDataWithEncodedVisual, // Function to get raw data before filtered. + getRawData) { + this._getDataWithEncodedVisual = getDataWithEncodedVisual; + this._getRawData = getRawData; + } + + LegendVisualProvider.prototype.getAllNames = function () { + var rawData = this._getRawData(); // We find the name from the raw data. In case it's filtered by the legend component. + // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray. + + + return rawData.mapArray(rawData.getName); + }; + + LegendVisualProvider.prototype.containName = function (name) { + var rawData = this._getRawData(); + + return rawData.indexOfName(name) >= 0; + }; + + LegendVisualProvider.prototype.indexOfName = function (name) { + // Only get data when necessary. + // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet. + // Invoking Series#getData immediately will throw an error. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.indexOfName(name); + }; + + LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) { + // Get encoded visual properties from final filtered data. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.getItemVisual(dataIndex, key); + }; + + return LegendVisualProvider; + }(); + + var innerData = makeInner(); + + var PieSeriesModel = + /** @class */ + function (_super) { + __extends(PieSeriesModel, _super); + + function PieSeriesModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @overwrite + */ + + + PieSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + + this._defaultLabelLine(option); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.mergeOption = function () { + _super.prototype.mergeOption.apply(this, arguments); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getInitialData = function () { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); // update seats when data is changed + + var dataInner = innerData(data); + var seats = dataInner.seats; + + if (!seats) { + var valueList_1 = []; + data.each(data.mapDimension('value'), function (value) { + valueList_1.push(value); + }); + seats = dataInner.seats = getPercentSeats(valueList_1, data.hostModel.get('percentPrecision')); + } + + var params = _super.prototype.getDataParams.call(this, dataIndex); // seats may be empty when sum is 0 + + + params.percent = seats[dataIndex] || 0; + params.$vars.push('percent'); + return params; + }; + + PieSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; + + PieSeriesModel.type = 'series.pie'; + PieSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + legendHoverLink: true, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If the angle of a sector less than `minShowLabelAngle`, + // the label will not be displayed. + minShowLabelAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + percentPrecision: 2, + // If still show when all data zero. + stillShowZeroSum: true, + // cursor: null, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + // color: 'inherit', + // If rotate around circle + rotate: 0, + show: true, + overflow: 'truncate', + // 'outer', 'inside', 'center' + position: 'outer', + // 'none', 'labelLine', 'edge'. Works only when position is 'outer' + alignTo: 'none', + // Closest distance between label and chart edge. + // Works only position is 'outer' and alignTo is 'edge'. + edgeDistance: '25%', + // Works only position is 'outer' and alignTo is not 'edge'. + bleedMargin: 10, + // Distance between text and label line. + distanceToLabelLine: 5 // formatter: 标签文本格式器,同 tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见 textStyle + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1, + borderJoin: 'round' + }, + showEmptyCircle: true, + emptyCircleStyle: { + color: 'lightgray', + opacity: 1 + }, + labelLayout: { + // Hide the overlapped label. + hideOverlap: true + }, + emphasis: { + scale: true, + scaleSize: 5 + }, + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // Animation type. Valid values: expansion, scale + animationType: 'expansion', + animationDuration: 1000, + // Animation type when update. Valid values: transition, expansion + animationTypeUpdate: 'transition', + animationEasingUpdate: 'cubicInOut', + animationDurationUpdate: 500, + animationEasing: 'cubicInOut' + }; + return PieSeriesModel; + }(SeriesModel); + + function negativeDataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + // handle negative value condition + var valueDim = data.mapDimension('value'); + var curValue = data.get(valueDim, idx); + + if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) { + return false; + } + + return true; + }); + } + }; + } + + function install$4(registers) { + registers.registerChartView(PieView); + registers.registerSeriesModel(PieSeriesModel); + createLegacyDataSelectAction('pie', registers.registerAction); + registers.registerLayout(curry(pieLayout, 'pie')); + registers.registerProcessor(dataFilter('pie')); + registers.registerProcessor(negativeDataFilter('pie')); + } + + var ScatterSeriesModel = + /** @class */ + function (_super) { + __extends(ScatterSeriesModel, _super); + + function ScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + ScatterSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + // PENDING + return this.option.large ? 5e3 : this.get('progressive'); + } + + return progressive; + }; + + ScatterSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + // PENDING + return this.option.large ? 1e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + ScatterSeriesModel.prototype.getZLevelKey = function () { + // Each progressive series has individual key. + return this.getData().count() > this.getProgressiveThreshold() ? this.id : ''; + }; + + ScatterSeriesModel.type = 'series.scatter'; + ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + ScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + symbolSize: 10, + // symbolRotate: null, // 图形旋转控制 + large: false, + // Available when large is true + largeThreshold: 2000, + // cursor: null, + itemStyle: { + opacity: 0.8 // color: 各异 + + }, + emphasis: { + scale: true + }, + // If clip the overflow graphics + // Works on cartesian / polar series + clip: true, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + universalTransition: { + divideShape: 'clone' + } // progressive: null + + }; + return ScatterSeriesModel; + }(SeriesModel); + + var BOOST_SIZE_THRESHOLD = 4; + + var LargeSymbolPathShape = + /** @class */ + function () { + function LargeSymbolPathShape() {} + + return LargeSymbolPathShape; + }(); + + var LargeSymbolPath = + /** @class */ + function (_super) { + __extends(LargeSymbolPath, _super); + + function LargeSymbolPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeSymbolPath.prototype.getDefaultShape = function () { + return new LargeSymbolPathShape(); + }; + + LargeSymbolPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeSymbolPath.prototype.buildPath = function (path, shape) { + var points = shape.points; + var size = shape.size; + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + var ctx = path.getContext ? path.getContext() : path; + var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; + var softClipShape = this.softClipShape; + var i; // Do draw in afterBrush. + + if (canBoost) { + this._ctx = ctx; + return; + } + + this._ctx = null; + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } + + symbolProxyShape.x = x - size[0] / 2; + symbolProxyShape.y = y - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + symbolProxy.buildPath(path, symbolProxyShape, true); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.afterBrush = function () { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var ctx = this._ctx; + var softClipShape = this.softClipShape; + var i; + + if (!ctx) { + return; + } // PENDING If style or other canvas status changed? + + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } // fillRect is faster than building a rect path and draw. + // And it support light globalCompositeOperation. + + + ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.findDataIndex = function (x, y) { + // TODO ??? + // Consider transform + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = Math.max(size[0], 4); + var h = Math.max(size[1], 4); // Not consider transform + // Treat each element as a rect + // top down traverse + + for (var idx = points.length / 2 - 1; idx >= 0; idx--) { + var i = idx * 2; + var x0 = points[i] - w / 2; + var y0 = points[i + 1] - h / 2; + + if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { + return idx; + } + } + + return -1; + }; + + LargeSymbolPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeSymbolPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = size[0]; + var h = size[1]; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h); + } + + return rect; + }; + + return LargeSymbolPath; + }(Path); + + var LargeSymbolDraw = + /** @class */ + function () { + function LargeSymbolDraw() { + this.group = new Group(); + } + /** + * Update symbols draw by new data + */ + + + LargeSymbolDraw.prototype.updateData = function (data, opt) { + this._clear(); + + var symbolEl = this._create(); + + symbolEl.setShape({ + points: data.getLayout('points') + }); + + this._setCommon(symbolEl, data, opt); + }; + + LargeSymbolDraw.prototype.updateLayout = function (data) { + var points = data.getLayout('points'); + this.group.eachChild(function (child) { + if (child.startIndex != null) { + var len = (child.endIndex - child.startIndex) * 2; + var byteOffset = child.startIndex * 4 * 2; + points = new Float32Array(points.buffer, byteOffset, len); + } + + child.setShape('points', points); // Reset draw cursor. + + child.reset(); + }); + }; + + LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._clear(); + }; + + LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + var lastAdded = this._newAdded[0]; + var points = data.getLayout('points'); + var oldPoints = lastAdded && lastAdded.shape.points; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldPoints && oldPoints.length < 2e4) { + var oldLen = oldPoints.length; + var newPoints = new Float32Array(oldLen + points.length); // Concat two array + + newPoints.set(oldPoints); + newPoints.set(points, oldLen); // Update endIndex + + lastAdded.endIndex = taskParams.end; + lastAdded.setShape({ + points: newPoints + }); + } else { + // Clear + this._newAdded = []; + + var symbolEl = this._create(); + + symbolEl.startIndex = taskParams.start; + symbolEl.endIndex = taskParams.end; + symbolEl.incremental = true; + symbolEl.setShape({ + points: points + }); + + this._setCommon(symbolEl, data, opt); + } + }; + + LargeSymbolDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeSymbolDraw.prototype._create = function () { + var symbolEl = new LargeSymbolPath({ + cursor: 'default' + }); + symbolEl.ignoreCoarsePointer = true; + this.group.add(symbolEl); + + this._newAdded.push(symbolEl); + + return symbolEl; + }; + + LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, opt) { + var hostModel = data.hostModel; + opt = opt || {}; + var size = data.getVisual('symbolSize'); + symbolEl.setShape('size', size instanceof Array ? size : [size, size]); + symbolEl.softClipShape = opt.clipShape || null; // Create symbolProxy to build path for each data + + symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0); // Use symbolProxy setColor method + + symbolEl.setColor = symbolEl.symbolProxy.setColor; + var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; + symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow. + hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color'])); + var globalStyle = data.getVisual('style'); + var visualColor = globalStyle && globalStyle.fill; + + if (visualColor) { + symbolEl.setColor(visualColor); + } + + var ecData = getECData(symbolEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + symbolEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = symbolEl.hoverDataIdx; + + if (dataIndex >= 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0); + } + }); + }; + + LargeSymbolDraw.prototype.remove = function () { + this._clear(); + }; + + LargeSymbolDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + + return LargeSymbolDraw; + }(); + + var ScatterView = + /** @class */ + function (_super) { + __extends(ScatterView, _super); + + function ScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterView.type; + return _this; + } + + ScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.updateData(data, { + // TODO + // If this parameter should be a shape or a bounding volume + // shape will be more general. + // But bounding volume like bounding rect will be much faster in the contain calculation + clipShape: this._getClipShape(seriesModel) + }); + this._finished = true; + }; + + ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.incrementalPrepareUpdate(data); + this._finished = false; + }; + + ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), { + clipShape: this._getClipShape(seriesModel) + }); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); // Must mark group dirty and make sure the incremental layer will be cleared + // PENDING + + this.group.dirty(); + + if (!this._finished || data.count() > 1e4) { + return { + update: true + }; + } else { + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(data); + } + }; + + ScatterView.prototype.eachRendered = function (cb) { + this._symbolDraw && this._symbolDraw.eachRendered(cb); + }; + + ScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) { + var symbolDraw = this._symbolDraw; + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { + symbolDraw && symbolDraw.remove(); + symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw(); + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(symbolDraw.group); + return symbolDraw; + }; + + ScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + this._symbolDraw = null; + }; + + ScatterView.prototype.dispose = function () {}; + + ScatterView.type = 'scatter'; + return ScatterView; + }(ChartView); + + var GridModel = + /** @class */ + function (_super) { + __extends(GridModel, _super); + + function GridModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GridModel.type = 'grid'; + GridModel.dependencies = ['xAxis', 'yAxis']; + GridModel.layoutMode = 'box'; + GridModel.defaultOption = { + show: false, + // zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 70, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + }; + return GridModel; + }(ComponentModel); + + var CartesianAxisModel = + /** @class */ + function (_super) { + __extends(CartesianAxisModel, _super); + + function CartesianAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + CartesianAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + }; + + CartesianAxisModel.type = 'cartesian2dAxis'; + return CartesianAxisModel; + }(ComponentModel); + mixin(CartesianAxisModel, AxisModelCommonMixin); + + var defaultOption = { + show: true, + // zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By default auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + tooltip: { + show: false + }, + axisPointer: {}, + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#6E7079', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + lineStyle: { + color: ['#E0E6F1'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)'] + } + } + }; + var categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } + }, defaultOption); + var valueAxis = merge({ + boundaryGap: [0, 0], + axisLine: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + axisTick: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + splitNumber: 5, + minorTick: { + // Minor tick, not available for cateogry axis. + show: false, + // Split number of minor ticks. The value should be in range of (0, 100) + splitNumber: 5, + // Length of minor tick + length: 3, + // Line style + lineStyle: {// Default to be same with axisTick + } + }, + minorSplitLine: { + show: false, + lineStyle: { + color: '#F4F7FD', + width: 1 + } + } + }, defaultOption); + var timeAxis = merge({ + splitNumber: 6, + axisLabel: { + // To eliminate labels that are not nice + showMinLabel: false, + showMaxLabel: false, + rich: { + primary: { + fontWeight: 'bold' + } + } + }, + splitLine: { + show: false + } + }, valueAxis); + var logAxis = defaults({ + logBase: 10 + }, valueAxis); + var axisDefault = { + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis + }; + + /* + * 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. + */ + + /* + * 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. + */ + var AXIS_TYPES = { + value: 1, + category: 1, + time: 1, + log: 1 + }; + + /** + * Generate sub axis model class + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... + */ + + function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { + each(AXIS_TYPES, function (v, axisType) { + var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); + + var AxisModel = + /** @class */ + function (_super) { + __extends(AxisModel, _super); + + function AxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = axisName + 'Axis.' + axisType; + return _this; + } + + AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + option.type = getAxisType(option); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + AxisModel.prototype.optionUpdated = function () { + var thisOption = this.option; + + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }; + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + + + AxisModel.prototype.getCategories = function (rawData) { + var option = this.option; // FIXME + // warning if called before all of 'getInitailData' finished. + + if (option.type === 'category') { + if (rawData) { + return option.data; + } + + return this.__ordinalMeta.categories; + } + }; + + AxisModel.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta; + }; + + AxisModel.type = axisName + 'Axis.' + axisType; + AxisModel.defaultOption = defaultOption; + return AxisModel; + }(BaseAxisModelClass); + + registers.registerComponentModel(AxisModel); + }); + registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType); + } + + function getAxisType(option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + var Cartesian = + /** @class */ + function () { + function Cartesian(name) { + this.type = 'cartesian'; + this._dimList = []; + this._axes = {}; + this.name = name || ''; + } + + Cartesian.prototype.getAxis = function (dim) { + return this._axes[dim]; + }; + + Cartesian.prototype.getAxes = function () { + return map(this._dimList, function (dim) { + return this._axes[dim]; + }, this); + }; + + Cartesian.prototype.getAxesByScale = function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter(this.getAxes(), function (axis) { + return axis.scale.type === scaleType; + }); + }; + + Cartesian.prototype.addAxis = function (axis) { + var dim = axis.dim; + this._axes[dim] = axis; + + this._dimList.push(dim); + }; + + return Cartesian; + }(); + + var cartesian2DDimensions = ['x', 'y']; + + function canCalculateAffineTransform(scale) { + return scale.type === 'interval' || scale.type === 'time'; + } + + var Cartesian2D = + /** @class */ + function (_super) { + __extends(Cartesian2D, _super); + + function Cartesian2D() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'cartesian2d'; + _this.dimensions = cartesian2DDimensions; + return _this; + } + /** + * Calculate an affine transform matrix if two axes are time or value. + * It's mainly for accelartion on the large time series data. + */ + + + Cartesian2D.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var xAxisScale = this.getAxis('x').scale; + var yAxisScale = this.getAxis('y').scale; + + if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { + return; + } + + var xScaleExtent = xAxisScale.getExtent(); + var yScaleExtent = yAxisScale.getExtent(); + var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); + var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); + var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; + var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; + + if (!xScaleSpan || !yScaleSpan) { + return; + } // Accelerate data to point calculation on the special large time series data. + + + var scaleX = (end[0] - start[0]) / xScaleSpan; + var scaleY = (end[1] - start[1]) / yScaleSpan; + var translateX = start[0] - xScaleExtent[0] * scaleX; + var translateY = start[1] - yScaleExtent[0] * scaleY; + var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; + this._invTransform = invert([], m); + }; + /** + * Base axis will be used on stacking. + */ + + + Cartesian2D.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x'); + }; + + Cartesian2D.prototype.containPoint = function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1])); + }; + + Cartesian2D.prototype.containData = function (data) { + return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]); + }; + + Cartesian2D.prototype.containZone = function (data1, data2) { + var zoneDiag1 = this.dataToPoint(data1); + var zoneDiag2 = this.dataToPoint(data2); + var area = this.getArea(); + var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]); + return area.intersect(zone); + }; + + Cartesian2D.prototype.dataToPoint = function (data, clamp, out) { + out = out || []; + var xVal = data[0]; + var yVal = data[1]; // Fast path + + if (this._transform // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated. + && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { + return applyTransform(out, data, this._transform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp)); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp)); + return out; + }; + + Cartesian2D.prototype.clampData = function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); + out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); + return out; + }; + + Cartesian2D.prototype.pointToData = function (point, clamp) { + var out = []; + + if (this._invTransform) { + return applyTransform(out, point, this._invTransform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp); + return out; + }; + + Cartesian2D.prototype.getOtherAxis = function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + }; + /** + * Get rect area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Cartesian2D.prototype.getArea = function () { + var xExtent = this.getAxis('x').getGlobalExtent(); + var yExtent = this.getAxis('y').getGlobalExtent(); + var x = Math.min(xExtent[0], xExtent[1]); + var y = Math.min(yExtent[0], yExtent[1]); + var width = Math.max(xExtent[0], xExtent[1]) - x; + var height = Math.max(yExtent[0], yExtent[1]) - y; + return new BoundingRect(x, y, width, height); + }; + + return Cartesian2D; + }(Cartesian); + + var Axis2D = + /** @class */ + function (_super) { + __extends(Axis2D, _super); + + function Axis2D(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + /** + * Index of axis, can be used as key + * Injected outside. + */ + + + _this.index = 0; + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + + Axis2D.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.} + */ + + + Axis2D.prototype.getGlobalExtent = function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }; + + Axis2D.prototype.pointToData = function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }; + /** + * Set ordinalSortInfo + * @param info new OrdinalSortInfo + */ + + + Axis2D.prototype.setCategorySortInfo = function (info) { + if (this.type !== 'category') { + return false; + } + + this.model.option.categorySortInfo = info; + this.scale.setSortInfo(info); + }; + + return Axis2D; + }(Axis); + + /** + * Can only be called after coordinate system creation stage. + * (Can be called before coordinate system update stage). + */ + + function layout$1(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = { + left: 0, + right: 1, + top: 0, + bottom: 1, + onZero: 2 + }; + var axisOffset = axisModel.get('offset') || 0; + var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } // Axis position + + + layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]]; // Axis rotation + + layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); // Tick and label direction, x y is axisDim + + var dirMap = { + top: -1, + bottom: 1, + left: -1, + right: 1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } // Special label rotation + + + var labelRotate = axisModel.get(['axisLabel', 'rotate']); + layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; // Over splitLine and splitArea + + layout.z2 = 1; + return layout; + } + function isCartesian2DSeries(seriesModel) { + return seriesModel.get('coordinateSystem') === 'cartesian2d'; + } + function findAxisModels(seriesModel) { + var axisModelMap = { + xAxisModel: null, + yAxisModel: null + }; + each(axisModelMap, function (v, key) { + var axisType = key.replace(/Model$/, ''); + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!axisModel) { + throw new Error(axisType + ' "' + retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '" not found'); + } + } + + axisModelMap[key] = axisModel; + }); + return axisModelMap; + } + + var mathLog$1 = Math.log; + function alignScaleTicks(scale, axisModel, alignToScale) { + var intervalScaleProto = IntervalScale.prototype; // NOTE: There is a precondition for log scale here: + // In log scale we store _interval and _extent of exponent value. + // So if we use the method of InternalScale to set/get these data. + // It process the exponent value, which is linear and what we want here. + + var alignToTicks = intervalScaleProto.getTicks.call(alignToScale); + var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true); + var alignToSplitNumber = alignToTicks.length - 1; + var alignToInterval = intervalScaleProto.getInterval.call(alignToScale); + var scaleExtent = getScaleExtent(scale, axisModel); + var rawExtent = scaleExtent.extent; + var isMinFixed = scaleExtent.fixMin; + var isMaxFixed = scaleExtent.fixMax; + + if (scale.type === 'log') { + var logBase = mathLog$1(scale.base); + rawExtent = [mathLog$1(rawExtent[0]) / logBase, mathLog$1(rawExtent[1]) / logBase]; + } + + scale.setExtent(rawExtent[0], rawExtent[1]); + scale.calcNiceExtent({ + splitNumber: alignToSplitNumber, + fixMin: isMinFixed, + fixMax: isMaxFixed + }); + var extent = intervalScaleProto.getExtent.call(scale); // Need to update the rawExtent. + // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax' + + if (isMinFixed) { + rawExtent[0] = extent[0]; + } + + if (isMaxFixed) { + rawExtent[1] = extent[1]; + } + + var interval = intervalScaleProto.getInterval.call(scale); + var min = rawExtent[0]; + var max = rawExtent[1]; + + if (isMinFixed && isMaxFixed) { + // User set min, max, divide to get new interval + interval = (max - min) / alignToSplitNumber; + } else if (isMinFixed) { + max = rawExtent[0] + interval * alignToSplitNumber; // User set min, expand extent on the other side + + while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) { + interval = increaseInterval(interval); + max = rawExtent[0] + interval * alignToSplitNumber; + } + } else if (isMaxFixed) { + // User set max, expand extent on the other side + min = rawExtent[1] - interval * alignToSplitNumber; + + while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) { + interval = increaseInterval(interval); + min = rawExtent[1] - interval * alignToSplitNumber; + } + } else { + var nicedSplitNumber = scale.getTicks().length - 1; + + if (nicedSplitNumber > alignToSplitNumber) { + interval = increaseInterval(interval); + } + + var range = interval * alignToSplitNumber; + max = Math.ceil(rawExtent[1] / interval) * interval; + min = round(max - range); // Not change the result that crossing zero. + + if (min < 0 && rawExtent[0] >= 0) { + min = 0; + max = round(range); + } else if (max > 0 && rawExtent[1] <= 0) { + max = 0; + min = -round(range); + } + } // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale + + + var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; + var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; // NOTE: Must in setExtent -> setInterval -> setNiceExtent order. + + intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1); + intervalScaleProto.setInterval.call(scale, interval); + + if (t0 || t1) { + intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval); + } + + if ("development" !== 'production') { + var ticks = intervalScaleProto.getTicks.call(scale); + + if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) { + warn( // eslint-disable-next-line + "The ticks may be not readable when set min: " + axisModel.get('min') + ", max: " + axisModel.get('max') + " and alignTicks: true"); + } + } + } + + var Grid = + /** @class */ + function () { + function Grid(gridModel, ecModel, api) { + // FIXME:TS where used (different from registered type 'cartesian2d')? + this.type = 'grid'; + this._coordsMap = {}; + this._coordsList = []; + this._axesMap = {}; + this._axesList = []; + this.axisPointerEnabled = true; + this.dimensions = cartesian2DDimensions; + + this._initCartesian(gridModel, ecModel, api); + + this.model = gridModel; + } + + Grid.prototype.getRect = function () { + return this._rect; + }; + + Grid.prototype.update = function (ecModel, api) { + var axesMap = this._axesMap; + + this._updateScale(ecModel, this.model); + + function updateAxisTicks(axes) { + var alignTo; // Axis is added in order of axisIndex. + + var axesIndices = keys(axes); + var len = axesIndices.length; + + if (!len) { + return; + } + + var axisNeedsAlign = []; // Process once and calculate the ticks for those don't use alignTicks. + + for (var i = len - 1; i >= 0; i--) { + var idx = +axesIndices[i]; // Convert to number. + + var axis = axes[idx]; + var model = axis.model; + var scale = axis.scale; + + if ( // Only value and log axis without interval support alignTicks. + isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) { + axisNeedsAlign.push(axis); + } else { + niceScaleExtent(scale, model); + + if (isIntervalOrLogScale(scale)) { + // Can only align to interval or log axis. + alignTo = axis; + } + } + } + // PENDING. Should we find the axis that both set interval, min, max and align to this one? + + if (axisNeedsAlign.length) { + if (!alignTo) { + alignTo = axisNeedsAlign.pop(); + niceScaleExtent(alignTo.scale, alignTo.model); + } + + each(axisNeedsAlign, function (axis) { + alignScaleTicks(axis.scale, axis.model, alignTo.scale); + }); + } + } + + updateAxisTicks(axesMap.x); + updateAxisTicks(axesMap.y); // Key: axisDim_axisIndex, value: boolean, whether onZero target. + + var onZeroRecords = {}; + each(axesMap.x, function (xAxis) { + fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords); + }); + each(axesMap.y, function (yAxis) { + fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords); + }); // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + + this.resize(this.model, api); + }; + /** + * Resize the grid + */ + + + Grid.prototype.resize = function (gridModel, api, ignoreContainLabel) { + var boxLayoutParams = gridModel.getBoxLayoutParams(); + var isContainLabel = !ignoreContainLabel && gridModel.get('containLabel'); + var gridRect = getLayoutRect(boxLayoutParams, { + width: api.getWidth(), + height: api.getHeight() + }); + this._rect = gridRect; + var axesList = this._axesList; + adjustAxes(); // Minus label size + + if (isContainLabel) { + each(axesList, function (axis) { + if (!axis.model.get(['axisLabel', 'inside'])) { + var labelUnionRect = estimateLabelUnionRect(axis); + + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get(['axisLabel', 'margin']); + gridRect[dim] -= labelUnionRect[dim] + margin; + + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + adjustAxes(); + } + + each(this._coordsList, function (coord) { + // Calculate affine matrix to accelerate the data to point transform. + // If all the axes scales are time or value. + coord.calcAffineTransform(); + }); + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + Grid.prototype.getAxis = function (dim, axisIndex) { + var axesMapOnDim = this._axesMap[dim]; + + if (axesMapOnDim != null) { + return axesMapOnDim[axisIndex || 0]; + } + }; + + Grid.prototype.getAxes = function () { + return this._axesList.slice(); + }; + + Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + } + + if (isObject(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) { + return coordList[i]; + } + } + }; + + Grid.prototype.getCartesians = function () { + return this._coordsList.slice(); + }; + /** + * @implements + */ + + + Grid.prototype.convertToPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; + }; + /** + * @implements + */ + + + Grid.prototype.convertFromPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; + }; + + Grid.prototype._findConvertTarget = function (finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } else if (xAxisModel) { + axis = this.getAxis('x', xAxisModel.componentIndex); + } else if (yAxisModel) { + axis = this.getAxis('y', yAxisModel.componentIndex); + } // Lowest priority. + else if (gridModel) { + var grid = gridModel.coordinateSystem; + + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + + return { + cartesian: cartesian, + axis: axis + }; + }; + /** + * @implements + */ + + + Grid.prototype.containPoint = function (point) { + var coord = this._coordsList[0]; + + if (coord) { + return coord.containPoint(point); + } + }; + /** + * Initialize cartesian coordinate systems + */ + + + Grid.prototype._initCartesian = function (gridModel, ecModel, api) { + var _this = this; + + var grid = this; + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; // Create axis + + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; // Create cartesian2d + + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + cartesian.master = _this; + cartesian.model = gridModel; + _this._coordsMap[key] = cartesian; + + _this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }); + }); + + function createAxisCreator(dimName) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + + if (dimName === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom'; + } + } else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = axisPositionUsed.left ? 'right' : 'left'; + } + } + + axisPositionUsed[axisPosition] = true; + var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Inject axis into axisModel + + axisModel.axis = axis; // Inject axisModel into axis + + axis.model = axisModel; // Inject grid info axis + + axis.grid = grid; // Index of axis, can be used as key + + axis.index = idx; + + grid._axesList.push(axis); + + axesMap[dimName][idx] = axis; + axesCount[dimName]++; + }; + } + }; + /** + * Update cartesian properties from series. + */ + + + Grid.prototype._updateScale = function (ecModel, gridModel) { + // Reset scale + each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + + if (axis.type === 'category') { + var categorySortInfo = axis.model.get('categorySortInfo'); + axis.scale.setSortInfo(categorySortInfo); + } + }); + ecModel.eachSeries(function (seriesModel) { + if (isCartesian2DSeries(seriesModel)) { + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { + return; + } + + var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + unionExtent(data, xAxis); + unionExtent(data, yAxis); + } + }, this); + + function unionExtent(data, axis) { + each(getDataDimensionsOnAxis(data, axis.dim), function (dim) { + axis.scale.unionExtentFromData(data, dim); + }); + } + }; + /** + * @param dim 'x' or 'y' or 'auto' or null/undefined + */ + + + Grid.prototype.getTooltipAxes = function (dim) { + var baseAxes = []; + var otherAxes = []; + each(this.getCartesians(), function (cartesian) { + var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + return { + baseAxes: baseAxes, + otherAxes: otherAxes + }; + }; + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; // dataSampling requires axis extent, so resize + // should be performed in create stage. + + grid.resize(gridModel, api, true); + gridModel.coordinateSystem = grid; + grids.push(grid); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (!isCartesian2DSeries(seriesModel)) { + return; + } + + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + var gridModel = xAxisModel.getCoordSysModel(); + + if ("development" !== 'production') { + if (!gridModel) { + throw new Error('Grid "' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '" not found'); + } + + if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) { + throw new Error('xAxis and yAxis must use the same grid'); + } + } + + var grid = gridModel.coordinateSystem; + seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + }); + return grids; + }; // For deciding which dimensions to use when creating list data + + + Grid.dimensions = cartesian2DDimensions; + return Grid; + }(); + /** + * Check if the axis is used in the specified grid. + */ + + + function isAxisUsedInTheGrid(axisModel, gridModel) { + return axisModel.getCoordSysModel() === gridModel; + } + + function fixAxisOnZero(axesMap, otherAxisDim, axis, // Key: see `getOnZeroRecordKey` + onZeroRecords) { + axis.getAxesOnZeroOf = function () { + // TODO: onZero of multiple axes. + return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; + }; // onZero can not be enabled in these two situations: + // 1. When any other axis is a category axis. + // 2. When no axis is cross 0 point. + + + var otherAxes = axesMap[otherAxisDim]; + var otherAxisOnZeroOf; + var axisModel = axis.model; + var onZero = axisModel.get(['axisLine', 'onZero']); + var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']); + + if (!onZero) { + return; + } // If target axis is specified. + + + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; + } + } else { + // Find the first available other axis. + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) // Consider that two Y axes on one value axis, + // if both onZero, the two Y axes overlap. + && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { + otherAxisOnZeroOf = otherAxes[idx]; + break; + } + } + } + + if (otherAxisOnZeroOf) { + onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; + } + + function getOnZeroRecordKey(axis) { + return axis.dim + '_' + axis.index; + } + } + + function canOnZeroToAxis(axis) { + return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis); + } + + function updateAxisTransform(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; // Fast transform + + axis.toGlobalCoord = axis.dim === 'x' ? function (coord) { + return coord + coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' ? function (coord) { + return coord - coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + var PI$5 = Math.PI; + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + */ + + var AxisBuilder = + /** @class */ + function () { + function AxisBuilder(axisModel, opt) { + this.group = new Group(); + this.opt = opt; + this.axisModel = axisModel; // Default value + + defaults(opt, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true, + handleAutoShown: function () { + return true; + } + }); // FIXME Not use a separate text group? + + var transformGroup = new Group({ + x: opt.position[0], + y: opt.position[1], + rotation: opt.rotation + }); // this.group.add(transformGroup); + // this._transformGroup = transformGroup; + + transformGroup.updateTransform(); + this._transformGroup = transformGroup; + } + + AxisBuilder.prototype.hasBuilder = function (name) { + return !!builders[name]; + }; + + AxisBuilder.prototype.add = function (name) { + builders[name](this.opt, this.axisModel, this.group, this._transformGroup); + }; + + AxisBuilder.prototype.getGroup = function () { + return this.group; + }; + + AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + + if (isRadianAroundZero(rotationDiff)) { + // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5)) { + // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI$5) { + textAlign = direction > 0 ? 'right' : 'left'; + } else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + }; + + AxisBuilder.makeAxisEventDataBase = function (axisModel) { + var eventData = { + componentType: axisModel.mainType, + componentIndex: axisModel.componentIndex + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; + }; + + AxisBuilder.isLabelSilent = function (axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') // Consider mouse cursor, add these restrictions. + || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show); + }; + + return AxisBuilder; + }(); + var builders = { + axisLine: function (opt, axisModel, group, transformGroup) { + var shown = axisModel.get(['axisLine', 'show']); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisLine'); + } + + if (!shown) { + return; + } + + var extent = axisModel.axis.getExtent(); + var matrix = transformGroup.transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + var inverse = pt1[0] > pt2[0]; + + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + + var lineStyle = extend({ + lineCap: 'round' + }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle()); + var line = new Line({ + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }); + subPixelOptimizeLine$1(line.shape, line.style.lineWidth); + line.anid = 'line'; + group.add(line); + var arrows = axisModel.get(['axisLine', 'symbol']); + + if (arrows != null) { + var arrowSize = axisModel.get(['axisLine', 'symbolSize']); + + if (isString(arrows)) { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + + if (isString(arrowSize) || isNumber(arrowSize)) { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + + var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize); + var symbolWidth_1 = arrowSize[0]; + var symbolHeight_1 = arrowSize[1]; + each([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); // Calculate arrow position with offset + + var r = point.r + point.offset; + var pt = inverse ? pt2 : pt1; + symbol.attr({ + rotation: point.rotate, + x: pt[0] + r * Math.cos(opt.rotation), + y: pt[1] - r * Math.sin(opt.rotation), + silent: true, + z2: 11 + }); + group.add(symbol); + } + }); + } + }, + axisTickLabel: function (opt, axisModel, group, transformGroup) { + var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); + var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); + fixMinMaxLabelShow(axisModel, labelEls, ticksEls); + buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); // This bit fixes the label overlap issue for the time chart. + // See https://github.com/apache/echarts/issues/14266 for more. + + if (axisModel.get(['axisLabel', 'hideOverlap'])) { + var labelList = prepareLayoutList(map(labelEls, function (label) { + return { + label: label, + priority: label.z2, + defaultAttr: { + ignore: label.ignore + } + }; + })); + hideOverlap(labelList); + } + }, + axisName: function (opt, axisModel, group, transformGroup) { + var name = retrieve(opt.axisName, axisModel.get('name')); + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + var extent = axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0]; + var labelLayout; + var nameRotation = axisModel.get('nameRotate'); + + if (nameRotation != null) { + nameRotation = nameRotation * PI$5 / 180; // To radian. + } + + var axisNameAvailableWidth; + + if (isNameLocationCenter(nameLocation)) { + labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. + nameDirection); + } else { + labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); + axisNameAvailableWidth = opt.axisNameAvailableWidth; + + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation)); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + + var textFont = textStyleModel.getFont(); + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); + var textEl = new ZRText({ + x: pos[0], + y: pos[1], + rotation: labelLayout.rotation, + silent: AxisBuilder.isLabelSilent(axisModel), + style: createTextStyle(textStyleModel, { + text: name, + font: textFont, + overflow: 'truncate', + width: maxWidth, + ellipsis: ellipsis, + fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']), + align: textStyleModel.get('align') || labelLayout.textAlign, + verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign + }), + z2: 1 + }); + setTooltipConfig({ + el: textEl, + componentModel: axisModel, + itemName: name + }); + textEl.__fullText = name; // Id for animation + + textEl.anid = 'name'; + + if (axisModel.get('triggerEvent')) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisName'; + eventData.name = name; + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + group.add(textEl); + textEl.decomposeTransform(); + } + }; + + function endTextLayout(rotation, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse; + + if (isRadianAroundZero(rotationDiff - PI$5 / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5 * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff < PI$5 * 1.5 && rotationDiff > PI$5 / 2) { + textAlign = onLeft ? 'left' : 'right'; + } else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + } + + function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + if (shouldShowAllLabels(axisModel.axis)) { + return; + } // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + + + var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']); + var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']); // FIXME + // Have not consider onBand yet, where tick els is more than label els. + + labelEls = labelEls || []; + tickEls = tickEls || []; + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } + } + + function ignoreEl(el) { + el && (el.ignore = true); + } + + function isTwoLabelOverlapped(current, next) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + + if (!firstRect || !nextRect) { + return; + } // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + + + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform())); + return firstRect.intersect(nextRect); + } + + function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; + } + + function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { + var tickEls = []; + var pt1 = []; + var pt2 = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = tickEndCoord; + + if (tickTransform) { + applyTransform(pt1, pt1, tickTransform); + applyTransform(pt2, pt2, tickTransform); + } // Tick line, Not use group transform to have better line draw + + + var tickEl = new Line({ + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: tickLineStyle, + z2: 2, + autoBatch: true, + silent: true + }); + subPixelOptimizeLine$1(tickEl.shape, tickEl.style.lineWidth); + tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; + tickEls.push(tickEl); + } + + return tickEls; + } + + function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var shown = tickModel.get('show'); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisTick'); + } + + if (!shown || axis.scale.isBlank()) { + return; + } + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickEndCoord = opt.tickDirection * tickModel.get('length'); + var ticksCoords = axis.getTicksCoords(); + var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + }), 'ticks'); + + for (var i = 0; i < ticksEls.length; i++) { + group.add(ticksEls[i]); + } + + return ticksEls; + } + + function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { + var axis = axisModel.axis; + var minorTickModel = axisModel.getModel('minorTick'); + + if (!minorTickModel.get('show') || axis.scale.isBlank()) { + return; + } + + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var lineStyleModel = minorTickModel.getModel('lineStyle'); + var tickEndCoord = tickDirection * minorTickModel.get('length'); + var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + })); + + for (var i = 0; i < minorTicksCoords.length; i++) { + var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i); + + for (var k = 0; k < minorTicksEls.length; k++) { + group.add(minorTicksEls[k]); + } + } + } + + function buildAxisLabel(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show'])); + + if (!show || axis.scale.isBlank()) { + return; + } + + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); // Special label rotate. + + var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$5 / 180; + var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); + var labelEls = []; + var silent = AxisBuilder.isLabelSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + each(labels, function (labelItem, index) { + var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + var itemLabelModel = labelModel; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); + } + } + + var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']); + var tickCoord = axis.dataToCoord(tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: opt.labelOffset + opt.labelDirection * labelMargin, + rotation: labelLayout.rotation, + silent: silent, + z2: 10 + (labelItem.level || 0), + style: createTextStyle(itemLabelModel, { + text: formattedLabel, + align: itemLabelModel.getShallow('align', true) || labelLayout.textAlign, + verticalAlign: itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign, + fill: isFunction(textColor) ? textColor( // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user replace ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor + }) + }); + textEl.anid = 'label_' + tickValue; // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisLabel'; + eventData.value = rawLabel; + eventData.tickIndex = index; + + if (axis.type === 'category') { + eventData.dataIndex = tickValue; + } + + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + labelEls.push(textEl); + group.add(textEl); + textEl.decomposeTransform(); + }); + return labelEls; + } + + // allAxesInfo should be updated when setOption performed. + + function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + collectAxesInfo(result, ecModel, api); // Check seriesInvolved for performance, in case too many series in some chart. + + result.seriesInvolved && collectSeriesInfo(result, ecModel); + return result; + } + + function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); // links can only be set on global. + + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; // Collect axes info. + + each(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; // Set tooltip (like 'cross') is a convenient way to show axisPointer + // for user. So we enable setting tooltip on coordSys model. + + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + + if (coordSys.getTooltipAxes && globalTooltipModel // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show')) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); + + if (triggerAxis || cross) { + each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); + } + + if (cross) { + each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); + } + } // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + + + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + var axisPointerShow = axisPointerModel.get('show'); + + if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { + return; + } + + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + + axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; + var snap = axisPointerModel.get('snap'); + var axisKey = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; // If result.axesInfo[key] exist, override it (tooltip has higher priority). + + var axisInfo = result.axesInfo[axisKey] = { + key: axisKey, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [], + linkGroup: null + }; + axesInfoInCoordSys[axisKey] = axisInfo; + result.seriesInvolved = result.seriesInvolved || involveSeries; + var groupIndex = getLinkGroupIndex(linksOption, axis); + + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { + axesInfo: {} + }); + linkGroup.axesInfo[axisKey] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); + } + + function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; + var volatileOption = {}; + each(fields, function (field) { + volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); + }); // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; // Compatible with previous behavior, tooltip axis does not show label by default. + // Only these properties can be overridden from tooltip to axisPointer. + + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + + var labelOption = volatileOption.label || (volatileOption.label = {}); // Follow the convention, do not show label when triggered by tooltip by default. + + labelOption.show == null && (labelOption.show = false); + + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + + return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); + } + + function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); + var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); + + if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { + return; + } + + each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + }); + } + /** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ + + + function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { + return i; + } + } + } + + function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; + } + + function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + + if (!axisInfo) { + return; + } + + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); // Parse init value for category and time axis. + + if (value != null) { + value = scale.parse(value); + } + + var useHandle = isHandleTrigger(axisPointerModel); // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + + if ( // Pick a value on axis when initializing. + value == null // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1]) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + + if (value < extent[0]) { + value = extent[0]; + } + + option.value = value; + + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } + } + function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; + } + function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; + } + + function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get(['handle', 'show']); + } + /** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ + + + function makeKey(model) { + return model.type + '||' + model.id; + } + + var axisPointerClazz = {}; + /** + * Base class of AxisView. + */ + + var AxisView = + /** @class */ + function (_super) { + __extends(AxisView, _super); + + function AxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisView.type; + return _this; + } + /** + * @override + */ + + + AxisView.prototype.render = function (axisModel, ecModel, api, payload) { + // FIXME + // This process should proformed after coordinate systems updated + // (axis scale updated), and should be performed each time update. + // So put it here temporarily, although it is not appropriate to + // put a model-writing procedure in `view`. + this.axisPointerClass && fixValue(axisModel); + + _super.prototype.render.apply(this, arguments); + + this._doUpdateAxisPointerClass(axisModel, api, true); + }; + /** + * Action handler. + */ + + + AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) { + this._doUpdateAxisPointerClass(axisModel, api, false); + }; + /** + * @override + */ + + + AxisView.prototype.remove = function (ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + }; + /** + * @override + */ + + + AxisView.prototype.dispose = function (ecModel, api) { + this._disposeAxisPointer(api); + + _super.prototype.dispose.apply(this, arguments); + }; + + AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) { + var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass); + + if (!Clazz) { + return; + } + + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); + }; + + AxisView.prototype._disposeAxisPointer = function (api) { + this._axisPointer && this._axisPointer.dispose(api); + this._axisPointer = null; + }; + + AxisView.registerAxisPointerClass = function (type, clazz) { + if ("development" !== 'production') { + if (axisPointerClazz[type]) { + throw new Error('axisPointer ' + type + ' exists'); + } + } + + axisPointerClazz[type] = clazz; + }; + + AxisView.getAxisPointerClass = function (type) { + return type && axisPointerClazz[type]; + }; + AxisView.type = 'axis'; + return AxisView; + }(ComponentView); + + var inner$6 = makeInner(); + function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } // TODO: TYPE + + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + + if (!ticksCoords.length) { + return; + } // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + + + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = inner$6(axisView).splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + autoBatch: true, + silent: true + })); + colorIndex = (colorIndex + 1) % areaColorsLen; + } + + inner$6(axisView).splitAreaColors = newSplitAreaColors; + } + function rectCoordAxisHandleRemove(axisView) { + inner$6(axisView).splitAreaColors = null; + } + + var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine']; + + var CartesianAxisView = + /** @class */ + function (_super) { + __extends(CartesianAxisView, _super); + + function CartesianAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianAxisView.type; + _this.axisPointerClass = 'CartesianAxisPointer'; + return _this; + } + /** + * @override + */ + + + CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = axisModel.getCoordSysModel(); + var layout = layout$1(gridModel, axisModel); + var axisBuilder = new AxisBuilder(axisModel, extend({ + handleAutoShown: function (elementType) { + var cartesians = gridModel.coordinateSystem.getCartesians(); + + for (var i = 0; i < cartesians.length; i++) { + if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) { + // Still show axis tick or axisLine if other axis is value / log + return true; + } + } // Not show axisTick or axisLine if other axis is category / time + + + return false; + } + }, layout)); + each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + each(selfBuilderAttrs, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel); + } + }, this); // THIS is a special case for bar racing chart. + // Update the axis label from the natural initial layout to + // sorted layout should has no animation. + + var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort; + + if (!isInitialSortFromBarRacing) { + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + } + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + CartesianAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + CartesianAxisView.type = 'cartesianAxis'; + return CartesianAxisView; + }(AxisView); + + var axisElementBuilders = { + splitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = lineCount++ % lineColors.length; + var tickValue = ticksCoords[i].tickValue; + var line = new Line({ + anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + }); + subPixelOptimizeLine$1(line.shape, lineStyle.lineWidth); + axisGroup.add(line); + } + }, + minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + var minorSplitLineModel = axisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var line = new Line({ + anid: 'minor_line_' + minorTicksCoords[i][k].tickValue, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: lineStyle, + silent: true + }); + subPixelOptimizeLine$1(line.shape, lineStyle.lineWidth); + axisGroup.add(line); + } + } + }, + splitArea: function (axisView, axisGroup, axisModel, gridModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); + } + }; + + var CartesianXAxisView = + /** @class */ + function (_super) { + __extends(CartesianXAxisView, _super); + + function CartesianXAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianXAxisView.type = 'xAxis'; + return CartesianXAxisView; + }(CartesianAxisView); + + var CartesianYAxisView = + /** @class */ + function (_super) { + __extends(CartesianYAxisView, _super); + + function CartesianYAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianYAxisView.type = 'yAxis'; + return CartesianYAxisView; + }(CartesianAxisView); + + var GridView = + /** @class */ + function (_super) { + __extends(GridView, _super); + + function GridView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'grid'; + return _this; + } + + GridView.prototype.render = function (gridModel, ecModel) { + this.group.removeAll(); + + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + }; + + GridView.type = 'grid'; + return GridView; + }(ComponentView); + + var extraOption = { + // gridIndex: 0, + // gridId: '', + offset: 0 + }; + function install$5(registers) { + registers.registerComponentView(GridView); + registers.registerComponentModel(GridModel); + registers.registerCoordinateSystem('cartesian2d', Grid); + axisModelCreator(registers, 'x', CartesianAxisModel, extraOption); + axisModelCreator(registers, 'y', CartesianAxisModel, extraOption); + registers.registerComponentView(CartesianXAxisView); + registers.registerComponentView(CartesianYAxisView); + registers.registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } + }); + } + + function install$6(registers) { + // In case developer forget to include grid component + use(install$5); + registers.registerSeriesModel(ScatterSeriesModel); + registers.registerChartView(ScatterView); + registers.registerLayout(pointsLayout('scatter')); + } + + function radarLayout(ecModel) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + return; + } + + var axes = coordSys.getIndicatorAxes(); + each(axes, function (axis, axisIndex) { + data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) { + points[dataIndex] = points[dataIndex] || []; + var point = coordSys.dataToPoint(val, axisIndex); + points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys); + }); + }); // Close polygon + + data.each(function (idx) { + // TODO + // Is it appropriate to connect to the next data when some data is missing? + // Or, should trade it like `connectNull` in line chart? + var firstPoint = find(points[idx], function (point) { + return isValidPoint(point); + }) || getValueMissingPoint(coordSys); // Copy the first actual point to the end of the array + + points[idx].push(firstPoint.slice()); + data.setItemLayout(idx, points[idx]); + }); + }); + } + + function isValidPoint(point) { + return !isNaN(point[0]) && !isNaN(point[1]); + } + + function getValueMissingPoint(coordSys) { + // It is error-prone to input [NaN, NaN] into polygon, polygon. + // (probably cause problem when refreshing or animating) + return [coordSys.cx, coordSys.cy]; + } + + function radarBackwardCompat(option) { + var polarOptArr = option.polar; + + if (polarOptArr) { + if (!isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + + var polarNotRadar_1 = []; + each(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + + option.radar = option.radar || []; + + if (!isArray(option.radar)) { + option.radar = [option.radar]; + } + + option.radar.push(polarOpt); + } else { + polarNotRadar_1.push(polarOpt); + } + }); + option.polar = polarNotRadar_1; + } + + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); + } + + var RadarView = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol$1(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + + if (symbolType === 'none') { + return; + } + + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2); + var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0; + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2, + rotation: symbolRotate * Math.PI / 180 || 0 + }); + return symbolPath; + } + + function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) { + // Simply rerender all + symbolGroup.removeAll(); + + for (var i = 0; i < newPoints.length - 1; i++) { + var symbolPath = createSymbol$1(data, idx); + + if (symbolPath) { + symbolPath.__dimIdx = i; + + if (oldPoints[i]) { + symbolPath.setPosition(oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, { + x: newPoints[i][0], + y: newPoints[i][1] + }, seriesModel, idx); + } else { + symbolPath.setPosition(newPoints[i]); + } + + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return map(points, function (pt) { + return [polar.cx, polar.cy]; + }); + } + + data.diff(oldData).add(function (idx) { + var points = data.getItemLayout(idx); + + if (!points) { + return; + } + + var polygon = new Polygon(); + var polyline = new Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + initProps(polygon, target, seriesModel, idx); + initProps(polyline, target, seriesModel, idx); + var itemGroup = new Group(); + var symbolGroup = new Group(); + itemGroup.add(polyline); + itemGroup.add(polygon); + itemGroup.add(symbolGroup); + updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true); + data.setItemGraphicEl(idx, itemGroup); + }).update(function (newIdx, oldIdx) { + var itemGroup = oldData.getItemGraphicEl(oldIdx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var target = { + shape: { + points: data.getItemLayout(newIdx) + } + }; + + if (!target.shape.points) { + return; + } + + updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false); + saveOldStyle(polygon); + saveOldStyle(polyline); + updateProps(polyline, target, seriesModel); + updateProps(polygon, target, seriesModel); + data.setItemGraphicEl(newIdx, itemGroup); + }).remove(function (idx) { + group.remove(oldData.getItemGraphicEl(idx)); + }).execute(); + data.eachItemGraphicEl(function (itemGroup, idx) { + var itemModel = data.getItemModel(idx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); // Radar uses the visual encoded from itemStyle. + + var itemStyle = data.getItemVisual(idx, 'style'); + var color = itemStyle.fill; + group.add(itemGroup); + polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), { + fill: 'none', + stroke: color + })); + setStatesStylesFromModel(polyline, itemModel, 'lineStyle'); + setStatesStylesFromModel(polygon, itemModel, 'areaStyle'); + var areaStyleModel = itemModel.getModel('areaStyle'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + polygon.ignore = polygonIgnore; + each(['emphasis', 'select', 'blur'], function (stateName) { + var stateModel = itemModel.getModel([stateName, 'areaStyle']); + var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty(); // Won't be ignore if normal state is not ignore. + + polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore; + }); + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: color, + opacity: 0.7, + decal: itemStyle.decal + })); + var emphasisModel = itemModel.getModel('emphasis'); + var itemHoverStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + symbolGroup.eachChild(function (symbolPath) { + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, itemStyle)); + } else { + symbolPath.useStyle(itemStyle); + symbolPath.setColor(color); + symbolPath.style.strokeNoScale = true; + } + + var pathEmphasisState = symbolPath.ensureState('emphasis'); + pathEmphasisState.style = clone(itemHoverStyle); + var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx); + (defaultText == null || isNaN(defaultText)) && (defaultText = ''); + setLabelStyle(symbolPath, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + labelDimIndex: symbolPath.__dimIdx, + defaultText: defaultText, + inheritColor: color, + defaultOpacity: itemStyle.opacity + }); + }); + toggleHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + this._data = data; + }; + + RadarView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + RadarView.type = 'radar'; + return RadarView; + }(ChartView); + + var RadarSeriesModel = + /** @class */ + function (_super) { + __extends(RadarSeriesModel, _super); + + function RadarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } // Overwrite + + + RadarSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + + RadarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + generateCoord: 'indicator_', + generateCoordCount: Infinity + }); + }; + + RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + var name = this.getData().getName(dataIndex); + var nameToDisplay = name === '' ? this.name : name; + var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); + return createTooltipMarkup('section', { + header: nameToDisplay, + sortBlocks: true, + blocks: map(indicatorAxes, function (axis) { + var val = data.get(data.mapDimension(axis.dim), dataIndex); + return createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: markerColor, + name: axis.name, + value: val, + sortParam: val + }); + }) + }); + }; + + RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var data_1 = this.getData(); + var coordSys = this.coordinateSystem; + var values = data_1.getValues(map(coordSys.dimensions, function (dim) { + return data_1.mapDimension(dim); + }), dataIndex); + + for (var i = 0, len = values.length; i < len; i++) { + if (!isNaN(values[i])) { + var indicatorAxes = coordSys.getIndicatorAxes(); + return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); + } + } + } + }; + + RadarSeriesModel.type = 'series.radar'; + RadarSeriesModel.dependencies = ['radar']; + RadarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + width: 2, + type: 'solid', + join: 'round' + }, + label: { + position: 'top' + }, + // areaStyle: { + // }, + // itemStyle: {} + symbolSize: 8 // symbolRotate: null + + }; + return RadarSeriesModel; + }(SeriesModel); + + var valueAxisDefault = axisDefault.value; + + function defaultsShow(opt, show) { + return defaults({ + show: show + }, opt); + } + + var RadarModel = + /** @class */ + function (_super) { + __extends(RadarModel, _super); + + function RadarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarModel.type; + return _this; + } + + RadarModel.prototype.optionUpdated = function () { + var boundaryGap = this.get('boundaryGap'); + var splitNumber = this.get('splitNumber'); + var scale = this.get('scale'); + var axisLine = this.get('axisLine'); + var axisTick = this.get('axisTick'); // let axisType = this.get('axisType'); + + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('axisName'); + var showName = this.get(['axisName', 'show']); + var nameFormatter = this.get(['axisName', 'formatter']); + var nameGap = this.get('axisNameGap'); + var triggerEvent = this.get('triggerEvent'); + var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { + indicatorOpt.min = 0; + } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { + indicatorOpt.max = 0; + } + + var iNameTextStyle = nameTextStyle; + + if (indicatorOpt.color != null) { + iNameTextStyle = defaults({ + color: indicatorOpt.color + }, nameTextStyle); + } // Use same configuration + + + var innerIndicatorOpt = merge(clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + // axisType: axisType, + axisLabel: axisLabel, + // Compatible with 2 and use text + name: indicatorOpt.text, + showName: showName, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: iNameTextStyle, + triggerEvent: triggerEvent + }, false); + + if (isString(nameFormatter)) { + var indName = innerIndicatorOpt.name; + innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); + } else if (isFunction(nameFormatter)) { + innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt); + } + + var model = new Model(innerIndicatorOpt, null, this.ecModel); + mixin(model, AxisModelCommonMixin.prototype); // For triggerEvent. + + model.mainType = 'radar'; + model.componentIndex = this.componentIndex; + return model; + }, this); + this._indicatorModels = indicatorModels; + }; + + RadarModel.prototype.getIndicatorModels = function () { + return this._indicatorModels; + }; + + RadarModel.type = 'radar'; + RadarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '75%', + startAngle: 90, + axisName: { + show: true // formatter: null + // textStyle: {} + + }, + boundaryGap: [0, 0], + splitNumber: 5, + axisNameGap: 15, + scale: false, + // Polygon or circle + shape: 'polygon', + axisLine: merge({ + lineStyle: { + color: '#bbb' + } + }, valueAxisDefault.axisLine), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + // axisType: 'value', + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + // {text, min, max} + indicator: [] + }; + return RadarModel; + }(ComponentModel); + + var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName']; + + var RadarView$1 = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + + this._buildSplitLineAndArea(radarModel); + }; + + RadarView.prototype._buildAxes = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = map(indicatorAxes, function (indicatorAxis) { + var axisName = indicatorAxis.model.get('showName') ? indicatorAxis.name : ''; // hide name + + var axisBuilder = new AxisBuilder(indicatorAxis.model, { + axisName: axisName, + position: [radar.cx, radar.cy], + rotation: indicatorAxis.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }); + return axisBuilder; + }); + each(axisBuilders, function (axisBuilder) { + each(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }; + + RadarView.prototype._buildSplitLineAndArea = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + + if (!indicatorAxes.length) { + return; + } + + var shape = radarModel.get('shape'); + var splitLineModel = radarModel.getModel('splitLine'); + var splitAreaModel = radarModel.getModel('splitArea'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var showSplitLine = splitLineModel.get('show'); + var showSplitArea = splitAreaModel.get('show'); + var splitLineColors = lineStyleModel.get('color'); + var splitAreaColors = areaStyleModel.get('color'); + var splitLineColorsArr = isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + var splitAreaColorsArr = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors]; + var splitLines = []; + var splitAreas = []; + + function getColorIndex(areaOrLine, areaOrLineColorList, idx) { + var colorIndex = idx % areaOrLineColorList.length; + areaOrLine[colorIndex] = areaOrLine[colorIndex] || []; + return colorIndex; + } + + if (shape === 'circle') { + var ticksRadius = indicatorAxes[0].getTicksCoords(); + var cx = radar.cx; + var cy = radar.cy; + + for (var i = 0; i < ticksRadius.length; i++) { + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i].coord + } + })); + } + + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i); + splitAreas[colorIndex].push(new Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i].coord, + r: ticksRadius[i + 1].coord + } + })); + } + } + } // Polyyon + else { + var realSplitNumber_1; + var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1); + return map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord.coord, idx); + }); + }); + var prevPoints = []; + + for (var i = 0; i <= realSplitNumber_1; i++) { + var points = []; + + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } // Close + + + if (points[0]) { + points.push(points[0].slice()); + } else { + if ("development" !== 'production') { + console.error('Can\'t draw value axis ' + i); + } + } + + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Polyline({ + shape: { + points: points + } + })); + } + + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1); + splitAreas[colorIndex].push(new Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); // Add splitArea before splitLine + + each(splitAreas, function (splitAreas, idx) { + this.group.add(mergePath$1(splitAreas, { + style: defaults({ + stroke: 'none', + fill: splitAreaColorsArr[idx % splitAreaColorsArr.length] + }, areaStyle), + silent: true + })); + }, this); + each(splitLines, function (splitLines, idx) { + this.group.add(mergePath$1(splitLines, { + style: defaults({ + fill: 'none', + stroke: splitLineColorsArr[idx % splitLineColorsArr.length] + }, lineStyle), + silent: true + })); + }, this); + }; + + RadarView.type = 'radar'; + return RadarView; + }(ComponentView); + + var IndicatorAxis = + /** @class */ + function (_super) { + __extends(IndicatorAxis, _super); + + function IndicatorAxis(dim, scale, radiusExtent) { + var _this = _super.call(this, dim, scale, radiusExtent) || this; + + _this.type = 'value'; + _this.angle = 0; + _this.name = ''; + return _this; + } + + return IndicatorAxis; + }(Axis); + + var Radar = + /** @class */ + function () { + function Radar(radarModel, ecModel, api) { + /** + * + * Radar dimensions + */ + this.dimensions = []; + this._model = radarModel; + this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale() // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale() + ); + indicatorAxis.name = indicatorModel.get('name'); // Inject model and axis + + indicatorAxis.model = indicatorModel; + indicatorModel.axis = indicatorAxis; + this.dimensions.push(dim); + return indicatorAxis; + }, this); + this.resize(radarModel, api); + } + + Radar.prototype.getIndicatorAxes = function () { + return this._indicatorAxes; + }; + + Radar.prototype.dataToPoint = function (value, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); + }; // TODO: API should be coordToPoint([coord, indicatorIndex]) + + + Radar.prototype.coordToPoint = function (coord, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + var angle = indicatorAxis.angle; + var x = this.cx + coord * Math.cos(angle); + var y = this.cy - coord * Math.sin(angle); + return [x, y]; + }; + + Radar.prototype.pointToData = function (pt) { + var dx = pt[0] - this.cx; + var dy = pt[1] - this.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx); // Find the closest angle + // FIXME index can calculated directly + + var minRadianDiff = Infinity; + var closestAxis; + var closestAxisIdx = -1; + + for (var i = 0; i < this._indicatorAxes.length; i++) { + var indicatorAxis = this._indicatorAxes[i]; + var diff = Math.abs(radian - indicatorAxis.angle); + + if (diff < minRadianDiff) { + closestAxis = indicatorAxis; + closestAxisIdx = i; + minRadianDiff = diff; + } + } + + return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))]; + }; + + Radar.prototype.resize = function (radarModel, api) { + var center = radarModel.get('center'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var viewSize = Math.min(viewWidth, viewHeight) / 2; + this.cx = parsePercent$1(center[0], viewWidth); + this.cy = parsePercent$1(center[1], viewHeight); + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']` + + var radius = radarModel.get('radius'); + + if (isString(radius) || isNumber(radius)) { + radius = [0, radius]; + } + + this.r0 = parsePercent$1(radius[0], viewSize); + this.r = parsePercent$1(radius[1], viewSize); + each(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(this.r0, this.r); + var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length; // Normalize to [-PI, PI] + + angle = Math.atan2(Math.sin(angle), Math.cos(angle)); + indicatorAxis.angle = angle; + }, this); + }; + + Radar.prototype.update = function (ecModel, api) { + var indicatorAxes = this._indicatorAxes; + var radarModel = this._model; + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' // @ts-ignore + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) { + return; + } + + var data = radarSeries.getData(); + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim)); + }); + }, this); + var splitNumber = radarModel.get('splitNumber'); + var dummyScale = new IntervalScale(); + dummyScale.setExtent(0, splitNumber); + dummyScale.setInterval(1); // Force all the axis fixing the maxSplitNumber. + + each(indicatorAxes, function (indicatorAxis, idx) { + alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale); + }); + }; + + Radar.prototype.convertToPixel = function (ecModel, finder, value) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + + Radar.create = function (ecModel, api) { + var radarList = []; + ecModel.eachComponent('radar', function (radarModel) { + var radar = new Radar(radarModel, ecModel, api); + radarList.push(radar); + radarModel.coordinateSystem = radar; + }); + ecModel.eachSeriesByType('radar', function (radarSeries) { + if (radarSeries.get('coordinateSystem') === 'radar') { + // Inject coordinate system + // @ts-ignore + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; + }; + /** + * Radar dimensions is based on the data + */ + + + Radar.dimensions = []; + return Radar; + }(); + + function install$7(registers) { + registers.registerCoordinateSystem('radar', Radar); + registers.registerComponentModel(RadarModel); + registers.registerComponentView(RadarView$1); + registers.registerVisual({ + seriesType: 'radar', + reset: function (seriesModel) { + var data = seriesModel.getData(); // itemVisual symbol is for selected data + + data.each(function (idx) { + data.setItemVisual(idx, 'legendIcon', 'roundRect'); + }); // visual is for unselected data + + data.setVisual('legendIcon', 'roundRect'); + } + }); + } + + function install$8(registers) { + use(install$7); + registers.registerChartView(RadarView); + registers.registerSeriesModel(RadarSeriesModel); + registers.registerLayout(radarLayout); + registers.registerProcessor(dataFilter('radar')); + registers.registerPreprocessor(radarBackwardCompat); + } + + var ATTR = '\0_ec_interaction_mutex'; + function take(zr, resourceKey, userKey) { + var store = getStore(zr); + store[resourceKey] = userKey; + } + function release(zr, resourceKey, userKey) { + var store = getStore(zr); + var uKey = store[resourceKey]; + + if (uKey === userKey) { + store[resourceKey] = null; + } + } + function isTaken(zr, resourceKey) { + return !!getStore(zr)[resourceKey]; + } + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + /** + * payload: { + * type: 'takeGlobalCursor', + * key: 'dataZoomSelect', or 'brush', or ..., + * If no userKey, release global cursor. + * } + */ + // TODO: SELF REGISTERED. + + + registerAction({ + type: 'takeGlobalCursor', + event: 'globalCursorTaken', + update: 'update' + }, noop); + + var RoamController = + /** @class */ + function (_super) { + __extends(RoamController, _super); + + function RoamController(zr) { + var _this = _super.call(this) || this; + + _this._zr = zr; // Avoid two roamController bind the same handler + + var mousedownHandler = bind(_this._mousedownHandler, _this); + var mousemoveHandler = bind(_this._mousemoveHandler, _this); + var mouseupHandler = bind(_this._mouseupHandler, _this); + var mousewheelHandler = bind(_this._mousewheelHandler, _this); + var pinchHandler = bind(_this._pinchHandler, _this); + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + */ + + _this.enable = function (controlType, opt) { + // Disable previous first + this.disable(); + this._opt = defaults(clone(opt) || {}, { + zoomOnMouseWheel: true, + moveOnMouseMove: true, + // By default, wheel do not trigger move. + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || controlType === 'move' || controlType === 'pan') { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + + if (controlType === true || controlType === 'scale' || controlType === 'zoom') { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + _this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + return _this; + } + + RoamController.prototype.isDragging = function () { + return this._dragging; + }; + + RoamController.prototype.isPinching = function () { + return this._pinching; + }; + + RoamController.prototype.setPointerChecker = function (pointerChecker) { + this.pointerChecker = pointerChecker; + }; + + RoamController.prototype.dispose = function () { + this.disable(); + }; + + RoamController.prototype._mousedownHandler = function (e) { + if (isMiddleOrRightButtonOnMouseUpDown(e)) { + return; + } + + var el = e.target; + + while (el) { + if (el.draggable) { + return; + } // check if host is draggable + + + el = el.__hostTarget || el.parent; + } + + var x = e.offsetX; + var y = e.offsetY; // Only check on mosedown, but not mousemove. + // Mouse can be out of target when mouse moving. + + if (this.pointerChecker && this.pointerChecker(e, x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + }; + + RoamController.prototype._mousemoveHandler = function (e) { + if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var oldX = this._x; + var oldY = this._y; + var dx = x - oldX; + var dy = y - oldY; + this._x = x; + this._y = y; + this._opt.preventDefaultMouseMove && stop(e.event); + trigger(this, 'pan', 'moveOnMouseMove', e, { + dx: dx, + dy: dy, + oldX: oldX, + oldY: oldY, + newX: x, + newY: y, + isAvailableBehavior: null + }); + }; + + RoamController.prototype._mouseupHandler = function (e) { + if (!isMiddleOrRightButtonOnMouseUpDown(e)) { + this._dragging = false; + } + }; + + RoamController.prototype._mousewheelHandler = function (e) { + var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt); + var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt); + var wheelDelta = e.wheelDelta; + var absWheelDeltaDelta = Math.abs(wheelDelta); + var originX = e.offsetX; + var originY = e.offsetY; // wheelDelta maybe -0 in chrome mac. + + if (wheelDelta === 0 || !shouldZoom && !shouldMove) { + return; + } // If both `shouldZoom` and `shouldMove` is true, trigger + // their event both, and the final behavior is determined + // by event listener themselves. + + + if (shouldZoom) { + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + // FIXME: Should do more test in different environment. + // wheelDelta is too complicated in difference nvironment + // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel), + // although it has been normallized by zrender. + // wheelDelta of mouse wheel is bigger than touch pad. + var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; + var scale = wheelDelta > 0 ? factor : 1 / factor; + checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, { + scale: scale, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + + if (shouldMove) { + // FIXME: Should do more test in different environment. + var absDelta = Math.abs(wheelDelta); // wheelDelta of mouse wheel is bigger than touch pad. + + var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); + checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, { + scrollDelta: scrollDelta, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + }; + + RoamController.prototype._pinchHandler = function (e) { + if (isTaken(this._zr, 'globalPan')) { + return; + } + + var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + checkPointerAndTrigger(this, 'zoom', null, e, { + scale: scale, + originX: e.pinchX, + originY: e.pinchY, + isAvailableBehavior: null + }); + }; + + return RoamController; + }(Eventful); + + function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { + // When mouse is out of roamController rect, + // default befavoius should not be be disabled, otherwise + // page sliding is disabled, contrary to expectation. + stop(e.event); + trigger(controller, eventName, behaviorToCheck, e, contollerEvent); + } + } + + function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + // Also provide behavior checker for event listener, for some case that + // multiple components share one listener. + contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e); // TODO should not have type issue. + + controller.trigger(eventName, contollerEvent); + } // settings: { + // zoomOnMouseWheel + // moveOnMouseMove + // moveOnMouseWheel + // } + // The value can be: true / false / 'shift' / 'ctrl' / 'alt'. + + + function isAvailableBehavior(behaviorToCheck, e, settings) { + var setting = settings[behaviorToCheck]; + return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']); + } + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * For geo and graph. + */ + function updateViewOnPan(controllerHost, dx, dy) { + var target = controllerHost.target; + target.x += dx; + target.y += dy; + target.dirty(); + } + /** + * For geo and graph. + */ + + function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { + var target = controllerHost.target; + var zoomLimit = controllerHost.zoomLimit; + var newZoom = controllerHost.zoom = controllerHost.zoom || 1; + newZoom *= zoomDelta; + + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); + } + + var zoomScale = newZoom / controllerHost.zoom; + controllerHost.zoom = newZoom; // Keep the mouse center when scaling + + target.x -= (zoomX - target.x) * (zoomScale - 1); + target.y -= (zoomY - target.y) * (zoomScale - 1); + target.scaleX *= zoomScale; + target.scaleY *= zoomScale; + target.dirty(); + } + + /* + * 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. + */ + + /* + * 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. + */ + var IRRELEVANT_EXCLUDES = { + 'axisPointer': 1, + 'tooltip': 1, + 'brush': 1 + }; + /** + * Avoid that: mouse click on a elements that is over geo or graph, + * but roam is triggered. + */ + + function onIrrelevantElement(e, api, targetCoordSysModel) { + var model = api.getComponentByElement(e.topTarget); // If model is axisModel, it works only if it is injected with coordinateSystem. + + var coordSys = model && model.coordinateSystem; + return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel; + } + + function parseXML(svg) { + if (isString(svg)) { + var parser = new DOMParser(); + svg = parser.parseFromString(svg, 'text/xml'); + } + var svgNode = svg; + if (svgNode.nodeType === 9) { + svgNode = svgNode.firstChild; + } + while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) { + svgNode = svgNode.nextSibling; + } + return svgNode; + } + + var nodeParsers; + var INHERITABLE_STYLE_ATTRIBUTES_MAP = { + 'fill': 'fill', + 'stroke': 'stroke', + 'stroke-width': 'lineWidth', + 'opacity': 'opacity', + 'fill-opacity': 'fillOpacity', + 'stroke-opacity': 'strokeOpacity', + 'stroke-dasharray': 'lineDash', + 'stroke-dashoffset': 'lineDashOffset', + 'stroke-linecap': 'lineCap', + 'stroke-linejoin': 'lineJoin', + 'stroke-miterlimit': 'miterLimit', + 'font-family': 'fontFamily', + 'font-size': 'fontSize', + 'font-style': 'fontStyle', + 'font-weight': 'fontWeight', + 'text-anchor': 'textAlign', + 'visibility': 'visibility', + 'display': 'display' + }; + var INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP); + var SELF_STYLE_ATTRIBUTES_MAP = { + 'alignment-baseline': 'textBaseline', + 'stop-color': 'stopColor' + }; + var SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP); + var SVGParser = (function () { + function SVGParser() { + this._defs = {}; + this._root = null; + } + SVGParser.prototype.parse = function (xml, opt) { + opt = opt || {}; + var svg = parseXML(xml); + if ("development" !== 'production') { + if (!svg) { + throw new Error('Illegal svg'); + } + } + this._defsUsePending = []; + var root = new Group(); + this._root = root; + var named = []; + var viewBox = svg.getAttribute('viewBox') || ''; + var width = parseFloat((svg.getAttribute('width') || opt.width)); + var height = parseFloat((svg.getAttribute('height') || opt.height)); + isNaN(width) && (width = null); + isNaN(height) && (height = null); + parseAttributes(svg, root, null, true, false); + var child = svg.firstChild; + while (child) { + this._parseNode(child, root, named, null, false, false); + child = child.nextSibling; + } + applyDefs(this._defs, this._defsUsePending); + this._defsUsePending = []; + var viewBoxRect; + var viewBoxTransform; + if (viewBox) { + var viewBoxArr = splitNumberSequence(viewBox); + if (viewBoxArr.length >= 4) { + viewBoxRect = { + x: parseFloat((viewBoxArr[0] || 0)), + y: parseFloat((viewBoxArr[1] || 0)), + width: parseFloat(viewBoxArr[2]), + height: parseFloat(viewBoxArr[3]) + }; + } + } + if (viewBoxRect && width != null && height != null) { + viewBoxTransform = makeViewBoxTransform(viewBoxRect, { x: 0, y: 0, width: width, height: height }); + if (!opt.ignoreViewBox) { + var elRoot = root; + root = new Group(); + root.add(elRoot); + elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale; + elRoot.x = viewBoxTransform.x; + elRoot.y = viewBoxTransform.y; + } + } + if (!opt.ignoreRootClip && width != null && height != null) { + root.setClipPath(new Rect({ + shape: { x: 0, y: 0, width: width, height: height } + })); + } + return { + root: root, + width: width, + height: height, + viewBoxRect: viewBoxRect, + viewBoxTransform: viewBoxTransform, + named: named + }; + }; + SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) { + var nodeName = xmlNode.nodeName.toLowerCase(); + var el; + var namedFromForSub = namedFrom; + if (nodeName === 'defs') { + isInDefs = true; + } + if (nodeName === 'text') { + isInText = true; + } + if (nodeName === 'defs' || nodeName === 'switch') { + el = parentGroup; + } + else { + if (!isInDefs) { + var parser_1 = nodeParsers[nodeName]; + if (parser_1 && hasOwn(nodeParsers, nodeName)) { + el = parser_1.call(this, xmlNode, parentGroup); + var nameAttr = xmlNode.getAttribute('name'); + if (nameAttr) { + var newNamed = { + name: nameAttr, + namedFrom: null, + svgNodeTagLower: nodeName, + el: el + }; + named.push(newNamed); + if (nodeName === 'g') { + namedFromForSub = newNamed; + } + } + else if (namedFrom) { + named.push({ + name: namedFrom.name, + namedFrom: namedFrom, + svgNodeTagLower: nodeName, + el: el + }); + } + parentGroup.add(el); + } + } + var parser = paintServerParsers[nodeName]; + if (parser && hasOwn(paintServerParsers, nodeName)) { + var def = parser.call(this, xmlNode); + var id = xmlNode.getAttribute('id'); + if (id) { + this._defs[id] = def; + } + } + } + if (el && el.isGroup) { + var child = xmlNode.firstChild; + while (child) { + if (child.nodeType === 1) { + this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText); + } + else if (child.nodeType === 3 && isInText) { + this._parseText(child, el); + } + child = child.nextSibling; + } + } + }; + SVGParser.prototype._parseText = function (xmlNode, parentGroup) { + var text = new TSpan({ + style: { + text: xmlNode.textContent + }, + silent: true, + x: this._textX || 0, + y: this._textY || 0 + }); + inheritStyle(parentGroup, text); + parseAttributes(xmlNode, text, this._defsUsePending, false, false); + applyTextAlignment(text, parentGroup); + var textStyle = text.style; + var fontSize = textStyle.fontSize; + if (fontSize && fontSize < 9) { + textStyle.fontSize = 9; + text.scaleX *= fontSize / 9; + text.scaleY *= fontSize / 9; + } + var font = (textStyle.fontSize || textStyle.fontFamily) && [ + textStyle.fontStyle, + textStyle.fontWeight, + (textStyle.fontSize || 12) + 'px', + textStyle.fontFamily || 'sans-serif' + ].join(' '); + textStyle.font = font; + var rect = text.getBoundingRect(); + this._textX += rect.width; + parentGroup.add(text); + return text; + }; + SVGParser.internalField = (function () { + nodeParsers = { + 'g': function (xmlNode, parentGroup) { + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, false); + return g; + }, + 'rect': function (xmlNode, parentGroup) { + var rect = new Rect(); + inheritStyle(parentGroup, rect); + parseAttributes(xmlNode, rect, this._defsUsePending, false, false); + rect.setShape({ + x: parseFloat(xmlNode.getAttribute('x') || '0'), + y: parseFloat(xmlNode.getAttribute('y') || '0'), + width: parseFloat(xmlNode.getAttribute('width') || '0'), + height: parseFloat(xmlNode.getAttribute('height') || '0') + }); + rect.silent = true; + return rect; + }, + 'circle': function (xmlNode, parentGroup) { + var circle = new Circle(); + inheritStyle(parentGroup, circle); + parseAttributes(xmlNode, circle, this._defsUsePending, false, false); + circle.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + r: parseFloat(xmlNode.getAttribute('r') || '0') + }); + circle.silent = true; + return circle; + }, + 'line': function (xmlNode, parentGroup) { + var line = new Line(); + inheritStyle(parentGroup, line); + parseAttributes(xmlNode, line, this._defsUsePending, false, false); + line.setShape({ + x1: parseFloat(xmlNode.getAttribute('x1') || '0'), + y1: parseFloat(xmlNode.getAttribute('y1') || '0'), + x2: parseFloat(xmlNode.getAttribute('x2') || '0'), + y2: parseFloat(xmlNode.getAttribute('y2') || '0') + }); + line.silent = true; + return line; + }, + 'ellipse': function (xmlNode, parentGroup) { + var ellipse = new Ellipse(); + inheritStyle(parentGroup, ellipse); + parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false); + ellipse.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + rx: parseFloat(xmlNode.getAttribute('rx') || '0'), + ry: parseFloat(xmlNode.getAttribute('ry') || '0') + }); + ellipse.silent = true; + return ellipse; + }, + 'polygon': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polygon = new Polygon({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polygon); + parseAttributes(xmlNode, polygon, this._defsUsePending, false, false); + return polygon; + }, + 'polyline': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polyline = new Polyline({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polyline); + parseAttributes(xmlNode, polyline, this._defsUsePending, false, false); + return polyline; + }, + 'image': function (xmlNode, parentGroup) { + var img = new ZRImage(); + inheritStyle(parentGroup, img); + parseAttributes(xmlNode, img, this._defsUsePending, false, false); + img.setStyle({ + image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'), + x: +xmlNode.getAttribute('x'), + y: +xmlNode.getAttribute('y'), + width: +xmlNode.getAttribute('width'), + height: +xmlNode.getAttribute('height') + }); + img.silent = true; + return img; + }, + 'text': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x') || '0'; + var y = xmlNode.getAttribute('y') || '0'; + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + this._textX = parseFloat(x) + parseFloat(dx); + this._textY = parseFloat(y) + parseFloat(dy); + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + return g; + }, + 'tspan': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x'); + var y = xmlNode.getAttribute('y'); + if (x != null) { + this._textX = parseFloat(x); + } + if (y != null) { + this._textY = parseFloat(y); + } + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + this._textX += parseFloat(dx); + this._textY += parseFloat(dy); + return g; + }, + 'path': function (xmlNode, parentGroup) { + var d = xmlNode.getAttribute('d') || ''; + var path = createFromString(d); + inheritStyle(parentGroup, path); + parseAttributes(xmlNode, path, this._defsUsePending, false, false); + path.silent = true; + return path; + } + }; + })(); + return SVGParser; + }()); + var paintServerParsers = { + 'lineargradient': function (xmlNode) { + var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10); + var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10); + var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10); + var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10); + var gradient = new LinearGradient(x1, y1, x2, y2); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + }, + 'radialgradient': function (xmlNode) { + var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10); + var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10); + var r = parseInt(xmlNode.getAttribute('r') || '0', 10); + var gradient = new RadialGradient(cx, cy, r); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + } + }; + function parsePaintServerUnit(xmlNode, gradient) { + var gradientUnits = xmlNode.getAttribute('gradientUnits'); + if (gradientUnits === 'userSpaceOnUse') { + gradient.global = true; + } + } + function parseGradientColorStops(xmlNode, gradient) { + var stop = xmlNode.firstChild; + while (stop) { + if (stop.nodeType === 1 + && stop.nodeName.toLocaleLowerCase() === 'stop') { + var offsetStr = stop.getAttribute('offset'); + var offset = void 0; + if (offsetStr && offsetStr.indexOf('%') > 0) { + offset = parseInt(offsetStr, 10) / 100; + } + else if (offsetStr) { + offset = parseFloat(offsetStr); + } + else { + offset = 0; + } + var styleVals = {}; + parseInlineStyle(stop, styleVals, styleVals); + var stopColor = styleVals.stopColor + || stop.getAttribute('stop-color') + || '#000000'; + gradient.colorStops.push({ + offset: offset, + color: stopColor + }); + } + stop = stop.nextSibling; + } + } + function inheritStyle(parent, child) { + if (parent && parent.__inheritedStyle) { + if (!child.__inheritedStyle) { + child.__inheritedStyle = {}; + } + defaults(child.__inheritedStyle, parent.__inheritedStyle); + } + } + function parsePoints(pointsString) { + var list = splitNumberSequence(pointsString); + var points = []; + for (var i = 0; i < list.length; i += 2) { + var x = parseFloat(list[i]); + var y = parseFloat(list[i + 1]); + points.push([x, y]); + } + return points; + } + function parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) { + var disp = el; + var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {}; + var selfStyle = {}; + if (xmlNode.nodeType === 1) { + parseTransformAttribute(xmlNode, el); + parseInlineStyle(xmlNode, inheritedStyle, selfStyle); + if (!onlyInlineStyle) { + parseAttributeStyle(xmlNode, inheritedStyle, selfStyle); + } + } + disp.style = disp.style || {}; + if (inheritedStyle.fill != null) { + disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending); + } + if (inheritedStyle.stroke != null) { + disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending); + } + each([ + 'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = parseFloat(inheritedStyle[propName]); + } + }); + each([ + 'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = inheritedStyle[propName]; + } + }); + if (isTextGroup) { + disp.__selfStyle = selfStyle; + } + if (inheritedStyle.lineDash) { + disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) { + return parseFloat(str); + }); + } + if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') { + disp.invisible = true; + } + if (inheritedStyle.display === 'none') { + disp.ignore = true; + } + } + function applyTextAlignment(text, parentGroup) { + var parentSelfStyle = parentGroup.__selfStyle; + if (parentSelfStyle) { + var textBaseline = parentSelfStyle.textBaseline; + var zrTextBaseline = textBaseline; + if (!textBaseline || textBaseline === 'auto') { + zrTextBaseline = 'alphabetic'; + } + else if (textBaseline === 'baseline') { + zrTextBaseline = 'alphabetic'; + } + else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') { + zrTextBaseline = 'top'; + } + else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') { + zrTextBaseline = 'bottom'; + } + else if (textBaseline === 'central' || textBaseline === 'mathematical') { + zrTextBaseline = 'middle'; + } + text.style.textBaseline = zrTextBaseline; + } + var parentInheritedStyle = parentGroup.__inheritedStyle; + if (parentInheritedStyle) { + var textAlign = parentInheritedStyle.textAlign; + var zrTextAlign = textAlign; + if (textAlign) { + if (textAlign === 'middle') { + zrTextAlign = 'center'; + } + text.style.textAlign = zrTextAlign; + } + } + } + var urlRegex = /^url\(\s*#(.*?)\)/; + function getFillStrokeStyle(el, method, str, defsUsePending) { + var urlMatch = str && str.match(urlRegex); + if (urlMatch) { + var url = trim(urlMatch[1]); + defsUsePending.push([el, method, url]); + return; + } + if (str === 'none') { + str = null; + } + return str; + } + function applyDefs(defs, defsUsePending) { + for (var i = 0; i < defsUsePending.length; i++) { + var item = defsUsePending[i]; + item[0].style[item[1]] = defs[item[2]]; + } + } + var numberReg$1 = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + function splitNumberSequence(rawStr) { + return rawStr.match(numberReg$1) || []; + } + var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g; + var DEGREE_TO_ANGLE = Math.PI / 180; + function parseTransformAttribute(xmlNode, node) { + var transform = xmlNode.getAttribute('transform'); + if (transform) { + transform = transform.replace(/,/g, ' '); + var transformOps_1 = []; + var mt = null; + transform.replace(transformRegex, function (str, type, value) { + transformOps_1.push(type, value); + return ''; + }); + for (var i = transformOps_1.length - 1; i > 0; i -= 2) { + var value = transformOps_1[i]; + var type = transformOps_1[i - 1]; + var valueArr = splitNumberSequence(value); + mt = mt || create$1(); + switch (type) { + case 'translate': + translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]); + break; + case 'scale': + scale$1(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]); + break; + case 'rotate': + rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + break; + case 'skewX': + var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, 0, sx, 1, 0, 0], mt); + break; + case 'skewY': + var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, sy, 0, 1, 0, 0], mt); + break; + case 'matrix': + mt[0] = parseFloat(valueArr[0]); + mt[1] = parseFloat(valueArr[1]); + mt[2] = parseFloat(valueArr[2]); + mt[3] = parseFloat(valueArr[3]); + mt[4] = parseFloat(valueArr[4]); + mt[5] = parseFloat(valueArr[5]); + break; + } + } + node.setLocalTransform(mt); + } + } + var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g; + function parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + var style = xmlNode.getAttribute('style'); + if (!style) { + return; + } + styleRegex.lastIndex = 0; + var styleRegResult; + while ((styleRegResult = styleRegex.exec(style)) != null) { + var svgStlAttr = styleRegResult[1]; + var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrInheritableStlAttr) { + inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2]; + } + var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrSelfStlAttr) { + selfStyleResult[zrSelfStlAttr] = styleRegResult[2]; + } + } + } + function parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + } + function makeViewBoxTransform(viewBoxRect, boundingRect) { + var scaleX = boundingRect.width / viewBoxRect.width; + var scaleY = boundingRect.height / viewBoxRect.height; + var scale = Math.min(scaleX, scaleY); + return { + scale: scale, + x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2), + y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2) + }; + } + function parseSVG(xml, opt) { + var parser = new SVGParser(); + return parser.parse(xml, opt); + } + + /** + * "region available" means that: enable users to set attribute `name="xxx"` on those tags + * to make it be a region. + * 1. region styles and its label styles can be defined in echarts opton: + * ```js + * geo: { + * regions: [{ + * name: 'xxx', + * itemStyle: { ... }, + * label: { ... } + * }, { + * ... + * }, + * ...] + * }; + * ``` + * 2. name can be duplicated in different SVG tag. All of the tags with the same name share + * a region option. For exampel if there are two representing two lung lobes. They have + * no common parents but both of them need to display label "lung" inside. + */ + + var REGION_AVAILABLE_SVG_TAG_MAP = createHashMap(['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path', // are also enabled because some SVG might paint text itself, + // but still need to trigger events or tooltip. + 'text', 'tspan', // is also enabled because this case: if multiple tags share one name + // and need label displayed, every tags will display the name, which is not + // expected. So we can put them into a . Thereby only one label + // displayed and located based on the bounding rect of the . + 'g']); + + var GeoSVGResource = + /** @class */ + function () { + function GeoSVGResource(mapName, svg) { + this.type = 'geoSVG'; // All used graphics. key: hostKey, value: root + + this._usedGraphicMap = createHashMap(); // All unused graphics. + + this._freedGraphics = []; + this._mapName = mapName; // Only perform parse to XML object here, which might be time + // consiming for large SVG. + // Although convert XML to zrender element is also time consiming, + // if we do it here, the clone of zrender elements has to be + // required. So we do it once for each geo instance, util real + // performance issues call for optimizing it. + + this._parsedXML = parseXML(svg); + } + + GeoSVGResource.prototype.load = function () + /* nameMap: NameMap */ + { + // In the "load" stage, graphic need to be built to + // get boundingRect for geo coordinate system. + var firstGraphic = this._firstGraphic; // Create the return data structure only when first graphic created. + // Because they will be used in geo coordinate system update stage, + // and `regions` will be mounted at `geo` coordinate system, + // in which there is no "view" info, so that it should better not to + // make references to graphic elements. + + if (!firstGraphic) { + firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML); + + this._freedGraphics.push(firstGraphic); + + this._boundingRect = this._firstGraphic.boundingRect.clone(); // PENDING: `nameMap` will not be supported until some real requirement come. + // if (nameMap) { + // named = applyNameMap(named, nameMap); + // } + + var _a = createRegions(firstGraphic.named), + regions = _a.regions, + regionsMap = _a.regionsMap; + + this._regions = regions; + this._regionsMap = regionsMap; + } + + return { + boundingRect: this._boundingRect, + regions: this._regions, + regionsMap: this._regionsMap + }; + }; + + GeoSVGResource.prototype._buildGraphic = function (svgXML) { + var result; + var rootFromParse; + + try { + result = svgXML && parseSVG(svgXML, { + ignoreViewBox: true, + ignoreRootClip: true + }) || {}; + rootFromParse = result.root; + assert(rootFromParse != null); + } catch (e) { + throw new Error('Invalid svg format\n' + e.message); + } // Note: we keep the covenant that the root has no transform. So always add an extra root. + + + var root = new Group(); + root.add(rootFromParse); + root.isGeoSVGGraphicRoot = true; // [THE_RULE_OF_VIEWPORT_AND_VIEWBOX] + // + // Consider: `` + // - the `width/height` we call it `svgWidth/svgHeight` for short. + // - `(0, 0, svgWidth, svgHeight)` defines the viewport of the SVG, or say, + // "viewport boundingRect", or `boundingRect` for short. + // - `viewBox` defines the transform from the real content ot the viewport. + // `viewBox` has the same unit as the content of SVG. + // If `viewBox` exists, a transform is defined, so the unit of `svgWidth/svgHeight` become + // different from the content of SVG. Otherwise, they are the same. + // + // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be: + // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']). + // 1. Make a transform from `viewBox` to `boundingRect`. + // Note: only support `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve + // the aspect ratio. + // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect']) + // (`Geo`/`View` will do this job). + // Note: this transform might not preserve aspect radio, which depending on how users specify + // viewRect in echarts option (e.g., `geo.left/top/width/height` will not preserve aspect ratio, + // but `geo.layoutCenter/layoutSize` will preserve aspect ratio). + // + // If `svgWidth/svgHeight` not specified, we use `viewBox` as the `boundingRect` to make the SVG + // layout look good. + // + // If neither `svgWidth/svgHeight` nor `viewBox` are not specified, we calculate the boundingRect + // of the SVG content and use them to make SVG layout look good. + + var svgWidth = result.width; + var svgHeight = result.height; + var viewBoxRect = result.viewBoxRect; + var boundingRect = this._boundingRect; + + if (!boundingRect) { + var bRectX = void 0; + var bRectY = void 0; + var bRectWidth = void 0; + var bRectHeight = void 0; + + if (svgWidth != null) { + bRectX = 0; + bRectWidth = svgWidth; + } else if (viewBoxRect) { + bRectX = viewBoxRect.x; + bRectWidth = viewBoxRect.width; + } + + if (svgHeight != null) { + bRectY = 0; + bRectHeight = svgHeight; + } else if (viewBoxRect) { + bRectY = viewBoxRect.y; + bRectHeight = viewBoxRect.height; + } // If both viewBox and svgWidth/svgHeight not specified, + // we have to determine how to layout those element to make them look good. + + + if (bRectX == null || bRectY == null) { + var calculatedBoundingRect = rootFromParse.getBoundingRect(); + + if (bRectX == null) { + bRectX = calculatedBoundingRect.x; + bRectWidth = calculatedBoundingRect.width; + } + + if (bRectY == null) { + bRectY = calculatedBoundingRect.y; + bRectHeight = calculatedBoundingRect.height; + } + } + + boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight); + } + + if (viewBoxRect) { + var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect); // Only support `preserveAspectRatio 'xMidYMid'` + + rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale; + rootFromParse.x = viewBoxTransform.x; + rootFromParse.y = viewBoxTransform.y; + } // SVG needs to clip based on `viewBox`. And some SVG files really rely on this feature. + // They do not strictly confine all of the content inside a display rect, but deliberately + // use a `viewBox` to define a displayable rect. + // PENDING: + // The drawback of the `setClipPath` here is: the region label (genereted by echarts) near the + // edge might also be clipped, because region labels are put as `textContent` of the SVG path. + + + root.setClipPath(new Rect({ + shape: boundingRect.plain() + })); + var named = []; + each(result.named, function (namedItem) { + if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) { + named.push(namedItem); + setSilent(namedItem.el); + } + }); + return { + root: root, + boundingRect: boundingRect, + named: named + }; + }; + /** + * Consider: + * (1) One graphic element can not be shared by different `geoView` running simultaneously. + * Notice, also need to consider multiple echarts instances share a `mapRecord`. + * (2) Converting SVG to graphic elements is time consuming. + * (3) In the current architecture, `load` should be called frequently to get boundingRect, + * and it is called without view info. + * So we maintain graphic elements in this module, and enables `view` to use/return these + * graphics from/to the pool with it's uid. + */ + + + GeoSVGResource.prototype.useGraphic = function (hostKey + /* , nameMap: NameMap */ + ) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + return svgGraphic; + } + + svgGraphic = this._freedGraphics.pop() // use the first boundingRect to avoid duplicated boundingRect calculation. + || this._buildGraphic(this._parsedXML); + usedRootMap.set(hostKey, svgGraphic); // PENDING: `nameMap` will not be supported until some real requirement come. + // `nameMap` can only be obtained from echarts option. + // The original `named` must not be modified. + // if (nameMap) { + // svgGraphic = extend({}, svgGraphic); + // svgGraphic.named = applyNameMap(svgGraphic.named, nameMap); + // } + + return svgGraphic; + }; + + GeoSVGResource.prototype.freeGraphic = function (hostKey) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + usedRootMap.removeKey(hostKey); + + this._freedGraphics.push(svgGraphic); + } + }; + + return GeoSVGResource; + }(); + + function setSilent(el) { + // Only named element has silent: false, other elements should + // act as background and has no user interaction. + el.silent = false; // text|tspan will be converted to group. + + if (el.isGroup) { + el.traverse(function (child) { + child.silent = false; + }); + } + } + + function createRegions(named) { + var regions = []; + var regionsMap = createHashMap(); // Create resions only for the first graphic. + + each(named, function (namedItem) { + // Region has feature to calculate center for tooltip or other features. + // If there is a , the center should be the center of the + // bounding rect of the g. + if (namedItem.namedFrom != null) { + return; + } + + var region = new GeoSVGRegion(namedItem.name, namedItem.el); // PENDING: if `nameMap` supported, this region can not be mounted on + // `this`, but can only be created each time `load()` called. + + regions.push(region); // PENDING: if multiple tag named with the same name, only one will be + // found by `_regionsMap`. `_regionsMap` is used to find a coordinate + // by name. We use `region.getCenter()` as the coordinate. + + regionsMap.set(namedItem.name, region); + }); + return { + regions: regions, + regionsMap: regionsMap + }; + } // PENDING: `nameMap` will not be supported until some real requirement come. + // /** + // * Use the alias in geoNameMap. + // * The input `named` must not be modified. + // */ + // function applyNameMap( + // named: GeoSVGGraphicRecord['named'], + // nameMap: NameMap + // ): GeoSVGGraphicRecord['named'] { + // const result = [] as GeoSVGGraphicRecord['named']; + // for (let i = 0; i < named.length; i++) { + // let regionGraphic = named[i]; + // const name = regionGraphic.name; + // if (nameMap && nameMap.hasOwnProperty(name)) { + // regionGraphic = extend({}, regionGraphic); + // regionGraphic.name = name; + // } + // result.push(regionGraphic); + // } + // return result; + // } + + var geoCoord = [126, 25]; + var nanhaiName = '南海诸岛'; + var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]]; + + for (var i = 0; i < points$1.length; i++) { + for (var k = 0; k < points$1[i].length; k++) { + points$1[i][k][0] /= 10.5; + points$1[i][k][1] /= -10.5 / 0.75; + points$1[i][k][0] += geoCoord[0]; + points$1[i][k][1] += geoCoord[1]; + } + } + + function fixNanhai(mapType, regions) { + if (mapType === 'china') { + for (var i = 0; i < regions.length; i++) { + // Already exists. + if (regions[i].name === nanhaiName) { + return; + } + } + + regions.push(new GeoJSONRegion(nanhaiName, map(points$1, function (exterior) { + return { + type: 'polygon', + exterior: exterior + }; + }), geoCoord)); + } + } + + /* + * 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. + */ + + /* + * 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. + */ + var coordsOffsetMap = { + '南海诸岛': [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + // '北京': [-10, 0], + '天津': [5, 5] + }; + function fixTextCoords(mapType, region) { + if (mapType === 'china') { + var coordFix = coordsOffsetMap[region.name]; + + if (coordFix) { + var cp = region.getCenter(); + cp[0] += coordFix[0] / 10.5; + cp[1] += -coordFix[1] / (10.5 / 0.75); + region.setCenter(cp); + } + } + } + + /* + * 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. + */ + + /* + * 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. + */ + // Fix for 钓鱼岛 + // let Region = require('../Region'); + // let zrUtil = require('zrender/lib/core/util'); + // let geoCoord = [126, 25]; + var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; + function fixDiaoyuIsland(mapType, region) { + if (mapType === 'china' && region.name === '台湾') { + region.geometries.push({ + type: 'polygon', + exterior: points$2[0] + }); + } + } + + var DEFAULT_NAME_PROPERTY = 'name'; + + var GeoJSONResource = + /** @class */ + function () { + function GeoJSONResource(mapName, geoJSON, specialAreas) { + this.type = 'geoJSON'; + this._parsedMap = createHashMap(); + this._mapName = mapName; + this._specialAreas = specialAreas; // PENDING: delay the parse to the first usage to rapid up the FMP? + + this._geoJSON = parseInput(geoJSON); + } + /** + * @param nameMap can be null/undefined + * @param nameProperty can be null/undefined + */ + + + GeoJSONResource.prototype.load = function (nameMap, nameProperty) { + nameProperty = nameProperty || DEFAULT_NAME_PROPERTY; + + var parsed = this._parsedMap.get(nameProperty); + + if (!parsed) { + var rawRegions = this._parseToRegions(nameProperty); + + parsed = this._parsedMap.set(nameProperty, { + regions: rawRegions, + boundingRect: calculateBoundingRect(rawRegions) + }); + } + + var regionsMap = createHashMap(); + var finalRegions = []; + each(parsed.regions, function (region) { + var regionName = region.name; // Try use the alias in geoNameMap + + if (nameMap && hasOwn(nameMap, regionName)) { + region = region.cloneShallow(regionName = nameMap[regionName]); + } + + finalRegions.push(region); + regionsMap.set(regionName, region); + }); + return { + regions: finalRegions, + boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0), + regionsMap: regionsMap + }; + }; + + GeoJSONResource.prototype._parseToRegions = function (nameProperty) { + var mapName = this._mapName; + var geoJSON = this._geoJSON; + var rawRegions; // https://jsperf.com/try-catch-performance-overhead + + try { + rawRegions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : []; + } catch (e) { + throw new Error('Invalid geoJson format\n' + e.message); + } + + fixNanhai(mapName, rawRegions); + each(rawRegions, function (region) { + var regionName = region.name; + fixTextCoords(mapName, region); + fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed + // to look better + + var specialArea = this._specialAreas && this._specialAreas[regionName]; + + if (specialArea) { + region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); + } + }, this); + return rawRegions; + }; + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + + + GeoJSONResource.prototype.getMapForUser = function () { + return { + // For backward compatibility, use geoJson + // PENDING: it has been returning them without clone. + // do we need to avoid outsite modification? + geoJson: this._geoJSON, + geoJSON: this._geoJSON, + specialAreas: this._specialAreas + }; + }; + + return GeoJSONResource; + }(); + + function calculateBoundingRect(regions) { + var rect; + + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + + return rect; + } + + function parseInput(source) { + return !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')(); + } + + var storage = createHashMap(); + var geoSourceManager = { + /** + * Compatible with previous `echarts.registerMap`. + * + * @usage + * ```js + * + * echarts.registerMap('USA', geoJson, specialAreas); + * + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {...} + * }); + * echarts.registerMap('USA', { + * geoJSON: geoJson, + * specialAreas: {...} + * }); + * + * echarts.registerMap('airport', { + * svg: svg + * } + * ``` + * + * Note: + * Do not support that register multiple geoJSON or SVG + * one map name. Because different geoJSON and SVG have + * different unit. It's not easy to make sure how those + * units are mapping/normalize. + * If intending to use multiple geoJSON or SVG, we can + * use multiple geo coordinate system. + */ + registerMap: function (mapName, rawDef, rawSpecialAreas) { + if (rawDef.svg) { + var resource = new GeoSVGResource(mapName, rawDef.svg); + storage.set(mapName, resource); + } else { + // Recommend: + // echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx }); + // Backward compatibility: + // echarts.registerMap('eu', geoJSON, specialAreas); + // echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx }); + var geoJSON = rawDef.geoJson || rawDef.geoJSON; + + if (geoJSON && !rawDef.features) { + rawSpecialAreas = rawDef.specialAreas; + } else { + geoJSON = rawDef; + } + + var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas); + storage.set(mapName, resource); + } + }, + getGeoResource: function (mapName) { + return storage.get(mapName); + }, + + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + getMapForUser: function (mapName) { + var resource = storage.get(mapName); // Do not support return SVG until some real requirement come. + + return resource && resource.type === 'geoJSON' && resource.getMapForUser(); + }, + load: function (mapName, nameMap, nameProperty) { + var resource = storage.get(mapName); + + if (!resource) { + if ("development" !== 'production') { + console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.'); + } + + return; + } + + return resource.load(nameMap, nameProperty); + } + }; + + /** + * Only these tags enable use `itemStyle` if they are named in SVG. + * Other tags like might not suitable for `itemStyle`. + * They will not be considered to be styled until some requirements come. + */ + + var OPTION_STYLE_ENABLED_TAGS = ['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path']; + var OPTION_STYLE_ENABLED_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS); + var STATE_TRIGGER_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var LABEL_HOST_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var mapLabelRaw = makeInner(); + + function getFixedItemStyle(model) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); // If user want the color not to be changed when hover, + // they should both set areaColor and color to be null. + + if (areaColor != null) { + itemStyle.fill = areaColor; + } + + return itemStyle; + } // Only stroke can be used for line. + // Using fill in style if stroke not exits. + // TODO Not sure yet. Perhaps a separate `lineStyle`? + + + function fixLineStyle(styleHost) { + var style = styleHost.style; + + if (style) { + style.stroke = style.stroke || style.fill; + style.fill = null; + } + } + + var MapDraw = + /** @class */ + function () { + function MapDraw(api) { + var group = new Group(); + this.uid = getUID('ec_map_draw'); + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + this.group = group; + group.add(this._regionsGroup = new Group()); + group.add(this._svgGroup = new Group()); + } + + MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) { + var isGeo = mapOrGeoModel.mainType === 'geo'; // Map series has data. GEO model that controlled by map series + // will be assigned with map data. Other GEO model has no data. + + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + isGeo && ecModel.eachComponent({ + mainType: 'series', + subType: 'map' + }, function (mapSeries) { + if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { + data = mapSeries.getData(); + } + }); + var geo = mapOrGeoModel.coordinateSystem; + var regionsGroup = this._regionsGroup; + var group = this.group; + var transformInfo = geo.getTransformInfo(); + var transformInfoRaw = transformInfo.raw; + var transformInfoRoam = transformInfo.roam; // No animation when first draw or in action + + var isFirstDraw = !regionsGroup.childAt(0) || payload; + + if (isFirstDraw) { + group.x = transformInfoRoam.x; + group.y = transformInfoRoam.y; + group.scaleX = transformInfoRoam.scaleX; + group.scaleY = transformInfoRoam.scaleY; + group.dirty(); + } else { + updateProps(group, transformInfoRoam, mapOrGeoModel); + } + + var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0; + var viewBuildCtx = { + api: api, + geo: geo, + mapOrGeoModel: mapOrGeoModel, + data: data, + isVisualEncodedByVisualMap: isVisualEncodedByVisualMap, + isGeo: isGeo, + transformInfoRaw: transformInfoRaw + }; + + if (geo.resourceType === 'geoJSON') { + this._buildGeoJSON(viewBuildCtx); + } else if (geo.resourceType === 'geoSVG') { + this._buildSVG(viewBuildCtx); + } + + this._updateController(mapOrGeoModel, ecModel, api); + + this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView); + }; + + MapDraw.prototype._buildGeoJSON = function (viewBuildCtx) { + var regionsGroupByName = this._regionsGroupByName = createHashMap(); + var regionsInfoByName = createHashMap(); + var regionsGroup = this._regionsGroup; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var projection = viewBuildCtx.geo.projection; + var projectionStream = projection && projection.stream; + + function transformPoint(point, project) { + if (project) { + // projection may return null point. + point = project(point); + } + + return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y]; + } + + function transformPolygonPoints(inPoints) { + var outPoints = []; // If projectionStream is provided. Use it instead of single point project. + + var project = !projectionStream && projection && projection.project; + + for (var i = 0; i < inPoints.length; ++i) { + var newPt = transformPoint(inPoints[i], project); + newPt && outPoints.push(newPt); + } + + return outPoints; + } + + function getPolyShape(points) { + return { + shape: { + points: transformPolygonPoints(points) + } + }; + } + + regionsGroup.removeAll(); // Only when the resource is GeoJSON, there is `geo.regions`. + + each(viewBuildCtx.geo.regions, function (region) { + var regionName = region.name; // Consider in GeoJson properties.name may be duplicated, for example, + // there is multiple region named "United Kindom" or "France" (so many + // colonies). And it is not appropriate to merge them in geo, which + // will make them share the same label and bring trouble in label + // location calculation. + + var regionGroup = regionsGroupByName.get(regionName); + + var _a = regionsInfoByName.get(regionName) || {}, + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + if (!regionGroup) { + regionGroup = regionsGroupByName.set(regionName, new Group()); + regionsGroup.add(regionGroup); + dataIdx = data ? data.indexOfName(regionName) : null; + regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null; + regionsInfoByName.set(regionName, { + dataIdx: dataIdx, + regionModel: regionModel + }); + } + + var polygonSubpaths = []; + var polylineSubpaths = []; + each(region.geometries, function (geometry) { + // Polygon and MultiPolygon + if (geometry.type === 'polygon') { + var polys = [geometry.exterior].concat(geometry.interiors || []); + + if (projectionStream) { + polys = projectPolys(polys, projectionStream); + } + + each(polys, function (poly) { + polygonSubpaths.push(new Polygon(getPolyShape(poly))); + }); + } // LineString and MultiLineString + else { + var points = geometry.points; + + if (projectionStream) { + points = projectPolys(points, projectionStream, true); + } + + each(points, function (points) { + polylineSubpaths.push(new Polyline(getPolyShape(points))); + }); + } + }); + var centerPt = transformPoint(region.getCenter(), projection && projection.project); + + function createCompoundPath(subpaths, isLine) { + if (!subpaths.length) { + return; + } + + var compoundPath = new CompoundPath({ + culling: true, + segmentIgnoreThreshold: 1, + shape: { + paths: subpaths + } + }); + regionGroup.add(compoundPath); + applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel); + resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt); + + if (isLine) { + fixLineStyle(compoundPath); + each(compoundPath.states, fixLineStyle); + } + } + + createCompoundPath(polygonSubpaths); + createCompoundPath(polylineSubpaths, true); + }); // Ensure children have been added to `regionGroup` before calling them. + + regionsGroupByName.each(function (regionGroup, regionName) { + var _a = regionsInfoByName.get(regionName), + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + }, this); + }; + + MapDraw.prototype._buildSVG = function (viewBuildCtx) { + var mapName = viewBuildCtx.geo.map; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + this._svgGroup.x = transformInfoRaw.x; + this._svgGroup.y = transformInfoRaw.y; + this._svgGroup.scaleX = transformInfoRaw.scaleX; + this._svgGroup.scaleY = transformInfoRaw.scaleY; + + if (this._svgResourceChanged(mapName)) { + this._freeSVG(); + + this._useSVG(mapName); + } + + var svgDispatcherMap = this._svgDispatcherMap = createHashMap(); + var focusSelf = false; + each(this._svgGraphicRecord.named, function (namedItem) { + // Note that we also allow different elements have the same name. + // For example, a glyph of a city and the label of the city have + // the same name and their tooltip info can be defined in a single + // region option. + var regionName = namedItem.name; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var svgNodeTagLower = namedItem.svgNodeTagLower; + var el = namedItem.el; + var dataIdx = data ? data.indexOfName(regionName) : null; + var regionModel = mapOrGeoModel.getRegionModel(regionName); + + if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) { + applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel); + } + + if (el instanceof Displayable) { + el.culling = true; + } // We do not know how the SVG like so we'd better not to change z2. + // Otherwise it might bring some unexpected result. For example, + // an area hovered that make some inner city can not be clicked. + + + el.z2EmphasisLift = 0; // If self named: + + if (!namedItem.namedFrom) { + // label should batter to be displayed based on the center of + // if it is named rather than displayed on each child. + if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) { + resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null); + } + + resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) { + var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (focus_1 === 'self') { + focusSelf = true; + } + + var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []); + els.push(el); + } + } + }, this); + + this._enableBlurEntireSVG(focusSelf, viewBuildCtx); + }; + + MapDraw.prototype._enableBlurEntireSVG = function (focusSelf, viewBuildCtx) { + // It's a little complicated to support blurring the entire geoSVG in series-map. + // So do not support it until some requirements come. + // At present, in series-map, only regions can be blurred. + if (focusSelf && viewBuildCtx.isGeo) { + var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(['blur', 'itemStyle']).getItemStyle(); // Only support `opacity` here. Because not sure that other props are suitable for + // all of the elements generated by SVG (especially for Text/TSpan/Image/... ). + + var opacity_1 = blurStyle.opacity; + + this._svgGraphicRecord.root.traverse(function (el) { + if (!el.isGroup) { + // PENDING: clear those settings to SVG elements when `_freeSVG`. + // (Currently it happen not to be needed.) + setDefaultStateProxy(el); + var style = el.ensureState('blur').style || {}; // Do not overwrite the region style that already set from region option. + + if (style.opacity == null && opacity_1 != null) { + style.opacity = opacity_1; + } // If `ensureState('blur').style = {}`, there will be default opacity. + // Enable `stateTransition` (animation). + + + el.ensureState('emphasis'); + } + }); + } + }; + + MapDraw.prototype.remove = function () { + this._regionsGroup.removeAll(); + + this._regionsGroupByName = null; + + this._svgGroup.removeAll(); + + this._freeSVG(); + + this._controller.dispose(); + + this._controllerHost = null; + }; + + MapDraw.prototype.findHighDownDispatchers = function (name, geoModel) { + if (name == null) { + return []; + } + + var geo = geoModel.coordinateSystem; + + if (geo.resourceType === 'geoJSON') { + var regionsGroupByName = this._regionsGroupByName; + + if (regionsGroupByName) { + var regionGroup = regionsGroupByName.get(name); + return regionGroup ? [regionGroup] : []; + } + } else if (geo.resourceType === 'geoSVG') { + return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || []; + } + }; + + MapDraw.prototype._svgResourceChanged = function (mapName) { + return this._svgMapName !== mapName; + }; + + MapDraw.prototype._useSVG = function (mapName) { + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + var svgGraphic = resource.useGraphic(this.uid); + + this._svgGroup.add(svgGraphic.root); + + this._svgGraphicRecord = svgGraphic; + this._svgMapName = mapName; + } + }; + + MapDraw.prototype._freeSVG = function () { + var mapName = this._svgMapName; + + if (mapName == null) { + return; + } + + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + resource.freeGraphic(this.uid); + } + + this._svgGraphicRecord = null; + this._svgDispatcherMap = null; + + this._svgGroup.removeAll(); + + this._svgMapName = null; + }; + + MapDraw.prototype._updateController = function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + var controllerHost = this._controllerHost; // @ts-ignore FIXME:TS + + controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit'); + controllerHost.zoom = geo.getZoom(); // roamType is will be set default true if it is null + // @ts-ignore FIXME:TS + + controller.enable(mapOrGeoModel.get('roam') || false); + var mainType = mapOrGeoModel.mainType; + + function makeActionBase() { + var action = { + type: 'geoRoam', + componentType: mainType + }; + action[mainType + 'Id'] = mapOrGeoModel.id; + return action; + } + + controller.off('pan').on('pan', function (e) { + this._mouseDownFlag = false; + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction(extend(makeActionBase(), { + dx: e.dx, + dy: e.dy, + animation: { + duration: 0 + } + })); + }, this); + controller.off('zoom').on('zoom', function (e) { + this._mouseDownFlag = false; + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction(extend(makeActionBase(), { + zoom: e.scale, + originX: e.originX, + originY: e.originY, + animation: { + duration: 0 + } + })); + }, this); + controller.setPointerChecker(function (e, x, y) { + return geo.containPoint([x, y]) && !onIrrelevantElement(e, api, mapOrGeoModel); + }); + }; + /** + * FIXME: this is a temporarily workaround. + * When `geoRoam` the elements need to be reset in `MapView['render']`, because the props like + * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries` + * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified + * props will have no chance to be restored. + * Note: This reset should be after `clearStates` in `renderSeries` because `useStates` in + * `renderSeries` will cache the modified `ignore` to `el._normalState`. + * TODO: + * Use clone/immutable in `LabelManager`? + */ + + + MapDraw.prototype.resetForLabelLayout = function () { + this.group.traverse(function (el) { + var label = el.getTextContent(); + + if (label) { + label.ignore = mapLabelRaw(label).ignore; + } + }); + }; + + MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) { + var mapDraw = this; + regionsGroup.off('mousedown'); + regionsGroup.off('click'); // @ts-ignore FIXME:TS resolve type conflict + + if (mapOrGeoModel.get('selectedMode')) { + regionsGroup.on('mousedown', function () { + mapDraw._mouseDownFlag = true; + }); + regionsGroup.on('click', function (e) { + if (!mapDraw._mouseDownFlag) { + return; + } + + mapDraw._mouseDownFlag = false; + }); + } + }; + + return MapDraw; + }(); + + function applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) { + // All of the path are using `itemStyle`, because + // (1) Some SVG also use fill on polyline (The different between + // polyline and polygon is "open" or "close" but not fill or not). + // (2) For the common props like opacity, if some use itemStyle + // and some use `lineStyle`, it might confuse users. + // (3) Most SVG use , where can not detect whether to draw a "line" + // or a filled shape, so use `itemStyle` for . + var normalStyleModel = regionModel.getModel('itemStyle'); + var emphasisStyleModel = regionModel.getModel(['emphasis', 'itemStyle']); + var blurStyleModel = regionModel.getModel(['blur', 'itemStyle']); + var selectStyleModel = regionModel.getModel(['select', 'itemStyle']); // NOTE: DON'T use 'style' in visual when drawing map. + // This component is used for drawing underlying map for both geo component and map series. + + var normalStyle = getFixedItemStyle(normalStyleModel); + var emphasisStyle = getFixedItemStyle(emphasisStyleModel); + var selectStyle = getFixedItemStyle(selectStyleModel); + var blurStyle = getFixedItemStyle(blurStyleModel); // Update the itemStyle if has data visual + + var data = viewBuildCtx.data; + + if (data) { + // Only visual color of each item will be used. It can be encoded by visualMap + // But visual color of series is used in symbol drawing + // Visual color for each series is for the symbol draw + var style = data.getItemVisual(dataIndex, 'style'); + var decal = data.getItemVisual(dataIndex, 'decal'); + + if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) { + normalStyle.fill = style.fill; + } + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api); + } + } // SVG text, tspan and image can be named but not supporeted + // to be styled by region option yet. + + + el.setStyle(normalStyle); + el.style.strokeNoScale = true; + el.ensureState('emphasis').style = emphasisStyle; + el.ensureState('select').style = selectStyle; + el.ensureState('blur').style = blurStyle; // Enable blur + + setDefaultStateProxy(el); + } + + function resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx, // If labelXY not provided, use `textConfig.position: 'inside'` + labelXY) { + var data = viewBuildCtx.data; + var isGeo = viewBuildCtx.isGeo; + var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx)); + var itemLayout = data && data.getItemLayout(dataIdx); // In the following cases label will be drawn + // 1. In map series and data value is NaN + // 2. In geo component + // 3. Region has no series legendIcon, which will be add a showLabel flag in mapSymbolLayout + + if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) { + var query = !isGeo ? dataIdx : regionName; + var labelFetcher = void 0; // Consider dataIdx not found. + + if (!data || dataIdx >= 0) { + labelFetcher = mapOrGeoModel; + } + + var specifiedTextOpt = labelXY ? { + normal: { + align: 'center', + verticalAlign: 'middle' + } + } : null; // Caveat: must be called after `setDefaultStateProxy(el);` called. + // because textContent will be assign with `el.stateProxy` inside. + + setLabelStyle(el, getLabelStatesModels(regionModel), { + labelFetcher: labelFetcher, + labelDataIndex: query, + defaultText: regionName + }, specifiedTextOpt); + var textEl = el.getTextContent(); + + if (textEl) { + mapLabelRaw(textEl).ignore = textEl.ignore; + + if (el.textConfig && labelXY) { + // Compute a relative offset based on the el bounding rect. + var rect = el.getBoundingRect().clone(); // Need to make sure the percent position base on the same rect in normal and + // emphasis state. Otherwise if using boundingRect of el, but the emphasis state + // has borderWidth (even 0.5px), the text position will be changed obviously + // if the position is very big like ['1234%', '1345%']. + + el.textConfig.layoutRect = rect; + el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + '%', (labelXY[1] - rect.y) / rect.height * 100 + '%']; + } + } // PENDING: + // If labelLayout is enabled (test/label-layout.html), el.dataIndex should be specified. + // But el.dataIndex is also used to determine whether user event should be triggered, + // where el.seriesIndex or el.dataModel must be specified. At present for a single el + // there is not case that "only label layout enabled but user event disabled", so here + // we depends `resetEventTriggerForRegion` to do the job of setting `el.dataIndex`. + + + el.disableLabelAnimation = true; + } else { + el.removeTextContent(); + el.removeTextConfig(); + el.disableLabelAnimation = null; + } + } + + function resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx) { + // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the regionGroup + if (viewBuildCtx.data) { + // FIXME: when series-map use a SVG map, and there are duplicated name specified + // on different SVG elements, after `data.setItemGraphicEl(...)`: + // (1) all of them will be mounted with `dataIndex`, `seriesIndex`, so that tooltip + // can be triggered only mouse hover. That's correct. + // (2) only the last element will be kept in `data`, so that if trigger tooltip + // by `dispatchAction`, only the last one can be found and triggered. That might be + // not correct. We will fix it in future if anyone demanding that. + viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger); + } // series-map will not trigger "geoselectchange" no matter it is + // based on a declared geo component. Because series-map will + // trigger "selectchange". If it trigger both the two events, + // If users call `chart.dispatchAction({type: 'toggleSelect'})`, + // it not easy to also fire event "geoselectchanged". + else { + // Package custom mouse event for geo component + getECData(eventTrigger).eventData = { + componentType: 'geo', + componentIndex: mapOrGeoModel.componentIndex, + geoIndex: mapOrGeoModel.componentIndex, + name: regionName, + region: regionModel && regionModel.option || {} + }; + } + } + + function resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + if (!viewBuildCtx.data) { + setTooltipConfig({ + el: el, + componentModel: mapOrGeoModel, + itemName: regionName, + // @ts-ignore FIXME:TS fix the "compatible with each other"? + itemTooltipOption: regionModel.get('tooltip') + }); + } + } + + function resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + // @ts-ignore FIXME:TS fix the "compatible with each other"? + el.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode'); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var emphasisModel = regionModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(el, focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + + if (viewBuildCtx.isGeo) { + enableComponentHighDownFeatures(el, mapOrGeoModel, regionName); + } + + return focus; + } + + function projectPolys(rings, // Polygons include exterior and interiors. Or polylines. + createStream, isLine) { + var polygons = []; + var curPoly; + + function startPolygon() { + curPoly = []; + } + + function endPolygon() { + if (curPoly.length) { + polygons.push(curPoly); + curPoly = []; + } + } + + var stream = createStream({ + polygonStart: startPolygon, + polygonEnd: endPolygon, + lineStart: startPolygon, + lineEnd: endPolygon, + point: function (x, y) { + // May have NaN values from stream. + if (isFinite(x) && isFinite(y)) { + curPoly.push([x, y]); + } + }, + sphere: function () {} + }); + !isLine && stream.polygonStart(); + each(rings, function (ring) { + stream.lineStart(); + + for (var i = 0; i < ring.length; i++) { + stream.point(ring[i][0], ring[i][1]); + } + + stream.lineEnd(); + }); + !isLine && stream.polygonEnd(); + return polygons; + } + // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var MapView = + /** @class */ + function (_super) { + __extends(MapView, _super); + + function MapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapView.type; + return _this; + } + + MapView.prototype.render = function (mapModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) { + return; + } + + var group = this.group; + group.removeAll(); + + if (mapModel.getHostGeoModel()) { + return; + } + + if (this._mapDraw && payload && payload.type === 'geoRoam') { + this._mapDraw.resetForLabelLayout(); + } // Not update map if it is an roam action from self + + + if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) { + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api); + group.add(mapDraw.group); + mapDraw.draw(mapModel, ecModel, api, this, payload); + this._mapDraw = mapDraw; + } else { + // Remove drawn map + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + } + } else { + var mapDraw = this._mapDraw; + mapDraw && group.add(mapDraw.group); + } + + mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api); + }; + + MapView.prototype.remove = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }; + + MapView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + }; + + MapView.prototype._renderSymbols = function (mapModel, ecModel, api) { + var originalData = mapModel.originalData; + var group = this.group; + originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) { + if (isNaN(value)) { + return; + } + + var layout = originalData.getItemLayout(originalDataIndex); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + var circle = new Circle({ + style: { + // Because the special of map draw. + // Which needs statistic of multiple series and draw on one map. + // And each series also need a symbol with legend color + // + // Layout and visual are put one the different data + // TODO + fill: mapModel.getData().getVisual('style').fill + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + // Do not overlap the first series, on which labels are displayed. + z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0) + }); // Only the series that has the first value on the same region is in charge of rendering the label. + // But consider the case: + // series: [ + // {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]}, + // {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]} + // ] + // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`. + // For backward compatibility, we follow the rule that render label `A` by the + // settings on series `X` but render label `C` by the settings on series `Y`. + + if (!offset) { + var fullData = mapModel.mainSeries.getData(); + var name_1 = originalData.getName(originalDataIndex); + var fullIndex_1 = fullData.indexOfName(name_1); + var itemModel = originalData.getItemModel(originalDataIndex); + var labelModel = itemModel.getModel('label'); + var regionGroup = fullData.getItemGraphicEl(fullIndex_1); // `getFormattedLabel` needs to use `getData` inside. Here + // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`. + // FIXME + // If this is not the `mainSeries`, the item model (like label formatter) + // set on original data item will never get. But it has been working + // like that from the beginning, and this scenario is rarely encountered. + // So it won't be fixed until we have to. + + setLabelStyle(circle, getLabelStatesModels(itemModel), { + labelFetcher: { + getFormattedLabel: function (idx, state) { + return mapModel.getFormattedLabel(fullIndex_1, state); + } + }, + defaultText: name_1 + }); + circle.disableLabelAnimation = true; + + if (!labelModel.get('position')) { + circle.setTextConfig({ + position: 'bottom' + }); + } + + regionGroup.onHoverStateChange = function (toState) { + setStatesFlag(circle, toState); + }; + } + + group.add(circle); + }); + }; + + MapView.type = 'map'; + return MapView; + }(ChartView); + + var MapSeries = + /** @class */ + function (_super) { + __extends(MapSeries, _super); + + function MapSeries() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapSeries.type; // Only first map series of same mapType will drawMap. + + _this.needsDrawMap = false; // Group of all map series with same mapType + + _this.seriesGroup = []; + + _this.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var name_1 = this.getData().getName(dataIndex); + var geo = this.coordinateSystem; + var region = geo.getRegion(name_1); + return region && geo.dataToPoint(region.getCenter()); + } + }; + + return _this; + } + + MapSeries.prototype.getInitialData = function (option) { + var data = createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + var dataNameMap = createHashMap(); + var toAppendNames = []; + + for (var i = 0, len = data.count(); i < len; i++) { + var name_2 = data.getName(i); + dataNameMap.set(name_2, true); + } + + var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty); + each(geoSource.regions, function (region) { + var name = region.name; + + if (!dataNameMap.get(name)) { + toAppendNames.push(name); + } + }); // Complete data with missing regions. The consequent processes (like visual + // map and render) can not be performed without a "full data". For example, + // find `dataIndex` by name. + + data.appendValues([], toAppendNames); + return data; + }; + /** + * If no host geo model, return null, which means using a + * inner exclusive geo model. + */ + + + MapSeries.prototype.getHostGeoModel = function () { + var geoIndex = this.option.geoIndex; + return geoIndex != null ? this.ecModel.getComponent('geo', geoIndex) : null; + }; + + MapSeries.prototype.getMapType = function () { + return (this.getHostGeoModel() || this).option.map; + }; // _fillOption(option, mapName) { + // Shallow clone + // option = zrUtil.extend({}, option); + // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap); + // return option; + // } + + + MapSeries.prototype.getRawValue = function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + var data = this.getData(); + return data.get(data.mapDimension('value'), dataIndex); + }; + /** + * Get model of region + */ + + + MapSeries.prototype.getRegionModel = function (regionName) { + var data = this.getData(); + return data.getItemModel(data.indexOfName(regionName)); + }; + /** + * Map tooltip formatter + */ + + + MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // FIXME orignalData and data is a bit confusing + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + var seriesGroup = this.seriesGroup; + var seriesNames = []; + + for (var i = 0; i < seriesGroup.length; i++) { + var otherIndex = seriesGroup[i].originalData.indexOfName(name); + var valueDim = data.mapDimension('value'); + + if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { + seriesNames.push(seriesGroup[i].name); + } + } + + return createTooltipMarkup('section', { + header: seriesNames.join(', '), + noHeader: !seriesNames.length, + blocks: [createTooltipMarkup('nameValue', { + name: name, + value: value + })] + }); + }; + + MapSeries.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + MapSeries.prototype.setCenter = function (center) { + this.option.center = center; + }; + + MapSeries.prototype.getLegendIcon = function (opt) { + var iconType = opt.icon || 'roundRect'; + var icon = createSymbol(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill); + icon.setStyle(opt.itemStyle); // Map do not use itemStyle.borderWidth as border width + + icon.style.stroke = 'none'; // No rotation because no series visual symbol for map + + if (iconType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + }; + + MapSeries.type = 'series.map'; + MapSeries.dependencies = ['geo']; + MapSeries.layoutMode = 'box'; + MapSeries.defaultOption = { + // 一级层叠 + // zlevel: 0, + // 二级层叠 + z: 2, + coordinateSystem: 'geo', + // map should be explicitly specified since ec3. + map: '', + // If `geoIndex` is not specified, a exclusive geo will be + // created. Otherwise use the specified geo component, and + // `map` and `mapType` are ignored. + // geoIndex: 0, + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + // Layout with center and size + // If you want to put map in a fixed size box with right aspect ratio + // This two properties may be more convenient. + // layoutCenter: [50%, 50%] + // layoutSize: 100 + showLegendSymbol: true, + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ], + // higher priority than center and zoom + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + selectedMode: true, + label: { + show: false, + color: '#000' + }, + // scaleLimit: null, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + areaColor: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + nameProperty: 'name' + }; + return MapSeries; + }(SeriesModel); + + function dataStatistics(datas, statisticType) { + var dataNameMap = {}; + each(datas, function (data) { + data.each(data.mapDimension('value'), function (value, idx) { + // Add prefix to avoid conflict with Object.prototype. + var mapKey = 'ec-' + data.getName(idx); + dataNameMap[mapKey] = dataNameMap[mapKey] || []; + + if (!isNaN(value)) { + dataNameMap[mapKey].push(value); + } + }); + }); + return datas[0].map(datas[0].mapDimension('value'), function (value, idx) { + var mapKey = 'ec-' + datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[mapKey].length; + + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[mapKey][i]); + max = Math.max(max, dataNameMap[mapKey][i]); + sum += dataNameMap[mapKey][i]; + } + + var result; + + if (statisticType === 'min') { + result = min; + } else if (statisticType === 'max') { + result = max; + } else if (statisticType === 'average') { + result = sum / len; + } else { + result = sum; + } + + return len === 0 ? NaN : result; + }); + } + + function mapDataStatistic(ecModel) { + var seriesGroups = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var hostGeoModel = seriesModel.getHostGeoModel(); + var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType(); + (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); + }); + each(seriesGroups, function (seriesList, key) { + var data = dataStatistics(map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), seriesList[0].get('mapValueCalculation')); + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].originalData = seriesList[i].getData(); + } // FIXME Put where? + + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); + seriesList[i].setData(data.cloneShallow()); + seriesList[i].mainSeries = seriesList[0]; + } + }); + } + + function mapSymbolLayout(ecModel) { + var processedMapType = {}; + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.getMapType(); + + if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + each(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.originalData; + + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each(data.mapDimension('value'), function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); // If input series.data is [11, 22, '-'/null/undefined, 44], + // it will be filled with NaN: [11, 22, NaN, 44] and NaN will + // not be drawn. So here must validate if value is NaN. + + if (!region || isNaN(value)) { + return; + } + + var offset = mapSymbolOffsets[name] || 0; + var point = geo.dataToPoint(region.getCenter()); + mapSymbolOffsets[name] = offset + 1; + data.setItemLayout(idx, { + point: point, + offset: offset + }); + }); + } + }); // Show label of those region not has legendIcon (which is offset 0) + + var data = mapSeries.getData(); + data.each(function (idx) { + var name = data.getName(idx); + var layout = data.getItemLayout(idx) || {}; + layout.showLabel = !mapSymbolOffsets[name]; + data.setItemLayout(idx, layout); + }); + processedMapType[mapType] = true; + }); + } + + var v2ApplyTransform = applyTransform; + + var View = + /** @class */ + function (_super) { + __extends(View, _super); + + function View(name) { + var _this = _super.call(this) || this; + + _this.type = 'view'; + _this.dimensions = ['x', 'y']; + /** + * Represents the transform brought by roam/zoom. + * If `View['_viewRect']` applies roam transform, + * we can get the final displayed rect. + */ + + _this._roamTransformable = new Transformable(); + /** + * Represents the transform from `View['_rect']` to `View['_viewRect']`. + */ + + _this._rawTransformable = new Transformable(); + _this.name = name; + return _this; + } + + View.prototype.setBoundingRect = function (x, y, width, height) { + this._rect = new BoundingRect(x, y, width, height); + return this._rect; + }; + /** + * @return {module:zrender/core/BoundingRect} + */ + + + View.prototype.getBoundingRect = function () { + return this._rect; + }; + + View.prototype.setViewRect = function (x, y, width, height) { + this._transformTo(x, y, width, height); + + this._viewRect = new BoundingRect(x, y, width, height); + }; + /** + * Transformed to particular position and size + */ + + + View.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var rawTransform = this._rawTransformable; + rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransform.parent; + rawTransform.parent = null; + rawTransform.decomposeTransform(); + rawTransform.parent = rawParent; + + this._updateTransform(); + }; + /** + * Set center of view + */ + + + View.prototype.setCenter = function (centerCoord, api) { + if (!centerCoord) { + return; + } + + this._center = [parsePercent$1(centerCoord[0], api.getWidth()), parsePercent$1(centerCoord[1], api.getHeight())]; + + this._updateCenterAndZoom(); + }; + + View.prototype.setZoom = function (zoom) { + zoom = zoom || 1; + var zoomLimit = this.zoomLimit; + + if (zoomLimit) { + if (zoomLimit.max != null) { + zoom = Math.min(zoomLimit.max, zoom); + } + + if (zoomLimit.min != null) { + zoom = Math.max(zoomLimit.min, zoom); + } + } + + this._zoom = zoom; + + this._updateCenterAndZoom(); + }; + /** + * Get default center without roam + */ + + + View.prototype.getDefaultCenter = function () { + // Rect before any transform + var rawRect = this.getBoundingRect(); + var cx = rawRect.x + rawRect.width / 2; + var cy = rawRect.y + rawRect.height / 2; + return [cx, cy]; + }; + + View.prototype.getCenter = function () { + return this._center || this.getDefaultCenter(); + }; + + View.prototype.getZoom = function () { + return this._zoom || 1; + }; + + View.prototype.getRoamTransform = function () { + return this._roamTransformable.getLocalTransform(); + }; + /** + * Remove roam + */ + + + View.prototype._updateCenterAndZoom = function () { + // Must update after view transform updated + var rawTransformMatrix = this._rawTransformable.getLocalTransform(); + + var roamTransform = this._roamTransformable; + var defaultCenter = this.getDefaultCenter(); + var center = this.getCenter(); + var zoom = this.getZoom(); + center = applyTransform([], center, rawTransformMatrix); + defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix); + roamTransform.originX = center[0]; + roamTransform.originY = center[1]; + roamTransform.x = defaultCenter[0] - center[0]; + roamTransform.y = defaultCenter[1] - center[1]; + roamTransform.scaleX = roamTransform.scaleY = zoom; + + this._updateTransform(); + }; + /** + * Update transform props on `this` based on the current + * `this._roamTransformable` and `this._rawTransformable`. + */ + + + View.prototype._updateTransform = function () { + var roamTransformable = this._roamTransformable; + var rawTransformable = this._rawTransformable; + rawTransformable.parent = roamTransformable; + roamTransformable.updateTransform(); + rawTransformable.updateTransform(); + copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1()); + this._rawTransform = rawTransformable.getLocalTransform(); + this.invTransform = this.invTransform || []; + invert(this.invTransform, this.transform); + this.decomposeTransform(); + }; + + View.prototype.getTransformInfo = function () { + var rawTransformable = this._rawTransformable; + var roamTransformable = this._roamTransformable; // Because roamTransformabel has `originX/originY` modified, + // but the caller of `getTransformInfo` can not handle `originX/originY`, + // so need to recalculate them. + + var dummyTransformable = new Transformable(); + dummyTransformable.transform = roamTransformable.transform; + dummyTransformable.decomposeTransform(); + return { + roam: { + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY + }, + raw: { + x: rawTransformable.x, + y: rawTransformable.y, + scaleX: rawTransformable.scaleX, + scaleY: rawTransformable.scaleY + } + }; + }; + + View.prototype.getViewRect = function () { + return this._viewRect; + }; + /** + * Get view rect after roam transform + */ + + + View.prototype.getViewRectAfterRoam = function () { + var rect = this.getBoundingRect().clone(); + rect.applyTransform(this.transform); + return rect; + }; + /** + * Convert a single (lon, lat) data item to (x, y) point. + */ + + + View.prototype.dataToPoint = function (data, noRoam, out) { + var transform = noRoam ? this._rawTransform : this.transform; + out = out || []; + return transform ? v2ApplyTransform(out, data, transform) : copy(out, data); + }; + /** + * Convert a (x, y) point to (lon, lat) data + */ + + + View.prototype.pointToData = function (point) { + var invTransform = this.invTransform; + return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]]; + }; + + View.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + View.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + /** + * @implements + */ + + + View.prototype.containPoint = function (point) { + return this.getViewRectAfterRoam().contain(point[0], point[1]); + }; + + View.dimensions = ['x', 'y']; + return View; + }(Transformable); + + function getCoordSys(finder) { + var seriesModel = finder.seriesModel; + return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph. + } + + var GEO_DEFAULT_PARAMS = { + 'geoJSON': { + aspectScale: 0.75, + invertLongitute: true + }, + 'geoSVG': { + aspectScale: 1, + invertLongitute: false + } + }; + var geo2DDimensions = ['lng', 'lat']; + + var Geo = + /** @class */ + function (_super) { + __extends(Geo, _super); + + function Geo(name, map, opt) { + var _this = _super.call(this, name) || this; + + _this.dimensions = geo2DDimensions; + _this.type = 'geo'; // Only store specified name coord via `addGeoCoord`. + + _this._nameCoordMap = createHashMap(); + _this.map = map; + var projection = opt.projection; + var source = geoSourceManager.load(map, opt.nameMap, opt.nameProperty); + var resource = geoSourceManager.getGeoResource(map); + var resourceType = _this.resourceType = resource ? resource.type : null; + var regions = _this.regions = source.regions; + var defaultParams = GEO_DEFAULT_PARAMS[resource.type]; + _this._regionsMap = source.regionsMap; + _this.regions = source.regions; + + if ("development" !== 'production' && projection) { + // Do some check + if (resourceType === 'geoSVG') { + if ("development" !== 'production') { + warn("Map " + map + " with SVG source can't use projection. Only GeoJSON source supports projection."); + } + + projection = null; + } + + if (!(projection.project && projection.unproject)) { + if ("development" !== 'production') { + warn('project and unproject must be both provided in the projeciton.'); + } + + projection = null; + } + } + + _this.projection = projection; + var boundingRect; + + if (projection) { + // Can't reuse the raw bounding rect + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(projection); + boundingRect = boundingRect || regionRect.clone(); + boundingRect.union(regionRect); + } + } else { + boundingRect = source.boundingRect; + } + + _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height); // aspectScale and invertLongitute actually is the parameters default raw projection. + // So we ignore them if projection is given. + // Ignore default aspect scale if projection exits. + + + _this.aspectScale = projection ? 1 : retrieve2(opt.aspectScale, defaultParams.aspectScale); // Not invert longitude if projection exits. + + _this._invertLongitute = projection ? false : defaultParams.invertLongitute; + return _this; + } + + Geo.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var invertLongitute = this._invertLongitute; + rect = rect.clone(); + + if (invertLongitute) { + // Longitude is inverted. + rect.y = -rect.y - rect.height; + } + + var rawTransformable = this._rawTransformable; + rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransformable.parent; + rawTransformable.parent = null; + rawTransformable.decomposeTransform(); + rawTransformable.parent = rawParent; + + if (invertLongitute) { + rawTransformable.scaleY = -rawTransformable.scaleY; + } + + this._updateTransform(); + }; + + Geo.prototype.getRegion = function (name) { + return this._regionsMap.get(name); + }; + + Geo.prototype.getRegionByCoord = function (coord) { + var regions = this.regions; + + for (var i = 0; i < regions.length; i++) { + var region = regions[i]; + + if (region.type === 'geoJSON' && region.contain(coord)) { + return regions[i]; + } + } + }; + /** + * Add geoCoord for indexing by name + */ + + + Geo.prototype.addGeoCoord = function (name, geoCoord) { + this._nameCoordMap.set(name, geoCoord); + }; + /** + * Get geoCoord by name + */ + + + Geo.prototype.getGeoCoord = function (name) { + var region = this._regionsMap.get(name); // Calculate center only on demand. + + + return this._nameCoordMap.get(name) || region && region.getCenter(); + }; + + Geo.prototype.dataToPoint = function (data, noRoam, out) { + if (isString(data)) { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + + if (data) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + data = projection.project(data); + } + + return data && this.projectedToPoint(data, noRoam, out); + } + }; + + Geo.prototype.pointToData = function (point) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + point = projection.unproject(point); + } + + return point && this.pointToProjected(point); + }; + /** + * Point to projected data. Same with pointToData when projection is used. + */ + + + Geo.prototype.pointToProjected = function (point) { + return _super.prototype.pointToData.call(this, point); + }; + + Geo.prototype.projectedToPoint = function (projected, noRoam, out) { + return _super.prototype.dataToPoint.call(this, projected, noRoam, out); + }; + + Geo.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + return Geo; + }(View); + mixin(Geo, View); + + function getCoordSys$1(finder) { + var geoModel = finder.geoModel; + var seriesModel = finder.seriesModel; + return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series. + || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null; + } + + /** + * Resize method bound to the geo + */ + + function resizeGeo(geoModel, api) { + var boundingCoords = geoModel.get('boundingCoords'); + + if (boundingCoords != null) { + var leftTop_1 = boundingCoords[0]; + var rightBottom_1 = boundingCoords[1]; + + if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) { + if ("development" !== 'production') { + console.error('Invalid boundingCoords'); + } + } else { + // Sample around the lng/lat rect and use projection to calculate actual bounding rect. + var projection_1 = this.projection; + + if (projection_1) { + var xMin = leftTop_1[0]; + var yMin = leftTop_1[1]; + var xMax = rightBottom_1[0]; + var yMax = rightBottom_1[1]; + leftTop_1 = [Infinity, Infinity]; + rightBottom_1 = [-Infinity, -Infinity]; // TODO better way? + + var sampleLine = function (x0, y0, x1, y1) { + var dx = x1 - x0; + var dy = y1 - y0; + + for (var i = 0; i <= 100; i++) { + var p = i / 100; + var pt = projection_1.project([x0 + dx * p, y0 + dy * p]); + min(leftTop_1, leftTop_1, pt); + max(rightBottom_1, rightBottom_1, pt); + } + }; // Top + + + sampleLine(xMin, yMin, xMax, yMin); // Right + + sampleLine(xMax, yMin, xMax, yMax); // Bottom + + sampleLine(xMax, yMax, xMin, yMax); // Left + + sampleLine(xMin, yMax, xMax, yMin); + } + + this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]); + } + } + + var rect = this.getBoundingRect(); + var centerOption = geoModel.get('layoutCenter'); + var sizeOption = geoModel.get('layoutSize'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var aspect = rect.width / rect.height * this.aspectScale; + var useCenterAndSize = false; + var center; + var size; + + if (centerOption && sizeOption) { + center = [parsePercent$1(centerOption[0], viewWidth), parsePercent$1(centerOption[1], viewHeight)]; + size = parsePercent$1(sizeOption, Math.min(viewWidth, viewHeight)); + + if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { + useCenterAndSize = true; + } else { + if ("development" !== 'production') { + console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); + } + } + } + + var viewRect; + + if (useCenterAndSize) { + viewRect = {}; + + if (aspect > 1) { + // Width is same with size + viewRect.width = size; + viewRect.height = size / aspect; + } else { + viewRect.height = size; + viewRect.width = size * aspect; + } + + viewRect.y = center[1] - viewRect.height / 2; + viewRect.x = center[0] - viewRect.width / 2; + } else { + // Use left/top/width/height + var boxLayoutOption = geoModel.getBoxLayoutParams(); + boxLayoutOption.aspect = aspect; + viewRect = getLayoutRect(boxLayoutOption, { + width: viewWidth, + height: viewHeight + }); + } + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + this.setCenter(geoModel.get('center'), api); + this.setZoom(geoModel.get('zoom')); + } // Back compat for ECharts2, where the coord map is set on map series: + // {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}}, + + + function setGeoCoords(geo, model) { + each(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); + } + + var GeoCreator = + /** @class */ + function () { + function GeoCreator() { + // For deciding which dimensions to use when creating list data + this.dimensions = geo2DDimensions; + } + + GeoCreator.prototype.create = function (ecModel, api) { + var geoList = []; + + function getCommonGeoProperties(model) { + return { + nameProperty: model.get('nameProperty'), + aspectScale: model.get('aspectScale'), + projection: model.get('projection') + }; + } // FIXME Create each time may be slow + + + ecModel.eachComponent('geo', function (geoModel, idx) { + var mapName = geoModel.get('map'); + var geo = new Geo(mapName + idx, mapName, extend({ + nameMap: geoModel.get('nameMap') + }, getCommonGeoProperties(geoModel))); + geo.zoomLimit = geoModel.get('scaleLimit'); + geoList.push(geo); // setGeoCoords(geo, geoModel); + + geoModel.coordinateSystem = geo; + geo.model = geoModel; // Inject resize method + + geo.resize = resizeGeo; + geo.resize(geoModel, api); + }); + ecModel.eachSeries(function (seriesModel) { + var coordSys = seriesModel.get('coordinateSystem'); + + if (coordSys === 'geo') { + var geoIndex = seriesModel.get('geoIndex') || 0; + seriesModel.coordinateSystem = geoList[geoIndex]; + } + }); // If has map series + + var mapModelGroupBySeries = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + if (!seriesModel.getHostGeoModel()) { + var mapType = seriesModel.getMapType(); + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + mapModelGroupBySeries[mapType].push(seriesModel); + } + }); + each(mapModelGroupBySeries, function (mapSeries, mapType) { + var nameMapList = map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo(mapType, mapType, extend({ + nameMap: mergeAll(nameMapList) + }, getCommonGeoProperties(mapSeries[0]))); + geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); // Inject resize method + + geo.resize = resizeGeo; + geo.resize(mapSeries[0], api); + each(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + setGeoCoords(geo, singleMapSeries); + }); + }); + return geoList; + }; + /** + * Fill given regions array + */ + + + GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) { + // Not use the original + var regionsArr = (originRegionArr || []).slice(); + var dataNameMap = createHashMap(); + + for (var i = 0; i < regionsArr.length; i++) { + dataNameMap.set(regionsArr[i].name, regionsArr[i]); + } + + var source = geoSourceManager.load(mapName, nameMap, nameProperty); + each(source.regions, function (region) { + var name = region.name; + !dataNameMap.get(name) && regionsArr.push({ + name: name + }); + }); + return regionsArr; + }; + + return GeoCreator; + }(); + + var geoCreator = new GeoCreator(); + + var GeoModel = + /** @class */ + function (_super) { + __extends(GeoModel, _super); + + function GeoModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoModel.type; + return _this; + } + + GeoModel.prototype.init = function (option, parentModel, ecModel) { + var source = geoSourceManager.getGeoResource(option.map); + + if (source && source.type === 'geoJSON') { + var itemStyle = option.itemStyle = option.itemStyle || {}; + + if (!('color' in itemStyle)) { + itemStyle.color = '#eee'; + } + } + + this.mergeDefaultAndTheme(option, ecModel); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + }; + + GeoModel.prototype.optionUpdated = function () { + var _this = this; + + var option = this.option; + option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty); + var selectedMap = {}; + this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) { + var regionName = regionOpt.name; + + if (regionName) { + optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel)); + + if (regionOpt.selected) { + selectedMap[regionName] = true; + } + } + + return optionModelMap; + }, createHashMap()); + + if (!option.selectedMap) { + option.selectedMap = selectedMap; + } + }; + /** + * Get model of region. + */ + + + GeoModel.prototype.getRegionModel = function (name) { + return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); + }; + /** + * Format label + * @param name Region name + */ + + + GeoModel.prototype.getFormattedLabel = function (name, status) { + var regionModel = this.getRegionModel(name); + var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']); + var params = { + name: name + }; + + if (isFunction(formatter)) { + params.status = status; + return formatter(params); + } else if (isString(formatter)) { + return formatter.replace('{a}', name != null ? name : ''); + } + }; + + GeoModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GeoModel.prototype.setCenter = function (center) { + this.option.center = center; + }; // PENGING If selectedMode is null ? + + + GeoModel.prototype.select = function (name) { + var option = this.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + if (selectedMode !== 'multiple') { + option.selectedMap = null; + } + + var selectedMap = option.selectedMap || (option.selectedMap = {}); + selectedMap[name] = true; + }; + + GeoModel.prototype.unSelect = function (name) { + var selectedMap = this.option.selectedMap; + + if (selectedMap) { + selectedMap[name] = false; + } + }; + + GeoModel.prototype.toggleSelected = function (name) { + this[this.isSelected(name) ? 'unSelect' : 'select'](name); + }; + + GeoModel.prototype.isSelected = function (name) { + var selectedMap = this.option.selectedMap; + return !!(selectedMap && selectedMap[name]); + }; + + GeoModel.type = 'geo'; + GeoModel.layoutMode = 'box'; + GeoModel.defaultOption = { + // zlevel: 0, + z: 0, + show: true, + left: 'center', + top: 'center', + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + // /// Layout with center and size + // If you want to put map in a fixed size box with right aspect ratio + // This two properties may be more convenient + // layoutCenter: [50%, 50%] + // layoutSize: 100 + silent: false, + // Map type + map: '', + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ] + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + // selectedMode: false + label: { + show: false, + color: '#000' + }, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444' // Default color: + // + geoJSON: #eee + // + geoSVG: null (use SVG original `fill`) + // color: '#eee' + + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + regions: [] // tooltip: { + // show: false + // } + + }; + return GeoModel; + }(ComponentModel); + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function getCenterCoord(view, point) { + // Use projected coord as center because it's linear. + return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point); + } + + function updateCenterAndZoom(view, payload, zoomLimit, api) { + var previousZoom = view.getZoom(); + var center = view.getCenter(); + var zoom = payload.zoom; + var point = view.projectedToPoint ? view.projectedToPoint(center) : view.dataToPoint(center); + + if (payload.dx != null && payload.dy != null) { + point[0] -= payload.dx; + point[1] -= payload.dy; + view.setCenter(getCenterCoord(view, point), api); + } + + if (zoom != null) { + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom; + } // Zoom on given point(originX, originY) + + + view.scaleX *= zoom; + view.scaleY *= zoom; + var fixX = (payload.originX - view.x) * (zoom - 1); + var fixY = (payload.originY - view.y) * (zoom - 1); + view.x -= fixX; + view.y -= fixY; + view.updateTransform(); // Get the new center + + view.setCenter(getCenterCoord(view, point), api); + view.setZoom(zoom * previousZoom); + } + + return { + center: view.getCenter(), + zoom: view.getZoom() + }; + } + + var GeoView = + /** @class */ + function (_super) { + __extends(GeoView, _super); + + function GeoView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoView.type; + _this.focusBlurEnabled = true; + return _this; + } + + GeoView.prototype.init = function (ecModel, api) { + this._api = api; + }; + + GeoView.prototype.render = function (geoModel, ecModel, api, payload) { + this._model = geoModel; + + if (!geoModel.get('show')) { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + return; + } + + if (!this._mapDraw) { + this._mapDraw = new MapDraw(api); + } + + var mapDraw = this._mapDraw; + mapDraw.draw(geoModel, ecModel, api, this, payload); + mapDraw.group.on('click', this._handleRegionClick, this); + mapDraw.group.silent = geoModel.get('silent'); + this.group.add(mapDraw.group); + this.updateSelectStatus(geoModel, ecModel, api); + }; + + GeoView.prototype._handleRegionClick = function (e) { + var eventData; + findEventDispatcher(e.target, function (current) { + return (eventData = getECData(current).eventData) != null; + }, true); + + if (eventData) { + this._api.dispatchAction({ + type: 'geoToggleSelect', + geoId: this._model.id, + name: eventData.name + }); + } + }; + + GeoView.prototype.updateSelectStatus = function (model, ecModel, api) { + var _this = this; + + this._mapDraw.group.traverse(function (node) { + var eventData = getECData(node).eventData; + + if (eventData) { + _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node); // No need to traverse children. + + return true; + } + }); + }; + + GeoView.prototype.findHighDownDispatchers = function (name) { + return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model); + }; + + GeoView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + }; + + GeoView.type = 'geo'; + return GeoView; + }(ComponentView); + + function registerMap$1(mapName, geoJson, specialAreas) { + geoSourceManager.registerMap(mapName, geoJson, specialAreas); + } + + function install$9(registers) { + registers.registerCoordinateSystem('geo', geoCreator); + registers.registerComponentModel(GeoModel); + registers.registerComponentView(GeoView); + registers.registerImpl('registerMap', registerMap$1); + registers.registerImpl('getMap', function (mapName) { + return geoSourceManager.getMapForUser(mapName); + }); + + function makeAction(method, actionInfo) { + actionInfo.update = 'geo:updateSelectStatus'; + registers.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + var allSelected = []; + ecModel.eachComponent({ + mainType: 'geo', + query: payload + }, function (geoModel) { + geoModel[method](payload.name); + var geo = geoModel.coordinateSystem; + each(geo.regions, function (region) { + selected[region.name] = geoModel.isSelected(region.name) || false; + }); // Notice: there might be duplicated name in different regions. + + var names = []; + each(selected, function (v, name) { + selected[name] && names.push(name); + }); + allSelected.push({ + geoIndex: geoModel.componentIndex, + // Use singular, the same naming convention as the event `selectchanged`. + name: names + }); + }); + return { + selected: selected, + allSelected: allSelected, + name: payload.name + }; + }); + } + + makeAction('toggleSelected', { + type: 'geoToggleSelect', + event: 'geoselectchanged' + }); + makeAction('select', { + type: 'geoSelect', + event: 'geoselected' + }); + makeAction('unSelect', { + type: 'geoUnSelect', + event: 'geounselected' + }); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'geoRoam', + event: 'geoRoam', + update: 'updateTransform' + }, function (payload, ecModel, api) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + var geo = componentModel.coordinateSystem; + + if (geo.type !== 'geo') { + return; + } + + var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit'), api); + componentModel.setCenter && componentModel.setCenter(res.center); + componentModel.setZoom && componentModel.setZoom(res.zoom); // All map series with same `map` use the same geo coordinate system + // So the center and zoom must be in sync. Include the series not selected by legend + + if (componentType === 'series') { + each(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setCenter(res.center); + seriesModel.setZoom(res.zoom); + }); + } + }); + }); + } + + function install$a(registers) { + use(install$9); + registers.registerChartView(MapView); + registers.registerSeriesModel(MapSeries); + registers.registerLayout(mapSymbolLayout); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); + createLegacyDataSelectAction('map', registers.registerAction); + } + + /** + * Initialize all computational message for following algorithm. + */ + + function init$2(inRoot) { + var root = inRoot; + root.hierNode = { + defaultAncestor: null, + ancestor: root, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + var nodes = [root]; + var node; + var children; + + while (node = nodes.pop()) { + // jshint ignore:line + children = node.children; + + if (node.isExpand && children.length) { + var n = children.length; + + for (var i = n - 1; i >= 0; i--) { + var child = children[i]; + child.hierNode = { + defaultAncestor: null, + ancestor: child, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: i, + thread: null + }; + nodes.push(child); + } + } + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes a preliminary x coordinate for node. Before that, this function is + * applied recursively to the children of node, as well as the function + * apportion(). After spacing out the children by calling executeShifts(), the + * node is placed to the midpoint of its outermost children. + */ + + function firstWalk(node, separation) { + var children = node.isExpand ? node.children : []; + var siblings = node.parentNode.children; + var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null; + + if (children.length) { + executeShifts(node); + var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; + + if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + node.hierNode.modifier = node.hierNode.prelim - midPoint; + } else { + node.hierNode.prelim = midPoint; + } + } else if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + } + + node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation); + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes all real x-coordinates by summing up the modifiers recursively. + */ + + function secondWalk(node) { + var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; + node.setLayout({ + x: nodeX + }, true); + node.hierNode.modifier += node.parentNode.hierNode.modifier; + } + function separation(cb) { + return arguments.length ? cb : defaultSeparation; + } + /** + * Transform the common coordinate to radial coordinate. + */ + + function radialCoordinate(rad, r) { + rad -= Math.PI / 2; + return { + x: r * Math.cos(rad), + y: r * Math.sin(rad) + }; + } + /** + * Get the layout position of the whole view. + */ + + function getViewRect$1(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + /** + * All other shifts, applied to the smaller subtrees between w- and w+, are + * performed by this function. + * + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + function executeShifts(node) { + var children = node.children; + var n = children.length; + var shift = 0; + var change = 0; + + while (--n >= 0) { + var child = children[n]; + child.hierNode.prelim += shift; + child.hierNode.modifier += shift; + change += child.hierNode.change; + shift += child.hierNode.shift + change; + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * The core of the algorithm. Here, a new subtree is combined with the + * previous subtrees. Threads are used to traverse the inside and outside + * contours of the left and right subtree up to the highest common level. + * Whenever two nodes of the inside contours conflict, we compute the left + * one of the greatest uncommon ancestors using the function nextAncestor() + * and call moveSubtree() to shift the subtree and prepare the shifts of + * smaller subtrees. Finally, we add a new thread (if necessary). + */ + + + function apportion(subtreeV, subtreeW, ancestor, separation) { + if (subtreeW) { + var nodeOutRight = subtreeV; + var nodeInRight = subtreeV; + var nodeOutLeft = nodeInRight.parentNode.children[0]; + var nodeInLeft = subtreeW; + var sumOutRight = nodeOutRight.hierNode.modifier; + var sumInRight = nodeInRight.hierNode.modifier; + var sumOutLeft = nodeOutLeft.hierNode.modifier; + var sumInLeft = nodeInLeft.hierNode.modifier; + + while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { + nodeOutRight = nextRight(nodeOutRight); + nodeOutLeft = nextLeft(nodeOutLeft); + nodeOutRight.hierNode.ancestor = subtreeV; + var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight); + + if (shift > 0) { + moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); + sumInRight += shift; + sumOutRight += shift; + } + + sumInLeft += nodeInLeft.hierNode.modifier; + sumInRight += nodeInRight.hierNode.modifier; + sumOutRight += nodeOutRight.hierNode.modifier; + sumOutLeft += nodeOutLeft.hierNode.modifier; + } + + if (nodeInLeft && !nextRight(nodeOutRight)) { + nodeOutRight.hierNode.thread = nodeInLeft; + nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; + } + + if (nodeInRight && !nextLeft(nodeOutLeft)) { + nodeOutLeft.hierNode.thread = nodeInRight; + nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; + ancestor = subtreeV; + } + } + + return ancestor; + } + /** + * This function is used to traverse the right contour of a subtree. + * It returns the rightmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextRight(node) { + var children = node.children; + return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; + } + /** + * This function is used to traverse the left contour of a subtree (or a subforest). + * It returns the leftmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextLeft(node) { + var children = node.children; + return children.length && node.isExpand ? children[0] : node.hierNode.thread; + } + /** + * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor. + * Otherwise, returns the specified ancestor. + */ + + + function nextAncestor(nodeInLeft, node, ancestor) { + return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor; + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Shifts the current subtree rooted at wr. + * This is done by increasing prelim(w+) and modifier(w+) by shift. + */ + + + function moveSubtree(wl, wr, shift) { + var change = shift / (wr.hierNode.i - wl.hierNode.i); + wr.hierNode.change -= change; + wr.hierNode.shift += shift; + wr.hierNode.modifier += shift; + wr.hierNode.prelim += shift; + wl.hierNode.change += change; + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + function defaultSeparation(node1, node2) { + return node1.parentNode === node2.parentNode ? 1 : 2; + } + + var TreeEdgeShape = + /** @class */ + function () { + function TreeEdgeShape() { + this.parentPoint = []; + this.childPoints = []; + } + + return TreeEdgeShape; + }(); + + var TreePath = + /** @class */ + function (_super) { + __extends(TreePath, _super); + + function TreePath(opts) { + return _super.call(this, opts) || this; + } + + TreePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + TreePath.prototype.getDefaultShape = function () { + return new TreeEdgeShape(); + }; + + TreePath.prototype.buildPath = function (ctx, shape) { + var childPoints = shape.childPoints; + var childLen = childPoints.length; + var parentPoint = shape.parentPoint; + var firstChildPos = childPoints[0]; + var lastChildPos = childPoints[childLen - 1]; + + if (childLen === 1) { + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(firstChildPos[0], firstChildPos[1]); + return; + } + + var orient = shape.orient; + var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1; + var otherDim = 1 - forkDim; + var forkPosition = parsePercent$1(shape.forkPosition, 1); + var tmpPoint = []; + tmpPoint[forkDim] = parentPoint[forkDim]; + tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition; + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.moveTo(firstChildPos[0], firstChildPos[1]); + tmpPoint[forkDim] = firstChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + tmpPoint[forkDim] = lastChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.lineTo(lastChildPos[0], lastChildPos[1]); + + for (var i = 1; i < childLen - 1; i++) { + var point = childPoints[i]; + ctx.moveTo(point[0], point[1]); + tmpPoint[forkDim] = point[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + } + }; + + return TreePath; + }(Path); + + var TreeView = + /** @class */ + function (_super) { + __extends(TreeView, _super); + + function TreeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreeView.type; + _this._mainGroup = new Group(); + return _this; + } + + TreeView.prototype.init = function (ecModel, api) { + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: this.group + }; + this.group.add(this._mainGroup); + }; + + TreeView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var layoutInfo = seriesModel.layoutInfo; + var group = this._mainGroup; + var layout = seriesModel.get('layout'); + + if (layout === 'radial') { + group.x = layoutInfo.x + layoutInfo.width / 2; + group.y = layoutInfo.y + layoutInfo.height / 2; + } else { + group.x = layoutInfo.x; + group.y = layoutInfo.y; + } + + this._updateViewCoordSys(seriesModel, api); + + this._updateController(seriesModel, ecModel, api); + + var oldData = this._data; + data.diff(oldData).add(function (newIdx) { + if (symbolNeedsDraw$1(data, newIdx)) { + // Create node and edge + updateNode(data, newIdx, null, group, seriesModel); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + if (!symbolNeedsDraw$1(data, newIdx)) { + symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + return; + } // Update node and edge + + + updateNode(data, newIdx, symbolEl, group, seriesModel); + }).remove(function (oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // When remove a collapsed node of subtree, since the collapsed + // node haven't been initialized with a symbol element, + // you can't found it's symbol element through index. + // so if we want to remove the symbol element we should insure + // that the symbol element is not null. + + if (symbolEl) { + removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + } + }).execute(); + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + + this._updateNodeAndLinkScale(seriesModel); + + if (seriesModel.get('expandAndCollapse') === true) { + data.eachItemGraphicEl(function (el, dataIndex) { + el.off('click').on('click', function () { + api.dispatchAction({ + type: 'treeExpandAndCollapse', + seriesId: seriesModel.id, + dataIndex: dataIndex + }); + }); + }); + } + + this._data = data; + }; + + TreeView.prototype._updateViewCoordSys = function (seriesModel, api) { + var data = seriesModel.getData(); + var points = []; + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + if (layout && !isNaN(layout.x) && !isNaN(layout.y)) { + points.push([+layout.x, +layout.y]); + } + }); + var min = []; + var max = []; + fromPoints(points, min, max); // If don't Store min max when collapse the root node after roam, + // the root node will disappear. + + var oldMin = this._min; + var oldMax = this._max; // If width or height is 0 + + if (max[0] - min[0] === 0) { + min[0] = oldMin ? oldMin[0] : min[0] - 1; + max[0] = oldMax ? oldMax[0] : max[0] + 1; + } + + if (max[1] - min[1] === 0) { + min[1] = oldMin ? oldMin[1] : min[1] - 1; + max[1] = oldMax ? oldMax[1] : max[1] + 1; + } + + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + viewCoordSys.setCenter(seriesModel.get('center'), api); + viewCoordSys.setZoom(seriesModel.get('zoom')); // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group + + this.group.attr({ + x: viewCoordSys.x, + y: viewCoordSys.y, + scaleX: viewCoordSys.scaleX, + scaleY: viewCoordSys.scaleY + }); + this._min = min; + this._max = max; + }; + + TreeView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(seriesModel); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) { + var data = seriesModel.getData(); + + var nodeScale = this._getNodeGlobalScale(seriesModel); + + data.eachItemGraphicEl(function (el, idx) { + el.setSymbolScale(nodeScale); + }); + }; + + TreeView.prototype._getNodeGlobalScale = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = this._nodeScaleRatio; + var groupZoom = coordSys.scaleX || 1; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + }; + + TreeView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + TreeView.prototype.remove = function () { + this._mainGroup.removeAll(); + + this._data = null; + }; + + TreeView.type = 'tree'; + return TreeView; + }(ChartView); + + function symbolNeedsDraw$1(data, dataIndex) { + var layout = data.getItemLayout(dataIndex); + return layout && !isNaN(layout.x) && !isNaN(layout.y); + } + + function updateNode(data, dataIndex, symbolEl, group, seriesModel) { + var isInit = !symbolEl; + var node = data.tree.getNodeByDataIndex(dataIndex); + var itemModel = node.getModel(); + var visualColor = node.getVisual('style').fill; + var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : '#fff'; + var virtualRoot = data.tree.root; + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceLayout = source.getLayout(); + var sourceOldLayout = sourceSymbolEl ? { + x: sourceSymbolEl.__oldX, + y: sourceSymbolEl.__oldY, + rawX: sourceSymbolEl.__radialOldRawX, + rawY: sourceSymbolEl.__radialOldRawY + } : sourceLayout; + var targetLayout = node.getLayout(); + + if (isInit) { + symbolEl = new Symbol(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + symbolEl.x = sourceOldLayout.x; + symbolEl.y = sourceOldLayout.y; + } else { + symbolEl.updateData(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + } + + symbolEl.__radialOldRawX = symbolEl.__radialRawX; + symbolEl.__radialOldRawY = symbolEl.__radialRawY; + symbolEl.__radialRawX = targetLayout.rawX; + symbolEl.__radialRawY = targetLayout.rawY; + group.add(symbolEl); + data.setItemGraphicEl(dataIndex, symbolEl); + symbolEl.__oldX = symbolEl.x; + symbolEl.__oldY = symbolEl.y; + updateProps(symbolEl, { + x: targetLayout.x, + y: targetLayout.y + }, seriesModel); + var symbolPath = symbolEl.getSymbolPath(); + + if (seriesModel.get('layout') === 'radial') { + var realRoot = virtualRoot.children[0]; + var rootLayout = realRoot.getLayout(); + var length_1 = realRoot.children.length; + var rad = void 0; + var isLeft = void 0; + + if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) { + var center = { + x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2, + y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2 + }; + rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + isLeft = center.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) { + isLeft = targetLayout.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + isLeft = targetLayout.x > rootLayout.x; + + if (!isLeft) { + rad = rad - Math.PI; + } + } + } + + var textPosition = isLeft ? 'left' : 'right'; + var normalLabelModel = itemModel.getModel('label'); + var rotate = normalLabelModel.get('rotate'); + var labelRotateRadian = rotate * (Math.PI / 180); + var textContent = symbolPath.getTextContent(); + + if (textContent) { + symbolPath.setTextConfig({ + position: normalLabelModel.get('position') || textPosition, + rotation: rotate == null ? -rad : labelRotateRadian, + origin: 'center' + }); + textContent.setStyle('verticalAlign', 'middle'); + } + } // Handle status + + + var focus = itemModel.get(['emphasis', 'focus']); + var focusDataIndices = focus === 'relative' ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null; + + if (focusDataIndices) { + // Modify the focus to data indices. + getECData(symbolEl).focus = focusDataIndices; + } + + drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group); + + if (symbolEl.__edge) { + symbolEl.onHoverStateChange = function (toState) { + if (toState !== 'blur') { + // NOTE: Ensure the parent elements will been blurred firstly. + // According to the return of getAncestorsIndices and getDescendantIndices + // TODO: A bit tricky. + var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex); + + if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) { + setStatesFlag(symbolEl.__edge, toState); + } + } + }; + } + } + + function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) { + var itemModel = node.getModel(); + var edgeShape = seriesModel.get('edgeShape'); + var layout = seriesModel.get('layout'); + var orient = seriesModel.getOrient(); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + var edgeForkPosition = seriesModel.get('edgeForkPosition'); + var lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + var edge = symbolEl.__edge; // curve edge from node -> parent + // polyline edge from node -> children + + if (edgeShape === 'curve') { + if (node.parentNode && node.parentNode !== virtualRoot) { + if (!edge) { + edge = symbolEl.__edge = new BezierCurve({ + shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout) + }); + } + + updateProps(edge, { + shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout) + }, seriesModel); + } + } else if (edgeShape === 'polyline') { + if (layout === 'orthogonal') { + if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) { + var children = node.children; + var childPoints = []; + + for (var i = 0; i < children.length; i++) { + var childLayout = children[i].getLayout(); + childPoints.push([childLayout.x, childLayout.y]); + } + + if (!edge) { + edge = symbolEl.__edge = new TreePath({ + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: [[targetLayout.x, targetLayout.y]], + orient: orient, + forkPosition: edgeForkPosition + } + }); + } + + updateProps(edge, { + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: childPoints + } + }, seriesModel); + } + } else { + if ("development" !== 'production') { + throw new Error('The polyline edgeShape can only be used in orthogonal layout'); + } + } + } // show all edge when edgeShape is 'curve', filter node `isExpand` is false when edgeShape is 'polyline' + + + if (edge && !(edgeShape === 'polyline' && !node.isExpand)) { + edge.useStyle(defaults({ + strokeNoScale: true, + fill: null + }, lineStyle)); + setStatesStylesFromModel(edge, itemModel, 'lineStyle'); + setDefaultStateProxy(edge); + group.add(edge); + } + } + + function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) { + var virtualRoot = data.tree.root; + + var _a = getSourceNode(virtualRoot, node), + source = _a.source, + sourceLayout = _a.sourceLayout; + + var symbolEl = data.getItemGraphicEl(node.dataIndex); + + if (!symbolEl) { + return; + } + + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceEdge = sourceSymbolEl.__edge; // 1. when expand the sub tree, delete the children node should delete the edge of + // the source at the same time. because the polyline edge shape is only owned by the source. + // 2.when the node is the only children of the source, delete the node should delete the edge of + // the source at the same time. the same reason as above. + + var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined); + var edgeShape = seriesModel.get('edgeShape'); + var layoutOpt = seriesModel.get('layout'); + var orient = seriesModel.get('orient'); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + + if (edge) { + if (edgeShape === 'curve') { + removeElement(edge, { + shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout), + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') { + removeElement(edge, { + shape: { + parentPoint: [sourceLayout.x, sourceLayout.y], + childPoints: [[sourceLayout.x, sourceLayout.y]] + }, + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } + } + } + + function getSourceNode(virtualRoot, node) { + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceLayout; + + while (sourceLayout = source.getLayout(), sourceLayout == null) { + source = source.parentNode === virtualRoot ? source : source.parentNode || source; + } + + return { + source: source, + sourceLayout: sourceLayout + }; + } + + function removeNode(data, dataIndex, symbolEl, group, seriesModel) { + var node = data.tree.getNodeByDataIndex(dataIndex); + var virtualRoot = data.tree.root; + var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout; // Use same duration and easing with update to have more consistent animation. + + var removeAnimationOpt = { + duration: seriesModel.get('animationDurationUpdate'), + easing: seriesModel.get('animationEasingUpdate') + }; + removeElement(symbolEl, { + x: sourceLayout.x + 1, + y: sourceLayout.y + 1 + }, seriesModel, { + cb: function () { + group.remove(symbolEl); + data.setItemGraphicEl(dataIndex, null); + }, + removeOpt: removeAnimationOpt + }); + symbolEl.fadeOut(null, data.hostModel, { + fadeLabel: true, + animation: removeAnimationOpt + }); // remove edge as parent node + + node.children.forEach(function (childNode) { + removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt); + }); // remove edge as child node + + removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt); + } + + function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) { + var cpx1; + var cpy1; + var cpx2; + var cpy2; + var x1; + var x2; + var y1; + var y2; + + if (layoutOpt === 'radial') { + x1 = sourceLayout.rawX; + y1 = sourceLayout.rawY; + x2 = targetLayout.rawX; + y2 = targetLayout.rawY; + var radialCoor1 = radialCoordinate(x1, y1); + var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature); + var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature); + var radialCoor4 = radialCoordinate(x2, y2); + return { + x1: radialCoor1.x || 0, + y1: radialCoor1.y || 0, + x2: radialCoor4.x || 0, + y2: radialCoor4.y || 0, + cpx1: radialCoor2.x || 0, + cpy1: radialCoor2.y || 0, + cpx2: radialCoor3.x || 0, + cpy2: radialCoor3.y || 0 + }; + } else { + x1 = sourceLayout.x; + y1 = sourceLayout.y; + x2 = targetLayout.x; + y2 = targetLayout.y; + + if (orient === 'LR' || orient === 'RL') { + cpx1 = x1 + (x2 - x1) * curvature; + cpy1 = y1; + cpx2 = x2 + (x1 - x2) * curvature; + cpy2 = y2; + } + + if (orient === 'TB' || orient === 'BT') { + cpx1 = x1; + cpy1 = y1 + (y2 - y1) * curvature; + cpx2 = x2; + cpy2 = y2 + (y1 - y2) * curvature; + } + } + + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }; + } + + var inner$7 = makeInner(); + + function linkSeriesData(opt) { + var mainData = opt.mainData; + var datas = opt.datas; + + if (!datas) { + datas = { + main: mainData + }; + opt.datasAttr = { + main: 'data' + }; + } + + opt.datas = opt.mainData = null; + linkAll(mainData, datas, opt); // Porxy data original methods. + + each(datas, function (data) { + each(mainData.TRANSFERABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(transferInjection, opt)); + }); + }); // Beyond transfer, additional features should be added to `cloneShallow`. + + mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); // Only mainData trigger change, because struct.update may trigger + // another changable methods, which may bring about dead lock. + + each(mainData.CHANGABLE_METHODS, function (methodName) { + mainData.wrapMethod(methodName, curry(changeInjection, opt)); + }); // Make sure datas contains mainData. + + assert(datas[mainData.dataType] === mainData); + } + + function transferInjection(opt, res) { + if (isMainData(this)) { + // Transfer datas to new main data. + var datas = extend({}, inner$7(this).datas); + datas[this.dataType] = res; + linkAll(res, datas, opt); + } else { + // Modify the reference in main data to point newData. + linkSingle(res, this.dataType, inner$7(this).mainData, opt); + } + + return res; + } + + function changeInjection(opt, res) { + opt.struct && opt.struct.update(); + return res; + } + + function cloneShallowInjection(opt, res) { + // cloneShallow, which brings about some fragilities, may be inappropriate + // to be exposed as an API. So for implementation simplicity we can make + // the restriction that cloneShallow of not-mainData should not be invoked + // outside, but only be invoked here. + each(inner$7(res).datas, function (data, dataType) { + data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); + }); + return res; + } + /** + * Supplement method to List. + * + * @public + * @param [dataType] If not specified, return mainData. + */ + + + function getLinkedData(dataType) { + var mainData = inner$7(this).mainData; + return dataType == null || mainData == null ? mainData : inner$7(mainData).datas[dataType]; + } + /** + * Get list of all linked data + */ + + + function getLinkedDataAll() { + var mainData = inner$7(this).mainData; + return mainData == null ? [{ + data: mainData + }] : map(keys(inner$7(mainData).datas), function (type) { + return { + type: type, + data: inner$7(mainData).datas[type] + }; + }); + } + + function isMainData(data) { + return inner$7(data).mainData === data; + } + + function linkAll(mainData, datas, opt) { + inner$7(mainData).datas = {}; + each(datas, function (data, dataType) { + linkSingle(data, dataType, mainData, opt); + }); + } + + function linkSingle(data, dataType, mainData, opt) { + inner$7(mainData).datas[dataType] = data; + inner$7(data).mainData = mainData; + data.dataType = dataType; + + if (opt.struct) { + data[opt.structAttr] = opt.struct; + opt.struct[opt.datasAttr[dataType]] = data; + } // Supplement method. + + + data.getLinkedData = getLinkedData; + data.getLinkedDataAll = getLinkedDataAll; + } + + var TreeNode = + /** @class */ + function () { + function TreeNode(name, hostTree) { + this.depth = 0; + this.height = 0; + /** + * Reference to list item. + * Do not persistent dataIndex outside, + * besause it may be changed by list. + * If dataIndex -1, + * this node is logical deleted (filtered) in list. + */ + + this.dataIndex = -1; + this.children = []; + this.viewChildren = []; + this.isExpand = false; + this.name = name || ''; + this.hostTree = hostTree; + } + /** + * The node is removed. + */ + + + TreeNode.prototype.isRemoved = function () { + return this.dataIndex < 0; + }; + + TreeNode.prototype.eachNode = function (options, cb, context) { + if (isFunction(options)) { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + + if (isString(options)) { + options = { + order: options + }; + } + + var order = options.order || 'preorder'; + var children = this[options.attr || 'children']; + var suppressVisitSub; + order === 'preorder' && (suppressVisitSub = cb.call(context, this)); + + for (var i = 0; !suppressVisitSub && i < children.length; i++) { + children[i].eachNode(options, cb, context); + } + + order === 'postorder' && cb.call(context, this); + }; + /** + * Update depth and height of this subtree. + */ + + + TreeNode.prototype.updateDepthAndHeight = function (depth) { + var height = 0; + this.depth = depth; + + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.updateDepthAndHeight(depth + 1); + + if (child.height > height) { + height = child.height; + } + } + + this.height = height + 1; + }; + + TreeNode.prototype.getNodeById = function (id) { + if (this.getId() === id) { + return this; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].getNodeById(id); + + if (res) { + return res; + } + } + }; + + TreeNode.prototype.contains = function (node) { + if (node === this) { + return true; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].contains(node); + + if (res) { + return res; + } + } + }; + /** + * @param includeSelf Default false. + * @return order: [root, child, grandchild, ...] + */ + + + TreeNode.prototype.getAncestors = function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + + while (node) { + ancestors.push(node); + node = node.parentNode; + } + + ancestors.reverse(); + return ancestors; + }; + + TreeNode.prototype.getAncestorsIndices = function () { + var indices = []; + var currNode = this; + + while (currNode) { + indices.push(currNode.dataIndex); + currNode = currNode.parentNode; + } + + indices.reverse(); + return indices; + }; + + TreeNode.prototype.getDescendantIndices = function () { + var indices = []; + this.eachNode(function (childNode) { + indices.push(childNode.dataIndex); + }); + return indices; + }; + + TreeNode.prototype.getValue = function (dimension) { + var data = this.hostTree.data; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }; + + TreeNode.prototype.setLayout = function (layout, merge) { + this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); + }; + /** + * @return {Object} layout + */ + + + TreeNode.prototype.getLayout = function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }; // @depcrecated + // getModel(path: S): Model + // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + TreeNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; // TODO: TYPE More specific model + + + TreeNode.prototype.getLevelModel = function () { + return (this.hostTree.levelModels || [])[this.depth]; + }; + + TreeNode.prototype.setVisual = function (key, value) { + this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }; + /** + * Get item visual + * FIXME: make return type better + */ + + + TreeNode.prototype.getVisual = function (key) { + return this.hostTree.data.getItemVisual(this.dataIndex, key); + }; + + TreeNode.prototype.getRawIndex = function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }; + + TreeNode.prototype.getId = function () { + return this.hostTree.data.getId(this.dataIndex); + }; + /** + * index in parent's children + */ + + + TreeNode.prototype.getChildIndex = function () { + if (this.parentNode) { + var children = this.parentNode.children; + + for (var i = 0; i < children.length; ++i) { + if (children[i] === this) { + return i; + } + } + + return -1; + } + + return -1; + }; + /** + * if this is an ancestor of another node + * + * @param node another node + * @return if is ancestor + */ + + + TreeNode.prototype.isAncestorOf = function (node) { + var parent = node.parentNode; + + while (parent) { + if (parent === this) { + return true; + } + + parent = parent.parentNode; + } + + return false; + }; + /** + * if this is an descendant of another node + * + * @param node another node + * @return if is descendant + */ + + + TreeNode.prototype.isDescendantOf = function (node) { + return node !== this && node.isAncestorOf(this); + }; + + return TreeNode; + }(); + + var Tree = + /** @class */ + function () { + function Tree(hostModel) { + this.type = 'tree'; + this._nodes = []; + this.hostModel = hostModel; + } + + Tree.prototype.eachNode = function (options, cb, context) { + this.root.eachNode(options, cb, context); + }; + + Tree.prototype.getNodeByDataIndex = function (dataIndex) { + var rawIndex = this.data.getRawIndex(dataIndex); + return this._nodes[rawIndex]; + }; + + Tree.prototype.getNodeById = function (name) { + return this.root.getNodeById(name); + }; + /** + * Update item available by list, + * when list has been performed options like 'filterSelf' or 'map'. + */ + + + Tree.prototype.update = function () { + var data = this.data; + var nodes = this._nodes; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + }; + /** + * Clear all layouts + */ + + + Tree.prototype.clearLayouts = function () { + this.data.clearItemLayouts(); + }; + /** + * data node format: + * { + * name: ... + * value: ... + * children: [ + * { + * name: ... + * value: ... + * children: ... + * }, + * ... + * ] + * } + */ + + + Tree.createTree = function (dataRoot, hostModel, beforeLink) { + var tree = new Tree(hostModel); + var listData = []; + var dimMax = 1; + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + var value = dataNode.value; + dimMax = Math.max(dimMax, isArray(value) ? value.length : 1); + listData.push(dataNode); + var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree); + parentNode ? addChild(node, parentNode) : tree.root = node; + + tree._nodes.push(node); + + var children = dataNode.children; + + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + var dimensions = prepareSeriesDataSchema(listData, { + coordDimensions: ['value'], + dimensionsCount: dimMax + }).dimensions; + var list = new SeriesData(dimensions, hostModel); + list.initData(listData); + beforeLink && beforeLink(list); + linkSeriesData({ + mainData: list, + struct: tree, + structAttr: 'tree' + }); + tree.update(); + return tree; + }; + + return Tree; + }(); + /** + * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, + * so this function is not ready and not necessary to be public. + */ + + + function addChild(child, node) { + var children = node.children; + + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; + } + + function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { + if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + + if (isString(targetNode)) { + targetNode = root.getNodeById(targetNode); + } + + if (targetNode && root.contains(targetNode)) { + return { + node: targetNode + }; + } + + var targetNodeId = payload.targetNodeId; + + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return { + node: targetNode + }; + } + } + } // Not includes the given node at the last item. + + function getPathToRoot(node) { + var path = []; + + while (node) { + node = node.parentNode; + node && path.push(node); + } + + return path.reverse(); + } + function aboveViewRoot(viewRoot, node) { + var viewPath = getPathToRoot(viewRoot); + return indexOf(viewPath, node) >= 0; + } // From root to the input node (the input node will be included). + + function wrapTreePathInfo(node, seriesModel) { + var treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: seriesModel.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + return treePathInfo; + } + + var TreeSeriesModel = + /** @class */ + function (_super) { + __extends(TreeSeriesModel, _super); + + function TreeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.hasSymbolVisual = true; // Do it self. + + _this.ignoreStyleOnData = true; + return _this; + } + /** + * Init a tree data structure from data in option series + */ + + + TreeSeriesModel.prototype.getInitialData = function (option) { + // create a virtual root + var root = { + name: option.name, + children: option.data + }; + var leaves = option.leaves || {}; + var leavesModel = new Model(leaves, this, this.ecModel); + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + + if (!(node && node.children.length && node.isExpand)) { + model.parentModel = leavesModel; + } + + return model; + }); + } + + var treeDepth = 0; + tree.eachNode('preorder', function (node) { + if (node.depth > treeDepth) { + treeDepth = node.depth; + } + }); + var expandAndCollapse = option.expandAndCollapse; + var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth; + tree.root.eachNode('preorder', function (node) { + var item = node.hostTree.data.getRawDataItem(node.dataIndex); // Add item.collapsed != null, because users can collapse node original in the series.data. + + node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth; + }); + return tree.data; + }; + /** + * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. + * @returns {string} orient + */ + + + TreeSeriesModel.prototype.getOrient = function () { + var orient = this.get('orient'); + + if (orient === 'horizontal') { + orient = 'LR'; + } else if (orient === 'vertical') { + orient = 'TB'; + } + + return orient; + }; + + TreeSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + TreeSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var tree = this.getData().tree; + var realRoot = tree.root.children[0]; + var node = tree.getNodeByDataIndex(dataIndex); + var value = node.getValue(); + var name = node.name; + + while (node && node !== realRoot) { + name = node.parentNode.name + '.' + name; + node = node.parentNode; + } + + return createTooltipMarkup('nameValue', { + name: name, + value: value, + noValue: isNaN(value) || value == null + }); + }; // Add tree path to tooltip param + + + TreeSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); + params.collapsed = !node.isExpand; + return params; + }; + + TreeSeriesModel.type = 'series.tree'; // can support the position parameters 'left', 'top','right','bottom', 'width', + // 'height' in the setOption() with 'merge' mode normal. + + TreeSeriesModel.layoutMode = 'box'; + TreeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // the position of the whole view + left: '12%', + top: '12%', + right: '12%', + bottom: '12%', + // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' + layout: 'orthogonal', + // value can be 'polyline' + edgeShape: 'curve', + edgeForkPosition: '50%', + // true | false | 'move' | 'scale', see module:component/helper/RoamController. + roam: false, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.4, + // Default on center of graph + center: null, + zoom: 1, + orient: 'LR', + symbol: 'emptyCircle', + symbolSize: 7, + expandAndCollapse: true, + initialTreeDepth: 2, + lineStyle: { + color: '#ccc', + width: 1.5, + curveness: 0.5 + }, + itemStyle: { + color: 'lightsteelblue', + // borderColor: '#c23531', + borderWidth: 1.5 + }, + label: { + show: true + }, + animationEasing: 'linear', + animationDuration: 700, + animationDurationUpdate: 500 + }; + return TreeSeriesModel; + }(SeriesModel); + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * Traverse the tree from bottom to top and do something + */ + function eachAfter(root, callback, separation) { + var nodes = [root]; + var next = []; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + next.push(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = 0; i < children.length; i++) { + nodes.push(children[i]); + } + } + } + } + + while (node = next.pop()) { + // jshint ignore:line + callback(node, separation); + } + } + /** + * Traverse the tree from top to bottom and do something + */ + + + function eachBefore(root, callback) { + var nodes = [root]; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + callback(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = children.length - 1; i >= 0; i--) { + nodes.push(children[i]); + } + } + } + } + } + + function treeLayout(ecModel, api) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + commonLayout(seriesModel, api); + }); + } + + function commonLayout(seriesModel, api) { + var layoutInfo = getViewRect$1(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var layout = seriesModel.get('layout'); + var width = 0; + var height = 0; + var separation$1 = null; + + if (layout === 'radial') { + width = 2 * Math.PI; + height = Math.min(layoutInfo.height, layoutInfo.width) / 2; + separation$1 = separation(function (node1, node2) { + return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; + }); + } else { + width = layoutInfo.width; + height = layoutInfo.height; + separation$1 = separation(); + } + + var virtualRoot = seriesModel.getData().tree.root; + var realRoot = virtualRoot.children[0]; + + if (realRoot) { + init$2(virtualRoot); + eachAfter(realRoot, firstWalk, separation$1); + virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim; + eachBefore(realRoot, secondWalk); + var left_1 = realRoot; + var right_1 = realRoot; + var bottom_1 = realRoot; + eachBefore(realRoot, function (node) { + var x = node.getLayout().x; + + if (x < left_1.getLayout().x) { + left_1 = node; + } + + if (x > right_1.getLayout().x) { + right_1 = node; + } + + if (node.depth > bottom_1.depth) { + bottom_1 = node; + } + }); + var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2; + var tx_1 = delta - left_1.getLayout().x; + var kx_1 = 0; + var ky_1 = 0; + var coorX_1 = 0; + var coorY_1 = 0; + + if (layout === 'radial') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); // here we use (node.depth - 1), bucause the real root's depth is 1 + + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = (node.depth - 1) * ky_1; + var finalCoor = radialCoordinate(coorX_1, coorY_1); + node.setLayout({ + x: finalCoor.x, + y: finalCoor.y, + rawX: coorX_1, + rawY: coorY_1 + }, true); + }); + } else { + var orient_1 = seriesModel.getOrient(); + + if (orient_1 === 'RL' || orient_1 === 'LR') { + ky_1 = height / (right_1.getLayout().x + delta + tx_1); + kx_1 = width / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorY_1 = (node.getLayout().x + tx_1) * ky_1; + coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } else if (orient_1 === 'TB' || orient_1 === 'BT') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } + } + } + } + + function treeVisual(ecModel) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); // TODO Optimize + + var style = model.getModel('itemStyle').getItemStyle(); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function installTreeAction(registers) { + registers.registerAction({ + type: 'treeExpandAndCollapse', + event: 'treeExpandAndCollapse', + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var dataIndex = payload.dataIndex; + var tree = seriesModel.getData().tree; + var node = tree.getNodeByDataIndex(dataIndex); + node.isExpand = !node.isExpand; + }); + }); + registers.registerAction({ + type: 'treeRoam', + event: 'treeRoam', + // Here we set 'none' instead of 'update', because roam action + // just need to update the transform matrix without having to recalculate + // the layout. So don't need to go through the whole update process, such + // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. + update: 'none' + }, function (payload, ecModel, api) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload, undefined, api); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + function install$b(registers) { + registers.registerChartView(TreeView); + registers.registerSeriesModel(TreeSeriesModel); + registers.registerLayout(treeLayout); + registers.registerVisual(treeVisual); + installTreeAction(registers); + } + + var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove']; + function installTreemapAction(registers) { + for (var i = 0; i < actionTypes.length; i++) { + registers.registerAction({ + type: actionTypes[i], + update: 'updateView' + }, noop); + } + + registers.registerAction({ + type: 'treemapRootToNode', + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'treemap', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + } + + function enableAriaDecalForTree(seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + var decalPaletteScope = {}; + tree.eachNode(function (node) { + // Use decal of level 1 node + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope); + node.setVisual('decal', decal); + }); + } + + var TreemapSeriesModel = + /** @class */ + function (_super) { + __extends(TreemapSeriesModel, _super); + + function TreemapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapSeriesModel.type; + _this.preventUsingHoverLayer = true; + return _this; + } + /** + * @override + */ + + + TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue(root); + var levels = option.levels || []; // Used in "visual priority" in `treemapVisual.js`. + // This way is a little tricky, must satisfy the precondition: + // 1. There is no `treeNode.getModel('itemStyle.xxx')` used. + // 2. The `Model.prototype.getModel()` will not use any clone-like way. + + var designatedVisualItemStyle = this.designatedVisualItemStyle = {}; + var designatedVisualModel = new Model({ + itemStyle: designatedVisualItemStyle + }, this, ecModel); + levels = option.levels = setDefault(levels, ecModel); + var levelModels = map(levels || [], function (levelDefine) { + return new Model(levelDefine, designatedVisualModel, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = node ? levelModels[node.depth] : null; // If no levelModel, we also need `designatedVisualModel`. + + model.parentModel = levelModel || designatedVisualModel; + return model; + }); + } + + return tree.data; + }; + + TreemapSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + + + TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + + + TreemapSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); // compatitable the previous code. + + params.treePathInfo = params.treeAncestors; + return params; + }; + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + + + TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + extend(this.layoutInfo, layoutInfo); + }; + /** + * @param {string} id + * @return {number} index + */ + + + TreemapSeriesModel.prototype.mapIdToIndex = function (id) { + // A feature is implemented: + // index is monotone increasing with the sequence of + // input id at the first time. + // This feature can make sure that each data item and its + // mapped color have the same index between data list and + // color list at the beginning, which is useful for user + // to adjust data-color mapping. + + /** + * @private + * @type {Object} + */ + var idIndexMap = this._idIndexMap; + + if (!idIndexMap) { + idIndexMap = this._idIndexMap = createHashMap(); + /** + * @private + * @type {number} + */ + + this._idIndexMapCount = 0; + } + + var index = idIndexMap.get(id); + + if (index == null) { + idIndexMap.set(id, index = this._idIndexMapCount++); + } + + return index; + }; + + TreemapSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + TreemapSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + TreemapSeriesModel.type = 'series.treemap'; + TreemapSeriesModel.layoutMode = 'box'; + TreemapSeriesModel.defaultOption = { + // Disable progressive rendering + progressive: 0, + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + width: '80%', + height: '80%', + sort: true, + clipWindow: 'origin', + squareRatio: 0.5 * (1 + Math.sqrt(5)), + leafDepth: null, + drillDownIcon: '▶', + // to align specialized icon. ▷▶❒❐▼✚ + zoomToNodeRatio: 0.32 * 0.32, + roam: true, + nodeClick: 'zoomToNode', + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, + itemStyle: { + color: 'rgba(0,0,0,0.7)', + textStyle: { + color: '#fff' + } + }, + emphasis: { + itemStyle: { + color: 'rgba(0,0,0,0.9)' // '#5793f3', + + } + } + }, + label: { + show: true, + // Do not use textDistance, for ellipsis rect just the same as treemap node rect. + distance: 0, + padding: 5, + position: 'inside', + // formatter: null, + color: '#fff', + overflow: 'truncate' // align + // verticalAlign + + }, + upperLabel: { + show: false, + position: [0, '50%'], + height: 20, + // formatter: null, + // color: '#fff', + overflow: 'truncate', + // align: null, + verticalAlign: 'middle' + }, + itemStyle: { + color: null, + colorAlpha: null, + colorSaturation: null, + borderWidth: 0, + gapWidth: 0, + borderColor: '#fff', + borderColorSaturation: null // If specified, borderColor will be ineffective, and the + // border color is evaluated by color of current node and + // borderColorSaturation. + + }, + emphasis: { + upperLabel: { + show: true, + position: [0, '50%'], + overflow: 'truncate', + verticalAlign: 'middle' + } + }, + visualDimension: 0, + visualMin: null, + visualMax: null, + color: [], + // level[n].color (if necessary). + // + Specify color list of each level. level[0].color would be global + // color list if not specified. (see method `setDefault`). + // + But set as a empty array to forbid fetch color from global palette + // when using nodeModel.get('color'), otherwise nodes on deep level + // will always has color palette set and are not able to inherit color + // from parent node. + // + TreemapSeries.color can not be set as 'none', otherwise effect + // legend color fetching (see seriesColor.js). + colorAlpha: null, + colorSaturation: null, + colorMappingBy: 'index', + visibleMin: 10, + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, + // grandchildren will not show. + // Why grandchildren? If not grandchildren but children, + // some siblings show children and some not, + // the appearance may be mess and not consistent, + levels: [] // Each item: { + // visibleMin, itemStyle, visualDimension, label + // } + + }; + return TreemapSeriesModel; + }(SeriesModel); + /** + * @param {Object} dataNode + */ + + + function completeTreeValue(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue(child); + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + /** + * set default to level configuration + */ + + + function setDefault(levels, ecModel) { + var globalColorList = normalizeToArray(ecModel.get('color')); + var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + var hasDecalDefine; + each(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + var modelDecal = model.get('decal'); + + if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') { + hasColorDefine = true; + } + + if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') { + hasDecalDefine = true; + } + }); + var level0 = levels[0] || (levels[0] = {}); + + if (!hasColorDefine) { + level0.color = globalColorList.slice(); + } + + if (!hasDecalDefine && globalDecalList) { + level0.decal = globalDecalList.slice(); + } + + return levels; + } + + var TEXT_PADDING = 8; + var ITEM_GAP = 8; + var ARRAY_LENGTH = 5; + + var Breadcrumb = + /** @class */ + function () { + function Breadcrumb(containerGroup) { + this.group = new Group(); + containerGroup.add(this.group); + } + + Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle'); + var emphasisModel = model.getModel('emphasis'); + var textStyleModel = normalStyleModel.getModel('textStyle'); + var emphasisTextStyleModel = emphasisModel.getModel(['itemStyle', 'textStyle']); + var layoutParam = { + pos: { + left: model.get('left'), + right: model.get('right'), + top: model.get('top'), + bottom: model.get('bottom') + }, + box: { + width: api.getWidth(), + height: api.getHeight() + }, + emptyItemWidth: model.get('emptyItemWidth'), + totalWidth: 0, + renderList: [] + }; + + this._prepare(targetNode, layoutParam, textStyleModel); + + this._renderContent(seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect); + + positionElement(thisGroup, layoutParam.pos, layoutParam.box); + }; + /** + * Prepare render list and total width + * @private + */ + + + Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = convertOptionIdName(node.getModel().get('name'), ''); + var textRect = textStyleModel.getTextRect(text); + var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth); + layoutParam.totalWidth += itemWidth + ITEM_GAP; + layoutParam.renderList.push({ + node: node, + text: text, + width: itemWidth + }); + } + }; + /** + * @private + */ + + + Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = seriesModel.get(['breadcrumb', 'height']); + var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box); + var totalWidth = layoutParam.totalWidth; + var renderList = layoutParam.renderList; + var emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + + for (var i = renderList.length - 1; i >= 0; i--) { + var item = renderList[i]; + var itemNode = item.node; + var itemWidth = item.width; + var text = item.text; // Hdie text and shorten width if necessary. + + if (totalWidth > availableSize.width) { + totalWidth -= itemWidth - emptyItemWidth; + itemWidth = emptyItemWidth; + text = null; + } + + var el = new Polygon({ + shape: { + points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0) + }, + style: defaults(normalStyleModel.getItemStyle(), { + lineJoin: 'bevel' + }), + textContent: new ZRText({ + style: createTextStyle(textStyleModel, { + text: text + }) + }), + textConfig: { + position: 'inside' + }, + z2: Z2_EMPHASIS_LIFT * 1e4, + onclick: curry(onSelect, itemNode) + }); + el.disableLabelAnimation = true; + el.getTextContent().ensureState('emphasis').style = createTextStyle(emphasisTextStyleModel, { + text: text + }); + el.ensureState('emphasis').style = emphasisItemStyle; + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + this.group.add(el); + packEventData(el, seriesModel, itemNode); + lastX += itemWidth + ITEM_GAP; + } + }; + + Breadcrumb.prototype.remove = function () { + this.group.removeAll(); + }; + + return Breadcrumb; + }(); + + function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { + var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]]; + !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); + !head && points.push([x, y + itemHeight / 2]); + return points; + } // Package custom mouse event. + + + function packEventData(el, seriesModel, itemNode) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'treemap', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'treemap', + selfType: 'breadcrumb', + nodeData: { + dataIndex: itemNode && itemNode.dataIndex, + name: itemNode && itemNode.name + }, + treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) + }; + } + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * Animate multiple elements with a single done-callback. + * + * @example + * animation + * .createWrap() + * .add(el1, {x: 10, y: 10}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ + var AnimationWrap = + /** @class */ + function () { + function AnimationWrap() { + this._storage = []; + this._elExistsMap = {}; + } + /** + * Caution: a el can only be added once, otherwise 'done' + * might not be called. This method checks this (by el.id), + * suppresses adding and returns false when existing el found. + * + * @return Whether adding succeeded. + */ + + + AnimationWrap.prototype.add = function (el, target, duration, delay, easing) { + if (this._elExistsMap[el.id]) { + return false; + } + + this._elExistsMap[el.id] = true; + + this._storage.push({ + el: el, + target: target, + duration: duration, + delay: delay, + easing: easing + }); + + return true; + }; + /** + * Only execute when animation done/aborted. + */ + + + AnimationWrap.prototype.finished = function (callback) { + this._finishedCallback = callback; + return this; + }; + /** + * Will stop exist animation firstly. + */ + + + AnimationWrap.prototype.start = function () { + var _this = this; + + var count = this._storage.length; + + var checkTerminate = function () { + count--; + + if (count <= 0) { + // Guard. + _this._storage.length = 0; + _this._elExistsMap = {}; + _this._finishedCallback && _this._finishedCallback(); + } + }; + + for (var i = 0, len = this._storage.length; i < len; i++) { + var item = this._storage[i]; + item.el.animateTo(item.target, { + duration: item.duration, + delay: item.delay, + easing: item.easing, + setToFinal: true, + done: checkTerminate, + aborted: checkTerminate + }); + } + + return this; + }; + + return AnimationWrap; + }(); + + function createWrap() { + return new AnimationWrap(); + } + + var Group$1 = Group; + var Rect$1 = Rect; + var DRAG_THRESHOLD = 3; + var PATH_LABEL_NOAMAL = 'label'; + var PATH_UPPERLABEL_NORMAL = 'upperLabel'; // Should larger than emphasis states lift z + + var Z2_BASE = Z2_EMPHASIS_LIFT * 10; // Should bigger than every z2. + + var Z2_BG = Z2_EMPHASIS_LIFT * 2; + var Z2_CONTENT = Z2_EMPHASIS_LIFT * 3; + var getStateItemStyle = makeStyleMapper([['fill', 'color'], // `borderColor` and `borderWidth` has been occupied, + // so use `stroke` to indicate the stroke of the rect. + ['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]); + + var getItemStyleNormal = function (model) { + // Normal style props should include emphasis style props. + var itemStyle = getStateItemStyle(model); // Clear styles set by emphasis. + + itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; + return itemStyle; + }; + + var inner$8 = makeInner(); + + var TreemapView = + /** @class */ + function (_super) { + __extends(TreemapView, _super); + + function TreemapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapView.type; + _this._state = 'ready'; + _this._storage = createStorage(); + return _this; + } + /** + * @override + */ + + + TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) { + var models = ecModel.findComponents({ + mainType: 'series', + subType: 'treemap', + query: payload + }); + + if (indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var payloadType = payload && payload.type; + var layoutInfo = seriesModel.layoutInfo; + var isInit = !this._oldTree; + var thisStorage = this._storage; // Mark new root when action is treemapRootToNode. + + var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? { + rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], + direction: payload.direction + } : null; + + var containerGroup = this._giveContainerGroup(layoutInfo); + + var hasAnimation = seriesModel.get('animation'); + + var renderResult = this._doRender(containerGroup, seriesModel, reRoot); + + hasAnimation && !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally(); + + this._resetController(api); + + this._renderBreadcrumb(seriesModel, api, targetInfo); + }; + + TreemapView.prototype._giveContainerGroup = function (layoutInfo) { + var containerGroup = this._containerGroup; + + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group$1(); + + this._initEvents(containerGroup); + + this.group.add(containerGroup); + } + + containerGroup.x = layoutInfo.x; + containerGroup.y = layoutInfo.y; + return containerGroup; + }; + + TreemapView.prototype._doRender = function (containerGroup, seriesModel, reRoot) { + var thisTree = seriesModel.getData().tree; + var oldTree = this._oldTree; // Clear last shape records. + + var lastsForAnimation = createStorage(); + var thisStorage = createStorage(); + var oldStorage = this._storage; + var willInvisibleEls = []; + + function doRenderNode(thisNode, oldNode, parentGroup, depth) { + return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth); + } // Notice: When thisTree and oldTree are the same tree (see list.cloneShallow), + // the oldTree is actually losted, so we cannot find all of the old graphic + // elements from tree. So we use this strategy: make element storage, move + // from old storage to new storage, clear old storage. + + + dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0); // Process all removing. + + var willDeleteEls = clearStorage(oldStorage); + this._oldTree = thisTree; + this._storage = thisStorage; + return { + lastsForAnimation: lastsForAnimation, + willDeleteEls: willDeleteEls, + renderFinally: renderFinally + }; + + function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) { + // When 'render' is triggered by action, + // 'this' and 'old' may be the same tree, + // we use rawIndex in that case. + if (sameTree) { + oldViewChildren = thisViewChildren; + each(thisViewChildren, function (child, index) { + !child.isRemoved() && processNode(index, index); + }); + } // Diff hierarchically (diff only in each subtree, but not whole). + // because, consistency of view is important. + else { + new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + } + + function getKey(node) { + // Identify by name or raw index. + return node.getId(); + } + + function processNode(newIndex, oldIndex) { + var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; + var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; + var group = doRenderNode(thisNode, oldNode, parentGroup, depth); + group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1); + } + } + + function clearStorage(storage) { + var willDeleteEls = createStorage(); + storage && each(storage, function (store, storageName) { + var delEls = willDeleteEls[storageName]; + each(store, function (el) { + el && (delEls.push(el), inner$8(el).willDelete = true); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each(willDeleteEls, function (els) { + each(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + each(willInvisibleEls, function (el) { + el.invisible = true; // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + + el.dirty(); + }); + } + }; + + TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) { + var durationOption = seriesModel.get('animationDurationUpdate'); + var easingOption = seriesModel.get('animationEasing'); // TODO: do not support function until necessary. + + var duration = (isFunction(durationOption) ? 0 : durationOption) || 0; + var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut'; + var animationWrap = createWrap(); // Make delete animations. + + each(renderResult.willDeleteEls, function (store, storageName) { + each(store, function (el, rawIndex) { + if (el.invisible) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + + var target; + var innerStore = inner$8(parent); + + if (reRoot && reRoot.direction === 'drillDown') { + target = parent === reRoot.rootNodeGroup // This is the content element of view root. + // Only `content` will enter this branch, because + // `background` and `nodeGroup` will not be deleted. + ? { + shape: { + x: 0, + y: 0, + width: innerStore.nodeWidth, + height: innerStore.nodeHeight + }, + style: { + opacity: 0 + } + } // Others. + : { + style: { + opacity: 0 + } + }; + } else { + var targetX = 0; + var targetY = 0; + + if (!innerStore.willDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rolling up effect. + targetX = innerStore.nodeWidth / 2; + targetY = innerStore.nodeHeight / 2; + } + + target = storageName === 'nodeGroup' ? { + x: targetX, + y: targetY, + style: { + opacity: 0 + } + } : { + shape: { + x: targetX, + y: targetY, + width: 0, + height: 0 + }, + style: { + opacity: 0 + } + }; + } // TODO: do not support delay until necessary. + + + target && animationWrap.add(el, target, duration, 0, easing); + }); + }); // Make other animations + + each(this._storage, function (store, storageName) { + each(store, function (el, rawIndex) { + var last = renderResult.lastsForAnimation[storageName][rawIndex]; + var target = {}; + + if (!last) { + return; + } + + if (el instanceof Group) { + if (last.oldX != null) { + target.x = el.x; + target.y = el.y; + el.x = last.oldX; + el.y = last.oldY; + } + } else { + if (last.oldShape) { + target.shape = extend({}, el.shape); + el.setShape(last.oldShape); + } + + if (last.fadein) { + el.setStyle('opacity', 0); + target.style = { + opacity: 1 + }; + } // When animation is stopped for succedent animation starting, + // el.style.opacity might not be 1 + else if (el.style.opacity !== 1) { + target.style = { + opacity: 1 + }; + } + } + + animationWrap.add(el, target, duration, 0, easing); + }); + }, this); + this._state = 'animating'; + animationWrap.finished(bind(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)).start(); + }; + + TreemapView.prototype._resetController = function (api) { + var controller = this._controller; // Init controller. + + if (!controller) { + controller = this._controller = new RoamController(api.getZr()); + controller.enable(this.seriesModel.get('roam')); + controller.on('pan', bind(this._onPan, this)); + controller.on('zoom', bind(this._onZoom, this)); + } + + var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + controller.setPointerChecker(function (e, x, y) { + return rect.contain(x, y); + }); + }; + + TreemapView.prototype._clearController = function () { + var controller = this._controller; + + if (controller) { + controller.dispose(); + controller = null; + } + }; + + TreemapView.prototype._onPan = function (e) { + if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + e.dx, + y: rootLayout.y + e.dy, + width: rootLayout.width, + height: rootLayout.height + } + }); + } + }; + + TreemapView.prototype._onZoom = function (e) { + var mouseX = e.originX; + var mouseY = e.originY; + + if (this._state !== 'animating') { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height); + var layoutInfo = this.seriesModel.layoutInfo; // Transform mouse coord from global to containerGroup. + + mouseX -= layoutInfo.x; + mouseY -= layoutInfo.y; // Scale root bounding rect. + + var m = create$1(); + translate(m, m, [-mouseX, -mouseY]); + scale$1(m, m, [e.scale, e.scale]); + translate(m, m, [mouseX, mouseY]); + rect.applyTransform(m); + this.api.dispatchAction({ + type: 'treemapRender', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + } + }; + + TreemapView.prototype._initEvents = function (containerGroup) { + var _this = this; + + containerGroup.on('click', function (e) { + if (_this._state !== 'ready') { + return; + } + + var nodeClick = _this.seriesModel.get('nodeClick', true); + + if (!nodeClick) { + return; + } + + var targetInfo = _this.findTarget(e.offsetX, e.offsetY); + + if (!targetInfo) { + return; + } + + var node = targetInfo.node; + + if (node.getLayout().isLeafRoot) { + _this._rootToNode(targetInfo); + } else { + if (nodeClick === 'zoomToNode') { + _this._zoomToNode(targetInfo); + } else if (nodeClick === 'link') { + var itemModel = node.hostTree.data.getItemModel(node.dataIndex); + var link = itemModel.get('link', true); + var linkTarget = itemModel.get('target', true) || 'blank'; + link && windowOpen(link, linkTarget); + } + } + }, this); + }; + + TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) { + var _this = this; + + if (!targetInfo) { + targetInfo = seriesModel.get('leafDepth', true) != null ? { + node: seriesModel.getViewRoot() + } // FIXME + // better way? + // Find breadcrumb tail on center of containerGroup. + : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = { + node: seriesModel.getData().tree.root + }; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) { + if (_this._state !== 'animating') { + aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({ + node: node + }) : _this._zoomToNode({ + node: node + }); + } + }); + }; + /** + * @override + */ + + + TreemapView.prototype.remove = function () { + this._clearController(); + + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }; + + TreemapView.prototype.dispose = function () { + this._clearController(); + }; + + TreemapView.prototype._zoomToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + + TreemapView.prototype._rootToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapRootToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + /** + * @public + * @param {number} x Global coord x. + * @param {number} y Global coord y. + * @return {Object} info If not found, return undefined; + * @return {number} info.node Target node. + * @return {number} info.offsetX x refer to target node. + * @return {number} info.offsetY y refer to target node. + */ + + + TreemapView.prototype.findTarget = function (x, y) { + var targetInfo; + var viewRoot = this.seriesModel.getViewRoot(); + viewRoot.eachNode({ + attr: 'viewChildren', + order: 'preorder' + }, function (node) { + var bgEl = this._storage.background[node.getRawIndex()]; // If invisible, there might be no element. + + + if (bgEl) { + var point = bgEl.transformCoordToLocal(x, y); + var shape = bgEl.shape; // For performance consideration, don't use 'getBoundingRect'. + + if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) { + targetInfo = { + node: node, + offsetX: point[0], + offsetY: point[1] + }; + } else { + return false; // Suppress visit subtree. + } + } + }, this); + return targetInfo; + }; + + TreemapView.type = 'treemap'; + return TreemapView; + }(ChartView); + /** + * @inner + */ + + + function createStorage() { + return { + nodeGroup: [], + background: [], + content: [] + }; + } + /** + * @inner + * @return Return undefined means do not travel further. + */ + + + function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) { + // Whether under viewRoot. + if (!thisNode) { + // Deleting nodes will be performed finally. This method just find + // element from old storage, or create new element, set them to new + // storage, and set styles. + return; + } // ------------------------------------------------------------------- + // Start of closure variables available in "Procedures in renderNode". + + + var thisLayout = thisNode.getLayout(); + var data = seriesModel.getData(); + var nodeModel = thisNode.getModel(); // Only for enabling highlight/downplay. Clear firstly. + // Because some node will not be rendered. + + data.setItemGraphicEl(thisNode.dataIndex, null); + + if (!thisLayout || !thisLayout.isInView) { + return; + } + + var thisWidth = thisLayout.width; + var thisHeight = thisLayout.height; + var borderWidth = thisLayout.borderWidth; + var thisInvisible = thisLayout.invisible; + var thisRawIndex = thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + var thisViewChildren = thisNode.viewChildren; + var upperHeight = thisLayout.upperHeight; + var isParent = thisViewChildren && thisViewChildren.length; + var itemStyleNormalModel = nodeModel.getModel('itemStyle'); + var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']); + var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']); + var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']); + var borderRadius = itemStyleNormalModel.get('borderRadius') || 0; // End of closure ariables available in "Procedures in renderNode". + // ----------------------------------------------------------------- + // Node group + + var group = giveGraphic('nodeGroup', Group$1); + + if (!group) { + return; + } + + parentGroup.add(group); // x,y are not set when el is above view root. + + group.x = thisLayout.x || 0; + group.y = thisLayout.y || 0; + group.markRedraw(); + inner$8(group).nodeWidth = thisWidth; + inner$8(group).nodeHeight = thisHeight; + + if (thisLayout.isAboveViewRoot) { + return group; + } // Background + + + var bg = giveGraphic('background', Rect$1, depth, Z2_BG); + bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight); + var emphasisModel = nodeModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var isDisabled = emphasisModel.get('disabled'); + var focusOrIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : focus; // No children, render content. + + if (isParent) { + // Because of the implementation about "traverse" in graphic hover style, we + // can not set hover listener on the "group" of non-leaf node. Otherwise the + // hover event from the descendents will be listenered. + if (isHighDownDispatcher(group)) { + setAsHighDownDispatcher(group, false); + } + + if (bg) { + setAsHighDownDispatcher(bg, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, bg); + enableHoverFocus(bg, focusOrIndices, blurScope); + } + } else { + var content = giveGraphic('content', Rect$1, depth, Z2_CONTENT); + content && renderContent(group, content); + bg.disableMorphing = true; + + if (bg && isHighDownDispatcher(bg)) { + setAsHighDownDispatcher(bg, false); + } + + setAsHighDownDispatcher(group, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, group); + enableHoverFocus(group, focusOrIndices, blurScope); + } + + return group; // ---------------------------- + // | Procedures in renderNode | + // ---------------------------- + + function renderBackground(group, bg, useUpperLabel) { + var ecData = getECData(bg); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + bg.setShape({ + x: 0, + y: 0, + width: thisWidth, + height: thisHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(bg); + } else { + bg.invisible = false; + var style = thisNode.getVisual('style'); + var visualBorderColor = style.stroke; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualBorderColor; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor'); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + blurStyle.fill = itemStyleBlurModel.get('borderColor'); + var selectStyle = getStateItemStyle(itemStyleSelectModel); + selectStyle.fill = itemStyleSelectModel.get('borderColor'); + + if (useUpperLabel) { + var upperLabelWidth = thisWidth - 2 * borderWidth; + prepareText( // PENDING: convert ZRColor to ColorString for text. + bg, visualBorderColor, style.opacity, { + x: borderWidth, + y: 0, + width: upperLabelWidth, + height: upperHeight + }); + } // For old bg. + else { + bg.removeTextContent(); + } + + bg.setStyle(normalStyle); + bg.ensureState('emphasis').style = emphasisStyle; + bg.ensureState('blur').style = blurStyle; + bg.ensureState('select').style = selectStyle; + setDefaultStateProxy(bg); + } + + group.add(bg); + } + + function renderContent(group, content) { + var ecData = getECData(content); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(content); + } else { + content.invisible = false; + var nodeStyle = thisNode.getVisual('style'); + var visualColor = nodeStyle.fill; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualColor; + normalStyle.decal = nodeStyle.decal; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + var selectStyle = getStateItemStyle(itemStyleSelectModel); // PENDING: convert ZRColor to ColorString for text. + + prepareText(content, visualColor, nodeStyle.opacity, null); + content.setStyle(normalStyle); + content.ensureState('emphasis').style = emphasisStyle; + content.ensureState('blur').style = blurStyle; + content.ensureState('select').style = selectStyle; + setDefaultStateProxy(content); + } + + group.add(content); + } + + function processInvisible(element) { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + + function prepareText(rectEl, visualColor, visualOpacity, // Can be null/undefined + upperLabelRect) { + var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL); + var defaultText = convertOptionIdName(nodeModel.get('name'), null); + var isShow = normalLabelModel.getShallow('show'); + setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), { + defaultText: isShow ? defaultText : null, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + labelFetcher: seriesModel, + labelDataIndex: thisNode.dataIndex + }); + var textEl = rectEl.getTextContent(); + + if (!textEl) { + return; + } + + var textStyle = textEl.style; + var textPadding = normalizeCssArray(textStyle.padding || 0); + + if (upperLabelRect) { + rectEl.setTextConfig({ + layoutRect: upperLabelRect + }); + textEl.disableLabelLayout = true; + } + + textEl.beforeUpdate = function () { + var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0); + var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0); + + if (textStyle.width !== width || textStyle.height !== height) { + textEl.setStyle({ + width: width, + height: height + }); + } + }; + + textStyle.truncateMinChar = 2; + textStyle.lineOverflow = 'truncate'; + addDrillDownIcon(textStyle, upperLabelRect, thisLayout); + var textEmphasisState = textEl.getState('emphasis'); + addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout); + } + + function addDrillDownIcon(style, upperLabelRect, thisLayout) { + var text = style ? style.text : null; + + if (!upperLabelRect && thisLayout.isLeafRoot && text != null) { + var iconChar = seriesModel.get('drillDownIcon', true); + style.text = iconChar ? iconChar + ' ' + text : text; + } + } + + function giveGraphic(storageName, Ctor, depth, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element); + } // If invisible and no old element, do not create new element (for optimizing). + else if (!thisInvisible) { + element = new Ctor(); + + if (element instanceof Displayable) { + element.z2 = calculateZ2(depth, z); + } + + prepareAnimationWhenNoOld(lasts, element); + } // Set to thisStorage + + + return thisStorage[storageName][thisRawIndex] = element; + } + + function prepareAnimationWhenHasOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + + if (element instanceof Group$1) { + lastCfg.oldX = element.x; + lastCfg.oldY = element.y; + } else { + lastCfg.oldShape = extend({}, element.shape); + } + } // If a element is new, we need to find the animation start point carefully, + // otherwise it will looks strange when 'zoomToNode'. + + + function prepareAnimationWhenNoOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + var isGroup = element instanceof Group; + + if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) { + var parentOldX = 0; + var parentOldY = 0; // New nodes appear from right-bottom corner in 'zoomToNode' animation. + // For convenience, get old bounding rect from background. + + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + + if (!reRoot && parentOldBg && parentOldBg.oldShape) { + parentOldX = parentOldBg.oldShape.width; + parentOldY = parentOldBg.oldShape.height; + } // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + + + if (isGroup) { + lastCfg.oldX = 0; + lastCfg.oldY = parentOldY; + } else { + lastCfg.oldShape = { + x: parentOldX, + y: parentOldY, + width: 0, + height: 0 + }; + } + } // Fade in, user can be aware that these nodes are new. + + + lastCfg.fadein = !isGroup; + } + } // We cannot set all background with the same z, because the behaviour of + // drill down and roll up differ background creation sequence from tree + // hierarchy sequence, which cause lower background elements to overlap + // upper ones. So we calculate z based on depth. + // Moreover, we try to shrink down z interval to [0, 1] to avoid that + // treemap with large z overlaps other components. + + + function calculateZ2(depth, z2InLevel) { + return depth * Z2_BASE + z2InLevel; + } + + var each$3 = each; + var isObject$3 = isObject; + var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + + var VisualMapping = + /** @class */ + function () { + function VisualMapping(option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + var thisOption = this.option = clone(option); + this.type = visualType; + this.mappingMethod = mappingMethod; + this._normalizeData = normalizers[mappingMethod]; + var visualHandler = VisualMapping.visualHandlers[visualType]; + this.applyVisual = visualHandler.applyVisual; + this.getColorMapper = visualHandler.getColorMapper; + this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; + + if (mappingMethod === 'piecewise') { + normalizeVisualRange(thisOption); + preprocessForPiecewise(thisOption); + } else if (mappingMethod === 'category') { + thisOption.categories ? preprocessForSpecifiedCategory(thisOption) // categories is ordinal when thisOption.categories not specified, + // which need no more preprocess except normalize visual. + : normalizeVisualRange(thisOption, true); + } else { + // mappingMethod === 'linear' or 'fixed' + assert(mappingMethod !== 'linear' || thisOption.dataExtent); + normalizeVisualRange(thisOption); + } + } + + VisualMapping.prototype.mapValueToVisual = function (value) { + var normalized = this._normalizeData(value); + + return this._normalizedToVisual(normalized, value); + }; + + VisualMapping.prototype.getNormalizer = function () { + return bind(this._normalizeData, this); + }; + /** + * List available visual types. + * + * @public + * @return {Array.} + */ + + + VisualMapping.listVisualTypes = function () { + return keys(VisualMapping.visualHandlers); + }; // /** + // * @public + // */ + // static addVisualHandler(name, handler) { + // visualHandlers[name] = handler; + // } + + /** + * @public + */ + + + VisualMapping.isValidType = function (visualType) { + return VisualMapping.visualHandlers.hasOwnProperty(visualType); + }; + /** + * Convenient method. + * Visual can be Object or Array or primary type. + */ + + + VisualMapping.eachVisual = function (visual, callback, context) { + if (isObject(visual)) { + each(visual, callback, context); + } else { + callback.call(context, visual); + } + }; + + VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = isArray(visual) ? [] : isObject(visual) ? {} : (isPrimary = true, null); + VisualMapping.eachVisual(visual, function (v, key) { + var newVal = callback.call(context, v, key); + isPrimary ? newVisual = newVal : newVisual[key] = newVal; + }); + return newVisual; + }; + /** + * Retrieve visual properties from given object. + */ + + + VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + obj && each$3(VisualMapping.visualHandlers, function (h, visualType) { + if (obj.hasOwnProperty(visualType)) { + ret[visualType] = obj[visualType]; + hasVisual = true; + } + }); + return hasVisual ? ret : null; + }; + /** + * Give order to visual types, considering colorSaturation, colorAlpha depends on color. + * + * @public + * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} + * IF Array, like: ['color', 'symbol', 'colorSaturation'] + * @return {Array.} Sorted visual types. + */ + + + VisualMapping.prepareVisualTypes = function (visualTypes) { + if (isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } else if (isObject$3(visualTypes)) { + var types_1 = []; + each$3(visualTypes, function (item, type) { + types_1.push(type); + }); + visualTypes = types_1; + } else { + return []; + } + + visualTypes.sort(function (type1, type2) { + // color should be front of colorSaturation, colorAlpha, ... + // symbol and symbolSize do not matter. + return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1; + }); + return visualTypes; + }; + /** + * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. + * Other visuals are only depends on themself. + */ + + + VisualMapping.dependsOn = function (visualType1, visualType2) { + return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; + }; + /** + * @param value + * @param pieceList [{value: ..., interval: [min, max]}, ...] + * Always from small to big. + * @param findClosestWhenOutside Default to be false + * @return index + */ + + + VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { + var possibleI; + var abs = Infinity; // value has the higher priority. + + for (var i = 0, len = pieceList.length; i < len; i++) { + var pieceValue = pieceList[i].value; + + if (pieceValue != null) { + if (pieceValue === value // FIXME + // It is supposed to compare value according to value type of dimension, + // but currently value type can exactly be string or number. + // Compromise for numeric-like string (like '12'), especially + // in the case that visualMap.categories is ['22', '33']. + || isString(pieceValue) && pieceValue === value + '') { + return i; + } + + findClosestWhenOutside && updatePossible(pieceValue, i); + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + var close_1 = piece.close; + + if (interval) { + if (interval[0] === -Infinity) { + if (littleThan(close_1[1], value, interval[1])) { + return i; + } + } else if (interval[1] === Infinity) { + if (littleThan(close_1[0], interval[0], value)) { + return i; + } + } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { + return i; + } + + findClosestWhenOutside && updatePossible(interval[0], i); + findClosestWhenOutside && updatePossible(interval[1], i); + } + } + + if (findClosestWhenOutside) { + return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; + } + + function updatePossible(val, index) { + var newAbs = Math.abs(val - value); + + if (newAbs < abs) { + abs = newAbs; + possibleI = index; + } + } + }; + + VisualMapping.visualHandlers = { + color: { + applyVisual: makeApplyVisual('color'), + getColorMapper: function () { + var thisOption = this.option; + return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return doMapCategory.call(this, value); + } : function (value, isNormalized, out) { + // If output rgb array + // which will be much faster and useful in pixel manipulation + var returnRGBArray = !!out; + !isNormalized && (value = this._normalizeData(value)); + out = fastLerp(value, thisOption.parsedVisual, out); + return returnRGBArray ? out : stringify(out, 'rgba'); + }, this); + }, + _normalizedToVisual: { + linear: function (normalized) { + return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + } + + return result; + }, + fixed: doMapFixed + } + }, + colorHue: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, value); + }), + colorSaturation: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, value); + }), + colorLightness: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, null, value); + }), + colorAlpha: makePartialColorVisualHandler(function (color$1, value) { + return modifyAlpha(color$1, value); + }), + decal: { + applyVisual: makeApplyVisual('decal'), + _normalizedToVisual: { + linear: null, + category: doMapCategory, + piecewise: null, + fixed: null + } + }, + opacity: { + applyVisual: makeApplyVisual('opacity'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }, + liftZ: { + applyVisual: makeApplyVisual('liftZ'), + _normalizedToVisual: { + linear: doMapFixed, + category: doMapFixed, + piecewise: doMapFixed, + fixed: doMapFixed + } + }, + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + setter('symbol', symbolCfg); + }, + _normalizedToVisual: { + linear: doMapToArray, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = doMapToArray.call(this, normalized); + } + + return result; + }, + fixed: doMapFixed + } + }, + symbolSize: { + applyVisual: makeApplyVisual('symbolSize'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + } + }; + return VisualMapping; + }(); + + function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + each(pieceList, function (piece, index) { + piece.originIndex = index; // piece.visual is "result visual value" but not + // a visual range, so it does not need to be normalized. + + if (piece.visual != null) { + thisOption.hasSpecialVisual = true; + } + }); + } + + function preprocessForSpecifiedCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var categoryMap = thisOption.categoryMap = {}; + var visual = thisOption.visual; + each$3(categories, function (cate, index) { + categoryMap[cate] = index; + }); // Process visual map input. + + if (!isArray(visual)) { + var visualArr_1 = []; + + if (isObject(visual)) { + each$3(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } else { + // Is primary type, represents default visual. + visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = setVisualToOption(thisOption, visualArr_1); + } // Remove categories that has no visual, + // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. + + + for (var i = categories.length - 1; i >= 0; i--) { + if (visual[i] == null) { + delete categoryMap[categories[i]]; + categories.pop(); + } + } + } + + function normalizeVisualRange(thisOption, isCategory) { + var visual = thisOption.visual; + var visualArr = []; + + if (isObject(visual)) { + each$3(visual, function (v) { + visualArr.push(v); + }); + } else if (visual != null) { + visualArr.push(visual); + } + + var doNotNeedPair = { + color: 1, + symbol: 1 + }; + + if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { + // Do not care visualArr.length === 0, which is illegal. + visualArr[1] = visualArr[0]; + } + + setVisualToOption(thisOption, visualArr); + } + + function makePartialColorVisualHandler(applyValue) { + return { + applyVisual: function (value, getter, setter) { + // Only used in HSL + var colorChannel = this.mapValueToVisual(value); // Must not be array value + + setter('color', applyValue(getter('color'), colorChannel)); + }, + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }; + } + + function doMapToArray(normalized) { + var visual = this.option.visual; + return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}? + } + + function makeApplyVisual(visualType) { + return function (value, getter, setter) { + setter(visualType, this.mapValueToVisual(value)); + }; + } + + function doMapCategory(normalized) { + var visual = this.option.visual; + return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; + } + + function doMapFixed() { + // visual will be convert to array. + return this.option.visual[0]; + } + /** + * Create mapped to numeric visual + */ + + + function createNormalizedToNumericVisual(sourceExtent) { + return { + linear: function (normalized) { + return linearMap(normalized, sourceExtent, this.option.visual, true); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = linearMap(normalized, sourceExtent, this.option.visual, true); + } + + return result; + }, + fixed: doMapFixed + }; + } + + function getSpecifiedVisual(value) { + var thisOption = this.option; + var pieceList = thisOption.pieceList; + + if (thisOption.hasSpecialVisual) { + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + var piece = pieceList[pieceIndex]; + + if (piece && piece.visual) { + return piece.visual[this.type]; + } + } + } + + function setVisualToOption(thisOption, visualArr) { + thisOption.visual = visualArr; + + if (thisOption.type === 'color') { + thisOption.parsedVisual = map(visualArr, function (item) { + var color$1 = parse(item); + + if (!color$1 && "development" !== 'production') { + warn("'" + item + "' is an illegal color, fallback to '#000000'", true); + } + + return color$1 || [0, 0, 0, 1]; + }); + } + + return visualArr; + } + /** + * Normalizers by mapping methods. + */ + + + var normalizers = { + linear: function (value) { + return linearMap(value, this.option.dataExtent, [0, 1], true); + }, + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); + + if (pieceIndex != null) { + return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + category: function (value) { + var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value + + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + }, + fixed: noop + }; + + function littleThan(close, a, b) { + return close ? a <= b : a < b; + } + + var ITEM_STYLE_NORMAL = 'itemStyle'; + var inner$9 = makeInner(); + var treemapVisual = { + seriesType: 'treemap', + reset: function (seriesModel) { + var tree = seriesModel.getData().tree; + var root = tree.root; + + if (root.isRemoved()) { + return; + } + + travelTree(root, // Visual should calculate from tree root but not view root. + {}, seriesModel.getViewRoot().getAncestors(), seriesModel); + } + }; + + function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + var data = node.hostTree.data; // Optimize + + if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { + return; + } + + var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL); + var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); // calculate border color + + var borderColor = nodeItemStyleModel.get('borderColor'); + var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation'); + var thisNodeColor; + + if (borderColorSaturation != null) { + // For performance, do not always execute 'calculateColor'. + thisNodeColor = calculateColor(visuals); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + + existsStyle.stroke = borderColor; + var viewChildren = node.viewChildren; + + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals); // Apply visual to this node. + + existsStyle.fill = thisNodeColor; + } else { + var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); // Designate visual to children. + + each(viewChildren, function (child, index) { + // If higher than viewRoot, only ancestors of viewRoot is needed to visit. + if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) { + var childVisual = mapVisual(nodeModel, visuals, child, index, mapping_1, seriesModel); + travelTree(child, childVisual, viewRootAncestors, seriesModel); + } + }); + } + } + + function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) { + var visuals = extend({}, designatedVisual); + var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle; + each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + designatedVisualItemStyle[visualName] = designatedVisual[visualName]; + var val = nodeItemStyleModel.get(visualName); + designatedVisualItemStyle[visualName] = null; + val != null && (visuals[visualName] = val); + }); + return visuals; + } + + function calculateColor(visuals) { + var color = getValueVisualDefine(visuals, 'color'); + + if (color) { + var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha'); + var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation'); + + if (colorSaturation) { + color = modifyHSL(color, null, null, colorSaturation); + } + + if (colorAlpha) { + color = modifyAlpha(color, colorAlpha); + } + + return color; + } + } + + function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null // Can only be string + ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null; + } + + function getValueVisualDefine(visuals, name) { + var value = visuals[name]; + + if (value != null && value !== 'none') { + return value; + } + } + + function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) { + if (!viewChildren || !viewChildren.length) { + return; + } + + var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation')); + + if (!rangeVisual) { + return; + } + + var visualMin = nodeModel.get('visualMin'); + var visualMax = nodeModel.get('visualMax'); + var dataExtent = nodeLayout.dataExtent.slice(); + visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); + visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: dataExtent, + visual: rangeVisual.range + }; + + if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) { + opt.mappingMethod = 'category'; + opt.loop = true; // categories is ordinal, so do not set opt.categories. + } else { + opt.mappingMethod = 'linear'; + } + + var mapping = new VisualMapping(opt); + inner$9(mapping).drColorMappingBy = colorMappingBy; + return mapping; + } // Notice: If we don't have the attribute 'colorRange', but only use + // attribute 'color' to represent both concepts of 'colorRange' and 'color', + // (It means 'colorRange' when 'color' is Array, means 'color' when not array), + // this problem will be encountered: + // If a level-1 node doesn't have children, and its siblings have children, + // and colorRange is set on level-1, then the node cannot be colored. + // So we separate 'colorRange' and 'color' to different attributes. + + + function getRangeVisual(nodeModel, name) { + // 'colorRange', 'colorARange', 'colorSRange'. + // If not exists on this node, fetch from levels and series. + var range = nodeModel.get(name); + return isArray(range) && range.length ? { + name: name, + range: range + } : null; + } + + function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) { + var childVisuals = extend({}, visuals); + + if (mapping) { + // Only support color, colorAlpha, colorSaturation. + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && inner$9(mapping).drColorMappingBy; + var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension')); + childVisuals[mappingType] = mapping.mapValueToVisual(value); + } + + return childVisuals; + } + + var mathMax$7 = Math.max; + var mathMin$7 = Math.min; + var retrieveValue = retrieve; + var each$4 = each; + var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth']; + var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth']; + var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show']; + var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height']; + /** + * @public + */ + + var treemapLayout = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + var size = seriesOption.size || []; // Compatible with ec2. + + var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth); + var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight); // Fetch payload info. + + var payloadType = payload && payload.type; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + var viewAbovePath = getPathToRoot(viewRoot); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight]; + var sort_1 = seriesOption.sort; + + if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') { + // Default to be desc order. + sort_1 = 'desc'; + } + + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort_1, + leafDepth: seriesOption.leafDepth + }; // layout should be cleared because using updateView but not update. + + viewRoot.hostTree.clearLayouts(); // TODO + // optimize: if out of view clip, do not layout. + // But take care that if do not render node out of view clip, + // how to calculate start po + + var viewRootLayout_1 = { + x: 0, + y: 0, + width: rootSize[0], + height: rootSize[1], + area: rootSize[0] * rootSize[1] + }; + viewRoot.setLayout(viewRootLayout_1); + squarify(viewRoot, options, false, 0); // Supplement layout. + + viewRootLayout_1 = viewRoot.getLayout(); + each$4(viewAbovePath, function (node, index) { + var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); + node.setLayout(extend({ + dataExtent: [childValue, childValue], + borderWidth: 0, + upperHeight: 0 + }, viewRootLayout_1)); + }); + } + + var treeRoot = seriesModel.getData().tree.root; + treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true); + seriesModel.setLayoutInfo(layoutInfo); // FIXME + // 现在没有clip功能,暂时取ec高宽。 + + prunning(treeRoot, // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0); + } + }; + /** + * Layout treemap with squarify algorithm. + * The original presentation of this algorithm + * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk + * . + * The implementation of this algorithm was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * @protected + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Object} options + * @param {string} options.sort 'asc' or 'desc' + * @param {number} options.squareRatio + * @param {boolean} hideChildren + * @param {number} depth + */ + + function squarify(node, options, hideChildren, depth) { + var width; + var height; + + if (node.isRemoved()) { + return; + } + + var thisLayout = node.getLayout(); + width = thisLayout.width; + height = thisLayout.height; // Considering border and gap + + var nodeModel = node.getModel(); + var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); + var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; + var upperLabelHeight = getUpperLabelHeight(nodeModel); + var upperHeight = Math.max(borderWidth, upperLabelHeight); + var layoutOffset = borderWidth - halfGapWidth; + var layoutOffsetUpper = upperHeight - halfGapWidth; + node.setLayout({ + borderWidth: borderWidth, + upperHeight: upperHeight, + upperLabelHeight: upperLabelHeight + }, true); + width = mathMax$7(width - 2 * layoutOffset, 0); + height = mathMax$7(height - layoutOffset - layoutOffsetUpper, 0); + var totalArea = width * height; + var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth); + + if (!viewChildren.length) { + return; + } + + var rect = { + x: layoutOffset, + y: layoutOffsetUpper, + width: width, + height: height + }; + var rowFixedLength = mathMin$7(width, height); + var best = Infinity; // the best row score so far + + var row = []; + row.area = 0; + + for (var i = 0, len = viewChildren.length; i < len;) { + var child = viewChildren[i]; + row.push(child); + row.area += child.getLayout().area; + var score = worst(row, rowFixedLength, options.squareRatio); // continue with this orientation + + if (score <= best) { + i++; + best = score; + } // abort, and try a different orientation + else { + row.area -= row.pop().getLayout().area; + position(row, rowFixedLength, rect, halfGapWidth, false); + rowFixedLength = mathMin$7(rect.width, rect.height); + row.length = row.area = 0; + best = Infinity; + } + } + + if (row.length) { + position(row, rowFixedLength, rect, halfGapWidth, true); + } + + if (!hideChildren) { + var childrenVisibleMin = nodeModel.get('childrenVisibleMin'); + + if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { + hideChildren = true; + } + } + + for (var i = 0, len = viewChildren.length; i < len; i++) { + squarify(viewChildren[i], options, hideChildren, depth + 1); + } + } + /** + * Set area to each child, and calculate data extent for visual coding. + */ + + + function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) { + var viewChildren = node.children || []; + var orderBy = options.sort; + orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null); + var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; // leafDepth has higher priority. + + if (hideChildren && !overLeafDepth) { + return node.viewChildren = []; + } // Sort children, order by desc. + + + viewChildren = filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + sort$1(viewChildren, orderBy); + var info = statistic(nodeModel, viewChildren, orderBy); + + if (info.sum === 0) { + return node.viewChildren = []; + } + + info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); + + if (info.sum === 0) { + return node.viewChildren = []; + } // Set area to each child. + + + for (var i = 0, len = viewChildren.length; i < len; i++) { + var area = viewChildren[i].getValue() / info.sum * totalArea; // Do not use setLayout({...}, true), because it is needed to clear last layout. + + viewChildren[i].setLayout({ + area: area + }); + } + + if (overLeafDepth) { + viewChildren.length && node.setLayout({ + isLeafRoot: true + }, true); + viewChildren.length = 0; + } + + node.viewChildren = viewChildren; + node.setLayout({ + dataExtent: info.dataExtent + }, true); + return viewChildren; + } + /** + * Consider 'visibleMin'. Modify viewChildren and get new sum. + */ + + + function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) { + // visibleMin is not supported yet when no option.sort. + if (!orderBy) { + return sum; + } + + var visibleMin = nodeModel.get('visibleMin'); + var len = orderedChildren.length; + var deletePoint = len; // Always travel from little value to big value. + + for (var i = len - 1; i >= 0; i--) { + var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue(); + + if (value / sum * totalArea < visibleMin) { + deletePoint = i; + sum -= value; + } + } + + orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint); + return sum; + } + /** + * Sort + */ + + + function sort$1(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff; + }); + } + + return viewChildren; + } + /** + * Statistic + */ + + + function statistic(nodeModel, children, orderBy) { + // Calculate sum. + var sum = 0; + + for (var i = 0, len = children.length; i < len; i++) { + sum += children[i].getValue(); + } // Statistic data extent for latter visual coding. + // Notice: data extent should be calculate based on raw children + // but not filtered view children, otherwise visual mapping will not + // be stable when zoom (where children is filtered by visibleMin). + + + var dimension = nodeModel.get('visualDimension'); + var dataExtent; // The same as area dimension. + + if (!children || !children.length) { + dataExtent = [NaN, NaN]; + } else if (dimension === 'value' && orderBy) { + dataExtent = [children[children.length - 1].getValue(), children[0].getValue()]; + orderBy === 'asc' && dataExtent.reverse(); + } // Other dimension. + else { + dataExtent = [Infinity, -Infinity]; + each$4(children, function (child) { + var value = child.getValue(dimension); + value < dataExtent[0] && (dataExtent[0] = value); + value > dataExtent[1] && (dataExtent[1] = value); + }); + } + + return { + sum: sum, + dataExtent: dataExtent + }; + } + /** + * Computes the score for the specified row, + * as the worst aspect ratio. + */ + + + function worst(row, rowFixedLength, ratio) { + var areaMax = 0; + var areaMin = Infinity; + + for (var i = 0, area = void 0, len = row.length; i < len; i++) { + area = row[i].getLayout().area; + + if (area) { + area < areaMin && (areaMin = area); + area > areaMax && (areaMax = area); + } + } + + var squareArea = row.area * row.area; + var f = rowFixedLength * rowFixedLength * ratio; + return squareArea ? mathMax$7(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity; + } + /** + * Positions the specified row of nodes. Modifies `rect`. + */ + + + function position(row, rowFixedLength, rect, halfGapWidth, flush) { + // When rowFixedLength === rect.width, + // it is horizontal subdivision, + // rowFixedLength is the width of the subdivision, + // rowOtherLength is the height of the subdivision, + // and nodes will be positioned from left to right. + // wh[idx0WhenH] means: when horizontal, + // wh[idx0WhenH] => wh[0] => 'width'. + // xy[idx1WhenH] => xy[1] => 'y'. + var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; + var idx1WhenH = 1 - idx0WhenH; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var last = rect[xy[idx0WhenH]]; + var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0; + + if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { + rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow + } + + for (var i = 0, rowLen = row.length; i < rowLen; i++) { + var node = row[i]; + var nodeLayout = {}; + var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0; + var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$7(rowOtherLength - 2 * halfGapWidth, 0); // We use Math.max/min to avoid negative width/height when considering gap width. + + var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; + var modWH = i === rowLen - 1 || remain < step ? remain : step; + var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$7(modWH - 2 * halfGapWidth, 0); + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$7(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin$7(halfGapWidth, wh0 / 2); + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; + } // Return [containerWidth, containerHeight] as default. + + + function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { + // If targetInfo.node exists, we zoom to the node, + // so estimate whole width and height by target node. + var currNode = (targetInfo || {}).node; + var defaultSize = [containerWidth, containerHeight]; + + if (!currNode || currNode === viewRoot) { + return defaultSize; + } + + var parent; + var viewArea = containerWidth * containerHeight; + var area = viewArea * seriesModel.option.zoomToNodeRatio; + + while (parent = currNode.parentNode) { + // jshint ignore:line + var sum = 0; + var siblings = parent.children; + + for (var i = 0, len = siblings.length; i < len; i++) { + sum += siblings[i].getValue(); + } + + var currNodeValue = currNode.getValue(); + + if (currNodeValue === 0) { + return defaultSize; + } + + area *= sum / currNodeValue; // Considering border, suppose aspect ratio is 1. + + var parentModel = parent.getModel(); + var borderWidth = parentModel.get(PATH_BORDER_WIDTH); + var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel)); + area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); + area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER); + currNode = parent; + } + + area < viewArea && (area = viewArea); + var scale = Math.pow(area / viewArea, 0.5); + return [containerWidth * scale, containerHeight * scale]; + } // Root position based on coord of containerGroup + + + function calculateRootPosition(layoutInfo, rootRect, targetInfo) { + if (rootRect) { + return { + x: rootRect.x, + y: rootRect.y + }; + } + + var defaultPosition = { + x: 0, + y: 0 + }; + + if (!targetInfo) { + return defaultPosition; + } // If targetInfo is fetched by 'retrieveTargetInfo', + // old tree and new tree are the same tree, + // so the node still exists and we can visit it. + + + var targetNode = targetInfo.node; + var layout = targetNode.getLayout(); + + if (!layout) { + return defaultPosition; + } // Transform coord from local to container. + + + var targetCenter = [layout.width / 2, layout.height / 2]; + var node = targetNode; + + while (node) { + var nodeLayout = node.getLayout(); + targetCenter[0] += nodeLayout.x; + targetCenter[1] += nodeLayout.y; + node = node.parentNode; + } + + return { + x: layoutInfo.width / 2 - targetCenter[0], + y: layoutInfo.height / 2 - targetCenter[1] + }; + } // Mark nodes visible for prunning when visual coding and rendering. + // Prunning depends on layout and root position, so we have to do it after layout. + + + function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { + var nodeLayout = node.getLayout(); + var nodeInViewAbovePath = viewAbovePath[depth]; + var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; + + if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) { + return; + } + + node.setLayout({ + // isInView means: viewRoot sub tree + viewAbovePath + isInView: true, + // invisible only means: outside view clip so that the node can not + // see but still layout for animation preparation but not render. + invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), + isAboveViewRoot: isAboveViewRoot + }, true); // Transform to child coordinate. + + var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height); + each$4(node.viewChildren || [], function (child) { + prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); + }); + } + + function getUpperLabelHeight(model) { + return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; + } + + function install$c(registers) { + registers.registerSeriesModel(TreemapSeriesModel); + registers.registerChartView(TreemapView); + registers.registerVisual(treemapVisual); + registers.registerLayout(treemapLayout); + installTreemapAction(registers); + } + + function categoryFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + ecModel.eachSeriesByType('graph', function (graphSeries) { + var categoriesData = graphSeries.getCategoriesData(); + var graph = graphSeries.getGraph(); + var data = graph.data; + var categoryNames = categoriesData.mapArray(categoriesData.getName); + data.filterSelf(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + + if (category != null) { + if (isNumber(category)) { + category = categoryNames[category]; + } // If in any legend component the status is not selected. + + + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(category)) { + return false; + } + } + } + + return true; + }); + }); + } + + function categoryVisual(ecModel) { + var paletteScope = {}; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + var categoryNameIdxMap = {}; + categoriesData.each(function (idx) { + var name = categoriesData.getName(idx); // Add prefix to avoid conflict with Object.prototype. + + categoryNameIdxMap['ec-' + name] = idx; + var itemModel = categoriesData.getItemModel(idx); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + // Get color from palette. + style.fill = seriesModel.getColorFromPalette(name, paletteScope); + } + + categoriesData.setItemVisual(idx, 'style', style); + var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < symbolVisualList.length; i++) { + var symbolVisual = itemModel.getShallow(symbolVisualList[i], true); + + if (symbolVisual != null) { + categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual); + } + } + }); // Assign category color to visual + + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var categoryIdx = model.getShallow('category'); + + if (categoryIdx != null) { + if (isString(categoryIdx)) { + categoryIdx = categoryNameIdxMap['ec-' + categoryIdx]; + } + + var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style'); + var style = data.ensureUniqueItemVisual(idx, 'style'); + extend(style, categoryStyle); + var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < visualList.length; i++) { + data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i])); + } + } + }); + } + }); + } + + function normalize$2(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + function graphEdgeVisual(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var graph = seriesModel.getGraph(); + var edgeData = seriesModel.getEdgeData(); + var symbolType = normalize$2(seriesModel.get('edgeSymbol')); + var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize')); // const colorQuery = ['lineStyle', 'color'] as const; + // const opacityQuery = ['lineStyle', 'opacity'] as const; + + edgeData.setVisual('fromSymbol', symbolType && symbolType[0]); + edgeData.setVisual('toSymbol', symbolType && symbolType[1]); + edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle()); + edgeData.each(function (idx) { + var itemModel = edgeData.getItemModel(idx); + var edge = graph.getEdgeByIndex(idx); + var symbolType = normalize$2(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); // Edge visual must after node visual + + var style = itemModel.getModel('lineStyle').getLineStyle(); + var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + switch (existsStyle.stroke) { + case 'source': + { + var nodeStyle = edge.node1.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + + case 'target': + { + var nodeStyle = edge.node2.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + } + + symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]); + symbolType[1] && edge.setVisual('toSymbol', symbolType[1]); + symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]); + symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]); + }); + }); + } + + var KEY_DELIMITER = '-->'; + /** + * params handler + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {*} + */ + + var getAutoCurvenessParams = function (seriesModel) { + return seriesModel.get('autoCurveness') || null; + }; + /** + * Generate a list of edge curvatures, 20 is the default + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} appendLength + * @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2] + */ + + + var createCurveness = function (seriesModel, appendLength) { + var autoCurvenessParmas = getAutoCurvenessParams(seriesModel); + var length = 20; + var curvenessList = []; // handler the function set + + if (isNumber(autoCurvenessParmas)) { + length = autoCurvenessParmas; + } else if (isArray(autoCurvenessParmas)) { + seriesModel.__curvenessList = autoCurvenessParmas; + return; + } // append length + + + if (appendLength > length) { + length = appendLength; + } // make sure the length is even + + + var len = length % 2 ? length + 2 : length + 3; + curvenessList = []; + + for (var i = 0; i < len; i++) { + curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1)); + } + + seriesModel.__curvenessList = curvenessList; + }; + /** + * Create different cache key data in the positive and negative directions, in order to set the curvature later + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {string} key + */ + + + var getKeyOfEdges = function (n1, n2, seriesModel) { + var source = [n1.id, n1.dataIndex].join('.'); + var target = [n2.id, n2.dataIndex].join('.'); + return [seriesModel.uid, source, target].join(KEY_DELIMITER); + }; + /** + * get opposite key + * @param {string} key + * @returns {string} + */ + + + var getOppositeKey = function (key) { + var keys = key.split(KEY_DELIMITER); + return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER); + }; + /** + * get edgeMap with key + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + var getEdgeFromMap = function (edge, seriesModel) { + var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + return seriesModel.__edgeMap[key]; + }; + /** + * calculate all cases total length + * @param edge + * @param seriesModel + * @returns {number} + */ + + + var getTotalLengthBetweenNodes = function (edge, seriesModel) { + var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel); + var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel); + return len + lenV; + }; + /** + * + * @param key + */ + + + var getEdgeMapLengthWithKey = function (key, seriesModel) { + var edgeMap = seriesModel.__edgeMap; + return edgeMap[key] ? edgeMap[key].length : 0; + }; + /** + * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge + * @see /graph/GraphSeries.js@getInitialData + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + function initCurvenessList(seriesModel) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + seriesModel.__curvenessList = []; + seriesModel.__edgeMap = {}; // calc the array of curveness List + + createCurveness(seriesModel); + } + /** + * set edgeMap with key + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} index + */ + + function createEdgeMapForCurveness(n1, n2, seriesModel, index) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + var key = getKeyOfEdges(n1, n2, seriesModel); + var edgeMap = seriesModel.__edgeMap; + var oppositeEdges = edgeMap[getOppositeKey(key)]; // set direction + + if (edgeMap[key] && !oppositeEdges) { + edgeMap[key].isForward = true; + } else if (oppositeEdges && edgeMap[key]) { + oppositeEdges.isForward = true; + edgeMap[key].isForward = false; + } + + edgeMap[key] = edgeMap[key] || []; + edgeMap[key].push(index); + } + /** + * get curvature for edge + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + * @param index + */ + + function getCurvenessForEdge(edge, seriesModel, index, needReverse) { + var autoCurvenessParams = getAutoCurvenessParams(seriesModel); + var isArrayParam = isArray(autoCurvenessParams); + + if (!autoCurvenessParams) { + return null; + } + + var edgeArray = getEdgeFromMap(edge, seriesModel); + + if (!edgeArray) { + return null; + } + + var edgeIndex = -1; + + for (var i = 0; i < edgeArray.length; i++) { + if (edgeArray[i] === index) { + edgeIndex = i; + break; + } + } // if totalLen is Longer createCurveness + + + var totalLen = getTotalLengthBetweenNodes(edge, seriesModel); + createCurveness(seriesModel, totalLen); + edge.lineStyle = edge.lineStyle || {}; // if is opposite edge, must set curvenss to opposite number + + var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + var curvenessList = seriesModel.__curvenessList; // if pass array no need parity + + var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1; + + if (!edgeArray.isForward) { + // the opposite edge show outside + var oppositeKey = getOppositeKey(curKey); + var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel); + var resValue = curvenessList[edgeIndex + len + parityCorrection]; // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite + + if (needReverse) { + // set as array may make the parity handle with the len of opposite + if (isArrayParam) { + if (autoCurvenessParams && autoCurvenessParams[0] === 0) { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } else { + return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return curvenessList[edgeIndex + len + parityCorrection]; + } + } else { + return curvenessList[parityCorrection + edgeIndex]; + } + } + + function simpleLayout(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var graph = seriesModel.getGraph(); + graph.eachNode(function (node) { + var model = node.getModel(); + node.setLayout([+model.get('x'), +model.get('y')]); + }); + simpleLayoutEdge(graph, seriesModel); + } + function simpleLayoutEdge(graph, seriesModel) { + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var points = [p1, p2]; + + if (+curveness) { + points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]); + } + + edge.setLayout(points); + }); + } + + function graphSimpleLayout(ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + var data_1 = seriesModel.getData(); + var dimensions_1 = []; + each(coordSys.dimensions, function (coordDim) { + dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim)); + }); + + for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) { + var value = []; + var hasValue = false; + + for (var i = 0; i < dimensions_1.length; i++) { + var val = data_1.get(dimensions_1[i], dataIndex); + + if (!isNaN(val)) { + hasValue = true; + } + + value.push(val); + } + + if (hasValue) { + data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value)); + } else { + // Also {Array.}, not undefined to avoid if...else... statement + data_1.setItemLayout(dataIndex, [NaN, NaN]); + } + } + + simpleLayoutEdge(data_1.graph, seriesModel); + } else if (!layout || layout === 'none') { + simpleLayout(seriesModel); + } + }); + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function getNodeGlobalScale(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = seriesModel.option.nodeScaleRatio; + var groupZoom = coordSys.scaleX; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + } + function getSymbolSize(node) { + var symbolSize = node.getVisual('symbolSize'); + + if (symbolSize instanceof Array) { + symbolSize = (symbolSize[0] + symbolSize[1]) / 2; + } + + return +symbolSize; + } + + var PI$6 = Math.PI; + var _symbolRadiansHalf = []; + /** + * `basedOn` can be: + * 'value': + * This layout is not accurate and have same bad case. For example, + * if the min value is very smaller than the max value, the nodes + * with the min value probably overlap even though there is enough + * space to layout them. So we only use this approach in the as the + * init layout of the force layout. + * FIXME + * Probably we do not need this method any more but use + * `basedOn: 'symbolSize'` in force layout if + * delay its init operations to GraphView. + * 'symbolSize': + * This approach work only if all of the symbol size calculated. + * That is, the progressive rendering is not applied to graph. + * FIXME + * If progressive rendering is applied to graph some day, + * probably we have to use `basedOn: 'value'`. + */ + + function circularLayout(seriesModel, basedOn, draggingNode, pointer) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + var r = Math.min(rect.width, rect.height) / 2; + var count = nodeData.count(); + nodeData.setLayout({ + cx: cx, + cy: cy + }); + + if (!count) { + return; + } + + if (draggingNode) { + var _a = coordSys.pointToData(pointer), + tempX = _a[0], + tempY = _a[1]; + + var v = [tempX - cx, tempY - cy]; + normalize(v, v); + scale(v, v, r); + draggingNode.setLayout([cx + v[0], cy + v[1]], true); + var circularRotateLabel = seriesModel.get(['circular', 'rotateLabel']); + rotateNodeLabel(draggingNode, circularRotateLabel, cx, cy); + } + + _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count); + + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var cp1; + var x12 = (p1[0] + p2[0]) / 2; + var y12 = (p1[1] + p2[1]) / 2; + + if (+curveness) { + curveness *= 3; + cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)]; + } + + edge.setLayout([p1, p2, cp1]); + }); + } + var _layoutNodesBasedOn = { + value: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || count); + graph.eachNode(function (node) { + var value = node.getValue('value'); + var radianHalf = unitAngle * (sum ? value : 1) / 2; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + }, + symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var sumRadian = 0; + _symbolRadiansHalf.length = count; + var nodeScale = getNodeGlobalScale(seriesModel); + graph.eachNode(function (node) { + var symbolSize = getSymbolSize(node); // Normally this case will not happen, but we still add + // some the defensive code (2px is an arbitrary value). + + isNaN(symbolSize) && (symbolSize = 2); + symbolSize < 0 && (symbolSize = 0); + symbolSize *= nodeScale; + var symbolRadianHalf = Math.asin(symbolSize / 2 / r); // when `symbolSize / 2` is bigger than `r`. + + isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$6 / 2); + _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf; + sumRadian += symbolRadianHalf * 2; + }); + var halfRemainRadian = (2 * PI$6 - sumRadian) / count / 2; + var angle = 0; + graph.eachNode(function (node) { + var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; + angle += radianHalf; // init circular layout for + // 1. layout undefined node + // 2. not fixed node + + (!node.getLayout() || !node.getLayout().fixed) && node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + } + }; + function rotateNodeLabel(node, circularRotateLabel, cx, cy) { + var el = node.getGraphicEl(); // need to check if el exists. '-' value may not create node element. + + if (!el) { + return; + } + + var nodeModel = node.getModel(); + var labelRotate = nodeModel.get(['label', 'rotate']) || 0; + var symbolPath = el.getSymbolPath(); + + if (circularRotateLabel) { + var pos = node.getLayout(); + var rad = Math.atan2(pos[1] - cy, pos[0] - cx); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + var isLeft = pos[0] < cx; + + if (isLeft) { + rad = rad - Math.PI; + } + + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setTextConfig({ + rotation: -rad, + position: textPosition, + origin: 'center' + }); + var emphasisState = symbolPath.ensureState('emphasis'); + extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { + position: textPosition + }); + } else { + symbolPath.setTextConfig({ + rotation: labelRotate *= Math.PI / 180 + }); + } + } + + function graphCircularLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayout(seriesModel, 'symbolSize'); + } + }); + } + + var scaleAndAdd$1 = scaleAndAdd; // function adjacentNode(n, e) { + // return e.n1 === n ? e.n2 : e.n1; + // } + + function forceLayout(inNodes, inEdges, opts) { + var nodes = inNodes; + var edges = inEdges; + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; // let scale = opts.scale || 1; + + var gravity = opts.gravity == null ? 0.1 : opts.gravity; // for (let i = 0; i < edges.length; i++) { + // let e = edges[i]; + // let n1 = e.n1; + // let n2 = e.n2; + // n1.edges = n1.edges || []; + // n2.edges = n2.edges || []; + // n1.edges.push(e); + // n2.edges.push(e); + // } + // Init position + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + + if (!n.p) { + n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]); + } + + n.pp = clone$1(n.p); + n.edges = null; + } // Formula in 'Graph Drawing by Force-directed Placement' + // let k = scale * Math.sqrt(width * height / nodes.length); + // let k2 = k * k; + + + var initialFriction = opts.friction == null ? 0.6 : opts.friction; + var friction = initialFriction; + var beforeStepCallback; + var afterStepCallback; + return { + warmUp: function () { + friction = initialFriction * 0.8; + }, + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + /** + * Before step hook + */ + beforeStep: function (cb) { + beforeStepCallback = cb; + }, + + /** + * After step hook + */ + afterStep: function (cb) { + afterStepCallback = cb; + }, + + /** + * Some formulas were originally copied from "d3.js" + * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js + * with some modifications made for this project. + * See the license statement at the head of this file. + */ + step: function (cb) { + beforeStepCallback && beforeStepCallback(nodes, edges); + var v12 = []; + var nLen = nodes.length; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + + if (e.ignoreForceLayout) { + continue; + } + + var n1 = e.n1; + var n2 = e.n2; + sub(v12, n2.p, n1.p); + var d = len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + + if (isNaN(w)) { + w = 0; + } + + normalize(v12, v12); + !n1.fixed && scaleAndAdd$1(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd$1(n2.p, n2.p, v12, -(1 - w) * d * friction); + } // Gravity + + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v12, center, n.p); // let d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // let gravityFactor = gravity; + + scaleAndAdd$1(n.p, n.p, v12, gravity * friction); + } + } // Repulsive + // PENDING + + + for (var i = 0; i < nLen; i++) { + var n1 = nodes[i]; + + for (var j = i + 1; j < nLen; j++) { + var n2 = nodes[j]; + sub(v12, n2.p, n1.p); + var d = len(v12); + + if (d === 0) { + // Random repulse + set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd$1(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd$1(n2.pp, n2.pp, v12, -repFact); + } + } + + var v = []; + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v, n.p, n.pp); + scaleAndAdd$1(n.p, n.p, v, friction); + copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + var finished = friction < 0.01; + afterStepCallback && afterStepCallback(nodes, edges, finished); + cb && cb(finished); + } + }; + } + + function graphForceLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + var coordSys = graphSeries.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + if (graphSeries.get('layout') === 'force') { + var preservedPoints_1 = graphSeries.preservedPoints || {}; + var graph_1 = graphSeries.getGraph(); + var nodeData_1 = graph_1.data; + var edgeData = graph_1.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + + if (graphSeries.preservedPoints) { + nodeData_1.each(function (idx) { + var id = nodeData_1.getId(idx); + nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); + }); + } else if (!initLayout || initLayout === 'none') { + simpleLayout(graphSeries); + } else if (initLayout === 'circular') { + circularLayout(graphSeries, 'value'); + } + + var nodeDataExtent_1 = nodeData_1.getDataExtent('value'); + var edgeDataExtent_1 = edgeData.getDataExtent('value'); // let edgeDataExtent = edgeData.getDataExtent('value'); + + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion]; + var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength]; // Larger value has smaller length + + edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; + var nodes_1 = nodeData_1.mapArray('value', function (value, idx) { + var point = nodeData_1.getItemLayout(idx); + var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1); + + if (isNaN(rep)) { + rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; + } + + return { + w: rep, + rep: rep, + fixed: nodeData_1.getItemModel(idx).get('fixed'), + p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph_1.getEdgeByIndex(idx); + var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1); + + if (isNaN(d)) { + d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; + } + + var edgeModel = edge.getModel(); + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); + return { + n1: nodes_1[edge.node1.dataIndex], + n2: nodes_1[edge.node2.dataIndex], + d: d, + curveness: curveness, + ignoreForceLayout: edgeModel.get('ignoreForceLayout') + }; + }); // let coordSys = graphSeries.coordinateSystem; + + var rect = coordSys.getBoundingRect(); + var forceInstance = forceLayout(nodes_1, edges, { + rect: rect, + gravity: forceModel.get('gravity'), + friction: forceModel.get('friction') + }); + forceInstance.beforeStep(function (nodes, edges) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); + } + } + }); + forceInstance.afterStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph_1.getNodeByIndex(i).setLayout(nodes[i].p); + } + + preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; + } + + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var edge = graph_1.getEdgeByIndex(i); + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = edge.getLayout(); + points = points ? points.slice() : []; + points[0] = points[0] || []; + points[1] = points[1] || []; + copy(points[0], p1); + copy(points[1], p2); + + if (+e.curveness) { + points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; + } + + edge.setLayout(points); + } + }); + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints_1; // Step to get the layout + + forceInstance.step(); + } else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); + } + + function getViewRect$2(seriesModel, api, aspect) { + var option = extend(seriesModel.getBoxLayoutParams(), { + aspect: aspect + }); + return getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function createViewCoordSys(ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + + if (!coordSysType || coordSysType === 'view') { + var data_1 = seriesModel.getData(); + var positions = data_1.mapArray(function (idx) { + var itemModel = data_1.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + var min = []; + var max = []; + fromPoints(positions, min, max); // If width or height is 0 + + if (max[0] - min[0] === 0) { + max[0] += 1; + min[0] -= 1; + } + + if (max[1] - min[1] === 0) { + max[1] += 1; + min[1] -= 1; + } + + var aspect = (max[0] - min[0]) / (max[1] - min[1]); // FIXME If get view rect after data processed? + + var viewRect = getViewRect$2(seriesModel, api, aspect); // Position may be NaN, use view rect instead + + if (isNaN(aspect)) { + min = [viewRect.x, viewRect.y]; + max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; + } + + var bbWidth = max[0] - min[0]; + var bbHeight = max[1] - min[1]; + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight); + viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); // Update roam info + + viewCoordSys.setCenter(seriesModel.get('center'), api); + viewCoordSys.setZoom(seriesModel.get('zoom')); + viewList.push(viewCoordSys); + } + }); + return viewList; + } + + var straightLineProto = Line.prototype; + var bezierCurveProto = BezierCurve.prototype; + + var StraightLineShape = + /** @class */ + function () { + function StraightLineShape() { + // Start point + this.x1 = 0; + this.y1 = 0; // End point + + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + + return StraightLineShape; + }(); + + var CurveShape = + /** @class */ + function (_super) { + __extends(CurveShape, _super); + + function CurveShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return CurveShape; + }(StraightLineShape); + + function isStraightLine(shape) { + return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); + } + + var ECLinePath = + /** @class */ + function (_super) { + __extends(ECLinePath, _super); + + function ECLinePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-line'; + return _this; + } + + ECLinePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECLinePath.prototype.getDefaultShape = function () { + return new StraightLineShape(); + }; + + ECLinePath.prototype.buildPath = function (ctx, shape) { + if (isStraightLine(shape)) { + straightLineProto.buildPath.call(this, ctx, shape); + } else { + bezierCurveProto.buildPath.call(this, ctx, shape); + } + }; + + ECLinePath.prototype.pointAt = function (t) { + if (isStraightLine(this.shape)) { + return straightLineProto.pointAt.call(this, t); + } else { + return bezierCurveProto.pointAt.call(this, t); + } + }; + + ECLinePath.prototype.tangentAt = function (t) { + var shape = this.shape; + var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t); + return normalize(p, p); + }; + + return ECLinePath; + }(Path); + + var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol']; + + function makeSymbolTypeKey(symbolCategory) { + return '_' + symbolCategory + 'Type'; + } + /** + * @inner + */ + + + function createSymbol$1(name, lineData, idx) { + var symbolType = lineData.getItemVisual(idx, name); + + if (!symbolType || symbolType === 'none') { + return; + } + + var symbolSize = lineData.getItemVisual(idx, name + 'Size'); + var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate'); + var symbolOffset = lineData.getItemVisual(idx, name + 'Offset'); + var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect'); + var symbolSizeArr = normalizeSymbolSize(symbolSize); + var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr); + var symbolPath = createSymbol(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect); + symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0; + symbolPath.name = name; + return symbolPath; + } + + function createLine(points) { + var line = new ECLinePath({ + name: 'line', + subPixelOptimize: true + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + targetShape.x1 = points[0][0]; + targetShape.y1 = points[0][1]; + targetShape.x2 = points[1][0]; + targetShape.y2 = points[1][1]; + targetShape.percent = 1; + var cp1 = points[2]; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } else { + targetShape.cpx1 = NaN; + targetShape.cpy1 = NaN; + } + } + + var Line$1 = + /** @class */ + function (_super) { + __extends(Line, _super); + + function Line(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createLine(lineData, idx, seriesScope); + + return _this; + } + + Line.prototype._createLine = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + var line = createLine(linePoints); + line.shape.percent = 0; + initProps(line, { + shape: { + percent: 1 + } + }, seriesModel, idx); + this.add(line); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = createSymbol$1(symbolCategory, lineData, idx); // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + + this.add(symbol); + this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory); + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; // TODO More strict on the List type in parameters? + + + Line.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + updateProps(line, target, seriesModel, idx); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbolType = lineData.getItemVisual(idx, symbolCategory); + var key = makeSymbolTypeKey(symbolCategory); // Symbol changed + + if (this[key] !== symbolType) { + this.remove(this.childOfName(symbolCategory)); + var symbol = createSymbol$1(symbolCategory, lineData, idx); + this.add(symbol); + } + + this[key] = symbolType; + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Line.prototype.getLinePath = function () { + return this.childAt(0); + }; + + Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var blurLineStyle = seriesScope && seriesScope.blurLineStyle; + var selectLineStyle = seriesScope && seriesScope.selectLineStyle; + var labelStatesModels = seriesScope && seriesScope.labelStatesModels; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; // Optimization for large dataset + + if (!seriesScope || lineData.hasItemOption) { + var itemModel = lineData.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle(); + selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var visualColor = lineStyle.stroke; + line.useStyle(lineStyle); + line.style.fill = null; + line.style.strokeNoScale = true; + line.ensureState('emphasis').style = emphasisLineStyle; + line.ensureState('blur').style = blurLineStyle; + line.ensureState('select').style = selectLineStyle; // Update symbol + + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = this.childOfName(symbolCategory); + + if (symbol) { + // Share opacity and color with line. + symbol.setColor(visualColor); + symbol.style.opacity = lineStyle.opacity; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var lineState = line.getState(stateName); + + if (lineState) { + var lineStateStyle = lineState.style || {}; + var state = symbol.ensureState(stateName); + var stateStyle = state.style || (state.style = {}); + + if (lineStateStyle.stroke != null) { + stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke; + } + + if (lineStateStyle.opacity != null) { + stateStyle.opacity = lineStateStyle.opacity; + } + } + } + + symbol.markRedraw(); + } + }, this); + var rawVal = seriesModel.getRawValue(idx); + setLabelStyle(this, labelStatesModels, { + labelDataIndex: idx, + labelFetcher: { + getFormattedLabel: function (dataIndex, stateName) { + return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType); + } + }, + inheritColor: visualColor || '#000', + defaultOpacity: lineStyle.opacity, + defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + '' + }); + var label = this.getTextContent(); // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + + if (label) { + var labelNormalModel = labelStatesModels.normal; + label.__align = label.style.align; + label.__verticalAlign = label.style.verticalAlign; // 'start', 'middle', 'end' + + label.__position = labelNormalModel.get('position') || 'middle'; + var distance = labelNormalModel.get('distance'); + + if (!isArray(distance)) { + distance = [distance, distance]; + } + + label.__labelDistance = distance; + } + + this.setTextConfig({ + position: null, + local: true, + inside: false // Can't be inside for stroke element. + + }); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Line.prototype.highlight = function () { + enterEmphasis(this); + }; + + Line.prototype.downplay = function () { + leaveEmphasis(this); + }; + + Line.prototype.updateLayout = function (lineData, idx) { + this.setLinePoints(lineData.getItemLayout(idx)); + }; + + Line.prototype.setLinePoints = function (points) { + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(); + }; + + Line.prototype.beforeUpdate = function () { + var lineGroup = this; + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.getTextContent(); // Quick reject + + if (!symbolFrom && !symbolTo && (!label || label.ignore)) { + return; + } + + var invScale = 1; + var parentNode = this.parent; + + while (parentNode) { + if (parentNode.scaleX) { + invScale /= parentNode.scaleX; + } + + parentNode = parentNode.parent; + } + + var line = lineGroup.childOfName('line'); // If line not changed + // FIXME Parent scale changed + + if (!this.__dirty && !line.__dirty) { + return; + } + + var percent = line.shape.percent; + var fromPos = line.pointAt(0); + var toPos = line.pointAt(percent); + var d = sub([], toPos, fromPos); + normalize(d, d); + + function setSymbolRotation(symbol, percent) { + // Fix #12388 + // when symbol is set to be 'arrow' in markLine, + // symbolRotate value will be ignored, and compulsively use tangent angle. + // rotate by default if symbol rotation is not specified + var specifiedRotation = symbol.__specifiedRotation; + + if (specifiedRotation == null) { + var tangent = line.tangentAt(percent); + symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0])); + } else { + symbol.attr('rotation', specifiedRotation); + } + } + + if (symbolFrom) { + symbolFrom.setPosition(fromPos); + setSymbolRotation(symbolFrom, 0); + symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent; + symbolFrom.markRedraw(); + } + + if (symbolTo) { + symbolTo.setPosition(toPos); + setSymbolRotation(symbolTo, 1); + symbolTo.scaleX = symbolTo.scaleY = invScale * percent; + symbolTo.markRedraw(); + } + + if (label && !label.ignore) { + label.x = label.y = 0; + label.originX = label.originY = 0; + var textAlign = void 0; + var textVerticalAlign = void 0; + var distance = label.__labelDistance; + var distanceX = distance[0] * invScale; + var distanceY = distance[1] * invScale; + var halfPercent = percent / 2; + var tangent = line.tangentAt(halfPercent); + var n = [tangent[1], -tangent[0]]; + var cp = line.pointAt(halfPercent); + + if (n[1] > 0) { + n[0] = -n[0]; + n[1] = -n[1]; + } + + var dir = tangent[0] < 0 ? -1 : 1; + + if (label.__position !== 'start' && label.__position !== 'end') { + var rotation = -Math.atan2(tangent[1], tangent[0]); + + if (toPos[0] < fromPos[0]) { + rotation = Math.PI + rotation; + } + + label.rotation = rotation; + } + + var dy = void 0; + + switch (label.__position) { + case 'insideStartTop': + case 'insideMiddleTop': + case 'insideEndTop': + case 'middle': + dy = -distanceY; + textVerticalAlign = 'bottom'; + break; + + case 'insideStartBottom': + case 'insideMiddleBottom': + case 'insideEndBottom': + dy = distanceY; + textVerticalAlign = 'top'; + break; + + default: + dy = 0; + textVerticalAlign = 'middle'; + } + + switch (label.__position) { + case 'end': + label.x = d[0] * distanceX + toPos[0]; + label.y = d[1] * distanceY + toPos[1]; + textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle'; + break; + + case 'start': + label.x = -d[0] * distanceX + fromPos[0]; + label.y = -d[1] * distanceY + fromPos[1]; + textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle'; + break; + + case 'insideStartTop': + case 'insideStart': + case 'insideStartBottom': + label.x = distanceX * dir + fromPos[0]; + label.y = fromPos[1] + dy; + textAlign = tangent[0] < 0 ? 'right' : 'left'; + label.originX = -distanceX * dir; + label.originY = -dy; + break; + + case 'insideMiddleTop': + case 'insideMiddle': + case 'insideMiddleBottom': + case 'middle': + label.x = cp[0]; + label.y = cp[1] + dy; + textAlign = 'center'; + label.originY = -dy; + break; + + case 'insideEndTop': + case 'insideEnd': + case 'insideEndBottom': + label.x = -distanceX * dir + toPos[0]; + label.y = toPos[1] + dy; + textAlign = tangent[0] >= 0 ? 'right' : 'left'; + label.originX = distanceX * dir; + label.originY = -dy; + break; + } + + label.scaleX = label.scaleY = invScale; + label.setStyle({ + // Use the user specified text align and baseline first + verticalAlign: label.__verticalAlign || textVerticalAlign, + align: label.__align || textAlign + }); + } + }; + + return Line; + }(Group); + + var LineDraw = + /** @class */ + function () { + function LineDraw(LineCtor) { + this.group = new Group(); + this._LineCtor = LineCtor || Line$1; + } + + LineDraw.prototype.updateData = function (lineData) { + var _this = this; // Remove progressive els. + + + this._progressiveEls = null; + var lineDraw = this; + var group = lineDraw.group; + var oldLineData = lineDraw._lineData; + lineDraw._lineData = lineData; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!oldLineData) { + group.removeAll(); + } + + var seriesScope = makeSeriesScope$1(lineData); + lineData.diff(oldLineData).add(function (idx) { + _this._doAdd(lineData, idx, seriesScope); + }).update(function (newIdx, oldIdx) { + _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope); + }).remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }).execute(); + }; + + LineDraw.prototype.updateLayout = function () { + var lineData = this._lineData; // Do not support update layout in incremental mode. + + if (!lineData) { + return; + } + + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, idx); + }, this); + }; + + LineDraw.prototype.incrementalPrepareUpdate = function (lineData) { + this._seriesScope = makeSeriesScope$1(lineData); + this._lineData = null; + this.group.removeAll(); + }; + + LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) { + this._progressiveEls = []; + + function updateIncrementalAndHover(el) { + if (!el.isGroup && !isEffectObject(el)) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var itemLayout = lineData.getItemLayout(idx); + + if (lineNeedsDraw(itemLayout)) { + var el = new this._LineCtor(lineData, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + this.group.add(el); + lineData.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + LineDraw.prototype.remove = function () { + this.group.removeAll(); + }; + + LineDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) { + var itemLayout = lineData.getItemLayout(idx); + + if (!lineNeedsDraw(itemLayout)) { + return; + } + + var el = new this._LineCtor(lineData, idx, seriesScope); + lineData.setItemGraphicEl(idx, el); + this.group.add(el); + }; + + LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) { + var itemEl = oldLineData.getItemGraphicEl(oldIdx); + + if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { + this.group.remove(itemEl); + return; + } + + if (!itemEl) { + itemEl = new this._LineCtor(newLineData, newIdx, seriesScope); + } else { + itemEl.updateData(newLineData, newIdx, seriesScope); + } + + newLineData.setItemGraphicEl(newIdx, itemEl); + this.group.add(itemEl); + }; + + return LineDraw; + }(); + + function isEffectObject(el) { + return el.animators && el.animators.length > 0; + } + + function makeSeriesScope$1(lineData) { + var hostModel = lineData.hostModel; + var emphasisModel = hostModel.getModel('emphasis'); + return { + lineStyle: hostModel.getModel('lineStyle').getLineStyle(), + emphasisLineStyle: emphasisModel.getModel(['lineStyle']).getLineStyle(), + blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(), + selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(), + emphasisDisabled: emphasisModel.get('disabled'), + blurScope: emphasisModel.get('blurScope'), + focus: emphasisModel.get('focus'), + labelStatesModels: getLabelStatesModels(hostModel) + }; + } + + function isPointNaN(pt) { + return isNaN(pt[0]) || isNaN(pt[1]); + } + + function lineNeedsDraw(pts) { + return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]); + } + + var v1 = []; + var v2 = []; + var v3 = []; + var quadraticAt$1 = quadraticAt; + var v2DistSquare = distSquare; + var mathAbs$2 = Math.abs; + + function intersectCurveCircle(curvePoints, center, radius) { + var p0 = curvePoints[0]; + var p1 = curvePoints[1]; + var p2 = curvePoints[2]; + var d = Infinity; + var t; + var radiusSquare = radius * radius; + var interval = 0.1; + + for (var _t = 0.1; _t <= 0.9; _t += 0.1) { + v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t); + v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t); + var diff = mathAbs$2(v2DistSquare(v1, center) - radiusSquare); + + if (diff < d) { + d = diff; + t = _t; + } + } // Assume the segment is monotone,Find root through Bisection method + // At most 32 iteration + + + for (var i = 0; i < 32; i++) { + // let prev = t - interval; + var next = t + interval; // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev); + // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev); + + v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t); + v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t); + v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next); + v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next); + var diff = v2DistSquare(v2, center) - radiusSquare; + + if (mathAbs$2(diff) < 1e-2) { + break; + } // let prevDiff = v2DistSquare(v1, center) - radiusSquare; + + + var nextDiff = v2DistSquare(v3, center) - radiusSquare; + interval /= 2; + + if (diff < 0) { + if (nextDiff >= 0) { + t = t + interval; + } else { + t = t - interval; + } + } else { + if (nextDiff >= 0) { + t = t - interval; + } else { + t = t + interval; + } + } + } + + return t; + } // Adjust edge to avoid + + + function adjustEdge(graph, scale) { + var tmp0 = []; + var quadraticSubdivide$1 = quadraticSubdivide; + var pts = [[], [], []]; + var pts2 = [[], []]; + var v = []; + scale /= 2; + graph.eachEdge(function (edge, idx) { + var linePoints = edge.getLayout(); + var fromSymbol = edge.getVisual('fromSymbol'); + var toSymbol = edge.getVisual('toSymbol'); + + if (!linePoints.__original) { + linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])]; + + if (linePoints[2]) { + linePoints.__original.push(clone$1(linePoints[2])); + } + } + + var originalPoints = linePoints.__original; // Quadratic curve + + if (linePoints[2] != null) { + copy(pts[0], originalPoints[0]); + copy(pts[1], originalPoints[2]); + copy(pts[2], originalPoints[1]); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale); // Subdivide and get the second + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[0][0] = tmp0[3]; + pts[1][0] = tmp0[4]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[0][1] = tmp0[3]; + pts[1][1] = tmp0[4]; + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale); // Subdivide and get the first + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[1][0] = tmp0[1]; + pts[2][0] = tmp0[2]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[1][1] = tmp0[1]; + pts[2][1] = tmp0[2]; + } // Copy back to layout + + + copy(linePoints[0], pts[0]); + copy(linePoints[1], pts[2]); + copy(linePoints[2], pts[1]); + } // Line + else { + copy(pts2[0], originalPoints[0]); + copy(pts2[1], originalPoints[1]); + sub(v, pts2[1], pts2[0]); + normalize(v, v); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale); + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale); + } + + copy(linePoints[0], pts2[0]); + copy(linePoints[1], pts2[1]); + } + }); + } + + function isViewCoordSys(coordSys) { + return coordSys.type === 'view'; + } + + var GraphView = + /** @class */ + function (_super) { + __extends(GraphView, _super); + + function GraphView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphView.type; + return _this; + } + + GraphView.prototype.init = function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + group.add(symbolDraw.group); + group.add(lineDraw.group); + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + this._firstRender = true; + }; + + GraphView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + this._model = seriesModel; + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + var group = this.group; + + if (isViewCoordSys(coordSys)) { + var groupNewProp = { + x: coordSys.x, + y: coordSys.y, + scaleX: coordSys.scaleX, + scaleY: coordSys.scaleY + }; + + if (this._firstRender) { + group.attr(groupNewProp); + } else { + updateProps(group, groupNewProp, seriesModel); + } + } // Fix edge contact point with node + + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + var data = seriesModel.getData(); + symbolDraw.updateData(data); + var edgeData = seriesModel.getEdgeData(); // TODO: TYPE + + lineDraw.updateData(edgeData); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, ecModel, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']); + + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + + var layout = seriesModel.get('layout'); + data.graph.eachNode(function (node) { + var idx = node.dataIndex; + var el = node.getGraphicEl(); + var itemModel = node.getModel(); + + if (!el) { + return; + } // Update draggable + + + el.off('drag').off('dragend'); + var draggable = itemModel.get('draggable'); + + if (draggable) { + el.on('drag', function (e) { + switch (layout) { + case 'force': + forceLayout.warmUp(); + !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); // Write position back to layout + + data.setItemLayout(idx, [el.x, el.y]); + break; + + case 'circular': + data.setItemLayout(idx, [el.x, el.y]); // mark node fixed + + node.setLayout({ + fixed: true + }, true); // recalculate circular layout + + circularLayout(seriesModel, 'symbolSize', node, [e.offsetX, e.offsetY]); + + _this.updateLayout(seriesModel); + + break; + + case 'none': + default: + data.setItemLayout(idx, [el.x, el.y]); // update edge + + simpleLayoutEdge(seriesModel.getGraph(), seriesModel); + + _this.updateLayout(seriesModel); + + break; + } + }).on('dragend', function () { + if (forceLayout) { + forceLayout.setUnfixed(idx); + } + }); + } + + el.setDraggable(draggable, !!itemModel.get('cursor')); + var focus = itemModel.get(['emphasis', 'focus']); + + if (focus === 'adjacency') { + getECData(el).focus = node.getAdjacentDataIndices(); + } + }); + data.graph.eachEdge(function (edge) { + var el = edge.getGraphicEl(); + var focus = edge.getModel().get(['emphasis', 'focus']); + + if (!el) { + return; + } + + if (focus === 'adjacency') { + getECData(el).focus = { + edge: [edge.dataIndex], + node: [edge.node1.dataIndex, edge.node2.dataIndex] + }; + } + }); + var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']); + var cx = data.getLayout('cx'); + var cy = data.getLayout('cy'); + data.graph.eachNode(function (node) { + rotateNodeLabel(node, circularRotateLabel, cx, cy); + }); + this._firstRender = false; + }; + + GraphView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) { + var self = this; + + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(self._model); + (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); + }); + })(); + }; + + GraphView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + + if (!isViewCoordSys(seriesModel.coordinateSystem)) { + controller.disable(); + return; + } + + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(); + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + _this._lineDraw.updateLayout(); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + GraphView.prototype._updateNodeAndLinkScale = function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + var nodeScale = getNodeGlobalScale(seriesModel); + data.eachItemGraphicEl(function (el, idx) { + el && el.setSymbolScale(nodeScale); + }); + }; + + GraphView.prototype.updateLayout = function (seriesModel) { + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + this._symbolDraw.updateLayout(); + + this._lineDraw.updateLayout(); + }; + + GraphView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + }; + + GraphView.type = 'graph'; + return GraphView; + }(ChartView); + + function generateNodeKey(id) { + return '_EC_' + id; + } + + var Graph = + /** @class */ + function () { + function Graph(directed) { + this.type = 'graph'; + this.nodes = []; + this.edges = []; + this._nodesMap = {}; + /** + * @type {Object.} + * @private + */ + + this._edgesMap = {}; + this._directed = directed || false; + } + /** + * If is directed graph + */ + + + Graph.prototype.isDirected = function () { + return this._directed; + }; + /** + * Add a new node + */ + + Graph.prototype.addNode = function (id, dataIndex) { + id = id == null ? '' + dataIndex : '' + id; + var nodesMap = this._nodesMap; + + if (nodesMap[generateNodeKey(id)]) { + if ("development" !== 'production') { + console.error('Graph nodes have duplicate name or id'); + } + + return; + } + + var node = new GraphNode(id, dataIndex); + node.hostGraph = this; + this.nodes.push(node); + nodesMap[generateNodeKey(id)] = node; + return node; + }; + /** + * Get node by data index + */ + + Graph.prototype.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; + }; + /** + * Get node by id + */ + + Graph.prototype.getNodeById = function (id) { + return this._nodesMap[generateNodeKey(id)]; + }; + /** + * Add a new edge + */ + + Graph.prototype.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; // PENDING + + if (isNumber(n1)) { + n1 = this.nodes[n1]; + } + + if (isNumber(n2)) { + n2 = this.nodes[n2]; + } + + if (!(n1 instanceof GraphNode)) { + n1 = nodesMap[generateNodeKey(n1)]; + } + + if (!(n2 instanceof GraphNode)) { + n2 = nodesMap[generateNodeKey(n2)]; + } + + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + var edge = new GraphEdge(n1, n2, dataIndex); + edge.hostGraph = this; + + if (this._directed) { + n1.outEdges.push(edge); + n2.inEdges.push(edge); + } + + n1.edges.push(edge); + + if (n1 !== n2) { + n2.edges.push(edge); + } + + this.edges.push(edge); + edgesMap[key] = edge; + return edge; + }; + /** + * Get edge by data index + */ + + Graph.prototype.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; + }; + /** + * Get edge by two linked nodes + */ + + Graph.prototype.getEdge = function (n1, n2) { + if (n1 instanceof GraphNode) { + n1 = n1.id; + } + + if (n2 instanceof GraphNode) { + n2 = n2.id; + } + + var edgesMap = this._edgesMap; + + if (this._directed) { + return edgesMap[n1 + '-' + n2]; + } else { + return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1]; + } + }; + /** + * Iterate all nodes + */ + + Graph.prototype.eachNode = function (cb, context) { + var nodes = this.nodes; + var len = nodes.length; + + for (var i = 0; i < len; i++) { + if (nodes[i].dataIndex >= 0) { + cb.call(context, nodes[i], i); + } + } + }; + /** + * Iterate all edges + */ + + Graph.prototype.eachEdge = function (cb, context) { + var edges = this.edges; + var len = edges.length; + + for (var i = 0; i < len; i++) { + if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) { + cb.call(context, edges[i], i); + } + } + }; + /** + * Breadth first traverse + * Return true to stop traversing + */ + + Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) { + if (!(startNode instanceof GraphNode)) { + startNode = this._nodesMap[generateNodeKey(startNode)]; + } + + if (!startNode) { + return; + } + + var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges'; + + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].__visited = false; + } + + if (cb.call(context, startNode, null)) { + return; + } + + var queue = [startNode]; + + while (queue.length) { + var currentNode = queue.shift(); + var edges = currentNode[edgeType]; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var otherNode = e.node1 === currentNode ? e.node2 : e.node1; + + if (!otherNode.__visited) { + if (cb.call(context, otherNode, currentNode)) { + // Stop traversing + return; + } + + queue.push(otherNode); + otherNode.__visited = true; + } + } + } + }; + // depthFirstTraverse( + // cb, startNode, direction, context + // ) { + // }; + // Filter update + + Graph.prototype.update = function () { + var data = this.data; + var edgeData = this.edgeData; + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + + edgeData.filterSelf(function (idx) { + var edge = edges[edgeData.getRawIndex(idx)]; + return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; + }); // Update edge + + for (var i = 0, len = edges.length; i < len; i++) { + edges[i].dataIndex = -1; + } + + for (var i = 0, len = edgeData.count(); i < len; i++) { + edges[edgeData.getRawIndex(i)].dataIndex = i; + } + }; + /** + * @return {module:echarts/data/Graph} + */ + + Graph.prototype.clone = function () { + var graph = new Graph(this._directed); + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(nodes[i].id, nodes[i].dataIndex); + } + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); + } + + return graph; + }; + return Graph; + }(); + + var GraphNode = + /** @class */ + function () { + function GraphNode(id, dataIndex) { + this.inEdges = []; + this.outEdges = []; + this.edges = []; + this.dataIndex = -1; + this.id = id == null ? '' : id; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + /** + * @return {number} + */ + + + GraphNode.prototype.degree = function () { + return this.edges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.inDegree = function () { + return this.inEdges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.outDegree = function () { + return this.outEdges.length; + }; + + GraphNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphNode.prototype.getAdjacentDataIndices = function () { + var dataIndices = { + edge: [], + node: [] + }; + + for (var i = 0; i < this.edges.length; i++) { + var adjacentEdge = this.edges[i]; + + if (adjacentEdge.dataIndex < 0) { + continue; + } + + dataIndices.edge.push(adjacentEdge.dataIndex); + dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex); + } + + return dataIndices; + }; + + return GraphNode; + }(); + + var GraphEdge = + /** @class */ + function () { + function GraphEdge(n1, n2, dataIndex) { + this.dataIndex = -1; + this.node1 = n1; + this.node2 = n2; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + GraphEdge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphEdge.prototype.getAdjacentDataIndices = function () { + return { + edge: [this.dataIndex], + node: [this.node1.dataIndex, this.node2.dataIndex] + }; + }; + + return GraphEdge; + }(); + + function createGraphDataProxyMixin(hostName, dataName) { + return { + /** + * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }, + // TODO: TYPE stricter type. + setVisual: function (key, value) { + this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + getVisual: function (key) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key); + }, + setLayout: function (layout, merge) { + this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge); + }, + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; + } + mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data')); + mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + + function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) { + // ??? TODO + // support dataset? + var graph = new Graph(directed); + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(retrieve( // Id, name, dataIndex + nodes[i].id, nodes[i].name, i), i); + } + + var linkNameList = []; + var validEdges = []; + var linkCount = 0; + + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + var source = link.source; + var target = link.target; // addEdge may fail when source or target not exists + + if (graph.addEdge(source, target, linkCount)) { + validEdges.push(link); + linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + ' > ' + target)); + linkCount++; + } + } + + var coordSys = seriesModel.get('coordinateSystem'); + var nodeData; + + if (coordSys === 'cartesian2d' || coordSys === 'polar') { + nodeData = createSeriesData(nodes, seriesModel); + } else { + var coordSysCtor = CoordinateSystemManager.get(coordSys); + var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : []; // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs + // `value` dimension, but graph need `value` dimension. It's better to + // uniform this behavior. + + if (indexOf(coordDimensions, 'value') < 0) { + coordDimensions.concat(['value']); + } + + var dimensions = prepareSeriesDataSchema(nodes, { + coordDimensions: coordDimensions, + encodeDefine: seriesModel.getEncode() + }).dimensions; + nodeData = new SeriesData(dimensions, seriesModel); + nodeData.initData(nodes); + } + + var edgeData = new SeriesData(['value'], seriesModel); + edgeData.initData(validEdges, linkNameList); + beforeLink && beforeLink(nodeData, edgeData); + linkSeriesData({ + mainData: nodeData, + struct: graph, + structAttr: 'graph', + datas: { + node: nodeData, + edge: edgeData + }, + datasAttr: { + node: 'data', + edge: 'edgeData' + } + }); // Update dataIndex of nodes and edges because invalid edge may be removed + + graph.update(); + return graph; + } + + var GraphSeriesModel = + /** @class */ + function (_super) { + __extends(GraphSeriesModel, _super); + + function GraphSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + GraphSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); + + var self = this; + + function getCategoriesData() { + return self._categoriesData; + } // Provide data for legend select + + + this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData); + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) { + _super.prototype.mergeDefaultAndTheme.apply(this, arguments); + + defaultEmphasis(option, 'edgeLabel', ['show']); + }; + + GraphSeriesModel.prototype.getInitialData = function (option, ecModel) { + var edges = option.edges || option.links || []; + var nodes = option.data || option.nodes || []; + var self = this; + + if (nodes && edges) { + // auto curveness + initCurvenessList(this); + var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink); + each(graph.edges, function (edge) { + createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex); + }, this); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + // Overwrite nodeData.getItemModel to + nodeData.wrapMethod('getItemModel', function (model) { + var categoriesModels = self._categoriesModels; + var categoryIdx = model.getShallow('category'); + var categoryModel = categoriesModels[categoryIdx]; + + if (categoryModel) { + categoryModel.parentModel = model.parentModel; + model.parentModel = categoryModel; + } + + return model; + }); // TODO Inherit resolveParentPath by default in Model#getModel? + + var oldGetModel = Model.prototype.getModel; + + function newGetModel(path, parentModel) { + var model = oldGetModel.call(this, path, parentModel); + model.resolveParentPath = resolveParentPath; + return model; + } + + edgeData.wrapMethod('getItemModel', function (model) { + model.resolveParentPath = resolveParentPath; + model.getModel = newGetModel; + return model; + }); + + function resolveParentPath(pathArr) { + if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) { + var newPathArr = pathArr.slice(); + + if (pathArr[0] === 'label') { + newPathArr[0] = 'edgeLabel'; + } else if (pathArr[1] === 'label') { + newPathArr[1] = 'edgeLabel'; + } + + return newPathArr; + } + + return pathArr; + } + } + }; + + GraphSeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + + GraphSeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + GraphSeriesModel.prototype.getCategoriesData = function () { + return this._categoriesData; + }; + + GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + if (dataType === 'edge') { + var nodeData = this.getData(); + var params = this.getDataParams(dataIndex, dataType); + var edge = nodeData.graph.getEdgeByIndex(dataIndex); + var sourceName = nodeData.getName(edge.node1.dataIndex); + var targetName = nodeData.getName(edge.node2.dataIndex); + var nameArr = []; + sourceName != null && nameArr.push(sourceName); + targetName != null && nameArr.push(targetName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > '), + value: params.value, + noValue: params.value == null + }); + } // dataType === 'node' or empty + + + var nodeMarkup = defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + return nodeMarkup; + }; + + GraphSeriesModel.prototype._updateCategoriesData = function () { + var categories = map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : extend({ + value: 0 + }, category); + }); + var categoriesData = new SeriesData(['value'], this); + categoriesData.initData(categories); + this._categoriesData = categoriesData; + this._categoriesModels = categoriesData.mapArray(function (idx) { + return categoriesData.getItemModel(idx); + }); + }; + + GraphSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GraphSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + GraphSeriesModel.prototype.isAnimationEnabled = function () { + return _super.prototype.isAnimationEnabled.call(this) // Not enable animation when do force layout + && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation'])); + }; + + GraphSeriesModel.type = 'series.graph'; + GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + GraphSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // Default option for all coordinate systems + // xAxisIndex: 0, + // yAxisIndex: 0, + // polarIndex: 0, + // geoIndex: 0, + legendHoverLink: true, + layout: null, + // Configuration of circular layout + circular: { + rotateLabel: false + }, + // Configuration of force directed layout + force: { + initLayout: null, + // Node repulsion. Can be an array to represent range. + repulsion: [0, 50], + gravity: 0.1, + // Initial friction + friction: 0.6, + // Edge length. Can be an array to represent range. + edgeLength: 30, + layoutAnimation: true + }, + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + symbol: 'circle', + symbolSize: 10, + edgeSymbol: ['none', 'none'], + edgeSymbolSize: 10, + edgeLabel: { + position: 'middle', + distance: 5 + }, + draggable: false, + roam: false, + // Default on center of graph + center: null, + zoom: 1, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + // cursor: null, + // categories: [], + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + label: { + show: false, + formatter: '{b}' + }, + itemStyle: {}, + lineStyle: { + color: '#aaa', + width: 1, + opacity: 0.5 + }, + emphasis: { + scale: true, + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return GraphSeriesModel; + }(SeriesModel); + + var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' + }; + function install$d(registers) { + registers.registerChartView(GraphView); + registers.registerSeriesModel(GraphSeriesModel); + registers.registerProcessor(categoryFilter); + registers.registerVisual(categoryVisual); + registers.registerVisual(graphEdgeVisual); + registers.registerLayout(graphSimpleLayout); + registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout); + registers.registerLayout(graphForceLayout); + registers.registerCoordinateSystem('graphView', { + dimensions: View.dimensions, + create: createViewCoordSys + }); // Register legacy focus actions + + registers.registerAction({ + type: 'focusNodeAdjacency', + event: 'focusNodeAdjacency', + update: 'series:focusNodeAdjacency' + }, noop); + registers.registerAction({ + type: 'unfocusNodeAdjacency', + event: 'unfocusNodeAdjacency', + update: 'series:unfocusNodeAdjacency' + }, noop); // Register roam action. + + registers.registerAction(actionInfo, function (payload, ecModel, api) { + ecModel.eachComponent({ + mainType: 'series', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload, undefined, api); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + var PointerShape = + /** @class */ + function () { + function PointerShape() { + this.angle = 0; + this.width = 10; + this.r = 10; + this.x = 0; + this.y = 0; + } + + return PointerShape; + }(); + + var PointerPath = + /** @class */ + function (_super) { + __extends(PointerPath, _super); + + function PointerPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'pointer'; + return _this; + } + + PointerPath.prototype.getDefaultShape = function () { + return new PointerShape(); + }; + + PointerPath.prototype.buildPath = function (ctx, shape) { + var mathCos = Math.cos; + var mathSin = Math.sin; + var r = shape.r; + var width = shape.width; + var angle = shape.angle; + var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); + var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); + angle = shape.angle - Math.PI / 2; + ctx.moveTo(x, y); + ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width); + ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r); + ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width); + ctx.lineTo(x, y); + }; + + return PointerPath; + }(Path); + + function parsePosition(seriesModel, api) { + var center = seriesModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], api.getWidth()); + var cy = parsePercent$1(center[1], api.getHeight()); + var r = parsePercent$1(seriesModel.get('radius'), size / 2); + return { + cx: cx, + cy: cy, + r: r + }; + } + + function formatLabel(value, labelFormatter) { + var label = value == null ? '' : value + ''; + + if (labelFormatter) { + if (isString(labelFormatter)) { + label = labelFormatter.replace('{value}', label); + } else if (isFunction(labelFormatter)) { + label = labelFormatter(value); + } + } + + return label; + } + + var GaugeView = + /** @class */ + function (_super) { + __extends(GaugeView, _super); + + function GaugeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeView.type; + return _this; + } + + GaugeView.prototype.render = function (seriesModel, ecModel, api) { + this.group.removeAll(); + var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']); + var posInfo = parsePosition(seriesModel, api); + + this._renderMain(seriesModel, ecModel, api, colorList, posInfo); + + this._data = seriesModel.getData(); + }; + + GaugeView.prototype.dispose = function () {}; + + GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + var axisLineModel = seriesModel.getModel('axisLine'); + var roundCap = axisLineModel.get('roundCap'); + var MainPath = roundCap ? SausagePath : Sector; + var showAxis = axisLineModel.get('show'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + var axisLineWidth = lineStyleModel.get('width'); + var angles = [startAngle, endAngle]; + normalizeArcAngles(angles, !clockwise); + startAngle = angles[0]; + endAngle = angles[1]; + var angleRangeSpan = endAngle - startAngle; + var prevEndAngle = startAngle; + var sectors = []; + + for (var i = 0; showAxis && i < colorList.length; i++) { + // Clamp + var percent = Math.min(Math.max(colorList[i][0], 0), 1); + endAngle = startAngle + angleRangeSpan * percent; + var sector = new MainPath({ + shape: { + startAngle: prevEndAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: posInfo.r - axisLineWidth, + r: posInfo.r + }, + silent: true + }); + sector.setStyle({ + fill: colorList[i][1] + }); + sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc + // so the properties for stroking are useless + ['color', 'width'])); + sectors.push(sector); + prevEndAngle = endAngle; + } + + sectors.reverse(); + each(sectors, function (sector) { + return group.add(sector); + }); + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + + var i; + + for (i = 0; i < colorList.length; i++) { + if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) { + return colorList[i][1]; + } + } // More than 1 + + + return colorList[i - 1][1]; + }; + + this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + + this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo); + + this._renderAnchor(seriesModel, posInfo); + + this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + }; + + GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var cx = posInfo.cx; + var cy = posInfo.cy; + var r = posInfo.r; + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var splitLineModel = seriesModel.getModel('splitLine'); + var tickModel = seriesModel.getModel('axisTick'); + var labelModel = seriesModel.getModel('axisLabel'); + var splitNumber = seriesModel.get('splitNumber'); + var subSplitNumber = tickModel.get('splitNumber'); + var splitLineLen = parsePercent$1(splitLineModel.get('length'), r); + var tickLen = parsePercent$1(tickModel.get('length'), r); + var angle = startAngle; + var step = (endAngle - startAngle) / splitNumber; + var subStep = step / subSplitNumber; + var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle(); + var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle(); + var splitLineDistance = splitLineModel.get('distance'); + var unitX; + var unitY; + + for (var i = 0; i <= splitNumber; i++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); // Split line + + if (splitLineModel.get('show')) { + var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth; + var splitLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - splitLineLen - distance) + cx, + y2: unitY * (r - splitLineLen - distance) + cy + }, + style: splitLineStyle, + silent: true + }); + + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } // Label + + + if (labelModel.get('show')) { + var distance = labelModel.get('distance') + splitLineDistance; + var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter')); + var autoColor = getColor(i / splitNumber); + var textStyleX = unitX * (r - splitLineLen - distance) + cx; + var textStyleY = unitY * (r - splitLineLen - distance) + cy; + var rotateType = labelModel.get('rotate'); + var rotate = 0; + + if (rotateType === 'radial') { + rotate = -angle + 2 * Math.PI; + + if (rotate > Math.PI / 2) { + rotate += Math.PI; + } + } else if (rotateType === 'tangential') { + rotate = -angle - Math.PI / 2; + } else if (isNumber(rotateType)) { + rotate = rotateType * Math.PI / 180; + } + + if (rotate === 0) { + group.add(new ZRText({ + style: createTextStyle(labelModel, { + text: label, + x: textStyleX, + y: textStyleY, + verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle', + align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center' + }, { + inheritColor: autoColor + }), + silent: true + })); + } else { + group.add(new ZRText({ + style: createTextStyle(labelModel, { + text: label, + x: textStyleX, + y: textStyleY, + verticalAlign: 'middle', + align: 'center' + }, { + inheritColor: autoColor + }), + silent: true, + originX: textStyleX, + originY: textStyleY, + rotation: rotate + })); + } + } // Axis tick + + + if (tickModel.get('show') && i !== splitNumber) { + var distance = tickModel.get('distance'); + distance = distance ? distance + axisLineWidth : axisLineWidth; + + for (var j = 0; j <= subSplitNumber; j++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); + var tickLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - tickLen - distance) + cx, + y2: unitY * (r - tickLen - distance) + cy + }, + silent: true, + style: tickLineStyle + }); + + if (tickLineStyle.stroke === 'auto') { + tickLine.setStyle({ + stroke: getColor((i + j / subSplitNumber) / splitNumber) + }); + } + + group.add(tickLine); + angle += subStep; + } + + angle -= subStep; + } else { + angle += step; + } + } + }; + + GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var oldData = this._data; + var oldProgressData = this._progressEls; + var progressList = []; + var showPointer = seriesModel.get(['pointer', 'show']); + var progressModel = seriesModel.getModel('progress'); + var showProgress = progressModel.get('show'); + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var valueExtent = [minVal, maxVal]; + var angleExtent = [startAngle, endAngle]; + + function createPointer(idx, angle) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + var pointerWidth = parsePercent$1(pointerModel.get('width'), posInfo.r); + var pointerLength = parsePercent$1(pointerModel.get('length'), posInfo.r); + var pointerStr = seriesModel.get(['pointer', 'icon']); + var pointerOffset = pointerModel.get('offsetCenter'); + var pointerOffsetX = parsePercent$1(pointerOffset[0], posInfo.r); + var pointerOffsetY = parsePercent$1(pointerOffset[1], posInfo.r); + var pointerKeepAspect = pointerModel.get('keepAspect'); + var pointer; // not exist icon type will be set 'rect' + + if (pointerStr) { + pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect); + } else { + pointer = new PointerPath({ + shape: { + angle: -Math.PI / 2, + width: pointerWidth, + r: pointerLength, + x: pointerOffsetX, + y: pointerOffsetY + } + }); + } + + pointer.rotation = -(angle + Math.PI / 2); + pointer.x = posInfo.cx; + pointer.y = posInfo.cy; + return pointer; + } + + function createProgress(idx, endAngle) { + var roundCap = progressModel.get('roundCap'); + var ProgressPath = roundCap ? SausagePath : Sector; + var isOverlap = progressModel.get('overlap'); + var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count(); + var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth; + var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth; + var progress = new ProgressPath({ + shape: { + startAngle: startAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: r0, + r: r + } + }); + isOverlap && (progress.z2 = maxVal - data.get(valueDim, idx) % maxVal); + return progress; + } + + if (showProgress || showPointer) { + data.diff(oldData).add(function (idx) { + var val = data.get(valueDim, idx); + + if (showPointer) { + var pointer = createPointer(idx, startAngle); // TODO hide pointer on NaN value? + + initProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + } + + if (showProgress) { + var progress = createProgress(idx, startAngle); + var isClip = progressModel.get('clip'); + initProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress); + progressList[idx] = progress; + } + }).update(function (newIdx, oldIdx) { + var val = data.get(valueDim, newIdx); + + if (showPointer) { + var previousPointer = oldData.getItemGraphicEl(oldIdx); + var previousRotate = previousPointer ? previousPointer.rotation : startAngle; + var pointer = createPointer(newIdx, previousRotate); + pointer.rotation = previousRotate; + updateProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + } + + if (showProgress) { + var previousProgress = oldProgressData[oldIdx]; + var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle; + var progress = createProgress(newIdx, previousEndAngle); + var isClip = progressModel.get('clip'); + updateProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress); + progressList[newIdx] = progress; + } + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + + if (showPointer) { + var pointer = data.getItemGraphicEl(idx); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (pointer instanceof ZRImage) { + var pathStyle = pointer.style; + pointer.useStyle(extend({ + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + pointer.useStyle(symbolStyle); + pointer.type !== 'pointer' && pointer.setColor(visualColor); + } + + pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle()); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true))); + } + + pointer.z2EmphasisLift = 0; + setStatesStylesFromModel(pointer, itemModel); + toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled); + } + + if (showProgress) { + var progress = progressList[idx]; + progress.useStyle(data.getItemVisual(idx, 'style')); + progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle()); + progress.z2EmphasisLift = 0; + setStatesStylesFromModel(progress, itemModel); + toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled); + } + }); + this._progressEls = progressList; + } + }; + + GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) { + var anchorModel = seriesModel.getModel('anchor'); + var showAnchor = anchorModel.get('show'); + + if (showAnchor) { + var anchorSize = anchorModel.get('size'); + var anchorType = anchorModel.get('icon'); + var offsetCenter = anchorModel.get('offsetCenter'); + var anchorKeepAspect = anchorModel.get('keepAspect'); + var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent$1(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent$1(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect); + anchor.z2 = anchorModel.get('showAbove') ? 1 : 0; + anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle()); + this.group.add(anchor); + } + }; + + GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) { + var _this = this; + + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var contentGroup = new Group(); + var newTitleEls = []; + var newDetailEls = []; + var hasAnimation = seriesModel.isAnimationEnabled(); + var showPointerAbove = seriesModel.get(['pointer', 'showAbove']); + data.diff(this._data).add(function (idx) { + newTitleEls[idx] = new ZRText({ + silent: true + }); + newDetailEls[idx] = new ZRText({ + silent: true + }); + }).update(function (idx, oldIdx) { + newTitleEls[idx] = _this._titleEls[oldIdx]; + newDetailEls[idx] = _this._detailEls[oldIdx]; + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var value = data.get(valueDim, idx); + var itemGroup = new Group(); + var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true)); + var itemTitleModel = itemModel.getModel('title'); + + if (itemTitleModel.get('show')) { + var titleOffsetCenter = itemTitleModel.get('offsetCenter'); + var titleX = posInfo.cx + parsePercent$1(titleOffsetCenter[0], posInfo.r); + var titleY = posInfo.cy + parsePercent$1(titleOffsetCenter[1], posInfo.r); + var labelEl = newTitleEls[idx]; + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemTitleModel, { + x: titleX, + y: titleY, + text: data.getName(idx), + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: autoColor + }) + }); + itemGroup.add(labelEl); + } + + var itemDetailModel = itemModel.getModel('detail'); + + if (itemDetailModel.get('show')) { + var detailOffsetCenter = itemDetailModel.get('offsetCenter'); + var detailX = posInfo.cx + parsePercent$1(detailOffsetCenter[0], posInfo.r); + var detailY = posInfo.cy + parsePercent$1(detailOffsetCenter[1], posInfo.r); + var width = parsePercent$1(itemDetailModel.get('width'), posInfo.r); + var height = parsePercent$1(itemDetailModel.get('height'), posInfo.r); + var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor; + var labelEl = newDetailEls[idx]; + var formatter_1 = itemDetailModel.get('formatter'); + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemDetailModel, { + x: detailX, + y: detailY, + text: formatLabel(value, formatter_1), + width: isNaN(width) ? null : width, + height: isNaN(height) ? null : height, + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: detailColor + }) + }); + setLabelValueAnimation(labelEl, { + normal: itemDetailModel + }, value, function (value) { + return formatLabel(value, formatter_1); + }); + hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, { + getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) { + return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1); + } + }); + itemGroup.add(labelEl); + } + + contentGroup.add(itemGroup); + }); + this.group.add(contentGroup); + this._titleEls = newTitleEls; + this._detailEls = newDetailEls; + }; + + GaugeView.type = 'gauge'; + return GaugeView; + }(ChartView); + + var GaugeSeriesModel = + /** @class */ + function (_super) { + __extends(GaugeSeriesModel, _super); + + function GaugeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeSeriesModel.type; + _this.visualStyleAccessPath = 'itemStyle'; + return _this; + } + + GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, ['value']); + }; + + GaugeSeriesModel.type = 'series.gauge'; + GaugeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + legendHoverLink: true, + radius: '75%', + startAngle: 225, + endAngle: -45, + clockwise: true, + // 最小值 + min: 0, + // 最大值 + max: 100, + // 分割段数,默认为10 + splitNumber: 10, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + roundCap: false, + lineStyle: { + color: [[1, '#E6EBF8']], + width: 10 + } + }, + // 坐标轴线 + progress: { + // 默认显示,属性show控制显示与否 + show: false, + overlap: true, + width: 10, + roundCap: false, + clip: true + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 10, + distance: 10, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#63677A', + width: 3, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 6, + distance: 10, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#63677A', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + distance: 15, + // formatter: null, + color: '#464646', + fontSize: 12, + rotate: 0 + }, + pointer: { + icon: null, + offsetCenter: [0, 0], + show: true, + showAbove: true, + length: '60%', + width: 6, + keepAspect: false + }, + anchor: { + show: false, + showAbove: false, + size: 6, + icon: 'circle', + offsetCenter: [0, 0], + keepAspect: false, + itemStyle: { + color: '#fff', + borderWidth: 0, + borderColor: '#5470c6' + } + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '20%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 16, + valueAnimation: false + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: null, + padding: [5, 10], + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 30, + fontWeight: 'bold', + lineHeight: 30, + valueAnimation: false + } + }; + return GaugeSeriesModel; + }(SeriesModel); + + function install$e(registers) { + registers.registerChartView(GaugeView); + registers.registerSeriesModel(GaugeSeriesModel); + } + + var opacityAccessPath = ['itemStyle', 'opacity']; + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var FunnelPiece = + /** @class */ + function (_super) { + __extends(FunnelPiece, _super); + + function FunnelPiece(data, idx) { + var _this = _super.call(this) || this; + + var polygon = _this; + var labelLine = new Polyline(); + var text = new ZRText(); + polygon.setTextContent(text); + + _this.setTextGuideLine(labelLine); + + _this.updateData(data, idx, true); + + return _this; + } + + FunnelPiece.prototype.updateData = function (data, idx, firstCreate) { + var polygon = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var opacity = itemModel.get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; + + if (!firstCreate) { + saveOldStyle(polygon); + } // Update common style + + + polygon.useStyle(data.getItemVisual(idx, 'style')); + polygon.style.lineJoin = 'round'; + + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.style.opacity = 0; + initProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel, idx); + } else { + updateProps(polygon, { + style: { + opacity: opacity + }, + shape: { + points: layout.points + } + }, seriesModel, idx); + } + + setStatesStylesFromModel(polygon, itemModel); + + this._updateLabel(data, idx); + + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + FunnelPiece.prototype._updateLabel = function (data, idx) { + var polygon = this; + var labelLine = this.getTextGuideLine(); + var labelText = polygon.getTextContent(); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var style = data.getItemVisual(idx, 'style'); + var visualColor = style.fill; + setLabelStyle( // position will not be used in setLabelStyle + labelText, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: data.getName(idx) + }, { + normal: { + align: labelLayout.textAlign, + verticalAlign: labelLayout.verticalAlign + } + }); + polygon.setTextConfig({ + local: true, + inside: !!labelLayout.inside, + insideStroke: visualColor, + // insideFill: 'auto', + outsideFill: visualColor + }); + var linePoints = labelLayout.linePoints; + labelLine.setShape({ + points: linePoints + }); + polygon.textGuideLineConfig = { + anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null + }; // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + originX: labelLayout.x, + originY: labelLayout.y, + z2: 10 + }); + setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), { + // Default use item visual color + stroke: visualColor + }); + }; + + return FunnelPiece; + }(Polygon); + + var FunnelView = + /** @class */ + function (_super) { + __extends(FunnelView, _super); + + function FunnelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelView.type; + _this.ignoreLabelLineUpdate = true; + return _this; + } + + FunnelView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + data.diff(oldData).add(function (idx) { + var funnelPiece = new FunnelPiece(data, idx); + data.setItemGraphicEl(idx, funnelPiece); + group.add(funnelPiece); + }).update(function (newIdx, oldIdx) { + var piece = oldData.getItemGraphicEl(oldIdx); + piece.updateData(data, newIdx); + group.add(piece); + data.setItemGraphicEl(newIdx, piece); + }).remove(function (idx) { + var piece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piece, seriesModel, idx); + }).execute(); + this._data = data; + }; + + FunnelView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + FunnelView.prototype.dispose = function () {}; + + FunnelView.type = 'funnel'; + return FunnelView; + }(ChartView); + + var FunnelSeriesModel = + /** @class */ + function (_super) { + __extends(FunnelSeriesModel, _super); + + function FunnelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelSeriesModel.type; + return _this; + } + + FunnelSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); // Extend labelLine emphasis + + this._defaultLabelLine(option); + }; + + FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + + FunnelSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; // Overwrite + + + FunnelSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); + + var valueDim = data.mapDimension('value'); + var sum = data.getSum(valueDim); // Percent is 0 if sum is 0 + + params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2); + params.$vars.push('percent'); + return params; + }; + + FunnelSeriesModel.type = 'series.funnel'; + FunnelSeriesModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 2, + legendHoverLink: true, + colorBy: 'data', + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + // 默认取数据最小最大值 + // min: 0, + // max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', + orient: 'vertical', + gap: 0, + funnelAlign: 'center', + label: { + show: true, + position: 'outer' // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + labelLine: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1 + } + }, + itemStyle: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return FunnelSeriesModel; + }(SeriesModel); + + function getViewRect$3(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getSortedIndices(data, sort) { + var valueDim = data.mapDimension('value'); + var valueArr = data.mapArray(valueDim, function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } // Add custom sortable function & none sortable opetion by "options.sort" + + + if (isFunction(sort)) { + indices.sort(sort); + } else if (sort !== 'none') { + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + } + + return indices; + } + + function labelLayout(data) { + var seriesModel = data.hostModel; + var orient = seriesModel.get('orient'); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelPosition = labelModel.get('position'); + var labelLineModel = itemModel.getModel('labelLine'); + var layout = data.getItemLayout(idx); + var points = layout.points; + var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight'; + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + if (labelPosition === 'insideLeft') { + textX = (points[0][0] + points[3][0]) / 2 + 5; + textY = (points[0][1] + points[3][1]) / 2; + textAlign = 'left'; + } else if (labelPosition === 'insideRight') { + textX = (points[1][0] + points[2][0]) / 2 - 5; + textY = (points[1][1] + points[2][1]) / 2; + textAlign = 'right'; + } else { + textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; + textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; + textAlign = 'center'; + } + + linePoints = [[textX, textY], [textX, textY]]; + } else { + var x1 = void 0; + var y1 = void 0; + var x2 = void 0; + var y2 = void 0; + var labelLineLen = labelLineModel.get('length'); + + if ("development" !== 'production') { + if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) { + labelPosition = 'left'; + console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.'); + } + + if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) { + labelPosition = 'bottom'; + console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.'); + } + } + + if (labelPosition === 'left') { + // Left side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } else if (labelPosition === 'right') { + // Right side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } else if (labelPosition === 'top') { + // Top side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else if (labelPosition === 'bottom') { + // Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else if (labelPosition === 'rightTop') { + // RightTop side + x1 = orient === 'horizontal' ? points[3][0] : points[1][0]; + y1 = orient === 'horizontal' ? points[3][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'top'; + } + } else if (labelPosition === 'rightBottom') { + // RightBottom side + x1 = points[2][0]; + y1 = points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'bottom'; + } + } else if (labelPosition === 'leftTop') { + // LeftTop side + x1 = points[0][0]; + y1 = orient === 'horizontal' ? points[0][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else if (labelPosition === 'leftBottom') { + // LeftBottom side + x1 = orient === 'horizontal' ? points[1][0] : points[3][0]; + y1 = orient === 'horizontal' ? points[1][1] : points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else { + // Right side or Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + } + + if (orient === 'horizontal') { + x2 = x1; + textX = x2; + } else { + y2 = y1; + textY = y2; + } + + linePoints = [[x1, y1], [x2, y2]]; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); + } + + function funnelLayout(ecModel, api) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect$3(seriesModel, api); + var orient = seriesModel.get('orient'); + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var indices = getSortedIndices(data, sort); + var x = viewRect.x; + var y = viewRect.y; + var sizeExtent = orient === 'horizontal' ? [parsePercent$1(seriesModel.get('minSize'), viewHeight), parsePercent$1(seriesModel.get('maxSize'), viewHeight)] : [parsePercent$1(seriesModel.get('minSize'), viewWidth), parsePercent$1(seriesModel.get('maxSize'), viewWidth)]; + var dataExtent = data.getDataExtent(valueDim); + var min = seriesModel.get('min'); + var max = seriesModel.get('max'); + + if (min == null) { + min = Math.min(dataExtent[0], 0); + } + + if (max == null) { + max = dataExtent[1]; + } + + var funnelAlign = seriesModel.get('funnelAlign'); + var gap = seriesModel.get('gap'); + var viewSize = orient === 'horizontal' ? viewWidth : viewHeight; + var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); + + var getLinePoints = function (idx, offset) { + // End point index is data.count() and we assign it 0 + if (orient === 'horizontal') { + var val_1 = data.get(valueDim, idx) || 0; + var itemHeight = linearMap(val_1, [min, max], sizeExtent, true); + var y0 = void 0; + + switch (funnelAlign) { + case 'top': + y0 = y; + break; + + case 'center': + y0 = y + (viewHeight - itemHeight) / 2; + break; + + case 'bottom': + y0 = y + (viewHeight - itemHeight); + break; + } + + return [[offset, y0], [offset, y0 + itemHeight]]; + } + + var val = data.get(valueDim, idx) || 0; + var itemWidth = linearMap(val, [min, max], sizeExtent, true); + var x0; + + switch (funnelAlign) { + case 'left': + x0 = x; + break; + + case 'center': + x0 = x + (viewWidth - itemWidth) / 2; + break; + + case 'right': + x0 = x + viewWidth - itemWidth; + break; + } + + return [[x0, offset], [x0 + itemWidth, offset]]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemSize = -itemSize; + gap = -gap; + + if (orient === 'horizontal') { + x += viewWidth; + } else { + y += viewHeight; + } + + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + var itemModel = data.getItemModel(idx); + + if (orient === 'horizontal') { + var width = itemModel.get(['itemStyle', 'width']); + + if (width == null) { + width = itemSize; + } else { + width = parsePercent$1(width, viewWidth); + + if (sort === 'ascending') { + width = -width; + } + } + + var start = getLinePoints(idx, x); + var end = getLinePoints(nextIdx, x + width); + x += width + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } else { + var height = itemModel.get(['itemStyle', 'height']); + + if (height == null) { + height = itemSize; + } else { + height = parsePercent$1(height, viewHeight); + + if (sort === 'ascending') { + height = -height; + } + } + + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + height); + y += height + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + } + + labelLayout(data); + }); + } + + function install$f(registers) { + registers.registerChartView(FunnelView); + registers.registerSeriesModel(FunnelSeriesModel); + registers.registerLayout(funnelLayout); + registers.registerProcessor(dataFilter('funnel')); + } + + var DEFAULT_SMOOTH = 0.3; + + var ParallelView = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + _this._dataGroup = new Group(); + _this._initialized = false; + return _this; + } + + ParallelView.prototype.init = function () { + this.group.add(this._dataGroup); + }; + /** + * @override + */ + + + ParallelView.prototype.render = function (seriesModel, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var dataGroup = this._dataGroup; + var data = seriesModel.getData(); + var oldData = this._data; + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + data.diff(oldData).add(add).update(update).remove(remove).execute(); + + function add(newDataIndex) { + var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function update(newDataIndex, oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + var points = createLinePoints(data, newDataIndex, dimensions, coordSys); + data.setItemGraphicEl(newDataIndex, line); + updateProps(line, { + shape: { + points: points + } + }, seriesModel, newDataIndex); + saveOldStyle(line); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function remove(oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(line); + } // First create + + + if (!this._initialized) { + this._initialized = true; + var clipPath = createGridClipShape(coordSys, seriesModel, function () { + // Callback will be invoked immediately if there is no animation + setTimeout(function () { + dataGroup.removeClipPath(); + }); + }); + dataGroup.setClipPath(clipPath); + } + + this._data = data; + }; + + ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._initialized = true; + this._data = null; + + this._dataGroup.removeAll(); + }; + + ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + var progressiveEls = this._progressiveEls = []; + + for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { + var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); + line.incremental = true; + updateElCommon(line, data, dataIndex, seriesScope); + progressiveEls.push(line); + } + }; + + ParallelView.prototype.remove = function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ChartView); + + function createGridClipShape(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new Rect({ + shape: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height'; + rectEl.setShape(dim, 0); + initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; + } + + function createLinePoints(data, dataIndex, dimensions, coordSys) { + var points = []; + + for (var i = 0; i < dimensions.length; i++) { + var dimName = dimensions[i]; + var value = data.get(data.mapDimension(dimName), dataIndex); + + if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { + points.push(coordSys.dataToPoint(value, dimName)); + } + } + + return points; + } + + function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { + var points = createLinePoints(data, dataIndex, dimensions, coordSys); + var line = new Polyline({ + shape: { + points: points + }, + // silent: true, + z2: 10 + }); + dataGroup.add(line); + data.setItemGraphicEl(dataIndex, line); + return line; + } + + function makeSeriesScope$2(seriesModel) { + var smooth = seriesModel.get('smooth', true); + smooth === true && (smooth = DEFAULT_SMOOTH); + smooth = numericToNumber(smooth); + eqNaN(smooth) && (smooth = 0); + return { + smooth: smooth + }; + } + + function updateElCommon(el, data, dataIndex, seriesScope) { + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.fill = null; + el.setShape('smooth', seriesScope.smooth); + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel, 'lineStyle'); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } // function simpleDiff(oldData, newData, dimensions) { + // let oldLen; + // if (!oldData + // || !oldData.__plProgressive + // || (oldLen = oldData.count()) !== newData.count() + // ) { + // return true; + // } + // let dimLen = dimensions.length; + // for (let i = 0; i < oldLen; i++) { + // for (let j = 0; j < dimLen; j++) { + // if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) { + // return true; + // } + // } + // } + // return false; + // } + // FIXME put in common util? + + + function isEmptyValue(val, axisType) { + return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value' + } + + var ParallelSeriesModel = + /** @class */ + function (_super) { + __extends(ParallelSeriesModel, _super); + + function ParallelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: bind(makeDefaultEncode, null, this) + }); + }; + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @return Raw indices + */ + + + ParallelSeriesModel.prototype.getRawIndicesByActiveState = function (activeState) { + var coordSys = this.coordinateSystem; + var data = this.getData(); + var indices = []; + coordSys.eachActiveState(data, function (theActiveState, dataIndex) { + if (activeState === theActiveState) { + indices.push(data.getRawIndex(dataIndex)); + } + }); + return indices; + }; + + ParallelSeriesModel.type = 'series.parallel'; + ParallelSeriesModel.dependencies = ['parallel']; + ParallelSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'parallel', + parallelIndex: 0, + label: { + show: false + }, + inactiveOpacity: 0.05, + activeOpacity: 1, + lineStyle: { + width: 1, + opacity: 0.45, + type: 'solid' + }, + emphasis: { + label: { + show: false + } + }, + progressive: 500, + smooth: false, + animationEasing: 'linear' + }; + return ParallelSeriesModel; + }(SeriesModel); + + function makeDefaultEncode(seriesModel) { + // The mapping of parallelAxis dimension to data dimension can + // be specified in parallelAxis.option.dim. For example, if + // parallelAxis.option.dim is 'dim3', it mapping to the third + // dimension of data. But `data.encode` has higher priority. + // Moreover, parallelModel.dimension should not be regarded as data + // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6']; + var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + + if (!parallelModel) { + return; + } + + var encodeDefine = {}; + each(parallelModel.dimensions, function (axisDim) { + var dataDimIndex = convertDimNameToNumber(axisDim); + encodeDefine[axisDim] = dataDimIndex; + }); + return encodeDefine; + } + + function convertDimNameToNumber(dimName) { + return +dimName.replace('dim', ''); + } + + /* + * 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. + */ + + /* + * 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. + */ + var opacityAccessPath$1 = ['lineStyle', 'opacity']; + var parallelVisual = { + seriesType: 'parallel', + reset: function (seriesModel, ecModel) { + var coordSys = seriesModel.coordinateSystem; + var opacityMap = { + normal: seriesModel.get(['lineStyle', 'opacity']), + active: seriesModel.get('activeOpacity'), + inactive: seriesModel.get('inactiveOpacity') + }; + return { + progress: function (params, data) { + coordSys.eachActiveState(data, function (activeState, dataIndex) { + var opacity = opacityMap[activeState]; + + if (activeState === 'normal' && data.hasItemOption) { + var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true); + itemOpacity != null && (opacity = itemOpacity); + } + + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + existsStyle.opacity = opacity; + }, params.start, params.end); + } + }; + } + }; + + function parallelPreprocessor(option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); + } + /** + * Create a parallel coordinate if not exists. + * @inner + */ + + function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'parallel') { + hasParallelSeries = true; + } + }); + + if (hasParallelSeries) { + option.parallel = [{}]; + } + } + /** + * Merge aixs definition from parallel option (if exists) to axis option. + * @inner + */ + + + function mergeAxisOptionFromParallel(option) { + var axes = normalizeToArray(option.parallelAxis); + each(axes, function (axisOption) { + if (!isObject(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); + } + + var CLICK_THRESHOLD = 5; // > 4 + + var ParallelView$1 = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + return _this; + } + + ParallelView.prototype.render = function (parallelModel, ecModel, api) { + this._model = parallelModel; + this._api = api; + + if (!this._handlers) { + this._handlers = {}; + each(handlers, function (handler, eventName) { + api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this)); + }, this); + } + + createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate'); + }; + + ParallelView.prototype.dispose = function (ecModel, api) { + clear(this, '_throttledDispatchExpand'); + each(this._handlers, function (handler, eventName) { + api.getZr().off(eventName, handler); + }); + this._handlers = null; + }; + /** + * @internal + * @param {Object} [opt] If null, cancel the last action triggering for debounce. + */ + + + ParallelView.prototype._throttledDispatchExpand = function (opt) { + this._dispatchExpand(opt); + }; + /** + * @internal + */ + + + ParallelView.prototype._dispatchExpand = function (opt) { + opt && this._api.dispatchAction(extend({ + type: 'parallelAxisExpand' + }, opt)); + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ComponentView); + + var handlers = { + mousedown: function (e) { + if (checkTrigger(this, 'click')) { + this._mouseDownPoint = [e.offsetX, e.offsetY]; + } + }, + mouseup: function (e) { + var mouseDownPoint = this._mouseDownPoint; + + if (checkTrigger(this, 'click') && mouseDownPoint) { + var point = [e.offsetX, e.offsetY]; + var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2); + + if (dist > CLICK_THRESHOLD) { + return; + } + + var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + + result.behavior !== 'none' && this._dispatchExpand({ + axisExpandWindow: result.axisExpandWindow + }); + } + + this._mouseDownPoint = null; + }, + mousemove: function (e) { + // Should do nothing when brushing. + if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) { + return; + } + + var model = this._model; + var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + var behavior = result.behavior; + behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce')); + + this._throttledDispatchExpand(behavior === 'none' ? null // Cancel the last trigger, in case that mouse slide out of the area quickly. + : { + axisExpandWindow: result.axisExpandWindow, + // Jumping uses animation, and sliding suppresses animation. + animation: behavior === 'jump' ? null : { + duration: 0 // Disable animation. + + } + }); + } + }; + + function checkTrigger(view, triggerOn) { + var model = view._model; + return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; + } + + var ParallelModel = + /** @class */ + function (_super) { + __extends(ParallelModel, _super); + + function ParallelModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelModel.type; + return _this; + } + + ParallelModel.prototype.init = function () { + _super.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }; + + ParallelModel.prototype.mergeOption = function (newOption) { + var thisOption = this.option; + newOption && merge(thisOption, newOption, true); + + this._initDimensions(); + }; + /** + * Whether series or axis is in this coordinate system. + */ + + + ParallelModel.prototype.contains = function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this; + }; + + ParallelModel.prototype.setAxisExpand = function (opt) { + each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) { + if (opt.hasOwnProperty(name)) { + // @ts-ignore FIXME: why "never" inferred in this.option[name]? + this.option[name] = opt[name]; + } + }, this); + }; + + ParallelModel.prototype._initDimensions = function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + var axisModels = filter(this.ecModel.queryComponents({ + mainType: 'parallelAxis' + }), function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return (axisModel.get('parallelIndex') || 0) === this.componentIndex; + }, this); + each(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + }; + + ParallelModel.type = 'parallel'; + ParallelModel.dependencies = ['parallelAxis']; + ParallelModel.layoutMode = 'box'; + ParallelModel.defaultOption = { + // zlevel: 0, + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + layout: 'horizontal', + // FIXME + // naming? + axisExpandable: false, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, + axisExpandRate: 17, + axisExpandDebounce: 50, + // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. + // Do not doc to user until necessary. + axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], + axisExpandTriggerOn: 'click', + parallelAxisDefault: null + }; + return ParallelModel; + }(ComponentModel); + + var ParallelAxis = + /** @class */ + function (_super) { + __extends(ParallelAxis, _super); + + function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.axisIndex = axisIndex; + return _this; + } + + ParallelAxis.prototype.isHorizontal = function () { + return this.coordinateSystem.getModel().get('layout') !== 'horizontal'; + }; + + return ParallelAxis; + }(Axis); + + /* + * 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. + */ + + /* + * 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. + */ + + /** + * Calculate slider move result. + * Usage: + * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as + * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`. + * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`. + * + * @param delta Move length. + * @param handleEnds handleEnds[0] can be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param handleIndex Can be 'all', means that both move the two handleEnds. + * @param minSpan The range of dataZoom can not be smaller than that. + * If not set, handle0 and cross handle1. If set as a non-negative + * number (including `0`), handles will push each other when reaching + * the minSpan. + * @param maxSpan The range of dataZoom can not be larger than that. + * @return The input handleEnds. + */ + function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { + delta = delta || 0; + var extentSpan = extent[1] - extent[0]; // Notice maxSpan and minSpan can be null/undefined. + + if (minSpan != null) { + minSpan = restrict(minSpan, [0, extentSpan]); + } + + if (maxSpan != null) { + maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); + } + + if (handleIndex === 'all') { + var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]); + handleSpan = restrict(handleSpan, [0, extentSpan]); + minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]); + handleIndex = 0; + } + + handleEnds[0] = restrict(handleEnds[0], extent); + handleEnds[1] = restrict(handleEnds[1], extent); + var originalDistSign = getSpanSign(handleEnds, handleIndex); + handleEnds[handleIndex] += delta; // Restrict in extent. + + var extentMinSpan = minSpan || 0; + var realExtent = extent.slice(); + originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan; + handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent); // Expand span. + + var currDistSign; + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) { + // If minSpan exists, 'cross' is forbidden. + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; + } // Shrink span. + + + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (maxSpan != null && currDistSign.span > maxSpan) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; + } + + return handleEnds; + } + + function getSpanSign(handleEnds, handleIndex) { + var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0] + // is at left of handleEnds[1] for non-cross case. + + return { + span: Math.abs(dist), + sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1 + }; + } + + function restrict(value, extend) { + return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value)); + } + + var each$5 = each; + var mathMin$8 = Math.min; + var mathMax$8 = Math.max; + var mathFloor$1 = Math.floor; + var mathCeil$1 = Math.ceil; + var round$3 = round; + var PI$7 = Math.PI; + + var Parallel = + /** @class */ + function () { + function Parallel(parallelModel, ecModel, api) { + this.type = 'parallel'; + /** + * key: dimension + */ + + this._axesMap = createHashMap(); + /** + * key: dimension + * value: {position: [], rotation, } + */ + + this._axesLayout = {}; + this.dimensions = parallelModel.dimensions; + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); + } + + Parallel.prototype._init = function (parallelModel, ecModel, api) { + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + each$5(dimensions, function (dim, idx) { + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex)); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Injection + + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = axisModel.coordinateSystem = this; + }, this); + }; + /** + * Update axis scale after data processed + */ + + + Parallel.prototype.update = function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }; + + Parallel.prototype.containPoint = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var axisBase = layoutInfo.axisBase; + var layoutBase = layoutInfo.layoutBase; + var pixelDimIndex = layoutInfo.pixelDimIndex; + var pAxis = point[1 - pixelDimIndex]; + var pLayout = point[pixelDimIndex]; + return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength; + }; + + Parallel.prototype.getModel = function () { + return this._model; + }; + /** + * Update properties from series + */ + + + Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + each$5(this.dimensions, function (dim) { + var axis = this._axesMap.get(dim); + + axis.scale.unionExtentFromData(data, data.mapDimension(dim)); + niceScaleExtent(axis.scale, axis.model); + }, this); + }, this); + }; + /** + * Resize the parallel coordinate system. + */ + + + Parallel.prototype.resize = function (parallelModel, api) { + this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._layoutAxes(); + }; + + Parallel.prototype.getRect = function () { + return this._rect; + }; + + Parallel.prototype._makeLayoutInfo = function () { + var parallelModel = this._model; + var rect = this._rect; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var layout = parallelModel.get('layout'); + var pixelDimIndex = layout === 'horizontal' ? 0 : 1; + var layoutLength = rect[wh[pixelDimIndex]]; + var layoutExtent = [0, layoutLength]; + var axisCount = this.dimensions.length; + var axisExpandWidth = restrict$1(parallelModel.get('axisExpandWidth'), layoutExtent); + var axisExpandCount = restrict$1(parallelModel.get('axisExpandCount') || 0, [0, axisCount]); + var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength], + // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow), + // where collapsed axes should be overlapped. + + var axisExpandWindow = parallelModel.get('axisExpandWindow'); + var winSize; + + if (!axisExpandWindow) { + winSize = restrict$1(axisExpandWidth * (axisExpandCount - 1), layoutExtent); + var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$1(axisCount / 2); + axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } else { + winSize = restrict$1(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + + var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); // Avoid axisCollapseWidth is too small. + + axisCollapseWidth < 3 && (axisCollapseWidth = 0); // Find the first and last indices > ewin[0] and < ewin[1]. + + var winInnerIndices = [mathFloor$1(round$3(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$1(round$3(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; // Pos in ec coordinates. + + var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; + return { + layout: layout, + pixelDimIndex: pixelDimIndex, + layoutBase: rect[xy[pixelDimIndex]], + layoutLength: layoutLength, + axisBase: rect[xy[1 - pixelDimIndex]], + axisLength: rect[wh[1 - pixelDimIndex]], + axisExpandable: axisExpandable, + axisExpandWidth: axisExpandWidth, + axisCollapseWidth: axisCollapseWidth, + axisExpandWindow: axisExpandWindow, + axisCount: axisCount, + winInnerIndices: winInnerIndices, + axisExpandWindow0Pos: axisExpandWindow0Pos + }; + }; + + Parallel.prototype._layoutAxes = function () { + var rect = this._rect; + var axes = this._axesMap; + var dimensions = this.dimensions; + + var layoutInfo = this._makeLayoutInfo(); + + var layout = layoutInfo.layout; + axes.each(function (axis) { + var axisExtent = [0, layoutInfo.axisLength]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + each$5(dimensions, function (dim, idx) { + var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo); + var positionTable = { + horizontal: { + x: posInfo.position, + y: layoutInfo.axisLength + }, + vertical: { + x: 0, + y: posInfo.position + } + }; + var rotationTable = { + horizontal: PI$7 / 2, + vertical: 0 + }; + var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y]; + var rotation = rotationTable[layout]; + var transform = create$1(); + rotate(transform, transform, rotation); + translate(transform, transform, position); // TODO + // tick layout info + // TODO + // update dimensions info based on axis order. + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + axisNameAvailableWidth: posInfo.axisNameAvailableWidth, + axisLabelShow: posInfo.axisLabelShow, + nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }; + /** + * Get axis by dim. + */ + + + Parallel.prototype.getAxis = function (dim) { + return this._axesMap.get(dim); + }; + /** + * Convert a dim value of a single item of series data to Point. + */ + + + Parallel.prototype.dataToPoint = function (value, dim) { + return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim); + }; + /** + * Travel data for one time, get activeState of each data item. + * @param start the start dataIndex that travel from. + * @param end the next dataIndex of the last dataIndex will be travel. + */ + + + Parallel.prototype.eachActiveState = function (data, callback, start, end) { + start == null && (start = 0); + end == null && (end = data.count()); + var axesMap = this._axesMap; + var dimensions = this.dimensions; + var dataDimensions = []; + var axisModels = []; + each(dimensions, function (axisDim) { + dataDimensions.push(data.mapDimension(axisDim)); + axisModels.push(axesMap.get(axisDim).model); + }); + var hasActiveSet = this.hasAxisBrushed(); + + for (var dataIndex = start; dataIndex < end; dataIndex++) { + var activeState = void 0; + + if (!hasActiveSet) { + activeState = 'normal'; + } else { + activeState = 'active'; + var values = data.getValues(dataDimensions, dataIndex); + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var state = axisModels[j].getActiveState(values[j]); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback(activeState, dataIndex); + } + }; + /** + * Whether has any activeSet. + */ + + + Parallel.prototype.hasAxisBrushed = function () { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + return hasActiveSet; + }; + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + */ + + + Parallel.prototype.axisCoordToPoint = function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + return applyTransform$1([coord, 0], axisLayout.transform); + }; + /** + * Get axis layout. + */ + + + Parallel.prototype.getAxisLayout = function (dim) { + return clone(this._axesLayout[dim]); + }; + /** + * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}. + */ + + + Parallel.prototype.getSlidedAxisExpandWindow = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var pixelDimIndex = layoutInfo.pixelDimIndex; + var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; // Out of the area of coordinate system. + + if (!this.containPoint(point)) { + return { + behavior: 'none', + axisExpandWindow: axisExpandWindow + }; + } // Convert the point from global to expand coordinates. + + + var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be + // slided when mouse is the center area of the window. + + var delta; + var behavior = 'slide'; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + + var triggerArea = this._model.get('axisExpandSlideTriggerArea'); // But consider touch device, jump is necessary. + + + var useJump = triggerArea[0] != null; + + if (axisCollapseWidth) { + if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { + behavior = 'jump'; + delta = pointCoord - winSize * triggerArea[2]; + } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { + behavior = 'jump'; + delta = pointCoord - winSize * (1 - triggerArea[2]); + } else { + (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0); + } + + delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; + delta ? sliderMove(delta, axisExpandWindow, extent, 'all') // Avoid nonsense triger on mousemove. + : behavior = 'none'; + } // When screen is too narrow, make it visible and slidable, although it is hard to interact. + else { + var winSize2 = axisExpandWindow[1] - axisExpandWindow[0]; + var pos = extent[1] * pointCoord / winSize2; + axisExpandWindow = [mathMax$8(0, pos - winSize2 / 2)]; + axisExpandWindow[1] = mathMin$8(extent[1], axisExpandWindow[0] + winSize2); + axisExpandWindow[0] = axisExpandWindow[1] - winSize2; + } + + return { + axisExpandWindow: axisExpandWindow, + behavior: behavior + }; + }; + + return Parallel; + }(); + + function restrict$1(len, extent) { + return mathMin$8(mathMax$8(len, extent[0]), extent[1]); + } + + function layoutAxisWithoutExpand(axisIndex, layoutInfo) { + var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); + return { + position: step * axisIndex, + axisNameAvailableWidth: step, + axisLabelShow: true + }; + } + + function layoutAxisWithExpand(axisIndex, layoutInfo) { + var layoutLength = layoutInfo.layoutLength; + var axisExpandWidth = layoutInfo.axisExpandWidth; + var axisCount = layoutInfo.axisCount; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var winInnerIndices = layoutInfo.winInnerIndices; + var position; + var axisNameAvailableWidth = axisCollapseWidth; + var axisLabelShow = false; + var nameTruncateMaxWidth; + + if (axisIndex < winInnerIndices[0]) { + position = axisIndex * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } else if (axisIndex <= winInnerIndices[1]) { + position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; + axisNameAvailableWidth = axisExpandWidth; + axisLabelShow = true; + } else { + position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + + return { + position: position, + axisNameAvailableWidth: axisNameAvailableWidth, + axisLabelShow: axisLabelShow, + nameTruncateMaxWidth: nameTruncateMaxWidth + }; + } + + function createParallelCoordSys(ecModel, api) { + var coordSysList = []; + ecModel.eachComponent('parallel', function (parallelModel, idx) { + var coordSys = new Parallel(parallelModel, ecModel, api); + coordSys.name = 'parallel_' + idx; + coordSys.resize(parallelModel, api); + parallelModel.coordinateSystem = coordSys; + coordSys.model = parallelModel; + coordSysList.push(coordSys); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'parallel') { + var parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = parallelModel.coordinateSystem; + } + }); + return coordSysList; + } + + var parallelCoordSysCreator = { + create: createParallelCoordSys + }; + + var ParallelAxisModel = + /** @class */ + function (_super) { + __extends(ParallelAxisModel, _super); + + function ParallelAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisModel.type; + /** + * @readOnly + */ + + _this.activeIntervals = []; + return _this; + } + + ParallelAxisModel.prototype.getAreaSelectStyle = function () { + return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ])(this.getModel('areaSelectStyle')); + }; + /** + * The code of this feature is put on AxisModel but not ParallelAxis, + * because axisModel can be alive after echarts updating but instance of + * ParallelAxis having been disposed. this._activeInterval should be kept + * when action dispatched (i.e. legend click). + * + * @param intervals `interval.length === 0` means set all active. + */ + + + ParallelAxisModel.prototype.setActiveIntervals = function (intervals) { + var activeIntervals = this.activeIntervals = clone(intervals); // Normalize + + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + asc(activeIntervals[i]); + } + } + }; + /** + * @param value When only attempting detect whether 'no activeIntervals set', + * `value` is not needed to be input. + */ + + + ParallelAxisModel.prototype.getActiveState = function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null || isNaN(+value)) { + return 'inactive'; + } // Simple optimization + + + if (activeIntervals.length === 1) { + var interval = activeIntervals[0]; + + if (interval[0] <= value && value <= interval[1]) { + return 'active'; + } + } else { + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + } + + return 'inactive'; + }; + + return ParallelAxisModel; + }(ComponentModel); + + mixin(ParallelAxisModel, AxisModelCommonMixin); + + var BRUSH_PANEL_GLOBAL = true; + var mathMin$9 = Math.min; + var mathMax$9 = Math.max; + var mathPow$2 = Math.pow; + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 6; + var MIN_RESIZE_LINE_WIDTH = 6; + var MUTEX_RESOURCE_KEY = 'globalPan'; + var DIRECTION_MAP = { + w: [0, 0], + e: [0, 1], + n: [1, 0], + s: [1, 1] + }; + var CURSOR_MAP = { + w: 'ew', + e: 'ew', + n: 'ns', + s: 'ns', + ne: 'nesw', + sw: 'nesw', + nw: 'nwse', + se: 'nwse' + }; + var DEFAULT_BRUSH_OPT = { + brushStyle: { + lineWidth: 2, + stroke: 'rgba(210,219,238,0.3)', + fill: '#D2DBEE' + }, + transformable: true, + brushMode: 'single', + removeOnClick: false + }; + var baseUID = 0; + /** + * params: + * areas: Array., coord relates to container group, + * If no container specified, to global. + * opt { + * isEnd: boolean, + * removeOnClick: boolean + * } + */ + + var BrushController = + /** @class */ + function (_super) { + __extends(BrushController, _super); + + function BrushController(zr) { + var _this = _super.call(this) || this; + /** + * @internal + */ + + + _this._track = []; + /** + * @internal + */ + + _this._covers = []; + _this._handlers = {}; + + if ("development" !== 'production') { + assert(zr); + } + + _this._zr = zr; + _this.group = new Group(); + _this._uid = 'brushController_' + baseUID++; + each(pointerHandlers, function (handler, eventName) { + this._handlers[eventName] = bind(handler, this); + }, _this); + return _this; + } + /** + * If set to `false`, select disabled. + */ + + + BrushController.prototype.enableBrush = function (brushOption) { + if ("development" !== 'production') { + assert(this._mounted); + } + + this._brushType && this._doDisableBrush(); + brushOption.brushType && this._doEnableBrush(brushOption); + return this; + }; + + BrushController.prototype._doEnableBrush = function (brushOption) { + var zr = this._zr; // Consider roam, which takes globalPan too. + + if (!this._enableGlobalPan) { + take(zr, MUTEX_RESOURCE_KEY, this._uid); + } + + each(this._handlers, function (handler, eventName) { + zr.on(eventName, handler); + }); + this._brushType = brushOption.brushType; + this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); + }; + + BrushController.prototype._doDisableBrush = function () { + var zr = this._zr; + release(zr, MUTEX_RESOURCE_KEY, this._uid); + each(this._handlers, function (handler, eventName) { + zr.off(eventName, handler); + }); + this._brushType = this._brushOption = null; + }; + /** + * @param panelOpts If not pass, it is global brush. + */ + + + BrushController.prototype.setPanels = function (panelOpts) { + if (panelOpts && panelOpts.length) { + var panels_1 = this._panels = {}; + each(panelOpts, function (panelOpts) { + panels_1[panelOpts.panelId] = clone(panelOpts); + }); + } else { + this._panels = null; + } + + return this; + }; + + BrushController.prototype.mount = function (opt) { + opt = opt || {}; + + if ("development" !== 'production') { + this._mounted = true; // should be at first. + } + + this._enableGlobalPan = opt.enableGlobalPan; + var thisGroup = this.group; + + this._zr.add(thisGroup); + + thisGroup.attr({ + x: opt.x || 0, + y: opt.y || 0, + rotation: opt.rotation || 0, + scaleX: opt.scaleX || 1, + scaleY: opt.scaleY || 1 + }); + this._transform = thisGroup.getLocalTransform(); + return this; + }; // eachCover(cb, context): void { + // each(this._covers, cb, context); + // } + + /** + * Update covers. + * @param coverConfigList + * If coverConfigList is null/undefined, all covers removed. + */ + + + BrushController.prototype.updateCovers = function (coverConfigList) { + if ("development" !== 'production') { + assert(this._mounted); + } + + coverConfigList = map(coverConfigList, function (coverConfig) { + return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true); + }); + var tmpIdPrefix = '\0-brush-index-'; + var oldCovers = this._covers; + var newCovers = this._covers = []; + var controller = this; + var creatingCover = this._creatingCover; + new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute(); + return this; + + function getKey(brushOption, index) { + return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType; + } + + function oldGetKey(cover, index) { + return getKey(cover.__brushOption, index); + } + + function addOrUpdate(newIndex, oldIndex) { + var newBrushInternal = coverConfigList[newIndex]; // Consider setOption in event listener of brushSelect, + // where updating cover when creating should be forbidden. + + if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { + newCovers[newIndex] = oldCovers[oldIndex]; + } else { + var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal)); + updateCoverAfterCreation(controller, cover); + } + } + + function remove(oldIndex) { + if (oldCovers[oldIndex] !== creatingCover) { + controller.group.remove(oldCovers[oldIndex]); + } + } + }; + + BrushController.prototype.unmount = function () { + if ("development" !== 'production') { + if (!this._mounted) { + return; + } + } + + this.enableBrush(false); // container may 'removeAll' outside. + + clearCovers(this); + + this._zr.remove(this.group); + + if ("development" !== 'production') { + this._mounted = false; // should be at last. + } + + return this; + }; + + BrushController.prototype.dispose = function () { + this.unmount(); + this.off(); + }; + + return BrushController; + }(Eventful); + + function createCover(controller, brushOption) { + var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); + cover.__brushOption = brushOption; + updateZ(cover, brushOption); + controller.group.add(cover); + return cover; + } + + function endCreating(controller, creatingCover) { + var coverRenderer = getCoverRenderer(creatingCover); + + if (coverRenderer.endCreating) { + coverRenderer.endCreating(controller, creatingCover); + updateZ(creatingCover, creatingCover.__brushOption); + } + + return creatingCover; + } + + function updateCoverShape(controller, cover) { + var brushOption = cover.__brushOption; + getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption); + } + + function updateZ(cover, brushOption) { + var z = brushOption.z; + z == null && (z = COVER_Z); + cover.traverse(function (el) { + el.z = z; + el.z2 = z; // Consider in given container. + }); + } + + function updateCoverAfterCreation(controller, cover) { + getCoverRenderer(cover).updateCommon(controller, cover); + updateCoverShape(controller, cover); + } + + function getCoverRenderer(cover) { + return coverRenderers[cover.__brushOption.brushType]; + } // return target panel or `true` (means global panel) + + + function getPanelByPoint(controller, e, localCursorPoint) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panel; + var transform = controller._transform; + each(panels, function (pn) { + pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn); + }); + return panel; + } // Return a panel or true + + + function getPanelByCover(controller, cover) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panelId = cover.__brushOption.panelId; // User may give cover without coord sys info, + // which is then treated as global panel. + + return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL; + } + + function clearCovers(controller) { + var covers = controller._covers; + var originalLength = covers.length; + each(covers, function (cover) { + controller.group.remove(cover); + }, controller); + covers.length = 0; + return !!originalLength; + } + + function trigger$1(controller, opt) { + var areas = map(controller._covers, function (cover) { + var brushOption = cover.__brushOption; + var range = clone(brushOption.range); + return { + brushType: brushOption.brushType, + panelId: brushOption.panelId, + range: range + }; + }); + controller.trigger('brush', { + areas: areas, + isEnd: !!opt.isEnd, + removeOnClick: !!opt.removeOnClick + }); + } + + function shouldShowCover(controller) { + var track = controller._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow$2(dx * dx + dy * dy, 0.5); + return dist > UNSELECT_THRESHOLD; + } + + function getTrackEnds(track) { + var tail = track.length - 1; + tail < 0 && (tail = 0); + return [track[0], track[tail]]; + } + + function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) { + var cover = new Group(); + cover.add(new Rect({ + name: 'main', + style: makeStyle(brushOption), + silent: true, + draggable: true, + cursor: 'move', + drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + each(edgeNameSequences, function (nameSequence) { + cover.add(new Rect({ + name: nameSequence.join(''), + style: { + opacity: 0 + }, + draggable: true, + silent: true, + invisible: true, + drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }); + return cover; + } + + function updateBaseRect(controller, cover, localRange, brushOption) { + var lineWidth = brushOption.brushStyle.lineWidth || 0; + var handleSize = mathMax$9(lineWidth, MIN_RESIZE_LINE_WIDTH); + var x = localRange[0][0]; + var y = localRange[1][0]; + var xa = x - lineWidth / 2; + var ya = y - lineWidth / 2; + var x2 = localRange[0][1]; + var y2 = localRange[1][1]; + var x2a = x2 - handleSize + lineWidth / 2; + var y2a = y2 - handleSize + lineWidth / 2; + var width = x2 - x; + var height = y2 - y; + var widtha = width + lineWidth; + var heighta = height + lineWidth; + updateRectShape(controller, cover, 'main', x, y, width, height); + + if (brushOption.transformable) { + updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta); + updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta); + updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize); + updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize); + updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize); + updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize); + } + } + + function updateCommon(controller, cover) { + var brushOption = cover.__brushOption; + var transformable = brushOption.transformable; + var mainEl = cover.childAt(0); + mainEl.useStyle(makeStyle(brushOption)); + mainEl.attr({ + silent: !transformable, + cursor: transformable ? 'move' : 'default' + }); + each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) { + var el = cover.childOfName(nameSequence.join('')); + var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence); + el && el.attr({ + silent: !transformable, + invisible: !transformable, + cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null + }); + }); + } + + function updateRectShape(controller, cover, name, x, y, w, h) { + var el = cover.childOfName(name); + el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]]))); + } + + function makeStyle(brushOption) { + return defaults({ + strokeNoScale: true + }, brushOption.brushStyle); + } + + function formatRectRange(x, y, x2, y2) { + var min = [mathMin$9(x, x2), mathMin$9(y, y2)]; + var max = [mathMax$9(x, x2), mathMax$9(y, y2)]; + return [[min[0], max[0]], [min[1], max[1]] // y range + ]; + } + + function getTransform$1(controller) { + return getTransform(controller.group); + } + + function getGlobalDirection1(controller, localDirName) { + var map = { + w: 'left', + e: 'right', + n: 'top', + s: 'bottom' + }; + var inverseMap = { + left: 'w', + right: 'e', + top: 'n', + bottom: 's' + }; + var dir = transformDirection(map[localDirName], getTransform$1(controller)); + return inverseMap[dir]; + } + + function getGlobalDirection2(controller, localDirNameSeq) { + var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])]; + (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse(); + return globalDir.join(''); + } + + function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) { + var brushOption = cover.__brushOption; + var rectRange = rectRangeConverter.toRectRange(brushOption.range); + var localDelta = toLocalDelta(controller, dx, dy); + each(dirNameSequence, function (dirName) { + var ind = DIRECTION_MAP[dirName]; + rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; + }); + brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1])); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function driftPolygon(controller, cover, dx, dy) { + var range = cover.__brushOption.range; + var localDelta = toLocalDelta(controller, dx, dy); + each(range, function (point) { + point[0] += localDelta[0]; + point[1] += localDelta[1]; + }); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function toLocalDelta(controller, dx, dy) { + var thisGroup = controller.group; + var localD = thisGroup.transformCoordToLocal(dx, dy); + var localZero = thisGroup.transformCoordToLocal(0, 0); + return [localD[0] - localZero[0], localD[1] - localZero[1]]; + } + + function clipByPanel(controller, cover, data) { + var panel = getPanelByCover(controller, cover); + return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data); + } + + function pointsToRect(points) { + var xmin = mathMin$9(points[0][0], points[1][0]); + var ymin = mathMin$9(points[0][1], points[1][1]); + var xmax = mathMax$9(points[0][0], points[1][0]); + var ymax = mathMax$9(points[0][1], points[1][1]); + return { + x: xmin, + y: ymin, + width: xmax - xmin, + height: ymax - ymin + }; + } + + function resetCursor(controller, e, localCursorPoint) { + if ( // Check active + !controller._brushType // resetCursor should be always called when mouse is in zr area, + // but not called when mouse is out of zr area to avoid bad influence + // if `mousemove`, `mouseup` are triggered from `document` event. + || isOutsideZrArea(controller, e.offsetX, e.offsetY)) { + return; + } + + var zr = controller._zr; + var covers = controller._covers; + var currPanel = getPanelByPoint(controller, e, localCursorPoint); // Check whether in covers. + + if (!controller._dragging) { + for (var i = 0; i < covers.length; i++) { + var brushOption = covers[i].__brushOption; + + if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) { + // Use cursor style set on cover. + return; + } + } + } + + currPanel && zr.setCursorStyle('crosshair'); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mainShapeContain(cover, x, y) { + return cover.childOfName('main').contain(x, y); + } + + function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { + var creatingCover = controller._creatingCover; + var panel = controller._creatingPanel; + var thisBrushOption = controller._brushOption; + var eventParams; + + controller._track.push(localCursorPoint.slice()); + + if (shouldShowCover(controller) || creatingCover) { + if (panel && !creatingCover) { + thisBrushOption.brushMode === 'single' && clearCovers(controller); + var brushOption = clone(thisBrushOption); + brushOption.brushType = determineBrushType(brushOption.brushType, panel); + brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId; + creatingCover = controller._creatingCover = createCover(controller, brushOption); + + controller._covers.push(creatingCover); + } + + if (creatingCover) { + var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; + var coverBrushOption = creatingCover.__brushOption; + coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track)); + + if (isEnd) { + endCreating(controller, creatingCover); + coverRenderer.updateCommon(controller, creatingCover); + } + + updateCoverShape(controller, creatingCover); + eventParams = { + isEnd: isEnd + }; + } + } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) { + // Help user to remove covers easily, only by a tiny drag, in 'single' mode. + // But a single click do not clear covers, because user may have casual + // clicks (for example, click on other component and do not expect covers + // disappear). + // Only some cover removed, trigger action, but not every click trigger action. + if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { + eventParams = { + isEnd: isEnd, + removeOnClick: true + }; + } + } + + return eventParams; + } + + function determineBrushType(brushType, panel) { + if (brushType === 'auto') { + if ("development" !== 'production') { + assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is "atuo"'); + } + + return panel.defaultBrushType; + } + + return brushType; + } + + var pointerHandlers = { + mousedown: function (e) { + if (this._dragging) { + // In case some browser do not support globalOut, + // and release mouse out side the browser. + handleDragEnd(this, e); + } else if (!e.target || !e.target.draggable) { + preventDefault(e); + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + this._creatingCover = null; + var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); + + if (panel) { + this._dragging = true; + this._track = [localCursorPoint.slice()]; + } + } + }, + mousemove: function (e) { + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = this.group.transformCoordToLocal(x, y); + resetCursor(this, e, localCursorPoint); + + if (this._dragging) { + preventDefault(e); + var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); + eventParams && trigger$1(this, eventParams); + } + }, + mouseup: function (e) { + handleDragEnd(this, e); + } + }; + + function handleDragEnd(controller, e) { + if (controller._dragging) { + preventDefault(e); + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = controller.group.transformCoordToLocal(x, y); + var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true); + controller._dragging = false; + controller._track = []; + controller._creatingCover = null; // trigger event should be at final, after procedure will be nested. + + eventParams && trigger$1(controller, eventParams); + } + } + + function isOutsideZrArea(controller, x, y) { + var zr = controller._zr; + return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight(); + } + /** + * key: brushType + */ + + + var coverRenderers = { + lineX: getLineRenderer(0), + lineY: getLineRenderer(1), + rect: { + createCover: function (controller, brushOption) { + function returnInput(range) { + return range; + } + + return createBaseRectCover({ + toRectRange: returnInput, + fromRectRange: returnInput + }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + updateBaseRect(controller, cover, localRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }, + polygon: { + createCover: function (controller, brushOption) { + var cover = new Group(); // Do not use graphic.Polygon because graphic.Polyline do not close the + // border of the shape when drawing, which is a better experience for user. + + cover.add(new Polyline({ + name: 'main', + style: makeStyle(brushOption), + silent: true + })); + return cover; + }, + getCreatingRange: function (localTrack) { + return localTrack; + }, + endCreating: function (controller, cover) { + cover.remove(cover.childAt(0)); // Use graphic.Polygon close the shape. + + cover.add(new Polygon({ + name: 'main', + draggable: true, + drift: curry(driftPolygon, controller, cover), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + cover.childAt(0).setShape({ + points: clipByPanel(controller, cover, localRange) + }); + }, + updateCommon: updateCommon, + contain: mainShapeContain + } + }; + + function getLineRenderer(xyIndex) { + return { + createCover: function (controller, brushOption) { + return createBaseRectCover({ + toRectRange: function (range) { + var rectRange = [range, [0, 100]]; + xyIndex && rectRange.reverse(); + return rectRange; + }, + fromRectRange: function (rectRange) { + return rectRange[xyIndex]; + } + }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + var min = mathMin$9(ends[0][xyIndex], ends[1][xyIndex]); + var max = mathMax$9(ends[0][xyIndex], ends[1][xyIndex]); + return [min, max]; + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + var otherExtent; // If brushWidth not specified, fit the panel. + + var panel = getPanelByCover(controller, cover); + + if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) { + otherExtent = panel.getLinearBrushOtherExtent(xyIndex); + } else { + var zr = controller._zr; + otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; + } + + var rectRange = [localRange, otherExtent]; + xyIndex && rectRange.reverse(); + updateBaseRect(controller, cover, rectRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }; + } + + function makeRectPanelClipPath(rect) { + rect = normalizeRect(rect); + return function (localPoints) { + return clipPointsByRect(localPoints, rect); + }; + } + function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { + rect = normalizeRect(rect); + return function (xyIndex) { + var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; + var brushWidth = idx ? rect.width : rect.height; + var base = idx ? rect.x : rect.y; + return [base, base + (brushWidth || 0)]; + }; + } + function makeRectIsTargetByCursor(rect, api, targetModel) { + var boundingRect = normalizeRect(rect); + return function (e, localCursorPoint) { + return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel); + }; + } // Consider width/height is negative. + + function normalizeRect(rect) { + return BoundingRect.create(rect); + } + + var elementList = ['axisLine', 'axisTickLabel', 'axisName']; + + var ParallelAxisView = + /** @class */ + function (_super) { + __extends(ParallelAxisView, _super); + + function ParallelAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisView.type; + return _this; + } + + ParallelAxisView.prototype.init = function (ecModel, api) { + _super.prototype.init.apply(this, arguments); + + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)); + }; + + ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var coordSysModel = getCoordSysModel(axisModel, ecModel); + var coordSys = coordSysModel.coordinateSystem; + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + var dim = axisModel.axis.dim; + var axisLayout = coordSys.getAxisLayout(dim); + var builderOpt = extend({ + strokeContainThreshold: areaWidth + }, axisLayout); + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + each(elementList, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api); + + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + }; // /** + // * @override + // */ + // updateVisual(axisModel, ecModel, api, payload) { + // this._brushController && this._brushController + // .updateCovers(getCoverInfoList(axisModel)); + // } + + + ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) { + // After filtering, axis may change, select area needs to be update. + var extent = axisModel.axis.getExtent(); + var extentLen = extent[1] - extent[0]; + var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value. + // width/height might be negative, which will be + // normalized in BoundingRect. + + var rect = BoundingRect.create({ + x: extent[0], + y: -areaWidth / 2, + width: extentLen, + height: areaWidth + }); + rect.x -= extra; + rect.width += 2 * extra; + + this._brushController.mount({ + enableGlobalPan: true, + rotation: builderOpt.rotation, + x: builderOpt.position[0], + y: builderOpt.position[1] + }).setPanels([{ + panelId: 'pl', + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) + }]).enableBrush({ + brushType: 'lineX', + brushStyle: areaSelectStyle, + removeOnClick: true + }).updateCovers(getCoverInfoList(axisModel)); + }; + + ParallelAxisView.prototype._onBrush = function (eventParam) { + var coverInfoList = eventParam.areas; // Do not cache these object, because the mey be changed. + + var axisModel = this.axisModel; + var axis = axisModel.axis; + var intervals = map(coverInfoList, function (coverInfo) { + return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)]; + }); // If realtime is true, action is not dispatched on drag end, because + // the drag end emits the same params with the last drag move event, + // and may have some delay when using touch pad. + + if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + } + }; + + ParallelAxisView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + ParallelAxisView.type = 'parallelAxis'; + return ParallelAxisView; + }(ComponentView); + + function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({ + mainType: 'parallelAxis', + query: payload + })[0] === axisModel; + } + + function getCoverInfoList(axisModel) { + var axis = axisModel.axis; + return map(axisModel.activeIntervals, function (interval) { + return { + brushType: 'lineX', + panelId: 'pl', + range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)] + }; + }); + } + + function getCoordSysModel(axisModel, ecModel) { + return ecModel.getComponent('parallel', axisModel.get('parallelIndex')); + } + + /* + * 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. + */ + + /* + * 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. + */ + var actionInfo$1 = { + type: 'axisAreaSelect', + event: 'axisAreaSelected' // update: 'updateVisual' + + }; + function installParallelActions(registers) { + registers.registerAction(actionInfo$1, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallelAxis', + query: payload + }, function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + }); + }); + /** + * @payload + */ + + registers.registerAction('parallelAxisExpand', function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallel', + query: payload + }, function (parallelModel) { + parallelModel.setAxisExpand(payload); + }); + }); + } + + var defaultAxisOption = { + type: 'value', + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + realtime: true, + z: 10 + }; + function install$g(registers) { + registers.registerComponentView(ParallelView$1); + registers.registerComponentModel(ParallelModel); + registers.registerCoordinateSystem('parallel', parallelCoordSysCreator); + registers.registerPreprocessor(parallelPreprocessor); + registers.registerComponentModel(ParallelAxisModel); + registers.registerComponentView(ParallelAxisView); + axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption); + installParallelActions(registers); + } + + function install$h(registers) { + use(install$g); + registers.registerChartView(ParallelView); + registers.registerSeriesModel(ParallelSeriesModel); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual); + } + + var SankeyPathShape = + /** @class */ + function () { + function SankeyPathShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.cpx2 = 0; + this.cpy2 = 0; + this.extent = 0; + } + + return SankeyPathShape; + }(); + + var SankeyPath = + /** @class */ + function (_super) { + __extends(SankeyPath, _super); + + function SankeyPath(opts) { + return _super.call(this, opts) || this; + } + + SankeyPath.prototype.getDefaultShape = function () { + return new SankeyPathShape(); + }; + + SankeyPath.prototype.buildPath = function (ctx, shape) { + var extent = shape.extent; + ctx.moveTo(shape.x1, shape.y1); + ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2); + + if (shape.orient === 'vertical') { + ctx.lineTo(shape.x2 + extent, shape.y2); + ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1); + } else { + ctx.lineTo(shape.x2, shape.y2 + extent); + ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent); + } + + ctx.closePath(); + }; + + SankeyPath.prototype.highlight = function () { + enterEmphasis(this); + }; + + SankeyPath.prototype.downplay = function () { + leaveEmphasis(this); + }; + + return SankeyPath; + }(Path); + + var SankeyView = + /** @class */ + function (_super) { + __extends(SankeyView, _super); + + function SankeyView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeyView.type; + _this._focusAdjacencyDisabled = false; + return _this; + } + + SankeyView.prototype.render = function (seriesModel, ecModel, api) { + var sankeyView = this; + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; // view width + + var width = layoutInfo.width; // view height + + var height = layoutInfo.height; + var nodeData = seriesModel.getData(); + var edgeData = seriesModel.getData('edge'); + var orient = seriesModel.get('orient'); + this._model = seriesModel; + group.removeAll(); + group.x = layoutInfo.x; + group.y = layoutInfo.y; // generate a bezire Curve for each edge + + graph.eachEdge(function (edge) { + var curve = new SankeyPath(); + var ecData = getECData(curve); + ecData.dataIndex = edge.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + ecData.dataType = 'edge'; + var edgeModel = edge.getModel(); + var lineStyleModel = edgeModel.getModel('lineStyle'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var node1Model = edge.node1.getModel(); + var dragX1 = node1Model.get('localX'); + var dragY1 = node1Model.get('localY'); + var n2Layout = edge.node2.getLayout(); + var node2Model = edge.node2.getModel(); + var dragX2 = node2Model.get('localX'); + var dragY2 = node2Model.get('localY'); + var edgeLayout = edge.getLayout(); + var x1; + var y1; + var x2; + var y2; + var cpx1; + var cpy1; + var cpx2; + var cpy2; + curve.shape.extent = Math.max(1, edgeLayout.dy); + curve.shape.orient = orient; + + if (orient === 'vertical') { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy; + x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty; + y2 = dragY2 != null ? dragY2 * height : n2Layout.y; + cpx1 = x1; + cpy1 = y1 * (1 - curvature) + y2 * curvature; + cpx2 = x2; + cpy2 = y1 * curvature + y2 * (1 - curvature); + } else { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy; + x2 = dragX2 != null ? dragX2 * width : n2Layout.x; + y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty; + cpx1 = x1 * (1 - curvature) + x2 * curvature; + cpy1 = y1; + cpx2 = x1 * curvature + x2 * (1 - curvature); + cpy2 = y2; + } + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + curve.useStyle(lineStyleModel.getItemStyle()); // Special color, use source node color or target node color + + switch (curve.style.fill) { + case 'source': + curve.style.fill = edge.node1.getVisual('color'); + curve.style.decal = edge.node1.getVisual('style').decal; + break; + + case 'target': + curve.style.fill = edge.node2.getVisual('color'); + curve.style.decal = edge.node2.getVisual('style').decal; + break; + + case 'gradient': + var sourceColor = edge.node1.getVisual('color'); + var targetColor = edge.node2.getVisual('color'); + + if (isString(sourceColor) && isString(targetColor)) { + curve.style.fill = new LinearGradient(0, 0, +(orient === 'horizontal'), +(orient === 'vertical'), [{ + color: sourceColor, + offset: 0 + }, { + color: targetColor, + offset: 1 + }]); + } + + } + + setLabelStyle(curve, getLabelStatesModels(edgeModel, 'edgeLabel'), { + labelFetcher: seriesModel, + labelDataIndex: edge.dataIndex, + defaultText: "" + edgeModel.get('value') + }); + curve.setTextConfig({ + position: 'inside' + }); + var emphasisModel = edgeModel.getModel('emphasis'); + setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) { + return model.getItemStyle(); + }); + group.add(curve); + edgeData.setItemGraphicEl(edge.dataIndex, curve); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + getECData(curve).dataType = 'edge'; + }); // Generate a rect for each node + + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var dragX = itemModel.get('localX'); + var dragY = itemModel.get('localY'); + var emphasisModel = itemModel.getModel('emphasis'); + var rect = new Rect({ + shape: { + x: dragX != null ? dragX * width : layout.x, + y: dragY != null ? dragY * height : layout.y, + width: layout.dx, + height: layout.dy + }, + style: itemModel.getModel('itemStyle').getItemStyle(), + z2: 10 + }); + setLabelStyle(rect, getLabelStatesModels(itemModel), { + labelFetcher: seriesModel, + labelDataIndex: node.dataIndex, + defaultText: node.id + }); + rect.disableLabelAnimation = true; + rect.setStyle('fill', node.getVisual('color')); + rect.setStyle('decal', node.getVisual('style').decal); + setStatesStylesFromModel(rect, itemModel); + group.add(rect); + nodeData.setItemGraphicEl(node.dataIndex, rect); + getECData(rect).dataType = 'node'; + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + nodeData.eachItemGraphicEl(function (el, dataIndex) { + var itemModel = nodeData.getItemModel(dataIndex); + + if (itemModel.get('draggable')) { + el.drift = function (dx, dy) { + sankeyView._focusAdjacencyDisabled = true; + this.shape.x += dx; + this.shape.y += dy; + this.dirty(); + api.dispatchAction({ + type: 'dragNode', + seriesId: seriesModel.id, + dataIndex: nodeData.getRawIndex(dataIndex), + localX: this.shape.x / width, + localY: this.shape.y / height + }); + }; + + el.ondragend = function () { + sankeyView._focusAdjacencyDisabled = false; + }; + + el.draggable = true; + el.cursor = 'move'; + } + }); + + if (!this._data && seriesModel.isAnimationEnabled()) { + group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + + this._data = seriesModel.getData(); + }; + + SankeyView.prototype.dispose = function () {}; + + SankeyView.type = 'sankey'; + return SankeyView; + }(ChartView); // Add animation to the view + + + function createGridClipShape$1(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var SankeySeriesModel = + /** @class */ + function (_super) { + __extends(SankeySeriesModel, _super); + + function SankeySeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeySeriesModel.type; + return _this; + } + /** + * Init a graph data structure from data in option series + */ + + + SankeySeriesModel.prototype.getInitialData = function (option, ecModel) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + var levels = option.levels; + this.levelModels = []; + var levelModels = this.levelModels; + + for (var i = 0; i < levels.length; i++) { + if (levels[i].depth != null && levels[i].depth >= 0) { + levelModels[levels[i].depth] = new Model(levels[i], this, ecModel); + } else { + if ("development" !== 'production') { + throw new Error('levels[i].depth is mandatory and should be natural number'); + } + } + } + + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var layout = seriesModel.getData().getItemLayout(idx); + + if (layout) { + var nodeDepth = layout.depth; + var levelModel = seriesModel.levelModels[nodeDepth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + edgeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var edge = seriesModel.getGraph().getEdgeByIndex(idx); + var layout = edge.node1.getLayout(); + + if (layout) { + var depth = layout.depth; + var levelModel = seriesModel.levelModels[depth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + } + }; + + SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) { + var nodes = this.option.data || this.option.nodes; + var dataItem = nodes[dataIndex]; + dataItem.localX = localPosition[0]; + dataItem.localY = localPosition[1]; + }; + /** + * Return the graphic data structure + * + * @return graphic data structure + */ + + + SankeySeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + /** + * Get edge data of graphic data structure + * + * @return data structure of list + */ + + + SankeySeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + function noValue(val) { + return isNaN(val) || val == null; + } // dataType === 'node' or empty do not show tooltip by default + + + if (dataType === 'edge') { + var params = this.getDataParams(dataIndex, dataType); + var rawDataOpt = params.data; + var edgeValue = params.value; + var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target; + return createTooltipMarkup('nameValue', { + name: edgeName, + value: edgeValue, + noValue: noValue(edgeValue) + }); + } // dataType === 'node' + else { + var node = this.getGraph().getNodeByIndex(dataIndex); + var value = node.getLayout().value; + var name_1 = this.getDataParams(dataIndex, dataType).data.name; + return createTooltipMarkup('nameValue', { + name: name_1 != null ? name_1 + '' : null, + value: value, + noValue: noValue(value) + }); + } + }; + + SankeySeriesModel.prototype.optionUpdated = function () {}; // Override Series.getDataParams() + + + SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + if (params.value == null && dataType === 'node') { + var node = this.getGraph().getNodeByIndex(dataIndex); + var nodeValue = node.getLayout().value; + params.value = nodeValue; + } + + return params; + }; + + SankeySeriesModel.type = 'series.sankey'; + SankeySeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + orient: 'horizontal', + nodeWidth: 20, + nodeGap: 8, + draggable: true, + layoutIterations: 32, + label: { + show: true, + position: 'right', + fontSize: 12 + }, + edgeLabel: { + show: false, + fontSize: 12 + }, + levels: [], + nodeAlign: 'justify', + lineStyle: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + opacity: 0.5 + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + animationEasing: 'linear', + animationDuration: 1000 + }; + return SankeySeriesModel; + }(SeriesModel); + + function sankeyLayout(ecModel, api) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + var layoutInfo = getViewRect$4(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var width = layoutInfo.width; + var height = layoutInfo.height; + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + var edges = graph.edges; + computeNodeValues(nodes); + var filteredNodes = filter(nodes, function (node) { + return node.getLayout().value === 0; + }); + var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations'); + var orient = seriesModel.get('orient'); + var nodeAlign = seriesModel.get('nodeAlign'); + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign); + }); + } + /** + * Get the layout position of the whole view + */ + + function getViewRect$4(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) { + computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign); + computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient); + computeEdgeDepths(nodes, orient); + } + /** + * Compute the value of each node by summing the associated edge's value + */ + + + function computeNodeValues(nodes) { + each(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var nodeRawValue = node.getValue() || 0; + var value = Math.max(value1, value2, nodeRawValue); + node.setLayout({ + value: value + }, true); + }); + } + /** + * Compute the x-position for each node. + * + * Here we use Kahn algorithm to detect cycle when we traverse + * the node to computer the initial x position. + */ + + + function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) { + // Used to mark whether the edge is deleted. if it is deleted, + // the value is 0, otherwise it is 1. + var remainEdges = []; // Storage each node's indegree. + + var indegreeArr = []; // Used to storage the node with indegree is equal to 0. + + var zeroIndegrees = []; + var nextTargetNode = []; + var x = 0; // let kx = 0; + + for (var i = 0; i < edges.length; i++) { + remainEdges[i] = 1; + } + + for (var i = 0; i < nodes.length; i++) { + indegreeArr[i] = nodes[i].inEdges.length; + + if (indegreeArr[i] === 0) { + zeroIndegrees.push(nodes[i]); + } + } + + var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the + // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical') + // position of the nodes. + + while (zeroIndegrees.length) { + for (var idx = 0; idx < zeroIndegrees.length; idx++) { + var node = zeroIndegrees[idx]; + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + var isItemDepth = item.depth != null && item.depth >= 0; + + if (isItemDepth && item.depth > maxNodeDepth) { + maxNodeDepth = item.depth; + } + + node.setLayout({ + depth: isItemDepth ? item.depth : x + }, true); + orient === 'vertical' ? node.setLayout({ + dy: nodeWidth + }, true) : node.setLayout({ + dx: nodeWidth + }, true); + + for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) { + var edge = node.outEdges[edgeIdx]; + var indexEdge = edges.indexOf(edge); + remainEdges[indexEdge] = 0; + var targetNode = edge.node2; + var nodeIndex = nodes.indexOf(targetNode); + + if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) { + nextTargetNode.push(targetNode); + } + } + } + + ++x; + zeroIndegrees = nextTargetNode; + nextTargetNode = []; + } + + for (var i = 0; i < remainEdges.length; i++) { + if (remainEdges[i] === 1) { + throw new Error('Sankey is a DAG, the original data has cycle!'); + } + } + + var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1; + + if (nodeAlign && nodeAlign !== 'left') { + adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth); + } + + var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth; + scaleNodeBreadths(nodes, kx, orient); + } + + function isNodeDepth(node) { + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + return item.depth != null && item.depth >= 0; + } + + function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) { + if (nodeAlign === 'right') { + var nextSourceNode = []; + var remainNodes = nodes; + var nodeHeight = 0; + + while (remainNodes.length) { + for (var i = 0; i < remainNodes.length; i++) { + var node = remainNodes[i]; + node.setLayout({ + skNodeHeight: nodeHeight + }, true); + + for (var j = 0; j < node.inEdges.length; j++) { + var edge = node.inEdges[j]; + + if (nextSourceNode.indexOf(edge.node1) < 0) { + nextSourceNode.push(edge.node1); + } + } + } + + remainNodes = nextSourceNode; + nextSourceNode = []; + ++nodeHeight; + } + + each(nodes, function (node) { + if (!isNodeDepth(node)) { + node.setLayout({ + depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight) + }, true); + } + }); + } else if (nodeAlign === 'justify') { + moveSinksRight(nodes, maxDepth); + } + } + /** + * All the node without outEgdes are assigned maximum x-position and + * be aligned in the last column. + * + * @param nodes. node of sankey view. + * @param maxDepth. use to assign to node without outEdges as x-position. + */ + + + function moveSinksRight(nodes, maxDepth) { + each(nodes, function (node) { + if (!isNodeDepth(node) && !node.outEdges.length) { + node.setLayout({ + depth: maxDepth + }, true); + } + }); + } + /** + * Scale node x-position to the width + * + * @param nodes node of sankey view + * @param kx multiple used to scale nodes + */ + + + function scaleNodeBreadths(nodes, kx, orient) { + each(nodes, function (node) { + var nodeDepth = node.getLayout().depth * kx; + orient === 'vertical' ? node.setLayout({ + y: nodeDepth + }, true) : node.setLayout({ + x: nodeDepth + }, true); + }); + } + /** + * Using Gauss-Seidel iterations method to compute the node depth(y-position) + * + * @param nodes node of sankey view + * @param edges edge of sankey view + * @param height the whole height of the area to draw the view + * @param nodeGap the vertical distance between two nodes + * in the same column. + * @param iterations the number of iterations for the algorithm + */ + + + function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) { + var nodesByBreadth = prepareNodesByBreadth(nodes, orient); + initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + + for (var alpha = 1; iterations > 0; iterations--) { + // 0.99 is a experience parameter, ensure that each iterations of + // changes as small as possible. + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + relaxLeftToRight(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + } + } + + function prepareNodesByBreadth(nodes, orient) { + var nodesByBreadth = []; + var keyAttr = orient === 'vertical' ? 'y' : 'x'; + var groupResult = groupData(nodes, function (node) { + return node.getLayout()[keyAttr]; + }); + groupResult.keys.sort(function (a, b) { + return a - b; + }); + each(groupResult.keys, function (key) { + nodesByBreadth.push(groupResult.buckets.get(key)); + }); + return nodesByBreadth; + } + /** + * Compute the original y-position for each node + */ + + + function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) { + var minKy = Infinity; + each(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + each(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum; + + if (ky < minKy) { + minKy = ky; + } + }); + each(nodesByBreadth, function (nodes) { + each(nodes, function (node, i) { + var nodeDy = node.getLayout().value * minKy; + + if (orient === 'vertical') { + node.setLayout({ + x: i + }, true); + node.setLayout({ + dx: nodeDy + }, true); + } else { + node.setLayout({ + y: i + }, true); + node.setLayout({ + dy: nodeDy + }, true); + } + }); + }); + each(edges, function (edge) { + var edgeDy = +edge.getValue() * minKy; + edge.setLayout({ + dy: edgeDy + }, true); + }); + } + /** + * Resolve the collision of initialized depth (y-position) + */ + + + function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodesByBreadth, function (nodes) { + nodes.sort(function (a, b) { + return a.getLayout()[keyAttr] - b.getLayout()[keyAttr]; + }); + var nodeX; + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy'; + + for (var i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout()[keyAttr]; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] + dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap; + } + + var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up + + dy = y0 - nodeGap - viewWidth; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + y0 = nodeX; + + for (var i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr]; + } + } + }); + } + /** + * Change the y-position of the nodes, except most the right side nodes + * @param nodesByBreadth + * @param alpha parameter used to adjust the nodes y-position + */ + + + function relaxRightToLeft(nodesByBreadth, alpha, orient) { + each(nodesByBreadth.slice().reverse(), function (nodes) { + each(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.outEdges.length; + y = len ? sum(node.outEdges, centerTarget, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + + function weightedTarget(edge, orient) { + return center$1(edge.node2, orient) * edge.getValue(); + } + + function centerTarget(edge, orient) { + return center$1(edge.node2, orient); + } + + function weightedSource(edge, orient) { + return center$1(edge.node1, orient) * edge.getValue(); + } + + function centerSource(edge, orient) { + return center$1(edge.node1, orient); + } + + function center$1(node, orient) { + return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2; + } + + function getEdgeValue(edge) { + return edge.getValue(); + } + + function sum(array, cb, orient) { + var sum = 0; + var len = array.length; + var i = -1; + + while (++i < len) { + var value = +cb(array[i], orient); + + if (!isNaN(value)) { + sum += value; + } + } + + return sum; + } + /** + * Change the y-position of the nodes, except most the left side nodes + */ + + + function relaxLeftToRight(nodesByBreadth, alpha, orient) { + each(nodesByBreadth, function (nodes) { + each(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.inEdges.length; + y = len ? sum(node.inEdges, centerSource, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + /** + * Compute the depth(y-position) of each edge + */ + + + function computeEdgeDepths(nodes, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodes, function (node) { + node.outEdges.sort(function (a, b) { + return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr]; + }); + node.inEdges.sort(function (a, b) { + return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr]; + }); + }); + each(nodes, function (node) { + var sy = 0; + var ty = 0; + each(node.outEdges, function (edge) { + edge.setLayout({ + sy: sy + }, true); + sy += edge.getLayout().dy; + }); + each(node.inEdges, function (edge) { + edge.setLayout({ + ty: ty + }, true); + ty += edge.getLayout().dy; + }); + }); + } + + function sankeyVisual(ecModel) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + var edges = graph.edges; + + if (nodes.length) { + var minValue_1 = Infinity; + var maxValue_1 = -Infinity; + each(nodes, function (node) { + var nodeValue = node.getLayout().value; + + if (nodeValue < minValue_1) { + minValue_1 = nodeValue; + } + + if (nodeValue > maxValue_1) { + maxValue_1 = nodeValue; + } + }); + each(nodes, function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue_1, maxValue_1], + visual: seriesModel.get('color') + }); + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + var customColor = node.getModel().get(['itemStyle', 'color']); + + if (customColor != null) { + node.setVisual('color', customColor); + node.setVisual('style', { + fill: customColor + }); + } else { + node.setVisual('color', mapValueToColor); + node.setVisual('style', { + fill: mapValueToColor + }); + } + }); + } + + if (edges.length) { + each(edges, function (edge) { + var edgeStyle = edge.getModel().get('lineStyle'); + edge.setVisual('style', edgeStyle); + }); + } + }); + } + + function install$i(registers) { + registers.registerChartView(SankeyView); + registers.registerSeriesModel(SankeySeriesModel); + registers.registerLayout(sankeyLayout); + registers.registerVisual(sankeyVisual); + registers.registerAction({ + type: 'dragNode', + event: 'dragnode', + // here can only use 'update' now, other value is not support in echarts. + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sankey', + query: payload + }, function (seriesModel) { + seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); + }); + }); + } + + var WhiskerBoxCommonMixin = + /** @class */ + function () { + function WhiskerBoxCommonMixin() {} + /** + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getInitialData = function (option, ecModel) { + // When both types of xAxis and yAxis are 'value', layout is + // needed to be specified by user. Otherwise, layout can be + // judged by which axis is category. + var ordinalMeta; + var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + var addOrdinal; // FIXME + // Consider time axis. + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + ordinalMeta = xAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else if (yAxisType === 'category') { + option.layout = 'vertical'; + ordinalMeta = yAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else { + option.layout = option.layout || 'horizontal'; + } + + var coordDims = ['x', 'y']; + var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1; + var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; + var otherAxisDim = coordDims[1 - baseAxisDimIndex]; + var axisModels = [xAxisModel, yAxisModel]; + var baseAxisType = axisModels[baseAxisDimIndex].get('type'); + var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type'); + var data = option.data; // Clone a new data for next setOption({}) usage. + // Avoid modifying current data will affect further update. + + if (data && addOrdinal) { + var newOptionData_1 = []; + each(data, function (item, index) { + var newItem; + + if (isArray(item)) { + newItem = item.slice(); // Modify current using data. + + item.unshift(index); + } else if (isArray(item.value)) { + newItem = extend({}, item); + newItem.value = newItem.value.slice(); // Modify current using data. + + item.value.unshift(index); + } else { + newItem = item; + } + + newOptionData_1.push(newItem); + }); + option.data = newOptionData_1; + } + + var defaultValueDimensions = this.defaultValueDimensions; + var coordDimensions = [{ + name: baseAxisDim, + type: getDimensionTypeByAxis(baseAxisType), + ordinalMeta: ordinalMeta, + otherDims: { + tooltip: false, + itemName: 0 + }, + dimsDef: ['base'] + }, { + name: otherAxisDim, + type: getDimensionTypeByAxis(otherAxisType), + dimsDef: defaultValueDimensions.slice() + }]; + return createSeriesDataSimply(this, { + coordDimensions: coordDimensions, + dimensionsCount: defaultValueDimensions.length + 1, + encodeDefaulter: curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this) + }); + }; + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getBaseAxis = function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + }; + + return WhiskerBoxCommonMixin; + }(); + + var BoxplotSeriesModel = + /** @class */ + function (_super) { + __extends(BoxplotSeriesModel, _super); + + function BoxplotSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotSeriesModel.type; // TODO + // box width represents group size, so dimension should have 'size'. + + /** + * @see + * The meanings of 'min' and 'max' depend on user, + * and echarts do not need to know it. + * @readOnly + */ + + _this.defaultValueDimensions = [{ + name: 'min', + defaultTooltip: true + }, { + name: 'Q1', + defaultTooltip: true + }, { + name: 'median', + defaultTooltip: true + }, { + name: 'Q3', + defaultTooltip: true + }, { + name: 'max', + defaultTooltip: true + }]; + _this.visualDrawType = 'stroke'; + return _this; + } + + BoxplotSeriesModel.type = 'series.boxplot'; + BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + BoxplotSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + layout: null, + boxWidth: [7, 50], + itemStyle: { + color: '#fff', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } + }, + animationDuration: 800 + }; + return BoxplotSeriesModel; + }(SeriesModel); + + mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true); + + var BoxplotView = + /** @class */ + function (_super) { + __extends(BoxplotView, _super); + + function BoxplotView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotView.type; + return _this; + } + + BoxplotView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var group = this.group; + var oldData = this._data; // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0; + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (!symbolEl) { + symbolEl = createNormalBox(itemLayout, data, newIdx, constDim); + } else { + saveOldStyle(symbolEl); + updateNormalBoxData(itemLayout, symbolEl, data, newIdx); + } + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + BoxplotView.prototype.remove = function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }; + + BoxplotView.type = 'boxplot'; + return BoxplotView; + }(ChartView); + + var BoxPathShape = + /** @class */ + function () { + function BoxPathShape() {} + + return BoxPathShape; + }(); + + var BoxPath = + /** @class */ + function (_super) { + __extends(BoxPath, _super); + + function BoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'boxplotBoxPath'; + return _this; + } + + BoxPath.prototype.getDefaultShape = function () { + return new BoxPathShape(); + }; + + BoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + var i = 0; + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + + for (; i < 4; i++) { + ctx.lineTo(ends[i][0], ends[i][1]); + } + + ctx.closePath(); + + for (; i < ends.length; i++) { + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + ctx.lineTo(ends[i][0], ends[i][1]); + } + }; + + return BoxPath; + }(Path); + + function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) { + var ends = itemLayout.ends; + var el = new BoxPath({ + shape: { + points: isInit ? transInit(ends, constDim, itemLayout) : ends + } + }); + updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); + return el; + } + + function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + updateMethod(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.z2 = 100; + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + function transInit(points, dim, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); + } + + var each$6 = each; + function boxplotLayout(ecModel) { + var groupResult = groupSeriesByAxis(ecModel); + each$6(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + each$6(seriesModels, function (seriesModel, idx) { + layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]); + }); + }); + } + /** + * Group series by axis. + */ + + function groupSeriesByAxis(ecModel) { + var result = []; + var axisList = []; + ecModel.eachSeriesByType('boxplot', function (seriesModel) { + var baseAxis = seriesModel.getBaseAxis(); + var idx = indexOf(axisList, baseAxis); + + if (idx < 0) { + idx = axisList.length; + axisList[idx] = baseAxis; + result[idx] = { + axis: baseAxis, + seriesModels: [] + }; + } + + result[idx].seriesModels.push(seriesModel); + }); + return result; + } + /** + * Calculate offset and box width for each series. + */ + + + function calculateBase(groupItem) { + var baseAxis = groupItem.axis; + var seriesModels = groupItem.seriesModels; + var seriesCount = seriesModels.length; + var boxWidthList = groupItem.boxWidthList = []; + var boxOffsetList = groupItem.boxOffsetList = []; + var boundList = []; + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else { + var maxDataCount_1 = 0; + each$6(seriesModels, function (seriesModel) { + maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count()); + }); + var extent = baseAxis.getExtent(); + bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1; + } + + each$6(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + + if (!isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + + boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(boxWidthBound[1], bandWidth) || 0]); + }); + var availableWidth = bandWidth * 0.8 - 2; + var boxGap = availableWidth / seriesCount * 0.3; + var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; + var base = boxWidth / 2 - availableWidth / 2; + each$6(seriesModels, function (seriesModel, idx) { + boxOffsetList.push(base); + base += boxGap + boxWidth; + boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])); + }); + } + /** + * Calculate points location for each series. + */ + + + function layoutSingleSeries(seriesModel, offset, boxWidth) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var halfWidth = boxWidth / 2; + var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1; + var vDimIdx = 1 - cDimIdx; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); + + if (cDim == null || vDims.length < 5) { + return; + } + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var axisDimVal = data.get(cDim, dataIndex); + var median = getPoint(axisDimVal, vDims[2], dataIndex); + var end1 = getPoint(axisDimVal, vDims[0], dataIndex); + var end2 = getPoint(axisDimVal, vDims[1], dataIndex); + var end4 = getPoint(axisDimVal, vDims[3], dataIndex); + var end5 = getPoint(axisDimVal, vDims[4], dataIndex); + var ends = []; + addBodyEnd(ends, end2, false); + addBodyEnd(ends, end4, true); + ends.push(end1, end2, end5, end4); + layEndLine(ends, end1); + layEndLine(ends, end5); + layEndLine(ends, median); + data.setItemLayout(dataIndex, { + initBaseline: median[vDimIdx], + ends: ends + }); + } + + function getPoint(axisDimVal, dim, dataIndex) { + var val = data.get(dim, dataIndex); + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + var point; + + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } else { + point = coordSys.dataToPoint(p); + point[cDimIdx] += offset; + } + + return point; + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] += halfWidth; + point2[cDimIdx] -= halfWidth; + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function layEndLine(ends, endCenter) { + var from = endCenter.slice(); + var to = endCenter.slice(); + from[cDimIdx] -= halfWidth; + to[cDimIdx] += halfWidth; + ends.push(from, to); + } + } + + /** + * See: + * + * + * + * Helper method for preparing data. + * + * @param rawData like + * [ + * [12,232,443], (raw data set for the first box) + * [3843,5545,1232], (raw data set for the second box) + * ... + * ] + * @param opt.boundIQR=1.5 Data less than min bound is outlier. + * default 1.5, means Q1 - 1.5 * (Q3 - Q1). + * If 'none'/0 passed, min bound will not be used. + */ + + function prepareBoxplotData(rawData, opt) { + opt = opt || {}; + var boxData = []; + var outliers = []; + var boundIQR = opt.boundIQR; + var useExtreme = boundIQR === 'none' || boundIQR === 0; + + for (var i = 0; i < rawData.length; i++) { + var ascList = asc(rawData[i].slice()); + var Q1 = quantile(ascList, 0.25); + var Q2 = quantile(ascList, 0.5); + var Q3 = quantile(ascList, 0.75); + var min = ascList[0]; + var max = ascList[ascList.length - 1]; + var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1); + var low = useExtreme ? min : Math.max(min, Q1 - bound); + var high = useExtreme ? max : Math.min(max, Q3 + bound); + var itemNameFormatter = opt.itemNameFormatter; + var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({ + value: i + }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + ''; + boxData.push([itemName, low, Q1, Q2, Q3, high]); + + for (var j = 0; j < ascList.length; j++) { + var dataItem = ascList[j]; + + if (dataItem < low || dataItem > high) { + var outlier = [itemName, dataItem]; + outliers.push(outlier); + } + } + } + + return { + boxData: boxData, + outliers: outliers + }; + } + + var boxplotTransform = { + type: 'echarts:boxplot', + transform: function transform(params) { + var upstream = params.upstream; + + if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].'); + } + + throwError(errMsg); + } + + var result = prepareBoxplotData(upstream.getRawData(), params.config); + return [{ + dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'], + data: result.boxData + }, { + data: result.outliers + }]; + } + }; + + function install$j(registers) { + registers.registerSeriesModel(BoxplotSeriesModel); + registers.registerChartView(BoxplotView); + registers.registerLayout(boxplotLayout); + registers.registerTransform(boxplotTransform); + } + + var SKIP_PROPS = ['color', 'borderColor']; + + var CandlestickView = + /** @class */ + function (_super) { + __extends(CandlestickView, _super); + + function CandlestickView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickView.type; + return _this; + } + + CandlestickView.prototype.render = function (seriesModel, ecModel, api) { + // If there is clipPath created in large mode. Remove it. + this.group.removeClipPath(); // Clear previously rendered progressive elements. + + this._progressiveEls = null; + + this._updateDrawMode(seriesModel); + + this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel); + }; + + CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._clear(); + + this._updateDrawMode(seriesModel); + }; + + CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + this._progressiveEls = []; + this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel); + }; + + CandlestickView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CandlestickView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + CandlestickView.prototype._renderNormal = function (seriesModel) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var isSimpleBox = data.getLayout('isSimpleBox'); + var needsClip = seriesModel.get('clip', true); + var coord = seriesModel.coordinateSystem; + var clipArea = coord.getArea && coord.getArea(); // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + return; + } + + var el = createNormalBox$1(itemLayout, newIdx, true); + initProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + } + }).update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(el); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + group.remove(el); + return; + } + + if (!el) { + el = createNormalBox$1(itemLayout); + } else { + updateProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + saveOldStyle(el); + } + + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + CandlestickView.prototype._renderLarge = function (seriesModel) { + this._clear(); + + createLarge$1(seriesModel, this.group); + var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + }; + + CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) { + var data = seriesModel.getData(); + var isSimpleBox = data.getLayout('isSimpleBox'); + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemLayout = data.getItemLayout(dataIndex); + var el = createNormalBox$1(itemLayout); + setBoxCommon(el, data, dataIndex, isSimpleBox); + el.incremental = true; + this.group.add(el); + + this._progressiveEls.push(el); + } + }; + + CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) { + createLarge$1(seriesModel, this.group, this._progressiveEls, true); + }; + + CandlestickView.prototype.remove = function (ecModel) { + this._clear(); + }; + + CandlestickView.prototype._clear = function () { + this.group.removeAll(); + this._data = null; + }; + + CandlestickView.type = 'candlestick'; + return CandlestickView; + }(ChartView); + + var NormalBoxPathShape = + /** @class */ + function () { + function NormalBoxPathShape() {} + + return NormalBoxPathShape; + }(); + + var NormalBoxPath = + /** @class */ + function (_super) { + __extends(NormalBoxPath, _super); + + function NormalBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'normalCandlestickBox'; + return _this; + } + + NormalBoxPath.prototype.getDefaultShape = function () { + return new NormalBoxPathShape(); + }; + + NormalBoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + + if (this.__simpleBox) { + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[6][0], ends[6][1]); + } else { + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } + }; + + return NormalBoxPath; + }(Path); + + function createNormalBox$1(itemLayout, dataIndex, isInit) { + var ends = itemLayout.ends; + return new NormalBoxPath({ + shape: { + points: isInit ? transInit$1(ends, itemLayout) : ends + }, + z2: 100 + }); + } + + function isNormalBoxClipped(clipArea, itemLayout) { + var clipped = true; + + for (var i = 0; i < itemLayout.ends.length; i++) { + // If any point are in the region. + if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) { + clipped = false; + break; + } + } + + return clipped; + } + + function setBoxCommon(el, data, dataIndex, isSimpleBox) { + var itemModel = data.getItemModel(dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.__simpleBox = isSimpleBox; + setStatesStylesFromModel(el, itemModel); + } + + function transInit$1(points, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); + } + + var LargeBoxPathShape = + /** @class */ + function () { + function LargeBoxPathShape() {} + + return LargeBoxPathShape; + }(); + + var LargeBoxPath = + /** @class */ + function (_super) { + __extends(LargeBoxPath, _super); + + function LargeBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeCandlestickBox'; + return _this; + } + + LargeBoxPath.prototype.getDefaultShape = function () { + return new LargeBoxPathShape(); + }; + + LargeBoxPath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + + for (var i = 0; i < points.length;) { + if (this.__sign === points[i++]) { + var x = points[i++]; + ctx.moveTo(x, points[i++]); + ctx.lineTo(x, points[i++]); + } else { + i += 3; + } + } + }; + + return LargeBoxPath; + }(Path); + + function createLarge$1(seriesModel, group, progressiveEls, incremental) { + var data = seriesModel.getData(); + var largePoints = data.getLayout('largePoints'); + var elP = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: 1, + ignoreCoarsePointer: true + }); + group.add(elP); + var elN = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: -1, + ignoreCoarsePointer: true + }); + group.add(elN); + var elDoji = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: 0, + ignoreCoarsePointer: true + }); + group.add(elDoji); + setLargeStyle(1, elP, seriesModel); + setLargeStyle(-1, elN, seriesModel); + setLargeStyle(0, elDoji, seriesModel); + + if (incremental) { + elP.incremental = true; + elN.incremental = true; + } + + if (progressiveEls) { + progressiveEls.push(elP, elN); + } + } + + function setLargeStyle(sign, el, seriesModel, data) { + // TODO put in visual? + var borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) // Use color for border color by default. + || seriesModel.get(['itemStyle', sign > 0 ? 'color' : 'color0']); + + if (sign === 0) { + borderColor = seriesModel.get(['itemStyle', 'borderColorDoji']); + } // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + + var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS); + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + } + + var CandlestickSeriesModel = + /** @class */ + function (_super) { + __extends(CandlestickSeriesModel, _super); + + function CandlestickSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickSeriesModel.type; + _this.defaultValueDimensions = [{ + name: 'open', + defaultTooltip: true + }, { + name: 'close', + defaultTooltip: true + }, { + name: 'lowest', + defaultTooltip: true + }, { + name: 'highest', + defaultTooltip: true + }]; + return _this; + } + /** + * Get dimension for shadow in dataZoom + * @return dimension name + */ + + + CandlestickSeriesModel.prototype.getShadowDim = function () { + return 'open'; + }; + + CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + var itemLayout = data.getItemLayout(dataIndex); + return itemLayout && selectors.rect(itemLayout.brushRect); + }; + + CandlestickSeriesModel.type = 'series.candlestick'; + CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + CandlestickSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // xAxisIndex: 0, + // yAxisIndex: 0, + layout: null, + clip: true, + itemStyle: { + color: '#eb5454', + color0: '#47b262', + borderColor: '#eb5454', + borderColor0: '#47b262', + borderColorDoji: null, + // borderColor: '#d24040', + // borderColor0: '#398f4f', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2 + } + }, + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + large: true, + largeThreshold: 600, + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: 'mod', + animationEasing: 'linear', + animationDuration: 300 + }; + return CandlestickSeriesModel; + }(SeriesModel); + + mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true); + + function candlestickPreprocessor(option) { + if (!option || !isArray(option.series)) { + return; + } // Translate 'k' to 'candlestick'. + + + each(option.series, function (seriesItem) { + if (isObject(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); + } + + var positiveBorderColorQuery = ['itemStyle', 'borderColor']; + var negativeBorderColorQuery = ['itemStyle', 'borderColor0']; + var dojiBorderColorQuery = ['itemStyle', 'borderColorDoji']; + var positiveColorQuery = ['itemStyle', 'color']; + var negativeColorQuery = ['itemStyle', 'color0']; + var candlestickVisual = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + function getColor(sign, model) { + return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery); + } + + function getBorderColor(sign, model) { + return model.get(sign === 0 ? dojiBorderColorQuery : sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery); + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var isLargeRender = seriesModel.pipelineContext.large; + return !isLargeRender && { + progress: function (params, data) { + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemModel = data.getItemModel(dataIndex); + var sign = data.getItemLayout(dataIndex).sign; + var style = itemModel.getItemStyle(); + style.fill = getColor(sign, itemModel); + style.stroke = getBorderColor(sign, itemModel) || style.fill; + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + extend(existsStyle, style); + } + } + }; + } + }; + + var candlestickLayout = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var candleWidth = calculateCandleWidth(seriesModel, data); + var cDimIdx = 0; + var vDimIdx = 1; + var coordDims = ['x', 'y']; + var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx])); + var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data); + var openDimI = vDimsI[0]; + var closeDimI = vDimsI[1]; + var lowestDimI = vDimsI[2]; + var highestDimI = vDimsI[3]; + data.setLayout({ + candleWidth: candleWidth, + // The value is experimented visually. + isSimpleBox: candleWidth <= 1.3 + }); + + if (cDimI < 0 || vDimsI.length < 4) { + return; + } + + return { + progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress + }; + + function normalProgress(params, data) { + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + var ocLowPoint = getPoint(ocLow, axisDimVal); + var ocHighPoint = getPoint(ocHigh, axisDimVal); + var lowestPoint = getPoint(lowestVal, axisDimVal); + var highestPoint = getPoint(highestVal, axisDimVal); + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint)); + var itemModel = data.getItemModel(dataIndex); + var hasDojiColor = !!itemModel.get(['itemStyle', 'borderColorDoji']); + data.setItemLayout(dataIndex, { + sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor), + initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], + ends: ends, + brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) + }); + } + + function getPoint(val, axisDimVal) { + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p); + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] = subPixelOptimize$1(point1[cDimIdx] + candleWidth / 2, 1, false); + point2[cDimIdx] = subPixelOptimize$1(point2[cDimIdx] - candleWidth / 2, 1, true); + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function makeBrushRect(lowestVal, highestVal, axisDimVal) { + var pmin = getPoint(lowestVal, axisDimVal); + var pmax = getPoint(highestVal, axisDimVal); + pmin[cDimIdx] -= candleWidth / 2; + pmax[cDimIdx] -= candleWidth / 2; + return { + x: pmin[0], + y: pmin[1], + width: candleWidth , + height: pmax[1] - pmin[1] + }; + } + + function subPixelOptimizePoint(point) { + point[cDimIdx] = subPixelOptimize$1(point[cDimIdx], 1); + return point; + } + } + + function largeProgress(params, data) { + // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...] + var points = createFloat32Array(params.count * 4); + var offset = 0; + var point; + var tmpIn = []; + var tmpOut = []; + var dataIndex; + var store = data.getStore(); + var hasDojiColor = !!seriesModel.get(['itemStyle', 'borderColorDoji']); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + + if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { + points[offset++] = NaN; + offset += 3; + continue; + } + + points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor); + tmpIn[cDimIdx] = axisDimVal; + tmpIn[vDimIdx] = lowestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + tmpIn[vDimIdx] = highestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[1] : NaN; + } + + data.setLayout('largePoints', points); + } + } + }; + /** + * Get the sign of a single data. + * + * @returns 0 for doji with hasDojiColor: true, + * 1 for positive, + * -1 for negative. + */ + + function getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor) { + var sign; + + if (openVal > closeVal) { + sign = -1; + } else if (openVal < closeVal) { + sign = 1; + } else { + sign = hasDojiColor // When doji color is set, use it instead of color/color0. + ? 0 : dataIndex > 0 // If close === open, compare with close of last record + ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1 : // No record of previous, set to be positive + 1; + } + + return sign; + } + + function calculateCandleWidth(seriesModel, data) { + var baseAxis = seriesModel.getBaseAxis(); + var extent; + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count()); + var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth); + var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth); + var barWidth = seriesModel.get('barWidth'); + return barWidth != null ? parsePercent$1(barWidth, bandWidth) // Put max outer to ensure bar visible in spite of overlap. + : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); + } + + function install$k(registers) { + registers.registerChartView(CandlestickView); + registers.registerSeriesModel(CandlestickSeriesModel); + registers.registerPreprocessor(candlestickPreprocessor); + registers.registerVisual(candlestickVisual); + registers.registerLayout(candlestickLayout); + } + + function updateRipplePath(rippleGroup, effectCfg) { + var color = effectCfg.rippleEffectColor || effectCfg.color; + rippleGroup.eachChild(function (ripplePath) { + ripplePath.attr({ + z: effectCfg.z, + zlevel: effectCfg.zlevel, + style: { + stroke: effectCfg.brushType === 'stroke' ? color : null, + fill: effectCfg.brushType === 'fill' ? color : null + } + }); + }); + } + + var EffectSymbol = + /** @class */ + function (_super) { + __extends(EffectSymbol, _super); + + function EffectSymbol(data, idx) { + var _this = _super.call(this) || this; + + var symbol = new Symbol(data, idx); + var rippleGroup = new Group(); + + _this.add(symbol); + + _this.add(rippleGroup); + + _this.updateData(data, idx); + + return _this; + } + + EffectSymbol.prototype.stopEffectAnimation = function () { + this.childAt(1).removeAll(); + }; + + EffectSymbol.prototype.startEffectAnimation = function (effectCfg) { + var symbolType = effectCfg.symbolType; + var color = effectCfg.color; + var rippleNumber = effectCfg.rippleNumber; + var rippleGroup = this.childAt(1); + + for (var i = 0; i < rippleNumber; i++) { + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4136. + var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color); + ripplePath.attr({ + style: { + strokeNoScale: true + }, + z2: 99, + silent: true, + scaleX: 0.5, + scaleY: 0.5 + }); + var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset; + ripplePath.animate('', true).when(effectCfg.period, { + scaleX: effectCfg.rippleScale / 2, + scaleY: effectCfg.rippleScale / 2 + }).delay(delay).start(); + ripplePath.animateStyle(true).when(effectCfg.period, { + opacity: 0 + }).delay(delay).start(); + rippleGroup.add(ripplePath); + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Update effect symbol + */ + + + EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) { + var oldEffectCfg = this._effectCfg; + var rippleGroup = this.childAt(1); // Must reinitialize effect if following configuration changed + + var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale', 'rippleNumber']; + + for (var i = 0; i < DIFFICULT_PROPS.length; i++) { + var propName = DIFFICULT_PROPS[i]; + + if (oldEffectCfg[propName] !== effectCfg[propName]) { + this.stopEffectAnimation(); + this.startEffectAnimation(effectCfg); + return; + } + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Highlight symbol + */ + + + EffectSymbol.prototype.highlight = function () { + enterEmphasis(this); + }; + /** + * Downplay symbol + */ + + + EffectSymbol.prototype.downplay = function () { + leaveEmphasis(this); + }; + + EffectSymbol.prototype.getSymbolType = function () { + var symbol = this.childAt(0); + return symbol && symbol.getSymbolType(); + }; + /** + * Update symbol properties + */ + + + EffectSymbol.prototype.updateData = function (data, idx) { + var _this = this; + + var seriesModel = data.hostModel; + this.childAt(0).updateData(data, idx); + var rippleGroup = this.childAt(1); + var itemModel = data.getItemModel(idx); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolStyle = data.getItemVisual(idx, 'style'); + var color = symbolStyle && symbolStyle.fill; + var emphasisModel = itemModel.getModel('emphasis'); + rippleGroup.setScale(symbolSize); + rippleGroup.traverse(function (ripplePath) { + ripplePath.setStyle('fill', color); + }); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + rippleGroup.x = symbolOffset[0]; + rippleGroup.y = symbolOffset[1]; + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var effectCfg = {}; + effectCfg.showEffectOn = seriesModel.get('showEffectOn'); + effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']); + effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']); + effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000; + effectCfg.effectOffset = idx / data.count(); + effectCfg.z = seriesModel.getShallow('z') || 0; + effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0; + effectCfg.symbolType = symbolType; + effectCfg.color = color; + effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']); + effectCfg.rippleNumber = itemModel.get(['rippleEffect', 'number']); + + if (effectCfg.showEffectOn === 'render') { + this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg); + this._effectCfg = effectCfg; + } else { + // Not keep old effect config + this._effectCfg = null; + this.stopEffectAnimation(); + + this.onHoverStateChange = function (toState) { + if (toState === 'emphasis') { + if (effectCfg.showEffectOn !== 'render') { + _this.startEffectAnimation(effectCfg); + } + } else if (toState === 'normal') { + if (effectCfg.showEffectOn !== 'render') { + _this.stopEffectAnimation(); + } + } + }; + } + + this._effectCfg = effectCfg; + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + EffectSymbol.prototype.fadeOut = function (cb) { + cb && cb(); + }; + return EffectSymbol; + }(Group); + + var EffectScatterView = + /** @class */ + function (_super) { + __extends(EffectScatterView, _super); + + function EffectScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterView.type; + return _this; + } + + EffectScatterView.prototype.init = function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }; + + EffectScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data, { + clipShape: this._getClipShape(seriesModel) + }); + this.group.add(effectSymbolDraw.group); + }; + + EffectScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + this.group.dirty(); + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(); + }; + + EffectScatterView.prototype._updateGroupTransform = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.getRoamTransform) { + this.group.transform = clone$2(coordSys.getRoamTransform()); + this.group.decomposeTransform(); + } + }; + + EffectScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + }; + + EffectScatterView.type = 'effectScatter'; + return EffectScatterView; + }(ChartView); + + var EffectScatterSeriesModel = + /** @class */ + function (_super) { + __extends(EffectScatterSeriesModel, _super); + + function EffectScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + EffectScatterSeriesModel.type = 'series.effectScatter'; + EffectScatterSeriesModel.dependencies = ['grid', 'polar']; + EffectScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + effectType: 'ripple', + progressive: 0, + // When to show the effect, option: 'render'|'emphasis' + showEffectOn: 'render', + clip: true, + // Ripple effect config + rippleEffect: { + period: 4, + // Scale of ripple + scale: 2.5, + // Brush type can be fill or stroke + brushType: 'fill', + // Ripple number + number: 3 + }, + universalTransition: { + divideShape: 'clone' + }, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + // symbol: null, // 图形类型 + symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + // itemStyle: { + // opacity: 1 + // } + + }; + return EffectScatterSeriesModel; + }(SeriesModel); + + function install$l(registers) { + registers.registerChartView(EffectScatterView); + registers.registerSeriesModel(EffectScatterSeriesModel); + registers.registerLayout(pointsLayout('effectScatter')); + } + + var EffectLine = + /** @class */ + function (_super) { + __extends(EffectLine, _super); + + function EffectLine(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this.add(_this.createLine(lineData, idx, seriesScope)); + + _this._updateEffectSymbol(lineData, idx); + + return _this; + } + + EffectLine.prototype.createLine = function (lineData, idx, seriesScope) { + return new Line$1(lineData, idx, seriesScope); + }; + + EffectLine.prototype._updateEffectSymbol = function (lineData, idx) { + var itemModel = lineData.getItemModel(idx); + var effectModel = itemModel.getModel('effect'); + var size = effectModel.get('symbolSize'); + var symbolType = effectModel.get('symbol'); + + if (!isArray(size)) { + size = [size, size]; + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var color = effectModel.get('color') || lineStyle && lineStyle.stroke; + var symbol = this.childAt(1); + + if (this._symbolType !== symbolType) { + // Remove previous + this.remove(symbol); + symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color); + symbol.z2 = 100; + symbol.culling = true; + this.add(symbol); + } // Symbol may be removed if loop is false + + + if (!symbol) { + return; + } // Shadow color is same with color in default + + + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + symbol.scaleX = size[0]; + symbol.scaleY = size[1]; + symbol.setColor(color); + this._symbolType = symbolType; + this._symbolScale = size; + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) { + var symbol = this.childAt(1); + + if (!symbol) { + return; + } + + var points = lineData.getItemLayout(idx); + var period = effectModel.get('period') * 1000; + var loop = effectModel.get('loop'); + var roundTrip = effectModel.get('roundTrip'); + var constantSpeed = effectModel.get('constantSpeed'); + var delayExpr = retrieve(effectModel.get('delay'), function (idx) { + return idx / lineData.count() * period / 3; + }); // Ignore when updating + + symbol.ignore = true; + + this._updateAnimationPoints(symbol, points); + + if (constantSpeed > 0) { + period = this._getLineLength(symbol) / constantSpeed * 1000; + } + + if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) { + symbol.stopAnimation(); + var delayNum = void 0; + + if (isFunction(delayExpr)) { + delayNum = delayExpr(idx); + } else { + delayNum = delayExpr; + } + + if (symbol.__t > 0) { + delayNum = -period * symbol.__t; + } + + this._animateSymbol(symbol, period, delayNum, loop, roundTrip); + } + + this._period = period; + this._loop = loop; + this._roundTrip = roundTrip; + }; + + EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop, roundTrip) { + if (period > 0) { + symbol.__t = 0; + var self_1 = this; + var animator = symbol.animate('', loop).when(roundTrip ? period * 2 : period, { + __t: roundTrip ? 2 : 1 + }).delay(delayNum).during(function () { + self_1._updateSymbolPosition(symbol); + }); + + if (!loop) { + animator.done(function () { + self_1.remove(symbol); + }); + } + + animator.start(); + } + }; + + EffectLine.prototype._getLineLength = function (symbol) { + // Not so accurate + return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2); + }; + + EffectLine.prototype._updateAnimationPoints = function (symbol, points) { + symbol.__p1 = points[0]; + symbol.__p2 = points[1]; + symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2]; + }; + + EffectLine.prototype.updateData = function (lineData, idx, seriesScope) { + this.childAt(0).updateData(lineData, idx, seriesScope); + + this._updateEffectSymbol(lineData, idx); + }; + + EffectLine.prototype._updateSymbolPosition = function (symbol) { + var p1 = symbol.__p1; + var p2 = symbol.__p2; + var cp1 = symbol.__cp1; + var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; + var pos = [symbol.x, symbol.y]; + var lastPos = pos.slice(); + var quadraticAt$1 = quadraticAt; + var quadraticDerivativeAt$1 = quadraticDerivativeAt; + pos[0] = quadraticAt$1(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt$1(p1[1], cp1[1], p2[1], t); // Tangent + + var tx = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t) : quadraticDerivativeAt$1(p2[0], cp1[0], p1[0], 1 - t); + var ty = symbol.__t < 1 ? quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t) : quadraticDerivativeAt$1(p2[1], cp1[1], p1[1], 1 - t); + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; // enable continuity trail for 'line', 'rect', 'roundRect' symbolType + + if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') { + if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) { + symbol.scaleY = dist(lastPos, pos) * 1.05; // make sure the last segment render within endPoint + + if (t === 1) { + pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; + pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; + } + } else if (symbol.__lastT === 1) { + // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly. + symbol.scaleY = 2 * dist(p1, pos); + } else { + symbol.scaleY = this._symbolScale[1]; + } + } + + symbol.__lastT = symbol.__t; + symbol.ignore = false; + symbol.x = pos[0]; + symbol.y = pos[1]; + }; + + EffectLine.prototype.updateLayout = function (lineData, idx) { + this.childAt(0).updateLayout(lineData, idx); + var effectModel = lineData.getItemModel(idx).getModel('effect'); + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + return EffectLine; + }(Group); + + var Polyline$1 = + /** @class */ + function (_super) { + __extends(Polyline$1, _super); + + function Polyline$1(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createPolyline(lineData, idx, seriesScope); + + return _this; + } + + Polyline$1.prototype._createPolyline = function (lineData, idx, seriesScope) { + // let seriesModel = lineData.hostModel; + var points = lineData.getItemLayout(idx); + var line = new Polyline({ + shape: { + points: points + } + }); + this.add(line); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childAt(0); + var target = { + shape: { + points: lineData.getItemLayout(idx) + } + }; + updateProps(line, target, seriesModel, idx); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var line = this.childAt(0); + var itemModel = lineData.getItemModel(idx); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + + if (!seriesScope || lineData.hasItemOption) { + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + } + + line.useStyle(lineData.getItemVisual(idx, 'style')); + line.style.fill = null; + line.style.strokeNoScale = true; + var lineEmphasisState = line.ensureState('emphasis'); + lineEmphasisState.style = emphasisLineStyle; + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Polyline$1.prototype.updateLayout = function (lineData, idx) { + var polyline = this.childAt(0); + polyline.setShape('points', lineData.getItemLayout(idx)); + }; + return Polyline$1; + }(Group); + + var EffectPolyline = + /** @class */ + function (_super) { + __extends(EffectPolyline, _super); + + function EffectPolyline() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this._lastFrame = 0; + _this._lastFramePercent = 0; + return _this; + } // Override + + + EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) { + return new Polyline$1(lineData, idx, seriesScope); + }; + + EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) { + this._points = points; + var accLenArr = [0]; + var len = 0; + + for (var i = 1; i < points.length; i++) { + var p1 = points[i - 1]; + var p2 = points[i]; + len += dist(p1, p2); + accLenArr.push(len); + } + + if (len === 0) { + this._length = 0; + return; + } + + for (var i = 0; i < accLenArr.length; i++) { + accLenArr[i] /= len; + } + + this._offsets = accLenArr; + this._length = len; + }; + + EffectPolyline.prototype._getLineLength = function () { + return this._length; + }; + + EffectPolyline.prototype._updateSymbolPosition = function (symbol) { + var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; + var points = this._points; + var offsets = this._offsets; + var len = points.length; + + if (!offsets) { + // Has length 0 + return; + } + + var lastFrame = this._lastFrame; + var frame; + + if (t < this._lastFramePercent) { + // Start from the next frame + // PENDING start from lastFrame ? + var start = Math.min(lastFrame + 1, len - 1); + + for (frame = start; frame >= 0; frame--) { + if (offsets[frame] <= t) { + break; + } + } // PENDING really need to do this ? + + + frame = Math.min(frame, len - 2); + } else { + for (frame = lastFrame; frame < len; frame++) { + if (offsets[frame] > t) { + break; + } + } + + frame = Math.min(frame - 1, len - 2); + } + + var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]); + var p0 = points[frame]; + var p1 = points[frame + 1]; + symbol.x = p0[0] * (1 - p) + p * p1[0]; + symbol.y = p0[1] * (1 - p) + p * p1[1]; + var tx = symbol.__t < 1 ? p1[0] - p0[0] : p0[0] - p1[0]; + var ty = symbol.__t < 1 ? p1[1] - p0[1] : p0[1] - p1[1]; + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + this._lastFrame = frame; + this._lastFramePercent = t; + symbol.ignore = false; + }; + return EffectPolyline; + }(EffectLine); + + var LargeLinesPathShape = + /** @class */ + function () { + function LargeLinesPathShape() { + this.polyline = false; + this.curveness = 0; + this.segs = []; + } + + return LargeLinesPathShape; + }(); + + var LargeLinesPath = + /** @class */ + function (_super) { + __extends(LargeLinesPath, _super); + + function LargeLinesPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeLinesPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeLinesPath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + LargeLinesPath.prototype.getDefaultShape = function () { + return new LargeLinesPathShape(); + }; + + LargeLinesPath.prototype.buildPath = function (ctx, shape) { + var segs = shape.segs; + var curveness = shape.curveness; + var i; + + if (shape.polyline) { + for (i = this._off; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + ctx.moveTo(segs[i++], segs[i++]); + + for (var k = 1; k < count; k++) { + ctx.lineTo(segs[i++], segs[i++]); + } + } + } + } else { + for (i = this._off; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + ctx.moveTo(x0, y0); + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + ctx.quadraticCurveTo(x2, y2, x1, y1); + } else { + ctx.lineTo(x1, y1); + } + } + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeLinesPath.prototype.findDataIndex = function (x, y) { + var shape = this.shape; + var segs = shape.segs; + var curveness = shape.curveness; + var lineWidth = this.style.lineWidth; + + if (shape.polyline) { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + var x0 = segs[i++]; + var y0 = segs[i++]; + + for (var k = 1; k < count; k++) { + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + } + + dataIndex++; + } + } else { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + + if (containStroke$2(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } else { + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + + dataIndex++; + } + } + + return -1; + }; + + LargeLinesPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeLinesPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.segs; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX, minY, maxX, maxY); + } + + return rect; + }; + + return LargeLinesPath; + }(Path); + + var LargeLineDraw = + /** @class */ + function () { + function LargeLineDraw() { + this.group = new Group(); + } + /** + * Update symbols draw by new data + */ + + + LargeLineDraw.prototype.updateData = function (data) { + this._clear(); + + var lineEl = this._create(); + + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clear(); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) { + var lastAdded = this._newAdded[0]; + var linePoints = data.getLayout('linesPoints'); + var oldSegs = lastAdded && lastAdded.shape.segs; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldSegs && oldSegs.length < 2e4) { + var oldLen = oldSegs.length; + var newSegs = new Float32Array(oldLen + linePoints.length); // Concat two array + + newSegs.set(oldSegs); + newSegs.set(linePoints, oldLen); + lastAdded.setShape({ + segs: newSegs + }); + } else { + // Clear + this._newAdded = []; + + var lineEl = this._create(); + + lineEl.incremental = true; + lineEl.setShape({ + segs: linePoints + }); + + this._setCommon(lineEl, data); + + lineEl.__startIndex = taskParams.start; + } + }; + /** + * @override + */ + + + LargeLineDraw.prototype.remove = function () { + this._clear(); + }; + + LargeLineDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeLineDraw.prototype._create = function () { + var lineEl = new LargeLinesPath({ + cursor: 'default', + ignoreCoarsePointer: true + }); + + this._newAdded.push(lineEl); + + this.group.add(lineEl); + return lineEl; + }; + + LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) { + var hostModel = data.hostModel; + lineEl.setShape({ + polyline: hostModel.get('polyline'), + curveness: hostModel.get(['lineStyle', 'curveness']) + }); + lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle()); + lineEl.style.strokeNoScale = true; + var style = data.getVisual('style'); + + if (style && style.stroke) { + lineEl.setStyle('stroke', style.stroke); + } + + lineEl.setStyle('fill', null); + var ecData = getECData(lineEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + lineEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = lineEl.hoverDataIdx; + + if (dataIndex > 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + lineEl.__startIndex; + } + }); + }; + + LargeLineDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + return LargeLineDraw; + }(); + + var linesLayout = { + seriesType: 'lines', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + if ("development" !== 'production') { + error('The lines series must have a coordinate system.'); + } + + return; + } + + var isPolyline = seriesModel.get('polyline'); + var isLarge = seriesModel.pipelineContext.large; + return { + progress: function (params, lineData) { + var lineCoords = []; + + if (isLarge) { + var points = void 0; + var segCount = params.end - params.start; + + if (isPolyline) { + var totalCoordsCount = 0; + + for (var i = params.start; i < params.end; i++) { + totalCoordsCount += seriesModel.getLineCoordsCount(i); + } + + points = new Float32Array(segCount + totalCoordsCount * 2); + } else { + points = new Float32Array(segCount * 4); + } + + var offset = 0; + var pt = []; + + for (var i = params.start; i < params.end; i++) { + var len = seriesModel.getLineCoords(i, lineCoords); + + if (isPolyline) { + points[offset++] = len; + } + + for (var k = 0; k < len; k++) { + pt = coordSys.dataToPoint(lineCoords[k], false, pt); + points[offset++] = pt[0]; + points[offset++] = pt[1]; + } + } + + lineData.setLayout('linesPoints', points); + } else { + for (var i = params.start; i < params.end; i++) { + var itemModel = lineData.getItemModel(i); + var len = seriesModel.getLineCoords(i, lineCoords); + var pts = []; + + if (isPolyline) { + for (var j = 0; j < len; j++) { + pts.push(coordSys.dataToPoint(lineCoords[j])); + } + } else { + pts[0] = coordSys.dataToPoint(lineCoords[0]); + pts[1] = coordSys.dataToPoint(lineCoords[1]); + var curveness = itemModel.get(['lineStyle', 'curveness']); + + if (+curveness) { + pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness]; + } + } + + lineData.setItemLayout(i, pts); + } + } + } + }; + } + }; + + var LinesView = + /** @class */ + function (_super) { + __extends(LinesView, _super); + + function LinesView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesView.type; + return _this; + } + + LinesView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get(['effect', 'trailLength']); + var zr = api.getZr(); // Avoid the drag cause ghost shadow + // FIXME Better way ? + // SVG doesn't support + + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg) { + zr.painter.getLayer(zlevel).clear(true); + } // Config layer with motion blur + + + if (this._lastZlevel != null && !isSvg) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + + if (this._showEffect(seriesModel) && trailLength > 0) { + if (!isSvg) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } else if ("development" !== 'production') { + console.warn('SVG render mode doesn\'t support lines with trail effect'); + } + } + + lineDraw.updateData(data); + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + + this._lastZlevel = zlevel; + this._finished = true; + }; + + LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + lineDraw.incrementalPrepareUpdate(data); + + this._clearLayer(api); + + this._finished = false; + }; + + LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + LinesView.prototype.eachRendered = function (cb) { + this._lineDraw && this._lineDraw.eachRendered(cb); + }; + + LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + + if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { + // TODO Don't have to do update in large mode. Only do it when there are millions of data. + return { + update: true + }; + } else { + // TODO Use same logic with ScatterView. + // Manually update layout + var res = linesLayout.reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } // Not in large mode + + + this._lineDraw.updateLayout(); + + this._clearLayer(api); + } + }; + + LinesView.prototype._updateLineDraw = function (data, seriesModel) { + var lineDraw = this._lineDraw; + + var hasEffect = this._showEffect(seriesModel); + + var isPolyline = !!seriesModel.get('polyline'); + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if ("development" !== 'production') { + if (hasEffect && isLargeDraw) { + console.warn('Large lines not support effect'); + } + } + + if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) { + if (lineDraw) { + lineDraw.remove(); + } + + lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$1 : hasEffect ? EffectLine : Line$1); + this._hasEffet = hasEffect; + this._isPolyline = isPolyline; + this._isLargeDraw = isLargeDraw; + } + + this.group.add(lineDraw.group); + return lineDraw; + }; + + LinesView.prototype._showEffect = function (seriesModel) { + return !!seriesModel.get(['effect', 'show']); + }; + + LinesView.prototype._clearLayer = function (api) { + // Not use motion when dragging or zooming + var zr = api.getZr(); + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg && this._lastZlevel != null) { + zr.painter.getLayer(this._lastZlevel).clear(true); + } + }; + + LinesView.prototype.remove = function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(); + this._lineDraw = null; // Clear motion when lineDraw is removed + + this._clearLayer(api); + }; + + LinesView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + LinesView.type = 'lines'; + return LinesView; + }(ChartView); + + var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array; + var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array; + + function compatEc2(seriesOpt) { + var data = seriesOpt.data; + + if (data && data[0] && data[0][0] && data[0][0].coord) { + if ("development" !== 'production') { + console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }'); + } + + seriesOpt.data = map(data, function (itemOpt) { + var coords = [itemOpt[0].coord, itemOpt[1].coord]; + var target = { + coords: coords + }; + + if (itemOpt[0].name) { + target.fromName = itemOpt[0].name; + } + + if (itemOpt[1].name) { + target.toName = itemOpt[1].name; + } + + return mergeAll([target, itemOpt[0], itemOpt[1]]); + }); + } + } + + var LinesSeriesModel = + /** @class */ + function (_super) { + __extends(LinesSeriesModel, _super); + + function LinesSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + LinesSeriesModel.prototype.init = function (option) { + // The input data may be null/undefined. + option.data = option.data || []; // Not using preprocessor because mergeOption may not have series.type + + compatEc2(option); + + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + + _super.prototype.init.apply(this, arguments); + }; + + LinesSeriesModel.prototype.mergeOption = function (option) { + compatEc2(option); + + if (option.data) { + // Only update when have option data to merge. + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + } + + _super.prototype.mergeOption.apply(this, arguments); + }; + + LinesSeriesModel.prototype.appendData = function (params) { + var result = this._processFlatCoordsArray(params.data); + + if (result.flatCoords) { + if (!this._flatCoords) { + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + } else { + this._flatCoords = concatArray(this._flatCoords, result.flatCoords); + this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); + } + + params.data = new Float32Array(result.count); + } + + this.getRawData().appendData(params.data); + }; + + LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) { + var itemModel = this.getData().getItemModel(idx); + var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords'); + + if ("development" !== 'production') { + if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) { + throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'); + } + } + + return coords; + }; + + LinesSeriesModel.prototype.getLineCoordsCount = function (idx) { + if (this._flatCoordsOffset) { + return this._flatCoordsOffset[idx * 2 + 1]; + } else { + return this._getCoordsFromItemModel(idx).length; + } + }; + + LinesSeriesModel.prototype.getLineCoords = function (idx, out) { + if (this._flatCoordsOffset) { + var offset = this._flatCoordsOffset[idx * 2]; + var len = this._flatCoordsOffset[idx * 2 + 1]; + + for (var i = 0; i < len; i++) { + out[i] = out[i] || []; + out[i][0] = this._flatCoords[offset + i * 2]; + out[i][1] = this._flatCoords[offset + i * 2 + 1]; + } + + return len; + } else { + var coords = this._getCoordsFromItemModel(idx); + + for (var i = 0; i < coords.length; i++) { + out[i] = out[i] || []; + out[i][0] = coords[i][0]; + out[i][1] = coords[i][1]; + } + + return coords.length; + } + }; + + LinesSeriesModel.prototype._processFlatCoordsArray = function (data) { + var startOffset = 0; + + if (this._flatCoords) { + startOffset = this._flatCoords.length; + } // Stored as a typed array. In format + // Points Count(2) | x | y | x | y | Points Count(3) | x | y | x | y | x | y | + + + if (isNumber(data[0])) { + var len = data.length; // Store offset and len of each segment + + var coordsOffsetAndLenStorage = new Uint32Arr(len); + var coordsStorage = new Float64Arr(len); + var coordsCursor = 0; + var offsetCursor = 0; + var dataCount = 0; + + for (var i = 0; i < len;) { + dataCount++; + var count = data[i++]; // Offset + + coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; // Len + + coordsOffsetAndLenStorage[offsetCursor++] = count; + + for (var k = 0; k < count; k++) { + var x = data[i++]; + var y = data[i++]; + coordsStorage[coordsCursor++] = x; + coordsStorage[coordsCursor++] = y; + + if (i > len) { + if ("development" !== 'production') { + throw new Error('Invalid data format.'); + } + } + } + } + + return { + flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), + flatCoords: coordsStorage, + count: dataCount + }; + } + + return { + flatCoordsOffset: null, + flatCoords: null, + count: data.length + }; + }; + + LinesSeriesModel.prototype.getInitialData = function (option, ecModel) { + if ("development" !== 'production') { + var CoordSys = CoordinateSystemManager.get(option.coordinateSystem); + + if (!CoordSys) { + throw new Error('Unknown coordinate system ' + option.coordinateSystem); + } + } + + var lineData = new SeriesData(['value'], this); + lineData.hasItemOption = false; + lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) { + // dataItem is simply coords + if (dataItem instanceof Array) { + return NaN; + } else { + lineData.hasItemOption = true; + var value = dataItem.value; + + if (value != null) { + return value instanceof Array ? value[dimIndex] : value; + } + } + }); + return lineData; + }; + + LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + var name = itemModel.get('name'); + + if (name) { + return name; + } + + var fromName = itemModel.get('fromName'); + var toName = itemModel.get('toName'); + var nameArr = []; + fromName != null && nameArr.push(fromName); + toName != null && nameArr.push(toName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > ') + }); + }; + + LinesSeriesModel.prototype.preventIncremental = function () { + return !!this.get(['effect', 'show']); + }; + + LinesSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + return this.option.large ? 1e4 : this.get('progressive'); + } + + return progressive; + }; + + LinesSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + return this.option.large ? 2e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + LinesSeriesModel.prototype.getZLevelKey = function () { + var effectModel = this.getModel('effect'); + var trailLength = effectModel.get('trailLength'); + return this.getData().count() > this.getProgressiveThreshold() // Each progressive series has individual key. + ? this.id : effectModel.get('show') && trailLength > 0 ? trailLength + '' : ''; + }; + + LinesSeriesModel.type = 'series.lines'; + LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar']; + LinesSeriesModel.defaultOption = { + coordinateSystem: 'geo', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + symbol: ['none', 'none'], + symbolSize: [10, 10], + // Geo coordinate system + geoIndex: 0, + effect: { + show: false, + period: 4, + constantSpeed: 0, + symbol: 'circle', + symbolSize: 3, + loop: true, + trailLength: 0.2 + }, + large: false, + // Available when large is true + largeThreshold: 2000, + polyline: false, + clip: true, + label: { + show: false, + position: 'end' // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + lineStyle: { + opacity: 0.5 + } + }; + return LinesSeriesModel; + }(SeriesModel); + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function normalize$3(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + var linesVisual = { + seriesType: 'lines', + reset: function (seriesModel) { + var symbolType = normalize$3(seriesModel.get('symbol')); + var symbolSize = normalize$3(seriesModel.get('symbolSize')); + var data = seriesModel.getData(); + data.setVisual('fromSymbol', symbolType && symbolType[0]); + data.setVisual('toSymbol', symbolType && symbolType[1]); + data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + data.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var symbolType = normalize$3(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$3(itemModel.getShallow('symbolSize', true)); + symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]); + symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]); + symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]); + symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]); + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + function install$m(registers) { + registers.registerChartView(LinesView); + registers.registerSeriesModel(LinesSeriesModel); + registers.registerLayout(linesLayout); + registers.registerVisual(linesVisual); + } + + var GRADIENT_LEVELS = 256; + + var HeatmapLayer = + /** @class */ + function () { + function HeatmapLayer() { + this.blurSize = 30; + this.pointSize = 20; + this.maxOpacity = 1; + this.minOpacity = 0; + this._gradientPixels = { + inRange: null, + outOfRange: null + }; + var canvas = platformApi.createCanvas(); + this.canvas = canvas; + } + /** + * Renders Heatmap and returns the rendered canvas + * @param data array of data, each has x, y, value + * @param width canvas width + * @param height canvas height + */ + + + HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + + var gradientInRange = this._getGradient(colorFunc, 'inRange'); + + var gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange'); + + var r = this.pointSize + this.blurSize; + var canvas = this.canvas; + var ctx = canvas.getContext('2d'); + var len = data.length; + canvas.width = width; + canvas.height = height; + + for (var i = 0; i < len; ++i) { + var p = data[i]; + var x = p[0]; + var y = p[1]; + var value = p[2]; // calculate alpha using value + + var alpha = normalize(value); // draw with the circle brush with alpha + + ctx.globalAlpha = alpha; + ctx.drawImage(brush, x - r, y - r); + } + + if (!canvas.width || !canvas.height) { + // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on + // 'CanvasRenderingContext2D': The source height is 0." + return canvas; + } // colorize the canvas using alpha value and set with gradient + + + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pixels = imageData.data; + var offset = 0; + var pixelLen = pixels.length; + var minOpacity = this.minOpacity; + var maxOpacity = this.maxOpacity; + var diffOpacity = maxOpacity - minOpacity; + + while (offset < pixelLen) { + var alpha = pixels[offset + 3] / 256; + var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; // Simple optimize to ignore the empty data + + if (alpha > 0) { + var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; // Any alpha > 0 will be mapped to [minOpacity, maxOpacity] + + alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); + pixels[offset++] = gradient[gradientOffset]; + pixels[offset++] = gradient[gradientOffset + 1]; + pixels[offset++] = gradient[gradientOffset + 2]; + pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; + } else { + offset += 4; + } + } + + ctx.putImageData(imageData, 0, 0); + return canvas; + }; + /** + * get canvas of a black circle brush used for canvas to draw later + */ + + + HeatmapLayer.prototype._getBrush = function () { + var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas()); // set brush size + + var r = this.pointSize + this.blurSize; + var d = r * 2; + brushCanvas.width = d; + brushCanvas.height = d; + var ctx = brushCanvas.getContext('2d'); + ctx.clearRect(0, 0, d, d); // in order to render shadow without the distinct circle, + // draw the distinct circle in an invisible place, + // and use shadowOffset to draw shadow in the center of the canvas + + ctx.shadowOffsetX = d; + ctx.shadowBlur = this.blurSize; // draw the shadow in black, and use alpha and shadow blur to generate + // color in color map + + ctx.shadowColor = '#000'; // draw circle in the left to the canvas + + ctx.beginPath(); + ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + return brushCanvas; + }; + /** + * get gradient color map + * @private + */ + + + HeatmapLayer.prototype._getGradient = function (colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = [0, 0, 0, 0]; + var off = 0; + + for (var i = 0; i < 256; i++) { + colorFunc[state](i / 255, true, color); + pixelsSingleState[off++] = color[0]; + pixelsSingleState[off++] = color[1]; + pixelsSingleState[off++] = color[2]; + pixelsSingleState[off++] = color[3]; + } + + return pixelsSingleState; + }; + + return HeatmapLayer; + }(); + + function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = map(pieceList, function (piece) { + return { + interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan] + }; + }); + var len = pieceList.length; + var lastIndex = 0; + return function (val) { + var i; // Try to find in the location of the last found + + for (i = lastIndex; i < len; i++) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + + if (i === len) { + // Not found, back interation + for (i = lastIndex - 1; i >= 0; i--) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + } + + return i >= 0 && i < len && selected[i]; + }; + } + + function getIsInContinuousRange(dataExtent, range) { + var dataSpan = dataExtent[1] - dataExtent[0]; + range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan]; + return function (val) { + return val >= range[0] && val <= range[1]; + }; + } + + function isGeoCoordSys(coordSys) { + var dimensions = coordSys.dimensions; // Not use coordSys.type === 'geo' because coordSys maybe extended + + return dimensions[0] === 'lng' && dimensions[1] === 'lat'; + } + + var HeatmapView = + /** @class */ + function (_super) { + __extends(HeatmapView, _super); + + function HeatmapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapView.type; + return _this; + } + + HeatmapView.prototype.render = function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if ("development" !== 'production') { + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + } // Clear previously rendered progressive elements. + + + this._progressiveEls = null; + this.group.removeAll(); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { + this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); + } else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); + } + }; + + HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this.group.removeAll(); + }; + + HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys) { + // geo does not support incremental rendering? + if (isGeoCoordSys(coordSys)) { + this.render(seriesModel, ecModel, api); + } else { + this._progressiveEls = []; + + this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); + } + } + }; + + HeatmapView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) { + var coordSys = seriesModel.coordinateSystem; + var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d'); + var width; + var height; + var xAxisExtent; + var yAxisExtent; + + if (isCartesian2d) { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + + if ("development" !== 'production') { + if (!(xAxis.type === 'category' && yAxis.type === 'category')) { + throw new Error('Heatmap on cartesian must have two category axes'); + } + + if (!(xAxis.onBand && yAxis.onBand)) { + throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); + } + } // add 0.5px to avoid the gaps + + + width = xAxis.getBandWidth() + .5; + height = yAxis.getBandWidth() + .5; + xAxisExtent = xAxis.scale.getExtent(); + yAxisExtent = yAxis.scale.getExtent(); + } + + var group = this.group; + var data = seriesModel.getData(); + var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(); + var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle(); + var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']); + var labelStatesModels = getLabelStatesModels(seriesModel); + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + var dataDims = isCartesian2d ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')]; + + for (var idx = start; idx < end; idx++) { + var rect = void 0; + var style = data.getItemVisual(idx, 'style'); + + if (isCartesian2d) { + var dataDimX = data.get(dataDims[0], idx); + var dataDimY = data.get(dataDims[1], idx); // Ignore empty data and out of extent data + + if (isNaN(data.get(dataDims[2], idx)) || isNaN(dataDimX) || isNaN(dataDimY) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { + continue; + } + + var point = coordSys.dataToPoint([dataDimX, dataDimY]); + rect = new Rect({ + shape: { + x: point[0] - width / 2, + y: point[1] - height / 2, + width: width, + height: height + }, + style: style + }); + } else { + // Ignore empty data + if (isNaN(data.get(dataDims[1], idx))) { + continue; + } + + rect = new Rect({ + z2: 1, + shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, + style: style + }); + } // Optimization for large dataset + + + if (data.hasItemOption) { + var itemModel = data.getItemModel(idx); + var emphasisModel_1 = itemModel.getModel('emphasis'); + emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle(); + blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); // Each item value struct in the data would be firstly + // { + // itemStyle: { borderRadius: [30, 30] }, + // value: [2022, 02, 22] + // } + + borderRadius = itemModel.get(['itemStyle', 'borderRadius']); + focus = emphasisModel_1.get('focus'); + blurScope = emphasisModel_1.get('blurScope'); + emphasisDisabled = emphasisModel_1.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + rect.shape.r = borderRadius; + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2] + ''; + } + + setLabelStyle(rect, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: defaultText + }); + rect.ensureState('emphasis').style = emphasisStyle; + rect.ensureState('blur').style = blurStyle; + rect.ensureState('select').style = selectStyle; + toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled); + rect.incremental = incremental; // PENDING + + if (incremental) { + // Rect must use hover layer if it's incremental. + rect.states.emphasis.hoverLayer = true; + } + + group.add(rect); + data.setItemGraphicEl(idx, rect); + + if (this._progressiveEls) { + this._progressiveEls.push(rect); + } + } + }; + + HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) { + var inRangeVisuals = visualMapModel.targetVisuals.inRange; + var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; // if (!visualMapping) { + // throw new Error('Data range must have color visuals'); + // } + + var data = seriesModel.getData(); + var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer(); + hmLayer.blurSize = seriesModel.get('blurSize'); + hmLayer.pointSize = seriesModel.get('pointSize'); + hmLayer.minOpacity = seriesModel.get('minOpacity'); + hmLayer.maxOpacity = seriesModel.get('maxOpacity'); + var rect = geo.getViewRect().clone(); + var roamTransform = geo.getRoamTransform(); + rect.applyTransform(roamTransform); // Clamp on viewport + + var x = Math.max(rect.x, 0); + var y = Math.max(rect.y, 0); + var x2 = Math.min(rect.width + rect.x, api.getWidth()); + var y2 = Math.min(rect.height + rect.y, api.getHeight()); + var width = x2 - x; + var height = y2 - y; + var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')]; + var points = data.mapArray(dims, function (lng, lat, value) { + var pt = geo.dataToPoint([lng, lat]); + pt[0] -= x; + pt[1] -= y; + pt.push(value); + return pt; + }); + var dataExtent = visualMapModel.getExtent(); + var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected); + hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), { + inRange: inRangeVisuals.color.getColorMapper(), + outOfRange: outOfRangeVisuals.color.getColorMapper() + }, isInRange); + var img = new ZRImage({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + }; + + HeatmapView.type = 'heatmap'; + return HeatmapView; + }(ChartView); + + var HeatmapSeriesModel = + /** @class */ + function (_super) { + __extends(HeatmapSeriesModel, _super); + + function HeatmapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapSeriesModel.type; + return _this; + } + + HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + generateCoord: 'value' + }); + }; + + HeatmapSeriesModel.prototype.preventIncremental = function () { + var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem')); + + if (coordSysCreator && coordSysCreator.dimensions) { + return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat'; + } + }; + + HeatmapSeriesModel.type = 'series.heatmap'; + HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar']; + HeatmapSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Geo coordinate system + geoIndex: 0, + blurSize: 30, + pointSize: 20, + maxOpacity: 1, + minOpacity: 0, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return HeatmapSeriesModel; + }(SeriesModel); + + function install$n(registers) { + registers.registerChartView(HeatmapView); + registers.registerSeriesModel(HeatmapSeriesModel); + } + + var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth']; // index: +isHorizontal + + var LAYOUT_ATTRS = [{ + xy: 'x', + wh: 'width', + index: 0, + posDesc: ['left', 'right'] + }, { + xy: 'y', + wh: 'height', + index: 1, + posDesc: ['top', 'bottom'] + }]; + var pathForLineWidth = new Circle(); + + var PictorialBarView = + /** @class */ + function (_super) { + __extends(PictorialBarView, _super); + + function PictorialBarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarView.type; + return _this; + } + + PictorialBarView.prototype.render = function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var coordSysRect = cartesian.master.getRect(); + var opt = { + ecSize: { + width: api.getWidth(), + height: api.getHeight() + }, + seriesModel: seriesModel, + coordSys: cartesian, + coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]], + isHorizontal: isHorizontal, + valueDim: LAYOUT_ATTRS[+isHorizontal], + categoryDim: LAYOUT_ATTRS[1 - +isHorizontal] + }; + data.diff(oldData).add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = getItemModel(data, dataIndex); + var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); + var bar = createBar(data, opt, symbolMeta); + data.setItemGraphicEl(dataIndex, bar); + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).update(function (newIndex, oldIndex) { + var bar = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(bar); + return; + } + + var itemModel = getItemModel(data, newIndex); + var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); + var pictorialShapeStr = getShapeStr(data, symbolMeta); + + if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { + group.remove(bar); + data.setItemGraphicEl(newIndex, null); + bar = null; + } + + if (bar) { + updateBar(bar, opt, symbolMeta); + } else { + bar = createBar(data, opt, symbolMeta, true); + } + + data.setItemGraphicEl(newIndex, bar); + bar.__pictorialSymbolMeta = symbolMeta; // Add back + + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).remove(function (dataIndex) { + var bar = oldData.getItemGraphicEl(dataIndex); + bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); + }).execute(); + this._data = data; + return this.group; + }; + + PictorialBarView.prototype.remove = function (ecModel, api) { + var group = this.group; + var data = this._data; + + if (ecModel.get('animation')) { + if (data) { + data.eachItemGraphicEl(function (bar) { + removeBar(data, getECData(bar).dataIndex, ecModel, bar); + }); + } + } else { + group.removeAll(); + } + }; + + PictorialBarView.type = 'pictorialBar'; + return PictorialBarView; + }(ChartView); // Set or calculate default value about symbol, and calculate layout info. + + + function getSymbolMeta(data, dataIndex, itemModel, opt) { + var layout = data.getItemLayout(dataIndex); + var symbolRepeat = itemModel.get('symbolRepeat'); + var symbolClip = itemModel.get('symbolClip'); + var symbolPosition = itemModel.get('symbolPosition') || 'start'; + var symbolRotate = itemModel.get('symbolRotate'); + var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var symbolPatternSize = itemModel.get('symbolPatternSize') || 2; + var isAnimationEnabled = itemModel.isAnimationEnabled(); + var symbolMeta = { + dataIndex: dataIndex, + layout: layout, + itemModel: itemModel, + symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle', + style: data.getItemVisual(dataIndex, 'style'), + symbolClip: symbolClip, + symbolRepeat: symbolRepeat, + symbolRepeatDirection: itemModel.get('symbolRepeatDirection'), + symbolPatternSize: symbolPatternSize, + rotation: rotation, + animationModel: isAnimationEnabled ? itemModel : null, + hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']), + z2: itemModel.getShallow('z', true) || 0 + }; + prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta); + prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta); + prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); + var symbolSize = symbolMeta.symbolSize; + var symbolOffset = normalizeSymbolOffset(itemModel.get('symbolOffset'), symbolSize); + prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta); + return symbolMeta; + } // bar length can be negative. + + + function prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var symbolBoundingData = itemModel.get('symbolBoundingData'); + var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); + var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)); + var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0); + var boundingLength; + + if (isArray(symbolBoundingData)) { + var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx]; + symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse(); + boundingLength = symbolBoundingExtent[pxSignIdx]; + } else if (symbolBoundingData != null) { + boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx; + } else if (symbolRepeat) { + boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; + } else { + boundingLength = layout[valueDim.wh]; + } + + outputSymbolMeta.boundingLength = boundingLength; + + if (symbolRepeat) { + outputSymbolMeta.repeatCutLength = layout[valueDim.wh]; + } // if 'pxSign' means sign of pixel, it can't be zero, or symbolScale will be zero + // and when borderWidth be settled, the actual linewidth will be NaN + + + outputSymbolMeta.pxSign = boundingLength > 0 ? 1 : -1; + } + + function convertToCoordOnAxis(axis, value) { + return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); + } // Support ['100%', '100%'] + + + function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var categoryDim = opt.categoryDim; + var categorySize = Math.abs(layout[categoryDim.wh]); + var symbolSize = data.getItemVisual(dataIndex, 'symbolSize'); + var parsedSymbolSize; + + if (isArray(symbolSize)) { + parsedSymbolSize = symbolSize.slice(); + } else { + if (symbolSize == null) { + // will parse to number below + parsedSymbolSize = ['100%', '100%']; + } else { + parsedSymbolSize = [symbolSize, symbolSize]; + } + } // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is + // to complicated to calculate real percent value if considering scaled lineWidth. + // So the actual size will bigger than layout size if lineWidth is bigger than zero, + // which can be tolerated in pictorial chart. + + + parsedSymbolSize[categoryDim.index] = parsePercent$1(parsedSymbolSize[categoryDim.index], categorySize); + parsedSymbolSize[valueDim.index] = parsePercent$1(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength)); + outputSymbolMeta.symbolSize = parsedSymbolSize; // If x or y is less than zero, show reversed shape. + + var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize]; // Follow convention, 'right' and 'top' is the normal scale. + + symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; + } + + function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) { + // In symbols are drawn with scale, so do not need to care about the case that width + // or height are too small. But symbol use strokeNoScale, where acture lineWidth should + // be calculated. + var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; + + if (valueLineWidth) { + pathForLineWidth.attr({ + scaleX: symbolScale[0], + scaleY: symbolScale[1], + rotation: rotation + }); + pathForLineWidth.updateTransform(); + valueLineWidth /= pathForLineWidth.getLineScale(); + valueLineWidth *= symbolScale[opt.valueDim.index]; + } + + outputSymbolMeta.valueLineWidth = valueLineWidth || 0; + } + + function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) { + var categoryDim = opt.categoryDim; + var valueDim = opt.valueDim; + var pxSign = outputSymbolMeta.pxSign; + var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); + var pathLen = unitLength; // Note: rotation will not effect the layout of symbols, because user may + // want symbols to rotate on its center, which should not be translated + // when rotating. + + if (symbolRepeat) { + var absBoundingLength = Math.abs(boundingLength); + var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + ''; + var hasEndGap = false; + + if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) { + hasEndGap = true; + symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); + } + + var symbolMarginNumeric = parsePercent$1(symbolMargin, symbolSize[valueDim.index]); + var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0); // When symbol margin is less than 0, margin at both ends will be subtracted + // to ensure that all of the symbols will not be overflow the given area. + + var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Both final repeatTimes and final symbolMarginNumeric area calculated based on + // boundingLength. + + var repeatSpecified = isNumeric(symbolRepeat); + var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); // Adjust calculate margin, to ensure each symbol is displayed + // entirely in the given layout area. + + var mDiff = absBoundingLength - repeatTimes * unitLength; + symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1)); + uLenWithMargin = unitLength + symbolMarginNumeric * 2; + endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Update repeatTimes when not all symbol will be shown. + + if (!repeatSpecified && symbolRepeat !== 'fixed') { + repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0; + } + + pathLen = repeatTimes * uLenWithMargin - endFix; + outputSymbolMeta.repeatTimes = repeatTimes; + outputSymbolMeta.symbolMargin = symbolMarginNumeric; + } + + var sizeFix = pxSign * (pathLen / 2); + var pathPosition = outputSymbolMeta.pathPosition = []; + pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2; + pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center' + + if (symbolOffset) { + pathPosition[0] += symbolOffset[0]; + pathPosition[1] += symbolOffset[1]; + } + + var bundlePosition = outputSymbolMeta.bundlePosition = []; + bundlePosition[categoryDim.index] = layout[categoryDim.xy]; + bundlePosition[valueDim.index] = layout[valueDim.xy]; + var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout); + barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)); + barRectShape[categoryDim.wh] = layout[categoryDim.wh]; + var clipShape = outputSymbolMeta.clipShape = {}; // Consider that symbol may be overflow layout rect. + + clipShape[categoryDim.xy] = -layout[categoryDim.xy]; + clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; + clipShape[valueDim.xy] = 0; + clipShape[valueDim.wh] = layout[valueDim.wh]; + } + + function createPath(symbolMeta) { + var symbolPatternSize = symbolMeta.symbolPatternSize; + var path = createSymbol( // Consider texture img, make a big size. + symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize); + path.attr({ + culling: true + }); + path.type !== 'image' && path.setStyle({ + strokeNoScale: true + }); + return path; + } + + function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var symbolSize = symbolMeta.symbolSize; + var valueLineWidth = symbolMeta.valueLineWidth; + var pathPosition = symbolMeta.pathPosition; + var valueDim = opt.valueDim; + var repeatTimes = symbolMeta.repeatTimes || 0; + var index = 0; + var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; + eachPath(bar, function (path) { + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + + if (index < repeatTimes) { + updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate); + } else { + updateAttr(path, null, { + scaleX: 0, + scaleY: 0 + }, symbolMeta, isUpdate, function () { + bundle.remove(path); + }); + } // updateHoverAnimation(path, symbolMeta); + + + index++; + }); + + for (; index < repeatTimes; index++) { + var path = createPath(symbolMeta); + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + bundle.add(path); + var target = makeTarget(index); + updateAttr(path, { + x: target.x, + y: target.y, + scaleX: 0, + scaleY: 0 + }, { + scaleX: target.scaleX, + scaleY: target.scaleY, + rotation: target.rotation + }, symbolMeta, isUpdate); + } + + function makeTarget(index) { + var position = pathPosition.slice(); // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index + // Otherwise: i = index; + + var pxSign = symbolMeta.pxSign; + var i = index; + + if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) { + i = repeatTimes - 1 - index; + } + + position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; + return { + x: position[0], + y: position[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }; + } + } + + function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var mainPath = bar.__pictorialMainPath; + + if (!mainPath) { + mainPath = bar.__pictorialMainPath = createPath(symbolMeta); + bundle.add(mainPath); + updateAttr(mainPath, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: 0, + scaleY: 0, + rotation: symbolMeta.rotation + }, { + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1] + }, symbolMeta, isUpdate); + } else { + updateAttr(mainPath, null, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }, symbolMeta, isUpdate); + } + } // bar rect is used for label. + + + function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { + var rectShape = extend({}, symbolMeta.barRectShape); + var barRect = bar.__pictorialBarRect; + + if (!barRect) { + barRect = bar.__pictorialBarRect = new Rect({ + z2: 2, + shape: rectShape, + silent: true, + style: { + stroke: 'transparent', + fill: 'transparent', + lineWidth: 0 + } + }); + barRect.disableMorphing = true; + bar.add(barRect); + } else { + updateAttr(barRect, null, { + shape: rectShape + }, symbolMeta, isUpdate); + } + } + + function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { + // If not clip, symbol will be remove and rebuilt. + if (symbolMeta.symbolClip) { + var clipPath = bar.__pictorialClipPath; + var clipShape = extend({}, symbolMeta.clipShape); + var valueDim = opt.valueDim; + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + + if (clipPath) { + updateProps(clipPath, { + shape: clipShape + }, animationModel, dataIndex); + } else { + clipShape[valueDim.wh] = 0; + clipPath = new Rect({ + shape: clipShape + }); + + bar.__pictorialBundle.setClipPath(clipPath); + + bar.__pictorialClipPath = clipPath; + var target = {}; + target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; + graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, { + shape: target + }, animationModel, dataIndex); + } + } + } + + function getItemModel(data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + itemModel.getAnimationDelayParams = getAnimationDelayParams; + itemModel.isAnimationEnabled = isAnimationEnabled; + return itemModel; + } + + function getAnimationDelayParams(path) { + // The order is the same as the z-order, see `symbolRepeatDiretion`. + return { + index: path.__pictorialAnimationIndex, + count: path.__pictorialRepeatTimes + }; + } + + function isAnimationEnabled() { + // `animation` prop can be set on itemModel in pictorial bar chart. + return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation'); + } + + function createBar(data, opt, symbolMeta, isUpdate) { + // bar is the main element for each data. + var bar = new Group(); // bundle is used for location and clip. + + var bundle = new Group(); + bar.add(bundle); + bar.__pictorialBundle = bundle; + bundle.x = symbolMeta.bundlePosition[0]; + bundle.y = symbolMeta.bundlePosition[1]; + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta); + } + + createOrUpdateBarRect(bar, symbolMeta, isUpdate); + createOrUpdateClip(bar, opt, symbolMeta, isUpdate); + bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); + bar.__pictorialSymbolMeta = symbolMeta; + return bar; + } + + function updateBar(bar, opt, symbolMeta) { + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + var bundle = bar.__pictorialBundle; + updateProps(bundle, { + x: symbolMeta.bundlePosition[0], + y: symbolMeta.bundlePosition[1] + }, animationModel, dataIndex); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); + } + + createOrUpdateBarRect(bar, symbolMeta, true); + createOrUpdateClip(bar, opt, symbolMeta, true); + } + + function removeBar(data, dataIndex, animationModel, bar) { + // Not show text when animating + var labelRect = bar.__pictorialBarRect; + labelRect && labelRect.removeTextContent(); + var paths = []; + eachPath(bar, function (path) { + paths.push(path); + }); + bar.__pictorialMainPath && paths.push(bar.__pictorialMainPath); // I do not find proper remove animation for clip yet. + + bar.__pictorialClipPath && (animationModel = null); + each(paths, function (path) { + removeElement(path, { + scaleX: 0, + scaleY: 0 + }, animationModel, dataIndex, function () { + bar.parent && bar.parent.remove(bar); + }); + }); + data.setItemGraphicEl(dataIndex, null); + } + + function getShapeStr(data, symbolMeta) { + return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':'); + } + + function eachPath(bar, cb, context) { + // Do not use Group#eachChild, because it do not support remove. + each(bar.__pictorialBundle.children(), function (el) { + el !== bar.__pictorialBarRect && cb.call(context, el); + }); + } + + function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { + immediateAttrs && el.attr(immediateAttrs); // when symbolCip used, only clip path has init animation, otherwise it would be weird effect. + + if (symbolMeta.symbolClip && !isUpdate) { + animationAttrs && el.attr(animationAttrs); + } else { + animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb); + } + } + + function updateCommon$1(bar, opt, symbolMeta) { + var dataIndex = symbolMeta.dataIndex; + var itemModel = symbolMeta.itemModel; // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var emphasisModel = itemModel.getModel('emphasis'); + var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + var cursorStyle = itemModel.getShallow('cursor'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var hoverScale = emphasisModel.get('scale'); + eachPath(bar, function (path) { + if (path instanceof ZRImage) { + var pathStyle = path.style; + path.useStyle(extend({ + // TODO other properties like dx, dy ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolMeta.style)); + } else { + path.useStyle(symbolMeta.style); + } + + var emphasisState = path.ensureState('emphasis'); + emphasisState.style = emphasisStyle; + + if (hoverScale) { + // NOTE: Must after scale is set after updateAttr + emphasisState.scaleX = path.scaleX * 1.1; + emphasisState.scaleY = path.scaleY * 1.1; + } + + path.ensureState('blur').style = blurStyle; + path.ensureState('select').style = selectStyle; + cursorStyle && (path.cursor = cursorStyle); + path.z2 = symbolMeta.z2; + }); + var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; + var barRect = bar.__pictorialBarRect; + setLabelStyle(barRect, getLabelStatesModels(itemModel), { + labelFetcher: opt.seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex), + inheritColor: symbolMeta.style.fill, + defaultOpacity: symbolMeta.style.opacity, + defaultOutsidePosition: barPositionOutside + }); + toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get('disabled')); + } + + function toIntTimes(times) { + var roundedTimes = Math.round(times); // Escapse accurate error + + return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times); + } + + var PictorialBarSeriesModel = + /** @class */ + function (_super) { + __extends(PictorialBarSeriesModel, _super); + + function PictorialBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarSeriesModel.type; + _this.hasSymbolVisual = true; + _this.defaultSymbol = 'roundRect'; + return _this; + } + + PictorialBarSeriesModel.prototype.getInitialData = function (option) { + // Disable stack. + option.stack = null; + return _super.prototype.getInitialData.apply(this, arguments); + }; + + PictorialBarSeriesModel.type = 'series.pictorialBar'; + PictorialBarSeriesModel.dependencies = ['grid']; + PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + symbol: 'circle', + symbolSize: null, + symbolRotate: null, + symbolPosition: null, + symbolOffset: null, + symbolMargin: null, + symbolRepeat: false, + symbolRepeatDirection: 'end', + symbolClip: false, + symbolBoundingData: null, + symbolPatternSize: 400, + barGap: '-100%', + // z can be set in data item, which is z2 actually. + // Disable progressive + progressive: 0, + emphasis: { + // By default pictorialBar do not hover scale. Hover scale is not suitable + // for the case that both has foreground and background. + scale: false + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }); + return PictorialBarSeriesModel; + }(BaseBarSeriesModel); + + function install$o(registers) { + registers.registerChartView(PictorialBarView); + registers.registerSeriesModel(PictorialBarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar')); // Do layout after other overall layout, which can prepare some information. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar')); + } + + var ThemeRiverView = + /** @class */ + function (_super) { + __extends(ThemeRiverView, _super); + + function ThemeRiverView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverView.type; + _this._layers = []; + return _this; + } + + ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var self = this; + var group = this.group; + var layersSeries = seriesModel.getLayerSeries(); + var layoutInfo = data.getLayout('layoutInfo'); + var rect = layoutInfo.rect; + var boundaryGap = layoutInfo.boundaryGap; + group.x = 0; + group.y = rect.y + boundaryGap[0]; + + function keyGetter(item) { + return item.name; + } + + var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter); + var newLayersGroups = []; + dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute(); + + function process(status, idx, oldIdx) { + var oldLayersGroups = self._layers; + + if (status === 'remove') { + group.remove(oldLayersGroups[idx]); + return; + } + + var points0 = []; + var points1 = []; + var style; + var indices = layersSeries[idx].indices; + var j = 0; + + for (; j < indices.length; j++) { + var layout = data.getItemLayout(indices[j]); + var x = layout.x; + var y0 = layout.y0; + var y = layout.y; + points0.push(x, y0); + points1.push(x, y0 + y); + style = data.getItemVisual(indices[j], 'style'); + } + + var polygon; + var textLayout = data.getItemLayout(indices[0]); + var labelModel = seriesModel.getModel('label'); + var margin = labelModel.get('margin'); + var emphasisModel = seriesModel.getModel('emphasis'); + + if (status === 'add') { + var layerGroup = newLayersGroups[idx] = new Group(); + polygon = new ECPolygon({ + shape: { + points: points0, + stackedOnPoints: points1, + smooth: 0.4, + stackedOnSmooth: 0.4, + smoothConstraint: false + }, + z2: 0 + }); + layerGroup.add(polygon); + group.add(layerGroup); + + if (seriesModel.isAnimationEnabled()) { + polygon.setClipPath(createGridClipShape$2(polygon.getBoundingRect(), seriesModel, function () { + polygon.removeClipPath(); + })); + } + } else { + var layerGroup = oldLayersGroups[oldIdx]; + polygon = layerGroup.childAt(0); + group.add(layerGroup); + newLayersGroups[idx] = layerGroup; + updateProps(polygon, { + shape: { + points: points0, + stackedOnPoints: points1 + } + }, seriesModel); + saveOldStyle(polygon); + } + + setLabelStyle(polygon, getLabelStatesModels(seriesModel), { + labelDataIndex: indices[j - 1], + defaultText: data.getName(indices[j - 1]), + inheritColor: style.fill + }, { + normal: { + verticalAlign: 'middle' // align: 'right' + + } + }); + polygon.setTextConfig({ + position: null, + local: true + }); + var labelEl = polygon.getTextContent(); // TODO More label position options. + + if (labelEl) { + labelEl.x = textLayout.x - margin; + labelEl.y = textLayout.y0 + textLayout.y / 2; + } + + polygon.useStyle(style); + data.setItemGraphicEl(idx, polygon); + setStatesStylesFromModel(polygon, seriesModel); + toggleHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + this._layersSeries = layersSeries; + this._layers = newLayersGroups; + }; + + ThemeRiverView.type = 'themeRiver'; + return ThemeRiverView; + }(ChartView); + + function createGridClipShape$2(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + x: rect.x - 50, + width: rect.width + 100, + height: rect.height + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var DATA_NAME_INDEX = 2; + + var ThemeRiverSeriesModel = + /** @class */ + function (_super) { + __extends(ThemeRiverSeriesModel, _super); + + function ThemeRiverSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverSeriesModel.type; + return _this; + } + /** + * @override + */ + + + ThemeRiverSeriesModel.prototype.init = function (option) { + // eslint-disable-next-line + _super.prototype.init.apply(this, arguments); // Put this function here is for the sake of consistency of code style. + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + /** + * If there is no value of a certain point in the time for some event,set it value to 0. + * + * @param {Array} data initial data in the option + * @return {Array} + */ + + + ThemeRiverSeriesModel.prototype.fixData = function (data) { + var rawDataLength = data.length; + /** + * Make sure every layer data get the same keys. + * The value index tells which layer has visited. + * { + * 2014/01/01: -1 + * } + */ + + var timeValueKeys = {}; // grouped data by name + + var groupResult = groupData(data, function (item) { + if (!timeValueKeys.hasOwnProperty(item[0] + '')) { + timeValueKeys[item[0] + ''] = -1; + } + + return item[2]; + }); + var layerData = []; + groupResult.buckets.each(function (items, key) { + layerData.push({ + name: key, + dataList: items + }); + }); + var layerNum = layerData.length; + + for (var k = 0; k < layerNum; ++k) { + var name_1 = layerData[k].name; + + for (var j = 0; j < layerData[k].dataList.length; ++j) { + var timeValue = layerData[k].dataList[j][0] + ''; + timeValueKeys[timeValue] = k; + } + + for (var timeValue in timeValueKeys) { + if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) { + timeValueKeys[timeValue] = k; + data[rawDataLength] = [timeValue, 0, name_1]; + rawDataLength++; + } + } + } + + return data; + }; + /** + * @override + * @param option the initial option that user gave + * @param ecModel the model object for themeRiver option + */ + + + ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) { + var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + var axisType = singleAxisModel.get('type'); // filter the data item with the value of label is undefined + + var filterData = filter(option.data, function (dataItem) { + return dataItem[2] !== undefined; + }); // ??? TODO design a stage to transfer data for themeRiver and lines? + + var data = this.fixData(filterData || []); + var nameList = []; + var nameMap = this.nameMap = createHashMap(); + var count = 0; + + for (var i = 0; i < data.length; ++i) { + nameList.push(data[i][DATA_NAME_INDEX]); + + if (!nameMap.get(data[i][DATA_NAME_INDEX])) { + nameMap.set(data[i][DATA_NAME_INDEX], count); + count++; + } + } + + var dimensions = prepareSeriesDataSchema(data, { + coordDimensions: ['single'], + dimensionsDefine: [{ + name: 'time', + type: getDimensionTypeByAxis(axisType) + }, { + name: 'value', + type: 'float' + }, { + name: 'name', + type: 'ordinal' + }], + encodeDefine: { + single: 0, + value: 1, + itemName: 2 + } + }).dimensions; + var list = new SeriesData(dimensions, this); + list.initData(data); + return list; + }; + /** + * The raw data is divided into multiple layers and each layer + * has same name. + */ + + + ThemeRiverSeriesModel.prototype.getLayerSeries = function () { + var data = this.getData(); + var lenCount = data.count(); + var indexArr = []; + + for (var i = 0; i < lenCount; ++i) { + indexArr[i] = i; + } + + var timeDim = data.mapDimension('single'); // data group by name + + var groupResult = groupData(indexArr, function (index) { + return data.get('name', index); + }); + var layerSeries = []; + groupResult.buckets.each(function (items, key) { + items.sort(function (index1, index2) { + return data.get(timeDim, index1) - data.get(timeDim, index2); + }); + layerSeries.push({ + name: key, + indices: items + }); + }); + return layerSeries; + }; + /** + * Get data indices for show tooltip content + */ + + + ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) { + if (!isArray(dim)) { + dim = dim ? [dim] : []; + } + + var data = this.getData(); + var layerSeries = this.getLayerSeries(); + var indices = []; + var layerNum = layerSeries.length; + var nestestValue; + + for (var i = 0; i < layerNum; ++i) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + var pointNum = layerSeries[i].indices.length; + + for (var j = 0; j < pointNum; ++j) { + var theValue = data.get(dim[0], layerSeries[i].indices[j]); + var dist = Math.abs(theValue - value); + + if (dist <= minDist) { + nestestValue = theValue; + minDist = dist; + nearestIdx = layerSeries[i].indices[j]; + } + } + + indices.push(nearestIdx); + } + + return { + dataIndices: indices, + nestestValue: nestestValue + }; + }; + + ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var name = data.getName(dataIndex); + var value = data.get(data.mapDimension('value'), dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + + ThemeRiverSeriesModel.type = 'series.themeRiver'; + ThemeRiverSeriesModel.dependencies = ['singleAxis']; + ThemeRiverSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'singleAxis', + // gap in axis's orthogonal orientation + boundaryGap: ['10%', '10%'], + // legendHoverLink: true, + singleAxisIndex: 0, + animationEasing: 'linear', + label: { + margin: 4, + show: true, + position: 'left', + fontSize: 11 + }, + emphasis: { + label: { + show: true + } + } + }; + return ThemeRiverSeriesModel; + }(SeriesModel); + + function themeRiverLayout(ecModel, api) { + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + var data = seriesModel.getData(); + var single = seriesModel.coordinateSystem; + var layoutInfo = {}; // use the axis boundingRect for view + + var rect = single.getRect(); + layoutInfo.rect = rect; + var boundaryGap = seriesModel.get('boundaryGap'); + var axis = single.getAxis(); + layoutInfo.boundaryGap = boundaryGap; + + if (axis.orient === 'horizontal') { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height); + var height = rect.height - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, height); + } else { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width); + var width = rect.width - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, width); + } + + data.setLayout('layoutInfo', layoutInfo); + }); + } + /** + * The layout information about themeriver + * + * @param data data in the series + * @param seriesModel the model object of themeRiver series + * @param height value used to compute every series height + */ + + function doThemeRiverLayout(data, seriesModel, height) { + if (!data.count()) { + return; + } + + var coordSys = seriesModel.coordinateSystem; // the data in each layer are organized into a series. + + var layerSeries = seriesModel.getLayerSeries(); // the points in each layer. + + var timeDim = data.mapDimension('single'); + var valueDim = data.mapDimension('value'); + var layerPoints = map(layerSeries, function (singleLayer) { + return map(singleLayer.indices, function (idx) { + var pt = coordSys.dataToPoint(data.get(timeDim, idx)); + pt[1] = data.get(valueDim, idx); + return pt; + }); + }); + var base = computeBaseline(layerPoints); + var baseLine = base.y0; + var ky = height / base.max; // set layout information for each item. + + var n = layerSeries.length; + var m = layerSeries[0].indices.length; + var baseY0; + + for (var j = 0; j < m; ++j) { + baseY0 = baseLine[j] * ky; + data.setItemLayout(layerSeries[0].indices[j], { + layerIndex: 0, + x: layerPoints[0][j][0], + y0: baseY0, + y: layerPoints[0][j][1] * ky + }); + + for (var i = 1; i < n; ++i) { + baseY0 += layerPoints[i - 1][j][1] * ky; + data.setItemLayout(layerSeries[i].indices[j], { + layerIndex: i, + x: layerPoints[i][j][0], + y0: baseY0, + y: layerPoints[i][j][1] * ky + }); + } + } + } + /** + * Compute the baseLine of the rawdata + * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics + * + * @param data the points in each layer + */ + + + function computeBaseline(data) { + var layerNum = data.length; + var pointNum = data[0].length; + var sums = []; + var y0 = []; + var max = 0; + + for (var i = 0; i < pointNum; ++i) { + var temp = 0; + + for (var j = 0; j < layerNum; ++j) { + temp += data[j][i][1]; + } + + if (temp > max) { + max = temp; + } + + sums.push(temp); + } + + for (var k = 0; k < pointNum; ++k) { + y0[k] = (max - sums[k]) / 2; + } + + max = 0; + + for (var l = 0; l < pointNum; ++l) { + var sum = sums[l] + y0[l]; + + if (sum > max) { + max = sum; + } + } + + return { + y0: y0, + max: max + }; + } + + function install$p(registers) { + registers.registerChartView(ThemeRiverView); + registers.registerSeriesModel(ThemeRiverSeriesModel); + registers.registerLayout(themeRiverLayout); + registers.registerProcessor(dataFilter('themeRiver')); + } + + var DEFAULT_SECTOR_Z = 2; + var DEFAULT_TEXT_Z = 4; + /** + * Sunburstce of Sunburst including Sector, Label, LabelLine + */ + + var SunburstPiece = + /** @class */ + function (_super) { + __extends(SunburstPiece, _super); + + function SunburstPiece(node, seriesModel, ecModel, api) { + var _this = _super.call(this) || this; + + _this.z2 = DEFAULT_SECTOR_Z; + _this.textConfig = { + inside: true + }; + getECData(_this).seriesIndex = seriesModel.seriesIndex; + var text = new ZRText({ + z2: DEFAULT_TEXT_Z, + silent: node.getModel().get(['label', 'silent']) + }); + + _this.setTextContent(text); + + _this.updateData(true, node, seriesModel, ecModel, api); + + return _this; + } + + SunburstPiece.prototype.updateData = function (firstCreate, node, // state: 'emphasis' | 'normal' | 'highlight' | 'downplay', + seriesModel, ecModel, api) { + this.node = node; + node.piece = this; + seriesModel = seriesModel || this._seriesModel; + ecModel = ecModel || this._ecModel; + var sector = this; + getECData(sector).dataIndex = node.dataIndex; + var itemModel = node.getModel(); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = node.getLayout(); + var sectorShape = extend({}, layout); + sectorShape.label = null; + var normalStyle = node.getVisual('style'); + normalStyle.lineJoin = 'bevel'; + var decal = node.getVisual('decal'); + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + + var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true); + extend(sectorShape, cornerRadius); + each(SPECIAL_STATES, function (stateName) { + var state = sector.ensureState(stateName); + var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']); + state.style = itemStyleModel.getItemStyle(); // border radius + + var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape); + + if (cornerRadius) { + state.shape = cornerRadius; + } + }); + + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, node.dataIndex); + } else { + // Disable animation for gradient since no interpolation method + // is supported for gradient + updateProps(sector, { + shape: sectorShape + }, seriesModel); + saveOldStyle(sector); + } + + sector.useStyle(normalStyle); + + this._updateLabel(seriesModel); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + this._seriesModel = seriesModel || this._seriesModel; + this._ecModel = ecModel || this._ecModel; + var focus = emphasisModel.get('focus'); + var focusOrIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : focus; + toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + SunburstPiece.prototype._updateLabel = function (seriesModel) { + var _this = this; + + var itemModel = this.node.getModel(); + var normalLabelModel = itemModel.getModel('label'); + var layout = this.node.getLayout(); + var angle = layout.endAngle - layout.startAngle; + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + var sector = this; + var label = sector.getTextContent(); + var dataIndex = this.node.dataIndex; + var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI; + var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle); + label.ignore = !isNormalShown; // TODO use setLabelStyle + + each(DISPLAY_STATES, function (stateName) { + var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']); + var isNormal = stateName === 'normal'; + var state = isNormal ? label : label.ensureState(stateName); + var text = seriesModel.getFormattedLabel(dataIndex, stateName); + + if (isNormal) { + text = text || _this.node.name; + } + + state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true); + + if (text) { + state.style.text = text; + } // Not displaying text when angle is too small + + + var isShown = labelStateModel.get('show'); + + if (isShown != null && !isNormal) { + state.ignore = !isShown; + } + + var labelPosition = getLabelAttr(labelStateModel, 'position'); + var sectorState = isNormal ? sector : sector.states[stateName]; + var labelColor = sectorState.style.fill; + sectorState.textConfig = { + outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null, + inside: labelPosition !== 'outside' + }; + var r; + var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0; + var textAlign = getLabelAttr(labelStateModel, 'align'); + + if (labelPosition === 'outside') { + r = layout.r + labelPadding; + textAlign = midAngle > Math.PI / 2 ? 'right' : 'left'; + } else { + if (!textAlign || textAlign === 'center') { + // Put label in the center if it's a circle + if (angle === 2 * Math.PI && layout.r0 === 0) { + r = 0; + } else { + r = (layout.r + layout.r0) / 2; + } + + textAlign = 'center'; + } else if (textAlign === 'left') { + r = layout.r0 + labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'right'; + } + } else if (textAlign === 'right') { + r = layout.r - labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'left'; + } + } + } + + state.style.align = textAlign; + state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle'; + state.x = r * dx + layout.cx; + state.y = r * dy + layout.cy; + var rotateType = getLabelAttr(labelStateModel, 'rotate'); + var rotate = 0; + + if (rotateType === 'radial') { + rotate = normalizeRadian(-midAngle); + + if (rotate > Math.PI / 2 && rotate < Math.PI * 1.5) { + rotate += Math.PI; + } + } else if (rotateType === 'tangential') { + rotate = Math.PI / 2 - midAngle; + + if (rotate > Math.PI / 2) { + rotate -= Math.PI; + } else if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (isNumber(rotateType)) { + rotate = rotateType * Math.PI / 180; + } + + state.rotation = rotate; + }); + + function getLabelAttr(model, name) { + var stateAttr = model.get(name); + + if (stateAttr == null) { + return normalLabelModel.get(name); + } + + return stateAttr; + } + + label.dirtyStyle(); + }; + + return SunburstPiece; + }(Sector); + + var ROOT_TO_NODE_ACTION = 'sunburstRootToNode'; + var HIGHLIGHT_ACTION = 'sunburstHighlight'; + var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight'; + function installSunburstAction(registers) { + registers.registerAction({ + type: ROOT_TO_NODE_ACTION, + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + registers.registerAction({ + type: HIGHLIGHT_ACTION, + update: 'none' + }, function (payload, ecModel, api) { + // Clone + payload = extend({}, payload); + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleHighlight); + + function handleHighlight(model) { + var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); + + if (targetInfo) { + payload.dataIndex = targetInfo.node.dataIndex; + } + } + + if ("development" !== 'production') { + deprecateReplaceLog('sunburstHighlight', 'highlight'); + } // Fast forward action + + + api.dispatchAction(extend(payload, { + type: 'highlight' + })); + }); + registers.registerAction({ + type: UNHIGHLIGHT_ACTION, + update: 'updateView' + }, function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog('sunburstUnhighlight', 'downplay'); + } + + api.dispatchAction(extend(payload, { + type: 'downplay' + })); + }); + } + + var SunburstView = + /** @class */ + function (_super) { + __extends(SunburstView, _super); + + function SunburstView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstView.type; + return _this; + } + + SunburstView.prototype.render = function (seriesModel, ecModel, api, // @ts-ignore + payload) { + var self = this; + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var data = seriesModel.getData(); + var virtualRoot = data.tree.root; + var newRoot = seriesModel.getViewRoot(); + var group = this.group; + var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData'); + var newChildren = []; + newRoot.eachNode(function (node) { + newChildren.push(node); + }); + var oldChildren = this._oldChildren || []; + dualTravel(newChildren, oldChildren); + renderRollUp(virtualRoot, newRoot); + + this._initEvents(); + + this._oldChildren = newChildren; + + function dualTravel(newChildren, oldChildren) { + if (newChildren.length === 0 && oldChildren.length === 0) { + return; + } + + new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + + function getKey(node) { + return node.getId(); + } + + function processNode(newIdx, oldIdx) { + var newNode = newIdx == null ? null : newChildren[newIdx]; + var oldNode = oldIdx == null ? null : oldChildren[oldIdx]; + doRenderNode(newNode, oldNode); + } + } + + function doRenderNode(newNode, oldNode) { + if (!renderLabelForZeroData && newNode && !newNode.getValue()) { + // Not render data with value 0 + newNode = null; + } + + if (newNode !== virtualRoot && oldNode !== virtualRoot) { + if (oldNode && oldNode.piece) { + if (newNode) { + // Update + oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); + } else { + // Remove + removeNode(oldNode); + } + } else if (newNode) { + // Add + var piece = new SunburstPiece(newNode, seriesModel, ecModel, api); + group.add(piece); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, piece); + } + } + } + + function removeNode(node) { + if (!node) { + return; + } + + if (node.piece) { + group.remove(node.piece); + node.piece = null; + } + } + + function renderRollUp(virtualRoot, viewRoot) { + if (viewRoot.depth > 0) { + // Render + if (self.virtualPiece) { + // Update + self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api); + } else { + // Add + self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api); + group.add(self.virtualPiece); + } // TODO event scope + + + viewRoot.piece.off('click'); + self.virtualPiece.on('click', function (e) { + self._rootToNode(viewRoot.parentNode); + }); + } else if (self.virtualPiece) { + // Remove + group.remove(self.virtualPiece); + self.virtualPiece = null; + } + } + }; + /** + * @private + */ + + + SunburstView.prototype._initEvents = function () { + var _this = this; + + this.group.off('click'); + this.group.on('click', function (e) { + var targetFound = false; + + var viewRoot = _this.seriesModel.getViewRoot(); + + viewRoot.eachNode(function (node) { + if (!targetFound && node.piece && node.piece === e.target) { + var nodeClick = node.getModel().get('nodeClick'); + + if (nodeClick === 'rootToNode') { + _this._rootToNode(node); + } else if (nodeClick === 'link') { + var itemModel = node.getModel(); + var link = itemModel.get('link'); + + if (link) { + var linkTarget = itemModel.get('target', true) || '_blank'; + windowOpen(link, linkTarget); + } + } + + targetFound = true; + } + }); + }); + }; + /** + * @private + */ + + + SunburstView.prototype._rootToNode = function (node) { + if (node !== this.seriesModel.getViewRoot()) { + this.api.dispatchAction({ + type: ROOT_TO_NODE_ACTION, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: node + }); + } + }; + /** + * @implement + */ + + + SunburstView.prototype.containPoint = function (point, seriesModel) { + var treeRoot = seriesModel.getData(); + var itemLayout = treeRoot.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + SunburstView.type = 'sunburst'; + return SunburstView; + }(ChartView); + + var SunburstSeriesModel = + /** @class */ + function (_super) { + __extends(SunburstSeriesModel, _super); + + function SunburstSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstSeriesModel.type; + _this.ignoreStyleOnData = true; + return _this; + } + + SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue$1(root); + var levelModels = this._levelModels = map(option.levels || [], function (levelDefine) { + return new Model(levelDefine, this, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = levelModels[node.depth]; + levelModel && (model.parentModel = levelModel); + return model; + }); + } + + return tree.data; + }; + + SunburstSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /* + * @override + */ + + + SunburstSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + return params; + }; + + SunburstSeriesModel.prototype.getLevelModel = function (node) { + return this._levelModels && this._levelModels[node.depth]; + }; + + SunburstSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + SunburstSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + SunburstSeriesModel.type = 'series.sunburst'; + SunburstSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If still show when all data zero. + stillShowZeroSum: true, + // 'rootToNode', 'link', or false + nodeClick: 'rootToNode', + renderLabelForZeroData: false, + label: { + // could be: 'radial', 'tangential', or 'none' + rotate: 'radial', + show: true, + opacity: 1, + // 'left' is for inner side of inside, and 'right' is for outer + // side for inside + align: 'center', + position: 'inside', + distance: 5, + silent: true + }, + itemStyle: { + borderWidth: 1, + borderColor: 'white', + borderType: 'solid', + shadowBlur: 0, + shadowColor: 'rgba(0, 0, 0, 0.2)', + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + emphasis: { + focus: 'descendant' + }, + blur: { + itemStyle: { + opacity: 0.2 + }, + label: { + opacity: 0.1 + } + }, + // Animation type can be expansion, scale. + animationType: 'expansion', + animationDuration: 1000, + animationDurationUpdate: 500, + data: [], + + /** + * Sort order. + * + * Valid values: 'desc', 'asc', null, or callback function. + * 'desc' and 'asc' for descend and ascendant order; + * null for not sorting; + * example of callback function: + * function(nodeA, nodeB) { + * return nodeA.getValue() - nodeB.getValue(); + * } + */ + sort: 'desc' + }; + return SunburstSeriesModel; + }(SeriesModel); + + function completeTreeValue$1(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue$1(child); + var childValue = child.value; // TODO First value of array must be a number + + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + + var RADIAN$2 = Math.PI / 180; + function sunburstLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var startAngle = -seriesModel.get('startAngle') * RADIAN$2; + var minAngle = seriesModel.get('minAngle') * RADIAN$2; + var virtualRoot = seriesModel.getData().tree.root; + var treeRoot = seriesModel.getViewRoot(); + var rootDepth = treeRoot.depth; + var sort = seriesModel.get('sort'); + + if (sort != null) { + initChildren$1(treeRoot, sort); + } + + var validDataCount = 0; + each(treeRoot.children, function (child) { + !isNaN(child.getValue()) && validDataCount++; + }); + var sum = treeRoot.getValue(); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var renderRollupNode = treeRoot.depth > 0; + var levels = treeRoot.height - (renderRollupNode ? -1 : 1); + var rPerLevel = (r - r0) / (levels || 1); + var clockwise = seriesModel.get('clockwise'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // In the case some sector angle is smaller than minAngle + // let restAngle = PI2; + // let valueSumLargerThanMinAngle = 0; + + var dir = clockwise ? 1 : -1; + /** + * Render a tree + * @return increased angle + */ + + var renderNode = function (node, startAngle) { + if (!node) { + return; + } + + var endAngle = startAngle; // Render self + + if (node !== virtualRoot) { + // Tree node is virtual, so it doesn't need to be drawn + var value = node.getValue(); + var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + + if (angle < minAngle) { + angle = minAngle; // restAngle -= minAngle; + } // else { + // valueSumLargerThanMinAngle += value; + // } + + + endAngle = startAngle + dir * angle; + var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); + var rStart = r0 + rPerLevel * depth; + var rEnd = r0 + rPerLevel * (depth + 1); + var levelModel = seriesModel.getLevelModel(node); + + if (levelModel) { + var r0_1 = levelModel.get('r0', true); + var r_1 = levelModel.get('r', true); + var radius_1 = levelModel.get('radius', true); + + if (radius_1 != null) { + r0_1 = radius_1[0]; + r_1 = radius_1[1]; + } + + r0_1 != null && (rStart = parsePercent$1(r0_1, size / 2)); + r_1 != null && (rEnd = parsePercent$1(r_1, size / 2)); + } + + node.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } // Render children + + + if (node.children && node.children.length) { + // currentAngle = startAngle; + var siblingAngle_1 = 0; + each(node.children, function (node) { + siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1); + }); + } + + return endAngle - startAngle; + }; // Virtual root node for roll up + + + if (renderRollupNode) { + var rStart = r0; + var rEnd = r0 + rPerLevel; + var angle = Math.PI * 2; + virtualRoot.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: startAngle + angle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + renderNode(treeRoot, startAngle); + }); + } + /** + * Init node children by order and update visual + */ + + function initChildren$1(node, sortOrder) { + var children = node.children || []; + node.children = sort$2(children, sortOrder); // Init children recursively + + if (children.length) { + each(node.children, function (child) { + initChildren$1(child, sortOrder); + }); + } + } + /** + * Sort children nodes + * + * @param {TreeNode[]} children children of node to be sorted + * @param {string | function | null} sort sort method + * See SunburstSeries.js for details. + */ + + + function sort$2(children, sortOrder) { + if (isFunction(sortOrder)) { + var sortTargets = map(children, function (child, idx) { + var value = child.getValue(); + return { + params: { + depth: child.depth, + height: child.height, + dataIndex: child.dataIndex, + getValue: function () { + return value; + } + }, + index: idx + }; + }); + sortTargets.sort(function (a, b) { + return sortOrder(a.params, b.params); + }); + return map(sortTargets, function (target) { + return children[target.index]; + }); + } else { + var isAsc_1 = sortOrder === 'asc'; + return children.sort(function (a, b) { + var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); + return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; + }); + } + } + + function sunburstVisual(ecModel) { + var paletteScope = {}; // Default color strategy + + function pickColor(node, seriesModel, treeHeight) { + // Choose color from palette based on the first level. + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope); + + if (node.depth > 1 && isString(color)) { + // Lighter on the deeper level. + color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5); + } + + return color; + } + + ecModel.eachSeriesByType('sunburst', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); + var style = model.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + style.fill = pickColor(node, seriesModel, tree.root.height); + } + + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function install$q(registers) { + registers.registerChartView(SunburstView); + registers.registerSeriesModel(SunburstSeriesModel); + registers.registerLayout(curry(sunburstLayout, 'sunburst')); + registers.registerProcessor(curry(dataFilter, 'sunburst')); + registers.registerVisual(sunburstVisual); + installSunburstAction(registers); + } + + // `visual('color') visual('borderColor')` is supported. + + var STYLE_VISUAL_TYPE = { + color: 'fill', + borderColor: 'stroke' + }; + var NON_STYLE_VISUAL_PROPS = { + symbol: 1, + symbolSize: 1, + symbolKeepAspect: 1, + legendIcon: 1, + visualMeta: 1, + liftZ: 1, + decal: 1 + }; + var customInnerStore = makeInner(); + + var CustomSeriesModel = + /** @class */ + function (_super) { + __extends(CustomSeriesModel, _super); + + function CustomSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomSeriesModel.type; + return _this; + } + + CustomSeriesModel.prototype.optionUpdated = function () { + this.currentZLevel = this.get('zlevel', true); + this.currentZ = this.get('z', true); + }; + + CustomSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this); + }; + + CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + el && (params.info = customInnerStore(el).info); + return params; + }; + + CustomSeriesModel.type = 'series.custom'; + CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + CustomSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Custom series will not clip by default. + // Some case will use custom series to draw label + // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight + clip: false // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + + }; + return CustomSeriesModel; + }(SeriesModel); + + function dataToCoordSize(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['x', 'y'], function (dim, dimIdx) { + var axis = this.getAxis(dim); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + }, this); + } + + function cartesianPrepareCustom(coordSys) { + var rect = coordSys.master.getRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'cartesian2d', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" param + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize, coordSys) + } + }; + } + + function dataToCoordSize$1(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } + + function geoPrepareCustom(coordSys) { + var rect = coordSys.getBoundingRect(); + return { + coordSys: { + type: 'geo', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + zoom: coordSys.getZoom() + }, + api: { + coord: function (data) { + // do not provide "out" and noRoam param, + // Compatible with this usage: + // echarts.util.map(item.points, api.coord) + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize$1, coordSys) + } + }; + } + + function dataToCoordSize$2(dataSize, dataItem) { + // dataItem is necessary in log axis. + var axis = this.getAxis(); + var val = dataItem instanceof Array ? dataItem[0] : dataItem; + var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + } + + function singlePrepareCustom(coordSys) { + var rect = coordSys.getRect(); + return { + coordSys: { + type: 'singleAxis', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (val) { + // do not provide "out" param + return coordSys.dataToPoint(val); + }, + size: bind(dataToCoordSize$2, coordSys) + } + }; + } + + function dataToCoordSize$3(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['Radius', 'Angle'], function (dim, dimIdx) { + var getterName = 'get' + dim + 'Axis'; // TODO: TYPE Check Angle Axis + + var axis = this[getterName](); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + + if (dim === 'Angle') { + result = result * Math.PI / 180; + } + + return result; + }, this); + } + + function polarPrepareCustom(coordSys) { + var radiusAxis = coordSys.getRadiusAxis(); + var angleAxis = coordSys.getAngleAxis(); + var radius = radiusAxis.getExtent(); + radius[0] > radius[1] && radius.reverse(); + return { + coordSys: { + type: 'polar', + cx: coordSys.cx, + cy: coordSys.cy, + r: radius[1], + r0: radius[0] + }, + api: { + coord: function (data) { + var radius = radiusAxis.dataToRadius(data[0]); + var angle = angleAxis.dataToAngle(data[1]); + var coord = coordSys.coordToPoint([radius, angle]); + coord.push(radius, angle * Math.PI / 180); + return coord; + }, + size: bind(dataToCoordSize$3, coordSys) + } + }; + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function calendarPrepareCustom(coordSys) { + var rect = coordSys.getRect(); + var rangeInfo = coordSys.getRangeInfo(); + return { + coordSys: { + type: 'calendar', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + cellWidth: coordSys.getCellWidth(), + cellHeight: coordSys.getCellHeight(), + rangeInfo: { + start: rangeInfo.start, + end: rangeInfo.end, + weeks: rangeInfo.weeks, + dayCount: rangeInfo.allDay + } + }, + api: { + coord: function (data, clamp) { + return coordSys.dataToPoint(data, clamp); + } + } + }; + } + + var deprecatedLogs = {}; + /** + * Whether need to call `convertEC4CompatibleStyle`. + */ + + function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) { + // Since echarts5, `RectText` is separated from its host element and style.text + // does not exist any more. The compat work brings some extra burden on performance. + // So we provide: + // `legacy: true` force make compat. + // `legacy: false`, force do not compat. + // `legacy` not set: auto detect whether legacy. + // But in this case we do not compat (difficult to detect and rare case): + // Becuse custom series and graphic component support "merge", users may firstly + // only set `textStrokeWidth` style or secondly only set `text`. + return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan' // Difficult to detect whether legacy for a "text" el. + && (elType === 'text' || hasOwn(style, 'text'))); + } + /** + * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format. + * @param hostStyle The properties might be modified. + * @return If be text el, `textContentStyle` and `textConfig` will not be returned. + * Otherwise a `textContentStyle` and `textConfig` will be created, whose props area + * retried from the `hostStyle`. + */ + + function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) { + var srcStyle = hostStyle; + var textConfig; + var textContent; + var textContentStyle; + + if (elType === 'text') { + textContentStyle = srcStyle; + } else { + textContentStyle = {}; + hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text); + hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich); + hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill); + hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke); + hasOwn(srcStyle, 'fontFamily') && (textContentStyle.fontFamily = srcStyle.fontFamily); + hasOwn(srcStyle, 'fontSize') && (textContentStyle.fontSize = srcStyle.fontSize); + hasOwn(srcStyle, 'fontStyle') && (textContentStyle.fontStyle = srcStyle.fontStyle); + hasOwn(srcStyle, 'fontWeight') && (textContentStyle.fontWeight = srcStyle.fontWeight); + textContent = { + type: 'text', + style: textContentStyle, + // ec4 does not support rectText trigger. + // And when text position is different in normal and emphasis + // => hover text trigger emphasis; + // => text position changed, leave mouse pointer immediately; + // That might cause incorrect state. + silent: true + }; + textConfig = {}; + var hasOwnPos = hasOwn(srcStyle, 'textPosition'); + + if (isNormal) { + textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside'; + } else { + hasOwnPos && (textConfig.position = srcStyle.textPosition); + } + + hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition); + hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset); + hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation); + hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance); + } + + convertEC4CompatibleRichItem(textContentStyle, hostStyle); + each(textContentStyle.rich, function (richItem) { + convertEC4CompatibleRichItem(richItem, richItem); + }); + return { + textConfig: textConfig, + textContent: textContent + }; + } + /** + * The result will be set to `out`. + */ + + function convertEC4CompatibleRichItem(out, richItem) { + if (!richItem) { + return; + } // (1) For simplicity, make textXXX properties (deprecated since ec5) has + // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10` + // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached + // richText in ec5. + // (2) `out === richItem` if and only if `out` is text el or rich item. + // So we can overwrite existing props in `out` since textXXX has higher priority. + + + richItem.font = richItem.textFont || richItem.font; + hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth); + hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign); + hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign); + hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight); + hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth); + hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight); + hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor); + hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding); + hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor); + hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth); + hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius); + hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor); + hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur); + hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX); + hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY); + } + /** + * Convert to pure echarts4 format style. + * `itemStyle` will be modified, added with ec4 style properties from + * `textStyle` and `textConfig`. + * + * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where + * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke. + */ + + + function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) { + var out = itemStl; // See `custom.ts`, a trick to set extra `textPosition` firstly. + + out.textPosition = out.textPosition || txCfg.position || 'inside'; + txCfg.offset != null && (out.textOffset = txCfg.offset); + txCfg.rotation != null && (out.textRotation = txCfg.rotation); + txCfg.distance != null && (out.textDistance = txCfg.distance); + var isInside = out.textPosition.indexOf('inside') >= 0; + var hostFill = itemStl.fill || '#000'; + convertToEC4RichItem(out, txStl); + var textFillNotSet = out.textFill == null; + + if (isInside) { + if (textFillNotSet) { + out.textFill = txCfg.insideFill || '#fff'; + !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke); + !out.textStroke && (out.textStroke = hostFill); + out.textStrokeWidth == null && (out.textStrokeWidth = 2); + } + } else { + if (textFillNotSet) { + out.textFill = itemStl.fill || txCfg.outsideFill || '#000'; + } + + !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke); + } + + out.text = txStl.text; + out.rich = txStl.rich; + each(txStl.rich, function (richItem) { + convertToEC4RichItem(richItem, richItem); + }); + return out; + } + + function convertToEC4RichItem(out, richItem) { + if (!richItem) { + return; + } + + hasOwn(richItem, 'fill') && (out.textFill = richItem.fill); + hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill); + hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth); + hasOwn(richItem, 'font') && (out.font = richItem.font); + hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle); + hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight); + hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize); + hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily); + hasOwn(richItem, 'align') && (out.textAlign = richItem.align); + hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign); + hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight); + hasOwn(richItem, 'width') && (out.textWidth = richItem.width); + hasOwn(richItem, 'height') && (out.textHeight = richItem.height); + hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor); + hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding); + hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor); + hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth); + hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius); + hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor); + hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur); + hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX); + hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY); + hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor); + hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur); + hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX); + hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY); + } + + function warnDeprecated(deprecated, insteadApproach) { + if ("development" !== 'production') { + var key = deprecated + '^_^' + insteadApproach; + + if (!deprecatedLogs[key]) { + console.warn("[ECharts] DEPRECATED: \"" + deprecated + "\" has been deprecated. " + insteadApproach); + deprecatedLogs[key] = true; + } + } + } + + var LEGACY_TRANSFORM_PROPS_MAP = { + position: ['x', 'y'], + scale: ['scaleX', 'scaleY'], + origin: ['originX', 'originY'] + }; + var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP); + var TRANSFORM_PROPS_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = 1; + return obj; + }, {}); + var transformPropNamesStr = TRANSFORMABLE_PROPS.join(', '); // '' means root + + var ELEMENT_ANIMATABLE_PROPS = ['', 'style', 'shape', 'extra']; + var transitionInnerStore = makeInner(); + + function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) { + var animationProp = animationType + "Animation"; + var config = getAnimationConfig(animationType, parentModel, dataIndex) || {}; + var userDuring = transitionInnerStore(el).userDuring; // Only set when duration is > 0 and it's need to be animated. + + if (config.duration > 0) { + // For simplicity, if during not specified, the previous during will not work any more. + config.during = userDuring ? bind(duringCall, { + el: el, + userDuring: userDuring + }) : null; + config.setToFinal = true; + config.scope = animationType; + } + + extend(config, elOption[animationProp]); + return config; + } + + function applyUpdateTransition(el, elOption, animatableModel, opts) { + opts = opts || {}; + var dataIndex = opts.dataIndex, + isInit = opts.isInit, + clearStyle = opts.clearStyle; + var hasAnimation = animatableModel.isAnimationEnabled(); // Save the meta info for further morphing. Like apply on the sub morphing elements. + + var store = transitionInnerStore(el); + var styleOpt = elOption.style; + store.userDuring = elOption.during; + var transFromProps = {}; + var propsToSet = {}; + prepareTransformAllPropsFinal(el, elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('shape', elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('extra', elOption, propsToSet); + + if (!isInit && hasAnimation) { + prepareTransformTransitionFrom(el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('shape', el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('extra', el, elOption, transFromProps); + prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps); + } + + propsToSet.style = styleOpt; + applyPropsDirectly(el, propsToSet, clearStyle); + applyMiscProps(el, elOption); + + if (hasAnimation) { + if (isInit) { + var enterFromProps_1 = {}; + each(ELEMENT_ANIMATABLE_PROPS, function (propName) { + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.enterFrom) { + if (propName) { + enterFromProps_1[propName] = enterFromProps_1[propName] || {}; + } + + extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom); + } + }); + var config = getElementAnimationConfig('enter', el, elOption, animatableModel, dataIndex); + + if (config.duration > 0) { + el.animateFrom(enterFromProps_1, config); + } + } else { + applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps); + } + } // Store leave to be used in leave transition. + + + updateLeaveTo(el, elOption); + styleOpt ? el.dirty() : el.markRedraw(); + } + function updateLeaveTo(el, elOption) { + // Try merge to previous set leaveTo + var leaveToProps = transitionInnerStore(el).leaveToProps; + + for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) { + var propName = ELEMENT_ANIMATABLE_PROPS[i]; + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.leaveTo) { + if (!leaveToProps) { + leaveToProps = transitionInnerStore(el).leaveToProps = {}; + } + + if (propName) { + leaveToProps[propName] = leaveToProps[propName] || {}; + } + + extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo); + } + } + } + function applyLeaveTransition(el, elOption, animatableModel, onRemove) { + if (el) { + var parent_1 = el.parent; + var leaveToProps = transitionInnerStore(el).leaveToProps; + + if (leaveToProps) { + // TODO TODO use leave after leaveAnimation in series is introduced + // TODO Data index? + var config = getElementAnimationConfig('update', el, elOption, animatableModel, 0); + + config.done = function () { + parent_1.remove(el); + onRemove && onRemove(); + }; + + el.animateTo(leaveToProps, config); + } else { + parent_1.remove(el); + onRemove && onRemove(); + } + } + } + function isTransitionAll(transition) { + return transition === 'all'; + } + + function applyPropsDirectly(el, // Can be null/undefined + allPropsFinal, clearStyle) { + var styleOpt = allPropsFinal.style; + + if (!el.isGroup && styleOpt) { + if (clearStyle) { + el.useStyle({}); // When style object changed, how to trade the existing animation? + // It is probably complicated and not needed to cover all the cases. + // But still need consider the case: + // (1) When using init animation on `style.opacity`, and before the animation + // ended users triggers an update by mousewhel. At that time the init + // animation should better be continued rather than terminated. + // So after `useStyle` called, we should change the animation target manually + // to continue the effect of the init animation. + // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need + // to update the value to `val2` and no animation declared, should be terminate + // the previous animation or just modify the target of the animation? + // Therotically That will happen not only on `style` but also on `shape` and + // `transfrom` props. But we haven't handle this case at present yet. + // (3) PENDING: Is it proper to visit `animators` and `targetName`? + + var animators = el.animators; + + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; // targetName is the "topKey". + + if (animator.targetName === 'style') { + animator.changeTarget(el.style); + } + } + } + + el.setStyle(styleOpt); + } + + if (allPropsFinal) { + // Not set style here. + allPropsFinal.style = null; // Set el to the final state firstly. + + allPropsFinal && el.attr(allPropsFinal); + allPropsFinal.style = styleOpt; + } + } + + function applyPropsTransition(el, elOption, dataIndex, model, // Can be null/undefined + transFromProps) { + if (transFromProps) { + var config = getElementAnimationConfig('update', el, elOption, model, dataIndex); + + if (config.duration > 0) { + el.animateFrom(transFromProps, config); + } + } + } + + function applyMiscProps(el, elOption) { + // Merge by default. + hasOwn(elOption, 'silent') && (el.silent = elOption.silent); + hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore); + + if (el instanceof Displayable) { + hasOwn(elOption, 'invisible') && (el.invisible = elOption.invisible); + } + + if (el instanceof Path) { + hasOwn(elOption, 'autoBatch') && (el.autoBatch = elOption.autoBatch); + } + } // Use it to avoid it be exposed to user. + + + var tmpDuringScope = {}; + var transitionDuringAPI = { + // Usually other props do not need to be changed in animation during. + setTransform: function (key, val) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.'); + } + + tmpDuringScope.el[key] = val; + return this; + }, + getTransform: function (key) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.'); + } + + return tmpDuringScope.el[key]; + }, + setShape: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var shape = el.shape || (el.shape = {}); + shape[key] = val; + el.dirtyShape && el.dirtyShape(); + return this; + }, + getShape: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var shape = tmpDuringScope.el.shape; + + if (shape) { + return shape[key]; + } + }, + setStyle: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var style = el.style; + + if (style) { + if ("development" !== 'production') { + if (eqNaN(val)) { + warn('style.' + key + ' must not be assigned with NaN.'); + } + } + + style[key] = val; + el.dirtyStyle && el.dirtyStyle(); + } + + return this; + }, + getStyle: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var style = tmpDuringScope.el.style; + + if (style) { + return style[key]; + } + }, + setExtra: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {}); + extra[key] = val; + return this; + }, + getExtra: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra; + + if (extra) { + return extra[key]; + } + } + }; + + function assertNotReserved(key) { + if ("development" !== 'production') { + if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') { + throw new Error('key must not be "' + key + '"'); + } + } + } + + function duringCall() { + // Do not provide "percent" until some requirements come. + // Because consider thies case: + // enterFrom: {x: 100, y: 30}, transition: 'x'. + // And enter duration is different from update duration. + // Thus it might be confused about the meaning of "percent" in during callback. + var scope = this; + var el = scope.el; + + if (!el) { + return; + } // If el is remove from zr by reason like legend, during still need to called, + // because el will be added back to zr and the prop value should not be incorrect. + + + var latestUserDuring = transitionInnerStore(el).userDuring; + var scopeUserDuring = scope.userDuring; // Ensured a during is only called once in each animation frame. + // If a during is called multiple times in one frame, maybe some users' calculation logic + // might be wrong (not sure whether this usage exists). + // The case of a during might be called twice can be: by default there is a animator for + // 'x', 'y' when init. Before the init animation finished, call `setOption` to start + // another animators for 'style'/'shape'/'extra'. + + if (latestUserDuring !== scopeUserDuring) { + // release + scope.el = scope.userDuring = null; + return; + } + + tmpDuringScope.el = el; // Give no `this` to user in "during" calling. + + scopeUserDuring(transitionDuringAPI); // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`, + // consider the issue that the prop might be incorrect when return to "normal" state. + } + + function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var elPropsInAttr = fromEl[mainAttr]; + var transFromPropsInAttr; + + if (elPropsInAttr) { + var transition = elOption.transition; + var attrTransition = attrOpt.transition; + + if (attrTransition) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + + if (isTransitionAll(attrTransition)) { + extend(transFromPropsInAttr, elPropsInAttr); + } else { + var transitionKeys = normalizeToArray(attrTransition); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = elPropsInAttr[key]; + transFromPropsInAttr[key] = elVal; + } + } + } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var elPropsInAttrKeys = keys(elPropsInAttr); + + for (var i = 0; i < elPropsInAttrKeys.length; i++) { + var key = elPropsInAttrKeys[i]; + var elVal = elPropsInAttr[key]; + + if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) { + transFromPropsInAttr[key] = elVal; + } + } + } + } + } + + function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var allPropsInAttr = allProps[mainAttr] = {}; + var keysInAttr = keys(attrOpt); + + for (var i = 0; i < keysInAttr.length; i++) { + var key = keysInAttr[i]; // To avoid share one object with different element, and + // to avoid user modify the object inexpectedly, have to clone. + + allPropsInAttr[key] = cloneValue(attrOpt[key]); + } + } + + function prepareTransformTransitionFrom(el, elOption, transFromProps) { + var transition = elOption.transition; + var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + + if (key === 'style' || key === 'shape' || key === 'extra') { + continue; + } + + var elVal = el[key]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.transition'); + } // Do not clone, animator will perform that clone. + + + transFromProps[key] = elVal; + } + } + + function prepareTransformAllPropsFinal(el, elOption, allProps) { + for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) { + var legacyName = LEGACY_TRANSFORM_PROPS[i]; + var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName]; + var legacyArr = elOption[legacyName]; + + if (legacyArr) { + allProps[xyName[0]] = legacyArr[0]; + allProps[xyName[1]] = legacyArr[1]; + } + } + + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var key = TRANSFORMABLE_PROPS[i]; + + if (elOption[key] != null) { + allProps[key] = elOption[key]; + } + } + } + + function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) { + if (!styleOpt) { + return; + } + + var fromElStyle = fromEl.style; + var transFromStyleProps; + + if (fromElStyle) { + var styleTransition = styleOpt.transition; + var elTransition = elOption.transition; + + if (styleTransition && !isTransitionAll(styleTransition)) { + var transitionKeys = normalizeToArray(styleTransition); + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = fromElStyle[key]; // Do not clone, see `checkNonStyleTansitionRefer`. + + transFromStyleProps[key] = elVal; + } + } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, 'style') >= 0)) { + var animationProps = fromEl.getAnimationStyleProps(); + var animationStyleProps = animationProps ? animationProps.style : null; + + if (animationStyleProps) { + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + var styleKeys = keys(styleOpt); + + for (var i = 0; i < styleKeys.length; i++) { + var key = styleKeys[i]; + + if (animationStyleProps[key]) { + var elVal = fromElStyle[key]; + transFromStyleProps[key] = elVal; + } + } + } + } + } + } + + function isNonStyleTransitionEnabled(optVal, elVal) { + // The same as `checkNonStyleTansitionRefer`. + return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal; + } + + var checkTransformPropRefer; + + if ("development" !== 'production') { + checkTransformPropRefer = function (key, usedIn) { + if (!hasOwn(TRANSFORM_PROPS_MAP, key)) { + warn('Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.'); + } + }; + } + + var getStateToRestore = makeInner(); + var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra']; + /** + * Stop previous keyframe animation and restore the attributes. + * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set. + */ + + function stopPreviousKeyframeAnimationAndRestore(el) { + // Stop previous keyframe animation. + el.stopAnimation('keyframe'); // Restore + + el.attr(getStateToRestore(el)); + } + function applyKeyframeAnimation(el, animationOpts, animatableModel) { + if (!animatableModel.isAnimationEnabled() || !animationOpts) { + return; + } + + if (isArray(animationOpts)) { + each(animationOpts, function (singleAnimationOpts) { + applyKeyframeAnimation(el, singleAnimationOpts, animatableModel); + }); + return; + } + + var keyframes = animationOpts.keyframes; + var duration = animationOpts.duration; + + if (animatableModel && duration == null) { + // Default to use duration of config. + // NOTE: animation config from payload will be ignored because they are mainly for transitions. + var config = getAnimationConfig('enter', animatableModel, 0); + duration = config && config.duration; + } + + if (!keyframes || !duration) { + return; + } + + var stateToRestore = getStateToRestore(el); + each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) { + if (targetPropName && !el[targetPropName]) { + return; + } + + var animator; + var endFrameIsSet = false; // Sort keyframes by percent. + + keyframes.sort(function (a, b) { + return a.percent - b.percent; + }); + each(keyframes, function (kf) { + // Stop current animation. + var animators = el.animators; + var kfValues = targetPropName ? kf[targetPropName] : kf; + + if ("development" !== 'production') { + if (kf.percent >= 1) { + endFrameIsSet = true; + } + } + + if (!kfValues) { + return; + } + + var propKeys = keys(kfValues); + + if (!targetPropName) { + // PENDING performance? + propKeys = filter(propKeys, function (key) { + return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0; + }); + } + + if (!propKeys.length) { + return; + } + + if (!animator) { + animator = el.animate(targetPropName, animationOpts.loop, true); + animator.scope = 'keyframe'; + } + + for (var i = 0; i < animators.length; i++) { + // Stop all other animation that is not keyframe. + if (animators[i] !== animator && animators[i].targetName === animator.targetName) { + animators[i].stopTracks(propKeys); + } + } + + targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {}); + var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore; + each(propKeys, function (key) { + // Save original value. + savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key]; + }); + animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing); + }); + + if (!animator) { + return; + } + + if ("development" !== 'production') { + if (!endFrameIsSet) { + warn('End frame with percent: 1 is missing in the keyframeAnimation.', true); + } + } + + animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing); + }); + } + + var EMPHASIS = 'emphasis'; + var NORMAL = 'normal'; + var BLUR = 'blur'; + var SELECT = 'select'; + var STATES = [NORMAL, EMPHASIS, BLUR, SELECT]; + var PATH_ITEM_STYLE = { + normal: ['itemStyle'], + emphasis: [EMPHASIS, 'itemStyle'], + blur: [BLUR, 'itemStyle'], + select: [SELECT, 'itemStyle'] + }; + var PATH_LABEL = { + normal: ['label'], + emphasis: [EMPHASIS, 'label'], + blur: [BLUR, 'label'], + select: [SELECT, 'label'] + }; + var DEFAULT_TRANSITION = ['x', 'y']; // Use prefix to avoid index to be the same as el.name, + // which will cause weird update animation. + + var GROUP_DIFF_PREFIX = 'e\0\0'; + var attachedTxInfoTmp = { + normal: {}, + emphasis: {}, + blur: {}, + select: {} + }; + /** + * To reduce total package size of each coordinate systems, the modules `prepareCustom` + * of each coordinate systems are not required by each coordinate systems directly, but + * required by the module `custom`. + * + * prepareInfoForCustomSeries {Function}: optional + * @return {Object} {coordSys: {...}, api: { + * coord: function (data, clamp) {}, // return point in global. + * size: function (dataSize, dataItem) {} // return size of each axis in coordSys. + * }} + */ + + var prepareCustoms = { + cartesian2d: cartesianPrepareCustom, + geo: geoPrepareCustom, + single: singlePrepareCustom, + polar: polarPrepareCustom, + calendar: calendarPrepareCustom + }; + + function isPath$1(el) { + return el instanceof Path; + } + + function isDisplayable(el) { + return el instanceof Displayable; + } + + function copyElement(sourceEl, targetEl) { + targetEl.copyTransform(sourceEl); + + if (isDisplayable(targetEl) && isDisplayable(sourceEl)) { + targetEl.setStyle(sourceEl.style); + targetEl.z = sourceEl.z; + targetEl.z2 = sourceEl.z2; + targetEl.zlevel = sourceEl.zlevel; + targetEl.invisible = sourceEl.invisible; + targetEl.ignore = sourceEl.ignore; + + if (isPath$1(targetEl) && isPath$1(sourceEl)) { + targetEl.setShape(sourceEl.shape); + } + } + } + + var CustomChartView = + /** @class */ + function (_super) { + __extends(CustomChartView, _super); + + function CustomChartView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomChartView.type; + return _this; + } + + CustomChartView.prototype.render = function (customSeries, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var oldData = this._data; + var data = customSeries.getData(); + var group = this.group; + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + + if (!oldData) { + // Previous render is incremental render or first render. + // Needs remove the incremental rendered elements. + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && applyLeaveTransition(el, customInnerStore(el).option, customSeries); + }).update(function (newIdx, oldIdx) { + var oldEl = oldData.getItemGraphicEl(oldIdx); + createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).execute(); // Do clipping + + var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + + this._data = data; + }; + + CustomChartView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) { + this.group.removeAll(); + this._data = null; + }; + + CustomChartView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) { + var data = customSeries.getData(); + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + var progressiveEls = this._progressiveEls = []; + + function setIncrementalAndHoverLayer(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = params.start; idx < params.end; idx++) { + var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data); + + if (el) { + el.traverse(setIncrementalAndHoverLayer); + progressiveEls.push(el); + } + } + }; + + CustomChartView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CustomChartView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) { + var elementName = query.element; + + if (elementName == null || targetEl.name === elementName) { + return true; + } // Enable to give a name on a group made by `renderItem`, and listen + // events that are triggered by its descendents. + + + while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) { + if (targetEl.name === elementName) { + return true; + } + } + + return false; + }; + + CustomChartView.type = 'custom'; + return CustomChartView; + }(ChartView); + + function createEl(elOption) { + var graphicType = elOption.type; + var el; // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + + if (graphicType === 'path') { + var shape = elOption.shape; // Using pathRect brings convenience to users sacle svg path. + + var pathRect = shape.width != null && shape.height != null ? { + x: shape.x || 0, + y: shape.y || 0, + width: shape.width, + height: shape.height + } : null; + var pathData = getPathData(shape); // Path is also used for icon, so layout 'center' by default. + + el = makePath(pathData, null, pathRect, shape.layout || 'center'); + customInnerStore(el).customPathData = pathData; + } else if (graphicType === 'image') { + el = new ZRImage({}); + customInnerStore(el).customImagePath = elOption.style.image; + } else if (graphicType === 'text') { + el = new ZRText({}); // customInnerStore(el).customText = (elOption.style as TextStyleProps).text; + } else if (graphicType === 'group') { + el = new Group(); + } else if (graphicType === 'compoundPath') { + throw new Error('"compoundPath" is not supported yet.'); + } else { + var Clz = getShapeClass(graphicType); + + if (!Clz) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'graphic type "' + graphicType + '" can not be found.'; + } + + throwError(errMsg); + } + + el = new Clz(); + } + + customInnerStore(el).customGraphicType = graphicType; + el.name = elOption.name; // Compat ec4: the default z2 lift is 1. If changing the number, + // some cases probably be broken: hierarchy layout along z, like circle packing, + // where emphasis only intending to modify color/border rather than lift z2. + + el.z2EmphasisLift = 1; + el.z2SelectLift = 1; + return el; + } + + function updateElNormal( // Can be null/undefined + api, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) { + // Stop and restore before update any other attributes. + stopPreviousKeyframeAnimationAndRestore(el); + var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg; + + if (txCfgOpt) { + // PENDING: whether use user object directly rather than clone? + // TODO:5.0 textConfig transition animation? + el.setTextConfig(txCfgOpt); + } // Default transition ['x', 'y'] + + + if (elOption && elOption.transition == null) { + elOption.transition = DEFAULT_TRANSITION; + } // Do some normalization on style. + + + var styleOpt = elOption && elOption.style; + + if (styleOpt) { + if (el.type === 'text') { + var textOptionStyle = styleOpt; // Compatible with ec4: if `textFill` or `textStroke` exists use them. + + hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill); + hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke); + } + + var decalPattern = void 0; + var decalObj = isPath$1(el) ? styleOpt.decal : null; + + if (api && decalObj) { + decalObj.dirty = true; + decalPattern = createOrUpdatePatternFromDecal(decalObj, api); + } // Always overwrite in case user specify this prop. + + + styleOpt.__decalPattern = decalPattern; + } + + if (isDisplayable(el)) { + if (styleOpt) { + var decalPattern = styleOpt.__decalPattern; + + if (decalPattern) { + styleOpt.decal = decalPattern; + } + } + } + + applyUpdateTransition(el, elOption, seriesModel, { + dataIndex: dataIndex, + isInit: isInit, + clearStyle: true + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel); + } + + function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) { + var elDisplayable = el.isGroup ? null : el; + var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg; // PENDING:5.0 support customize scale change and transition animation? + + if (elDisplayable) { + // By default support auto lift color when hover whether `emphasis` specified. + var stateObj = elDisplayable.ensureState(state); + + if (styleOpt === false) { + var existingEmphasisState = elDisplayable.getState(state); + + if (existingEmphasisState) { + existingEmphasisState.style = null; + } + } else { + // style is needed to enable default emphasis. + stateObj.style = styleOpt || null; + } // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`, + // remove hover style. + // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not + // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined. + + + if (txCfgOpt) { + stateObj.textConfig = txCfgOpt; + } + + setDefaultStateProxy(elDisplayable); + } + } + + function updateZ$1(el, elOption, seriesModel) { + // Group not support textContent and not support z yet. + if (el.isGroup) { + return; + } + + var elDisplayable = el; + var currentZ = seriesModel.currentZ; + var currentZLevel = seriesModel.currentZLevel; // Always erase. + + elDisplayable.z = currentZ; + elDisplayable.zlevel = currentZLevel; // z2 must not be null/undefined, otherwise sort error may occur. + + var optZ2 = elOption.z2; + optZ2 != null && (elDisplayable.z2 = optZ2 || 0); + + for (var i = 0; i < STATES.length; i++) { + updateZForEachState(elDisplayable, elOption, STATES[i]); + } + } + + function updateZForEachState(elDisplayable, elOption, state) { + var isNormal = state === NORMAL; + var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state); + var optZ2 = elStateOpt ? elStateOpt.z2 : null; + var stateObj; + + if (optZ2 != null) { + // Do not `ensureState` until required. + stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state); + stateObj.z2 = optZ2 || 0; + } + } + + function makeRenderItem(customSeries, data, ecModel, api) { + var renderItem = customSeries.get('renderItem'); + var coordSys = customSeries.coordinateSystem; + var prepareResult = {}; + + if (coordSys) { + if ("development" !== 'production') { + assert(renderItem, 'series.render is required.'); + assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.'); + } // `coordSys.prepareCustoms` is used for external coord sys like bmap. + + + prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys); + } + + var userAPI = defaults({ + getWidth: api.getWidth, + getHeight: api.getHeight, + getZr: api.getZr, + getDevicePixelRatio: api.getDevicePixelRatio, + value: value, + style: style, + ordinalRawValue: ordinalRawValue, + styleEmphasis: styleEmphasis, + visual: visual, + barLayout: barLayout, + currentSeriesIndices: currentSeriesIndices, + font: font + }, prepareResult.api || {}); + var userParams = { + // The life cycle of context: current round of rendering. + // The global life cycle is probably not necessary, because + // user can store global status by themselves. + context: {}, + seriesId: customSeries.id, + seriesName: customSeries.name, + seriesIndex: customSeries.seriesIndex, + coordSys: prepareResult.coordSys, + dataInsideLength: data.count(), + encode: wrapEncodeDef(customSeries.getData()) + }; // If someday intending to refactor them to a class, should consider do not + // break change: currently these attribute member are encapsulated in a closure + // so that do not need to force user to call these method with a scope. + // Do not support call `api` asynchronously without dataIndexInside input. + + var currDataIndexInside; + var currItemModel; + var currItemStyleModels = {}; + var currLabelModels = {}; + var seriesItemStyleModels = {}; + var seriesLabelModels = {}; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]); + seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]); + } + + function getItemModel(dataIndexInside) { + return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside); + } + + function getItemStyleModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]); + } + + function getLabelModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]); + } + + return function (dataIndexInside, payload) { + currDataIndexInside = dataIndexInside; + currItemModel = null; + currItemStyleModels = {}; + currLabelModels = {}; + return renderItem && renderItem(defaults({ + dataIndexInside: dataIndexInside, + dataIndex: data.getRawIndex(dataIndexInside), + // Can be used for optimization when zoom or roam. + actionType: payload ? payload.type : null + }, userParams), userAPI); + }; + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + function value(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside); + } + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function ordinalRawValue(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + dim = dim || 0; + var dimInfo = data.getDimensionInfo(dim); + + if (!dimInfo) { + var dimIndex = data.getDimensionIndex(dim); + return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : undefined; + } + + var val = data.get(dimInfo.name, dataIndexInside); + var ordinalMeta = dimInfo && dimInfo.ordinalMeta; + return ordinalMeta ? ordinalMeta.categories[val] : val; + } + /** + * @deprecated The original intention of `api.style` is enable to set itemStyle + * like other series. But it is not necessary and not easy to give a strict definition + * of what it returns. And since echarts5 it needs to be make compat work. So + * deprecates it since echarts5. + * + * By default, `visual` is applied to style (to support visualMap). + * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`, + * it can be implemented as: + * `api.style({stroke: api.visual('color'), fill: null})`; + * + * [Compat]: since ec5, RectText has been separated from its hosts el. + * so `api.style()` will only return the style from `itemStyle` but not handle `label` + * any more. But `series.label` config is never published in doc. + * We still compat it in `api.style()`. But not encourage to use it and will still not + * to pulish it to doc. + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function style(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.style', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var style = data.getItemVisual(dataIndexInside, 'style'); + var visualColor = style && style.fill; + var opacity = style && style.opacity; + var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle(); + visualColor != null && (itemStyle.fill = visualColor); + opacity != null && (itemStyle.opacity = opacity); + var opt = { + inheritColor: isString(visualColor) ? visualColor : '#000' + }; + var labelModel = getLabelModel(dataIndexInside, NORMAL); // Now that the feature of "auto adjust text fill/stroke" has been migrated to zrender + // since ec5, we should set `isAttached` as `false` here and make compat in + // `convertToEC4StyleForCustomSerise`. + + var textStyle = createTextStyle(labelModel, null, opt, false, true); + textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, opt, false); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + /** + * @deprecated The reason see `api.style()` + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function styleEmphasis(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle(); + var labelModel = getLabelModel(dataIndexInside, EMPHASIS); + var textStyle = createTextStyle(labelModel, null, null, true, true); + textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, null, true); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + + function applyUserPropsAfter(itemStyle, extra) { + for (var key in extra) { + if (hasOwn(extra, key)) { + itemStyle[key] = extra[key]; + } + } + } + + function preFetchFromExtra(extra, itemStyle) { + // A trick to retrieve those props firstly, which are used to + // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`. + // (It's not reasonable but only for a degree of compat) + if (extra) { + extra.textFill && (itemStyle.textFill = extra.textFill); + extra.textPosition && (itemStyle.textPosition = extra.textPosition); + } + } + /** + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function visual(visualType, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + + if (hasOwn(STYLE_VISUAL_TYPE, visualType)) { + var style_1 = data.getItemVisual(dataIndexInside, 'style'); + return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null; + } // Only support these visuals. Other visual might be inner tricky + // for performance (like `style`), do not expose to users. + + + if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) { + return data.getItemVisual(dataIndexInside, visualType); + } + } + /** + * @public + * @return If not support, return undefined. + */ + + + function barLayout(opt) { + if (coordSys.type === 'cartesian2d') { + var baseAxis = coordSys.getBaseAxis(); + return getLayoutOnAxis(defaults({ + axis: baseAxis + }, opt)); + } + } + /** + * @public + */ + + + function currentSeriesIndices() { + return ecModel.getCurrentSeriesIndices(); + } + /** + * @public + * @return font string + */ + + + function font(opt) { + return getFont(opt, ecModel); + } + } + + function wrapEncodeDef(data) { + var encodeDef = {}; + each(data.dimensions, function (dimName) { + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isExtraCoord) { + var coordDim = dimInfo.coordDim; + var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; + dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName); + } + }); + return encodeDef; + } + + function createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) { + // [Rule] + // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing. + // (It seems that violate the "merge" principle, but most of users probably intuitively + // regard "return;" as "show nothing element whatever", so make a exception to meet the + // most cases.) + // The rule or "merge" see [STRATEGY_MERGE]. + // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing). + if (!elOption) { + group.remove(existsEl); + return; + } + + var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group); + el && data.setItemGraphicEl(dataIndex, el); + el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled); + return el; + } + + function doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) { + if ("development" !== 'production') { + assert(elOption, 'should not have an null/undefined element setting'); + } + + var toBeReplacedIdx = -1; + var oldEl = existsEl; + + if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel) // || ( + // // PENDING: even in one-to-one mapping case, if el is marked as morph, + // // do not sure whether the el will be mapped to another el with different + // // hierarchy in Group tree. So always recreate el rather than reuse the el. + // morphHelper && morphHelper.isOneToOneFrom(el) + // ) + ) { + // Should keep at the original index, otherwise "merge by index" will be incorrect. + toBeReplacedIdx = indexOf(group.childrenRef(), existsEl); + existsEl = null; + } + + var isInit = !existsEl; + var el = existsEl; + + if (!el) { + el = createEl(elOption); + + if (oldEl) { + copyElement(oldEl, el); + } + } else { + // FIMXE:NEXT unified clearState? + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + el.clearStates(); + } // Need to set morph: false explictly to disable automatically morphing. + + + if (elOption.morph === false) { + el.disableMorphing = true; + } else if (el.disableMorphing) { + el.disableMorphing = false; + } + + attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null; + attachedTxInfoTmp.isLegacy = false; + doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp); + doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit); + updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit); // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + // Update them only when user specified, otherwise, remain. + + hasOwn(elOption, 'info') && (customInnerStore(el).info = elOption.info); + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var otherStateOpt = retrieveStateOption(elOption, stateName); + var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName); + updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp); + } + } + + updateZ$1(el, elOption, seriesModel); + + if (elOption.type === 'group') { + mergeChildren(api, el, dataIndex, elOption, seriesModel); + } + + if (toBeReplacedIdx >= 0) { + group.replaceAt(el, toBeReplacedIdx); + } else { + group.add(el); + } + + return el; + } // `el` must not be null/undefined. + + + function doesElNeedRecreate(el, elOption, seriesModel) { + var elInner = customInnerStore(el); + var elOptionType = elOption.type; + var elOptionShape = elOption.shape; + var elOptionStyle = elOption.style; + return (// Always create new if universal transition is enabled. + // Because we do transition after render. It needs to know what old element is. Replacement will loose it. + seriesModel.isUniversalTransitionEnabled() // If `elOptionType` is `null`, follow the merge principle. + || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath // // FIXME test and remove this restriction? + // || (elOptionType === 'text' + // && hasOwn(elOptionStyle, 'text') + // && (elOptionStyle as TextStyleProps).text !== elInner.customText + // ) + + ); + } + + function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) { + // Based on the "merge" principle, if no clipPath provided, + // do nothing. The exists clip will be totally removed only if + // `el.clipPath` is `false`. Otherwise it will be merged/replaced. + var clipPathOpt = elOption.clipPath; + + if (clipPathOpt === false) { + if (el && el.getClipPath()) { + el.removeClipPath(); + } + } else if (clipPathOpt) { + var clipPath = el.getClipPath(); + + if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) { + clipPath = null; + } + + if (!clipPath) { + clipPath = createEl(clipPathOpt); + + if ("development" !== 'production') { + assert(isPath$1(clipPath), 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.'); + } + + el.setClipPath(clipPath); + } + + updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit); + } // If not define `clipPath` in option, do nothing unnecessary. + + } + + function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) { + // Group does not support textContent temporarily until necessary. + if (el.isGroup) { + return; + } // Normal must be called before emphasis, for `isLegacy` detection. + + + processTxInfo(elOption, null, attachedTxInfo); + processTxInfo(elOption, EMPHASIS, attachedTxInfo); // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sense. + // So for simplicity, if "elOption hasOwnProperty of them but be null/undefined", we do not + // trade them as set to null to el. + // Especially: + // `elOption.textContent: false` means remove textContent. + // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state. + + var txConOptNormal = attachedTxInfo.normal.conOpt; + var txConOptEmphasis = attachedTxInfo.emphasis.conOpt; + var txConOptBlur = attachedTxInfo.blur.conOpt; + var txConOptSelect = attachedTxInfo.select.conOpt; + + if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) { + var textContent = el.getTextContent(); + + if (txConOptNormal === false) { + textContent && el.removeTextContent(); + } else { + txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || { + type: 'text' + }; + + if (!textContent) { + textContent = createEl(txConOptNormal); + el.setTextContent(textContent); + } else { + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + textContent.clearStates(); + } + + updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit); + var txConStlOptNormal = txConOptNormal && txConOptNormal.style; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var txConOptOtherState = attachedTxInfo[stateName].conOpt; + updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null); + } + } + + txConStlOptNormal ? textContent.dirty() : textContent.markRedraw(); + } + } + } + + function processTxInfo(elOption, state, attachedTxInfo) { + var stateOpt = !state ? elOption : retrieveStateOption(elOption, state); + var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS); + var elType = elOption.type; + var txCfg = stateOpt ? stateOpt.textConfig : null; + var txConOptNormal = elOption.textContent; + var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state); + + if (styleOpt && ( // Because emphasis style has little info to detect legacy, + // if normal is legacy, emphasis is trade as legacy. + attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) { + attachedTxInfo.isLegacy = true; + var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state); // Explicitly specified `textConfig` and `textContent` has higher priority than + // the ones generated by legacy style. Otherwise if users use them and `api.style` + // at the same time, they not both work and hardly to known why. + + if (!txCfg && convertResult.textConfig) { + txCfg = convertResult.textConfig; + } + + if (!txConOpt && convertResult.textContent) { + txConOpt = convertResult.textContent; + } + } + + if (!state && txConOpt) { + var txConOptNormal_1 = txConOpt; // `textContent: {type: 'text'}`, the "type" is easy to be missing. So we tolerate it. + + !txConOptNormal_1.type && (txConOptNormal_1.type = 'text'); + + if ("development" !== 'production') { + // Do not tolerate incorrcet type for forward compat. + assert(txConOptNormal_1.type === 'text', 'textContent.type must be "text"'); + } + } + + var info = !state ? attachedTxInfo.normal : attachedTxInfo[state]; + info.cfg = txCfg; + info.conOpt = txConOpt; + } + + function retrieveStateOption(elOption, state) { + return !state ? elOption : elOption ? elOption[state] : null; + } + + function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) { + var style = stateOption && stateOption.style; + + if (style == null && state === EMPHASIS && stateOptionNormal) { + style = stateOptionNormal.styleEmphasis; + } + + return style; + } // Usage: + // (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates + // that the existing children will not be removed, and enables the feature + // that update some of the props of some of the children simply by construct + // the returned children of `renderItem` like: + // `var children = group.children = []; children[3] = {opacity: 0.5};` + // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children + // by child.name. But that might be lower performance. + // (3) If `elOption.$mergeChildren` is `false`, the existing children will be + // replaced totally. + // (4) If `!elOption.children`, following the "merge" principle, nothing will + // happen. + // (5) If `elOption.$mergeChildren` is not `false` neither `'byName'` and the + // `el` is a group, and if any of the new child is null, it means to remove + // the element at the same index, if exists. On the other hand, if the new + // child is and empty object `{}`, it means to keep the element not changed. + // + // For implementation simpleness, do not provide a direct way to remove single + // child (otherwise the total indices of the children array have to be modified). + // User can remove a single child by setting its `ignore` to `true`. + + + function mergeChildren(api, el, dataIndex, elOption, seriesModel) { + var newChildren = elOption.children; + var newLen = newChildren ? newChildren.length : 0; + var mergeChildren = elOption.$mergeChildren; // `diffChildrenByName` has been deprecated. + + var byName = mergeChildren === 'byName' || elOption.diffChildrenByName; + var notMerge = mergeChildren === false; // For better performance on roam update, only enter if necessary. + + if (!newLen && !byName && !notMerge) { + return; + } + + if (byName) { + diffGroupChildren({ + api: api, + oldChildren: el.children() || [], + newChildren: newChildren || [], + dataIndex: dataIndex, + seriesModel: seriesModel, + group: el + }); + return; + } + + notMerge && el.removeAll(); // Mapping children of a group simply by index, which + // might be better performance. + + var index = 0; + + for (; index < newLen; index++) { + var newChild = newChildren[index]; + var oldChild = el.childAt(index); + + if (newChild) { + if (newChild.ignore == null) { + // The old child is set to be ignored if null (see comments + // below). So we need to set ignore to be false back. + newChild.ignore = false; + } + + doCreateOrUpdateEl(api, oldChild, dataIndex, newChild, seriesModel, el); + } else { + if ("development" !== 'production') { + assert(oldChild, 'renderItem should not return a group containing elements' + ' as null/undefined/{} if they do not exist before.'); + } // If the new element option is null, it means to remove the old + // element. But we cannot really remove the element from the group + // directly, because the element order may not be stable when this + // element is added back. So we set the element to be ignored. + + + oldChild.ignore = true; + } + } + + for (var i = el.childCount() - 1; i >= index; i--) { + var child = el.childAt(i); + removeChildFromGroup(el, child, seriesModel); + } + } + + function removeChildFromGroup(group, child, seriesModel) { + // Do not support leave elements that are not mentioned in the latest + // `renderItem` return. Otherwise users may not have a clear and simple + // concept that how to control all of the elements. + child && applyLeaveTransition(child, customInnerStore(group).option, seriesModel); + } + + function diffGroupChildren(context) { + new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute(); + } + + function getKey(item, idx) { + var name = item && item.name; + return name != null ? name : GROUP_DIFF_PREFIX + idx; + } + + function processAddUpdate(newIndex, oldIndex) { + var context = this.context; + var childOption = newIndex != null ? context.newChildren[newIndex] : null; + var child = oldIndex != null ? context.oldChildren[oldIndex] : null; + doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group); + } + + function processRemove(oldIndex) { + var context = this.context; + var child = context.oldChildren[oldIndex]; + child && applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); + } + /** + * @return SVG Path data. + */ + + + function getPathData(shape) { + // "d" follows the SVG convention. + return shape && (shape.pathData || shape.d); + } + + function hasOwnPathData(shape) { + return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd')); + } + + function install$r(registers) { + registers.registerChartView(CustomChartView); + registers.registerSeriesModel(CustomSeriesModel); + } + + var inner$a = makeInner(); + var clone$3 = clone; + var bind$1 = bind; + /** + * Base axis pointer class in 2D. + */ + + var BaseAxisPointer = + /** @class */ + function () { + function BaseAxisPointer() { + this._dragging = false; + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + */ + + this.animationThreshold = 15; + } + /** + * @implement + */ + + + BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; // Optimize: `render` will be called repeatedly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + + if (!forceRender && this._lastValue === value && this._lastStatus === status) { + return; + } + + this._lastValue = value; + this._lastStatus = status; + var group = this._group; + var handle = this._handle; + + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + + group && group.show(); + handle && handle.show(); // Otherwise status is 'show' + + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); // Enable change axis pointer type. + + var graphicKey = elOption.graphicKey; + + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + + this._lastGraphicKey = graphicKey; + var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); + + if (!group) { + group = this._group = new Group(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } else { + var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + + updateMandatoryProps(group, axisPointerModel, true); + + this._renderHandle(value); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.remove = function (api) { + this.clear(api); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.dispose = function (api) { + this.clear(api); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); // Value axis without snap always do not snap. + + if (!useSnap && !isCategoryAxis) { + return false; + } + + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + + + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); // Approximate band width + + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + + return false; + } + + return animation === true; + }; + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + + + BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {// Should be implemenented by sub-class. + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + + if (pointerOption) { + var pointerEl = inner$a(group).pointerEl = new graphic[pointerOption.type](clone$3(elOption.pointer)); + group.add(pointerEl); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$a(group).labelEl = new ZRText(clone$3(elOption.label)); + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { + var pointerEl = inner$a(group).pointerEl; + + if (pointerEl && elOption.pointer) { + pointerEl.setStyle(elOption.pointer.style); + updateProps(pointerEl, { + shape: elOption.pointer.shape + }); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { + var labelEl = inner$a(group).labelEl; + + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + // TODOTODO + // shape: elOption.label.shape, + x: elOption.label.x, + y: elOption.label.y + }); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @private + */ + + + BaseAxisPointer.prototype._renderHandle = function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + + var axisPointerModel = this._axisPointerModel; + + var zr = this._api.getZr(); + + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + var status = axisPointerModel.get('status'); + + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + + var isInit; + + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon(handleModel.get('icon'), { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind$1(this._onHandleDragMove, this, 0, 0), + drift: bind$1(this._onHandleDragMove, this), + ondragend: bind$1(this._onHandleDragEnd, this) + }); + zr.add(handle); + } + + updateMandatoryProps(handle, axisPointerModel, false); // update style + + handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); // update position + + var handleSize = handleModel.get('size'); + + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + + handle.scaleX = handleSize[0] / 2; + handle.scaleY = handleSize[1] / 2; + createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); + + this._moveHandleToValue(value, isInit); + }; + + BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { + updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); + }; + + BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { + var handle = this._handle; + + if (!handle) { + return; + } + + this._dragging = true; // Persistent for throttle. + + var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); + this._payloadInfo = trans; + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$a(handle).lastProp = null; + + this._doDispatchAxisPointer(); + }; + /** + * Throttled method. + */ + + + BaseAxisPointer.prototype._doDispatchAxisPointer = function () { + var handle = this._handle; + + if (!handle) { + return; + } + + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }; + + BaseAxisPointer.prototype._onHandleDragEnd = function () { + this._dragging = false; + var handle = this._handle; + + if (!handle) { + return; + } + + var value = this._axisPointerModel.get('value'); // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + + + this._moveHandleToValue(value); // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + + + this._api.dispatchAction({ + type: 'hideTip' + }); + }; + /** + * @private + */ + + + BaseAxisPointer.prototype.clear = function (api) { + this._lastValue = null; + this._lastStatus = null; + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + + clear(this, '_doDispatchAxisPointer'); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.doClear = function () {// Implemented by sub-class if necessary. + }; + + BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + }; + + return BaseAxisPointer; + }(); + + function updateProps$1(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$a(el).lastProp, props)) { + inner$a(el).lastProp = props; + moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); + } + } + + function propsEqual(lastProps, newProps) { + if (isObject(lastProps) && isObject(newProps)) { + var equals_1 = true; + each(newProps, function (item, key) { + equals_1 = equals_1 && propsEqual(lastProps[key], item); + }); + return !!equals_1; + } else { + return lastProps === newProps; + } + } + + function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); + } + + function getHandleTransProps(trans) { + return { + x: trans.x || 0, + y: trans.y || 0, + rotation: trans.rotation || 0 + }; + } + + function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); + } + + function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + + return style; + } + /** + * @param {Function} labelPos {align, verticalAlign, position} + */ + + function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { + var value = axisPointerModel.get('value'); + var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray$1(labelModel.get('padding') || 0); + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align. + + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container + + confineInContainer(position, width, height, api); + var bgColor = labelModel.get('backgroundColor'); + + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']); + } + + elOption.label = { + // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + x: position[0], + y: position[1], + style: createTextStyle(labelModel, { + text: text, + font: font, + fill: labelModel.getTextColor(), + padding: paddings, + backgroundColor: bgColor + }), + // Label should be over axisPointer. + z2: 10 + }; + } // Do not overflow ec container + + function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); + } + + function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel({ + value: value + }, { + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + precision: opt.precision + }); + var formatter = opt.formatter; + + if (formatter) { + var params_1 = { + value: getAxisRawValue(axis, { + value: value + }), + axisDimension: axis.dim, + axisIndex: axis.index, + seriesData: [] + }; + each(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params_1.seriesData.push(dataParams); + }); + + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } else if (isFunction(formatter)) { + text = formatter(params_1); + } + } + + return text; + } + function getTransformedPosition(axis, value, layoutInfo) { + var transform = create$1(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform); + } + function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { + // @ts-ignore + var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); + layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); + } + function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; + } + function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + } + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + var CartesianAxisPointer = + /** @class */ + function (_super) { + __extends(CartesianAxisPointer, _super); + + function CartesianAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$1(grid.model, axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: pos[0], + y: pos[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; // Make tooltip do not overlap axisPointer and in the middle of the grid. + + var tooltipOptions = [{ + verticalAlign: 'middle' + }, { + align: 'center' + }]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + }; + + return CartesianAxisPointer; + }(BaseAxisPointer); + + function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); + } + + var pointerShapeBuilder = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) + }; + } + }; + + function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; + } + + var AxisPointerModel = + /** @class */ + function (_super) { + __extends(AxisPointerModel, _super); + + function AxisPointerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerModel.type; + return _this; + } + + AxisPointerModel.type = 'axisPointer'; + AxisPointerModel.defaultOption = { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + // zlevel: 0, + z: 50, + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + value: null, + status: null, + link: [], + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + lineStyle: { + color: '#B9BEC9', + width: 1, + type: 'dashed' + }, + shadowStyle: { + color: 'rgba(210,219,238,0.2)' + }, + label: { + show: true, + formatter: null, + precision: 'auto', + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: false, + // eslint-disable-next-line + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + // For mobile performance + throttle: 40 + } + }; + return AxisPointerModel; + }(ComponentModel); + + var inner$b = makeInner(); + var each$7 = each; + /** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.} point + */ + + function register(key, api, handler) { + if (env.node) { + return; + } + + var zr = api.getZr(); + inner$b(zr).records || (inner$b(zr).records = {}); + initGlobalListeners(zr, api); + var record = inner$b(zr).records[key] || (inner$b(zr).records[key] = {}); + record.handler = handler; + } + + function initGlobalListeners(zr, api) { + if (inner$b(zr).initialized) { + return; + } + + inner$b(zr).initialized = true; + useHandler('click', curry(doEnter, 'click')); + useHandler('mousemove', curry(doEnter, 'mousemove')); // useHandler('mouseout', onLeave); + + useHandler('globalout', onLeave); + + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction(api); + each$7(inner$b(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + dispatchTooltipFinally(dis.pendings, api); + }); + } + } + + function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + var actuallyPayload; + + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } + } + + function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); + } + + function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); + } + + function makeDispatchAction(api) { + var pendings = { + showTip: [], + hideTip: [] + }; // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + + if (pendingList) { + pendingList.push(payload); + } else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + + return { + dispatchAction: dispatchAction, + pendings: pendings + }; + } + + function unregister(key, api) { + if (env.node) { + return; + } + + var zr = api.getZr(); + var record = (inner$b(zr).records || {})[key]; + + if (record) { + inner$b(zr).records[key] = null; + } + } + + var AxisPointerView = + /** @class */ + function (_super) { + __extends(AxisPointerView, _super); + + function AxisPointerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerView.type; + return _this; + } + + AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + + register('axisPointer', api, function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + }); + }; + + AxisPointerView.prototype.remove = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.prototype.dispose = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.type = 'axisPointer'; + return AxisPointerView; + }(ComponentView); + + /** + * @param finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param ecModel + * @return {point: [x, y], el: ...} point Will not be null. + */ + + function findPointFromSeries(finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + + if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { + return { + point: [] + }; + } + + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return { + point: [] + }; + } + + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } else if (coordSys && coordSys.dataToPoint) { + if (finder.isStacked) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueAxisDim = valueAxis.dim; + var baseAxisDim = baseAxis.dim; + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var baseDim = data.mapDimension(baseAxisDim); + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseDim, dataIndex); + stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex); + point = coordSys.dataToPoint(stackedData) || []; + } else { + point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex)) || []; + } + } else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } + + return { + point: point, + el: el + }; + } + + var inner$c = makeInner(); + /** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @return content of event obj for echarts.connect. + */ + + function axisTrigger(payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; // Pending + // See #6121. But we are not able to reproduce it yet. + + if (!coordSysAxesInfo) { + return; + } + + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + + var isIllegalPoint = illegalPoint(point); // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + + var inputAxesInfo = finder.axesInfo; + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputPayload = {}; + var showValueMap = {}; + var dataByCoordSys = { + list: [], + map: {} + }; + var updaters = { + showPointer: curry(showPointer, showValueMap), + showTooltip: curry(showTooltip, dataByCoordSys) + }; // Process for triggered axes. + + each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); // If no inputAxesInfo, no axis is restricted. + + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + + val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + } + }); + }); // Process for linked axes. + + var linkTriggers = {}; + each(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; // If axis has been triggered in the previous stage, it should not be triggered by link. + + if (linkGroup && !showValueMap[tarKey]) { + each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; // If srcValItem exist, source axis is triggered, so link to target axis. + + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); + }); + updateModelActually(showValueMap, axesInfo, outputPayload); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + return outputPayload; + } + + function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { + var axis = axisInfo.axis; + + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } // Heavy calculation. So put it after axis.containData checking. + + + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; // Fill content of event obj for echarts.connect. + // By default use the first involved series data as a sample to connect. + + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + + + if (!noSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + + updaters.showPointer(axisInfo, newValue, payloadBatch); // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); + } + + function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + each(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimensionsAll(dim); + var seriesNestestValue; + var dataIndices; + + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } else { + dataIndices = series.getData().indicesOfNearest(dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null); + + if (!dataIndices.length) { + return; + } + + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); // Consider category case + + if (dist <= minDist) { + if (dist < minDist || diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + + each(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; + } + + function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = { + value: value, + payloadBatch: payloadBatch + }; + } + + function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }, + seriesDataIndices: payloadBatch.slice() + }); + } + + function updateModelActually(showValueMap, axesInfo, outputPayload) { + var outputAxesInfo = outputPayload.axesInfo = []; // Basic logic: If no 'show' required, 'hide' this axisPointer. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; // For label formatter param and highlight. + + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } // If status is 'hide', should be no info in payload. + + + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); + } + + function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({ + type: 'hideTip' + }); + return; + } // In most case only one axis (or event one series is used). It is + // convenient to fetch payload.seriesIndex and payload.dataIndex + // directly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + + + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); + } + + function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification should be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner$c(zr)[highDownKey] || {}; + var newHighlights = inner$c(zr)[highDownKey] = {}; // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && each(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); // Diff. + + var toHighlight = []; + var toDownplay = []; + each(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + toDownplay.length && api.dispatchAction({ + type: 'downplay', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toHighlight + }); + } + + function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + + if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { + return inputAxisInfo; + } + } + } + + function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; + } + + function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); + } + + function install$s(registers) { + // CartesianAxisPointer is not supposed to be required here. But consider + // echarts.simple.js and online build tooltip, which only require gridSimple, + // CartesianAxisPointer should be able to required somewhere. + AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + registers.registerComponentModel(AxisPointerModel); + registers.registerComponentView(AxisPointerView); + registers.registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); + var link = option.axisPointer.link; // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } + }); // This process should proformed after coordinate systems created + // and series data processed. So put it on statistic processing stage. + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api); + }); // Broadcast to all views. + + registers.registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' + }, axisTrigger); + } + + function install$t(registers) { + use(install$5); + use(install$s); + } + + var PolarAxisPointer = + /** @class */ + function (_super) { + __extends(PolarAxisPointer, _super); + + function PolarAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + + if (axis.dim === 'angle') { + this.animationThreshold = Math.PI / 18; + } + + var polar = axis.polar; + var otherAxis = polar.getOtherAxis(axis); + var otherExtent = otherAxis.getExtent(); + var coordValue = axis.dataToCoord(value); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var labelMargin = axisPointerModel.get(['label', 'margin']); + var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); + }; + + return PolarAxisPointer; + }(BaseAxisPointer); + + function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { + var axis = axisModel.axis; + var coord = axis.dataToCoord(value); + var axisAngle = polar.getAngleAxis().getExtent()[0]; + axisAngle = axisAngle / 180 * Math.PI; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var position; + var align; + var verticalAlign; + + if (axis.dim === 'radius') { + var transform = create$1(); + rotate(transform, transform, axisAngle); + translate(transform, transform, [polar.cx, polar.cy]); + position = applyTransform$1([coord, -labelMargin], transform); + var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; // @ts-ignore + + var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); + align = labelLayout.textAlign; + verticalAlign = labelLayout.textVerticalAlign; + } else { + // angle axis + var r = radiusExtent[1]; + position = polar.coordToPoint([r + labelMargin, coord]); + var cx = polar.cx; + var cy = polar.cy; + align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right'; + verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom'; + } + + return { + position: position, + align: align, + verticalAlign: verticalAlign + }; + } + + var pointerShapeBuilder$1 = { + line: function (axis, polar, coordValue, otherExtent) { + return axis.dim === 'angle' ? { + type: 'Line', + shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) + } : { + type: 'Circle', + shape: { + cx: polar.cx, + cy: polar.cy, + r: coordValue + } + }; + }, + shadow: function (axis, polar, coordValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var radian = Math.PI / 180; + return axis.dim === 'angle' ? { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive + (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian) + } : { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) + }; + } + }; + + var PolarModel = + /** @class */ + function (_super) { + __extends(PolarModel, _super); + + function PolarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarModel.type; + return _this; + } + + PolarModel.prototype.findAxisModel = function (axisType) { + var foundAxisModel; + var ecModel = this.ecModel; + ecModel.eachComponent(axisType, function (axisModel) { + if (axisModel.getCoordSysModel() === this) { + foundAxisModel = axisModel; + } + }, this); + return foundAxisModel; + }; + + PolarModel.type = 'polar'; + PolarModel.dependencies = ['radiusAxis', 'angleAxis']; + PolarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '80%' + }; + return PolarModel; + }(ComponentModel); + + var PolarAxisModel = + /** @class */ + function (_super) { + __extends(PolarAxisModel, _super); + + function PolarAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + PolarAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + }; + + PolarAxisModel.type = 'polarAxis'; + return PolarAxisModel; + }(ComponentModel); + + mixin(PolarAxisModel, AxisModelCommonMixin); + + var AngleAxisModel = + /** @class */ + function (_super) { + __extends(AngleAxisModel, _super); + + function AngleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisModel.type; + return _this; + } + + AngleAxisModel.type = 'angleAxis'; + return AngleAxisModel; + }(PolarAxisModel); + + var RadiusAxisModel = + /** @class */ + function (_super) { + __extends(RadiusAxisModel, _super); + + function RadiusAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisModel.type; + return _this; + } + + RadiusAxisModel.type = 'radiusAxis'; + return RadiusAxisModel; + }(PolarAxisModel); + + var RadiusAxis = + /** @class */ + function (_super) { + __extends(RadiusAxis, _super); + + function RadiusAxis(scale, radiusExtent) { + return _super.call(this, 'radius', scale, radiusExtent) || this; + } + + RadiusAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + + return RadiusAxis; + }(Axis); + + RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord; + RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData; + + var inner$d = makeInner(); + + var AngleAxis = + /** @class */ + function (_super) { + __extends(AngleAxis, _super); + + function AngleAxis(scale, angleExtent) { + return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this; + } + + AngleAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + /** + * Only be called in category axis. + * Angle axis uses text height to decide interval + * + * @override + * @return {number} Auto interval for cateogry axis tick and label + */ + + + AngleAxis.prototype.calculateCategoryInterval = function () { + var axis = this; + var labelModel = axis.getLabelModel(); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitH = Math.abs(unitSpan); // Not precise, just use height as text width + // and each distance from axis line yet. + + var rect = getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top'); + var maxH = Math.max(rect.height, 7); + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(dh)); + var cache = inner$d(axis.model); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + } + + return interval; + }; + + return AngleAxis; + }(Axis); + + AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord; + AngleAxis.prototype.angleToData = Axis.prototype.coordToData; + + var polarDimensions = ['radius', 'angle']; + + var Polar = + /** @class */ + function () { + function Polar(name) { + this.dimensions = polarDimensions; + this.type = 'polar'; + /** + * x of polar center + */ + + this.cx = 0; + /** + * y of polar center + */ + + this.cy = 0; + this._radiusAxis = new RadiusAxis(); + this._angleAxis = new AngleAxis(); + this.axisPointerEnabled = true; + this.name = name || ''; + this._radiusAxis.polar = this._angleAxis.polar = this; + } + /** + * If contain coord + */ + + + Polar.prototype.containPoint = function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]); + }; + /** + * If contain data + */ + + + Polar.prototype.containData = function (data) { + return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]); + }; + + Polar.prototype.getAxis = function (dim) { + var key = '_' + dim + 'Axis'; + return this[key]; + }; + + Polar.prototype.getAxes = function () { + return [this._radiusAxis, this._angleAxis]; + }; + /** + * Get axes by type of scale + */ + + + Polar.prototype.getAxesByScale = function (scaleType) { + var axes = []; + var angleAxis = this._angleAxis; + var radiusAxis = this._radiusAxis; + angleAxis.scale.type === scaleType && axes.push(angleAxis); + radiusAxis.scale.type === scaleType && axes.push(radiusAxis); + return axes; + }; + + Polar.prototype.getAngleAxis = function () { + return this._angleAxis; + }; + + Polar.prototype.getRadiusAxis = function () { + return this._radiusAxis; + }; + + Polar.prototype.getOtherAxis = function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }; + /** + * Base axis will be used on stacking. + * + */ + + + Polar.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis(); + }; + + Polar.prototype.getTooltipAxes = function (dim) { + var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis(); + return { + baseAxes: [baseAxis], + otherAxes: [this.getOtherAxis(baseAxis)] + }; + }; + /** + * Convert a single data item to (x, y) point. + * Parameter data is an array which the first element is radius and the second is angle + */ + + + Polar.prototype.dataToPoint = function (data, clamp) { + return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)]); + }; + /** + * Convert a (x, y) point to data + */ + + + Polar.prototype.pointToData = function (point, clamp) { + var coord = this.pointToCoord(point); + return [this._radiusAxis.radiusToData(coord[0], clamp), this._angleAxis.angleToData(coord[1], clamp)]; + }; + /** + * Convert a (x, y) point to (radius, angle) coord + */ + + + Polar.prototype.pointToCoord = function (point) { + var dx = point[0] - this.cx; + var dy = point[1] - this.cy; + var angleAxis = this.getAngleAxis(); + var extent = angleAxis.getExtent(); + var minAngle = Math.min(extent[0], extent[1]); + var maxAngle = Math.max(extent[0], extent[1]); // Fix fixed extent in polarCreator + // FIXME + + angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx) / Math.PI * 180; // move to angleExtent + + var dir = radian < minAngle ? 1 : -1; + + while (radian < minAngle || radian > maxAngle) { + radian += dir * 360; + } + + return [radius, radian]; + }; + /** + * Convert a (radius, angle) coord to (x, y) point + */ + + + Polar.prototype.coordToPoint = function (coord) { + var radius = coord[0]; + var radian = coord[1] / 180 * Math.PI; + var x = Math.cos(radian) * radius + this.cx; // Inverse the y + + var y = -Math.sin(radian) * radius + this.cy; + return [x, y]; + }; + /** + * Get ring area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Polar.prototype.getArea = function () { + var angleAxis = this.getAngleAxis(); + var radiusAxis = this.getRadiusAxis(); + var radiusExtent = radiusAxis.getExtent().slice(); + radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); + var angleExtent = angleAxis.getExtent(); + var RADIAN = Math.PI / 180; + return { + cx: this.cx, + cy: this.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse, + contain: function (x, y) { + // It's a ring shape. + // Start angle and end angle don't matter + var dx = x - this.cx; + var dy = y - this.cy; // minus a tiny value 1e-4 to avoid being clipped unexpectedly + + var d2 = dx * dx + dy * dy - 1e-4; + var r = this.r; + var r0 = this.r0; + return d2 <= r * r && d2 >= r0 * r0; + } + }; + }; + + Polar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Polar; + }(); + + function getCoordSys$2(finder) { + var seriesModel = finder.seriesModel; + var polarModel = finder.polarModel; + return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Resize method bound to the polar + */ + + function resizePolar(polar, polarModel, api) { + var center = polarModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + polar.cx = parsePercent$1(center[0], width); + polar.cy = parsePercent$1(center[1], height); + var radiusAxis = polar.getRadiusAxis(); + var size = Math.min(width, height) / 2; + var radius = polarModel.get('radius'); + + if (radius == null) { + radius = [0, '100%']; + } else if (!isArray(radius)) { + // r0 = 0 + radius = [0, radius]; + } + + var parsedRadius = [parsePercent$1(radius[0], size), parsePercent$1(radius[1], size)]; + radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]); + } + /** + * Update polar + */ + + + function updatePolarScale(ecModel, api) { + var polar = this; + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); // Reset scale + + angleAxis.scale.setExtent(Infinity, -Infinity); + radiusAxis.scale.setExtent(Infinity, -Infinity); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === polar) { + var data_1 = seriesModel.getData(); + each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) { + radiusAxis.scale.unionExtentFromData(data_1, dim); + }); + each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) { + angleAxis.scale.unionExtentFromData(data_1, dim); + }); + } + }); + niceScaleExtent(angleAxis.scale, angleAxis.model); + niceScaleExtent(radiusAxis.scale, radiusAxis.model); // Fix extent of category angle axis + + if (angleAxis.type === 'category' && !angleAxis.onBand) { + var extent = angleAxis.getExtent(); + var diff = 360 / angleAxis.scale.count(); + angleAxis.inverse ? extent[1] += diff : extent[1] -= diff; + angleAxis.setExtent(extent[0], extent[1]); + } + } + + function isAngleAxisModel(axisModel) { + return axisModel.mainType === 'angleAxis'; + } + /** + * Set common axis properties + */ + + + function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + axis.inverse = axisModel.get('inverse'); + + if (isAngleAxisModel(axisModel)) { + axis.inverse = axis.inverse !== axisModel.get('clockwise'); + var startAngle = axisModel.get('startAngle'); + axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360)); + } // Inject axis instance + + + axisModel.axis = axis; + axis.model = axisModel; + } + + var polarCreator = { + dimensions: polarDimensions, + create: function (ecModel, api) { + var polarList = []; + ecModel.eachComponent('polar', function (polarModel, idx) { + var polar = new Polar(idx + ''); // Inject resize and update method + + polar.update = updatePolarScale; + var radiusAxis = polar.getRadiusAxis(); + var angleAxis = polar.getAngleAxis(); + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + setAxis(radiusAxis, radiusAxisModel); + setAxis(angleAxis, angleAxisModel); + resizePolar(polar, polarModel, api); + polarList.push(polar); + polarModel.coordinateSystem = polar; + polar.model = polarModel; + }); // Inject coordinateSystem to series + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!polarModel) { + throw new Error('Polar "' + retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '" not found'); + } + } + + seriesModel.coordinateSystem = polarModel.coordinateSystem; + } + }); + return polarList; + } + }; + + var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea']; + + function getAxisLineShape(polar, rExtent, angle) { + rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); + var start = polar.coordToPoint([rExtent[0], angle]); + var end = polar.coordToPoint([rExtent[1], angle]); + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; + } + + function getRadiusIdx(polar) { + var radiusAxis = polar.getRadiusAxis(); + return radiusAxis.inverse ? 0 : 1; + } // Remove the last tick which will overlap the first tick + + + function fixAngleOverlap(list) { + var firstItem = list[0]; + var lastItem = list[list.length - 1]; + + if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { + list.pop(); + } + } + + var AngleAxisView = + /** @class */ + function (_super) { + __extends(AngleAxisView, _super); + + function AngleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + AngleAxisView.prototype.render = function (angleAxisModel, ecModel) { + this.group.removeAll(); + + if (!angleAxisModel.get('show')) { + return; + } + + var angleAxis = angleAxisModel.axis; + var polar = angleAxis.polar; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var ticksAngles = angleAxis.getTicksCoords(); + var minorTickAngles = angleAxis.getMinorTicksCoords(); + var labels = map(angleAxis.getViewLabels(), function (labelItem) { + labelItem = clone(labelItem); + var scale = angleAxis.scale; + var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + labelItem.coord = angleAxis.dataToCoord(tickValue); + return labelItem; + }); + fixAngleOverlap(labels); + fixAngleOverlap(ticksAngles); + each(elementList$1, function (name) { + if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) { + angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); + } + }, this); + }; + + AngleAxisView.type = 'angleAxis'; + return AngleAxisView; + }(AxisView); + + var angelAxisElementsBuilders = { + axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']); // extent id of the axis radius (r0 and r) + + var rId = getRadiusIdx(polar); + var r0Id = rId ? 0 : 1; + var shape; + + if (radiusExtent[r0Id] === 0) { + shape = new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } else { + shape = new Ring({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId], + r0: radiusExtent[r0Id] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } + + shape.style.fill = null; + group.add(shape); + }, + axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = map(ticksAngles, function (tickAngleItem) { + return new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) + }); + }); + group.add(mergePath$1(lines, { + style: defaults(tickModel.getModel('lineStyle').getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + }) + })); + }, + minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var tickModel = angleAxisModel.getModel('axisTick'); + var minorTickModel = angleAxisModel.getModel('minorTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults(minorTickModel.getModel('lineStyle').getLineStyle(), defaults(tickModel.getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + })) + })); + }, + axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { + var rawCategoryData = angleAxisModel.getCategories(true); + var commonLabelModel = angleAxisModel.getModel('axisLabel'); + var labelMargin = commonLabelModel.get('margin'); + var triggerEvent = angleAxisModel.get('triggerEvent'); // Use length of ticksAngles because it may remove the last tick to avoid overlapping + + each(labels, function (labelItem, idx) { + var labelModel = commonLabelModel; + var tickValue = labelItem.tickValue; + var r = radiusExtent[getRadiusIdx(polar)]; + var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); + var cx = polar.cx; + var cy = polar.cy; + var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right'; + var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom'; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); + } + } + + var textEl = new ZRText({ + silent: AxisBuilder.isLabelSilent(angleAxisModel), + style: createTextStyle(labelModel, { + x: p[0], + y: p[1], + fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']), + text: labelItem.formattedLabel, + align: labelTextAlign, + verticalAlign: labelTextVerticalAlign + }) + }); + group.add(textEl); // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); + eventData.targetType = 'axisLabel'; + eventData.value = labelItem.rawLabel; + getECData(textEl).eventData = eventData; + } + }, this); + }, + splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var splitLineModel = angleAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksAngles.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: lineStyleModel.getLineStyle(), + silent: true, + z: angleAxisModel.get('z') + })); + }, + splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!ticksAngles.length) { + return; + } + + var splitAreaModel = angleAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var RADIAN = Math.PI / 180; + var prevAngle = -ticksAngles[0].coord * RADIAN; + var r0 = Math.min(radiusExtent[0], radiusExtent[1]); + var r1 = Math.max(radiusExtent[0], radiusExtent[1]); + var clockwise = angleAxisModel.get('clockwise'); + + for (var i = 1, len = ticksAngles.length; i <= len; i++) { + var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord; + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -coord * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -coord * RADIAN; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + + var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$1 = ['splitLine', 'splitArea', 'minorSplitLine']; + + var RadiusAxisView = + /** @class */ + function (_super) { + __extends(RadiusAxisView, _super); + + function RadiusAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel) { + this.group.removeAll(); + + if (!radiusAxisModel.get('show')) { + return; + } + + var oldAxisGroup = this._axisGroup; + var newAxisGroup = this._axisGroup = new Group(); + this.group.add(newAxisGroup); + var radiusAxis = radiusAxisModel.axis; + var polar = radiusAxis.polar; + var angleAxis = polar.getAngleAxis(); + var ticksCoords = radiusAxis.getTicksCoords(); + var minorTicksCoords = radiusAxis.getMinorTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + each(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); + newAxisGroup.add(axisBuilder.getGroup()); + groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel); + each(selfBuilderAttrs$1, function (name) { + if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) { + axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords); + } + }, this); + }; + + RadiusAxisView.type = 'radiusAxis'; + return RadiusAxisView; + }(AxisView); + + var axisElementBuilders$1 = { + splitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + var splitLineModel = radiusAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + // ensure circle radius >= 0 + r: Math.max(ticksCoords[i].coord, 0) + } + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) { + if (!minorTicksCoords.length) { + return; + } + + var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + lines.push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: minorTicksCoords[i][k].coord + } + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults({ + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + }, + splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + if (!ticksCoords.length) { + return; + } + + var splitAreaModel = radiusAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var prevRadius = ticksCoords[0].coord; + + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i].coord, + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i].coord; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + /** + * @inner + */ + + function layoutAxis(polar, radiusAxisModel, axisAngle) { + return { + position: [polar.cx, polar.cy], + rotation: axisAngle / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; + } + + function getSeriesStackId$1(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function getAxisKey$1(polar, axis) { + return axis.dim + polar.model.componentIndex; + } + + function barLayoutPolar(seriesType, ecModel, api) { + var lastStackCoords = {}; + var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar'; + })); + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for polar only + if (seriesModel.coordinateSystem.type !== 'polar') { + return; + } + + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var stackId = getSeriesStackId$1(seriesModel); + var columnLayoutInfo = barWidthAndOffset[axisKey][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = polar.getOtherAxis(baseAxis); + var cx = seriesModel.coordinateSystem.cx; + var cy = seriesModel.coordinateSystem.cy; + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var barMinAngle = seriesModel.get('barMinAngle') || 0; + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim + /* , baseDim */ + ); + var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true); + var valueAxisStart = valueAxis.dataToCoord(0); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + // Only ordinal axis can be stacked. + + if (stacked) { + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, + n: valueAxisStart // Negative stack + + }; + } // Should also consider #4243 + + + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var r0 = void 0; + var r = void 0; + var startAngle = void 0; + var endAngle = void 0; // radial sector + + if (valueAxis.dim === 'radius') { + var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart; + var angle = baseAxis.dataToCoord(baseValue); + + if (Math.abs(radiusSpan) < barMinHeight) { + radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; + } + + r0 = baseCoord; + r = baseCoord + radiusSpan; + startAngle = angle - columnOffset; + endAngle = startAngle - columnWidth; + stacked && (lastStackCoords[stackId][baseValue][sign] = r); + } // tangential sector + else { + var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart; + var radius = baseAxis.dataToCoord(baseValue); + + if (Math.abs(angleSpan) < barMinAngle) { + angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; + } + + r0 = radius + columnOffset; + r = r0 + columnWidth; + startAngle = baseCoord; + endAngle = baseCoord + angleSpan; // if the previous stack is at the end of the ring, + // add a round to differentiate it from origin + // let extent = angleAxis.getExtent(); + // let stackCoord = angle; + // if (stackCoord === extent[0] && value > 0) { + // stackCoord = extent[1]; + // } + // else if (stackCoord === extent[1] && value < 0) { + // stackCoord = extent[0]; + // } + + stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); + } + + data.setItemLayout(idx, { + cx: cx, + cy: cy, + r0: r0, + r: r, + // Consider that positive angle is anti-clockwise, + // while positive radian of sector is clockwise + startAngle: -startAngle * Math.PI / 180, + endAngle: -endAngle * Math.PI / 180, + + /** + * Keep the same logic with bar in catesion: use end value to + * control direction. Notice that if clockwise is true (by + * default), the sector will always draw clockwisely, no matter + * whether endAngle is greater or less than startAngle. + */ + clockwise: startAngle >= endAngle + }); + } + }); + } + /** + * Calculate bar width and offset for radial bar charts + */ + + + function calRadialBar(barSeries) { + // Columns info on each category axis. Key is polar name + var columnsMap = {}; + each(barSeries, function (seriesModel, idx) { + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = getSeriesStackId$1(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + if (barWidth && !stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + barGap != null && (columnsOnAxis.gap = barGap); + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + var angleAxisExtraOption = { + startAngle: 90, + clockwise: true, + splitNumber: 12, + axisLabel: { + rotate: 0 + } + }; + var radiusAxisExtraOption = { + splitNumber: 5 + }; + + var PolarView = + /** @class */ + function (_super) { + __extends(PolarView, _super); + + function PolarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarView.type; + return _this; + } + + PolarView.type = 'polar'; + return PolarView; + }(ComponentView); + + function install$u(registers) { + use(install$s); + AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); + registers.registerCoordinateSystem('polar', polarCreator); + registers.registerComponentModel(PolarModel); + registers.registerComponentView(PolarView); // Model and view for angleAxis and radiusAxis + + axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption); + axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption); + registers.registerComponentView(AngleAxisView); + registers.registerComponentView(RadiusAxisView); + registers.registerLayout(curry(barLayoutPolar, 'bar')); + } + + function layout$2(axisModel, opt) { + opt = opt || {}; + var single = axisModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var axisPosition = axis.position; + var orient = axis.orient; + var rect = single.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var positionMap = { + horizontal: { + top: rectBound[2], + bottom: rectBound[3] + }, + vertical: { + left: rectBound[0], + right: rectBound[1] + } + }; + layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]]; + var r = { + horizontal: 0, + vertical: 1 + }; + layout.rotation = Math.PI / 2 * r[orient]; + var directionMap = { + top: -1, + bottom: 1, + right: 1, + left: -1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition]; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } + + var labelRotation = opt.rotate; + labelRotation == null && (labelRotation = axisModel.get(['axisLabel', 'rotate'])); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + layout.z2 = 1; + return layout; + } + + var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$2 = ['splitArea', 'splitLine']; + + var SingleAxisView = + /** @class */ + function (_super) { + __extends(SingleAxisView, _super); + + function SingleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisView.type; + _this.axisPointerClass = 'SingleAxisPointer'; + return _this; + } + + SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + var layout = layout$2(axisModel); + var axisBuilder = new AxisBuilder(axisModel, layout); + each(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); + group.add(this._axisGroup); + group.add(axisBuilder.getGroup()); + each(selfBuilderAttrs$2, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders$2[name](this, this.group, this._axisGroup, axisModel); + } + }, this); + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + SingleAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + SingleAxisView.type = 'singleAxis'; + return SingleAxisView; + }(AxisView); + + var axisElementBuilders$2 = { + splitLine: function (axisView, group, axisGroup, axisModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var lineWidth = lineStyleModel.get('width'); + var gridRect = axisModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var splitLines = []; + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + + for (var i = 0; i < ticksCoords.length; ++i) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var line = new Line({ + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + silent: true + }); + subPixelOptimizeLine$1(line.shape, lineWidth); + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(line); + } + + var lineStyle = lineStyleModel.getLineStyle(['color']); + + for (var i = 0; i < splitLines.length; ++i) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + splitArea: function (axisView, group, axisGroup, axisModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); + } + }; + + var SingleAxisModel = + /** @class */ + function (_super) { + __extends(SingleAxisModel, _super); + + function SingleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisModel.type; + return _this; + } + + SingleAxisModel.prototype.getCoordSysModel = function () { + return this; + }; + + SingleAxisModel.type = 'singleAxis'; + SingleAxisModel.layoutMode = 'box'; + SingleAxisModel.defaultOption = { + left: '5%', + top: '5%', + right: '5%', + bottom: '5%', + type: 'value', + position: 'bottom', + orient: 'horizontal', + axisLine: { + show: true, + lineStyle: { + width: 1, + type: 'solid' + } + }, + // Single coordinate system and single axis is the, + // which is used as the parent tooltip model. + // same model, so we set default tooltip show as true. + tooltip: { + show: true + }, + axisTick: { + show: true, + length: 6, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + interval: 'auto' + }, + splitLine: { + show: true, + lineStyle: { + type: 'dashed', + opacity: 0.2 + } + } + }; + return SingleAxisModel; + }(ComponentModel); + + mixin(SingleAxisModel, AxisModelCommonMixin.prototype); + + var SingleAxis = + /** @class */ + function (_super) { + __extends(SingleAxis, _super); + + function SingleAxis(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + /** + * Judge the orient of the axis. + */ + + + SingleAxis.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + + SingleAxis.prototype.pointToData = function (point, clamp) { + return this.coordinateSystem.pointToData(point)[0]; + }; + + return SingleAxis; + }(Axis); + + var singleDimensions = ['single']; + /** + * Create a single coordinates system. + */ + + var Single = + /** @class */ + function () { + function Single(axisModel, ecModel, api) { + this.type = 'single'; + this.dimension = 'single'; + /** + * Add it just for draw tooltip. + */ + + this.dimensions = singleDimensions; + this.axisPointerEnabled = true; + this.model = axisModel; + + this._init(axisModel, ecModel, api); + } + /** + * Initialize single coordinate system. + */ + + + Single.prototype._init = function (axisModel, ecModel, api) { + var dim = this.dimension; + var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position')); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + axis.orient = axisModel.get('orient'); + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = this; + this._axis = axis; + }; + /** + * Update axis scale after data processed + */ + + + Single.prototype.update = function (ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === this) { + var data_1 = seriesModel.getData(); + each(data_1.mapDimensionsAll(this.dimension), function (dim) { + this._axis.scale.unionExtentFromData(data_1, dim); + }, this); + niceScaleExtent(this._axis.scale, this._axis.model); + } + }, this); + }; + /** + * Resize the single coordinate system. + */ + + + Single.prototype.resize = function (axisModel, api) { + this._rect = getLayoutRect({ + left: axisModel.get('left'), + top: axisModel.get('top'), + right: axisModel.get('right'), + bottom: axisModel.get('bottom'), + width: axisModel.get('width'), + height: axisModel.get('height') + }, { + width: api.getWidth(), + height: api.getHeight() + }); + + this._adjustAxis(); + }; + + Single.prototype.getRect = function () { + return this._rect; + }; + + Single.prototype._adjustAxis = function () { + var rect = this._rect; + var axis = this._axis; + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + + this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); + }; + + Single.prototype._updateAxisTransform = function (axis, coordBase) { + var axisExtent = axis.getExtent(); + var extentSum = axisExtent[0] + axisExtent[1]; + var isHorizontal = axis.isHorizontal(); + axis.toGlobalCoord = isHorizontal ? function (coord) { + return coord + coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + axis.toLocalCoord = isHorizontal ? function (coord) { + return coord - coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + }; + /** + * Get axis. + */ + + + Single.prototype.getAxis = function () { + return this._axis; + }; + /** + * Get axis, add it just for draw tooltip. + */ + + + Single.prototype.getBaseAxis = function () { + return this._axis; + }; + + Single.prototype.getAxes = function () { + return [this._axis]; + }; + + Single.prototype.getTooltipAxes = function () { + return { + baseAxes: [this.getAxis()], + // Empty otherAxes + otherAxes: [] + }; + }; + /** + * If contain point. + */ + + + Single.prototype.containPoint = function (point) { + var rect = this.getRect(); + var axis = this.getAxis(); + var orient = axis.orient; + + if (orient === 'horizontal') { + return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height; + } else { + return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height; + } + }; + + Single.prototype.pointToData = function (point) { + var axis = this.getAxis(); + return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))]; + }; + /** + * Convert the series data to concrete point. + * Can be [val] | val + */ + + + Single.prototype.dataToPoint = function (val) { + var axis = this.getAxis(); + var rect = this.getRect(); + var pt = []; + var idx = axis.orient === 'horizontal' ? 0 : 1; + + if (val instanceof Array) { + val = val[0]; + } + + pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); + pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2; + return pt; + }; + + Single.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Single.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Single; + }(); + + function getCoordSys$3(finder) { + var seriesModel = finder.seriesModel; + var singleModel = finder.singleAxisModel; + return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Create single coordinate system and inject it into seriesModel. + */ + + function create$2(ecModel, api) { + var singles = []; + ecModel.eachComponent('singleAxis', function (axisModel, idx) { + var single = new Single(axisModel, ecModel, api); + single.name = 'single_' + idx; + single.resize(axisModel, api); + axisModel.coordinateSystem = single; + singles.push(single); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'singleAxis') { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; + } + }); + return singles; + } + + var singleCreator = { + create: create$2, + dimensions: singleDimensions + }; + + var XY = ['x', 'y']; + var WH = ['width', 'height']; + + var SingleAxisPointer = + /** @class */ + function (_super) { + __extends(SingleAxisPointer, _super); + + function SingleAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); + var pixelValue = coordSys.dataToPoint(value)[0]; + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$2(axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$2(axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var position = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: position[0], + y: position[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var dimIndex = getPointDimIndex(axis); + var axisExtent = getGlobalExtent(coordSys, dimIndex); + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: { + verticalAlign: 'middle' + } + }; + }; + + return SingleAxisPointer; + }(BaseAxisPointer); + + var pointerShapeBuilder$2 = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis)) + }; + } + }; + + function getPointDimIndex(axis) { + return axis.isHorizontal() ? 0 : 1; + } + + function getGlobalExtent(coordSys, dimIndex) { + var rect = coordSys.getRect(); + return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]]; + } + + var SingleView = + /** @class */ + function (_super) { + __extends(SingleView, _super); + + function SingleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleView.type; + return _this; + } + + SingleView.type = 'single'; + return SingleView; + }(ComponentView); + + function install$v(registers) { + use(install$s); + AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer); + registers.registerComponentView(SingleView); // Axis + + registers.registerComponentView(SingleAxisView); + registers.registerComponentModel(SingleAxisModel); + axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption); + registers.registerCoordinateSystem('single', singleCreator); + } + + var CalendarModel = + /** @class */ + function (_super) { + __extends(CalendarModel, _super); + + function CalendarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarModel.type; + return _this; + } + /** + * @override + */ + + + CalendarModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.apply(this, arguments); + + mergeAndNormalizeLayoutParams(option, inputPositionParams); + }; + /** + * @override + */ + + + CalendarModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + mergeAndNormalizeLayoutParams(this.option, option); + }; + + CalendarModel.prototype.getCellSize = function () { + // Has been normalized + return this.option.cellSize; + }; + + CalendarModel.type = 'calendar'; + CalendarModel.defaultOption = { + // zlevel: 0, + z: 2, + left: 80, + top: 60, + cellSize: 20, + // horizontal vertical + orient: 'horizontal', + // month separate line style + splitLine: { + show: true, + lineStyle: { + color: '#000', + width: 1, + type: 'solid' + } + }, + // rect style temporarily unused emphasis + itemStyle: { + color: '#fff', + borderWidth: 1, + borderColor: '#ccc' + }, + // week text style + dayLabel: { + show: true, + firstDay: 0, + // start end + position: 'start', + margin: '50%', + color: '#000' + }, + // month text style + monthLabel: { + show: true, + // start end + position: 'start', + margin: 5, + // center or left + align: 'center', + formatter: null, + color: '#000' + }, + // year text style + yearLabel: { + show: true, + // top bottom left right + position: null, + margin: 30, + formatter: null, + color: '#ccc', + fontFamily: 'sans-serif', + fontWeight: 'bolder', + fontSize: 20 + } + }; + return CalendarModel; + }(ComponentModel); + + function mergeAndNormalizeLayoutParams(target, raw) { + // Normalize cellSize + var cellSize = target.cellSize; + var cellSizeArr; + + if (!isArray(cellSize)) { + cellSizeArr = target.cellSize = [cellSize, cellSize]; + } else { + cellSizeArr = cellSize; + } + + if (cellSizeArr.length === 1) { + cellSizeArr[1] = cellSizeArr[0]; + } + + var ignoreSize = map([0, 1], function (hvIdx) { + // If user have set `width` or both `left` and `right`, cellSizeArr + // will be automatically set to 'auto', otherwise the default + // setting of cellSizeArr will make `width` setting not work. + if (sizeCalculable(raw, hvIdx)) { + cellSizeArr[hvIdx] = 'auto'; + } + + return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto'; + }); + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: ignoreSize + }); + } + + var CalendarView = + /** @class */ + function (_super) { + __extends(CalendarView, _super); + + function CalendarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarView.type; + return _this; + } + + CalendarView.prototype.render = function (calendarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + var coordSys = calendarModel.coordinateSystem; // range info + + var rangeData = coordSys.getRangeInfo(); + var orient = coordSys.getOrient(); // locale + + var localeModel = ecModel.getLocaleModel(); + + this._renderDayRect(calendarModel, rangeData, group); // _renderLines must be called prior to following function + + + this._renderLines(calendarModel, rangeData, orient, group); + + this._renderYearText(calendarModel, rangeData, orient, group); + + this._renderMonthText(calendarModel, localeModel, orient, group); + + this._renderWeekText(calendarModel, localeModel, rangeData, orient, group); + }; // render day rect + + + CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) { + var coordSys = calendarModel.coordinateSystem; + var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle(); + var sw = coordSys.getCellWidth(); + var sh = coordSys.getCellHeight(); + + for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) { + var point = coordSys.dataToRect([i], false).tl; // every rect + + var rect = new Rect({ + shape: { + x: point[0], + y: point[1], + width: sw, + height: sh + }, + cursor: 'default', + style: itemRectStyleModel + }); + group.add(rect); + } + }; // render separate line + + + CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) { + var self = this; + var coordSys = calendarModel.coordinateSystem; + var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle(); + var show = calendarModel.get(['splitLine', 'show']); + var lineWidth = lineStyleModel.lineWidth; + this._tlpoints = []; + this._blpoints = []; + this._firstDayOfMonth = []; + this._firstDayPoints = []; + var firstDay = rangeData.start; + + for (var i = 0; firstDay.time <= rangeData.end.time; i++) { + addPoints(firstDay.formatedDate); + + if (i === 0) { + firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m); + } + + var date = firstDay.date; + date.setMonth(date.getMonth() + 1); + firstDay = coordSys.getDateInfo(date); + } + + addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); + + function addPoints(date) { + self._firstDayOfMonth.push(coordSys.getDateInfo(date)); + + self._firstDayPoints.push(coordSys.dataToRect([date], false).tl); + + var points = self._getLinePointsOfOneWeek(calendarModel, date, orient); + + self._tlpoints.push(points[0]); + + self._blpoints.push(points[points.length - 1]); + + show && self._drawSplitline(points, lineStyleModel, group); + } // render top/left line + + + show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); // render bottom/right line + + show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); + }; // get points at both ends + + + CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) { + var rs = [points[0].slice(), points[points.length - 1].slice()]; + var idx = orient === 'horizontal' ? 0 : 1; // both ends of the line are extend half lineWidth + + rs[0][idx] = rs[0][idx] - lineWidth / 2; + rs[1][idx] = rs[1][idx] + lineWidth / 2; + return rs; + }; // render split line + + + CalendarView.prototype._drawSplitline = function (points, lineStyle, group) { + var poyline = new Polyline({ + z2: 20, + shape: { + points: points + }, + style: lineStyle + }); + group.add(poyline); + }; // render month line of one week points + + + CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) { + var coordSys = calendarModel.coordinateSystem; + var parsedDate = coordSys.getDateInfo(date); + var points = []; + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(parsedDate.time, i); + var point = coordSys.dataToRect([tmpD.time], false); + points[2 * tmpD.day] = point.tl; + points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr']; + } + + return points; + }; + + CalendarView.prototype._formatterLabel = function (formatter, params) { + if (isString(formatter) && formatter) { + return formatTplSimple(formatter, params); + } + + if (isFunction(formatter)) { + return formatter(params); + } + + return params.nameMap; + }; + + CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) { + var x = point[0]; + var y = point[1]; + var aligns = ['center', 'bottom']; + + if (position === 'bottom') { + y += margin; + aligns = ['center', 'top']; + } else if (position === 'left') { + x -= margin; + } else if (position === 'right') { + x += margin; + aligns = ['center', 'top']; + } else { + // top + y -= margin; + } + + var rotate = 0; + + if (position === 'left' || position === 'right') { + rotate = Math.PI / 2; + } + + return { + rotation: rotate, + x: x, + y: y, + style: { + align: aligns[0], + verticalAlign: aligns[1] + } + }; + }; // render year + + + CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) { + var yearLabel = calendarModel.getModel('yearLabel'); + + if (!yearLabel.get('show')) { + return; + } + + var margin = yearLabel.get('margin'); + var pos = yearLabel.get('position'); + + if (!pos) { + pos = orient !== 'horizontal' ? 'top' : 'left'; + } + + var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; + var xc = (points[0][0] + points[1][0]) / 2; + var yc = (points[0][1] + points[1][1]) / 2; + var idx = orient === 'horizontal' ? 0 : 1; + var posPoints = { + top: [xc, points[idx][1]], + bottom: [xc, points[1 - idx][1]], + left: [points[1 - idx][0], yc], + right: [points[idx][0], yc] + }; + var name = rangeData.start.y; + + if (+rangeData.end.y > +rangeData.start.y) { + name = name + '-' + rangeData.end.y; + } + + var formatter = yearLabel.get('formatter'); + var params = { + start: rangeData.start.y, + end: rangeData.end.y, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var yearText = new ZRText({ + z2: 30, + style: createTextStyle(yearLabel, { + text: content + }) + }); + yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); + group.add(yearText); + }; + + CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) { + var align = 'left'; + var vAlign = 'top'; + var x = point[0]; + var y = point[1]; + + if (orient === 'horizontal') { + y = y + margin; + + if (isCenter) { + align = 'center'; + } + + if (position === 'start') { + vAlign = 'bottom'; + } + } else { + x = x + margin; + + if (isCenter) { + vAlign = 'middle'; + } + + if (position === 'start') { + align = 'right'; + } + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render month and year text + + + CalendarView.prototype._renderMonthText = function (calendarModel, localeModel, orient, group) { + var monthLabel = calendarModel.getModel('monthLabel'); + + if (!monthLabel.get('show')) { + return; + } + + var nameMap = monthLabel.get('nameMap'); + var margin = monthLabel.get('margin'); + var pos = monthLabel.get('position'); + var align = monthLabel.get('align'); + var termPoints = [this._tlpoints, this._blpoints]; + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // PENDING + // for ZH locale, original form is `一月` but current form is `1月` + + + nameMap = localeModel.get(['time', 'monthAbbr']) || []; + } + + var idx = pos === 'start' ? 0 : 1; + var axis = orient === 'horizontal' ? 0 : 1; + margin = pos === 'start' ? -margin : margin; + var isCenter = align === 'center'; + + for (var i = 0; i < termPoints[idx].length - 1; i++) { + var tmp = termPoints[idx][i].slice(); + var firstDay = this._firstDayOfMonth[i]; + + if (isCenter) { + var firstDayPoints = this._firstDayPoints[i]; + tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; + } + + var formatter = monthLabel.get('formatter'); + var name_1 = nameMap[+firstDay.m - 1]; + var params = { + yyyy: firstDay.y, + yy: (firstDay.y + '').slice(2), + MM: firstDay.m, + M: +firstDay.m, + nameMap: name_1 + }; + + var content = this._formatterLabel(formatter, params); + + var monthText = new ZRText({ + z2: 30, + style: extend(createTextStyle(monthLabel, { + text: content + }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)) + }); + group.add(monthText); + } + }; + + CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) { + var align = 'center'; + var vAlign = 'middle'; + var x = point[0]; + var y = point[1]; + var isStart = position === 'start'; + + if (orient === 'horizontal') { + x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; + align = isStart ? 'right' : 'left'; + } else { + y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; + vAlign = isStart ? 'bottom' : 'top'; + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render weeks + + + CalendarView.prototype._renderWeekText = function (calendarModel, localeModel, rangeData, orient, group) { + var dayLabel = calendarModel.getModel('dayLabel'); + + if (!dayLabel.get('show')) { + return; + } + + var coordSys = calendarModel.coordinateSystem; + var pos = dayLabel.get('position'); + var nameMap = dayLabel.get('nameMap'); + var margin = dayLabel.get('margin'); + var firstDayOfWeek = coordSys.getFirstDayOfWeek(); + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // Use the first letter of `dayOfWeekAbbr` if `dayOfWeekShort` doesn't exist in the locale file + + + var dayOfWeekShort = localeModel.get(['time', 'dayOfWeekShort']); + nameMap = dayOfWeekShort || map(localeModel.get(['time', 'dayOfWeekAbbr']), function (val) { + return val[0]; + }); + } + + var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time; + var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; + margin = parsePercent$1(margin, Math.min(cellSize[1], cellSize[0])); + + if (pos === 'start') { + start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time; + margin = -margin; + } + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(start, i); + var point = coordSys.dataToRect([tmpD.time], false).center; + var day = i; + day = Math.abs((i + firstDayOfWeek) % 7); + var weekText = new ZRText({ + z2: 30, + style: extend(createTextStyle(dayLabel, { + text: nameMap[day] + }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)) + }); + group.add(weekText); + } + }; + + CalendarView.type = 'calendar'; + return CalendarView; + }(ComponentView); + + var PROXIMATE_ONE_DAY = 86400000; + + var Calendar = + /** @class */ + function () { + function Calendar(calendarModel, ecModel, api) { + this.type = 'calendar'; + this.dimensions = Calendar.dimensions; // Required in createListFromData + + this.getDimensionsInfo = Calendar.getDimensionsInfo; + this._model = calendarModel; + } + + Calendar.getDimensionsInfo = function () { + return [{ + name: 'time', + type: 'time' + }, 'value']; + }; + + Calendar.prototype.getRangeInfo = function () { + return this._rangeInfo; + }; + + Calendar.prototype.getModel = function () { + return this._model; + }; + + Calendar.prototype.getRect = function () { + return this._rect; + }; + + Calendar.prototype.getCellWidth = function () { + return this._sw; + }; + + Calendar.prototype.getCellHeight = function () { + return this._sh; + }; + + Calendar.prototype.getOrient = function () { + return this._orient; + }; + /** + * getFirstDayOfWeek + * + * @example + * 0 : start at Sunday + * 1 : start at Monday + * + * @return {number} + */ + + + Calendar.prototype.getFirstDayOfWeek = function () { + return this._firstDayOfWeek; + }; + /** + * get date info + * } + */ + + + Calendar.prototype.getDateInfo = function (date) { + date = parseDate(date); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var mStr = m < 10 ? '0' + m : '' + m; + var d = date.getDate(); + var dStr = d < 10 ? '0' + d : '' + d; + var day = date.getDay(); + day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); + return { + y: y + '', + m: mStr, + d: dStr, + day: day, + time: date.getTime(), + formatedDate: y + '-' + mStr + '-' + dStr, + date: date + }; + }; + + Calendar.prototype.getNextNDay = function (date, n) { + n = n || 0; + + if (n === 0) { + return this.getDateInfo(date); + } + + date = new Date(this.getDateInfo(date).time); + date.setDate(date.getDate() + n); + return this.getDateInfo(date); + }; + + Calendar.prototype.update = function (ecModel, api) { + this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay'); + this._orient = this._model.get('orient'); + this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0; + this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var weeks = this._rangeInfo.weeks || 1; + var whNames = ['width', 'height']; + + var cellSize = this._model.getCellSize().slice(); + + var layoutParams = this._model.getBoxLayoutParams(); + + var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks]; + each([0, 1], function (idx) { + if (cellSizeSpecified(cellSize, idx)) { + layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; + } + }); + var whGlobal = { + width: api.getWidth(), + height: api.getHeight() + }; + var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); + each([0, 1], function (idx) { + if (!cellSizeSpecified(cellSize, idx)) { + cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; + } + }); + + function cellSizeSpecified(cellSize, idx) { + return cellSize[idx] != null && cellSize[idx] !== 'auto'; + } // Has been calculated out number. + + + this._sw = cellSize[0]; + this._sh = cellSize[1]; + }; + /** + * Convert a time data(time, value) item to (x, y) point. + */ + // TODO Clamp of calendar is not same with cartesian coordinate systems. + // It will return NaN if data exceeds. + + + Calendar.prototype.dataToPoint = function (data, clamp) { + isArray(data) && (data = data[0]); + clamp == null && (clamp = true); + var dayInfo = this.getDateInfo(data); + var range = this._rangeInfo; + var date = dayInfo.formatedDate; // if not in range return [NaN, NaN] + + if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) { + return [NaN, NaN]; + } + + var week = dayInfo.day; + + var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; + + if (this._orient === 'vertical') { + return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2]; + } + + return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2]; + }; + /** + * Convert a (x, y) point to time data + */ + + + Calendar.prototype.pointToData = function (point) { + var date = this.pointToDate(point); + return date && date.time; + }; + /** + * Convert a time date item to (x, y) four point. + */ + + + Calendar.prototype.dataToRect = function (data, clamp) { + var point = this.dataToPoint(data, clamp); + return { + contentShape: { + x: point[0] - (this._sw - this._lineWidth) / 2, + y: point[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + center: point, + tl: [point[0] - this._sw / 2, point[1] - this._sh / 2], + tr: [point[0] + this._sw / 2, point[1] - this._sh / 2], + br: [point[0] + this._sw / 2, point[1] + this._sh / 2], + bl: [point[0] - this._sw / 2, point[1] + this._sh / 2] + }; + }; + /** + * Convert a (x, y) point to time date + * + * @param {Array} point point + * @return {Object} date + */ + + + Calendar.prototype.pointToDate = function (point) { + var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; + var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; + var range = this._rangeInfo.range; + + if (this._orient === 'vertical') { + return this._getDateByWeeksAndDay(nthY, nthX - 1, range); + } + + return this._getDateByWeeksAndDay(nthX, nthY - 1, range); + }; + + Calendar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + Calendar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + /** + * initRange + * Normalize to an [start, end] array + */ + + + Calendar.prototype._initRangeOption = function () { + var range = this._model.get('range'); + + var normalizedRange; // Convert [1990] to 1990 + + if (isArray(range) && range.length === 1) { + range = range[0]; + } + + if (!isArray(range)) { + var rangeStr = range.toString(); // One year. + + if (/^\d{4}$/.test(rangeStr)) { + normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31']; + } // One month + + + if (/^\d{4}[\/|-]\d{1,2}$/.test(rangeStr)) { + var start = this.getDateInfo(rangeStr); + var firstDay = start.date; + firstDay.setMonth(firstDay.getMonth() + 1); + var end = this.getNextNDay(firstDay, -1); + normalizedRange = [start.formatedDate, end.formatedDate]; + } // One day + + + if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rangeStr)) { + normalizedRange = [rangeStr, rangeStr]; + } + } else { + normalizedRange = range; + } + + if (!normalizedRange) { + if ("development" !== 'production') { + logError('Invalid date range.'); + } // Not handling it. + + + return range; + } + + var tmp = this._getRangeInfo(normalizedRange); + + if (tmp.start.time > tmp.end.time) { + normalizedRange.reverse(); + } + + return normalizedRange; + }; + /** + * range info + * + * @private + * @param {Array} range range ['2017-01-01', '2017-07-08'] + * If range[0] > range[1], they will not be reversed. + * @return {Object} obj + */ + + + Calendar.prototype._getRangeInfo = function (range) { + var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])]; + var reversed; + + if (parsedRange[0].time > parsedRange[1].time) { + reversed = true; + parsedRange.reverse(); + } + + var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1; // Consider case1 (#11677 #10430): + // Set the system timezone as "UK", set the range to `['2016-07-01', '2016-12-31']` + // Consider case2: + // Firstly set system timezone as "Time Zone: America/Toronto", + // ``` + // let first = new Date(1478412000000 - 3600 * 1000 * 2.5); + // let second = new Date(1478412000000); + // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1; + // ``` + // will get wrong result because of DST. So we should fix it. + + var date = new Date(parsedRange[0].time); + var startDateNum = date.getDate(); + var endDateNum = parsedRange[1].date.getDate(); + date.setDate(startDateNum + allDay - 1); // The bias can not over a month, so just compare date. + + var dateNum = date.getDate(); + + if (dateNum !== endDateNum) { + var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1; + + while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) { + allDay -= sign; + date.setDate(dateNum - sign); + } + } + + var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7); + var nthWeek = reversed ? -weeks + 1 : weeks - 1; + reversed && parsedRange.reverse(); + return { + range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate], + start: parsedRange[0], + end: parsedRange[1], + allDay: allDay, + weeks: weeks, + // From 0. + nthWeek: nthWeek, + fweek: parsedRange[0].day, + lweek: parsedRange[1].day + }; + }; + /** + * get date by nthWeeks and week day in range + * + * @private + * @param {number} nthWeek the week + * @param {number} day the week day + * @param {Array} range [d1, d2] + * @return {Object} + */ + + + Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) { + var rangeInfo = this._getRangeInfo(range); + + if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) { + return null; + } + + var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; + var date = new Date(rangeInfo.start.time); + date.setDate(+rangeInfo.start.d + nthDay); + return this.getDateInfo(date); + }; + + Calendar.create = function (ecModel, api) { + var calendarList = []; + ecModel.eachComponent('calendar', function (calendarModel) { + var calendar = new Calendar(calendarModel, ecModel, api); + calendarList.push(calendar); + calendarModel.coordinateSystem = calendar; + }); + ecModel.eachSeries(function (calendarSeries) { + if (calendarSeries.get('coordinateSystem') === 'calendar') { + // Inject coordinate system + calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0]; + } + }); + return calendarList; + }; + + Calendar.dimensions = ['time', 'value']; + return Calendar; + }(); + + function getCoordSys$4(finder) { + var calendarModel = finder.calendarModel; + var seriesModel = finder.seriesModel; + var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null; + return coordSys; + } + + function install$w(registers) { + registers.registerComponentModel(CalendarModel); + registers.registerComponentView(CalendarView); + registers.registerCoordinateSystem('calendar', Calendar); + } + + function setKeyInfoToNewElOption(resultItem, newElOption) { + var existElOption = resultItem.existing; // Set id and type after id assigned. + + newElOption.id = resultItem.keyInfo.id; + !newElOption.type && existElOption && (newElOption.type = existElOption.type); // Set parent id if not specified + + if (newElOption.parentId == null) { + var newElParentOption = newElOption.parentOption; + + if (newElParentOption) { + newElOption.parentId = newElParentOption.id; + } else if (existElOption) { + newElOption.parentId = existElOption.parentId; + } + } // Clear + + + newElOption.parentOption = null; + } + + function isSetLoc(obj, props) { + var isSet; + each(props, function (prop) { + obj[prop] != null && obj[prop] !== 'auto' && (isSet = true); + }); + return isSet; + } + + function mergeNewElOptionToExist(existList, index, newElOption) { + // Update existing options, for `getOption` feature. + var newElOptCopy = extend({}, newElOption); + var existElOption = existList[index]; + var $action = newElOption.$action || 'merge'; + + if ($action === 'merge') { + if (existElOption) { + if ("development" !== 'production') { + var newType = newElOption.type; + assert(!newType || existElOption.type === newType, 'Please set $action: "replace" to change `type`'); + } // We can ensure that newElOptCopy and existElOption are not + // the same object, so `merge` will not change newElOptCopy. + + + merge(existElOption, newElOptCopy, true); // Rigid body, use ignoreSize. + + mergeLayoutParam(existElOption, newElOptCopy, { + ignoreSize: true + }); // Will be used in render. + + copyLayoutParams(newElOption, existElOption); // Copy transition info to new option so it can be used in the transition. + // DO IT AFTER merge + + copyTransitionInfo(newElOption, existElOption); + copyTransitionInfo(newElOption, existElOption, 'shape'); + copyTransitionInfo(newElOption, existElOption, 'style'); + copyTransitionInfo(newElOption, existElOption, 'extra'); // Copy clipPath + + newElOption.clipPath = existElOption.clipPath; + } else { + existList[index] = newElOptCopy; + } + } else if ($action === 'replace') { + existList[index] = newElOptCopy; + } else if ($action === 'remove') { + // null will be cleaned later. + existElOption && (existList[index] = null); + } + } + + var TRANSITION_PROPS_TO_COPY = ['transition', 'enterFrom', 'leaveTo']; + var ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(['enterAnimation', 'updateAnimation', 'leaveAnimation']); + + function copyTransitionInfo(target, source, targetProp) { + if (targetProp) { + if (!target[targetProp] && source[targetProp]) { + // TODO avoid creating this empty object when there is no transition configuration. + target[targetProp] = {}; + } + + target = target[targetProp]; + source = source[targetProp]; + } + + if (!target || !source) { + return; + } + + var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + if (target[prop] == null && source[prop] != null) { + target[prop] = source[prop]; + } + } + } + + function setLayoutInfoToExist(existItem, newElOption) { + if (!existItem) { + return; + } + + existItem.hv = newElOption.hv = [// Rigid body, don't care about `width`. + isSetLoc(newElOption, ['left', 'right']), // Rigid body, don't care about `height`. + isSetLoc(newElOption, ['top', 'bottom'])]; // Give default group size. Otherwise layout error may occur. + + if (existItem.type === 'group') { + var existingGroupOpt = existItem; + var newGroupOpt = newElOption; + existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0); + existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0); + } + } + + var GraphicComponentModel = + /** @class */ + function (_super) { + __extends(GraphicComponentModel, _super); + + function GraphicComponentModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentModel.type; + _this.preventAutoZ = true; + return _this; + } + + GraphicComponentModel.prototype.mergeOption = function (option, ecModel) { + // Prevent default merge to elements + var elements = this.option.elements; + this.option.elements = null; + + _super.prototype.mergeOption.call(this, option, ecModel); + + this.option.elements = elements; + }; + + GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + var newList = (isInit ? thisOption : newOption).elements; + var existList = thisOption.elements = isInit ? [] : thisOption.elements; + var flattenedList = []; + + this._flatten(newList, flattenedList, null); + + var mappingResult = mappingToExists(existList, flattenedList, 'normalMerge'); // Clear elOptionsToUpdate + + var elOptionsToUpdate = this._elOptionsToUpdate = []; + each(mappingResult, function (resultItem, index) { + var newElOption = resultItem.newOption; + + if ("development" !== 'production') { + assert(isObject(newElOption) || resultItem.existing, 'Empty graphic option definition'); + } + + if (!newElOption) { + return; + } + + elOptionsToUpdate.push(newElOption); + setKeyInfoToNewElOption(resultItem, newElOption); + mergeNewElOptionToExist(existList, index, newElOption); + setLayoutInfoToExist(existList[index], newElOption); + }, this); // Clean + + thisOption.elements = filter(existList, function (item) { + // $action should be volatile, otherwise option gotten from + // `getOption` will contain unexpected $action. + item && delete item.$action; + return item != null; + }); + }; + /** + * Convert + * [{ + * type: 'group', + * id: 'xx', + * children: [{type: 'circle'}, {type: 'polygon'}] + * }] + * to + * [ + * {type: 'group', id: 'xx'}, + * {type: 'circle', parentId: 'xx'}, + * {type: 'polygon', parentId: 'xx'} + * ] + */ + + + GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) { + each(optionList, function (option) { + if (!option) { + return; + } + + if (parentOption) { + option.parentOption = parentOption; + } + + result.push(option); + var children = option.children; // here we don't judge if option.type is `group` + // when new option doesn't provide `type`, it will cause that the children can't be updated. + + if (children && children.length) { + this._flatten(children, result, option); + } // Deleting for JSON output, and for not affecting group creation. + + + delete option.children; + }, this); + }; // FIXME + // Pass to view using payload? setOption has a payload? + + + GraphicComponentModel.prototype.useElOptionsToUpdate = function () { + var els = this._elOptionsToUpdate; // Clear to avoid render duplicately when zooming. + + this._elOptionsToUpdate = null; + return els; + }; + + GraphicComponentModel.type = 'graphic'; + GraphicComponentModel.defaultOption = { + elements: [] // parentId: null + + }; + return GraphicComponentModel; + }(ComponentModel); + + var nonShapeGraphicElements = { + // Reserved but not supported in graphic component. + path: null, + compoundPath: null, + // Supported in graphic component. + group: Group, + image: ZRImage, + text: ZRText + }; + var inner$e = makeInner(); // ------------------------ + // View + // ------------------------ + + var GraphicComponentView = + /** @class */ + function (_super) { + __extends(GraphicComponentView, _super); + + function GraphicComponentView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentView.type; + return _this; + } + + GraphicComponentView.prototype.init = function () { + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) { + // Having leveraged between use cases and algorithm complexity, a very + // simple layout mechanism is used: + // The size(width/height) can be determined by itself or its parent (not + // implemented yet), but can not by its children. (Top-down travel) + // The location(x/y) can be determined by the bounding rect of itself + // (can including its descendants or not) and the size of its parent. + // (Bottom-up travel) + // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, + // view will be reused. + if (graphicModel !== this._lastGraphicModel) { + this._clear(); + } + + this._lastGraphicModel = graphicModel; + + this._updateElements(graphicModel); + + this._relocate(graphicModel, api); + }; + /** + * Update graphic elements. + */ + + + GraphicComponentView.prototype._updateElements = function (graphicModel) { + var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); + + if (!elOptionsToUpdate) { + return; + } + + var elMap = this._elMap; + var rootGroup = this.group; + var globalZ = graphicModel.get('z'); + var globalZLevel = graphicModel.get('zlevel'); // Top-down tranverse to assign graphic settings to each elements. + + each(elOptionsToUpdate, function (elOption) { + var id = convertOptionIdName(elOption.id, null); + var elExisting = id != null ? elMap.get(id) : null; + var parentId = convertOptionIdName(elOption.parentId, null); + var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; + var elType = elOption.type; + var elOptionStyle = elOption.style; + + if (elType === 'text' && elOptionStyle) { + // In top/bottom mode, textVerticalAlign should not be used, which cause + // inaccurately locating. + if (elOption.hv && elOption.hv[1]) { + elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; + } + } + + var textContentOption = elOption.textContent; + var textConfig = elOption.textConfig; + + if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { + var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); + + if (!textConfig && convertResult.textConfig) { + textConfig = elOption.textConfig = convertResult.textConfig; + } + + if (!textContentOption && convertResult.textContent) { + textContentOption = convertResult.textContent; + } + } // Remove unnecessary props to avoid potential problems. + + + var elOptionCleaned = getCleanedElOption(elOption); // For simple, do not support parent change, otherwise reorder is needed. + + if ("development" !== 'production') { + elExisting && assert(targetElParent === elExisting.parent, 'Changing parent is not supported.'); + } + + var $action = elOption.$action || 'merge'; + var isMerge = $action === 'merge'; + var isReplace = $action === 'replace'; + + if (isMerge) { + var isInit = !elExisting; + var el_1 = elExisting; + + if (isInit) { + el_1 = createEl$1(id, targetElParent, elOption.type, elMap); + } else { + el_1 && (inner$e(el_1).isNew = false); // Stop and restore before update any other attributes. + + stopPreviousKeyframeAnimationAndRestore(el_1); + } + + if (el_1) { + applyUpdateTransition(el_1, elOptionCleaned, graphicModel, { + isInit: isInit + }); + updateCommonAttrs(el_1, elOption, globalZ, globalZLevel); + } + } else if (isReplace) { + removeEl(elExisting, elOption, elMap, graphicModel); + var el_2 = createEl$1(id, targetElParent, elOption.type, elMap); + + if (el_2) { + applyUpdateTransition(el_2, elOptionCleaned, graphicModel, { + isInit: true + }); + updateCommonAttrs(el_2, elOption, globalZ, globalZLevel); + } + } else if ($action === 'remove') { + updateLeaveTo(elExisting, elOption); + removeEl(elExisting, elOption, elMap, graphicModel); + } + + var el = elMap.get(id); + + if (el && textContentOption) { + if (isMerge) { + var textContentExisting = el.getTextContent(); + textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption)); + } else if (isReplace) { + el.setTextContent(new ZRText(textContentOption)); + } + } + + if (el) { + var clipPathOption = elOption.clipPath; + + if (clipPathOption) { + var clipPathType = clipPathOption.type; + var clipPath = void 0; + var isInit = false; + + if (isMerge) { + var oldClipPath = el.getClipPath(); + isInit = !oldClipPath || inner$e(oldClipPath).type !== clipPathType; + clipPath = isInit ? newEl(clipPathType) : oldClipPath; + } else if (isReplace) { + isInit = true; + clipPath = newEl(clipPathType); + } + + el.setClipPath(clipPath); + applyUpdateTransition(clipPath, clipPathOption, graphicModel, { + isInit: isInit + }); + applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel); + } + + var elInner = inner$e(el); + el.setTextConfig(textConfig); + elInner.option = elOption; + setEventData(el, graphicModel, elOption); + setTooltipConfig({ + el: el, + componentModel: graphicModel, + itemName: el.name, + itemTooltipOption: elOption.tooltip + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel); + } + }); + }; + /** + * Locate graphic elements. + */ + + + GraphicComponentView.prototype._relocate = function (graphicModel, api) { + var elOptions = graphicModel.option.elements; + var rootGroup = this.group; + var elMap = this._elMap; + var apiWidth = api.getWidth(); + var apiHeight = api.getHeight(); + var xy = ['x', 'y']; // Top-down to calculate percentage width/height of group + + for (var i = 0; i < elOptions.length; i++) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el || !el.isGroup) { + continue; + } + + var parentEl = el.parent; + var isParentRoot = parentEl === rootGroup; // Like 'position:absolut' in css, default 0. + + var elInner = inner$e(el); + var parentElInner = inner$e(parentEl); + elInner.width = parsePercent$1(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0; + elInner.height = parsePercent$1(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0; + } // Bottom-up tranvese all elements (consider ec resize) to locate elements. + + + for (var i = elOptions.length - 1; i >= 0; i--) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el) { + continue; + } + + var parentEl = el.parent; + var parentElInner = inner$e(parentEl); + var containerInfo = parentEl === rootGroup ? { + width: apiWidth, + height: apiHeight + } : { + width: parentElInner.width, + height: parentElInner.height + }; // PENDING + // Currently, when `bounding: 'all'`, the union bounding rect of the group + // does not include the rect of [0, 0, group.width, group.height], which + // is probably weird for users. Should we make a break change for it? + + var layoutPos = {}; + var layouted = positionElement(el, elOption, containerInfo, null, { + hv: elOption.hv, + boundingMode: elOption.bounding + }, layoutPos); + + if (!inner$e(el).isNew && layouted) { + var transition = elOption.transition; + var animatePos = {}; + + for (var k = 0; k < xy.length; k++) { + var key = xy[k]; + var val = layoutPos[key]; + + if (transition && (isTransitionAll(transition) || indexOf(transition, key) >= 0)) { + animatePos[key] = val; + } else { + el[key] = val; + } + } + + updateProps(el, animatePos, graphicModel, 0); + } else { + el.attr(layoutPos); + } + } + }; + /** + * Clear all elements. + */ + + + GraphicComponentView.prototype._clear = function () { + var _this = this; + + var elMap = this._elMap; + elMap.each(function (el) { + removeEl(el, inner$e(el).option, elMap, _this._lastGraphicModel); + }); + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.dispose = function () { + this._clear(); + }; + + GraphicComponentView.type = 'graphic'; + return GraphicComponentView; + }(ComponentView); + + function newEl(graphicType) { + if ("development" !== 'production') { + assert(graphicType, 'graphic type MUST be set'); + } + + var Clz = hasOwn(nonShapeGraphicElements, graphicType) // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + ? nonShapeGraphicElements[graphicType] : getShapeClass(graphicType); + + if ("development" !== 'production') { + assert(Clz, "graphic type " + graphicType + " can not be found"); + } + + var el = new Clz({}); + inner$e(el).type = graphicType; + return el; + } + + function createEl$1(id, targetElParent, graphicType, elMap) { + var el = newEl(graphicType); + targetElParent.add(el); + elMap.set(id, el); + inner$e(el).id = id; + inner$e(el).isNew = true; + return el; + } + + function removeEl(elExisting, elOption, elMap, graphicModel) { + var existElParent = elExisting && elExisting.parent; + + if (existElParent) { + elExisting.type === 'group' && elExisting.traverse(function (el) { + removeEl(el, elOption, elMap, graphicModel); + }); + applyLeaveTransition(elExisting, elOption, graphicModel); + elMap.removeKey(inner$e(elExisting).id); + } + } + + function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) { + if (!el.isGroup) { + each([['cursor', Displayable.prototype.cursor], // We should not support configure z and zlevel in the element level. + // But seems we didn't limit it previously. So here still use it to avoid breaking. + ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0], // z2 must not be null/undefined, otherwise sort error may occur. + ['z2', 0]], function (item) { + var prop = item[0]; + + if (hasOwn(elOption, prop)) { + el[prop] = retrieve2(elOption[prop], item[1]); + } else if (el[prop] == null) { + el[prop] = item[1]; + } + }); + } + + each(keys(elOption), function (key) { + // Assign event handlers. + // PENDING: should enumerate all event names or use pattern matching? + if (key.indexOf('on') === 0) { + var val = elOption[key]; + el[key] = isFunction(val) ? val : null; + } + }); + + if (hasOwn(elOption, 'draggable')) { + el.draggable = elOption.draggable; + } // Other attributes + + + elOption.name != null && (el.name = elOption.name); + elOption.id != null && (el.id = elOption.id); + } // Remove unnecessary props to avoid potential problems. + + + function getCleanedElOption(elOption) { + elOption = extend({}, elOption); + each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(LOCATION_PARAMS), function (name) { + delete elOption[name]; + }); + return elOption; + } + + function setEventData(el, graphicModel, elOption) { + var eventData = getECData(el).eventData; // Simple optimize for large amount of elements that no need event. + + if (!el.silent && !el.ignore && !eventData) { + eventData = getECData(el).eventData = { + componentType: 'graphic', + componentIndex: graphicModel.componentIndex, + name: el.name + }; + } // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + + + if (eventData) { + eventData.info = elOption.info; + } + } + + function install$x(registers) { + registers.registerComponentModel(GraphicComponentModel); + registers.registerComponentView(GraphicComponentView); + registers.registerPreprocessor(function (option) { + var graphicOption = option.graphic; // Convert + // {graphic: [{left: 10, type: 'circle'}, ...]} + // or + // {graphic: {left: 10, type: 'circle'}} + // to + // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]} + + if (isArray(graphicOption)) { + if (!graphicOption[0] || !graphicOption[0].elements) { + option.graphic = [{ + elements: graphicOption + }]; + } else { + // Only one graphic instance can be instantiated. (We don't + // want that too many views are created in echarts._viewMap.) + option.graphic = [option.graphic[0]]; + } + } else if (graphicOption && !graphicOption.elements) { + option.graphic = [{ + elements: [graphicOption] + }]; + } + }); + } + + var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single']; // Supported coords. + // FIXME: polar has been broken (but rarely used). + + var SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis']; + function isCoordSupported(seriesModel) { + var coordType = seriesModel.get('coordinateSystem'); + return indexOf(SERIES_COORDS, coordType) >= 0; + } + function getAxisMainType(axisDim) { + if ("development" !== 'production') { + assert(axisDim); + } + + return axisDim + 'Axis'; + } + /** + * If two dataZoomModels has the same axis controlled, we say that they are 'linked'. + * This function finds all linked dataZoomModels start from the given payload. + */ + + function findEffectedDataZooms(ecModel, payload) { + // Key: `DataZoomAxisDimension` + var axisRecords = createHashMap(); + var effectedModels = []; // Key: uid of dataZoomModel + + var effectedModelMap = createHashMap(); // Find the dataZooms specified by payload. + + ecModel.eachComponent({ + mainType: 'dataZoom', + query: payload + }, function (dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid)) { + addToEffected(dataZoomModel); + } + }); // Start from the given dataZoomModels, travel the graph to find + // all of the linked dataZoom models. + + var foundNewLink; + + do { + foundNewLink = false; + ecModel.eachComponent('dataZoom', processSingle); + } while (foundNewLink); + + function processSingle(dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) { + addToEffected(dataZoomModel); + foundNewLink = true; + } + } + + function addToEffected(dataZoom) { + effectedModelMap.set(dataZoom.uid, true); + effectedModels.push(dataZoom); + markAxisControlled(dataZoom); + } + + function isLinked(dataZoomModel) { + var isLink = false; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisIdxArr = axisRecords.get(axisDim); + + if (axisIdxArr && axisIdxArr[axisIndex]) { + isLink = true; + } + }); + return isLink; + } + + function markAxisControlled(dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true; + }); + } + + return effectedModels; + } + /** + * Find the first target coordinate system. + * Available after model built. + * + * @return Like { + * grid: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polar: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * singleAxis: [ + * {model: coord0, axisModels: [], coordIndex: 0} + * ] + * } + */ + + function collectReferCoordSysModelInfo(dataZoomModel) { + var ecModel = dataZoomModel.ecModel; + var coordSysInfoWrap = { + infoList: [], + infoMap: createHashMap() + }; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + + if (!axisModel) { + return; + } + + var coordSysModel = axisModel.getCoordSysModel(); + + if (!coordSysModel) { + return; + } + + var coordSysUid = coordSysModel.uid; + var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid); + + if (!coordSysInfo) { + coordSysInfo = { + model: coordSysModel, + axisModels: [] + }; + coordSysInfoWrap.infoList.push(coordSysInfo); + coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo); + } + + coordSysInfo.axisModels.push(axisModel); + }); + return coordSysInfoWrap; + } + + var DataZoomAxisInfo = + /** @class */ + function () { + function DataZoomAxisInfo() { + this.indexList = []; + this.indexMap = []; + } + + DataZoomAxisInfo.prototype.add = function (axisCmptIdx) { + // Remove duplication. + if (!this.indexMap[axisCmptIdx]) { + this.indexList.push(axisCmptIdx); + this.indexMap[axisCmptIdx] = true; + } + }; + + return DataZoomAxisInfo; + }(); + + var DataZoomModel = + /** @class */ + function (_super) { + __extends(DataZoomModel, _super); + + function DataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomModel.type; + _this._autoThrottle = true; + _this._noTarget = true; + /** + * It is `[rangeModeForMin, rangeModeForMax]`. + * The optional values for `rangeMode`: + * + `'value'` mode: the axis extent will always be determined by + * `dataZoom.startValue` and `dataZoom.endValue`, despite + * how data like and how `axis.min` and `axis.max` are. + * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`, + * where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`, + * and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`. + * Axis extent will be determined by the result of the percent of `[dMin, dMax]`. + * + * For example, when users are using dynamic data (update data periodically via `setOption`), + * if in `'value`' mode, the window will be kept in a fixed value range despite how + * data are appended, while if in `'percent'` mode, whe window range will be changed alone with + * the appended data (suppose `axis.min` and `axis.max` are not specified). + */ + + _this._rangePropMode = ['percent', 'percent']; + return _this; + } + + DataZoomModel.prototype.init = function (option, parentModel, ecModel) { + var inputRawOption = retrieveRawOption(option); + /** + * Suppose a "main process" start at the point that model prepared (that is, + * model initialized or merged or method called in `action`). + * We should keep the `main process` idempotent, that is, given a set of values + * on `option`, we get the same result. + * + * But sometimes, values on `option` will be updated for providing users + * a "final calculated value" (`dataZoomProcessor` will do that). Those value + * should not be the base/input of the `main process`. + * + * So in that case we should save and keep the input of the `main process` + * separately, called `settledOption`. + * + * For example, consider the case: + * (Step_1) brush zoom the grid by `toolbox.dataZoom`, + * where the original input `option.startValue`, `option.endValue` are earsed by + * calculated value. + * (Step)2) click the legend to hide and show a series, + * where the new range is calculated by the earsed `startValue` and `endValue`, + * which brings incorrect result. + */ + + this.settledOption = inputRawOption; + this.mergeDefaultAndTheme(option, ecModel); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype.mergeOption = function (newOption) { + var inputRawOption = retrieveRawOption(newOption); // FIX #2591 + + merge(this.option, newOption, true); + merge(this.settledOption, inputRawOption, true); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype._doInit = function (inputRawOption) { + var thisOption = this.option; + + this._setDefaultThrottle(inputRawOption); + + this._updateRangeUse(inputRawOption); + + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + // start/end has higher priority over startValue/endValue if they + // both set, but we should make chart.setOption({endValue: 1000}) + // effective, rather than chart.setOption({endValue: 1000, end: null}). + if (this._rangePropMode[index] === 'value') { + thisOption[names[0]] = settledOption[names[0]] = null; + } // Otherwise do nothing and use the merge result. + + }, this); + + this._resetTarget(); + }; + + DataZoomModel.prototype._resetTarget = function () { + var optionOrient = this.get('orient', true); + var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); + + var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); + + if (hasAxisSpecified) { + this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); + } else { + this._orient = optionOrient || 'horizontal'; + + this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); + } + + this._noTarget = true; + targetAxisIndexMap.each(function (axisInfo) { + if (axisInfo.indexList.length) { + this._noTarget = false; + } + }, this); + }; + + DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) { + var hasAxisSpecified = false; + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occurred. + + if (!refering.specified) { + return; + } + + hasAxisSpecified = true; + var axisInfo = new DataZoomAxisInfo(); + each(refering.models, function (axisModel) { + axisInfo.add(axisModel.componentIndex); + }); + targetAxisIndexMap.set(axisDim, axisInfo); + }, this); + return hasAxisSpecified; + }; + + DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) { + var ecModel = this.ecModel; + var needAuto = true; // Find axis that parallel to dataZoom as default. + + if (needAuto) { + var axisDim = orient === 'vertical' ? 'y' : 'x'; + var axisModels = ecModel.findComponents({ + mainType: axisDim + 'Axis' + }); + setParallelAxis(axisModels, axisDim); + } // Find axis that parallel to dataZoom as default. + + + if (needAuto) { + var axisModels = ecModel.findComponents({ + mainType: 'singleAxis', + filter: function (axisModel) { + return axisModel.get('orient', true) === orient; + } + }); + setParallelAxis(axisModels, 'single'); + } + + function setParallelAxis(axisModels, axisDim) { + // At least use the first parallel axis as the target axis. + var axisModel = axisModels[0]; + + if (!axisModel) { + return; + } + + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModel.componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; // Find parallel axes in the same grid. + + if (axisDim === 'x' || axisDim === 'y') { + var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + gridModel_1 && each(axisModels, function (axModel) { + if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) { + axisInfo.add(axModel.componentIndex); + } + }); + } + } + + if (needAuto) { + // If no parallel axis, find the first category axis as default. (Also consider polar). + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + if (!needAuto) { + return; + } + + var axisModels = ecModel.findComponents({ + mainType: getAxisMainType(axisDim), + filter: function (axisModel) { + return axisModel.get('type', true) === 'category'; + } + }); + + if (axisModels[0]) { + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModels[0].componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; + } + }, this); + } + }; + + DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () { + var dim; // Find the first axis + + this.eachTargetAxis(function (axisDim) { + !dim && (dim = axisDim); + }, this); + return dim === 'y' ? 'vertical' : 'horizontal'; + }; + + DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) { + // When first time user set throttle, auto throttle ends. + if (inputRawOption.hasOwnProperty('throttle')) { + this._autoThrottle = false; + } + + if (this._autoThrottle) { + var globalOption = this.ecModel.option; + this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; + } + }; + + DataZoomModel.prototype._updateRangeUse = function (inputRawOption) { + var rangePropMode = this._rangePropMode; + var rangeModeInOption = this.get('rangeMode'); + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + var percentSpecified = inputRawOption[names[0]] != null; + var valueSpecified = inputRawOption[names[1]] != null; + + if (percentSpecified && !valueSpecified) { + rangePropMode[index] = 'percent'; + } else if (!percentSpecified && valueSpecified) { + rangePropMode[index] = 'value'; + } else if (rangeModeInOption) { + rangePropMode[index] = rangeModeInOption[index]; + } else if (percentSpecified) { + // percentSpecified && valueSpecified + rangePropMode[index] = 'percent'; + } // else remain its original setting. + + }); + }; + + DataZoomModel.prototype.noTarget = function () { + return this._noTarget; + }; + + DataZoomModel.prototype.getFirstTargetAxisModel = function () { + var firstAxisModel; + this.eachTargetAxis(function (axisDim, axisIndex) { + if (firstAxisModel == null) { + firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }, this); + return firstAxisModel; + }; + /** + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + + + DataZoomModel.prototype.eachTargetAxis = function (callback, context) { + this._targetAxisInfoMap.each(function (axisInfo, axisDim) { + each(axisInfo.indexList, function (axisIndex) { + callback.call(context, axisDim, axisIndex); + }); + }); + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) { + var axisModel = this.getAxisModel(axisDim, axisIndex); + + if (axisModel) { + return axisModel.__dzAxisProxy; + } + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) { + if ("development" !== 'production') { + assert(axisDim && axisIndex != null); + } + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + if (axisInfo && axisInfo.indexMap[axisIndex]) { + return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }; + /** + * If not specified, set to undefined. + */ + + + DataZoomModel.prototype.setRawRange = function (opt) { + var thisOption = this.option; + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names) { + // Consider the pair : + // If one has value and the other one is `null/undefined`, we both set them + // to `settledOption`. This strategy enables the feature to clear the original + // value in `settledOption` to `null/undefined`. + // But if both of them are `null/undefined`, we do not set them to `settledOption` + // and keep `settledOption` with the original value. This strategy enables users to + // only set but not set when calling + // `dispatchAction`. + // The pair is treated in the same way. + if (opt[names[0]] != null || opt[names[1]] != null) { + thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; + thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; + } + }, this); + + this._updateRangeUse(opt); + }; + + DataZoomModel.prototype.setCalculatedRange = function (opt) { + var option = this.option; + each(['start', 'startValue', 'end', 'endValue'], function (name) { + option[name] = opt[name]; + }); + }; + + DataZoomModel.prototype.getPercentRange = function () { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }; + /** + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @return [startValue, endValue] value can only be '-' or finite number. + */ + + + DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) { + if (axisDim == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } else { + return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); + } + }; + /** + * @param axisModel If axisModel given, find axisProxy + * corresponding to the axisModel + */ + + + DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) { + if (axisModel) { + return axisModel.__dzAxisProxy; + } // Find the first hosted axisProxy + + + var firstProxy; + + var axisDimList = this._targetAxisInfoMap.keys(); + + for (var i = 0; i < axisDimList.length; i++) { + var axisDim = axisDimList[i]; + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + for (var j = 0; j < axisInfo.indexList.length; j++) { + var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); + + if (proxy.hostedBy(this)) { + return proxy; + } + + if (!firstProxy) { + firstProxy = proxy; + } + } + } // If no hosted proxy found, still need to return a proxy. + // This case always happens in toolbox dataZoom, where axes are all hosted by + // other dataZooms. + + + return firstProxy; + }; + + DataZoomModel.prototype.getRangePropMode = function () { + return this._rangePropMode.slice(); + }; + + DataZoomModel.prototype.getOrient = function () { + if ("development" !== 'production') { + // Should not be called before initialized. + assert(this._orient); + } + + return this._orient; + }; + + DataZoomModel.type = 'dataZoom'; + DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox']; + DataZoomModel.defaultOption = { + // zlevel: 0, + z: 4, + filterMode: 'filter', + start: 0, + end: 100 + }; + return DataZoomModel; + }(ComponentModel); + /** + * Retrieve those raw params from option, which will be cached separately, + * because they will be overwritten by normalized/calculated values in the main + * process. + */ + + + function retrieveRawOption(option) { + var ret = {}; + each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) { + option.hasOwnProperty(name) && (ret[name] = option[name]); + }); + return ret; + } + + var SelectDataZoomModel = + /** @class */ + function (_super) { + __extends(SelectDataZoomModel, _super); + + function SelectDataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomModel.type; + return _this; + } + + SelectDataZoomModel.type = 'dataZoom.select'; + return SelectDataZoomModel; + }(DataZoomModel); + + var DataZoomView = + /** @class */ + function (_super) { + __extends(DataZoomView, _super); + + function DataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomView.type; + return _this; + } + + DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }; + + DataZoomView.type = 'dataZoom'; + return DataZoomView; + }(ComponentView); + + var SelectDataZoomView = + /** @class */ + function (_super) { + __extends(SelectDataZoomView, _super); + + function SelectDataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomView.type; + return _this; + } + + SelectDataZoomView.type = 'dataZoom.select'; + return SelectDataZoomView; + }(DataZoomView); + + var each$8 = each; + var asc$1 = asc; + /** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + */ + + var AxisProxy = + /** @class */ + function () { + function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) { + this._dimName = dimName; + this._axisIndex = axisIndex; + this.ecModel = ecModel; + this._dataZoomModel = dataZoomModel; // /** + // * @readOnly + // * @private + // */ + // this.hasSeriesStacked; + } + /** + * Whether the axisProxy is hosted by dataZoomModel. + */ + + + AxisProxy.prototype.hostedBy = function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }; + /** + * @return Value can only be NaN or finite value. + */ + + + AxisProxy.prototype.getDataValueWindow = function () { + return this._valueWindow.slice(); + }; + /** + * @return {Array.} + */ + + + AxisProxy.prototype.getDataPercentWindow = function () { + return this._percentWindow.slice(); + }; + + AxisProxy.prototype.getTargetSeriesModels = function () { + var seriesModels = []; + this.ecModel.eachSeries(function (seriesModel) { + if (isCoordSupported(seriesModel)) { + var axisMainType = getAxisMainType(this._dimName); + var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0]; + + if (axisModel && this._axisIndex === axisModel.componentIndex) { + seriesModels.push(seriesModel); + } + } + }, this); + return seriesModels; + }; + + AxisProxy.prototype.getAxisModel = function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }; + + AxisProxy.prototype.getMinMaxSpan = function () { + return clone(this._minMaxSpan); + }; + /** + * Only calculate by given range and this._dataExtent, do not change anything. + */ + + + AxisProxy.prototype.calculateDataWindow = function (opt) { + var dataExtent = this._dataExtent; + var axisModel = this.getAxisModel(); + var scale = axisModel.axis.scale; + + var rangePropMode = this._dataZoomModel.getRangePropMode(); + + var percentExtent = [0, 100]; + var percentWindow = []; + var valueWindow = []; + var hasPropModeValue; + each$8(['start', 'end'], function (prop, idx) { + var boundPercent = opt[prop]; + var boundValue = opt[prop + 'Value']; // Notice: dataZoom is based either on `percentProp` ('start', 'end') or + // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent + // but not min/max of axis, which will be calculated by data window then). + // The former one is suitable for cases that a dataZoom component controls multiple + // axes with different unit or extent, and the latter one is suitable for accurate + // zoom by pixel (e.g., in dataZoomSelect). + // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated + // only when setOption or dispatchAction, otherwise it remains its original value. + // (Why not only record `percentProp` and always map to `valueProp`? Because + // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original + // `valueProp`. consider two axes constrolled by one dataZoom. They have different + // data extent. All of values that are overflow the `dataExtent` will be calculated + // to percent '100%'). + + if (rangePropMode[idx] === 'percent') { + boundPercent == null && (boundPercent = percentExtent[idx]); // Use scale.parse to math round for category or time axis. + + boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent)); + } else { + hasPropModeValue = true; + boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue); // Calculating `percent` from `value` may be not accurate, because + // This calculation can not be inversed, because all of values that + // are overflow the `dataExtent` will be calculated to percent '100%' + + boundPercent = linearMap(boundValue, dataExtent, percentExtent); + } // valueWindow[idx] = round(boundValue); + // percentWindow[idx] = round(boundPercent); + // fallback to extent start/end when parsed value or percent is invalid + + + valueWindow[idx] = boundValue == null || isNaN(boundValue) ? dataExtent[idx] : boundValue; + percentWindow[idx] = boundPercent == null || isNaN(boundPercent) ? percentExtent[idx] : boundPercent; + }); + asc$1(valueWindow); + asc$1(percentWindow); // The windows from user calling of `dispatchAction` might be out of the extent, + // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we don't restrict window + // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint, + // where API is able to initialize/modify the window size even though `zoomLock` + // specified. + + var spans = this._minMaxSpan; + hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true); + + function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) { + var suffix = toValue ? 'Span' : 'ValueSpan'; + sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]); + + for (var i = 0; i < 2; i++) { + toWindow[i] = linearMap(fromWindow[i], fromExtent, toExtent, true); + toValue && (toWindow[i] = scale.parse(toWindow[i])); + } + } + + return { + valueWindow: valueWindow, + percentWindow: percentWindow + }; + }; + /** + * Notice: reset should not be called before series.restoreData() is called, + * so it is recommended to be called in "process stage" but not "model init + * stage". + */ + + + AxisProxy.prototype.reset = function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them. + + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); // `calculateDataWindow` uses min/maxSpan. + + this._updateMinMaxSpan(); + + var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; // Update axis setting then. + + this._setAxisModel(); + }; + + AxisProxy.prototype.filterData = function (dataZoomModel, api) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + if (filterMode === 'none') { + return; + } // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data, NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty. + // In fect, it is not a big deal that do not support filterMode-'filter' + // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis + // selection" some day, which might need "adapt to data extent on the + // otherAxis", which is disabled by filterMode-'empty'. + // But currently, stack has been fixed to based on value but not index, + // so this is not an issue any more. + // let otherAxisModel = this.getOtherAxisModel(); + // if (dataZoomModel.get('$fromToolbox') + // && otherAxisModel + // && otherAxisModel.hasSeriesStacked + // ) { + // filterMode = 'empty'; + // } + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + + + each$8(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + var dataDims = seriesData.mapDimensionsAll(axisDim); + + if (!dataDims.length) { + return; + } + + if (filterMode === 'weakFilter') { + var store_1 = seriesData.getStore(); + var dataDimIndices_1 = map(dataDims, function (dim) { + return seriesData.getDimensionIndex(dim); + }, seriesData); + seriesData.filterSelf(function (dataIndex) { + var leftOut; + var rightOut; + var hasValue; + + for (var i = 0; i < dataDims.length; i++) { + var value = store_1.get(dataDimIndices_1[i], dataIndex); + var thisHasValue = !isNaN(value); + var thisLeftOut = value < valueWindow[0]; + var thisRightOut = value > valueWindow[1]; + + if (thisHasValue && !thisLeftOut && !thisRightOut) { + return true; + } + + thisHasValue && (hasValue = true); + thisLeftOut && (leftOut = true); + thisRightOut && (rightOut = true); + } // If both left out and right out, do not filter. + + + return hasValue && leftOut && rightOut; + }); + } else { + each$8(dataDims, function (dim) { + if (filterMode === 'empty') { + seriesModel.setData(seriesData = seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + })); + } else { + var range = {}; + range[dim] = valueWindow; // console.time('select'); + + seriesData.selectRange(range); // console.timeEnd('select'); + } + }); + } + + each$8(dataDims, function (dim) { + seriesData.setApproximateExtent(valueWindow, dim); + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + }; + + AxisProxy.prototype._updateMinMaxSpan = function () { + var minMaxSpan = this._minMaxSpan = {}; + var dataZoomModel = this._dataZoomModel; + var dataExtent = this._dataExtent; + each$8(['min', 'max'], function (minMax) { + var percentSpan = dataZoomModel.get(minMax + 'Span'); + var valueSpan = dataZoomModel.get(minMax + 'ValueSpan'); + valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan)); // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan + + if (valueSpan != null) { + percentSpan = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true); + } else if (percentSpan != null) { + valueSpan = linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0]; + } + + minMaxSpan[minMax + 'Span'] = percentSpan; + minMaxSpan[minMax + 'ValueSpan'] = valueSpan; + }, this); + }; + + AxisProxy.prototype._setAxisModel = function () { + var axisModel = this.getAxisModel(); + var percentWindow = this._percentWindow; + var valueWindow = this._valueWindow; + + if (!percentWindow) { + return; + } // [0, 500]: arbitrary value, guess axis extent. + + + var precision = getPixelPrecision(valueWindow, [0, 500]); + precision = Math.min(precision, 20); // For value axis, if min/max/scale are not set, we just use the extent obtained + // by series data, which may be a little different from the extent calculated by + // `axisHelper.getScaleExtent`. But the different just affects the experience a + // little when zooming. So it will not be fixed until some users require it strongly. + + var rawExtentInfo = axisModel.axis.scale.rawExtentInfo; + + if (percentWindow[0] !== 0) { + rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision)); + } + + if (percentWindow[1] !== 100) { + rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision)); + } + + rawExtentInfo.freeze(); + }; + + return AxisProxy; + }(); + + function calculateDataExtent(axisProxy, axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + each$8(seriesModels, function (seriesModel) { + unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim); + }); // It is important to get "consistent" extent when more then one axes is + // controlled by a `dataZoom`, otherwise those axes will not be synchronized + // when zooming. But it is difficult to know what is "consistent", considering + // axes have different type or even different meanings (For example, two + // time axes are used to compare data of the same date in different years). + // So basically dataZoom just obtains extent by series.data (in category axis + // extent can be obtained from axis.data). + // Nevertheless, user can set min/max/scale on axes to make extent of axes + // consistent. + + var axisModel = axisProxy.getAxisModel(); + var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate(); + return [rawExtentResult.min, rawExtentResult.max]; + } + + var dataZoomProcessor = { + // `dataZoomProcessor` will only be performed in needed series. Consider if + // there is a line series and a pie series, it is better not to update the + // line series if only pie series is needed to be updated. + getTargetSeries: function (ecModel) { + function eachAxisModel(cb) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + cb(axisDim, axisIndex, axisModel, dataZoomModel); + }); + }); + } // FIXME: it brings side-effect to `getTargetSeries`. + // Prepare axis proxies. + + + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // dispose all last axis proxy, in case that some axis are deleted. + axisModel.__dzAxisProxy = null; + }); + var proxyList = []; + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // Different dataZooms may constrol the same axis. In that case, + // an axisProxy serves both of them. + if (!axisModel.__dzAxisProxy) { + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel); + proxyList.push(axisModel.__dzAxisProxy); + } + }); + var seriesModelMap = createHashMap(); + each(proxyList, function (axisProxy) { + each(axisProxy.getTargetSeriesModels(), function (seriesModel) { + seriesModelMap.set(seriesModel.uid, seriesModel); + }); + }); + return seriesModelMap; + }, + // Consider appendData, where filter should be performed. Because data process is + // in block mode currently, it is not need to worry about that the overallProgress + // execute every frame. + overallReset: function (ecModel, api) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel); + }); // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api); + }); + }); + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setCalculatedRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + } + }); + } + }; + + function installDataZoomAction(registers) { + registers.registerAction('dataZoom', function (payload, ecModel) { + var effectedModels = findEffectedDataZooms(ecModel, payload); + each(effectedModels, function (dataZoomModel) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + }); + } + + var installed = false; + function installCommon(registers) { + if (installed) { + return; + } + + installed = true; + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor); + installDataZoomAction(registers); + registers.registerSubTypeDefaulter('dataZoom', function () { + // Default 'slider' when no type specified. + return 'slider'; + }); + } + + function install$y(registers) { + registers.registerComponentModel(SelectDataZoomModel); + registers.registerComponentView(SelectDataZoomView); + installCommon(registers); + } + + /* + * 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. + */ + + var ToolboxFeature = + /** @class */ + function () { + function ToolboxFeature() {} + + return ToolboxFeature; + }(); + var features = {}; + function registerFeature(name, ctor) { + features[name] = ctor; + } + function getFeature(name) { + return features[name]; + } + + var ToolboxModel = + /** @class */ + function (_super) { + __extends(ToolboxModel, _super); + + function ToolboxModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ToolboxModel.type; + return _this; + } + + ToolboxModel.prototype.optionUpdated = function () { + _super.prototype.optionUpdated.apply(this, arguments); + + var ecModel = this.ecModel; + each(this.option.feature, function (featureOpt, featureName) { + var Feature = getFeature(featureName); + + if (Feature) { + if (Feature.getDefaultOption) { + Feature.defaultOption = Feature.getDefaultOption(ecModel); + } + + merge(featureOpt, Feature.defaultOption); + } + }); + }; + + ToolboxModel.type = 'toolbox'; + ToolboxModel.layoutMode = { + type: 'box', + ignoreSize: true + }; + ToolboxModel.defaultOption = { + show: true, + z: 6, + // zlevel: 0, + orient: 'horizontal', + left: 'right', + top: 'top', + // right + // bottom + backgroundColor: 'transparent', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemSize: 15, + itemGap: 8, + showTitle: true, + iconStyle: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + iconStyle: { + borderColor: '#3E98C5' + } + }, + // textStyle: {}, + // feature + tooltip: { + show: false, + position: 'bottom' + } + }; + return ToolboxModel; + }(ComponentModel); + + /** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ + + function layout$3(group, componentModel, api) { + var boxLayoutParams = componentModel.getBoxLayoutParams(); + var padding = componentModel.get('padding'); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var rect = getLayoutRect(boxLayoutParams, viewportSize, padding); + box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height); + positionElement(group, boxLayoutParams, viewportSize, padding); + } + function makeBackground(rect, componentModel) { + var padding = normalizeCssArray$1(componentModel.get('padding')); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + + return rect; + } + + var ToolboxView = + /** @class */ + function (_super) { + __extends(ToolboxView, _super); + + function ToolboxView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var isVertical = toolboxModel.get('orient') === 'vertical'; + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + var featureNames = []; + each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute(); // Keep for diff. + + this._featureNames = featureNames; + + function processFeature(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ? + + if (payload && payload.newTitle != null && payload.featureName === featureName) { + featureOpt.title = payload.newTitle; + } + + if (featureName && !oldName) { + // Create + if (isUserFeatureName(featureName)) { + feature = { + onclick: featureModel.option.onclick, + featureName: featureName + }; + } else { + var Feature = getFeature(featureName); + + if (!Feature) { + return; + } + + feature = new Feature(); + } + + features[featureName] = feature; + } else { + feature = features[oldName]; // If feature does not exist. + + if (!feature) { + return; + } + } + + feature.uid = getUID('toolbox-feature'); + feature.model = featureModel; + feature.ecModel = ecModel; + feature.api = api; + var isToolboxFeature = feature instanceof ToolboxFeature; + + if (!featureName && oldName) { + isToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || isToolboxFeature && feature.unusable) { + isToolboxFeature && feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + + if (iconPaths[iconName]) { + (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); + } + }; + + if (feature instanceof ToolboxFeature) { + if (feature.render) { + feature.render(featureModel, ecModel, api, payload); + } + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']); // If one feature has multiple icons, they are organized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + + var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + var iconsMap; + var titlesMap; + + if (isString(icons)) { + iconsMap = {}; + iconsMap[featureName] = icons; + } else { + iconsMap = icons; + } + + if (isString(titles)) { + titlesMap = {}; + titlesMap[featureName] = titles; + } else { + titlesMap = titles; + } + + var iconPaths = featureModel.iconPaths = {}; + each(iconsMap, function (iconStr, iconName) { + var path = createIcon(iconStr, {}, { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }); // TODO handling image + + path.setStyle(iconStyleModel.getItemStyle()); + var pathEmphasisState = path.ensureState('emphasis'); + pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); // Text position calculation + + var textContent = new ZRText({ + style: { + text: titlesMap[iconName], + align: iconStyleEmphasisModel.get('textAlign'), + borderRadius: iconStyleEmphasisModel.get('textBorderRadius'), + padding: iconStyleEmphasisModel.get('textPadding'), + fill: null + }, + ignore: true + }); + path.setTextContent(textContent); + setTooltipConfig({ + el: path, + componentModel: toolboxModel, + itemName: iconName, + formatterParamsExtra: { + title: titlesMap[iconName] + } + }); + path.__title = titlesMap[iconName]; + path.on('mouseover', function () { + // Should not reuse above hoverStyle, which might be modified. + var hoverStyle = iconStyleEmphasisModel.getItemStyle(); + var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top'; + textContent.setStyle({ + fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000', + backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor') + }); + path.setTextConfig({ + position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition + }); + textContent.ignore = !toolboxModel.get('showTitle'); // Use enterEmphasis and leaveEmphasis provide by ec. + // There are flags managed by the echarts. + + api.enterEmphasis(this); + }).on('mouseout', function () { + if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') { + api.leaveEmphasis(this); + } + + textContent.hide(); + }); + (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path); + group.add(path); + path.on('click', bind(feature.onclick, feature, ecModel, api, iconName)); + iconPaths[iconName] = path; + }); + } + + layout$3(group, toolboxModel, api); // Render background after group is layout + // FIXME + + group.add(makeBackground(group.getBoundingRect(), toolboxModel)); // Adjust icon title positions to avoid them out of screen + + isVertical || group.eachChild(function (icon) { + var titleText = icon.__title; // const hoverStyle = icon.hoverStyle; + // TODO simplify code? + + var emphasisState = icon.ensureState('emphasis'); + var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); + var textContent = icon.getTextContent(); + var emphasisTextState = textContent && textContent.ensureState('emphasis'); // May be background element + + if (emphasisTextState && !isFunction(emphasisTextState) && titleText) { + var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); + var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); + var offsetX = icon.x + group.x; + var offsetY = icon.y + group.y + itemSize; + var needPutOnTop = false; + + if (offsetY + rect.height > api.getHeight()) { + emphasisTextConfig.position = 'top'; + needPutOnTop = true; + } + + var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10; + + if (offsetX + rect.width / 2 > api.getWidth()) { + emphasisTextConfig.position = ['100%', topOffset]; + emphasisTextStyle.align = 'right'; + } else if (offsetX - rect.width / 2 < 0) { + emphasisTextConfig.position = [0, topOffset]; + emphasisTextStyle.align = 'left'; + } + } + }); + }; + + ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); + }); + }; // updateLayout(toolboxModel, ecModel, api, payload) { + // zrUtil.each(this._features, function (feature) { + // feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); + // }); + // }, + + + ToolboxView.prototype.remove = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }; + + ToolboxView.prototype.dispose = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + }); + }; + + ToolboxView.type = 'toolbox'; + return ToolboxView; + }(ComponentView); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + /* global window, document */ + + var SaveAsImage = + /** @class */ + function (_super) { + __extends(SaveAsImage, _super); + + function SaveAsImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + + SaveAsImage.prototype.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var isSvg = api.getZr().painter.getType() === 'svg'; + var type = isSvg ? 'svg' : model.get('type', true) || 'png'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff', + connectedBackgroundColor: model.get('connectedBackgroundColor'), + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + var browser = env.browser; // Chrome, Firefox, New Edge + + if (isFunction(MouseEvent) && (browser.newEdge || !browser.ie && !browser.edge)) { + var $a = document.createElement('a'); + $a.download = title + '.' + type; + $a.target = '_blank'; + $a.href = url; + var evt = new MouseEvent('click', { + // some micro front-end framework, window maybe is a Proxy + view: document.defaultView, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } // IE or old Edge + else { + // @ts-ignore + if (window.navigator.msSaveOrOpenBlob || isSvg) { + var parts = url.split(','); // data:[][;charset=][;base64], + + var base64Encoded = parts[0].indexOf('base64') > -1; + var bstr = isSvg // should decode the svg data uri first + ? decodeURIComponent(parts[1]) : parts[1]; // only `atob` when the data uri is encoded with base64 + // otherwise, like `svg` data uri exported by zrender, + // there will be an error, for it's not encoded with base64. + // (just a url-encoded string through `encodeURIComponent`) + + base64Encoded && (bstr = window.atob(bstr)); + var filename = title + '.' + type; // @ts-ignore + + if (window.navigator.msSaveOrOpenBlob) { + var n = bstr.length; + var u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + var blob = new Blob([u8arr]); // @ts-ignore + + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + var cw = frame.contentWindow; + var doc = cw.document; + doc.open('image/svg+xml', 'replace'); + doc.write(bstr); + doc.close(); + cw.focus(); + doc.execCommand('SaveAs', true, filename); + document.body.removeChild(frame); + } + } else { + var lang = model.get('lang'); + var html = '' + '' + '' + ''; + var tab = window.open(); + tab.document.write(html); + tab.document.title = title; + } + } + }; + + SaveAsImage.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'title']), + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + connectedBackgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + // use current pixel ratio of device by default + // pixelRatio: 1, + lang: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'lang']) + }; + return defaultOption; + }; + + return SaveAsImage; + }(ToolboxFeature); + + var INNER_STACK_KEYWORD = '__ec_magicType_stack__'; + var radioTypes = [['line', 'bar'], ['stack']]; + + var MagicType = + /** @class */ + function (_super) { + __extends(MagicType, _super); + + function MagicType() { + return _super !== null && _super.apply(this, arguments) || this; + } + + MagicType.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + MagicType.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + // eslint-disable-next-line + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line + + }, + // `line`, `bar`, `stack`, `tiled` + title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']), + option: {}, + seriesIndex: {} + }; + return defaultOption; + }; + + MagicType.prototype.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get(['seriesIndex', type]); // Not supported magicType + + if (!seriesOptGenreator[type]) { + return; + } + + var newOption = { + series: [] + }; + + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model); + + if (newSeriesOpt) { + // PENDING If merge original option? + defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } // Modify boundaryGap + + + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisType = axisDim + 'Axis'; + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + var axisIndex = axisModel.componentIndex; + newOption[axisType] = newOption[axisType] || []; + + for (var i = 0; i <= axisIndex; i++) { + newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; + } + + newOption[axisType][axisIndex].boundaryGap = type === 'bar'; + } + } + }; + + each(radioTypes, function (radio) { + if (indexOf(radio, type) >= 0) { + each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + model.setIconStatus(type, 'emphasis'); + ecModel.eachComponent({ + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes); + var newTitle; + var currentType = type; // Change title of stack + + if (type === 'stack') { + // use titles in model instead of ecModel + // as stack and tiled appears in pair, just flip them + // no need of checking stack state + newTitle = merge({ + stack: model.option.title.tiled, + tiled: model.option.title.stack + }, model.option.title); + + if (model.get(['iconStatus', type]) !== 'emphasis') { + currentType = 'tiled'; + } + } + + api.dispatchAction({ + type: 'changeMagicType', + currentType: currentType, + newOption: newOption, + newTitle: newTitle, + featureName: 'magicType' + }); + }; + + return MagicType; + }(ToolboxFeature); + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'line']) || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'bar']) || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD; + + if (seriesType === 'line' || seriesType === 'bar') { + model.setIconStatus('stack', isStack ? 'normal' : 'emphasis'); + return merge({ + id: seriesId, + stack: isStack ? '' : INNER_STACK_KEYWORD + }, model.get(['option', 'stack']) || {}, true); + } + } + }; // TODO: SELF REGISTERED. + + registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + /* global document */ + + var BLOCK_SPLITER = new Array(60).join('-'); + var ITEM_SPLITER = '\t'; + /** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + */ + + function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size. + var baseAxis = coordSys.getBaseAxis(); + + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } else { + otherSeries.push(seriesModel); + } + } else { + otherSeries.push(seriesModel); + } + }); + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; + } + /** + * Assemble content of series on cateogory axis + * @inner + */ + + + function assembleSeriesWithCategoryAxis(groups) { + var tables = []; + each(groups, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + var headers = [' '].concat(map(group.series, function (series) { + return series.name; + })); // @ts-ignore TODO Polar + + var columns = [categoryAxis.model.getCategories()]; + each(group.series, function (series) { + var rawData = series.getRawData(); + columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) { + return val; + })); + }); // Assemble table content + + var lines = [headers.join(ITEM_SPLITER)]; + + for (var i = 0; i < columns[0].length; i++) { + var items = []; + + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + + lines.push(items.join(ITEM_SPLITER)); + } + + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + /** + * Assemble content of other series + */ + + + function assembleOtherSeries(series) { + return map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + + lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + function getContentFromModel(ecModel) { + var result = groupSeries(ecModel); + return { + value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) { + return !!str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + meta: result.meta + }; + } + + function trim$1(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + /** + * If a block is tsv format + */ + + + function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } + } + + var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); + /** + * @param {string} tsv + * @return {Object} + */ + + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim$1(tsvLines.shift()).split(itemSplitRegex); + var categories = []; + var series = map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + + for (var i = 0; i < tsvLines.length; i++) { + var items = trim$1(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + + return { + series: series, + categories: categories + }; + } + + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim$1(lines.shift()); + var data = []; + + for (var i = 0; i < lines.length; i++) { + // if line is empty, ignore it. + // there is a case that a user forgot to delete `\n`. + var line = trim$1(lines[i]); + + if (!line) { + continue; + } + + var items = line.split(itemSplitRegex); + var name_1 = ''; + var value = void 0; + var hasName = false; + + if (isNaN(items[0])) { + // First item is name + hasName = true; + name_1 = items[0]; + items = items.slice(1); + data[i] = { + name: name_1, + value: [] + }; + value = data[i].value; + } else { + value = data[i] = []; + } + + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + + if (value.length === 1) { + hasName ? data[i].value = value[0] : data[i] = value[0]; + } + } + + return { + name: seriesName, + data: data + }; + } + + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + each(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; + } + + var DataView = + /** @class */ + function (_super) { + __extends(DataView, _super); + + function DataView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataView.prototype.onclick = function (ecModel, api) { + // FIXME: better way? + setTimeout(function () { + api.dispatchAction({ + type: 'hideTip' + }); + }); + var container = api.getDom(); + var model = this.model; + + if (this._dom) { + container.removeChild(this._dom); + } + + var root = document.createElement('div'); // use padding to avoid 5px whitespace + + root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; // Create elements + + var header = document.createElement('h4'); + var lang = model.get('lang') || []; + header.innerHTML = lang[0] || model.get('title'); + header.style.cssText = 'margin:10px 20px'; + header.style.color = model.get('textColor'); + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'overflow:auto'; + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + + if (isFunction(optionToContent)) { + var htmlOrDom = optionToContent(api.getOption()); + + if (isString(htmlOrDom)) { + viewMain.innerHTML = htmlOrDom; + } else if (isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } else { + // Use default textarea + textarea.readOnly = model.get('readOnly'); + var style = textarea.style; // eslint-disable-next-line max-len + + style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none'; + style.color = model.get('textColor'); + style.borderColor = model.get('textareaBorderColor'); + style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + viewMain.appendChild(textarea); + } + + var blockMetaList = result.meta; + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0'; // eslint-disable-next-line max-len + + var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + + addEventListener(closeButton, 'click', close); + addEventListener(refreshButton, 'click', function () { + if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { + if ("development" !== 'production') { + // eslint-disable-next-line + warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.'); + } + + close(); + return; + } + + var newOption; + + try { + if (isFunction(contentToOption)) { + newOption = contentToOption(viewMain, api.getOption()); + } else { + newOption = parseContents(textarea.value, blockMetaList); + } + } catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + closeButton.innerHTML = lang[1]; + refreshButton.innerHTML = lang[2]; + refreshButton.style.cssText = closeButton.style.cssText = buttonStyle; + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + viewMain.style.height = container.clientHeight - 80 + 'px'; + container.appendChild(root); + this._dom = root; + }; + + DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); + }; + + DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + DataView.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + // eslint-disable-next-line + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']), + lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']), + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + return defaultOption; + }; + + return DataView; + }(ToolboxFeature); + /** + * @inner + */ + + + function tryMergeDataOption(newData, originalData) { + return map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + + if (isObject(original) && !isArray(original)) { + var newValIsObject = isObject(newVal) && !isArray(newVal); + + if (!newValIsObject) { + newVal = { + value: newVal + }; + } // original data has name but new data has no name + + + var shouldDeleteName = original.name != null && newVal.name == null; // Original data has option + + newVal = defaults(newVal, original); + shouldDeleteName && delete newVal.name; + return newVal; + } else { + return newVal; + } + }); + } // TODO: SELF REGISTERED. + + + registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + ecModel.mergeOption(defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + var each$9 = each; + var inner$f = makeInner(); + /** + * @param ecModel + * @param newSnapshot key is dataZoomId + */ + + function push(ecModel, newSnapshot) { + var storedSnapshots = getStoreSnapshots(ecModel); // If previous dataZoom can not be found, + // complete an range with current range. + + each$9(newSnapshot, function (batchItem, dataZoomId) { + var i = storedSnapshots.length - 1; + + for (; i >= 0; i--) { + var snapshot = storedSnapshots[i]; + + if (snapshot[dataZoomId]) { + break; + } + } + + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents({ + mainType: 'dataZoom', + subType: 'select', + id: dataZoomId + })[0]; + + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + storedSnapshots[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + storedSnapshots.push(newSnapshot); + } + function pop(ecModel) { + var storedSnapshots = getStoreSnapshots(ecModel); + var head = storedSnapshots[storedSnapshots.length - 1]; + storedSnapshots.length > 1 && storedSnapshots.pop(); // Find top for all dataZoom. + + var snapshot = {}; + each$9(head, function (batchItem, dataZoomId) { + for (var i = storedSnapshots.length - 1; i >= 0; i--) { + batchItem = storedSnapshots[i][dataZoomId]; + + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + return snapshot; + } + function clear$1(ecModel) { + inner$f(ecModel).snapshots = null; + } + function count(ecModel) { + return getStoreSnapshots(ecModel).length; + } + /** + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + */ + + function getStoreSnapshots(ecModel) { + var store = inner$f(ecModel); + + if (!store.snapshots) { + store.snapshots = [{}]; + } + + return store.snapshots; + } + + var RestoreOption = + /** @class */ + function (_super) { + __extends(RestoreOption, _super); + + function RestoreOption() { + return _super !== null && _super.apply(this, arguments) || this; + } + + RestoreOption.prototype.onclick = function (ecModel, api) { + clear$1(ecModel); + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + RestoreOption.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + // eslint-disable-next-line + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: ecModel.getLocaleModel().get(['toolbox', 'restore', 'title']) + }; + return defaultOption; + }; + + return RestoreOption; + }(ToolboxFeature); // TODO: SELF REGISTERED. + + + registerAction({ + type: 'restore', + event: 'restore', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.resetOption('recreate'); + }); + + // how to genarialize to more coordinate systems. + + var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap']; + + var BrushTargetManager = + /** @class */ + function () { + /** + * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid + * Each can be {number|Array.}. like: {xAxisIndex: [3, 4]} + * @param opt.include include coordinate system types. + */ + function BrushTargetManager(finder, ecModel, opt) { + var _this = this; + + this._targetInfoList = []; + var foundCpts = parseFinder$1(ecModel, finder); + each(targetInfoBuilders, function (builder, type) { + if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { + builder(foundCpts, _this._targetInfoList); + } + }); + } + + BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) { + this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + (area.coordRanges || (area.coordRanges = [])).push(coordRange); // area.coordRange is the first of area.coordRanges + + if (!area.coordRange) { + area.coordRange = coordRange; // In 'category' axis, coord to pixel is not reversible, so we can not + // rebuild range by coordRange accrately, which may bring trouble when + // brushing only one item. So we use __rangeOffset to rebuilding range + // by coordRange. And this it only used in brush component so it is no + // need to be adapted to coordRanges. + + var result = coordConvert[area.brushType](0, coordSys, coordRange); + area.__rangeOffset = { + offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), + xyMinMax: result.xyMinMax + }; + } + }); + return areas; + }; + + BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (targetInfo && targetInfo !== true) { + each(targetInfo.coordSyses, function (coordSys) { + var result = coordConvert[area.brushType](1, coordSys, area.range, true); + cb(area, result.values, coordSys, ecModel); + }); + } + }, this); + }; + /** + * the `areas` is `BrushModel.areas`. + * Called in layout stage. + * convert `area.coordRange` to global range and set panelId to `area.range`. + */ + + + BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if ("development" !== 'production') { + assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.'); + assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.'); + } + + area.range = area.range || []; // convert coordRange to global range and set panelId. + + if (targetInfo && targetInfo !== true) { + area.panelId = targetInfo.panelId; // (1) area.range should always be calculate from coordRange but does + // not keep its original value, for the sake of the dataZoom scenario, + // where area.coordRange remains unchanged but area.range may be changed. + // (2) Only support converting one coordRange to pixel range in brush + // component. So do not consider `coordRanges`. + // (3) About __rangeOffset, see comment above. + + var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); + var rangeOffset = area.__rangeOffset; + area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; + } + }, this); + }; + + BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) { + return map(this._targetInfoList, function (targetInfo) { + var rect = targetInfo.getPanelRect(); + return { + panelId: targetInfo.panelId, + defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) + }; + }); + }; + + BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) { + // Check whether area is bound in coord, and series do not belong to that coord. + // If do not do this check, some brush (like lineX) will controll all axes. + var targetInfo = this.findTargetInfo(area, ecModel); + return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; + }; + /** + * If return Object, a coord found. + * If return true, global found. + * Otherwise nothing found. + */ + + + BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) { + var targetInfoList = this._targetInfoList; + var foundCpts = parseFinder$1(ecModel, area); + + for (var i = 0; i < targetInfoList.length; i++) { + var targetInfo = targetInfoList[i]; + var areaPanelId = area.panelId; + + if (areaPanelId) { + if (targetInfo.panelId === areaPanelId) { + return targetInfo; + } + } else { + for (var j = 0; j < targetInfoMatchers.length; j++) { + if (targetInfoMatchers[j](foundCpts, targetInfo)) { + return targetInfo; + } + } + } + } + + return true; + }; + + return BrushTargetManager; + }(); + + function formatMinMax(minMax) { + minMax[0] > minMax[1] && minMax.reverse(); + return minMax; + } + + function parseFinder$1(ecModel, finder) { + return parseFinder(ecModel, finder, { + includeMainTypes: INCLUDE_FINDER_MAIN_TYPES + }); + } + + var targetInfoBuilders = { + grid: function (foundCpts, targetInfoList) { + var xAxisModels = foundCpts.xAxisModels; + var yAxisModels = foundCpts.yAxisModels; + var gridModels = foundCpts.gridModels; // Remove duplicated. + + var gridModelMap = createHashMap(); + var xAxesHas = {}; + var yAxesHas = {}; + + if (!xAxisModels && !yAxisModels && !gridModels) { + return; + } + + each(xAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + }); + each(yAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + yAxesHas[gridModel.id] = true; + }); + each(gridModels, function (gridModel) { + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + yAxesHas[gridModel.id] = true; + }); + gridModelMap.each(function (gridModel) { + var grid = gridModel.coordinateSystem; + var cartesians = []; + each(grid.getCartesians(), function (cartesian, index) { + if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) { + cartesians.push(cartesian); + } + }); + targetInfoList.push({ + panelId: 'grid--' + gridModel.id, + gridModel: gridModel, + coordSysModel: gridModel, + // Use the first one as the representitive coordSys. + coordSys: cartesians[0], + coordSyses: cartesians, + getPanelRect: panelRectBuilders.grid, + xAxisDeclared: xAxesHas[gridModel.id], + yAxisDeclared: yAxesHas[gridModel.id] + }); + }); + }, + geo: function (foundCpts, targetInfoList) { + each(foundCpts.geoModels, function (geoModel) { + var coordSys = geoModel.coordinateSystem; + targetInfoList.push({ + panelId: 'geo--' + geoModel.id, + geoModel: geoModel, + coordSysModel: geoModel, + coordSys: coordSys, + coordSyses: [coordSys], + getPanelRect: panelRectBuilders.geo + }); + }); + } + }; + var targetInfoMatchers = [// grid + function (foundCpts, targetInfo) { + var xAxisModel = foundCpts.xAxisModel; + var yAxisModel = foundCpts.yAxisModel; + var gridModel = foundCpts.gridModel; + !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); + !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); + return gridModel && gridModel === targetInfo.gridModel; + }, // geo + function (foundCpts, targetInfo) { + var geoModel = foundCpts.geoModel; + return geoModel && geoModel === targetInfo.geoModel; + }]; + var panelRectBuilders = { + grid: function () { + // grid is not Transformable. + return this.coordSys.master.getRect().clone(); + }, + geo: function () { + var coordSys = this.coordSys; + var rect = coordSys.getBoundingRect().clone(); // geo roam and zoom transform + + rect.applyTransform(getTransform(coordSys)); + return rect; + } + }; + var coordConvert = { + lineX: curry(axisConvert, 0), + lineY: curry(axisConvert, 1), + rect: function (to, coordSys, rangeOrCoordRange, clamp) { + var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp); + var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp); + var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; + return { + values: values, + xyMinMax: values + }; + }, + polygon: function (to, coordSys, rangeOrCoordRange, clamp) { + var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; + var values = map(rangeOrCoordRange, function (item) { + var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp); + xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); + xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); + xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); + xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); + return p; + }); + return { + values: values, + xyMinMax: xyMinMax + }; + } + }; + + function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { + if ("development" !== 'production') { + assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.'); + } + + var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); + var values = formatMinMax(map([0, 1], function (i) { + return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); + })); + var xyMinMax = []; + xyMinMax[axisNameIndex] = values; + xyMinMax[1 - axisNameIndex] = [NaN, NaN]; + return { + values: values, + xyMinMax: xyMinMax + }; + } + + var diffProcessor = { + lineX: curry(axisDiffProcessor, 0), + lineY: curry(axisDiffProcessor, 1), + rect: function (values, refer, scales) { + return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; + }, + polygon: function (values, refer, scales) { + return map(values, function (item, idx) { + return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; + }); + } + }; + + function axisDiffProcessor(axisNameIndex, values, refer, scales) { + return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; + } // We have to process scale caused by dataZoom manually, + // although it might be not accurate. + // Return [0~1, 0~1] + + + function getScales(xyMinMaxCurr, xyMinMaxOrigin) { + var sizeCurr = getSize$1(xyMinMaxCurr); + var sizeOrigin = getSize$1(xyMinMaxOrigin); + var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; + isNaN(scales[0]) && (scales[0] = 1); + isNaN(scales[1]) && (scales[1] = 1); + return scales; + } + + function getSize$1(xyMinMax) { + return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; + } + + var each$a = each; + var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_'); + + var DataZoomFeature = + /** @class */ + function (_super) { + __extends(DataZoomFeature, _super); + + function DataZoomFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) { + if (!this._brushController) { + this._brushController = new BrushController(api.getZr()); + + this._brushController.on('brush', bind(this._onBrush, this)).mount(); + } + + updateZoomBtnStatus(featureModel, ecModel, this, payload, api); + updateBackBtnStatus(featureModel, ecModel); + }; + + DataZoomFeature.prototype.onclick = function (ecModel, api, type) { + handlers$1[type].call(this); + }; + + DataZoomFeature.prototype.remove = function (ecModel, api) { + this._brushController && this._brushController.unmount(); + }; + + DataZoomFeature.prototype.dispose = function (ecModel, api) { + this._brushController && this._brushController.dispose(); + }; + + DataZoomFeature.prototype._onBrush = function (eventParam) { + var areas = eventParam.areas; + + if (!eventParam.isEnd || !areas.length) { + return; + } + + var snapshot = {}; + var ecModel = this.ecModel; + + this._brushController.updateCovers([]); // remove cover + + + var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, { + include: ['grid'] + }); + brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + if (coordSys.type !== 'cartesian2d') { + return; + } + + var brushType = area.brushType; + + if (brushType === 'rect') { + setBatch('x', coordSys, coordRange[0]); + setBatch('y', coordSys, coordRange[1]); + } else { + setBatch({ + lineX: 'x', + lineY: 'y' + }[brushType], coordSys, coordRange); + } + }); + push(ecModel, snapshot); + + this._dispatchZoomAction(snapshot); + + function setBatch(dimName, coordSys, minMax) { + var axis = coordSys.getAxis(dimName); + var axisModel = axis.model; + var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range. + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan(); + + if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) { + minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan); + } + + dataZoomModel && (snapshot[dataZoomModel.id] = { + dataZoomId: dataZoomModel.id, + startValue: minMax[0], + endValue: minMax[1] + }); + } + + function findDataZoom(dimName, axisModel, ecModel) { + var found; + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'select' + }, function (dzModel) { + var has = dzModel.getAxisModel(dimName, axisModel.componentIndex); + has && (found = dzModel); + }); + return found; + } + }; + + DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) { + var batch = []; // Convert from hash map to array. + + each$a(snapshot, function (batchItem, dataZoomId) { + batch.push(clone(batchItem)); + }); + batch.length && this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: batch + }); + }; + + DataZoomFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + filterMode: 'filter', + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + // `zoom`, `back` + title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']), + brushStyle: { + borderWidth: 0, + color: 'rgba(210,219,238,0.2)' + } + }; + return defaultOption; + }; + + return DataZoomFeature; + }(ToolboxFeature); + + var handlers$1 = { + zoom: function () { + var nextActive = !this._isZoomActive; + this.api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'dataZoomSelect', + dataZoomSelectActive: nextActive + }); + }, + back: function () { + this._dispatchZoomAction(pop(this.ecModel)); + } + }; + + function makeAxisFinder(dzFeatureModel) { + var setting = { + xAxisIndex: dzFeatureModel.get('xAxisIndex', true), + yAxisIndex: dzFeatureModel.get('yAxisIndex', true), + xAxisId: dzFeatureModel.get('xAxisId', true), + yAxisId: dzFeatureModel.get('yAxisId', true) + }; // If both `xAxisIndex` `xAxisId` not set, it means 'all'. + // If both `yAxisIndex` `yAxisId` not set, it means 'all'. + // Some old cases set like this below to close yAxis control but leave xAxis control: + // `{ feature: { dataZoom: { yAxisIndex: false } }`. + + if (setting.xAxisIndex == null && setting.xAxisId == null) { + setting.xAxisIndex = 'all'; + } + + if (setting.yAxisIndex == null && setting.yAxisId == null) { + setting.yAxisIndex = 'all'; + } + + return setting; + } + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal'); + } + + function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) { + var zoomActive = view._isZoomActive; + + if (payload && payload.type === 'takeGlobalCursor') { + zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false; + } + + view._isZoomActive = zoomActive; + featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal'); + var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, { + include: ['grid'] + }); + var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) { + return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect'; + }); + + view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? { + brushType: 'auto', + brushStyle: featureModel.getModel('brushStyle').getItemStyle() + } : false); + } + + registerInternalOptionCreator('dataZoom', function (ecModel) { + var toolboxModel = ecModel.getComponent('toolbox', 0); + var featureDataZoomPath = ['feature', 'dataZoom']; + + if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) { + return; + } + + var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath); + var dzOptions = []; + var finder = makeAxisFinder(dzFeatureModel); + var finderResult = parseFinder(ecModel, finder); + each$a(finderResult.xAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex'); + }); + each$a(finderResult.yAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex'); + }); + + function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) { + var axisIndex = axisModel.componentIndex; + var newOpt = { + type: 'select', + $fromToolbox: true, + // Default to be filter + filterMode: dzFeatureModel.get('filterMode', true) || 'filter', + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex + }; + newOpt[axisIndexPropName] = axisIndex; + dzOptions.push(newOpt); + } + + return dzOptions; + }); + + function install$z(registers) { + registers.registerComponentModel(ToolboxModel); + registers.registerComponentView(ToolboxView); + registerFeature('saveAsImage', SaveAsImage); + registerFeature('magicType', MagicType); + registerFeature('dataView', DataView); + registerFeature('dataZoom', DataZoomFeature); + registerFeature('restore', RestoreOption); + use(install$y); + } + + var TooltipModel = + /** @class */ + function (_super) { + __extends(TooltipModel, _super); + + function TooltipModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipModel.type; + return _this; + } + + TooltipModel.type = 'tooltip'; + TooltipModel.dependencies = ['axisPointer']; + TooltipModel.defaultOption = { + // zlevel: 0, + z: 60, + show: true, + // tooltip main content + showContent: true, + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + alwaysShowContent: false, + displayMode: 'single', + renderMode: 'auto', + // whether restraint content inside viewRect. + // If renderMode: 'richText', default true. + // If renderMode: 'html', defaut false (for backward compat). + confine: null, + showDelay: 0, + hideDelay: 100, + // Animation transition time, unit is second + transitionDuration: 0.4, + enterable: false, + backgroundColor: '#fff', + // box shadow + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, .2)', + shadowOffsetX: 1, + shadowOffsetY: 2, + // tooltip border radius, unit is px, default is 4 + borderRadius: 4, + // tooltip border width, unit is px, default is 0 (no border) + borderWidth: 1, + // Tooltip inside padding, default is 5 for all direction + // Array is allowed to set up, right, bottom, left, same with css + // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. + padding: null, + // Extra css text + extraCssText: '', + // axis indicator, trigger by axis + axisPointer: { + // default is line + // legal values: 'line' | 'shadow' | 'cross' + type: 'line', + // Valid when type is line, appoint tooltip line locate on which line. Optional + // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' + // default is 'auto', chose the axis which type is category. + // for multiply y axis, cartesian coord chose x axis, polar chose angle axis + axis: 'auto', + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + // TODO formatter + textStyle: {} + } // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + + }, + textStyle: { + color: '#666', + fontSize: 14 + } + }; + return TooltipModel; + }(ComponentModel); + + /* global document */ + + function shouldTooltipConfine(tooltipModel) { + var confineOption = tooltipModel.get('confine'); + return confineOption != null ? !!confineOption // In richText mode, the outside part can not be visible. + : tooltipModel.get('renderMode') === 'richText'; + } + + function testStyle(styleProps) { + if (!env.domSupported) { + return; + } + + var style = document.documentElement.style; + + for (var i = 0, len = styleProps.length; i < len; i++) { + if (styleProps[i] in style) { + return styleProps[i]; + } + } + } + + var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + function toCSSVendorPrefix(styleVendor, styleProp) { + if (!styleVendor) { + return styleProp; + } + + styleProp = toCamelCase(styleProp, true); + var idx = styleVendor.indexOf(styleProp); + styleVendor = idx === -1 ? styleProp : "-" + styleVendor.slice(0, idx) + "-" + styleProp; + return styleVendor.toLowerCase(); + } + function getComputedStyle(el, style) { + var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el); + return stl ? style ? stl[style] : stl : null; + } + + /* global document, window */ + + var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition'); + var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'); // eslint-disable-next-line + + var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? 'will-change:transform;' : ''); + + function mirrorPos(pos) { + pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top'; + return pos; + } + + function assembleArrow(tooltipModel, borderColor, arrowPosition) { + if (!isString(arrowPosition) || arrowPosition === 'inside') { + return ''; + } + + var backgroundColor = tooltipModel.get('backgroundColor'); + var borderWidth = tooltipModel.get('borderWidth'); + borderColor = convertToColorString(borderColor); + var arrowPos = mirrorPos(arrowPosition); + var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6); + var positionStyle = ''; + var transformStyle = CSS_TRANSFORM_VENDOR + ':'; + var rotateDeg; + + if (indexOf(['left', 'right'], arrowPos) > -1) { + positionStyle += 'top:50%'; + transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + "deg)"; + } else { + positionStyle += 'left:50%'; + transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + "deg)"; + } + + var rotateRadian = rotateDeg * Math.PI / 180; + var arrowWH = arrowSize + borderWidth; + var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian)); + var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100; + positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px"; + var borderStyle = borderColor + " solid " + borderWidth + "px;"; + var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;z-index:-1;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor + ";"]; + return "
"; + } + + function assembleTransition(duration, onlyFade) { + var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)'; + var transitionOption = " " + duration / 2 + "s " + transitionCurve; + var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption; + + if (!onlyFade) { + transitionOption = " " + duration + "s " + transitionCurve; + transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption; + } + + return CSS_TRANSITION_VENDOR + ':' + transitionText; + } + + function assembleTransform(x, y, toString) { + // If using float on style, the final width of the dom might + // keep changing slightly while mouse move. So `toFixed(0)` them. + var x0 = x.toFixed(0) + 'px'; + var y0 = y.toFixed(0) + 'px'; // not support transform, use `left` and `top` instead. + + if (!env.transformSupported) { + return toString ? "top:" + y0 + ";left:" + x0 + ";" : [['top', y0], ['left', x0]]; + } // support transform + + + var is3d = env.transform3dSupported; + var translate = "translate" + (is3d ? '3d' : '') + "(" + x0 + "," + y0 + (is3d ? ',0' : '') + ")"; + return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]]; + } + /** + * @param {Object} textStyle + * @return {string} + * @inner + */ + + + function assembleFont(textStyleModel) { + var cssText = []; + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + color && cssText.push('color:' + color); + cssText.push('font:' + textStyleModel.getFont()); + fontSize // @ts-ignore, leave it to the tooltip refactor. + && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + var shadowColor = textStyleModel.get('textShadowColor'); + var shadowBlur = textStyleModel.get('textShadowBlur') || 0; + var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0; + var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0; + shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor); + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + return cssText.join(';'); + } + + function assembleCssText(tooltipModel, enableTransition, onlyFade) { + var cssText = []; + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var shadowBlur = tooltipModel.get('shadowBlur'); + var shadowColor = tooltipModel.get('shadowColor'); + var shadowOffsetX = tooltipModel.get('shadowOffsetX'); + var shadowOffsetY = tooltipModel.get('shadowOffsetY'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = getPaddingFromTooltipModel(tooltipModel, 'html'); + var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; + cssText.push('box-shadow:' + boxShadow); // Animation transition. Do not animate when transitionDuration is 0. + + enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); + + if (backgroundColor) { + cssText.push('background-color:' + backgroundColor); + } // Border style + + + each(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); // Text style + + cssText.push(assembleFont(textStyleModel)); // Padding + + if (padding != null) { + cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } // If not able to make, do not modify the input `out`. + + + function makeStyleCoord(out, zr, appendToBody, zrX, zrY) { + var zrPainter = zr && zr.painter; + + if (appendToBody) { + var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); + + if (zrViewportRoot) { + // Some APPs might use scale on body, so we support CSS transform here. + transformLocalCoord(out, zrViewportRoot, document.body, zrX, zrY); + } + } else { + out[0] = zrX; + out[1] = zrY; // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + + var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + + if (viewportRootOffset) { + out[0] += viewportRootOffset.offsetLeft; + out[1] += viewportRootOffset.offsetTop; + } + } + + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var TooltipHTMLContent = + /** @class */ + function () { + function TooltipHTMLContent(container, api, opt) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._alwaysShowContent = false; + this._firstShow = true; + this._longHide = true; + + if (env.wxa) { + return null; + } + + var el = document.createElement('div'); // TODO: TYPE + + el.domBelongToZr = true; + this.el = el; + var zr = this._zr = api.getZr(); + var appendToBody = this._appendToBody = opt && opt.appendToBody; + makeStyleCoord(this._styleCoord, zr, appendToBody, api.getWidth() / 2, api.getHeight() / 2); + + if (appendToBody) { + document.body.appendChild(el); + } else { + container.appendChild(el); + } + + this._container = container; // FIXME + // Is it needed to trigger zr event manually if + // the browser do not support `pointer-events: none`. + + var self = this; + + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }; + + el.onmousemove = function (e) { + e = e || window.event; + + if (!self._enterable) { + // `pointer-events: none` is set to tooltip content div + // if `enterable` is set as `false`, and `el.onmousemove` + // can not be triggered. But in browser that do not + // support `pointer-events`, we need to do this: + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + var zrViewportRoot = zr.painter.getViewportRoot(); + normalizeEvent(zrViewportRoot, e, true); + handler.dispatch('mousemove', e); + } + }; + + el.onmouseleave = function () { + // set `_inContent` to `false` before `hideLater` + self._inContent = false; + + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + }; + } + /** + * Update when tooltip is rendered + */ + + + TooltipHTMLContent.prototype.update = function (tooltipModel) { + // FIXME + // Move this logic to ec main? + var container = this._container; + var position = getComputedStyle(container, 'position'); + var domStyle = container.style; + + if (domStyle.position !== 'absolute' && position !== 'absolute') { + domStyle.position = 'relative'; + } // move tooltip if chart resized + + + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); // update alwaysShowContent + + this._alwaysShowContent = alwaysShowContent; // update className + + this.el.className = tooltipModel.get('className') || ''; // Hide the tooltip + // PENDING + // this.hide(); + }; + + TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var el = this.el; + var style = el.style; + var styleCoord = this._styleCoord; + + if (!el.innerHTML) { + style.display = 'none'; + } else { + style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) // initial transform + + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get('extraCssText') || '') // If mouse occasionally move over the tooltip, a mouseout event will be + // triggered by canvas, and cause some unexpectable result like dragging + // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve + // it. Although it is not supported by IE8~IE10, fortunately it is a rare + // scenario. + + (";pointer-events:" + (this._enterable ? 'auto' : 'none')); + } + + this._show = true; + this._firstShow = false; + this._longHide = false; + }; + + TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) { + var el = this.el; + + if (content == null) { + el.innerHTML = ''; + return; + } + + var arrow = ''; + + if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) { + arrow = assembleArrow(tooltipModel, borderColor, arrowPosition); + } + + if (isString(content)) { + el.innerHTML = content + arrow; + } else if (content) { + // Clear previous + el.innerHTML = ''; + + if (!isArray(content)) { + content = [content]; + } + + for (var i = 0; i < content.length; i++) { + if (isDom(content[i]) && content[i].parentNode !== el) { + el.appendChild(content[i]); + } + } // no arrow if empty + + + if (arrow && el.childNodes.length) { + // no need to create a new parent element, but it's not supported by IE 10 and older. + // const arrowEl = document.createRange().createContextualFragment(arrow); + var arrowEl = document.createElement('div'); + arrowEl.innerHTML = arrow; + el.appendChild(arrowEl); + } + } + }; + + TooltipHTMLContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipHTMLContent.prototype.getSize = function () { + var el = this.el; + return [el.offsetWidth, el.offsetHeight]; + }; + + TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) { + var styleCoord = this._styleCoord; + makeStyleCoord(styleCoord, this._zr, this._appendToBody, zrX, zrY); + + if (styleCoord[0] != null && styleCoord[1] != null) { + var style_1 = this.el.style; + var transforms = assembleTransform(styleCoord[0], styleCoord[1]); + each(transforms, function (transform) { + style_1[transform[0]] = transform[1]; + }); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipHTMLContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipHTMLContent.prototype.hide = function () { + var _this = this; + + var style = this.el.style; + style.visibility = 'hidden'; + style.opacity = '0'; + env.transform3dSupported && (style.willChange = ''); + this._show = false; + this._longHideTimeout = setTimeout(function () { + return _this._longHide = true; + }, 500); + }; + + TooltipHTMLContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipHTMLContent.prototype.isShow = function () { + return this._show; + }; + + TooltipHTMLContent.prototype.dispose = function () { + this.el.parentNode.removeChild(this.el); + }; + + return TooltipHTMLContent; + }(); + + var TooltipRichContent = + /** @class */ + function () { + function TooltipRichContent(api) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._alwaysShowContent = false; + this._enterable = true; + this._zr = api.getZr(); + makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); + } + /** + * Update when tooltip is rendered + */ + + + TooltipRichContent.prototype.update = function (tooltipModel) { + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); // update alwaysShowContent + + this._alwaysShowContent = alwaysShowContent; + }; + + TooltipRichContent.prototype.show = function () { + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + } + + this.el.show(); + this._show = true; + }; + /** + * Set tooltip content + */ + + + TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { + var _this = this; + + if (isObject(content)) { + throwError("development" !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : ''); + } + + if (this.el) { + this._zr.remove(this.el); + } + + var textStyleModel = tooltipModel.getModel('textStyle'); + this.el = new ZRText({ + style: { + rich: markupStyleCreator.richTextStyles, + text: content, + lineHeight: 22, + borderWidth: 1, + borderColor: borderColor, + textShadowColor: textStyleModel.get('textShadowColor'), + fill: tooltipModel.get(['textStyle', 'color']), + padding: getPaddingFromTooltipModel(tooltipModel, 'richText'), + verticalAlign: 'top', + align: 'left' + }, + z: tooltipModel.get('z') + }); + each(['backgroundColor', 'borderRadius', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'], function (propName) { + _this.el.style[propName] = tooltipModel.get(propName); + }); + each(['textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'], function (propName) { + _this.el.style[propName] = textStyleModel.get(propName) || 0; + }); + + this._zr.add(this.el); + + var self = this; + this.el.on('mouseover', function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }); + this.el.on('mouseout', function () { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + + self._inContent = false; + }); + }; + + TooltipRichContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipRichContent.prototype.getSize = function () { + var el = this.el; + var bounding = this.el.getBoundingRect(); // bounding rect does not include shadow. For renderMode richText, + // if overflow, it will be cut. So calculate them accurately. + + var shadowOuterSize = calcShadowOuterSize(el.style); + return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; + }; + + TooltipRichContent.prototype.moveTo = function (x, y) { + var el = this.el; + + if (el) { + var styleCoord = this._styleCoord; + makeStyleCoord$1(styleCoord, this._zr, x, y); + x = styleCoord[0]; + y = styleCoord[1]; + var style = el.style; + var borderWidth = mathMaxWith0(style.borderWidth || 0); + var shadowOuterSize = calcShadowOuterSize(style); // rich text x, y do not include border. + + el.x = x + borderWidth + shadowOuterSize.left; + el.y = y + borderWidth + shadowOuterSize.top; + el.markRedraw(); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipRichContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipRichContent.prototype.hide = function () { + if (this.el) { + this.el.hide(); + } + + this._show = false; + }; + + TooltipRichContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipRichContent.prototype.isShow = function () { + return this._show; + }; + + TooltipRichContent.prototype.dispose = function () { + this._zr.remove(this.el); + }; + + return TooltipRichContent; + }(); + + function mathMaxWith0(val) { + return Math.max(0, val); + } + + function calcShadowOuterSize(style) { + var shadowBlur = mathMaxWith0(style.shadowBlur || 0); + var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); + var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); + return { + left: mathMaxWith0(shadowBlur - shadowOffsetX), + right: mathMaxWith0(shadowBlur + shadowOffsetX), + top: mathMaxWith0(shadowBlur - shadowOffsetY), + bottom: mathMaxWith0(shadowBlur + shadowOffsetY) + }; + } + + function makeStyleCoord$1(out, zr, zrX, zrY) { + out[0] = zrX; + out[1] = zrY; + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var proxyRect = new Rect({ + shape: { + x: -1, + y: -1, + width: 2, + height: 2 + } + }); + + var TooltipView = + /** @class */ + function (_super) { + __extends(TooltipView, _super); + + function TooltipView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipView.type; + return _this; + } + + TooltipView.prototype.init = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + var tooltipModel = ecModel.getComponent('tooltip'); + var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode')); + this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api.getDom(), api, { + appendToBody: tooltipModel.get('appendToBody', true) + }); + }; + + TooltipView.prototype.render = function (tooltipModel, ecModel, api) { + if (env.node || !api.getDom()) { + return; + } // Reset + + + this.group.removeAll(); + this._tooltipModel = tooltipModel; + this._ecModel = ecModel; + this._api = api; + var tooltipContent = this._tooltipContent; + tooltipContent.update(tooltipModel); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + + this._initGlobalListener(); + + this._keepShow(); // PENDING + // `mousemove` event will be triggered very frequently when the mouse moves fast, + // which causes that the `updatePosition` function was also called frequently. + // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101 + // To avoid frequent triggering, + // consider throttling it in 50ms when transition is enabled + + + if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) { + createOrUpdate(this, '_updatePosition', 50, 'fixRate'); + } else { + clear(this, '_updatePosition'); + } + }; + + TooltipView.prototype._initGlobalListener = function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + register('itemTooltip', this._api, bind(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this)); + }; + + TooltipView.prototype._keepShow = function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; + var triggerOn = tooltipModel.get('triggerOn'); // Try to keep the tooltip show when refreshing + + if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && triggerOn !== 'none' && triggerOn !== 'click') { + var self_1 = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { + x: self_1._lastX, + y: self_1._lastY, + dataByCoordSys: self_1._lastDataByCoordSys + }); + }); + } + }; + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + + + TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env.node || !api.getDom()) { + return; + } + + var dispatchAction = makeDispatchAction$1(payload, api); // Reset ticket + + this._ticket = ''; // When triggered from axisPointer. + + var dataByCoordSys = payload.dataByCoordSys; + var cmptRef = findComponentReference(payload, ecModel, api); + + if (cmptRef) { + var rect = cmptRef.el.getBoundingRect().clone(); + rect.applyTransform(cmptRef.el.transform); + + this._tryShow({ + offsetX: rect.x + rect.width / 2, + offsetY: rect.y + rect.height / 2, + target: cmptRef.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } else if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.x = payload.x; + el.y = payload.y; + el.update(); + getECData(el).tooltipConfig = { + name: null, + option: payload.tooltip + }; // Manually show tooltip while view is not using zrender elements. + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + dataByCoordSys: dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } else if (payload.seriesIndex != null) { + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: pointInfo.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } + } else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target + }, dispatchAction); + } + }; + + TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + + if (this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._lastX = this._lastY = this._lastDataByCoordSys = null; + + if (payload.from !== this.uid) { + this._hide(makeDispatchAction$1(payload, api)); + } + }; // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + + + TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; // @ts-ignore + + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if (!seriesModel) { + return; + } + + var data = seriesModel.getData(); + var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel); + + if (tooltipCascadedModel.get('trigger') !== 'axis') { + return; + } + + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + return true; + }; + + TooltipView.prototype._tryShow = function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + + if (!tooltipModel) { + return; + } // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + + + this._lastX = e.offsetX; + this._lastY = e.offsetY; + var dataByCoordSys = e.dataByCoordSys; + + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } else if (el) { + this._lastDataByCoordSys = null; + var seriesDispatcher_1; + var cmptDispatcher_1; + findEventDispatcher(el, function (target) { + // Always show item tooltip if mouse is on the element with dataIndex + if (getECData(target).dataIndex != null) { + seriesDispatcher_1 = target; + return true; + } // Tooltip provided directly. Like legend. + + + if (getECData(target).tooltipConfig != null) { + cmptDispatcher_1 = target; + return true; + } + }, true); + + if (seriesDispatcher_1) { + this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction); + } else if (cmptDispatcher_1) { + this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction); + } else { + this._hide(dispatchAction); + } + } else { + this._lastDataByCoordSys = null; + + this._hide(dispatchAction); + } + }; + + TooltipView.prototype._showOrMove = function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easier to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind(cb, this); + clearTimeout(this._showTimout); + delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); + }; + + TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel); + var renderMode = this._renderMode; + var cbParamsList = []; + var articleMarkup = createTooltipMarkup('section', { + blocks: [], + noHeader: true + }); // Only for legacy: `Serise['formatTooltip']` returns a string. + + var markupTextArrLegacy = []; + var markupStyleCreator = new TooltipMarkupStyleCreator(); + each(dataByCoordSys, function (itemCoordSys) { + each(itemCoordSys.dataByAxis, function (axisItem) { + var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); + var axisValue = axisItem.value; + + if (!axisModel || axisValue == null) { + return; + } + + var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); + var axisSectionMarkup = createTooltipMarkup('section', { + header: axisValueLabel, + noHeader: !trim(axisValueLabel), + sortBlocks: true, + blocks: [] + }); + articleMarkup.blocks.push(axisSectionMarkup); + each(axisItem.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var cbParams = series.getDataParams(dataIndex); // Can't find data. + + if (cbParams.dataIndex < 0) { + return; + } + + cbParams.axisDim = axisItem.axisDim; + cbParams.axisIndex = axisItem.axisIndex; + cbParams.axisType = axisItem.axisType; + cbParams.axisId = axisItem.axisId; + cbParams.axisValue = getAxisRawValue(axisModel.axis, { + value: axisValue + }); + cbParams.axisValueLabel = axisValueLabel; // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); + var frag = seriesTooltipResult.frag; + + if (frag) { + var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter'); + axisSectionMarkup.blocks.push(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag); + } + + if (seriesTooltipResult.text) { + markupTextArrLegacy.push(seriesTooltipResult.text); + } + + cbParamsList.push(cbParams); + }); + }); + }); // In most cases, the second axis is displays upper on the first one. + // So we reverse it to look better. + + articleMarkup.blocks.reverse(); + markupTextArrLegacy.reverse(); + var positionExpr = e.position; + var orderMode = singleTooltipModel.get('order'); + var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle')); + builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); + var blockBreak = renderMode === 'richText' ? '\n\n' : '
'; + var allMarkupText = markupTextArrLegacy.join(blockBreak); + + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) { + this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); + } else { + this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator); + } + }); // Do not trigger events here, because this branch only be entered + // from dispatchAction. + + }; + + TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) { + var ecModel = this._ecModel; + var ecData = getECData(dispatcher); // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + + var seriesIndex = ecData.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); // For example, graph link. + + var dataModel = ecData.dataModel || seriesModel; + var dataIndex = ecData.dataIndex; + var dataType = ecData.dataType; + var data = dataModel.getData(dataType); + var renderMode = this._renderMode; + var positionDefault = e.positionDefault; + var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var tooltipTrigger = tooltipModel.get('trigger'); + + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + + var params = dataModel.getDataParams(dataIndex, dataType); + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); + var orderMode = tooltipModel.get('order'); + var valueFormatter = tooltipModel.get('valueFormatter'); + var frag = seriesTooltipResult.frag; + var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text; + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + + this._showOrMove(tooltipModel, function () { + this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); + }); // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + + + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }; + + TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) { + var ecData = getECData(el); + var tooltipConfig = ecData.tooltipConfig; + var tooltipOpt = tooltipConfig.option || {}; + + if (isString(tooltipOpt)) { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + } + + var tooltipModelCascade = [tooltipOpt]; + + var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex); + + if (cmpt) { + tooltipModelCascade.push(cmpt); + } // In most cases, component tooltip formatter has different params with series tooltip formatter, + // so that they cannot share the same formatter. Since the global tooltip formatter is used for series + // by convention, we do not use it as the default formatter for component. + + + tooltipModelCascade.push({ + formatter: tooltipOpt.content + }); + var positionDefault = e.positionDefault; + var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random() + ''; // PENDING: this case do not support richText style yet. + + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on coordinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + + this._showOrMove(subTooltipModel, function () { + // Use formatterParams from element defined in component + // Avoid users modify it. + var formatterParams = clone(subTooltipModel.get('formatterParams') || {}); + + this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); + }); // If not dispatch showTip, tip may be hide triggered by axis. + + + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }; + + TooltipView.prototype._showTooltipContent = function ( // Use Model insteadof TooltipModel because this model may be from series or other options. + // Instead of top level tooltip. + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { + // Reset ticket + this._ticket = ''; + + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + + var tooltipContent = this._tooltipContent; + tooltipContent.setEnterable(tooltipModel.get('enterable')); + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + + var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor')); + + var nearPointColor = nearPoint.color; + + if (formatter) { + if (isString(formatter)) { + var useUTC = tooltipModel.ecModel.get('useUTC'); + var params0 = isArray(params) ? params[0] : params; + var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0; + html = formatter; + + if (isTimeAxis) { + html = format(params0.axisValue, html, useUTC); + } + + html = formatTpl(html, params, true); + } else if (isFunction(formatter)) { + var callback = bind(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } else { + html = formatter; + } + } + + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + tooltipContent.show(tooltipModel, nearPointColor); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + }; + + TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) { + if (trigger === 'axis' || isArray(tooltipDataParams)) { + return { + color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none') + }; + } + + if (!isArray(tooltipDataParams)) { + return { + color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor + }; + } + }; + + TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x, // Mouse x + y, // Mouse y + content, params, el) { + var viewWidth = this._api.getWidth(); + + var viewHeight = this._api.getHeight(); + + positionExpr = positionExpr || tooltipModel.get('position'); + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + + if (isFunction(positionExpr)) { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + + if (isArray(positionExpr)) { + x = parsePercent$1(positionExpr[0], viewWidth); + y = parsePercent$1(positionExpr[1], viewHeight); + } else if (isObject(positionExpr)) { + var boxLayoutPosition = positionExpr; + boxLayoutPosition.width = contentSize[0]; + boxLayoutPosition.height = contentSize[1]; + var layoutRect = getLayoutRect(boxLayoutPosition, { + width: viewWidth, + height: viewHeight + }); + x = layoutRect.x; + y = layoutRect.y; + align = null; // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + + vAlign = null; + } // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (isString(positionExpr) && el) { + var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth')); + x = pos[0]; + y = pos[1]; + } else { + var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); + x = pos[0]; + y = pos[1]; + } + + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + + if (shouldTooltipConfine(tooltipModel)) { + var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + }; // FIXME + // Should we remove this but leave this to user? + + + TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) { + var lastCoordSys = this._lastDataByCoordSys; + var lastCbParamsList = this._cbParamsList; + var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; + contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || []; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; + contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; + contentNotChanged && each(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); // check is cbParams data value changed + + lastCbParamsList && each(lastItem.seriesDataIndices, function (idxItem) { + var seriesIdx = idxItem.seriesIndex; + var cbParams = cbParamsList[seriesIdx]; + var lastCbParams = lastCbParamsList[seriesIdx]; + + if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) { + contentNotChanged = false; + } + }); + }); + }); + this._lastDataByCoordSys = dataByCoordSys; + this._cbParamsList = cbParamsList; + return !!contentNotChanged; + }; + + TooltipView.prototype._hide = function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }; + + TooltipView.prototype.dispose = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + clear(this, '_updatePosition'); + + this._tooltipContent.dispose(); + + unregister('itemTooltip', api); + }; + + TooltipView.type = 'tooltip'; + return TooltipView; + }(ComponentView); + /** + * From top to bottom. (the last one should be globalTooltipModel); + */ + + + function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) { + // Last is always tooltip model. + var ecModel = globalTooltipModel.ecModel; + var resultModel; + + if (defaultTooltipOption) { + resultModel = new Model(defaultTooltipOption, ecModel, ecModel); + resultModel = new Model(globalTooltipModel.option, resultModel, ecModel); + } else { + resultModel = globalTooltipModel; + } + + for (var i = modelCascade.length - 1; i >= 0; i--) { + var tooltipOpt = modelCascade[i]; + + if (tooltipOpt) { + if (tooltipOpt instanceof Model) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + + + if (isString(tooltipOpt)) { + tooltipOpt = { + formatter: tooltipOpt + }; + } + + if (tooltipOpt) { + resultModel = new Model(tooltipOpt, resultModel, ecModel); + } + } + } + + return resultModel; + } + + function makeDispatchAction$1(payload, api) { + return payload.dispatchAction || bind(api.dispatchAction, api); + } + + function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + + if (gapH != null) { + // Add extra 2 pixels for this case: + // At present the "values" in default tooltip are using CSS `float: right`. + // When the right edge of the tooltip box is on the right side of the + // viewport, the `float` layout might push the "values" to the second line. + if (x + width + gapH + 2 > viewWidth) { + x -= width + gapH; + } else { + x += gapH; + } + } + + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } else { + y += gapV; + } + } + + return [x, y]; + } + + function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + return [x, y]; + } + + function calcTooltipPosition(position, rect, contentSize, borderWidth) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - offset; + break; + + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + offset; + break; + + case 'left': + x = rect.x - domWidth - offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'right': + x = rect.x + rectWidth + offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + + return [x, y]; + } + + function isCenterAlign(align) { + return align === 'center' || align === 'middle'; + } + /** + * Find target component by payload like: + * ```js + * { legendId: 'some_id', name: 'xxx' } + * { toolboxIndex: 1, name: 'xxx' } + * { geoName: 'some_name', name: 'xxx' } + * ``` + * PENDING: at present only + * + * If not found, return null/undefined. + */ + + + function findComponentReference(payload, ecModel, api) { + var queryOptionMap = preParseFinder(payload).queryOptionMap; + var componentMainType = queryOptionMap.keys()[0]; + + if (!componentMainType || componentMainType === 'series') { + return; + } + + var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), { + useDefault: false, + enableAll: false, + enableNone: false + }); + var model = queryResult.models[0]; + + if (!model) { + return; + } + + var view = api.getViewOfComponentModel(model); + var el; + view.group.traverse(function (subEl) { + var tooltipConfig = getECData(subEl).tooltipConfig; + + if (tooltipConfig && tooltipConfig.name === payload.name) { + el = subEl; + return true; // stop + } + }); + + if (el) { + return { + componentMainType: componentMainType, + componentIndex: model.componentIndex, + el: el + }; + } + } + + function install$A(registers) { + use(install$s); + registers.registerComponentModel(TooltipModel); + registers.registerComponentView(TooltipView); + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + + registers.registerAction({ + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, noop); + registers.registerAction({ + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, noop); + } + + var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear']; + function brushPreprocessor(option, isNew) { + var brushComponents = normalizeToArray(option ? option.brush : []); + + if (!brushComponents.length) { + return; + } + + var brushComponentSpecifiedBtns = []; + each(brushComponents, function (brushOpt) { + var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : []; + + if (tbs instanceof Array) { + brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); + } + }); + var toolbox = option && option.toolbox; + + if (isArray(toolbox)) { + toolbox = toolbox[0]; + } + + if (!toolbox) { + toolbox = { + feature: {} + }; + option.toolbox = [toolbox]; + } + + var toolboxFeature = toolbox.feature || (toolbox.feature = {}); + var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); + var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); + brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); + removeDuplicate(brushTypes); + + if (isNew && !brushTypes.length) { + brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); + } + } + + function removeDuplicate(arr) { + var map = {}; + each(arr, function (val) { + map[val] = 1; + }); + arr.length = 0; + each(map, function (flag, val) { + arr.push(val); + }); + } + + var each$b = each; + + function hasKeys(obj) { + if (obj) { + for (var name_1 in obj) { + if (obj.hasOwnProperty(name_1)) { + return true; + } + } + } + } + + function createVisualMappings(option, stateList, supplementVisualOption) { + var visualMappings = {}; + each$b(stateList, function (state) { + var mappings = visualMappings[state] = createMappings(); + each$b(option[state], function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var mappingOption = { + type: visualType, + visual: visualData + }; + supplementVisualOption && supplementVisualOption(mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity + // is not supported, such as rendering using gradient color. + + if (visualType === 'opacity') { + mappingOption = clone(mappingOption); + mappingOption.type = 'colorAlpha'; + mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); + } + }); + }); + return visualMappings; + + function createMappings() { + var Creater = function () {}; // Make sure hidden fields will not be visited by + // object iteration (with hasOwnProperty checking). + + + Creater.prototype.__hidden = Creater.prototype; + var obj = new Creater(); + return obj; + } + } + function replaceVisualOption(thisOption, newOption, keys) { + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. So if + // newOption has anyone of these keys, all of these keys + // will be reset. Otherwise, all keys remain. + var has; + each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + has = true; + } + }); + has && each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + thisOption[key] = clone(newOption[key]); + } else { + delete thisOption[key]; + } + }); + } + /** + * @param stateList + * @param visualMappings + * @param list + * @param getValueState param: valueOrIndex, return: state. + * @param scope Scope for getValueState + * @param dimension Concrete dimension, if used. + */ + // ???! handle brush? + + function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + var dataIndex; + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + if (dimension == null) { + data.each(eachItem); + } else { + data.each([dimension], eachItem); + } + + function eachItem(valueOrIndex, index) { + dataIndex = dimension == null ? valueOrIndex // First argument is index + : index; + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var valueState = getValueState.call(scope, valueOrIndex); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual); + } + } + } + /** + * @param data + * @param stateList + * @param visualMappings > + * @param getValueState param: valueOrIndex, return: state. + * @param dim dimension or dimension index. + */ + + function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + return { + progress: function progress(params, data) { + var dimIndex; + + if (dim != null) { + dimIndex = data.getDimensionIndex(dim); + } + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + continue; + } + + var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex; + var valueState = getValueState(value); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); + } + } + } + }; + } + + function makeBrushCommonSelectorForSeries(area) { + var brushType = area.brushType; // Do not use function binding or curry for performance. + + var selectors = { + point: function (itemLayout) { + return selector[brushType].point(itemLayout, selectors, area); + }, + rect: function (itemLayout) { + return selector[brushType].rect(itemLayout, selectors, area); + } + }; + return selectors; + } + var selector = { + lineX: getLineSelectors(0), + lineY: getLineSelectors(1), + rect: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.intersect(itemLayout); + } + }, + polygon: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$2(area.range, itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + var points = area.range; + + if (!itemLayout || points.length <= 1) { + return false; + } + + var x = itemLayout.x; + var y = itemLayout.y; + var width = itemLayout.width; + var height = itemLayout.height; + var p = points[0]; + + if (contain$2(points, x, y) || contain$2(points, x + width, y) || contain$2(points, x, y + height) || contain$2(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) { + return true; + } + } + } + }; + + function getLineSelectors(xyIndex) { + var xy = ['x', 'y']; + var wh = ['width', 'height']; + return { + point: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var p = itemLayout[xyIndex]; + return inLineRange(p, range); + } + }, + rect: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]]; + layoutRange[1] < layoutRange[0] && layoutRange.reverse(); + return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange); + } + } + }; + } + + function inLineRange(p, range) { + return range[0] <= p && p <= range[1]; + } + + var STATE_LIST = ['inBrush', 'outOfBrush']; + var DISPATCH_METHOD = '__ecBrushSelect'; + var DISPATCH_FLAG = '__ecInBrushSelectEvent'; + function layoutCovers(ecModel) { + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); + brushTargetManager.setInputRanges(brushModel.areas, ecModel); + }); + } + /** + * Register the visual encoding if this modules required. + */ + + function brushVisual(ecModel, api, payload) { + var brushSelected = []; + var throttleType; + var throttleDelay; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : { + brushType: false + }); + }); + layoutCovers(ecModel); + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel, brushIndex) { + var thisBrushSelected = { + brushId: brushModel.id, + brushIndex: brushIndex, + brushName: brushModel.name, + areas: clone(brushModel.areas), + selected: [] + }; // Every brush component exists in event params, convenient + // for user to find by index. + + brushSelected.push(thisBrushSelected); + var brushOption = brushModel.option; + var brushLink = brushOption.brushLink; + var linkedSeriesMap = []; + var selectedDataIndexForLink = []; + var rangeInfoBySeries = []; + var hasBrushExists = false; + + if (!brushIndex) { + // Only the first throttle setting works. + throttleType = brushOption.throttleType; + throttleDelay = brushOption.throttleDelay; + } // Add boundingRect and selectors to range. + + + var areas = map(brushModel.areas, function (area) { + var builder = boundingRectBuilders[area.brushType]; + var selectableArea = defaults({ + boundingRect: builder ? builder(area) : void 0 + }, area); + selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea); + return selectableArea; + }); + var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) { + mappingOption.mappingMethod = 'fixed'; + }); + isArray(brushLink) && each(brushLink, function (seriesIndex) { + linkedSeriesMap[seriesIndex] = 1; + }); + + function linkOthers(seriesIndex) { + return brushLink === 'all' || !!linkedSeriesMap[seriesIndex]; + } // If no supported brush or no brush on the series, + // all visuals should be in original state. + + + function brushed(rangeInfoList) { + return !!rangeInfoList.length; + } + /** + * Logic for each series: (If the logic has to be modified one day, do it carefully!) + * + * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord. + * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck. + * !brushed┘ └nothing. + * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing. + */ + // Step A + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; + seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList); + }); + + function stepAParallel(seriesModel, seriesIndex) { + var coordSys = seriesModel.coordinateSystem; + hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed(); + linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) { + activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1); + }); + } + + function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { + if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) { + return; + } + + each(areas, function (area) { + if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) { + rangeInfoList.push(area); + } + + hasBrushExists = hasBrushExists || brushed(rangeInfoList); + }); + + if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { + var data_1 = seriesModel.getData(); + data_1.each(function (dataIndex) { + if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) { + selectedDataIndexForLink[dataIndex] = 1; + } + }); + } + } // Step B + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var seriesBrushSelected = { + seriesId: seriesModel.id, + seriesIndex: seriesIndex, + seriesName: seriesModel.name, + dataIndex: [] + }; // Every series exists in event params, convenient + // for user to find series by seriesIndex. + + thisBrushSelected.selected.push(seriesBrushSelected); + var rangeInfoList = rangeInfoBySeries[seriesIndex]; + var data = seriesModel.getData(); + var getValueState = linkOthers(seriesIndex) ? function (dataIndex) { + return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + } : function (dataIndex) { + return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + }; // If no supported brush or no brush, all visuals are in original state. + + (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState); + }); + }); + dispatchAction(api, throttleType, throttleDelay, brushSelected, payload); + } + + function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) { + // This event will not be triggered when `setOpion`, otherwise dead lock may + // triggered when do `setOption` in event listener, which we do not find + // satisfactory way to solve yet. Some considered resolutions: + // (a) Diff with prevoius selected data ant only trigger event when changed. + // But store previous data and diff precisely (i.e., not only by dataIndex, but + // also detect value changes in selected data) might bring complexity or fragility. + // (b) Use spectial param like `silent` to suppress event triggering. + // But such kind of volatile param may be weird in `setOption`. + if (!payload) { + return; + } + + var zr = api.getZr(); + + if (zr[DISPATCH_FLAG]) { + return; + } + + if (!zr[DISPATCH_METHOD]) { + zr[DISPATCH_METHOD] = doDispatch; + } + + var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); + fn(api, brushSelected); + } + + function doDispatch(api, brushSelected) { + if (!api.isDisposed()) { + var zr = api.getZr(); + zr[DISPATCH_FLAG] = true; + api.dispatchAction({ + type: 'brushSelect', + batch: brushSelected + }); + zr[DISPATCH_FLAG] = false; + } + } + + function checkInRange(seriesModel, rangeInfoList, data, dataIndex) { + for (var i = 0, len = rangeInfoList.length; i < len; i++) { + var area = rangeInfoList[i]; + + if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) { + return true; + } + } + } + + function brushModelNotControll(brushModel, seriesIndex) { + var seriesIndices = brushModel.option.seriesIndex; + return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices); + } + + var boundingRectBuilders = { + rect: function (area) { + return getBoundingRectFromMinMax(area.range); + }, + polygon: function (area) { + var minMax; + var range = area.range; + + for (var i = 0, len = range.length; i < len; i++) { + minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; + var rg = range[i]; + rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); + rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); + rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); + rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); + } + + return minMax && getBoundingRectFromMinMax(minMax); + } + }; + + function getBoundingRectFromMinMax(minMax) { + return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]); + } + + var BrushView = + /** @class */ + function (_super) { + __extends(BrushView, _super); + + function BrushView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushView.type; + return _this; + } + + BrushView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + this.model; + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount(); + }; + + BrushView.prototype.render = function (brushModel, ecModel, api, payload) { + this.model = brushModel; + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) { + // PENDING: `updateTransform` is a little tricky, whose layout need + // to be calculate mandatorily and other stages will not be performed. + // Take care the correctness of the logic. See #11754 . + layoutCovers(ecModel); + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) { + this.updateTransform(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) { + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) { + // Do not update controller when drawing. + (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice()); + }; // updateLayout: updateController, + // updateVisual: updateController, + + + BrushView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + BrushView.prototype._onBrush = function (eventParam) { + var modelId = this.model.id; + var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); // Action is not dispatched on drag end, because the drag end + // emits the same params with the last drag move event, and + // may have some delay when using touch pad, which makes + // animation not smooth (when using debounce). + + (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ + type: 'brush', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + eventParam.isEnd && this.api.dispatchAction({ + type: 'brushEnd', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + }; + + BrushView.type = 'brush'; + return BrushView; + }(ComponentView); + + var DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; + + var BrushModel = + /** @class */ + function (_super) { + __extends(BrushModel, _super); + + function BrushModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushModel.type; + /** + * @readOnly + */ + + _this.areas = []; + /** + * Current brush painting area settings. + * @readOnly + */ + + _this.brushOption = {}; + return _this; + } + + BrushModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']); + var inBrush = thisOption.inBrush = thisOption.inBrush || {}; // Always give default visual, consider setOption at the second time. + + thisOption.outOfBrush = thisOption.outOfBrush || { + color: DEFAULT_OUT_OF_BRUSH_COLOR + }; + + if (!inBrush.hasOwnProperty('liftZ')) { + // Bigger than the highlight z lift, otherwise it will + // be effected by the highlight z when brush. + inBrush.liftZ = 5; + } + }; + /** + * If `areas` is null/undefined, range state remain. + */ + + + BrushModel.prototype.setAreas = function (areas) { + if ("development" !== 'production') { + assert(isArray(areas)); + each(areas, function (area) { + assert(area.brushType, 'Illegal areas'); + }); + } // If areas is null/undefined, range state remain. + // This helps user to dispatchAction({type: 'brush'}) with no areas + // set but just want to get the current brush select info from a `brush` event. + + + if (!areas) { + return; + } + + this.areas = map(areas, function (area) { + return generateBrushOption(this.option, area); + }, this); + }; + /** + * Set the current painting brush option. + */ + + + BrushModel.prototype.setBrushOption = function (brushOption) { + this.brushOption = generateBrushOption(this.option, brushOption); + this.brushType = this.brushOption.brushType; + }; + + BrushModel.type = 'brush'; + BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; + BrushModel.defaultOption = { + seriesIndex: 'all', + brushType: 'rect', + brushMode: 'single', + transformable: true, + brushStyle: { + borderWidth: 1, + color: 'rgba(210,219,238,0.3)', + borderColor: '#D2DBEE' + }, + throttleType: 'fixRate', + throttleDelay: 0, + removeOnClick: true, + z: 10000 + }; + return BrushModel; + }(ComponentModel); + + function generateBrushOption(option, brushOption) { + return merge({ + brushType: option.brushType, + brushMode: option.brushMode, + transformable: option.transformable, + brushStyle: new Model(option.brushStyle).getItemStyle(), + removeOnClick: option.removeOnClick, + z: option.z + }, brushOption, true); + } + + var ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear']; + + var BrushFeature = + /** @class */ + function (_super) { + __extends(BrushFeature, _super); + + function BrushFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + BrushFeature.prototype.render = function (featureModel, ecModel, api) { + var brushType; + var brushMode; + var isBrushed; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + brushType = brushModel.brushType; + brushMode = brushModel.brushOption.brushMode || 'single'; + isBrushed = isBrushed || !!brushModel.areas.length; + }); + this._brushType = brushType; + this._brushMode = brushMode; + each(featureModel.get('type', true), function (type) { + featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal'); + }); + }; + + BrushFeature.prototype.updateView = function (featureModel, ecModel, api) { + this.render(featureModel, ecModel, api); + }; + + BrushFeature.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon', true); + var icons = {}; + each(model.get('type', true), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + BrushFeature.prototype.onclick = function (ecModel, api, type) { + var brushType = this._brushType; + var brushMode = this._brushMode; + + if (type === 'clear') { + // Trigger parallel action firstly + api.dispatchAction({ + type: 'axisAreaSelect', + intervals: [] + }); + api.dispatchAction({ + type: 'brush', + command: 'clear', + // Clear all areas of all brush components. + areas: [] + }); + } else { + api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'brush', + brushOption: { + brushType: type === 'keep' ? brushType : brushType === type ? false : type, + brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode + } + }); + } + }; + + BrushFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: ICON_TYPES.slice(), + icon: { + /* eslint-disable */ + rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', + polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', + lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', + lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', + keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', + clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line + + /* eslint-enable */ + + }, + // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` + title: ecModel.getLocaleModel().get(['toolbox', 'brush', 'title']) + }; + return defaultOption; + }; + + return BrushFeature; + }(ToolboxFeature); + + function install$B(registers) { + registers.registerComponentView(BrushView); + registers.registerComponentModel(BrushModel); + registers.registerPreprocessor(brushPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual); + registers.registerAction({ + type: 'brush', + event: 'brush', + update: 'updateVisual' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'brush', + query: payload + }, function (brushModel) { + brushModel.setAreas(payload.areas); + }); + }); + /** + * payload: { + * brushComponents: [ + * { + * brushId, + * brushIndex, + * brushName, + * series: [ + * { + * seriesId, + * seriesIndex, + * seriesName, + * rawIndices: [21, 34, ...] + * }, + * ... + * ] + * }, + * ... + * ] + * } + */ + + registers.registerAction({ + type: 'brushSelect', + event: 'brushSelected', + update: 'none' + }, noop); + registers.registerAction({ + type: 'brushEnd', + event: 'brushEnd', + update: 'none' + }, noop); + registerFeature('brush', BrushFeature); + } + + var TitleModel = + /** @class */ + function (_super) { + __extends(TitleModel, _super); + + function TitleModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleModel.type; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + return _this; + } + + TitleModel.type = 'title'; + TitleModel.defaultOption = { + // zlevel: 0, + z: 6, + show: true, + text: '', + target: 'blank', + subtext: '', + subtarget: 'blank', + left: 0, + top: 0, + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + padding: 5, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bold', + color: '#464646' + }, + subtextStyle: { + fontSize: 12, + color: '#6E7079' + } + }; + return TitleModel; + }(ComponentModel); // View + + + var TitleView = + /** @class */ + function (_super) { + __extends(TitleView, _super); + + function TitleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleView.type; + return _this; + } + + TitleView.prototype.render = function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + var textAlign = titleModel.get('textAlign'); + var textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')); + var textEl = new ZRText({ + style: createTextStyle(textStyleModel, { + text: titleModel.get('text'), + fill: textStyleModel.getTextColor() + }, { + disableBox: true + }), + z2: 10 + }); + var textRect = textEl.getBoundingRect(); + var subText = titleModel.get('subtext'); + var subTextEl = new ZRText({ + style: createTextStyle(subtextStyleModel, { + text: subText, + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + verticalAlign: 'top' + }, { + disableBox: true + }), + z2: 10 + }); + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + var triggerEvent = titleModel.get('triggerEvent', true); + textEl.silent = !link && !triggerEvent; + subTextEl.silent = !sublink && !triggerEvent; + + if (link) { + textEl.on('click', function () { + windowOpen(link, '_' + titleModel.get('target')); + }); + } + + if (sublink) { + subTextEl.on('click', function () { + windowOpen(sublink, '_' + titleModel.get('subtarget')); + }); + } + + getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { + componentType: 'title', + componentIndex: titleModel.componentIndex + } : null; + group.add(textEl); + subText && group.add(subTextEl); // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = getLayoutRect(layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding')); // Adjust text align based on position + + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); // @ts-ignore + + if (textAlign === 'middle') { + textAlign = 'center'; + } // Adjust layout by text align + + + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + + if (!textVerticalAlign) { + textVerticalAlign = titleModel.get('top') || titleModel.get('bottom'); // @ts-ignore + + if (textVerticalAlign === 'center') { + textVerticalAlign = 'middle'; + } + + if (textVerticalAlign === 'bottom') { + layoutRect.y += layoutRect.height; + } else if (textVerticalAlign === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + + textVerticalAlign = textVerticalAlign || 'top'; + } + + group.x = layoutRect.x; + group.y = layoutRect.y; + group.markRedraw(); + var alignStyle = { + align: textAlign, + verticalAlign: textVerticalAlign + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); // Render background + // Get groupRect again because textAlign has been changed + + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2], + r: titleModel.get('borderRadius') + }, + style: style, + subPixelOptimize: true, + silent: true + }); + group.add(rect); + }; + + TitleView.type = 'title'; + return TitleView; + }(ComponentView); + + function install$C(registers) { + registers.registerComponentModel(TitleModel); + registers.registerComponentView(TitleView); + } + + var TimelineModel = + /** @class */ + function (_super) { + __extends(TimelineModel, _super); + + function TimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineModel.type; + _this.layoutMode = 'box'; + return _this; + } + /** + * @override + */ + + + TimelineModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + this._initData(); + }; + /** + * @override + */ + + + TimelineModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this._initData(); + }; + + TimelineModel.prototype.setCurrentIndex = function (currentIndex) { + if (currentIndex == null) { + currentIndex = this.option.currentIndex; + } + + var count = this._data.count(); + + if (this.option.loop) { + currentIndex = (currentIndex % count + count) % count; + } else { + currentIndex >= count && (currentIndex = count - 1); + currentIndex < 0 && (currentIndex = 0); + } + + this.option.currentIndex = currentIndex; + }; + /** + * @return {number} currentIndex + */ + + + TimelineModel.prototype.getCurrentIndex = function () { + return this.option.currentIndex; + }; + /** + * @return {boolean} + */ + + + TimelineModel.prototype.isIndexMax = function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }; + /** + * @param {boolean} state true: play, false: stop + */ + + + TimelineModel.prototype.setPlayState = function (state) { + this.option.autoPlay = !!state; + }; + /** + * @return {boolean} true: play, false: stop + */ + + + TimelineModel.prototype.getPlayState = function () { + return !!this.option.autoPlay; + }; + /** + * @private + */ + + + TimelineModel.prototype._initData = function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + var processedDataArr; + + if (axisType === 'category') { + processedDataArr = []; + each(dataArr, function (item, index) { + var value = convertOptionIdName(getDataItemValue(item), ''); + var newItem; + + if (isObject(item)) { + newItem = clone(item); + newItem.value = index; + } else { + newItem = index; + } + + processedDataArr.push(newItem); + names.push(value); + }); + } else { + processedDataArr = dataArr; + } + + var dimType = { + category: 'ordinal', + time: 'time', + value: 'number' + }[axisType] || 'number'; + var data = this._data = new SeriesData([{ + name: 'value', + type: dimType + }], this); + data.initData(processedDataArr, names); + }; + + TimelineModel.prototype.getData = function () { + return this._data; + }; + /** + * @public + * @return {Array.} categoreis + */ + + + TimelineModel.prototype.getCategories = function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + }; + + TimelineModel.type = 'timeline'; + /** + * @protected + */ + + TimelineModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 4, + show: true, + axisType: 'time', + realtime: true, + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + controlPosition: 'left', + autoPlay: false, + rewind: false, + loop: true, + playInterval: 2000, + currentIndex: 0, + itemStyle: {}, + label: { + color: '#000' + }, + data: [] + }; + return TimelineModel; + }(ComponentModel); + + var SliderTimelineModel = + /** @class */ + function (_super) { + __extends(SliderTimelineModel, _super); + + function SliderTimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineModel.type; + return _this; + } + + SliderTimelineModel.type = 'timeline.slider'; + /** + * @protected + */ + + SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, { + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + orient: 'horizontal', + inverse: false, + tooltip: { + trigger: 'item' // data item may also have tootip attr. + + }, + symbol: 'circle', + symbolSize: 12, + lineStyle: { + show: true, + width: 2, + color: '#DAE1F5' + }, + label: { + position: 'auto', + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#A4B1D7' + }, + itemStyle: { + color: '#A4B1D7', + borderWidth: 1 + }, + checkpointStyle: { + symbol: 'circle', + symbolSize: 15, + color: '#316bf3', + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0, 0, 0, 0.3)', + // borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 24, + itemGap: 12, + position: 'left', + playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', + stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', + // eslint-disable-next-line max-len + nextIcon: 'M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z', + // eslint-disable-next-line max-len + prevIcon: 'M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z', + prevBtnSize: 18, + nextBtnSize: 18, + color: '#A4B1D7', + borderColor: '#A4B1D7', + borderWidth: 1 + }, + emphasis: { + label: { + show: true, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#6f778d' + }, + itemStyle: { + color: '#316BF3' + }, + controlStyle: { + color: '#316BF3', + borderColor: '#316BF3', + borderWidth: 2 + } + }, + progress: { + lineStyle: { + color: '#316BF3' + }, + itemStyle: { + color: '#316BF3' + }, + label: { + color: '#6f778d' + } + }, + data: [] + }); + return SliderTimelineModel; + }(TimelineModel); + + mixin(SliderTimelineModel, DataFormatMixin.prototype); + + var TimelineView = + /** @class */ + function (_super) { + __extends(TimelineView, _super); + + function TimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineView.type; + return _this; + } + + TimelineView.type = 'timeline'; + return TimelineView; + }(ComponentView); + + /** + * Extend axis 2d + */ + + var TimelineAxis = + /** @class */ + function (_super) { + __extends(TimelineAxis, _super); + + function TimelineAxis(dim, scale, coordExtent, axisType) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + return _this; + } + /** + * @override + */ + + + TimelineAxis.prototype.getLabelModel = function () { + // Force override + return this.model.getModel('label'); + }; + /** + * @override + */ + + + TimelineAxis.prototype.isHorizontal = function () { + return this.model.get('orient') === 'horizontal'; + }; + + return TimelineAxis; + }(Axis); + + var PI$8 = Math.PI; + var labelDataIndexStore = makeInner(); + + var SliderTimelineView = + /** @class */ + function (_super) { + __extends(SliderTimelineView, _super); + + function SliderTimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineView.type; + return _this; + } + + SliderTimelineView.prototype.init = function (ecModel, api) { + this.api = api; + }; + /** + * @override + */ + + + SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + var layoutInfo_1 = this._layout(timelineModel, api); + + var mainGroup_1 = this._createGroup('_mainGroup'); + + var labelGroup = this._createGroup('_labelGroup'); + + var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel); + + timelineModel.formatTooltip = function (dataIndex) { + var name = axis_1.scale.getLabel({ + value: dataIndex + }); + return createTooltipMarkup('nameValue', { + noName: true, + value: name + }); + }; + + each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) { + this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel); + }, this); + + this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel); + + this._position(layoutInfo_1, timelineModel); + } + + this._doPlayStop(); + + this._updateTicksStatus(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.remove = function () { + this._clearTimer(); + + this.group.removeAll(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.dispose = function () { + this._clearTimer(); + }; + + SliderTimelineView.prototype._layout = function (timelineModel, api) { + var labelPosOpt = timelineModel.get(['label', 'position']); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect$5(timelineModel, api); + var parsedLabelPos; // Auto label offset. + + if (labelPosOpt == null || labelPosOpt === 'auto') { + parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-'; + } else if (isString(labelPosOpt)) { + parsedLabelPos = { + horizontal: { + top: '-', + bottom: '+' + }, + vertical: { + left: '-', + right: '+' + } + }[orient][labelPosOpt]; + } else { + // is number + parsedLabelPos = labelPosOpt; + } + + var labelAlignMap = { + horizontal: 'center', + vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right' + }; + var labelBaselineMap = { + horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI$8 / 2 + }; // Position + + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show', true); + var controlSize = showControl ? controlModel.get('itemSize') : 0; + var controlGap = showControl ? controlModel.get('itemGap') : 0; + var sizePlusGap = controlSize + controlGap; // Special label rotate. + + var labelRotation = timelineModel.get(['label', 'rotate']) || 0; + labelRotation = labelRotation * PI$8 / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var controlPosition = controlModel.get('position', true); + var showPlayBtn = showControl && controlModel.get('showPlayBtn', true); + var showPrevBtn = showControl && controlModel.get('showPrevBtn', true); + var showNextBtn = showControl && controlModel.get('showNextBtn', true); + var xLeft = 0; + var xRight = mainLength; // position[0] means left, position[1] means middle. + + if (controlPosition === 'left' || controlPosition === 'bottom') { + showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); + showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } else { + // 'top' 'right' + showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + + var axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: parsedLabelPos, + labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient], + labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient], + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + controlSize: controlSize, + controlGap: controlGap + }; + }; + + SliderTimelineView.prototype._position = function (layoutInfo, timelineModel) { + // Position is be called finally, because bounding rect is needed for + // adapt content to fill viewRect (auto adapt offset). + // Timeline may be not all in the viewRect when 'offset' is specified + // as a number, because it is more appropriate that label aligns at + // 'offset' but not the other edge defined by viewRect. + var mainGroup = this._mainGroup; + var labelGroup = this._labelGroup; + var viewRect = layoutInfo.viewRect; + + if (layoutInfo.orient === 'vertical') { + // transform to horizontal, inverse rotate by left-top point. + var m = create$1(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + translate(m, m, [-rotateOriginX, -rotateOriginY]); + rotate(m, m, -PI$8 / 2); + translate(m, m, [rotateOriginX, rotateOriginY]); + viewRect = viewRect.clone(); + viewRect.applyTransform(m); + } + + var viewBound = getBound(viewRect); + var mainBound = getBound(mainGroup.getBoundingRect()); + var labelBound = getBound(labelGroup.getBoundingRect()); + var mainPosition = [mainGroup.x, mainGroup.y]; + var labelsPosition = [labelGroup.x, labelGroup.y]; + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + var labelPosOpt = layoutInfo.labelPosOpt; + + if (labelPosOpt == null || isString(labelPosOpt)) { + // '+' or '-' + var mainBoundIdx = labelPosOpt === '+' ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); + } else { + var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + labelsPosition[1] = mainPosition[1] + labelPosOpt; + } + + mainGroup.setPosition(mainPosition); + labelGroup.setPosition(labelsPosition); + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + targetGroup.originX = viewBound[0][0] - targetGroup.x; + targetGroup.originY = viewBound[1][0] - targetGroup.y; + } + + function getBound(rect) { + // [[xmin, xmax], [ymin, ymax]] + return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]]; + } + + function toBound(fromPos, from, to, dimIdx, boundIdx) { + fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; + } + }; + + SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + var scale = createScaleByModel$1(timelineModel, axisType); // Customize scale. The `tickValue` is `dataIndex`. + + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return { + value: value + }; + }); + }; + + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + scale.calcNiceTicks(); + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + return axis; + }; + + SliderTimelineView.prototype._createGroup = function (key) { + var newGroup = this[key] = new Group(); + this.group.add(newGroup); + return newGroup; + }; + + SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get(['lineStyle', 'show'])) { + return; + } + + var line = new Line({ + shape: { + x1: axisExtent[0], + y1: 0, + x2: axisExtent[1], + y2: 0 + }, + style: extend({ + lineCap: 'round' + }, timelineModel.getModel('lineStyle').getLineStyle()), + silent: true, + z2: 1 + }); + group.add(line); + var progressLine = this._progressLine = new Line({ + shape: { + x1: axisExtent[0], + x2: this._currentPointer ? this._currentPointer.x : axisExtent[0], + y1: 0, + y2: 0 + }, + style: defaults({ + lineCap: 'round', + lineWidth: line.style.lineWidth + }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()), + silent: true, + z2: 1 + }); + group.add(progressLine); + }; + + SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var data = timelineModel.getData(); // Show all ticks, despite ignoring strategy. + + var ticks = axis.scale.getTicks(); + this._tickSymbols = []; // The value is dataIndex, see the customized scale. + + each(ticks, function (tick) { + var tickCoord = axis.dataToCoord(tick.value); + var itemModel = data.getItemModel(tick.value); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']); + var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']); + var symbolOpt = { + x: tickCoord, + y: 0, + onclick: bind(_this._changeTimeline, _this, tick.value) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + el.ensureState('emphasis').style = hoverStyleModel.getItemStyle(); + el.ensureState('progress').style = progressStyleModel.getItemStyle(); + enableHoverEmphasis(el); + var ecData = getECData(el); + + if (itemModel.get('tooltip')) { + ecData.dataIndex = tick.value; + ecData.dataModel = timelineModel; + } else { + ecData.dataIndex = ecData.dataModel = null; + } + + _this._tickSymbols.push(el); + }); + }; + + SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var labelModel = axis.getLabelModel(); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var labels = axis.getViewLabels(); + this._tickLabels = []; + each(labels, function (labelItem) { + // The tickValue is dataIndex, see the customized scale. + var dataIndex = labelItem.tickValue; + var itemModel = data.getItemModel(dataIndex); + var normalLabelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel(['emphasis', 'label']); + var progressLabelModel = itemModel.getModel(['progress', 'label']); + var tickCoord = axis.dataToCoord(labelItem.tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: 0, + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind(_this._changeTimeline, _this, dataIndex), + silent: false, + style: createTextStyle(normalLabelModel, { + text: labelItem.formattedLabel, + align: layoutInfo.labelAlign, + verticalAlign: layoutInfo.labelBaseline + }) + }); + textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel); + textEl.ensureState('progress').style = createTextStyle(progressLabelModel); + group.add(textEl); + enableHoverEmphasis(textEl); + labelDataIndexStore(textEl).dataIndex = dataIndex; + + _this._tickLabels.push(textEl); + }); + }; + + SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + var itemStyle = timelineModel.getModel('controlStyle').getItemStyle(); + var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle(); + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+')); + makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-')); + makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true); + + function makeBtn(position, iconName, onclick, willRotate) { + if (!position) { + return; + } + + var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize); + var rect = [0, -iconSize / 2, iconSize, iconSize]; + var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, { + x: position[0], + y: position[1], + originX: controlSize / 2, + originY: 0, + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }); + btn.ensureState('emphasis').style = hoverStyle; + group.add(btn); + enableHoverEmphasis(btn); + } + }; + + SliderTimelineView.prototype._renderCurrentPointer = function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var currentIndex = timelineModel.getCurrentIndex(); + var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle'); + var me = this; + var callback = { + onCreate: function (pointer) { + pointer.draggable = true; + pointer.drift = bind(me._handlePointerDrag, me); + pointer.ondragend = bind(me._handlePointerDragend, me); + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel); + } + }; // Reuse when exists, for animation and drag. + + this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback); + }; + + SliderTimelineView.prototype._handlePlayClick = function (nextState) { + this._clearTimer(); + + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }; + + SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) { + this._clearTimer(); + + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }; + + SliderTimelineView.prototype._handlePointerDragend = function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }; + + SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = asc(axis.getExtent().slice()); + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + this._currentPointer.x = toCoord; + + this._currentPointer.markRedraw(); + + var progressLine = this._progressLine; + + if (progressLine) { + progressLine.shape.x2 = toCoord; + progressLine.dirty(); + } + + var targetDataIndex = this._findNearestTick(toCoord); + + var timelineModel = this.model; + + if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) { + this._changeTimeline(targetDataIndex); + } + }; + + SliderTimelineView.prototype._doPlayStop = function () { + var _this = this; + + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout(function () { + // Do not cache + var timelineModel = _this.model; + + _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1)); + }, this.model.get('playInterval')); + } + }; + + SliderTimelineView.prototype._toAxisCoord = function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + + return applyTransform$1(vertex, trans, true); + }; + + SliderTimelineView.prototype._findNearestTick = function (axisCoord) { + var data = this.model.getData(); + var dist = Infinity; + var targetDataIndex; + var axis = this._axis; + data.each(['value'], function (value, dataIndex) { + var coord = axis.dataToCoord(value); + var d = Math.abs(coord - axisCoord); + + if (d < dist) { + dist = d; + targetDataIndex = dataIndex; + } + }); + return targetDataIndex; + }; + + SliderTimelineView.prototype._clearTimer = function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }; + + SliderTimelineView.prototype._changeTimeline = function (nextIndex) { + var currentIndex = this.model.getCurrentIndex(); + + if (nextIndex === '+') { + nextIndex = currentIndex + 1; + } else if (nextIndex === '-') { + nextIndex = currentIndex - 1; + } + + this.api.dispatchAction({ + type: 'timelineChange', + currentIndex: nextIndex, + from: this.uid + }); + }; + + SliderTimelineView.prototype._updateTicksStatus = function () { + var currentIndex = this.model.getCurrentIndex(); + var tickSymbols = this._tickSymbols; + var tickLabels = this._tickLabels; + + if (tickSymbols) { + for (var i = 0; i < tickSymbols.length; i++) { + tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex); + } + } + + if (tickLabels) { + for (var i = 0; i < tickLabels.length; i++) { + tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex); + } + } + }; + + SliderTimelineView.type = 'timeline.slider'; + return SliderTimelineView; + }(TimelineView); + + function createScaleByModel$1(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // default to be value + return new IntervalScale(); + } + } + } + + function getViewRect$5(model, api) { + return getLayoutRect(model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, model.get('padding')); + } + + function makeControlIcon(timelineModel, objPath, rect, opts) { + var style = opts.style; + var icon = createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3])); // TODO createIcon won't use style in opt. + + if (style) { + icon.setStyle(style); + } + + return icon; + } + /** + * Create symbol or update symbol + * opt: basic position and event handlers + */ + + + function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var color = itemStyleModel.get('color'); + + if (!symbol) { + var symbolType = hostModel.get('symbol'); + symbol = createSymbol(symbolType, -1, -1, 2, 2, color); + symbol.setStyle('strokeNoScale', true); + group.add(symbol); + callback && callback.onCreate(symbol); + } else { + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + + callback && callback.onUpdate(symbol); + } // Style + + + var itemStyle = itemStyleModel.getItemStyle(['color']); + symbol.setStyle(itemStyle); // Transform and events. + + opt = merge({ + rectHover: true, + z2: 100 + }, opt, true); + var symbolSize = normalizeSymbolSize(hostModel.get('symbolSize')); + opt.scaleX = symbolSize[0] / 2; + opt.scaleY = symbolSize[1] / 2; + var symbolOffset = normalizeSymbolOffset(hostModel.get('symbolOffset'), symbolSize); + + if (symbolOffset) { + opt.x = (opt.x || 0) + symbolOffset[0]; + opt.y = (opt.y || 0) + symbolOffset[1]; + } + + var symbolRotate = hostModel.get('symbolRotate'); + opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + symbol.attr(opt); // FIXME + // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed, + // getBoundingRect will return wrong result. + // (This is supposed to be resolved in zrender, but it is a little difficult to + // leverage performance and auto updateTransform) + // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol. + + symbol.updateTransform(); + return symbol; + } + + function pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) { + if (pointer.dragging) { + return; + } + + var pointerModel = timelineModel.getModel('checkpointStyle'); + var toCoord = axis.dataToCoord(timelineModel.getData().get('value', dataIndex)); + + if (noAnimation || !pointerModel.get('animation', true)) { + pointer.attr({ + x: toCoord, + y: 0 + }); + progressLine && progressLine.attr({ + shape: { + x2: toCoord + } + }); + } else { + var animationCfg = { + duration: pointerModel.get('animationDuration', true), + easing: pointerModel.get('animationEasing', true) + }; + pointer.stopAnimation(null, true); + pointer.animateTo({ + x: toCoord, + y: 0 + }, animationCfg); + progressLine && progressLine.animateTo({ + shape: { + x2: toCoord + } + }, animationCfg); + } + } + + function installTimelineAction(registers) { + registers.registerAction({ + type: 'timelineChange', + event: 'timelineChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel, api) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.currentIndex != null) { + timelineModel.setCurrentIndex(payload.currentIndex); + + if (!timelineModel.get('loop', true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) { + timelineModel.setPlayState(false); // The timeline has played to the end, trigger event + + api.dispatchAction({ + type: 'timelinePlayChange', + playState: false, + from: payload.from + }); + } + } // Set normalized currentIndex to payload. + + + ecModel.resetOption('timeline', { + replaceMerge: timelineModel.get('replaceMerge', true) + }); + return defaults({ + currentIndex: timelineModel.option.currentIndex + }, payload); + }); + registers.registerAction({ + type: 'timelinePlayChange', + event: 'timelinePlayChanged', + update: 'update' + }, function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + }); + } + + function timelinePreprocessor(option) { + var timelineOpt = option && option.timeline; + + if (!isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + each(timelineOpt, function (opt) { + if (!opt) { + return; + } + + compatibleEC2(opt); + }); + } + + function compatibleEC2(opt) { + var type = opt.type; + var ec2Types = { + 'number': 'value', + 'time': 'time' + }; // Compatible with ec2 + + if (ec2Types[type]) { + opt.axisType = ec2Types[type]; + delete opt.type; + } + + transferItem(opt); + + if (has(opt, 'controlPosition')) { + var controlStyle = opt.controlStyle || (opt.controlStyle = {}); + + if (!has(controlStyle, 'position')) { + controlStyle.position = opt.controlPosition; + } + + if (controlStyle.position === 'none' && !has(controlStyle, 'show')) { + controlStyle.show = false; + delete controlStyle.position; + } + + delete opt.controlPosition; + } + + each(opt.data || [], function (dataItem) { + if (isObject(dataItem) && !isArray(dataItem)) { + if (!has(dataItem, 'value') && has(dataItem, 'name')) { + // In ec2, using name as value. + dataItem.value = dataItem.name; + } + + transferItem(dataItem); + } + }); + } + + function transferItem(opt) { + var itemStyle = opt.itemStyle || (opt.itemStyle = {}); + var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); // Transfer label out + + var label = opt.label || opt.label || {}; + var labelNormal = label.normal || (label.normal = {}); + var excludeLabelAttr = { + normal: 1, + emphasis: 1 + }; + each(label, function (value, name) { + if (!excludeLabelAttr[name] && !has(labelNormal, name)) { + labelNormal[name] = value; + } + }); + + if (itemStyleEmphasis.label && !has(label, 'emphasis')) { + label.emphasis = itemStyleEmphasis.label; + delete itemStyleEmphasis.label; + } + } + + function has(obj, attr) { + return obj.hasOwnProperty(attr); + } + + function install$D(registers) { + registers.registerComponentModel(SliderTimelineModel); + registers.registerComponentView(SliderTimelineView); + registers.registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; + }); + installTimelineAction(registers); + registers.registerPreprocessor(timelinePreprocessor); + } + + function checkMarkerInSeries(seriesOpts, markerType) { + if (!seriesOpts) { + return false; + } + + var seriesOptArr = isArray(seriesOpts) ? seriesOpts : [seriesOpts]; + + for (var idx = 0; idx < seriesOptArr.length; idx++) { + if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) { + return true; + } + } + + return false; + } + + function fillLabel(opt) { + defaultEmphasis(opt, 'label', ['show']); + } // { [componentType]: MarkerModel } + + + var inner$g = makeInner(); + + var MarkerModel = + /** @class */ + function (_super) { + __extends(MarkerModel, _super); + + function MarkerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerModel.type; + /** + * If marker model is created by self from series + */ + + _this.createdBySelf = false; + return _this; + } + /** + * @overrite + */ + + + MarkerModel.prototype.init = function (option, parentModel, ecModel) { + if ("development" !== 'production') { + if (this.type === 'marker') { + throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.'); + } + } + + this.mergeDefaultAndTheme(option, ecModel); + + this._mergeOption(option, ecModel, false, true); + }; + + MarkerModel.prototype.isAnimationEnabled = function () { + if (env.node) { + return false; + } + + var hostSeries = this.__hostSeries; + return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled(); + }; + /** + * @overrite + */ + + + MarkerModel.prototype.mergeOption = function (newOpt, ecModel) { + this._mergeOption(newOpt, ecModel, false, false); + }; + + MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) { + var componentType = this.mainType; + + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + // mainType can be markPoint, markLine, markArea + var markerOpt = seriesModel.get(this.mainType, true); + var markerModel = inner$g(seriesModel)[componentType]; + + if (!markerOpt || !markerOpt.data) { + inner$g(seriesModel)[componentType] = null; + return; + } + + if (!markerModel) { + if (isInit) { + // Default label emphasis `position` and `show` + fillLabel(markerOpt); + } + + each(markerOpt.data, function (item) { + // FIXME Overwrite fillLabel method ? + if (item instanceof Array) { + fillLabel(item[0]); + fillLabel(item[1]); + } else { + fillLabel(item); + } + }); + markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel); // markerModel = new ImplementedMarkerModel( + // markerOpt, this, ecModel + // ); + + extend(markerModel, { + mainType: this.mainType, + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }); + markerModel.__hostSeries = seriesModel; + } else { + markerModel._mergeOption(markerOpt, ecModel, true); + } + + inner$g(seriesModel)[componentType] = markerModel; + }, this); + } + }; + + MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var itemName = data.getName(dataIndex); + return createTooltipMarkup('section', { + header: this.name, + blocks: [createTooltipMarkup('nameValue', { + name: itemName, + value: value, + noName: !itemName, + noValue: value == null + })] + }); + }; + + MarkerModel.prototype.getData = function () { + return this._data; + }; + + MarkerModel.prototype.setData = function (data) { + this._data = data; + }; + + MarkerModel.getMarkerModelFromSeries = function (seriesModel, // Support three types of markers. Strict check. + componentType) { + return inner$g(seriesModel)[componentType]; + }; + + MarkerModel.type = 'marker'; + MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo']; + return MarkerModel; + }(ComponentModel); + + mixin(MarkerModel, DataFormatMixin.prototype); + + var MarkPointModel = + /** @class */ + function (_super) { + __extends(MarkPointModel, _super); + + function MarkPointModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointModel.type; + return _this; + } + + MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkPointModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkPointModel.type = 'markPoint'; + MarkPointModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: 'pin', + symbolSize: 50, + // symbolRotate: 0, + // symbolOffset: [0, 0] + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'inside' + }, + itemStyle: { + borderWidth: 2 + }, + emphasis: { + label: { + show: true + } + } + }; + return MarkPointModel; + }(MarkerModel); + + function hasXOrY(item) { + return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); + } + + function hasXAndY(item) { + return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); + } + + function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) { + var coordArr = []; + var stacked = isDimensionStacked(data, targetDataDim + /* , otherDataDim */ + ); + var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim; + var value = numCalculate(data, calcDataDim, markerType); + var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; + coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); + coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex); + var coordArrValue = data.get(targetDataDim, dataIndex); // Make it simple, do not visit all stacked value to count precision. + + var precision = getPrecision(data.get(targetDataDim, dataIndex)); + precision = Math.min(precision, 20); + + if (precision >= 0) { + coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); + } + + return [coordArr, coordArrValue]; + } // TODO Specified percent + + + var markerTypeCalculator = { + min: curry(markerTypeCalculatorWithExtent, 'min'), + max: curry(markerTypeCalculatorWithExtent, 'max'), + average: curry(markerTypeCalculatorWithExtent, 'average'), + median: curry(markerTypeCalculatorWithExtent, 'median') + }; + /** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + */ + + function dataTransform(seriesModel, item) { + if (!item) { + return; + } + + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dims = coordSys && coordSys.dimensions; // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + // parseFloat first because item.x and item.y can be percent string like '20%' + + if (!hasXAndY(item) && !isArray(item.coord) && isArray(dims)) { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + + item = clone(item); + + if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) { + var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); + item.coord = coordInfo[0]; // Force to use the value of calculated value. + // let item use the value without stack. + + item.value = coordInfo[1]; + } else { + // FIXME Only has one of xAxis and yAxis. + item.coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; + } + } // x y is provided + + + if (item.coord == null || !isArray(dims)) { + item.coord = []; + } else { + // Each coord support max, min, average + var coord = item.coord; + + for (var i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i]]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); + } + } + } + + return item; + } + function getAxisInfo$1(item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + } else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); + } + + return ret; + } + + function dataDimToCoordDim(seriesModel, dataDim) { + var dimItem = seriesModel.getData().getDimensionInfo(dataDim); + return dimItem && dimItem.coordDim; + } + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + */ + + + function dataFilter$1( // Currently only polar and cartesian has containData. + coordSys, item) { + // Always return true if there is no coordSys + return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true; + } + function zoneFilter( // Currently only polar and cartesian has containData. + coordSys, item1, item2) { + // Always return true if there is no coordSys + return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true; + } + function createMarkerDimValueGetter(inCoordSys, dims) { + return inCoordSys ? function (item, dimName, dataIndex, dimIndex) { + var rawVal = dimIndex < 2 // x, y, radius, angle + ? item.coord && item.coord[dimIndex] : item.value; + return parseDataValue(rawVal, dims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dims[dimIndex]); + }; + } + function numCalculate(data, valueDataDim, type) { + if (type === 'average') { + var sum_1 = 0; + var count_1 = 0; + data.each(valueDataDim, function (val, idx) { + if (!isNaN(val)) { + sum_1 += val; + count_1++; + } + }); + return sum_1 / count_1; + } else if (type === 'median') { + return data.getMedian(valueDataDim); + } else { + // max & min + return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0]; + } + } + + var inner$h = makeInner(); + + var MarkerView = + /** @class */ + function (_super) { + __extends(MarkerView, _super); + + function MarkerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerView.type; + return _this; + } + + MarkerView.prototype.init = function () { + this.markerGroupMap = createHashMap(); + }; + + MarkerView.prototype.render = function (markerModel, ecModel, api) { + var _this = this; + + var markerGroupMap = this.markerGroupMap; + markerGroupMap.each(function (item) { + inner$h(item).keep = false; + }); + ecModel.eachSeries(function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api); + }); + markerGroupMap.each(function (item) { + !inner$h(item).keep && _this.group.remove(item.group); + }); + }; + + MarkerView.prototype.markKeep = function (drawGroup) { + inner$h(drawGroup).keep = true; + }; + + MarkerView.prototype.toggleBlurSeries = function (seriesModelList, isBlur) { + var _this = this; + + each(seriesModelList, function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + + if (markerModel) { + var data = markerModel.getData(); + data.eachItemGraphicEl(function (el) { + if (el) { + isBlur ? enterBlur(el) : leaveBlur(el); + } + }); + } + }); + }; + + MarkerView.type = 'marker'; + return MarkerView; + }(ComponentView); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPosition + point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx)); + } else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + + mpData.setItemLayout(idx, point); + }); + } + + var MarkPointView = + /** @class */ + function (_super) { + __extends(MarkPointView, _super); + + function MarkPointView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointView.type; + return _this; + } + + MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint'); + + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var symbolDrawMap = this.markerGroupMap; + var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw()); + var mpData = createData(coordSys, seriesModel, mpModel); // FIXME + + mpModel.setData(mpData); + updateMarkerLayout(mpModel.getData(), seriesModel, api); + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbol = itemModel.getShallow('symbol'); + var symbolSize = itemModel.getShallow('symbolSize'); + var symbolRotate = itemModel.getShallow('symbolRotate'); + var symbolOffset = itemModel.getShallow('symbolOffset'); + var symbolKeepAspect = itemModel.getShallow('symbolKeepAspect'); // TODO: refactor needed: single data item should not support callback function + + if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) { + var rawIdx = mpModel.getRawValue(idx); + var dataParams = mpModel.getDataParams(idx); + + if (isFunction(symbol)) { + symbol = symbol(rawIdx, dataParams); + } + + if (isFunction(symbolSize)) { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize(rawIdx, dataParams); + } + + if (isFunction(symbolRotate)) { + symbolRotate = symbolRotate(rawIdx, dataParams); + } + + if (isFunction(symbolOffset)) { + symbolOffset = symbolOffset(rawIdx, dataParams); + } + } + + var style = itemModel.getModel('itemStyle').getItemStyle(); + var color = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color; + } + + mpData.setItemVisual(idx, { + symbol: symbol, + symbolSize: symbolSize, + symbolRotate: symbolRotate, + symbolOffset: symbolOffset, + symbolKeepAspect: symbolKeepAspect, + style: style + }); + }); // TODO Text are wrong + + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); // Set host model for tooltip + // FIXME + + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + getECData(child).dataModel = mpModel; + }); + }); + this.markKeep(symbolDraw); + symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent'); + }; + + MarkPointView.type = 'markPoint'; + return MarkPointView; + }(MarkerView); + + function createData(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new SeriesData(coordDimsInfos, mpModel); + var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel)); + + if (coordSys) { + dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + mpData.initData(dataOpt, null, dimValueGetter); + return mpData; + } + + function install$E(registers) { + registers.registerComponentModel(MarkPointModel); + registers.registerComponentView(MarkPointView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markPoint')) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + } + }); + } + + var MarkLineModel = + /** @class */ + function (_super) { + __extends(MarkLineModel, _super); + + function MarkLineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineModel.type; + return _this; + } + + MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkLineModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkLineModel.type = 'markLine'; + MarkLineModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: ['circle', 'arrow'], + symbolSize: [8, 16], + // symbolRotate: 0, + symbolOffset: 0, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'end', + distance: 5 + }, + lineStyle: { + type: 'dashed' + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + width: 3 + } + }, + animationEasing: 'linear' + }; + return MarkLineModel; + }(MarkerModel); + + var inner$i = makeInner(); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + var itemArray; + + if (!isArray(item)) { + // Special type markLine like 'min', 'max', 'average', 'median' + var mlType = item.type; + + if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' // In case + // data: [{ + // yAxis: 10 + // }] + || item.xAxis != null || item.yAxis != null) { + var valueAxis = void 0; + var value = void 0; + + if (item.yAxis != null || item.xAxis != null) { + valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x'); + value = retrieve(item.yAxis, item.xAxis); + } else { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + valueAxis = axisInfo.valueAxis; + var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); + value = numCalculate(data, valueDataDim, mlType); + } + + var valueIndex = valueAxis.dim === 'x' ? 0 : 1; + var baseIndex = 1 - valueIndex; // Normized to 2d data with start and end point + + var mlFrom = clone(item); + var mlTo = { + coord: [] + }; + mlFrom.type = null; + mlFrom.coord = []; + mlFrom.coord[baseIndex] = -Infinity; + mlTo.coord[baseIndex] = Infinity; + var precision = mlModel.get('precision'); + + if (precision >= 0 && isNumber(value)) { + value = +value.toFixed(Math.min(precision, 20)); + } + + mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; + itemArray = [mlFrom, mlTo, { + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } else { + // Invalid data + if ("development" !== 'production') { + logError('Invalid markLine data.'); + } + + itemArray = []; + } + } else { + itemArray = item; + } + + var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; // Avoid line data type is extended by from(to) data type + + normalizedItem[2].type = normalizedItem[2].type || null; // Merge from option and to option into line option + + merge(normalizedItem[2], normalizedItem[0]); + merge(normalizedItem[2], normalizedItem[1]); + return normalizedItem; + }; + + function isInfinity(val) { + return !isNaN(val) && !isFinite(val); + } // If a markLine has one dim + + + function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + var dimName = coordSys.dimensions[dimIndex]; + return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); + } + + function markLineFilter(coordSys, item) { + if (coordSys.type === 'cartesian2d') { + var fromCoord = item[0].coord; + var toCoord = item[1].coord; // In case + // { + // markLine: { + // data: [{ yAxis: 2 }] + // } + // } + + if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { + return true; + } + } + + return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPosition + point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx)); + } else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Expand line to the edge of grid if value on one axis is Inifnity + // In case + // markLine: { + // data: [{ + // yAxis: 2 + // // or + // type: 'average' + // }] + // } + + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var dims = coordSys.dimensions; + + if (isInfinity(data.get(dims[0], idx))) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); + } else if (isInfinity(data.get(dims[1], idx))) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + data.setItemLayout(idx, point); + } + + var MarkLineView = + /** @class */ + function (_super) { + __extends(MarkLineView, _super); + + function MarkLineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineView.type; + return _this; + } + + MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine'); + + if (mlModel) { + var mlData_1 = mlModel.getData(); + var fromData_1 = inner$i(mlModel).from; + var toData_1 = inner$i(mlModel).to; // Update visual and layout of from symbol and to symbol + + fromData_1.each(function (idx) { + updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); + updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); + }); // Update layout of line + + mlData_1.each(function (idx) { + mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); + }); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var lineDrawMap = this.markerGroupMap; + var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); + this.group.add(lineDraw.group); + var mlData = createList$1(coordSys, seriesModel, mlModel); + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + inner$i(mlModel).from = fromData; + inner$i(mlModel).to = toData; // Line data for tooltip and formatter + + mlModel.setData(lineData); // TODO + // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now. + // But the related logic and type definition are not finished yet. + // Finish it if required + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + var symbolRotate = mlModel.get('symbolRotate'); + var symbolOffset = mlModel.get('symbolOffset'); // TODO: support callback function like markPoint + + if (!isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + + if (!isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + + if (!isArray(symbolRotate)) { + symbolRotate = [symbolRotate, symbolRotate]; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } // Update visual and layout of from symbol and to symbol + + + mlData.from.each(function (idx) { + updateDataVisualAndLayout(fromData, idx, true); + updateDataVisualAndLayout(toData, idx, false); + }); // Update visual and layout of line + + lineData.each(function (idx) { + var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle(); // lineData.setItemVisual(idx, { + // color: lineColor || fromData.getItemVisual(idx, 'color') + // }); + + lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); + + if (lineStyle.stroke == null) { + lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill; + } + + lineData.setItemVisual(idx, { + fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'), + fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'), + fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'), + fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'), + fromSymbol: fromData.getItemVisual(idx, 'symbol'), + toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'), + toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'), + toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'), + toSymbolSize: toData.getItemVisual(idx, 'symbolSize'), + toSymbol: toData.getItemVisual(idx, 'symbol'), + style: lineStyle + }); + }); + lineDraw.updateData(lineData); // Set host model for tooltip + // FIXME + + mlData.line.eachItemGraphicEl(function (el) { + getECData(el).dataModel = mlModel; + el.traverse(function (child) { + getECData(child).dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom) { + var itemModel = data.getItemModel(idx); + updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (style.fill == null) { + style.fill = getVisualFromData(seriesData, 'color'); + } + + data.setItemVisual(idx, { + symbolKeepAspect: itemModel.get('symbolKeepAspect'), + // `0` should be considered as a valid value, so use `retrieve2` instead of `||` + symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]), + symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]), + // TODO: when 2d array is supported, it should ignore parent + symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]), + symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]), + style: style + }); + } + + this.markKeep(lineDraw); + lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); + }; + + MarkLineView.type = 'markLine'; + return MarkLineView; + }(MarkerView); + + function createList$1(coordSys, seriesModel, mlModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new SeriesData(coordDimsInfos, mlModel); + var toData = new SeriesData(coordDimsInfos, mlModel); // No dimensions + + var lineData = new SeriesData([], mlModel); + var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel)); + + if (coordSys) { + optData = filter(optData, curry(markLineFilter, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + fromData.initData(map(optData, function (item) { + return item[0]; + }), null, dimValueGetter); + toData.initData(map(optData, function (item) { + return item[1]; + }), null, dimValueGetter); + lineData.initData(map(optData, function (item) { + return item[2]; + })); + lineData.hasItemOption = true; + return { + from: fromData, + to: toData, + line: lineData + }; + } + + function install$F(registers) { + registers.registerComponentModel(MarkLineModel); + registers.registerComponentView(MarkLineView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markLine')) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + } + }); + } + + var MarkAreaModel = + /** @class */ + function (_super) { + __extends(MarkAreaModel, _super); + + function MarkAreaModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaModel.type; + return _this; + } + + MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkAreaModel.type = 'markArea'; + MarkAreaModel.defaultOption = { + // zlevel: 0, + // PENDING + z: 1, + tooltip: { + trigger: 'item' + }, + // markArea should fixed on the coordinate system + animation: false, + label: { + show: true, + position: 'top' + }, + itemStyle: { + // color and borderColor default to use color from series + // color: 'auto' + // borderColor: 'auto' + borderWidth: 0 + }, + emphasis: { + label: { + show: true, + position: 'top' + } + } + }; + return MarkAreaModel; + }(MarkerModel); + + var inner$j = makeInner(); + + var markAreaTransform = function (seriesModel, coordSys, maModel, item) { + // item may be null + var item0 = item[0]; + var item1 = item[1]; + + if (!item0 || !item1) { + return; + } + + var lt = dataTransform(seriesModel, item0); + var rb = dataTransform(seriesModel, item1); // FIXME make sure lt is less than rb + + var ltCoord = lt.coord; + var rbCoord = rb.coord; + ltCoord[0] = retrieve(ltCoord[0], -Infinity); + ltCoord[1] = retrieve(ltCoord[1], -Infinity); + rbCoord[0] = retrieve(rbCoord[0], Infinity); + rbCoord[1] = retrieve(rbCoord[1], Infinity); // Merge option into one + + var result = mergeAll([{}, lt, rb]); + result.coord = [lt.coord, rb.coord]; + result.x0 = lt.x; + result.y0 = lt.y; + result.x1 = rb.x; + result.y1 = rb.y; + return result; + }; + + function isInfinity$1(val) { + return !isNaN(val) && !isFinite(val); + } // If a markArea has one dim + + + function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + return isInfinity$1(fromCoord[otherDimIndex]) && isInfinity$1(toCoord[otherDimIndex]); + } + + function markAreaFilter(coordSys, item) { + var fromCoord = item.coord[0]; + var toCoord = item.coord[1]; + var item0 = { + coord: fromCoord, + x: item.x0, + y: item.y0 + }; + var item1 = { + coord: toCoord, + x: item.x1, + y: item.y1 + }; + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // In case + // { + // markArea: { + // data: [{ yAxis: 2 }] + // } + // } + if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) { + return true; + } // Directly returning true may also do the work, + // because markArea will not be shown automatically + // when it's not included in coordinate system. + // But filtering ahead can avoid keeping rendering markArea + // when there are too many of them. + + + return zoneFilter(coordSys, item0, item1); + } + + return dataFilter$1(coordSys, item0) || dataFilter$1(coordSys, item1); + } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] + + + function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth()); + var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Consider the case that user input the right-bottom point first + // Pick the larger x and y as 'x1' and 'y1' + var pointValue0 = data.getValues(['x0', 'y0'], idx); + var pointValue1 = data.getValues(['x1', 'y1'], idx); + var clampPointValue0 = coordSys.clampData(pointValue0); + var clampPointValue1 = coordSys.clampData(pointValue1); + var pointValue = []; + + if (dims[0] === 'x0') { + pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0]; + } else { + pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0]; + } + + if (dims[1] === 'y0') { + pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1]; + } else { + pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1]; + } // Use the getMarkerPosition + + + point = seriesModel.getMarkerPosition(pointValue, dims, true); + } else { + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + var pt = [x, y]; + coordSys.clampData && coordSys.clampData(pt, pt); + point = coordSys.dataToPoint(pt, true); + } + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + + if (isInfinity$1(x)) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); + } else if (isInfinity$1(y)) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + return point; + } + + var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; + + var MarkAreaView = + /** @class */ + function (_super) { + __extends(MarkAreaView, _super); + + function MarkAreaView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaView.type; + return _this; + } + + MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); + + if (maModel) { + var areaData_1 = maModel.getData(); + areaData_1.each(function (idx) { + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); + }); // Layout + + areaData_1.setItemLayout(idx, points); + var el = areaData_1.getItemGraphicEl(idx); + el.setShape('points', points); + }); + } + }, this); + }; + + MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var areaGroupMap = this.markerGroupMap; + var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { + group: new Group() + }); + this.group.add(polygonGroup.group); + this.markKeep(polygonGroup); + var areaData = createList$2(coordSys, seriesModel, maModel); // Line data for tooltip and formatter + + maModel.setData(areaData); // Update visual and layout of line + + areaData.each(function (idx) { + // Layout + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + }); + var xAxisScale = coordSys.getAxis('x').scale; + var yAxisScale = coordSys.getAxis('y').scale; + var xAxisExtent = xAxisScale.getExtent(); + var yAxisExtent = yAxisScale.getExtent(); + var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))]; + var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))]; + asc(xPointExtent); + asc(yPointExtent); + var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); // If none of the area is inside coordSys, allClipped is set to be true + // in layout so that label will not be displayed. See #12591 + + var allClipped = !overlapped; + areaData.setItemLayout(idx, { + points: points, + allClipped: allClipped + }); + var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); + var color$1 = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color$1; + + if (isString(style.fill)) { + style.fill = modifyAlpha(style.fill, 0.4); + } + } + + if (!style.stroke) { + style.stroke = color$1; + } // Visual + + + areaData.setItemVisual(idx, 'style', style); + }); + areaData.diff(inner$j(polygonGroup).data).add(function (idx) { + var layout = areaData.getItemLayout(idx); + + if (!layout.allClipped) { + var polygon = new Polygon({ + shape: { + points: layout.points + } + }); + areaData.setItemGraphicEl(idx, polygon); + polygonGroup.group.add(polygon); + } + }).update(function (newIdx, oldIdx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(oldIdx); + var layout = areaData.getItemLayout(newIdx); + + if (!layout.allClipped) { + if (polygon) { + updateProps(polygon, { + shape: { + points: layout.points + } + }, maModel, newIdx); + } else { + polygon = new Polygon({ + shape: { + points: layout.points + } + }); + } + + areaData.setItemGraphicEl(newIdx, polygon); + polygonGroup.group.add(polygon); + } else if (polygon) { + polygonGroup.group.remove(polygon); + } + }).remove(function (idx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(idx); + polygonGroup.group.remove(polygon); + }).execute(); + areaData.eachItemGraphicEl(function (polygon, idx) { + var itemModel = areaData.getItemModel(idx); + var style = areaData.getItemVisual(idx, 'style'); + polygon.useStyle(areaData.getItemVisual(idx, 'style')); + setLabelStyle(polygon, getLabelStatesModels(itemModel), { + labelFetcher: maModel, + labelDataIndex: idx, + defaultText: areaData.getName(idx) || '', + inheritColor: isString(style.fill) ? modifyAlpha(style.fill, 1) : '#000' + }); + setStatesStylesFromModel(polygon, itemModel); + toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled'])); + getECData(polygon).dataModel = maModel; + }); + inner$j(polygonGroup).data = areaData; + polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); + }; + + MarkAreaView.type = 'markArea'; + return MarkAreaView; + }(MarkerView); + + function createList$2(coordSys, seriesModel, maModel) { + var areaData; + var dataDims; + var dims = ['x0', 'y0', 'x1', 'y1']; + + if (coordSys) { + var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) { + var data = seriesModel.getData(); + var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + dataDims = map(dims, function (dim, idx) { + return { + name: dim, + type: coordDimsInfos_1[idx % 2].type + }; + }); + areaData = new SeriesData(dataDims, maModel); + } else { + dataDims = [{ + name: 'value', + type: 'float' + }]; + areaData = new SeriesData(dataDims, maModel); + } + + var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); + + if (coordSys) { + optData = filter(optData, curry(markAreaFilter, coordSys)); + } + + var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { + // TODO should convert to ParsedValue? + var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; + return parseDataValue(rawVal, dataDims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dataDims[dimIndex]); + }; + areaData.initData(optData, null, dimValueGetter); + areaData.hasItemOption = true; + return areaData; + } + + function install$G(registers) { + registers.registerComponentModel(MarkAreaModel); + registers.registerComponentView(MarkAreaView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markArea')) { + // Make sure markArea component is enabled + opt.markArea = opt.markArea || {}; + } + }); + } + + var getDefaultSelectorOptions = function (ecModel, type) { + if (type === 'all') { + return { + type: 'all', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'all']) + }; + } else if (type === 'inverse') { + return { + type: 'inverse', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse']) + }; + } + }; + + var LegendModel = + /** @class */ + function (_super) { + __extends(LegendModel, _super); + + function LegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendModel.type; + _this.layoutMode = { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas real width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }; + return _this; + } + + LegendModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + option.selected = option.selected || {}; + + this._updateSelector(option); + }; + + LegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + this._updateSelector(option); + }; + + LegendModel.prototype._updateSelector = function (option) { + var selector = option.selector; + var ecModel = this.ecModel; + + if (selector === true) { + selector = option.selector = ['all', 'inverse']; + } + + if (isArray(selector)) { + each(selector, function (item, index) { + isString(item) && (item = { + type: item + }); + selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); + }); + } + }; + + LegendModel.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + + var legendData = this._data; // If selectedMode is single, try to select one + + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; // If has any selected in option.selected + + for (var i = 0; i < legendData.length; i++) { + var name_1 = legendData[i].get('name'); + + if (this.isSelected(name_1)) { + // Force to unselect others + this.select(name_1); + hasSelected = true; + break; + } + } // Try select the first if selectedMode is single + + + !hasSelected && this.select(legendData[0].get('name')); + } + }; + + LegendModel.prototype._updateData = function (ecModel) { + var potentialData = []; + var availableNames = []; + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + var names = provider.getAllNames(); + + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + + if (names.length) { + potentialData = potentialData.concat(names); + } else { + isPotential = true; + } + } else { + isPotential = true; + } + + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + /** + * @type {Array.} + * @private + */ + + this._availableNames = availableNames; // If legend.data is not specified in option, use availableNames as data, + // which is convenient for user preparing option. + + var rawData = this.get('data') || potentialData; + var legendNameMap = createHashMap(); + var legendData = map(rawData, function (dataItem) { + // Can be string or number + if (isString(dataItem) || isNumber(dataItem)) { + dataItem = { + name: dataItem + }; + } + + if (legendNameMap.get(dataItem.name)) { + // remove legend name duplicate + return null; + } + + legendNameMap.set(dataItem.name, true); + return new Model(dataItem, this, this.ecModel); + }, this); + /** + * @type {Array.} + * @private + */ + + this._data = filter(legendData, function (item) { + return !!item; + }); + }; + + LegendModel.prototype.getData = function () { + return this._data; + }; + + LegendModel.prototype.select = function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + + if (selectedMode === 'single') { + var data = this._data; + each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + + selected[name] = true; + }; + + LegendModel.prototype.unSelect = function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }; + + LegendModel.prototype.toggleSelected = function (name) { + var selected = this.option.selected; // Default is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + this[selected[name] ? 'unSelect' : 'select'](name); + }; + + LegendModel.prototype.allSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + selected[dataItem.get('name', true)] = true; + }); + }; + + LegendModel.prototype.inverseSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + var name = dataItem.get('name', true); // Initially, default value is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + selected[name] = !selected[name]; + }); + }; + + LegendModel.prototype.isSelected = function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; + }; + + LegendModel.prototype.getOrient = function () { + return this.get('orient') === 'vertical' ? { + index: 1, + name: 'vertical' + } : { + index: 0, + name: 'horizontal' + }; + }; + + LegendModel.type = 'legend.plain'; + LegendModel.dependencies = ['series']; + LegendModel.defaultOption = { + // zlevel: 0, + z: 4, + show: true, + orient: 'horizontal', + left: 'center', + // right: 'center', + top: 0, + // bottom: null, + align: 'auto', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + symbolRotate: 'inherit', + symbolKeepAspect: true, + inactiveColor: '#ccc', + inactiveBorderColor: '#ccc', + inactiveBorderWidth: 'auto', + itemStyle: { + color: 'inherit', + opacity: 'inherit', + borderColor: 'inherit', + borderWidth: 'auto', + borderCap: 'inherit', + borderJoin: 'inherit', + borderDashOffset: 'inherit', + borderMiterLimit: 'inherit' + }, + lineStyle: { + width: 'auto', + color: 'inherit', + inactiveColor: '#ccc', + inactiveWidth: 2, + opacity: 'inherit', + type: 'inherit', + cap: 'inherit', + join: 'inherit', + dashOffset: 'inherit', + miterLimit: 'inherit' + }, + textStyle: { + color: '#333' + }, + selectedMode: true, + selector: false, + selectorLabel: { + show: true, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: 'sans-serif', + color: '#666', + borderWidth: 1, + borderColor: '#666' + }, + emphasis: { + selectorLabel: { + show: true, + color: '#eee', + backgroundColor: '#666' + } + }, + selectorPosition: 'auto', + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: { + show: false + } + }; + return LegendModel; + }(ComponentModel); + + var curry$1 = curry; + var each$c = each; + var Group$2 = Group; + + var LegendView = + /** @class */ + function (_super) { + __extends(LegendView, _super); + + function LegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendView.type; + _this.newlineDisabled = false; + return _this; + } + + LegendView.prototype.init = function () { + this.group.add(this._contentGroup = new Group$2()); + this.group.add(this._selectorGroup = new Group$2()); + this._isFirstRender = true; + }; + /** + * @protected + */ + + + LegendView.prototype.getContentGroup = function () { + return this._contentGroup; + }; + /** + * @protected + */ + + + LegendView.prototype.getSelectorGroup = function () { + return this._selectorGroup; + }; + /** + * @override + */ + + + LegendView.prototype.render = function (legendModel, ecModel, api) { + var isFirstRender = this._isFirstRender; + this._isFirstRender = false; + this.resetInner(); + + if (!legendModel.get('show', true)) { + return; + } + + var itemAlign = legendModel.get('align'); + var orient = legendModel.get('orient'); + + if (!itemAlign || itemAlign === 'auto') { + itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left'; + } // selector has been normalized to an array in model + + + var selector = legendModel.get('selector', true); + var selectorPosition = legendModel.get('selectorPosition', true); + + if (selector && (!selectorPosition || selectorPosition === 'auto')) { + selectorPosition = orient === 'horizontal' ? 'end' : 'start'; + } + + this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); // Perform layout. + + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var padding = legendModel.get('padding'); + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); // Place mainGroup, based on the calculated `mainRect`. + + var layoutRect = getLayoutRect(defaults({ + width: mainRect.width, + height: mainRect.height + }, positionInfo), viewportSize, padding); + this.group.x = layoutRect.x - mainRect.x; + this.group.y = layoutRect.y - mainRect.y; + this.group.markRedraw(); // Render background after group is layout. + + this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); + }; + + LegendView.prototype.resetInner = function () { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + this.getSelectorGroup().removeAll(); + }; + + LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get('selectedMode'); + var excludeSeriesId = []; + ecModel.eachRawSeries(function (seriesModel) { + !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); + }); + each$c(legendModel.getData(), function (legendItemModel, dataIndex) { + var name = legendItemModel.get('name'); // Use empty string or \n as a newline string + + if (!this.newlineDisabled && (name === '' || name === '\n')) { + var g = new Group$2(); // @ts-ignore + + g.newline = true; + contentGroup.add(g); + return; + } // Representitive series. + + + var seriesModel = ecModel.getSeriesByName(name)[0]; + + if (legendDrawnMap.get(name)) { + // Have been drawn + return; + } // Legend to control series. + + + if (seriesModel) { + var data = seriesModel.getData(); + var lineVisualStyle = data.getVisual('legendLineStyle') || {}; + var legendIcon = data.getVisual('legendIcon'); + /** + * `data.getVisual('style')` may be the color from the register + * in series. For example, for line series, + */ + + var style = data.getVisual('style'); + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api); + + itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } else { + // Legend to control data. In pie and funnel. + ecModel.eachRawSeries(function (seriesModel) { + // In case multiple series has same data name + if (legendDrawnMap.get(name)) { + return; + } + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + + if (!provider.containName(name)) { + return; + } + + var idx = provider.indexOfName(name); + var style = provider.getItemVisual(idx, 'style'); + var legendIcon = provider.getItemVisual(idx, 'legendIcon'); + var colorArr = parse(style.fill); // Color may be set to transparent in visualMap when data is out of range. + // Do not show nothing. + + if (colorArr && colorArr[3] === 0) { + colorArr[3] = 0.2; // TODO color is set to 0, 0, 0, 0. Should show correct RGBA + + style = extend(extend({}, style), { + fill: stringify(colorArr, 'rgba') + }); + } + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api); // FIXME: consider different series has items with the same name. + + + itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId)) // Should not specify the series name, consider legend controls + // more than one pie series. + .on('mouseover', curry$1(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, null, name, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } + }, this); + } + + if ("development" !== 'production') { + if (!legendDrawnMap.get(name)) { + console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); + } + } + }, this); + + if (selector) { + this._createSelector(selector, legendModel, api, orient, selectorPosition); + } + }; + + LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + each$c(selector, function createSelectorButton(selectorItem) { + var type = selectorItem.type; + var labelText = new ZRText({ + style: { + x: 0, + y: 0, + align: 'center', + verticalAlign: 'middle' + }, + onclick: function () { + api.dispatchAction({ + type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect' + }); + } + }); + selectorGroup.add(labelText); + var labelModel = legendModel.getModel('selectorLabel'); + var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']); + setLabelStyle(labelText, { + normal: labelModel, + emphasis: emphasisLabelModel + }, { + defaultText: selectorItem.title + }); + enableHoverEmphasis(labelText); + }); + }; + + LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) { + var drawType = seriesModel.visualDrawType; + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + var isSelected = legendModel.isSelected(name); + var iconRotate = legendItemModel.get('symbolRotate'); + var symbolKeepAspect = legendItemModel.get('symbolKeepAspect'); + var legendIconType = legendItemModel.get('icon'); + legendIcon = legendIconType || legendIcon || 'roundRect'; + var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api); + var itemGroup = new Group$2(); + var textStyleModel = legendItemModel.getModel('textStyle'); + + if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) { + // Series has specific way to define legend icon + itemGroup.add(seriesModel.getLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: iconRotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } else { + // Use default legend icon policy for most series + var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon + + itemGroup.add(getDefaultLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: rotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } + + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + var formatter = legendModel.get('formatter'); + var content = name; + + if (isString(formatter) && formatter) { + content = formatter.replace('{name}', name != null ? name : ''); + } else if (isFunction(formatter)) { + content = formatter(name); + } + + var inactiveColor = legendItemModel.get('inactiveColor'); + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : inactiveColor, + align: textAlign, + verticalAlign: 'middle' + }) + })); // Add a invisible rect to increase the area of mouse hover + + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + }); + var tooltipModel = legendItemModel.getModel('tooltip'); + + if (tooltipModel.get('show')) { + setTooltipConfig({ + el: hitRect, + componentModel: legendModel, + itemName: name, + itemTooltipOption: tooltipModel.option + }); + } + + itemGroup.add(hitRect); + itemGroup.eachChild(function (child) { + child.silent = true; + }); + hitRect.silent = !selectMode; + this.getContentGroup().add(itemGroup); + enableHoverEmphasis(itemGroup); // @ts-ignore + + itemGroup.__legendDataIndex = dataIndex; + return itemGroup; + }; + + LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var contentGroup = this.getContentGroup(); + var selectorGroup = this.getSelectorGroup(); // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height); + var contentRect = contentGroup.getBoundingRect(); + var contentPos = [-contentRect.x, -contentRect.y]; + selectorGroup.markRedraw(); + contentGroup.markRedraw(); + + if (selector) { + // Place buttons in selectorGroup + box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var orientIdx = legendModel.getOrient().index; + var wh = orientIdx === 0 ? 'width' : 'height'; + var hw = orientIdx === 0 ? 'height' : 'width'; + var yx = orientIdx === 0 ? 'y' : 'x'; + + if (selectorPosition === 'end') { + selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; + } else { + contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; + } // Always align selector to content as 'middle' + + + selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + var mainRect = { + x: 0, + y: 0 + }; + mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); + return mainRect; + } else { + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + return this.group.getBoundingRect(); + } + }; + /** + * @protected + */ + + + LegendView.prototype.remove = function () { + this.getContentGroup().removeAll(); + this._isFirstRender = true; + }; + + LegendView.type = 'legend.plain'; + return LegendView; + }(ComponentView); + + function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) { + /** + * Use series style if is inherit; + * elsewise, use legend style + */ + function handleCommonProps(style, visualStyle) { + // If lineStyle.width is 'auto', it is set to be 2 if series has border + if (style.lineWidth === 'auto') { + style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; + } + + each$c(style, function (propVal, propName) { + style[propName] === 'inherit' && (style[propName] = visualStyle[propName]); + }); + } // itemStyle + + + var itemStyleModel = legendItemModel.getModel('itemStyle'); + var itemStyle = itemStyleModel.getItemStyle(); + var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke'; + var decalStyle = itemStyleModel.getShallow('decal'); + itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api); + + if (itemStyle.fill === 'inherit') { + /** + * Series with visualDrawType as 'stroke' should have + * series stroke as legend fill + */ + itemStyle.fill = itemVisualStyle[drawType]; + } + + if (itemStyle.stroke === 'inherit') { + /** + * icon type with "emptyXXX" should use fill color + * in visual style + */ + itemStyle.stroke = itemVisualStyle[iconBrushType]; + } + + if (itemStyle.opacity === 'inherit') { + /** + * Use lineStyle.opacity if drawType is stroke + */ + itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity; + } + + handleCommonProps(itemStyle, itemVisualStyle); // lineStyle + + var legendLineModel = legendItemModel.getModel('lineStyle'); + var lineStyle = legendLineModel.getLineStyle(); + handleCommonProps(lineStyle, lineVisualStyle); // Fix auto color to real color + + itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill); + itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill); + lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill); + + if (!isSelected) { + var borderWidth = legendItemModel.get('inactiveBorderWidth'); + /** + * Since stroke is set to be inactiveBorderColor, it may occur that + * there is no border in series but border in legend, so we need to + * use border only when series has border if is set to be auto + */ + + var visualHasBorder = itemStyle[iconBrushType]; + itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; + itemStyle.fill = legendItemModel.get('inactiveColor'); + itemStyle.stroke = legendItemModel.get('inactiveBorderColor'); + lineStyle.stroke = legendLineModel.get('inactiveColor'); + lineStyle.lineWidth = legendLineModel.get('inactiveWidth'); + } + + return { + itemStyle: itemStyle, + lineStyle: lineStyle + }; + } + + function getDefaultLegendIcon(opt) { + var symboType = opt.icon || 'roundRect'; + var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); + icon.setStyle(opt.itemStyle); + icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; + icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symboType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + } + + function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { + // downplay before unselect + dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); + api.dispatchAction({ + type: 'legendToggleSelect', + name: seriesName != null ? seriesName : dataName + }); // highlight after select + // TODO highlight immediately may cause animation loss. + + dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); + } + + function isUseHoverLayer(api) { + var list = api.getZr().storage.getDisplayList(); + var emphasisState; + var i = 0; + var len = list.length; + + while (i < len && !(emphasisState = list[i].states.emphasis)) { + i++; + } + + return emphasisState && emphasisState.hoverLayer; + } + + function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'highlight', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'downplay', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function legendFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + + return true; + }); + } + } + + function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; // Update all legend components + + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } else if (methodName === 'allSelect' || methodName === 'inverseSelect') { + legendModel[methodName](); + } else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + + var legendData = legendModel.getData(); + each(legendData, function (model) { + var name = model.get('name'); // Wrap element + + if (name === '\n' || name === '') { + return; + } + + var isItemSelected = legendModel.isSelected(name); + + if (selectedMap.hasOwnProperty(name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } else { + selectedMap[name] = isItemSelected; + } + }); + }); // Return the event explicitly + + return methodName === 'allSelect' || methodName === 'inverseSelect' ? { + selected: selectedMap + } : { + name: payload.name, + selected: selectedMap + }; + } + + function installLegendAction(registers) { + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected')); + registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect')); + registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect')); + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select')); + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect')); + } + + function install$H(registers) { + registers.registerComponentModel(LegendModel); + registers.registerComponentView(LegendView); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); + registers.registerSubTypeDefaulter('legend', function () { + return 'plain'; + }); + installLegendAction(registers); + } + + var ScrollableLegendModel = + /** @class */ + function (_super) { + __extends(ScrollableLegendModel, _super); + + function ScrollableLegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendModel.type; + return _this; + } + /** + * @param {number} scrollDataIndex + */ + + + ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }; + + ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.call(this, option, parentModel, ecModel); + + mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams); + }; + /** + * @override + */ + + + ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + mergeAndNormalizeLayoutParams$1(this, this.option, option); + }; + + ScrollableLegendModel.type = 'legend.scroll'; + ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', + pageFormatter: '{current}/{total}', + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, + pageTextStyle: { + color: '#333' + }, + animationDurationUpdate: 800 + }); + return ScrollableLegendModel; + }(LegendModel); + + function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: !!ignoreSize + }); + } + + var Group$3 = Group; + var WH$1 = ['width', 'height']; + var XY$1 = ['x', 'y']; + + var ScrollableLegendView = + /** @class */ + function (_super) { + __extends(ScrollableLegendView, _super); + + function ScrollableLegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendView.type; + _this.newlineDisabled = true; + _this._currentIndex = 0; + return _this; + } + + ScrollableLegendView.prototype.init = function () { + _super.prototype.init.call(this); + + this.group.add(this._containerGroup = new Group$3()); + + this._containerGroup.add(this.getContentGroup()); + + this.group.add(this._controllerGroup = new Group$3()); + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.resetInner = function () { + _super.prototype.resetInner.call(this); + + this._controllerGroup.removeAll(); + + this._containerGroup.removeClipPath(); + + this._containerGroup.__rectSize = null; + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var self = this; // Render content items. + + _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + + var controllerGroup = this._controllerGroup; // FIXME: support be 'auto' adapt to size number text length, + // e.g., '3/12345' should not overlap with the control arrow button. + + var pageIconSize = legendModel.get('pageIconSize', true); + var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; + createPageButton('pagePrev', 0); + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new ZRText({ + name: 'pageText', + style: { + // Placeholder to calculate a proper layout. + text: 'xx/xx', + fill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + verticalAlign: 'middle', + align: 'center' + }, + silent: true + })); + createPageButton('pageNext', 1); + + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind(self._pageGo, self, pageDataIndexName, legendModel, api) + }, { + x: -pageIconSizeArr[0] / 2, + y: -pageIconSizeArr[1] / 2, + width: pageIconSizeArr[0], + height: pageIconSizeArr[1] + }); + icon.name = name; + controllerGroup.add(icon); + } + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var yx = XY$1[1 - orientIdx]; + selector && box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var processMaxSize = clone(maxSize); + selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); + + var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); + + if (selector) { + if (selectorPosition === 'end') { + selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; + } else { + var offset = selectorRect[wh] + selectorButtonGap; + selectorPos[orientIdx] -= offset; + mainRect[xy] -= offset; + } + + mainRect[wh] += selectorRect[wh] + selectorButtonGap; + selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; + mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + selectorGroup.markRedraw(); + } + + return mainRect; + }; + + ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); + box( // Buttons in controller are layout always horizontally. + 'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true)); + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; // In case that the inner elements of contentGroup layout do not based on [0, 0] + + var contentPos = [-contentRect.x, -contentRect.y]; // Remain contentPos when scroll animation perfroming. + // If first rendering, `contentGroup.position` is [0, 0], which + // does not make sense and may cause unexepcted animation if adopted. + + if (!isFirstRender) { + contentPos[orientIdx] = contentGroup[xy]; + } // Layout container group based on 0. + + + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); // Place containerGroup and controllerGroup and contentGroup. + + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); // controller is on the right / bottom. + + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } // Always align controller to content as 'middle'. + + + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + contentGroup.setPosition(contentPos); + containerGroup.setPosition(containerPos); + controllerGroup.setPosition(controllerPos); // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + + var mainRect = { + x: 0, + y: 0 + }; // Consider content may be overflow (should be clipped). + + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + containerGroup.__rectSize = maxSize[wh]; + + if (showController) { + var clipShape = { + x: 0, + y: 0 + }; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({ + shape: clipShape + })); // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + + containerGroup.__rectSize = clipShape[wh]; + } else { + // Do not remove or ignore controller. Keep them set as placeholders. + controllerGroup.eachChild(function (child) { + child.attr({ + invisible: true, + silent: true + }); + }); + } // Content translate animation. + + + var pageInfo = this._getPageInfo(legendModel); + + pageInfo.pageIndex != null && updateProps(contentGroup, { + x: pageInfo.contentPosition[0], + y: pageInfo.contentPosition[1] + }, // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird effect. + showController ? legendModel : null); + + this._updatePageInfoView(legendModel, pageInfo); + + return mainRect; + }; + + ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }; + + ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + each(['pagePrev', 'pageNext'], function (name) { + var key = name + 'DataIndex'; + var canJump = pageInfo[key] != null; + var icon = controllerGroup.childOfName(name); + + if (icon) { + icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true)); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({ + current: current, + total: total + })); + }; + /** + * contentPosition: Array., null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no previous page. + * pageNextDataIndex: number, null when no next page. + * } + */ + + + ScrollableLegendView.prototype._getPageInfo = function (legendModel) { + var scrollDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var containerRectSize = this._containerGroup.__rectSize; + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + + var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); + + var children = contentGroup.children(); + var targetItem = children[targetItemIndex]; + var itemCount = children.length; + var pCount = !itemCount ? 0 : 1; + var result = { + contentPosition: [contentGroup.x, contentGroup.y], + pageCount: pCount, + pageIndex: pCount - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + + if (!targetItem) { + return result; + } + + var targetItemInfo = getItemInfo(targetItem); + result.contentPosition[orientIdx] = -targetItemInfo.s; // Strategy: + // (1) Always align based on the left/top most item. + // (2) It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + // Otherwise if half of the last item is cut by the window, + // it will have no chance to display entirely. + // (3) Consider that item size probably be different, we + // have calculate pageIndex by size rather than item index, + // and we can not get page index directly by division. + // (4) The window is to narrow to contain more than + // one item, we should make sure that the page can be fliped. + + for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { + currItemInfo = getItemInfo(children[i]); + + if ( // Half of the last item is out of the window. + !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize || // If the current item does not intersect with the window, the new page + // can be started at the current item or the last item. + currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) { + if (winEndItemInfo.i > winStartItemInfo.i) { + winStartItemInfo = winEndItemInfo; + } else { + // e.g., when page size is smaller than item size. + winStartItemInfo = currItemInfo; + } + + if (winStartItemInfo) { + if (result.pageNextDataIndex == null) { + result.pageNextDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + } + } + + winEndItemInfo = currItemInfo; + } + + for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { + currItemInfo = getItemInfo(children[i]); + + if ( // If the the end item does not intersect with the window started + // from the current item, a page can be settled. + (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)) && // e.g., when page size is smaller than item size. + winStartItemInfo.i < winEndItemInfo.i) { + winEndItemInfo = winStartItemInfo; + + if (result.pagePrevDataIndex == null) { + result.pagePrevDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + ++result.pageIndex; + } + + winStartItemInfo = currItemInfo; + } + + return result; + + function getItemInfo(el) { + if (el) { + var itemRect = el.getBoundingRect(); + var start = itemRect[xy] + el[xy]; + return { + s: start, + e: start + itemRect[wh], + i: el.__legendDataIndex + }; + } + } + + function intersect(itemInfo, winStart) { + return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; + } + }; + + ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) { + if (!this._showController) { + return 0; + } + + var index; + var contentGroup = this.getContentGroup(); + var defaultIndex; + contentGroup.eachChild(function (child, idx) { + var legendDataIdx = child.__legendDataIndex; // FIXME + // If the given targetDataIndex (from model) is illegal, + // we use defaultIndex. But the index on the legend model and + // action payload is still illegal. That case will not be + // changed until some scenario requires. + + if (defaultIndex == null && legendDataIdx != null) { + defaultIndex = idx; + } + + if (legendDataIdx === targetDataIndex) { + index = idx; + } + }); + return index != null ? index : defaultIndex; + }; + + ScrollableLegendView.type = 'legend.scroll'; + return ScrollableLegendView; + }(LegendView); + + /* + * 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. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + function installScrollableLegendAction(registers) { + /** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ + registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + scrollDataIndex != null && ecModel.eachComponent({ + mainType: 'legend', + subType: 'scroll', + query: payload + }, function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + }); + }); + } + + function install$I(registers) { + use(install$H); + registers.registerComponentModel(ScrollableLegendModel); + registers.registerComponentView(ScrollableLegendView); + installScrollableLegendAction(registers); + } + + function install$J(registers) { + use(install$H); + use(install$I); + } + + var InsideZoomModel = + /** @class */ + function (_super) { + __extends(InsideZoomModel, _super); + + function InsideZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = InsideZoomModel.type; + return _this; + } + + InsideZoomModel.type = 'dataZoom.inside'; + InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + disabled: false, + zoomLock: false, + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + return InsideZoomModel; + }(DataZoomModel); + + var inner$k = makeInner(); + function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { + inner$k(api).coordSysRecordMap.each(function (coordSysRecord) { + var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); + + if (dzInfo) { + dzInfo.getRange = getRange; + } + }); + } + function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { + var coordSysRecordMap = inner$k(api).coordSysRecordMap; + var coordSysKeyArr = coordSysRecordMap.keys(); + + for (var i = 0; i < coordSysKeyArr.length; i++) { + var coordSysKey = coordSysKeyArr[i]; + var coordSysRecord = coordSysRecordMap.get(coordSysKey); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var dzUid = dataZoomModel.uid; + var dzInfo = dataZoomInfoMap.get(dzUid); + + if (dzInfo) { + dataZoomInfoMap.removeKey(dzUid); + + if (!dataZoomInfoMap.keys().length) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + } + } + } + } + } + + function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { + if (coordSysRecord) { + coordSysRecordMap.removeKey(coordSysRecord.model.uid); + var controller = coordSysRecord.controller; + controller && controller.dispose(); + } + } + + function createCoordSysRecord(api, coordSysModel) { + // These init props will never change after record created. + var coordSysRecord = { + model: coordSysModel, + containsPoint: curry(containsPoint, coordSysModel), + dispatchAction: curry(dispatchAction$1, api), + dataZoomInfoMap: null, + controller: null + }; // Must not do anything depends on coordSysRecord outside the event handler here, + // because coordSysRecord not completed yet. + + var controller = coordSysRecord.controller = new RoamController(api.getZr()); + each(['pan', 'zoom', 'scrollMove'], function (eventName) { + controller.on(eventName, function (event) { + var batch = []; + coordSysRecord.dataZoomInfoMap.each(function (dzInfo) { + // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove, + // moveOnMouseWheel, ...) enabled. + if (!event.isAvailableBehavior(dzInfo.model.option)) { + return; + } + + var method = (dzInfo.getRange || {})[eventName]; + var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); + !dzInfo.model.get('disabled', true) && range && batch.push({ + dataZoomId: dzInfo.model.id, + start: range[0], + end: range[1] + }); + }); + batch.length && coordSysRecord.dispatchAction(batch); + }); + }); + return coordSysRecord; + } + /** + * This action will be throttled. + */ + + + function dispatchAction$1(api, batch) { + if (!api.isDisposed()) { + api.dispatchAction({ + type: 'dataZoom', + animation: { + easing: 'cubicOut', + duration: 100 + }, + batch: batch + }); + } + } + + function containsPoint(coordSysModel, e, x, y) { + return coordSysModel.coordinateSystem.containPoint([x, y]); + } + /** + * Merge roamController settings when multiple dataZooms share one roamController. + */ + + + function mergeControllerParams(dataZoomInfoMap) { + var controlType; // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated + // as string, it is probably revert to reserved word by compress tool. See #7411. + + var prefix = 'type_'; + var typePriority = { + 'type_true': 2, + 'type_move': 1, + 'type_false': 0, + 'type_undefined': -1 + }; + var preventDefaultMouseMove = true; + dataZoomInfoMap.each(function (dataZoomInfo) { + var dataZoomModel = dataZoomInfo.model; + var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true; + + if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { + controlType = oneType; + } // Prevent default move event by default. If one false, do not prevent. Otherwise + // users may be confused why it does not work when multiple insideZooms exist. + + + preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true); + }); + return { + controlType: controlType, + opt: { + // RoamController will enable all of these functionalities, + // and the final behavior is determined by its event listener + // provided by each inside zoom. + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: true, + preventDefaultMouseMove: !!preventDefaultMouseMove + } + }; + } + + function installDataZoomRoamProcessor(registers) { + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) { + var apiInner = inner$k(api); + var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); + coordSysRecordMap.each(function (coordSysRecord) { + // `coordSysRecordMap` always exists (because it holds the `roam controller`, which should + // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. + coordSysRecord.dataZoomInfoMap = null; + }); + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'inside' + }, function (dataZoomModel) { + var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); + each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) { + var coordSysUid = dzCoordSysInfo.model.uid; + var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); // Notice these props might be changed each time for a single dataZoomModel. + + dataZoomInfoMap.set(dataZoomModel.uid, { + dzReferCoordSysInfo: dzCoordSysInfo, + model: dataZoomModel, + getRange: null + }); + }); + }); // (1) Merge dataZoom settings for each coord sys and set to the roam controller. + // (2) Clear coord sys if not refered by any dataZoom. + + coordSysRecordMap.each(function (coordSysRecord) { + var controller = coordSysRecord.controller; + var firstDzInfo; + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var firstDzKey = dataZoomInfoMap.keys()[0]; + + if (firstDzKey != null) { + firstDzInfo = dataZoomInfoMap.get(firstDzKey); + } + } + + if (!firstDzInfo) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + return; + } + + var controllerParams = mergeControllerParams(dataZoomInfoMap); + controller.enable(controllerParams.controlType, controllerParams.opt); + controller.setPointerChecker(coordSysRecord.containsPoint); + createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate'); + }); + }); + } + + var InsideZoomView = + /** @class */ + function (_super) { + __extends(InsideZoomView, _super); + + function InsideZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataZoom.inside'; + return _this; + } + + InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) { + _super.prototype.render.apply(this, arguments); + + if (dataZoomModel.noTarget()) { + this._clear(); + + return; + } // Hence the `throttle` util ensures to preserve command order, + // here simply updating range all the time will not cause missing + // any of the the roam change. + + + this.range = dataZoomModel.getPercentRange(); // Reset controllers. + + setViewInfoToCoordSysRecord(api, dataZoomModel, { + pan: bind(getRangeHandlers.pan, this), + zoom: bind(getRangeHandlers.zoom, this), + scrollMove: bind(getRangeHandlers.scrollMove, this) + }); + }; + + InsideZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + InsideZoomView.prototype._clear = function () { + disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel); + this.range = null; + }; + + InsideZoomView.type = 'dataZoom.inside'; + return InsideZoomView; + }(DataZoomView); + + var getRangeHandlers = { + zoom: function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo); + var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + var scale = Math.max(1 / e.scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; // Restrict range. + + var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }, + pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength; + }), + scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta; + }) + }; + + function makeMover(getPercentDelta) { + return function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e); + sliderMove(percentDelta, range, [0, 100], 'all'); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }; + } + + var getDirectionInfo = { + grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + oldPoint = oldPoint || [0, 0]; + + if (axis.dim === 'x') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // axis.dim === 'y' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var polar = coordSysInfo.model.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var angleExtent = polar.getAngleAxis().getExtent(); + oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; + newPoint = polar.pointToCoord(newPoint); + + if (axisModel.mainType === 'radiusAxis') { + ret.pixel = newPoint[0] - oldPoint[0]; // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]); + // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]); + + ret.pixelLength = radiusExtent[1] - radiusExtent[0]; + ret.pixelStart = radiusExtent[0]; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'angleAxis' + ret.pixel = newPoint[1] - oldPoint[1]; // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]); + // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]); + + ret.pixelLength = angleExtent[1] - angleExtent[0]; + ret.pixelStart = angleExtent[0]; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + var ret = {}; + oldPoint = oldPoint || [0, 0]; + + if (axis.orient === 'horizontal') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'vertical' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + }; + + function install$K(registers) { + installCommon(registers); + registers.registerComponentModel(InsideZoomModel); + registers.registerComponentView(InsideZoomView); + installDataZoomRoamProcessor(registers); + } + + var SliderZoomModel = + /** @class */ + function (_super) { + __extends(SliderZoomModel, _super); + + function SliderZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomModel.type; + return _this; + } + + SliderZoomModel.type = 'dataZoom.slider'; + SliderZoomModel.layoutMode = 'box'; + SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + show: true, + // deault value can only be drived in view stage. + right: 'ph', + top: 'ph', + width: 'ph', + height: 'ph', + left: null, + bottom: null, + borderColor: '#d2dbee', + borderRadius: 3, + backgroundColor: 'rgba(47,69,84,0)', + // dataBackgroundColor: '#ddd', + dataBackground: { + lineStyle: { + color: '#d2dbee', + width: 0.5 + }, + areaStyle: { + color: '#d2dbee', + opacity: 0.2 + } + }, + selectedDataBackground: { + lineStyle: { + color: '#8fb0f7', + width: 0.5 + }, + areaStyle: { + color: '#8fb0f7', + opacity: 0.2 + } + }, + // Color of selected window. + fillerColor: 'rgba(135,175,274,0.2)', + handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z', + // Percent of the slider height + handleSize: '100%', + handleStyle: { + color: '#fff', + borderColor: '#ACB8D1' + }, + moveHandleSize: 7, + moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z', + moveHandleStyle: { + color: '#D2DBEE', + opacity: 0.7 + }, + showDetail: true, + showDataShadow: 'auto', + realtime: true, + zoomLock: false, + textStyle: { + color: '#6E7079' + }, + brushSelect: true, + brushStyle: { + color: 'rgba(135,175,274,0.15)' + }, + emphasis: { + handleStyle: { + borderColor: '#8FB0F7' + }, + moveHandleStyle: { + color: '#8FB0F7' + } + } + }); + return SliderZoomModel; + }(DataZoomModel); + + var Rect$2 = Rect; // Constants + + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var DEFAULT_MOVE_HANDLE_SIZE = 7; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + var REALTIME_ANIMATION_CONFIG = { + easing: 'cubicOut', + duration: 100, + delay: 0 + }; + + var SliderZoomView = + /** @class */ + function (_super) { + __extends(SliderZoomView, _super); + + function SliderZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomView.type; + _this._displayables = {}; + return _this; + } + + SliderZoomView.prototype.init = function (ecModel, api) { + this.api = api; // A unique handler for each dataZoom component + + this._onBrush = bind(this._onBrush, this); + this._onBrushEnd = bind(this._onBrushEnd, this); + }; + + SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + _super.prototype.render.apply(this, arguments); + + createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate'); + this._orient = dataZoomModel.getOrient(); + + if (dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + if (dataZoomModel.noTarget()) { + this._clear(); + + this.group.removeAll(); + return; + } // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + + + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }; + + SliderZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + SliderZoomView.prototype._clear = function () { + clear(this, '_dispatchZoomAction'); + var zr = this.api.getZr(); + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + }; + + SliderZoomView.prototype._buildView = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + this._brushing = false; + this._displayables.brushRect = null; + + this._resetLocation(); + + this._resetInterval(); + + var barGroup = this._displayables.sliderGroup = new Group(); + + this._renderBackground(); + + this._renderHandle(); + + this._renderDataShadow(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }; + + SliderZoomView.prototype._resetLocation = function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var showMoveHandle = dataZoomModel.get('brushSelect'); + var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0; // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + + var coordRect = this._findCoordRect(); + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; // Default align by coordinate system rect. + + var positionInfo = this._orient === HORIZONTAL ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP - moveHandleSize, + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } : { + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + + var layoutParams = getLayoutParams(dataZoomModel.option); // Replace the placeholder value. + + each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + var layoutRect = getLayoutRect(layoutParams, ecSize); + this._location = { + x: layoutRect.x, + y: layoutRect.y + }; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }; + + SliderZoomView.prototype._positionGroup = function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; // Just use the first axis to determine mapping. + + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + var sliderGroup = this._displayables.sliderGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; // Transform barGroup. + + sliderGroup.attr(orient === HORIZONTAL && !inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: 1 + } : orient === HORIZONTAL && inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: -1 + } : orient === VERTICAL && !inverse ? { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: 1, + rotation: Math.PI / 2 + } // Don't use Math.PI, considering shadow direction. + : { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: -1, + rotation: Math.PI / 2 + }); // Position barGroup + + var rect = thisGroup.getBoundingRect([sliderGroup]); + thisGroup.x = location.x - rect.x; + thisGroup.y = location.y - rect.y; + thisGroup.markRedraw(); + }; + + SliderZoomView.prototype._getViewExtent = function () { + return [0, this._size[0]]; + }; + + SliderZoomView.prototype._renderBackground = function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + var barGroup = this._displayables.sliderGroup; + var brushSelect = dataZoomModel.get('brushSelect'); + barGroup.add(new Rect$2({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + }, + z2: -40 + })); // Click panel, over shadow, below handles. + + var clickPanel = new Rect$2({ + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: 'transparent' + }, + z2: 0, + onclick: bind(this._onClickPanel, this) + }); + var zr = this.api.getZr(); + + if (brushSelect) { + clickPanel.on('mousedown', this._onBrushStart, this); + clickPanel.cursor = 'crosshair'; + zr.on('mousemove', this._onBrush); + zr.on('mouseup', this._onBrushEnd); + } else { + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + } + + barGroup.add(clickPanel); + }; + + SliderZoomView.prototype._renderDataShadow = function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + this._displayables.dataShadowSegs = []; + + if (!info) { + return; + } + + var size = this._size; + var oldSize = this._shadowSize || []; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + var candlestickDim = seriesModel.getShadowDim && seriesModel.getShadowDim(); + var otherDim = candlestickDim && data.getDimensionInfo(candlestickDim) ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + if (otherDim == null) { + return; + } + + var polygonPts = this._shadowPolygonPts; + var polylinePts = this._shadowPolylinePts; // Not re-render if data doesn't change. + + if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) { + var otherDataExtent_1 = data.getDataExtent(otherDim); // Nice extent. + + var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3; + otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset]; + var otherShadowExtent_1 = [0, size[1]]; + var thisShadowExtent = [0, size[0]]; + var areaPoints_1 = [[size[0], 0], [0, 0]]; + var linePoints_1 = []; + var step_1 = thisShadowExtent[1] / (data.count() - 1); + var thisCoord_1 = 0; // Optimize for large data shadow + + var stride_1 = Math.round(data.count() / size[0]); + var lastIsEmpty_1; + data.each([otherDim], function (value, index) { + if (stride_1 > 0 && index % stride_1) { + thisCoord_1 += step_1; + return; + } // FIXME + // Should consider axis.min/axis.max when drawing dataShadow. + // FIXME + // 应该使用统一的空判断?还是在list里进行空判断? + + + var isEmpty = value == null || isNaN(value) || value === ''; // See #4235. + + var otherCoord = isEmpty ? 0 : linearMap(value, otherDataExtent_1, otherShadowExtent_1, true); // Attempt to draw data shadow precisely when there are empty value. + + if (isEmpty && !lastIsEmpty_1 && index) { + areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]); + linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]); + } else if (!isEmpty && lastIsEmpty_1) { + areaPoints_1.push([thisCoord_1, 0]); + linePoints_1.push([thisCoord_1, 0]); + } + + areaPoints_1.push([thisCoord_1, otherCoord]); + linePoints_1.push([thisCoord_1, otherCoord]); + thisCoord_1 += step_1; + lastIsEmpty_1 = isEmpty; + }); + polygonPts = this._shadowPolygonPts = areaPoints_1; + polylinePts = this._shadowPolylinePts = linePoints_1; + } + + this._shadowData = data; + this._shadowDim = otherDim; + this._shadowSize = [size[0], size[1]]; + var dataZoomModel = this.dataZoomModel; + + function createDataShadowGroup(isSelectedArea) { + var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground'); + var group = new Group(); + var polygon = new Polygon({ + shape: { + points: polygonPts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('areaStyle').getAreaStyle(), + silent: true, + z2: -20 + }); + var polyline = new Polyline({ + shape: { + points: polylinePts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('lineStyle').getLineStyle(), + silent: true, + z2: -19 + }); + group.add(polygon); + group.add(polyline); + return group; + } // let dataBackgroundModel = dataZoomModel.getModel('dataBackground'); + + + for (var i = 0; i < 3; i++) { + var group = createDataShadowGroup(i === 1); + + this._displayables.sliderGroup.add(group); + + this._displayables.dataShadowSegs.push(group); + } + }; + + SliderZoomView.prototype._prepareDataShadowInfo = function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } // Find a representative series. + + + var result; + var ecModel = this.ecModel; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels(); + each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) { + return; + } + + var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis; + var otherDim = getOtherDim(axisDim); + var otherAxisInverse; + var coordSys = seriesModel.coordinateSystem; + + if (otherDim != null && coordSys.getOtherAxis) { + otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse; + } + + otherDim = seriesModel.getData().mapDimension(otherDim); + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: axisDim, + otherDim: otherDim, + otherAxisInverse: otherAxisInverse + }; + }, this); + }, this); + return result; + }; + + SliderZoomView.prototype._renderHandle = function () { + var thisGroup = this.group; + var displayables = this._displayables; + var handles = displayables.handles = [null, null]; + var handleLabels = displayables.handleLabels = [null, null]; + var sliderGroup = this._displayables.sliderGroup; + var size = this._size; + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var borderRadius = dataZoomModel.get('borderRadius') || 0; + var brushSelect = dataZoomModel.get('brushSelect'); + var filler = displayables.filler = new Rect$2({ + silent: brushSelect, + style: { + fill: dataZoomModel.get('fillerColor') + }, + textConfig: { + position: 'inside' + } + }); + sliderGroup.add(filler); // Frame border. + + sliderGroup.add(new Rect$2({ + silent: true, + subPixelOptimize: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1], + r: borderRadius + }, + style: { + // deprecated option + stroke: dataZoomModel.get('dataBackgroundColor') || dataZoomModel.get('borderColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + })); // Left and right handle to resize + + each([0, 1], function (handleIndex) { + var iconStr = dataZoomModel.get('handleIcon'); + + if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) { + // Compatitable with the old icon parsers. Which can use a path string without path:// + iconStr = 'path://' + iconStr; + + if ("development" !== 'production') { + deprecateLog('handleIcon now needs \'path://\' prefix when using a path string'); + } + } + + var path = createSymbol(iconStr, -1, 0, 2, 2, null, true); + path.attr({ + cursor: getCursor(this._orient), + draggable: true, + drift: bind(this._onDragMove, this, handleIndex), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false), + z2: 5 + }); + var bRect = path.getBoundingRect(); + var handleSize = dataZoomModel.get('handleSize'); + this._handleHeight = parsePercent$1(handleSize, this._size[1]); + this._handleWidth = bRect.width / bRect.height * this._handleHeight; + path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle()); + path.style.strokeNoScale = true; + path.rectHover = true; + path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + enableHoverEmphasis(path); + var handleColor = dataZoomModel.get('handleColor'); // deprecated option + // Compatitable with previous version + + if (handleColor != null) { + path.style.fill = handleColor; + } + + sliderGroup.add(handles[handleIndex] = path); + var textStyleModel = dataZoomModel.getModel('textStyle'); + thisGroup.add(handleLabels[handleIndex] = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '', + verticalAlign: 'middle', + align: 'center', + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + }), + z2: 10 + })); + }, this); // Handle to move. Only visible when brushSelect is set true. + + var actualMoveZone = filler; + + if (brushSelect) { + var moveHandleHeight = parsePercent$1(dataZoomModel.get('moveHandleSize'), size[1]); + var moveHandle_1 = displayables.moveHandle = new Rect({ + style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(), + silent: true, + shape: { + r: [0, 0, 2, 2], + y: size[1] - 0.5, + height: moveHandleHeight + } + }); + var iconSize = moveHandleHeight * 0.8; + var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, '#fff', true); + moveHandleIcon.silent = true; + moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5; + moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle(); + var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10)); + actualMoveZone = displayables.moveZone = new Rect({ + invisible: true, + shape: { + y: size[1] - moveZoneExpandSize, + height: moveHandleHeight + moveZoneExpandSize + } + }); + actualMoveZone.on('mouseover', function () { + api.enterEmphasis(moveHandle_1); + }).on('mouseout', function () { + api.leaveEmphasis(moveHandle_1); + }); + sliderGroup.add(moveHandle_1); + sliderGroup.add(moveHandleIcon); + sliderGroup.add(actualMoveZone); + } + + actualMoveZone.attr({ + draggable: true, + cursor: getCursor(this._orient), + drift: bind(this._onDragMove, this, 'all'), + ondragstart: bind(this._showDataInfo, this, true), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + }); + }; + + SliderZoomView.prototype._resetInterval = function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + + var viewExtent = this._getViewExtent(); + + this._handleEnds = [linearMap(range[0], [0, 100], viewExtent, true), linearMap(range[1], [0, 100], viewExtent, true)]; + }; + + SliderZoomView.prototype._updateInterval = function (handleIndex, delta) { + var dataZoomModel = this.dataZoomModel; + var handleEnds = this._handleEnds; + + var viewExtend = this._getViewExtent(); + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + var percentExtent = [0, 100]; + sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null); + var lastRange = this._range; + var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]); + return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; + }; + + SliderZoomView.prototype._updateView = function (nonRealtime) { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + each([0, 1], function (handleIndex) { + // Handles + var handle = displaybles.handles[handleIndex]; + var handleHeight = this._handleHeight; + handle.attr({ + scaleX: handleHeight / 2, + scaleY: handleHeight / 2, + // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window. + // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default. + x: handleEnds[handleIndex] + (handleIndex ? -1 : 1), + y: size[1] / 2 - handleHeight / 2 + }); + }, this); // Filler + + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: size[1] + }); + var viewExtent = { + x: handleInterval[0], + width: handleInterval[1] - handleInterval[0] + }; // Move handle + + if (displaybles.moveHandle) { + displaybles.moveHandle.setShape(viewExtent); + displaybles.moveZone.setShape(viewExtent); // Force update path on the invisible object + + displaybles.moveZone.getBoundingRect(); + displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2); + } // update clip path of shadow. + + + var dataShadowSegs = displaybles.dataShadowSegs; + var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]]; + + for (var i = 0; i < dataShadowSegs.length; i++) { + var segGroup = dataShadowSegs[i]; + var clipPath = segGroup.getClipPath(); + + if (!clipPath) { + clipPath = new Rect(); + segGroup.setClipPath(clipPath); + } + + clipPath.setShape({ + x: segIntervals[i], + y: 0, + width: segIntervals[i + 1] - segIntervals[i], + height: size[1] + }); + } + + this._updateDataInfo(nonRealtime); + }; + + SliderZoomView.prototype._updateDataInfo = function (nonRealtime) { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + + if (dataZoomModel.get('showDetail')) { + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var axis = axisProxy.getAxisModel().axis; + var range = this._range; + var dataInterval = nonRealtime // See #4434, data and axis are not processed and reset yet in non-realtime mode. + ? axisProxy.calculateDataWindow({ + start: range[0], + end: range[1] + }).valueWindow : axisProxy.getDataValueWindow(); + labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)]; + } + } + + var orderedHandleEnds = asc(this._handleEnds.slice()); + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + // Ignore handlers transform + var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group); + var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform); + var offset = this._handleWidth / 2 + LABEL_GAP; + var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + verticalAlign: orient === HORIZONTAL ? 'middle' : direction, + align: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }; + + SliderZoomView.prototype._formatLabel = function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + var labelPrecision = dataZoomModel.get('labelPrecision'); + + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + var valueStr = value == null || isNaN(value) ? '' // FIXME Glue code + : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({ + value: Math.round(value) + }) // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr; + }; + /** + * @param showOrHide true: show, false: hide + */ + + + SliderZoomView.prototype._showDataInfo = function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + var displayables = this._displayables; + var handleLabels = displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); // Highlight move handle + + displayables.moveHandle && this.api[showOrHide ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1); + }; + + SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) { + this._dragging = true; // For mobile device, prevent screen slider on the button. + + stop(event.event); // Transform dx, dy to bar coordination. + + var barTransform = this._displayables.sliderGroup.getLocalTransform(); + + var vertex = applyTransform$1([dx, dy], barTransform, true); + + var changed = this._updateInterval(handleIndex, vertex[0]); + + var realtime = this.dataZoomModel.get('realtime'); + + this._updateView(!realtime); // Avoid dispatch dataZoom repeatly but range not changed, + // which cause bad visual effect when progressive enabled. + + + changed && realtime && this._dispatchZoomAction(true); + }; + + SliderZoomView.prototype._onDragEnd = function () { + this._dragging = false; + + this._showDataInfo(false); // While in realtime mode and stream mode, dispatch action when + // drag end will cause the whole view rerender, which is unnecessary. + + + var realtime = this.dataZoomModel.get('realtime'); + !realtime && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onClickPanel = function (e) { + var size = this._size; + + var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY); + + if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) { + return; + } + + var handleEnds = this._handleEnds; + var center = (handleEnds[0] + handleEnds[1]) / 2; + + var changed = this._updateInterval('all', localPoint[0] - center); + + this._updateView(); + + changed && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrushStart = function (e) { + var x = e.offsetX; + var y = e.offsetY; + this._brushStart = new Point(x, y); + this._brushing = true; + this._brushStartTime = +new Date(); // this._updateBrushRect(x, y); + }; + + SliderZoomView.prototype._onBrushEnd = function (e) { + if (!this._brushing) { + return; + } + + var brushRect = this._displayables.brushRect; + this._brushing = false; + + if (!brushRect) { + return; + } + + brushRect.attr('ignore', true); + var brushShape = brushRect.shape; + var brushEndTime = +new Date(); // console.log(brushEndTime - this._brushStartTime); + + if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) { + // Will treat it as a click + return; + } + + var viewExtend = this._getViewExtent(); + + var percentExtent = [0, 100]; + this._range = asc([linearMap(brushShape.x, viewExtend, percentExtent, true), linearMap(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]); + this._handleEnds = [brushShape.x, brushShape.x + brushShape.width]; + + this._updateView(); + + this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrush = function (e) { + if (this._brushing) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + + this._updateBrushRect(e.offsetX, e.offsetY); + } + }; + + SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) { + var displayables = this._displayables; + var dataZoomModel = this.dataZoomModel; + var brushRect = displayables.brushRect; + + if (!brushRect) { + brushRect = displayables.brushRect = new Rect$2({ + silent: true, + style: dataZoomModel.getModel('brushStyle').getItemStyle() + }); + displayables.sliderGroup.add(brushRect); + } + + brushRect.attr('ignore', false); + var brushStart = this._brushStart; + var sliderGroup = this._displayables.sliderGroup; + var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY); + var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y); + var size = this._size; + endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0); + brushRect.setShape({ + x: startPoint[0], + y: 0, + width: endPoint[0] - startPoint[0], + height: size[1] + }); + }; + /** + * This action will be throttled. + */ + + + SliderZoomView.prototype._dispatchZoomAction = function (realtime) { + var range = this._range; + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + animation: realtime ? REALTIME_ANIMATION_CONFIG : null, + start: range[0], + end: range[1] + }); + }; + + SliderZoomView.prototype._findCoordRect = function () { + // Find the grid corresponding to the first axis referred by dataZoom. + var rect; + var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList; + + if (!rect && coordSysInfoList.length) { + var coordSys = coordSysInfoList[0].model.coordinateSystem; + rect = coordSys.getRect && coordSys.getRect(); + } + + if (!rect) { + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + }; + + SliderZoomView.type = 'dataZoom.slider'; + return SliderZoomView; + }(DataZoomView); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + var map = { + x: 'y', + y: 'x', + radius: 'angle', + angle: 'radius' + }; + return map[thisDim]; + } + + function getCursor(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + function install$L(registers) { + registers.registerComponentModel(SliderZoomModel); + registers.registerComponentView(SliderZoomView); + installCommon(registers); + } + + function install$M(registers) { + use(install$K); + use(install$L); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var visualDefault = { + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = clone((defaultOption$1[visualType] || {})[key]); + return isCategory ? isArray(value) ? value[value.length - 1] : value : value; + } + }; + var defaultOption$1 = { + color: { + active: ['#006edd', '#e0ffff'], + inactive: ['rgba(0,0,0,0)'] + }, + colorHue: { + active: [0, 360], + inactive: [0, 0] + }, + colorSaturation: { + active: [0.3, 1], + inactive: [0, 0] + }, + colorLightness: { + active: [0.9, 0.5], + inactive: [0, 0] + }, + colorAlpha: { + active: [0.3, 1], + inactive: [0, 0] + }, + opacity: { + active: [0.3, 1], + inactive: [0, 0] + }, + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } + }; + + var mapVisual$1 = VisualMapping.mapVisual; + var eachVisual = VisualMapping.eachVisual; + var isArray$1 = isArray; + var each$d = each; + var asc$2 = asc; + var linearMap$1 = linearMap; + + var VisualMapModel = + /** @class */ + function (_super) { + __extends(VisualMapModel, _super); + + function VisualMapModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapModel.type; + _this.stateList = ['inRange', 'outOfRange']; + _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color']; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + /** + * [lowerBound, upperBound] + */ + + _this.dataBound = [-Infinity, Infinity]; + _this.targetVisuals = {}; + _this.controllerVisuals = {}; + return _this; + } + + VisualMapModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys); + this.textStyleModel = this.getModel('textStyle'); + this.resetItemSize(); + this.completeVisualOption(); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetVisual = function (supplementVisualOption) { + var stateList = this.stateList; + supplementVisualOption = bind(supplementVisualOption, this); + this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption); + this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption); + }; + /** + * @public + */ + + + VisualMapModel.prototype.getItemSymbol = function () { + return null; + }; + /** + * @protected + * @return {Array.} An array of series indices. + */ + + + VisualMapModel.prototype.getTargetSeriesIndices = function () { + var optionSeriesIndex = this.option.seriesIndex; + var seriesIndices = []; + + if (optionSeriesIndex == null || optionSeriesIndex === 'all') { + this.ecModel.eachSeries(function (seriesModel, index) { + seriesIndices.push(index); + }); + } else { + seriesIndices = normalizeToArray(optionSeriesIndex); + } + + return seriesIndices; + }; + /** + * @public + */ + + + VisualMapModel.prototype.eachTargetSeries = function (callback, context) { + each(this.getTargetSeriesIndices(), function (seriesIndex) { + var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex); + + if (seriesModel) { + callback.call(context, seriesModel); + } + }, this); + }; + /** + * @pubilc + */ + + + VisualMapModel.prototype.isTargetSeries = function (seriesModel) { + var is = false; + this.eachTargetSeries(function (model) { + model === seriesModel && (is = true); + }); + return is; + }; + /** + * @example + * this.formatValueText(someVal); // format single numeric value to text. + * this.formatValueText(someVal, true); // format single category value to text. + * this.formatValueText([min, max]); // format numeric min-max to text. + * this.formatValueText([this.dataBound[0], max]); // using data lower bound. + * this.formatValueText([min, this.dataBound[1]]); // using data upper bound. + * + * @param value Real value, or this.dataBound[0 or 1]. + * @param isCategory Only available when value is number. + * @param edgeSymbols Open-close symbol when value is interval. + * @protected + */ + + + VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + edgeSymbols = edgeSymbols || ['<', '>']; + + if (isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + var textValue = isCategory ? value // Value is string when isCategory + : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value); + + if (isString(formatter)) { + return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue); + } else if (isFunction(formatter)) { + return isMinMax ? formatter(value[0], value[1]) : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return edgeSymbols[0] + ' ' + textValue[1]; + } else if (value[1] === dataBound[1]) { + return edgeSymbols[1] + ' ' + textValue[0]; + } else { + return textValue[0] + ' - ' + textValue[1]; + } + } else { + // Format single value (includes category case). + return textValue; + } + + function toFixed(val) { + return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20)); + } + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetExtent = function () { + var thisOption = this.option; // Can not calculate data extent by data here. + // Because series and data may be modified in processing stage. + // So we do not support the feature "auto min/max". + + var extent = asc$2([thisOption.min, thisOption.max]); + this._dataExtent = extent; + }; + /** + * PENDING: + * delete this method if no outer usage. + * + * Return Concrete dimension. If null/undefined is returned, no dimension is used. + */ + // getDataDimension(data: SeriesData) { + // const optDim = this.option.dimension; + // if (optDim != null) { + // return data.getDimension(optDim); + // } + // const dimNames = data.dimensions; + // for (let i = dimNames.length - 1; i >= 0; i--) { + // const dimName = dimNames[i]; + // const dimInfo = data.getDimensionInfo(dimName); + // if (!dimInfo.isCalculationCoord) { + // return dimName; + // } + // } + // } + + + VisualMapModel.prototype.getDataDimensionIndex = function (data) { + var optDim = this.option.dimension; + + if (optDim != null) { + return data.getDimensionIndex(optDim); + } + + var dimNames = data.dimensions; + + for (var i = dimNames.length - 1; i >= 0; i--) { + var dimName = dimNames[i]; + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isCalculationCoord) { + return dimInfo.storeDimIndex; + } + } + }; + + VisualMapModel.prototype.getExtent = function () { + return this._dataExtent.slice(); + }; + + VisualMapModel.prototype.completeVisualOption = function () { + var ecModel = this.ecModel; + var thisOption = this.option; + var base = { + inRange: thisOption.inRange, + outOfRange: thisOption.outOfRange + }; + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + merge(target, base); // Do not override + + merge(controller, base); // Do not override + + var isCategory = this.isCategory(); + completeSingle.call(this, target); + completeSingle.call(this, controller); + completeInactive.call(this, target, 'inRange', 'outOfRange'); // completeInactive.call(this, target, 'outOfRange', 'inRange'); + + completeController.call(this, controller); + + function completeSingle(base) { + // Compatible with ec2 dataRange.color. + // The mapping order of dataRange.color is: [high value, ..., low value] + // whereas inRange.color and outOfRange.color is [low value, ..., high value] + // Notice: ec2 has no inverse. + if (isArray$1(thisOption.color) // If there has been inRange: {symbol: ...}, adding color is a mistake. + // So adding color only when no inRange defined. + && !base.inRange) { + base.inRange = { + color: thisOption.color.slice().reverse() + }; + } // Compatible with previous logic, always give a default color, otherwise + // simple config with no inRange and outOfRange will not work. + // Originally we use visualMap.color as the default color, but setOption at + // the second time the default color will be erased. So we change to use + // constant DEFAULT_COLOR. + // If user do not want the default color, set inRange: {color: null}. + + + base.inRange = base.inRange || { + color: ecModel.get('gradientColor') + }; + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each$d(optExist, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var defa = visualDefault.get(visualType, 'inactive', isCategory); + + if (defa != null) { + optAbsent[visualType] = defa; // Compatibable with ec2: + // Only inactive color to rgba(0,0,0,0) can not + // make label transparent, so use opacity also. + + if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) { + optAbsent.opacity = [0, 0]; + } + } + }); + } + } + + function completeController(controller) { + var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol; + var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize; + var inactiveColor = this.get('inactiveColor'); + var itemSymbol = this.getItemSymbol(); + var defaultSymbol = itemSymbol || 'roundRect'; + each$d(this.stateList, function (state) { + var itemSize = this.itemSize; + var visuals = controller[state]; // Set inactive color for controller if no other color + // attr (like colorAlpha) specified. + + if (!visuals) { + visuals = controller[state] = { + color: isCategory ? inactiveColor : [inactiveColor] + }; + } // Consistent symbol and symbolSize if not specified. + + + if (visuals.symbol == null) { + visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? defaultSymbol : [defaultSymbol]); + } + + if (visuals.symbolSize == null) { + visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } // Filter none + + + visuals.symbol = mapVisual$1(visuals.symbol, function (symbol) { + return symbol === 'none' ? defaultSymbol : symbol; + }); // Normalize symbolSize + + var symbolSize = visuals.symbolSize; + + if (symbolSize != null) { + var max_1 = -Infinity; // symbolSize can be object when categories defined. + + eachVisual(symbolSize, function (value) { + value > max_1 && (max_1 = value); + }); + visuals.symbolSize = mapVisual$1(symbolSize, function (value) { + return linearMap$1(value, [0, max_1], [0, itemSize[0]], true); + }); + } + }, this); + } + }; + + VisualMapModel.prototype.resetItemSize = function () { + this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))]; + }; + + VisualMapModel.prototype.isCategory = function () { + return !!this.option.categories; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.setSelected = function (selected) {}; + + VisualMapModel.prototype.getSelected = function () { + return null; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.getValueState = function (value) { + return null; + }; + /** + * FIXME + * Do not publish to thirt-part-dev temporarily + * util the interface is stable. (Should it return + * a function but not visual meta?) + * + * @pubilc + * @abstract + * @param getColorVisual + * params: value, valueState + * return: color + * @return {Object} visualMeta + * should includes {stops, outerColors} + * outerColor means [colorBeyondMinValue, colorBeyondMaxValue] + */ + + + VisualMapModel.prototype.getVisualMeta = function (getColorVisual) { + return null; + }; + + VisualMapModel.type = 'visualMap'; + VisualMapModel.dependencies = ['series']; + VisualMapModel.defaultOption = { + show: true, + // zlevel: 0, + z: 4, + seriesIndex: 'all', + min: 0, + max: 200, + left: 0, + right: null, + top: null, + bottom: 0, + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, + padding: 5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, + precision: 0, + textStyle: { + color: '#333' // 值域文字颜色 + + } + }; + return VisualMapModel; + }(ComponentModel); + + var DEFAULT_BAR_BOUND = [20, 140]; + + var ContinuousModel = + /** @class */ + function (_super) { + __extends(ContinuousModel, _super); + + function ContinuousModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousModel.type; + return _this; + } + /** + * @override + */ + + + ContinuousModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + mappingOption.dataExtent = this.getExtent(); + }); + + this._resetRange(); + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.resetItemSize = function () { + _super.prototype.resetItemSize.apply(this, arguments); + + var itemSize = this.itemSize; + (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); + (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + }; + /** + * @private + */ + + + ContinuousModel.prototype._resetRange = function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + + if (!range || range.auto) { + // `range` should always be array (so we don't use other + // value like 'auto') for user-friend. (consider getOption). + dataExtent.auto = 1; + this.option.range = dataExtent; + } else if (isArray(range)) { + if (range[0] > range[1]) { + range.reverse(); + } + + range[0] = Math.max(range[0], dataExtent[0]); + range[1] = Math.min(range[1], dataExtent[1]); + } + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.completeVisualOption = function () { + _super.prototype.completeVisualOption.apply(this, arguments); + + each(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = symbolSize[1] / 3; // For good looking. + } + }, this); + }; + /** + * @override + */ + + + ContinuousModel.prototype.setSelected = function (selected) { + this.option.range = selected.slice(); + + this._resetRange(); + }; + /** + * @public + */ + + + ContinuousModel.prototype.getSelected = function () { + var dataExtent = this.getExtent(); + var dataInterval = asc((this.get('range') || []).slice()); // Clamp + + dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); + dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); + dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); + dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); + return dataInterval; + }; + /** + * @override + */ + + + ContinuousModel.prototype.getValueState = function (value) { + var range = this.option.range; + var dataExtent = this.getExtent(); // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'. + // range[1] is processed likewise. + + return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange'; + }; + + ContinuousModel.prototype.findTargetDataIndices = function (range) { + var result = []; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @implement + */ + + + ContinuousModel.prototype.getVisualMeta = function (getColorVisual) { + var oVals = getColorStopValues(this, 'outOfRange', this.getExtent()); + var iVals = getColorStopValues(this, 'inRange', this.option.range.slice()); + var stops = []; + + function setStop(value, valueState) { + stops.push({ + value: value, + color: getColorVisual(value, valueState) + }); + } // Format to: outOfRange -- inRange -- outOfRange. + + + var iIdx = 0; + var oIdx = 0; + var iLen = iVals.length; + var oLen = oVals.length; + + for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { + // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored. + if (oVals[oIdx] < iVals[iIdx]) { + setStop(oVals[oIdx], 'outOfRange'); + } + } + + for (var first = 1; iIdx < iLen; iIdx++, first = 0) { + // If range is full, value beyond min, max will be clamped. + // make a singularity + first && stops.length && setStop(iVals[iIdx], 'outOfRange'); + setStop(iVals[iIdx], 'inRange'); + } + + for (var first = 1; oIdx < oLen; oIdx++) { + if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { + // make a singularity + if (first) { + stops.length && setStop(stops[stops.length - 1].value, 'outOfRange'); + first = 0; + } + + setStop(oVals[oIdx], 'outOfRange'); + } + } + + var stopsLen = stops.length; + return { + stops: stops, + outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent'] + }; + }; + + ContinuousModel.type = 'visualMap.continuous'; + ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + align: 'auto', + calculable: false, + hoverLink: true, + realtime: true, + handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z', + handleSize: '120%', + handleStyle: { + borderColor: '#fff', + borderWidth: 1 + }, + indicatorIcon: 'circle', + indicatorSize: '50%', + indicatorStyle: { + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } // emphasis: { + // handleStyle: { + // shadowBlur: 3, + // shadowOffsetX: 1, + // shadowOffsetY: 1, + // shadowColor: 'rgba(0,0,0,0.2)' + // } + // } + + }); + return ContinuousModel; + }(VisualMapModel); + + function getColorStopValues(visualMapModel, valueState, dataExtent) { + if (dataExtent[0] === dataExtent[1]) { + return dataExtent.slice(); + } // When using colorHue mapping, it is not linear color any more. + // Moreover, canvas gradient seems not to be accurate linear. + // FIXME + // Should be arbitrary value 100? or based on pixel size? + + + var count = 200; + var step = (dataExtent[1] - dataExtent[0]) / count; + var value = dataExtent[0]; + var stopValues = []; + + for (var i = 0; i <= count && value < dataExtent[1]; i++) { + stopValues.push(value); + value += step; + } + + stopValues.push(dataExtent[1]); + return stopValues; + } + + var VisualMapView = + /** @class */ + function (_super) { + __extends(VisualMapView, _super); + + function VisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapView.type; + _this.autoPositionValues = { + left: 1, + right: 1, + top: 1, + bottom: 1 + }; + return _this; + } + + VisualMapView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + }; + /** + * @protected + */ + + + VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE + ) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender(visualMapModel, ecModel, api, payload); + }; + /** + * @protected + */ + + + VisualMapView.prototype.renderBackground = function (group) { + var visualMapModel = this.visualMapModel; + var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + group.add(new Rect({ + z2: -1, + silent: true, + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[3] + padding[1], + height: rect.height + padding[0] + padding[2] + }, + style: { + fill: visualMapModel.get('backgroundColor'), + stroke: visualMapModel.get('borderColor'), + lineWidth: visualMapModel.get('borderWidth') + } + })); + }; + /** + * @protected + * @param targetValue can be Infinity or -Infinity + * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' + * @param opts + * @param opts.forceState Specify state, instead of using getValueState method. + * @param opts.convertOpacityToAlpha For color gradient in controller widget. + * @return {*} Visual value. + */ + + + VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) { + opts = opts || {}; + var forceState = opts.forceState; + var visualMapModel = this.visualMapModel; + var visualObj = {}; // Default values. + + if (visualCluster === 'color') { + var defaultColor = visualMapModel.get('contentColor'); + visualObj.color = defaultColor; + } + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + each(visualTypes, function (type) { + var visualMapping = mappings[type]; + + if (opts.convertOpacityToAlpha && type === 'opacity') { + type = 'colorAlpha'; + visualMapping = mappings.__alphaForOpacity; + } + + if (VisualMapping.dependsOn(type, visualCluster)) { + visualMapping && visualMapping.applyVisual(targetValue, getter, setter); + } + }); + return visualObj[visualCluster]; + }; + + VisualMapView.prototype.positionGroup = function (group) { + var model = this.visualMapModel; + var api = this.api; + positionElement(group, model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + }; + + VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {}; + + VisualMapView.type = 'visualMap'; + return VisualMapView; + }(ComponentView); + + var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']]; + /** + * @param visualMapModel + * @param api + * @param itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ + + function getItemAlign(visualMapModel, api, itemSize) { + var modelOption = visualMapModel.option; + var itemAlign = modelOption.align; + + if (itemAlign != null && itemAlign !== 'auto') { + return itemAlign; + } // Auto decision align. + + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var realIndex = modelOption.orient === 'horizontal' ? 1 : 0; + var reals = paramsSet[realIndex]; + var fakeValue = [0, null, 10]; + var layoutInput = {}; + + for (var i = 0; i < 3; i++) { + layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; + layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; + } + + var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex]; + var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding); + return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1]; + } + /** + * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and + * dataIndexInside means filtered index. + */ + // TODO: TYPE more specified payload types. + + function makeHighDownBatch(batch, visualMapModel) { + each(batch || [], function (batchItem) { + if (batchItem.dataIndex != null) { + batchItem.dataIndexInside = batchItem.dataIndex; + batchItem.dataIndex = null; + } + + batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : ''); + }); + return batch; + } + + var linearMap$2 = linearMap; + var each$e = each; + var mathMin$a = Math.min; + var mathMax$a = Math.max; // Arbitrary value + + var HOVER_LINK_SIZE = 12; + var HOVER_LINK_OUT = 6; // Notice: + // Any "interval" should be by the order of [low, high]. + // "handle0" (handleIndex === 0) maps to + // low data value: this._dataInterval[0] and has low coord. + // "handle1" (handleIndex === 1) maps to + // high data value: this._dataInterval[1] and has high coord. + // The logic of transform is implemented in this._createBarGroup. + + var ContinuousView = + /** @class */ + function (_super) { + __extends(ContinuousView, _super); + + function ContinuousView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousView.type; + _this._shapes = {}; + _this._dataInterval = []; + _this._handleEnds = []; + _this._hoverLinkDataIndices = []; + return _this; + } + + ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) { + this._api = api; + + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + }; + + ContinuousView.prototype._buildView = function () { + this.group.removeAll(); + var visualMapModel = this.visualMapModel; + var thisGroup = this.group; + this._orient = visualMapModel.get('orient'); + this._useHandle = visualMapModel.get('calculable'); + + this._resetInterval(); + + this._renderBar(thisGroup); + + var dataRangeText = visualMapModel.get('text'); + + this._renderEndsText(thisGroup, dataRangeText, 0); + + this._renderEndsText(thisGroup, dataRangeText, 1); // Do this for background size calculation. + + + this._updateView(true); // After updating view, inner shapes is built completely, + // and then background can be rendered. + + + this.renderBackground(thisGroup); // Real update view + + this._updateView(); + + this._enableHoverLinkToSeries(); + + this._enableHoverLinkFromSeries(); + + this.positionGroup(thisGroup); + }; + + ContinuousView.prototype._renderEndsText = function (group, dataRangeText, endsIndex) { + if (!dataRangeText) { + return; + } // Compatible with ec2, text[0] map to high value, text[1] map low value. + + + var text = dataRangeText[1 - endsIndex]; + text = text != null ? text + '' : ''; + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var itemSize = visualMapModel.itemSize; + var barGroup = this._shapes.mainGroup; + + var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup); + + var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup); + + var orient = this._orient; + var textStyleModel = this.visualMapModel.textStyleModel; + this.group.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: position[0], + y: position[1], + verticalAlign: orient === 'horizontal' ? 'middle' : align, + align: orient === 'horizontal' ? align : 'center', + text: text + }) + })); + }; + + ContinuousView.prototype._renderBar = function (targetGroup) { + var visualMapModel = this.visualMapModel; + var shapes = this._shapes; + var itemSize = visualMapModel.itemSize; + var orient = this._orient; + var useHandle = this._useHandle; + var itemAlign = getItemAlign(visualMapModel, this.api, itemSize); + + var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign); + + var gradientBarGroup = new Group(); + mainGroup.add(gradientBarGroup); // Bar + + gradientBarGroup.add(shapes.outOfRange = createPolygon()); + gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true))); // A border radius clip. + + gradientBarGroup.setClipPath(new Rect({ + shape: { + x: 0, + y: 0, + width: itemSize[0], + height: itemSize[1], + r: 3 + } + })); + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = mathMax$a(textRect.width, textRect.height); // Handle + + if (useHandle) { + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient); + + this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient); + } + + this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient); + + targetGroup.add(mainGroup); + }; + + ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) { + var onDrift = bind(this._dragHandle, this, handleIndex, false); + var onDragEnd = bind(this._dragHandle, this, handleIndex, true); + var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]); + var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true); + var cursor = getCursor$1(this._orient); + handleThumb.attr({ + cursor: cursor, + draggable: true, + drift: onDrift, + ondragend: onDragEnd, + onmousemove: function (e) { + stop(e.event); + } + }); + handleThumb.x = itemSize[0] / 2; + handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle()); + handleThumb.setStyle({ + strokeNoScale: true, + strokeFirst: true + }); + handleThumb.style.lineWidth *= 2; + handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + setAsHighDownDispatcher(handleThumb, true); + mainGroup.add(handleThumb); // Text is always horizontal layout but should not be effected by + // transform (orient/inverse). So label is built separately but not + // use zrender/graphic/helper/RectText, and is located based on view + // group (according to handleLabelPoint) but not barGroup. + + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new ZRText({ + cursor: cursor, + draggable: true, + drift: onDrift, + onmousemove: function (e) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + handleLabel.ensureState('blur').style = { + opacity: 0.1 + }; + handleLabel.stateTransition = { + duration: 200 + }; + this.group.add(handleLabel); + var handleLabelPoint = [handleSize, 0]; + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + }; + + ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) { + var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]); + var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true); + indicator.attr({ + cursor: 'move', + invisible: true, + silent: true, + x: itemSize[0] / 2 + }); + var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle(); + + if (indicator instanceof ZRImage) { + var pathStyle = indicator.style; + indicator.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, indicatorStyle)); + } else { + indicator.useStyle(indicatorStyle); + } + + mainGroup.add(indicator); + var textStyleModel = this.visualMapModel.textStyleModel; + var indicatorLabel = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + this.group.add(indicatorLabel); + var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0]; + var shapes = this._shapes; + shapes.indicator = indicator; + shapes.indicatorLabel = indicatorLabel; + shapes.indicatorLabelPoint = indicatorLabelPoint; + this._firstShowIndicator = true; + }; + + ContinuousView.prototype._dragHandle = function (handleIndex, isEnd, // dx is event from ondragend if isEnd is true. It's not used + dx, dy) { + if (!this._useHandle) { + return; + } + + this._dragging = !isEnd; + + if (!isEnd) { + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true); + + this._updateInterval(handleIndex, vertex[1]); + + this._hideIndicator(); // Considering realtime, update view should be executed + // before dispatch action. + + + this._updateView(); + } // dragEnd do not dispatch action when realtime. + + + if (isEnd === !this.visualMapModel.get('realtime')) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + } + + if (isEnd) { + !this._hovering && this._clearHoverLinkToSeries(); + } else if (useHoverLinkOnHandle(this.visualMapModel)) { + this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); + } + }; + + ContinuousView.prototype._resetInterval = function () { + var visualMapModel = this.visualMapModel; + var dataInterval = this._dataInterval = visualMapModel.getSelected(); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + this._handleEnds = [linearMap$2(dataInterval[0], dataExtent, sizeExtent, true), linearMap$2(dataInterval[1], dataExtent, sizeExtent, true)]; + }; + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + + + ContinuousView.prototype._updateInterval = function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + var sizeExtent = [0, visualMapModel.itemSize[1]]; + sliderMove(delta, handleEnds, sizeExtent, handleIndex, // cross is forbidden + 0); + var dataExtent = visualMapModel.getExtent(); // Update data interval. + + this._dataInterval = [linearMap$2(handleEnds[0], sizeExtent, dataExtent, true), linearMap$2(handleEnds[1], sizeExtent, dataExtent, true)]; + }; + + ContinuousView.prototype._updateView = function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'); + + var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'); + + shapes.inRange.setStyle({ + fill: visualInRange.barColor // opacity: visualInRange.opacity + + }).setShape('points', visualInRange.barPoints); + shapes.outOfRange.setStyle({ + fill: visualOutOfRange.barColor // opacity: visualOutOfRange.opacity + + }).setShape('points', visualOutOfRange.barPoints); + + this._updateHandle(inRangeHandleEnds, visualInRange); + }; + + ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) { + var opts = { + forceState: forceState, + convertOpacityToAlpha: true + }; + + var colorStops = this._makeColorGradient(dataInterval, opts); + + var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)]; + + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 0, 1, colorStops), + barPoints: barPoints, + handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color] + }; + }; + + ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) { + // Considering colorHue, which is not linear, so we have to sample + // to calculate gradient color stops, but not only calculate head + // and tail. + var sampleNumber = 100; // Arbitrary value. + + var colorStops = []; + var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; + colorStops.push({ + color: this.getControllerVisual(dataInterval[0], 'color', opts), + offset: 0 + }); + + for (var i = 1; i < sampleNumber; i++) { + var currValue = dataInterval[0] + step * i; + + if (currValue > dataInterval[1]) { + break; + } + + colorStops.push({ + color: this.getControllerVisual(currValue, 'color', opts), + offset: i / sampleNumber + }); + } + + colorStops.push({ + color: this.getControllerVisual(dataInterval[1], 'color', opts), + offset: 1 + }); + return colorStops; + }; + + ContinuousView.prototype._createBarPoints = function (handleEnds, symbolSizes) { + var itemSize = this.visualMapModel.itemSize; + return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]]; + }; + + ContinuousView.prototype._createBarGroup = function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + return new Group(orient === 'horizontal' && !inverse ? { + scaleX: itemAlign === 'bottom' ? 1 : -1, + rotation: Math.PI / 2 + } : orient === 'horizontal' && inverse ? { + scaleX: itemAlign === 'bottom' ? -1 : 1, + rotation: -Math.PI / 2 + } : orient === 'vertical' && !inverse ? { + scaleX: itemAlign === 'left' ? 1 : -1, + scaleY: -1 + } : { + scaleX: itemAlign === 'left' ? 1 : -1 + }); + }; + + ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + var visualMapModel = this.visualMapModel; + var handleThumbs = shapes.handleThumbs; + var handleLabels = shapes.handleLabels; + var itemSize = visualMapModel.itemSize; + var dataExtent = visualMapModel.getExtent(); + each$e([0, 1], function (handleIndex) { + var handleThumb = handleThumbs[handleIndex]; + handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]); + handleThumb.y = handleEnds[handleIndex]; + var val = linearMap$2(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true); + var symbolSize = this.getControllerVisual(val, 'symbolSize'); + handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0]; + handleThumb.x = itemSize[0] - symbolSize / 2; // Update handle label position. + + var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group)); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), + verticalAlign: 'middle', + align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center' + }); + }, this); + }; + + ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var itemSize = visualMapModel.itemSize; + var sizeExtent = [0, itemSize[1]]; + var shapes = this._shapes; + var indicator = shapes.indicator; + + if (!indicator) { + return; + } + + indicator.attr('invisible', false); + var opts = { + convertOpacityToAlpha: true + }; + var color = this.getControllerVisual(cursorValue, 'color', opts); + var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize'); + var y = linearMap$2(cursorValue, dataExtent, sizeExtent, true); + var x = itemSize[0] - symbolSize / 2; + var oldIndicatorPos = { + x: indicator.x, + y: indicator.y + }; // Update handle label position. + + indicator.y = y; + indicator.x = x; + var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group)); + var indicatorLabel = shapes.indicatorLabel; + indicatorLabel.attr('invisible', false); + + var align = this._applyTransform('left', shapes.mainGroup); + + var orient = this._orient; + var isHorizontal = orient === 'horizontal'; + indicatorLabel.setStyle({ + text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue), + verticalAlign: isHorizontal ? align : 'middle', + align: isHorizontal ? 'center' : align + }); + var indicatorNewProps = { + x: x, + y: y, + style: { + fill: color + } + }; + var labelNewProps = { + style: { + x: textPoint[0], + y: textPoint[1] + } + }; + + if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { + var animationCfg = { + duration: 100, + easing: 'cubicInOut', + additive: true + }; + indicator.x = oldIndicatorPos.x; + indicator.y = oldIndicatorPos.y; + indicator.animateTo(indicatorNewProps, animationCfg); + indicatorLabel.animateTo(labelNewProps, animationCfg); + } else { + indicator.attr(indicatorNewProps); + indicatorLabel.attr(labelNewProps); + } + + this._firstShowIndicator = false; + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.enterBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._enableHoverLinkToSeries = function () { + var self = this; + + this._shapes.mainGroup.on('mousemove', function (e) { + self._hovering = true; + + if (!self._dragging) { + var itemSize = self.visualMapModel.itemSize; + + var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true); // For hover link show when hover handle, which might be + // below or upper than sizeExtent. + + + pos[1] = mathMin$a(mathMax$a(0, pos[1]), itemSize[1]); + + self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]); + } + }).on('mouseout', function () { + // When mouse is out of handle, hoverLink still need + // to be displayed when realtime is set as false. + self._hovering = false; + !self._dragging && self._clearHoverLinkToSeries(); + }); + }; + + ContinuousView.prototype._enableHoverLinkFromSeries = function () { + var zr = this.api.getZr(); + + if (this.visualMapModel.option.hoverLink) { + zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this); + zr.on('mouseout', this._hideIndicator, this); + } else { + this._clearHoverLinkFromSeries(); + } + }; + + ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) { + var visualMapModel = this.visualMapModel; + var itemSize = visualMapModel.itemSize; + + if (!visualMapModel.option.hoverLink) { + return; + } + + var sizeExtent = [0, itemSize[1]]; + var dataExtent = visualMapModel.getExtent(); // For hover link show when hover handle, which might be below or upper than sizeExtent. + + cursorPos = mathMin$a(mathMax$a(sizeExtent[0], cursorPos), sizeExtent[1]); + var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); + var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; + var cursorValue = linearMap$2(cursorPos, sizeExtent, dataExtent, true); + var valueRange = [linearMap$2(hoverRange[0], sizeExtent, dataExtent, true), linearMap$2(hoverRange[1], sizeExtent, dataExtent, true)]; // Consider data range is out of visualMap range, see test/visualMap-continuous.html, + // where china and india has very large population. + + hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); + hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); // Do not show indicator when mouse is over handle, + // otherwise labels overlap, especially when dragging. + + if (hoverOnBar) { + if (valueRange[0] === -Infinity) { + this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize); + } else if (valueRange[1] === Infinity) { + this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize); + } else { + this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize); + } + } // When realtime is set as false, handles, which are in barGroup, + // also trigger hoverLink, which help user to realize where they + // focus on when dragging. (see test/heatmap-large.html) + // When realtime is set as true, highlight will not show when hover + // handle, because the label on handle, which displays a exact value + // but not range, might mislead users. + + + var oldBatch = this._hoverLinkDataIndices; + var newBatch = []; + + if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { + newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); + } + + var resultBatches = compressBatches(oldBatch, newBatch); + + this._dispatchHighDown('downplay', makeHighDownBatch(resultBatches[0], visualMapModel)); + + this._dispatchHighDown('highlight', makeHighDownBatch(resultBatches[1], visualMapModel)); + }; + + ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) { + var ecData; + findEventDispatcher(e.target, function (target) { + var currECData = getECData(target); + + if (currECData.dataIndex != null) { + ecData = currECData; + return true; + } + }, true); + + if (!ecData) { + return; + } + + var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); + var visualMapModel = this.visualMapModel; + + if (!visualMapModel.isTargetSeries(dataModel)) { + return; + } + + var data = dataModel.getData(ecData.dataType); + var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex); + + if (!isNaN(value)) { + this._showIndicator(value, value); + } + }; + + ContinuousView.prototype._hideIndicator = function () { + var shapes = this._shapes; + shapes.indicator && shapes.indicator.attr('invisible', true); + shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true); + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.leaveBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._clearHoverLinkToSeries = function () { + this._hideIndicator(); + + var indices = this._hoverLinkDataIndices; + + this._dispatchHighDown('downplay', makeHighDownBatch(indices, this.visualMapModel)); + + indices.length = 0; + }; + + ContinuousView.prototype._clearHoverLinkFromSeries = function () { + this._hideIndicator(); + + var zr = this.api.getZr(); + zr.off('mouseover', this._hoverLinkFromSeriesMouseOver); + zr.off('mouseout', this._hideIndicator); + }; + + ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) { + var transform = getTransform(element, global ? null : this.group); + return isArray(vertex) ? applyTransform$1(vertex, transform, inverse) : transformDirection(vertex, transform, inverse); + }; // TODO: TYPE more specified payload types. + + + ContinuousView.prototype._dispatchHighDown = function (type, batch) { + batch && batch.length && this.api.dispatchAction({ + type: type, + batch: batch + }); + }; + /** + * @override + */ + + + ContinuousView.prototype.dispose = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + /** + * @override + */ + + + ContinuousView.prototype.remove = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + + ContinuousView.type = 'visualMap.continuous'; + return ContinuousView; + }(VisualMapView); + + function createPolygon(points, cursor, onDrift, onDragEnd) { + return new Polygon({ + shape: { + points: points + }, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift, + onmousemove: function (e) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd + }); + } + + function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { + var halfHoverLinkSize = HOVER_LINK_SIZE / 2; + var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize'); + + if (hoverLinkDataSize) { + halfHoverLinkSize = linearMap$2(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; + } + + return halfHoverLinkSize; + } + + function useHoverLinkOnHandle(visualMapModel) { + var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle'); + return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle); + } + + function getCursor$1(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + /* + * 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. + */ + + /* + * 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. + */ + var visualMapActionInfo = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' + }; + var visualMapActionHander = function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'visualMap', + query: payload + }, function (model) { + model.setSelected(payload.selected); + }); + }; + + var visualMapEncodingHandlers = [{ + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var resetDefines = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + var pipelineContext = seriesModel.pipelineContext; + + if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) { + return; + } + + resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData()))); + }); + return resetDefines; + } + }, // Only support color. + { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var visualMetaList = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + if (visualMapModel.isTargetSeries(seriesModel)) { + var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || { + stops: [], + outerColors: [] + }; + var dimIdx = visualMapModel.getDataDimensionIndex(data); + + if (dimIdx >= 0) { + // visualMeta.dimension should be dimension index, but not concrete dimension. + visualMeta.dimension = dimIdx; + visualMetaList.push(visualMeta); + } + } + }); // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); + + seriesModel.getData().setVisual('visualMeta', visualMetaList); + } + }]; // FIXME + // performance and export for heatmap? + // value can be Infinity or -Infinity + + function getColorVisual(seriesModel, visualMapModel, value, valueState) { + var mappings = visualMapModel.targetVisuals[valueState]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + var resultVisual = { + color: getVisualFromData(seriesModel.getData(), 'color') // default color. + + }; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type]; + mapping && mapping.applyVisual(value, getVisual, setVisual); + } + + return resultVisual.color; + + function getVisual(key) { + return resultVisual[key]; + } + + function setVisual(key, value) { + resultVisual[key] = value; + } + } + + var each$f = each; + function visualMapPreprocessor(option) { + var visualMap = option && option.visualMap; + + if (!isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each$f(visualMap, function (opt) { + if (!opt) { + return; + } // rename splitList to pieces + + + if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + + if (pieces && isArray(pieces)) { + each$f(pieces, function (piece) { + if (isObject(piece)) { + if (has$1(piece, 'start') && !has$1(piece, 'min')) { + piece.min = piece.start; + } + + if (has$1(piece, 'end') && !has$1(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); + } + + function has$1(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); + } + + var installed$1 = false; + function installCommon$1(registers) { + if (installed$1) { + return; + } + + installed$1 = true; + registers.registerSubTypeDefaulter('visualMap', function (option) { + // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. + return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise'; + }); + registers.registerAction(visualMapActionInfo, visualMapActionHander); + each(visualMapEncodingHandlers, function (handler) { + registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler); + }); + registers.registerPreprocessor(visualMapPreprocessor); + } + + function install$N(registers) { + registers.registerComponentModel(ContinuousModel); + registers.registerComponentView(ContinuousView); + installCommon$1(registers); + } + + var PiecewiseModel = + /** @class */ + function (_super) { + __extends(PiecewiseModel, _super); + + function PiecewiseModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseModel.type; + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.}, ...] + */ + + _this._pieceList = []; + return _this; + } + + PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + + var mode = this._mode = this._determineMode(); + + this._pieceList = []; + + resetMethods[this._mode].call(this, this._pieceList); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = clone(categories); + } else { + mappingOption.dataExtent = this.getExtent(); + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = map(this._pieceList, function (piece) { + piece = clone(piece); + + if (state !== 'inRange') { + // FIXME + // outOfRange do not support special visual in pieces. + piece.visual = null; + } + + return piece; + }); + } + }); + }; + /** + * @protected + * @override + */ + + + PiecewiseModel.prototype.completeVisualOption = function () { + // Consider this case: + // visualMap: { + // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] + // } + // where no inRange/outOfRange set but only pieces. So we should make + // default inRange/outOfRange for this case, otherwise visuals that only + // appear in `pieces` will not be taken into account in visual encoding. + var option = this.option; + var visualTypesInPieces = {}; + var visualTypes = VisualMapping.listVisualTypes(); + var isCategory = this.isCategory(); + each(option.pieces, function (piece) { + each(visualTypes, function (visualType) { + if (piece.hasOwnProperty(visualType)) { + visualTypesInPieces[visualType] = 1; + } + }); + }); + each(visualTypesInPieces, function (v, visualType) { + var exists = false; + each(this.stateList, function (state) { + exists = exists || has(option, state, visualType) || has(option.target, state, visualType); + }, this); + !exists && each(this.stateList, function (state) { + (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory); + }); + }, this); + + function has(obj, state, visualType) { + return obj && obj[state] && obj[state].hasOwnProperty(visualType); + } + + _super.prototype.completeVisualOption.apply(this, arguments); + }; + + PiecewiseModel.prototype._resetSelected = function (newOption, isInit) { + var thisOption = this.option; + var pieceList = this._pieceList; // Selected do not merge but all override. + + var selected = (isInit ? thisOption : newOption).selected || {}; + thisOption.selected = selected; // Consider 'not specified' means true. + + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (!selected.hasOwnProperty(key)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel_1 = false; + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (selected[key]) { + hasSel_1 ? selected[key] = false : hasSel_1 = true; + } + }, this); + } // thisOption.selectedMode === 'multiple', default: all selected. + + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getItemSymbol = function () { + return this.get('itemSymbol'); + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getSelectedMapKey = function (piece) { + return this._mode === 'categories' ? piece.value + '' : piece.index + ''; + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getPieceList = function () { + return this._pieceList; + }; + /** + * @return {string} + */ + + + PiecewiseModel.prototype._determineMode = function () { + var option = this.option; + return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber'; + }; + /** + * @override + */ + + + PiecewiseModel.prototype.setSelected = function (selected) { + this.option.selected = clone(selected); + }; + /** + * @override + */ + + + PiecewiseModel.prototype.getValueState = function (value) { + var index = VisualMapping.findPieceIndex(value, this._pieceList); + return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange'; + }; + /** + * @public + * @param pieceIndex piece index in visualMapModel.getPieceList() + */ + + + PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) { + var result = []; + var pieceList = this._pieceList; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + // Should always base on model pieceList, because it is order sensitive. + var pIdx = VisualMapping.findPieceIndex(value, pieceList); + pIdx === pieceIndex && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @private + * @param piece piece.value or piece.interval is required. + * @return Can be Infinity or -Infinity + */ + + + PiecewiseModel.prototype.getRepresentValue = function (piece) { + var representValue; + + if (this.isCategory()) { + representValue = piece.value; + } else { + if (piece.value != null) { + representValue = piece.value; + } else { + var pieceInterval = piece.interval || []; + representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + + return representValue; + }; + + PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) { + // Do not support category. (category axis is ordinal, numerical) + if (this.isCategory()) { + return; + } + + var stops = []; + var outerColors = ['', '']; + var visualMapModel = this; + + function setStop(interval, valueState) { + var representValue = visualMapModel.getRepresentValue({ + interval: interval + }); // Not category + + if (!valueState) { + valueState = visualMapModel.getValueState(representValue); + } + + var color = getColorVisual(representValue, valueState); + + if (interval[0] === -Infinity) { + outerColors[0] = color; + } else if (interval[1] === Infinity) { + outerColors[1] = color; + } else { + stops.push({ + value: interval[0], + color: color + }, { + value: interval[1], + color: color + }); + } + } // Suplement + + + var pieceList = this._pieceList.slice(); + + if (!pieceList.length) { + pieceList.push({ + interval: [-Infinity, Infinity] + }); + } else { + var edge = pieceList[0].interval[0]; + edge !== -Infinity && pieceList.unshift({ + interval: [-Infinity, edge] + }); + edge = pieceList[pieceList.length - 1].interval[1]; + edge !== Infinity && pieceList.push({ + interval: [edge, Infinity] + }); + } + + var curr = -Infinity; + each(pieceList, function (piece) { + var interval = piece.interval; + + if (interval) { + // Fulfill gap. + interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); + setStop(interval.slice()); + curr = interval[1]; + } + }, this); + return { + stops: stops, + outerColors: outerColors + }; + }; + + PiecewiseModel.type = 'visualMap.piecewise'; + PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + selected: null, + minOpen: false, + maxOpen: false, + align: 'auto', + itemWidth: 20, + itemHeight: 14, + itemSymbol: 'roundRect', + pieces: null, + categories: null, + splitNumber: 5, + selectedMode: 'multiple', + itemGap: 10, + hoverLink: true // Enable hover highlight. + + }); + return PiecewiseModel; + }(VisualMapModel); + /** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ + + var resetMethods = { + splitNumber: function (outPieceList) { + var thisOption = this.option; + var precision = Math.min(thisOption.precision, 20); + var dataExtent = this.getExtent(); + var splitNumber = thisOption.splitNumber; + splitNumber = Math.max(parseInt(splitNumber, 10), 1); + thisOption.splitNumber = splitNumber; + var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; // Precision auto-adaption + + while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { + precision++; + } + + thisOption.precision = precision; + splitStep = +splitStep.toFixed(precision); + + if (thisOption.minOpen) { + outPieceList.push({ + interval: [-Infinity, dataExtent[0]], + close: [0, 0] + }); + } + + for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { + var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; + outPieceList.push({ + interval: [curr, max], + close: [1, 1] + }); + } + + if (thisOption.maxOpen) { + outPieceList.push({ + interval: [dataExtent[1], Infinity], + close: [0, 0] + }); + } + + reformIntervals(outPieceList); + each(outPieceList, function (piece, index) { + piece.index = index; + piece.text = this.formatValueText(piece.interval); + }, this); + }, + categories: function (outPieceList) { + var thisOption = this.option; + each(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + outPieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); + }, + pieces: function (outPieceList) { + var thisOption = this.option; + each(thisOption.pieces, function (pieceListItem, index) { + if (!isObject(pieceListItem)) { + pieceListItem = { + value: pieceListItem + }; + } + + var item = { + text: '', + index: index + }; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + } + + if (pieceListItem.hasOwnProperty('value')) { + var value = item.value = pieceListItem.value; + item.interval = [value, value]; + item.close = [1, 1]; + } else { + // `min` `max` is legacy option. + // `lt` `gt` `lte` `gte` is recommended. + var interval = item.interval = []; + var close_1 = item.close = [0, 0]; + var closeList = [1, 0, 1]; + var infinityList = [-Infinity, Infinity]; + var useMinMax = []; + + for (var lg = 0; lg < 2; lg++) { + var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; + + for (var i = 0; i < 3 && interval[lg] == null; i++) { + interval[lg] = pieceListItem[names[i]]; + close_1[lg] = closeList[i]; + useMinMax[lg] = i === 2; + } + + interval[lg] == null && (interval[lg] = infinityList[lg]); + } + + useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); + useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); + + if ("development" !== 'production') { + if (interval[0] > interval[1]) { + console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.'); + } + } + + if (interval[0] === interval[1] && close_1[0] && close_1[1]) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = interval[0]; + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + outPieceList.push(item); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); // Only pieces + + reformIntervals(outPieceList); + each(outPieceList, function (piece) { + var close = piece.close; + var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; + piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); + }, this); + } + }; + + function normalizeReverse(thisOption, pieceList) { + var inverse = thisOption.inverse; + + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + pieceList.reverse(); + } + } + + var PiecewiseVisualMapView = + /** @class */ + function (_super) { + __extends(PiecewiseVisualMapView, _super); + + function PiecewiseVisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseVisualMapView.type; + return _this; + } + + PiecewiseVisualMapView.prototype.doRender = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var textStyleModel = visualMapModel.textStyleModel; + var textFont = textStyleModel.getFont(); + var textFill = textStyleModel.getTextColor(); + + var itemAlign = this._getItemAlign(); + + var itemSize = visualMapModel.itemSize; + + var viewData = this._getViewData(); + + var endsText = viewData.endsText; + var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText); + endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign); + each(viewData.viewPieceList, function (item) { + var piece = item.piece; + var itemGroup = new Group(); + itemGroup.onclick = bind(this._onItemClick, this, piece); + + this._enableHoverLink(itemGroup, item.indexInModelPieceList); // TODO Category + + + var representValue = visualMapModel.getRepresentValue(piece); + + this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]); + + if (showLabel) { + var visualState = this.visualMapModel.getValueState(representValue); + itemGroup.add(new ZRText({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: piece.text, + verticalAlign: 'middle', + align: itemAlign, + font: textFont, + fill: textFill, + opacity: visualState === 'outOfRange' ? 0.5 : 1 + } + })); + } + + thisGroup.add(itemGroup); + }, this); + endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign); + box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')); + this.renderBackground(thisGroup); + this.positionGroup(thisGroup); + }; + + PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) { + var _this = this; + + itemGroup.on('mouseover', function () { + return onHoverLink('highlight'); + }).on('mouseout', function () { + return onHoverLink('downplay'); + }); + + var onHoverLink = function (method) { + var visualMapModel = _this.visualMapModel; // TODO: TYPE More detailed action types + + visualMapModel.option.hoverLink && _this.api.dispatchAction({ + type: method, + batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel) + }); + }; + }; + + PiecewiseVisualMapView.prototype._getItemAlign = function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + + if (modelOption.orient === 'vertical') { + return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize); + } else { + // horizontal, most case left unless specifying right. + var align = modelOption.align; + + if (!align || align === 'auto') { + align = 'left'; + } + + return align; + } + }; + + PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) { + if (!text) { + return; + } + + var itemGroup = new Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2, + y: itemSize[1] / 2, + verticalAlign: 'middle', + align: showLabel ? itemAlign : 'center', + text: text + }) + })); + group.add(itemGroup); + }; + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + + + PiecewiseVisualMapView.prototype._getViewData = function () { + var visualMapModel = this.visualMapModel; + var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) { + return { + piece: piece, + indexInModelPieceList: index + }; + }); + var endsText = visualMapModel.get('text'); // Consider orient and inverse. + + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); // Order of model pieceList is always [low, ..., high] + + if (orient === 'horizontal' ? inverse : !inverse) { + viewPieceList.reverse(); + } // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return { + viewPieceList: viewPieceList, + endsText: endsText + }; + }; + + PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam) { + group.add(createSymbol( // symbol will be string + this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], // color will be string + this.getControllerVisual(representValue, 'color'))); + }; + + PiecewiseVisualMapView.prototype._onItemClick = function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + var selected = clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (selectedMode === 'single' || selectedMode === true) { + selected[newKey] = true; + each(selected, function (o, key) { + selected[key] = key === newKey; + }); + } else { + selected[newKey] = !selected[newKey]; + } + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: selected + }); + }; + + PiecewiseVisualMapView.type = 'visualMap.piecewise'; + return PiecewiseVisualMapView; + }(VisualMapView); + + function install$O(registers) { + registers.registerComponentModel(PiecewiseModel); + registers.registerComponentView(PiecewiseVisualMapView); + installCommon$1(registers); + } + + function install$P(registers) { + use(install$N); + use(install$O); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var DEFAULT_OPTION = { + label: { + enabled: true + }, + decal: { + show: false + } + }; + var inner$l = makeInner(); + var decalPaletteScope = {}; + function ariaVisual(ecModel, api) { + var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`. + + if (!ariaModel.get('enabled')) { + return; + } + + var defaultOption = clone(DEFAULT_OPTION); + merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false); + merge(ariaModel.option, defaultOption, false); + setDecal(); + setLabel(); + + function setDecal() { + var decalModel = ariaModel.getModel('decal'); + var useDecal = decalModel.get('show'); + + if (useDecal) { + // Each type of series use one scope. + // Pie and funnel are using different scopes. + var paletteScopeGroupByType_1 = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries()) { + return; + } + + var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); + + if (!decalScope) { + decalScope = {}; + paletteScopeGroupByType_1.set(seriesModel.type, decalScope); + } + + inner$l(seriesModel).scope = decalScope; + }); + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + if (isFunction(seriesModel.enableAriaDecal)) { + // Let series define how to use decal palette on data + seriesModel.enableAriaDecal(); + return; + } + + var data = seriesModel.getData(); + + if (!seriesModel.isColorBySeries()) { + var dataAll_1 = seriesModel.getRawData(); + var idxMap_1 = {}; + var decalScope_1 = inner$l(seriesModel).scope; + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap_1[rawIdx] = idx; + }); + var dataCount_1 = dataAll_1.count(); + dataAll_1.each(function (rawIdx) { + var idx = idxMap_1[rawIdx]; + var name = dataAll_1.getName(rawIdx) || rawIdx + ''; + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); + var specifiedDecal = data.getItemVisual(idx, 'decal'); + data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal)); + }); + } else { + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); + var specifiedDecal = data.getVisual('decal'); + data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal)); + } + + function mergeDecal(specifiedDecal, paletteDecal) { + // Merge decal from palette to decal from itemStyle. + // User do not need to specify all of the decal props. + var resultDecal = specifiedDecal ? extend(extend({}, paletteDecal), specifiedDecal) : paletteDecal; + resultDecal.dirty = true; + return resultDecal; + } + }); + } + } + + function setLabel() { + var labelLocale = ecModel.getLocaleModel().get('aria'); + var labelModel = ariaModel.getModel('label'); + labelModel.option = defaults(labelModel.option, labelLocale); + + if (!labelModel.get('enabled')) { + return; + } + + var dom = api.getZr().dom; + + if (labelModel.get('description')) { + dom.setAttribute('aria-label', labelModel.get('description')); + return; + } + + var seriesCnt = ecModel.getSeriesCount(); + var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10; + var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10; + var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); + var ariaLabel; + + if (seriesCnt < 1) { + // No series, no aria label + return; + } else { + var title = getTitle(); + + if (title) { + var withTitle = labelModel.get(['general', 'withTitle']); + ariaLabel = replace(withTitle, { + title: title + }); + } else { + ariaLabel = labelModel.get(['general', 'withoutTitle']); + } + + var seriesLabels_1 = []; + var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']); + ariaLabel += replace(prefix, { + seriesCount: seriesCnt + }); + ecModel.eachSeries(function (seriesModel, idx) { + if (idx < displaySeriesCnt) { + var seriesLabel = void 0; + var seriesName = seriesModel.get('name'); + var withName = seriesName ? 'withName' : 'withoutName'; + seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]); + seriesLabel = replace(seriesLabel, { + seriesId: seriesModel.seriesIndex, + seriesName: seriesModel.get('name'), + seriesType: getSeriesTypeName(seriesModel.subType) + }); + var data = seriesModel.getData(); + + if (data.count() > maxDataCnt) { + // Show part of data + var partialLabel = labelModel.get(['data', 'partialData']); + seriesLabel += replace(partialLabel, { + displayCnt: maxDataCnt + }); + } else { + seriesLabel += labelModel.get(['data', 'allData']); + } + + var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']); + var endSeparator_1 = labelModel.get(['data', 'separator', 'end']); + var dataLabels = []; + + for (var i = 0; i < data.count(); i++) { + if (i < maxDataCnt) { + var name_1 = data.getName(i); + var value = data.getValues(i); + var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']); + dataLabels.push(replace(dataLabel, { + name: name_1, + value: value.join(middleSeparator_1) + })); + } + } + + seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; + seriesLabels_1.push(seriesLabel); + } + }); + var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']); + var middleSeparator = separatorModel.get('middle'); + var endSeparator = separatorModel.get('end'); + ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; + dom.setAttribute('aria-label', ariaLabel); + } + } + + function replace(str, keyValues) { + if (!isString(str)) { + return str; + } + + var result = str; + each(keyValues, function (value, key) { + result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value); + }); + return result; + } + + function getTitle() { + var title = ecModel.get('title'); + + if (title && title.length) { + title = title[0]; + } + + return title && title.text; + } + + function getSeriesTypeName(type) { + return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图'; + } + } + + function ariaPreprocessor(option) { + if (!option || !option.aria) { + return; + } + + var aria = option.aria; // aria.show is deprecated and should use aria.enabled instead + + if (aria.show != null) { + aria.enabled = aria.show; + } + + aria.label = aria.label || {}; // move description, general, series, data to be under aria.label + + each(['description', 'general', 'series', 'data'], function (name) { + if (aria[name] != null) { + aria.label[name] = aria[name]; + } + }); + } + + function install$Q(registers) { + registers.registerPreprocessor(ariaPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual); + } + + var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { + value: 'eq', + // PENDING: not good for literal semantic? + '<': 'lt', + '<=': 'lte', + '>': 'gt', + '>=': 'gte', + '=': 'eq', + '!=': 'ne', + '<>': 'ne' // Might be misleading for sake of the difference between '==' and '===', + // so don't support them. + // '==': 'eq', + // '===': 'seq', + // '!==': 'sne' + // PENDING: Whether support some common alias "ge", "le", "neq"? + // ge: 'gte', + // le: 'lte', + // neq: 'ne', + + }; // type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean; + + var RegExpEvaluator = + /** @class */ + function () { + function RegExpEvaluator(rVal) { + // Support condVal: RegExp | string + var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; + + if (condValue == null) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Illegal regexp', rVal, 'in'); + } + + throwError(errMsg); + } + } + + RegExpEvaluator.prototype.evaluate = function (lVal) { + var type = typeof lVal; + return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false; + }; + + return RegExpEvaluator; + }(); + + var ConstConditionInternal = + /** @class */ + function () { + function ConstConditionInternal() {} + + ConstConditionInternal.prototype.evaluate = function () { + return this.value; + }; + + return ConstConditionInternal; + }(); + + var AndConditionInternal = + /** @class */ + function () { + function AndConditionInternal() {} + + AndConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (!children[i].evaluate()) { + return false; + } + } + + return true; + }; + + return AndConditionInternal; + }(); + + var OrConditionInternal = + /** @class */ + function () { + function OrConditionInternal() {} + + OrConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (children[i].evaluate()) { + return true; + } + } + + return false; + }; + + return OrConditionInternal; + }(); + + var NotConditionInternal = + /** @class */ + function () { + function NotConditionInternal() {} + + NotConditionInternal.prototype.evaluate = function () { + return !this.child.evaluate(); + }; + + return NotConditionInternal; + }(); + + var RelationalConditionInternal = + /** @class */ + function () { + function RelationalConditionInternal() {} + + RelationalConditionInternal.prototype.evaluate = function () { + var needParse = !!this.valueParser; // Call getValue with no `this`. + + var getValue = this.getValue; + var tarValRaw = getValue(this.valueGetterParam); + var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; // Relational cond follow "and" logic internally. + + for (var i = 0; i < this.subCondList.length; i++) { + if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { + return false; + } + } + + return true; + }; + + return RelationalConditionInternal; + }(); + + function parseOption(exprOption, getters) { + if (exprOption === true || exprOption === false) { + var cond = new ConstConditionInternal(); + cond.value = exprOption; + return cond; + } + + var errMsg = ''; + + if (!isObjectNotArray(exprOption)) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption); + } + + throwError(errMsg); + } + + if (exprOption.and) { + return parseAndOrOption('and', exprOption, getters); + } else if (exprOption.or) { + return parseAndOrOption('or', exprOption, getters); + } else if (exprOption.not) { + return parseNotOption(exprOption, getters); + } + + return parseRelationalOption(exprOption, getters); + } + + function parseAndOrOption(op, exprOption, getters) { + var subOptionArr = exprOption[op]; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"and"/"or" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption); + } + + if (!isArray(subOptionArr)) { + throwError(errMsg); + } + + if (!subOptionArr.length) { + throwError(errMsg); + } + + var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal(); + cond.children = map(subOptionArr, function (subOption) { + return parseOption(subOption, getters); + }); + + if (!cond.children.length) { + throwError(errMsg); + } + + return cond; + } + + function parseNotOption(exprOption, getters) { + var subOption = exprOption.not; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"not" condition should only be `not: {}`.', 'Illegal condition:', exprOption); + } + + if (!isObjectNotArray(subOption)) { + throwError(errMsg); + } + + var cond = new NotConditionInternal(); + cond.child = parseOption(subOption, getters); + + if (!cond.child) { + throwError(errMsg); + } + + return cond; + } + + function parseRelationalOption(exprOption, getters) { + var errMsg = ''; + var valueGetterParam = getters.prepareGetValue(exprOption); + var subCondList = []; + var exprKeys = keys(exprOption); + var parserName = exprOption.parser; + var valueParser = parserName ? getRawValueParser(parserName) : null; + + for (var i = 0; i < exprKeys.length; i++) { + var keyRaw = exprKeys[i]; + + if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) { + continue; + } + + var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; + var condValueRaw = exprOption[keyRaw]; + var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; + var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed); + + if (!evaluator) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal relational operation: "' + keyRaw + '" in condition:', exprOption); + } + + throwError(errMsg); + } + + subCondList.push(evaluator); + } + + if (!subCondList.length) { + if ("development" !== 'production') { + errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption); + } // No relational operator always disabled in case of dangers result. + + + throwError(errMsg); + } + + var cond = new RelationalConditionInternal(); + cond.valueGetterParam = valueGetterParam; + cond.valueParser = valueParser; + cond.getValue = getters.getValue; + cond.subCondList = subCondList; + return cond; + } + + function isObjectNotArray(val) { + return isObject(val) && !isArrayLike(val); + } + + var ConditionalExpressionParsed = + /** @class */ + function () { + function ConditionalExpressionParsed(exprOption, getters) { + this._cond = parseOption(exprOption, getters); + } + + ConditionalExpressionParsed.prototype.evaluate = function () { + return this._cond.evaluate(); + }; + + return ConditionalExpressionParsed; + }(); + function parseConditionalExpression(exprOption, getters) { + return new ConditionalExpressionParsed(exprOption, getters); + } + + var filterTransform = { + type: 'echarts:filter', + // PENDING: enhance to filter by index rather than create new data + transform: function (params) { + // [Caveat] Fail-Fast: + // Do not return the whole dataset unless user config indicates it explicitly. + // For example, if no condition is specified by mistake, returning an empty result + // is better than returning the entire raw source for the user to find the mistake. + var upstream = params.upstream; + var rawItem; + var condition = parseConditionalExpression(params.config, { + valueGetterAttrMap: createHashMap({ + dimension: true + }), + prepareGetValue: function (exprOption) { + var errMsg = ''; + var dimLoose = exprOption.dimension; + + if (!hasOwn(exprOption, 'dimension')) { + if ("development" !== 'production') { + errMsg = makePrintable('Relation condition must has prop "dimension" specified.', 'Illegal condition:', exprOption); + } + + throwError(errMsg); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal condition:', exprOption, '.\n'); + } + + throwError(errMsg); + } + + return { + dimIdx: dimInfo.index + }; + }, + getValue: function (param) { + return upstream.retrieveValueFromItem(rawItem, param.dimIdx); + } + }); + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + rawItem = upstream.getRawDataItem(i); + + if (condition.evaluate()) { + resultData.push(rawItem); + } + } + + return { + data: resultData + }; + } + }; + + var sampleLog = ''; + + if ("development" !== 'production') { + sampleLog = ['Valid config is like:', '{ dimension: "age", order: "asc" }', 'or [{ dimension: "age", order: "asc"], { dimension: "date", order: "desc" }]'].join(' '); + } + + var sortTransform = { + type: 'echarts:sort', + transform: function (params) { + var upstream = params.upstream; + var config = params.config; + var errMsg = ''; // Normalize + // const orderExprList: OrderExpression[] = isArray(config[0]) + // ? config as OrderExpression[] + // : [config as OrderExpression]; + + var orderExprList = normalizeToArray(config); + + if (!orderExprList.length) { + if ("development" !== 'production') { + errMsg = 'Empty `config` in sort transform.'; + } + + throwError(errMsg); + } + + var orderDefList = []; + each(orderExprList, function (orderExpr) { + var dimLoose = orderExpr.dimension; + var order = orderExpr.order; + var parserName = orderExpr.parser; + var incomparable = orderExpr.incomparable; + + if (dimLoose == null) { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "dimension" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (order !== 'asc' && order !== 'desc') { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "order" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (incomparable && incomparable !== 'min' && incomparable !== 'max') { + var errMsg_1 = ''; + + if ("development" !== 'production') { + errMsg_1 = 'incomparable must be "min" or "max" rather than "' + incomparable + '".'; + } + + throwError(errMsg_1); + } + + if (order !== 'asc' && order !== 'desc') { + var errMsg_2 = ''; + + if ("development" !== 'production') { + errMsg_2 = 'order must be "asc" or "desc" rather than "' + order + '".'; + } + + throwError(errMsg_2); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + var parser = parserName ? getRawValueParser(parserName) : null; + + if (parserName && !parser) { + if ("development" !== 'production') { + errMsg = makePrintable('Invalid parser name ' + parserName + '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + orderDefList.push({ + dimIdx: dimInfo.index, + parser: parser, + comparator: new SortOrderComparator(order, incomparable) + }); + }); // TODO: support it? + + var sourceFormat = upstream.sourceFormat; + + if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) { + if ("development" !== 'production') { + errMsg = 'sourceFormat "' + sourceFormat + '" is not supported yet'; + } + + throwError(errMsg); + } // Other upstream format are all array. + + + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + resultData.push(upstream.getRawDataItem(i)); + } + + resultData.sort(function (item0, item1) { + for (var i = 0; i < orderDefList.length; i++) { + var orderDef = orderDefList[i]; + var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx); + var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx); + + if (orderDef.parser) { + val0 = orderDef.parser(val0); + val1 = orderDef.parser(val1); + } + + var result = orderDef.comparator.evaluate(val0, val1); + + if (result !== 0) { + return result; + } + } + + return 0; + }); + return { + data: resultData + }; + } + }; + + function install$R(registers) { + registers.registerTransform(filterTransform); + registers.registerTransform(sortTransform); + } + + var DatasetModel = + /** @class */ + function (_super) { + __extends(DatasetModel, _super); + + function DatasetModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetModel.prototype.init = function (option, parentModel, ecModel) { + _super.prototype.init.call(this, option, parentModel, ecModel); + + this._sourceManager = new SourceManager(this); + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.mergeOption = function (newOption, ecModel) { + _super.prototype.mergeOption.call(this, newOption, ecModel); + + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.optionUpdated = function () { + this._sourceManager.dirty(); + }; + + DatasetModel.prototype.getSourceManager = function () { + return this._sourceManager; + }; + + DatasetModel.type = 'dataset'; + DatasetModel.defaultOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN + }; + return DatasetModel; + }(ComponentModel); + + var DatasetView = + /** @class */ + function (_super) { + __extends(DatasetView, _super); + + function DatasetView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetView.type = 'dataset'; + return DatasetView; + }(ComponentView); + + function install$S(registers) { + registers.registerComponentModel(DatasetModel); + registers.registerComponentView(DatasetView); + } + + var CMD$4 = PathProxy.CMD; + function aroundEqual(a, b) { + return Math.abs(a - b) < 1e-5; + } + function pathToBezierCurves(path) { + var data = path.data; + var len = path.len(); + var bezierArrayGroups = []; + var currentSubpath; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + function createNewSubpath(x, y) { + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + currentSubpath = [x, y]; + } + function addLine(x0, y0, x1, y1) { + if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) { + currentSubpath.push(x0, y0, x1, y1, x1, y1); + } + } + function addArc(startAngle, endAngle, cx, cy, rx, ry) { + var delta = Math.abs(endAngle - startAngle); + var len = Math.tan(delta / 4) * 4 / 3; + var dir = endAngle < startAngle ? -1 : 1; + var c1 = Math.cos(startAngle); + var s1 = Math.sin(startAngle); + var c2 = Math.cos(endAngle); + var s2 = Math.sin(endAngle); + var x1 = c1 * rx + cx; + var y1 = s1 * ry + cy; + var x4 = c2 * rx + cx; + var y4 = s2 * ry + cy; + var hx = rx * len * dir; + var hy = ry * len * dir; + currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4); + } + var x1; + var y1; + var x2; + var y2; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + if (cmd === CMD$4.L || cmd === CMD$4.C || cmd === CMD$4.Q) { + currentSubpath = [x0, y0]; + } + } + switch (cmd) { + case CMD$4.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + createNewSubpath(x0, y0); + break; + case CMD$4.L: + x1 = data[i++]; + y1 = data[i++]; + addLine(xi, yi, x1, y1); + xi = x1; + yi = y1; + break; + case CMD$4.C: + currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]); + break; + case CMD$4.Q: + x1 = data[i++]; + y1 = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2); + xi = x2; + yi = y2; + break; + case CMD$4.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + x1 = Math.cos(startAngle) * rx + cx; + y1 = Math.sin(startAngle) * ry + cy; + if (isFirst) { + x0 = x1; + y0 = y1; + createNewSubpath(x0, y0); + } + else { + addLine(xi, yi, x1, y1); + } + xi = Math.cos(endAngle) * rx + cx; + yi = Math.sin(endAngle) * ry + cy; + var step = (anticlockwise ? -1 : 1) * Math.PI / 2; + for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) { + var nextAngle = anticlockwise ? Math.max(angle + step, endAngle) + : Math.min(angle + step, endAngle); + addArc(angle, nextAngle, cx, cy, rx, ry); + } + break; + case CMD$4.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + x1 = x0 + data[i++]; + y1 = y0 + data[i++]; + createNewSubpath(x1, y0); + addLine(x1, y0, x1, y1); + addLine(x1, y1, x0, y1); + addLine(x0, y1, x0, y0); + addLine(x0, y0, x1, y0); + break; + case CMD$4.Z: + currentSubpath && addLine(xi, yi, x0, y0); + xi = x0; + yi = y0; + break; + } + } + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + return bezierArrayGroups; + } + function adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) { + if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) { + out.push(x3, y3); + return; + } + var PIXEL_DISTANCE = 2 / scale; + var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE; + var dx = x3 - x0; + var dy = y3 - y0; + var d = Math.sqrt(dx * dx + dy * dy); + dx /= d; + dy /= d; + var dx1 = x1 - x0; + var dy1 = y1 - y0; + var dx2 = x2 - x3; + var dy2 = y2 - y3; + var cp1LenSqr = dx1 * dx1 + dy1 * dy1; + var cp2LenSqr = dx2 * dx2 + dy2 * dy2; + if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) { + out.push(x3, y3); + return; + } + var projLen1 = dx * dx1 + dy * dy1; + var projLen2 = -dx * dx2 - dy * dy2; + var d1Sqr = cp1LenSqr - projLen1 * projLen1; + var d2Sqr = cp2LenSqr - projLen2 * projLen2; + if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0 + && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) { + out.push(x3, y3); + return; + } + var tmpSegX = []; + var tmpSegY = []; + cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY); + adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale); + adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale); + } + function pathToPolygons(path, scale) { + var bezierArrayGroups = pathToBezierCurves(path); + var polygons = []; + scale = scale || 1; + for (var i = 0; i < bezierArrayGroups.length; i++) { + var beziers = bezierArrayGroups[i]; + var polygon = []; + var x0 = beziers[0]; + var y0 = beziers[1]; + polygon.push(x0, y0); + for (var k = 2; k < beziers.length;) { + var x1 = beziers[k++]; + var y1 = beziers[k++]; + var x2 = beziers[k++]; + var y2 = beziers[k++]; + var x3 = beziers[k++]; + var y3 = beziers[k++]; + adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale); + x0 = x3; + y0 = y3; + } + polygons.push(polygon); + } + return polygons; + } + + function getDividingGrids(dimSize, rowDim, count) { + var rowSize = dimSize[rowDim]; + var columnSize = dimSize[1 - rowDim]; + var ratio = Math.abs(rowSize / columnSize); + var rowCount = Math.ceil(Math.sqrt(ratio * count)); + var columnCount = Math.floor(count / rowCount); + if (columnCount === 0) { + columnCount = 1; + rowCount = count; + } + var grids = []; + for (var i = 0; i < rowCount; i++) { + grids.push(columnCount); + } + var currentCount = rowCount * columnCount; + var remained = count - currentCount; + if (remained > 0) { + for (var i = 0; i < remained; i++) { + grids[i % rowCount] += 1; + } + } + return grids; + } + function divideSector(sectorShape, count, outShapes) { + var r0 = sectorShape.r0; + var r = sectorShape.r; + var startAngle = sectorShape.startAngle; + var endAngle = sectorShape.endAngle; + var angle = Math.abs(endAngle - startAngle); + var arcLen = angle * r; + var deltaR = r - r0; + var isAngleRow = arcLen > Math.abs(deltaR); + var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count); + var rowSize = (isAngleRow ? angle : deltaR) / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = (isAngleRow ? deltaR : angle) / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + if (isAngleRow) { + newShape.startAngle = startAngle + rowSize * row; + newShape.endAngle = startAngle + rowSize * (row + 1); + newShape.r0 = r0 + columnSize * column; + newShape.r = r0 + columnSize * (column + 1); + } + else { + newShape.startAngle = startAngle + columnSize * column; + newShape.endAngle = startAngle + columnSize * (column + 1); + newShape.r0 = r0 + rowSize * row; + newShape.r = r0 + rowSize * (row + 1); + } + newShape.clockwise = sectorShape.clockwise; + newShape.cx = sectorShape.cx; + newShape.cy = sectorShape.cy; + outShapes.push(newShape); + } + } + } + function divideRect(rectShape, count, outShapes) { + var width = rectShape.width; + var height = rectShape.height; + var isHorizontalRow = width > height; + var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count); + var rowSizeDim = isHorizontalRow ? 'width' : 'height'; + var columnSizeDim = isHorizontalRow ? 'height' : 'width'; + var rowDim = isHorizontalRow ? 'x' : 'y'; + var columnDim = isHorizontalRow ? 'y' : 'x'; + var rowSize = rectShape[rowSizeDim] / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = rectShape[columnSizeDim] / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + newShape[rowDim] = row * rowSize; + newShape[columnDim] = column * columnSize; + newShape[rowSizeDim] = rowSize; + newShape[columnSizeDim] = columnSize; + newShape.x += rectShape.x; + newShape.y += rectShape.y; + outShapes.push(newShape); + } + } + } + function crossProduct2d$1(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + function lineLineIntersect$1(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; + var nmCrossProduct = crossProduct2d$1(nx, ny, mx, my); + if (Math.abs(nmCrossProduct) < 1e-6) { + return null; + } + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var p = crossProduct2d$1(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + if (p < 0 || p > 1) { + return null; + } + return new Point(p * mx + a1x, p * my + a1y); + } + function projPtOnLine(pt, lineA, lineB) { + var dir = new Point(); + Point.sub(dir, lineB, lineA); + dir.normalize(); + var dir2 = new Point(); + Point.sub(dir2, pt, lineA); + var len = dir2.dot(dir); + return len; + } + function addToPoly(poly, pt) { + var last = poly[poly.length - 1]; + if (last && last[0] === pt[0] && last[1] === pt[1]) { + return; + } + poly.push(pt); + } + function splitPolygonByLine(points, lineA, lineB) { + var len = points.length; + var intersections = []; + for (var i = 0; i < len; i++) { + var p0 = points[i]; + var p1 = points[(i + 1) % len]; + var intersectionPt = lineLineIntersect$1(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y); + if (intersectionPt) { + intersections.push({ + projPt: projPtOnLine(intersectionPt, lineA, lineB), + pt: intersectionPt, + idx: i + }); + } + } + if (intersections.length < 2) { + return [{ points: points }, { points: points }]; + } + intersections.sort(function (a, b) { + return a.projPt - b.projPt; + }); + var splitPt0 = intersections[0]; + var splitPt1 = intersections[intersections.length - 1]; + if (splitPt1.idx < splitPt0.idx) { + var tmp = splitPt0; + splitPt0 = splitPt1; + splitPt1 = tmp; + } + var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y]; + var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y]; + var newPolyA = [splitPt0Arr]; + var newPolyB = [splitPt1Arr]; + for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) { + addToPoly(newPolyA, points[i].slice()); + } + addToPoly(newPolyA, splitPt1Arr); + addToPoly(newPolyA, splitPt0Arr); + for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) { + addToPoly(newPolyB, points[i % len].slice()); + } + addToPoly(newPolyB, splitPt0Arr); + addToPoly(newPolyB, splitPt1Arr); + return [{ + points: newPolyA + }, { + points: newPolyB + }]; + } + function binaryDividePolygon(polygonShape) { + var points = polygonShape.points; + var min = []; + var max = []; + fromPoints(points, min, max); + var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + var width = boundingRect.width; + var height = boundingRect.height; + var x = boundingRect.x; + var y = boundingRect.y; + var pt0 = new Point(); + var pt1 = new Point(); + if (width > height) { + pt0.x = pt1.x = x + width / 2; + pt0.y = y; + pt1.y = y + height; + } + else { + pt0.y = pt1.y = y + height / 2; + pt0.x = x; + pt1.x = x + width; + } + return splitPolygonByLine(points, pt0, pt1); + } + function binaryDivideRecursive(divider, shape, count, out) { + if (count === 1) { + out.push(shape); + } + else { + var mid = Math.floor(count / 2); + var sub = divider(shape); + binaryDivideRecursive(divider, sub[0], mid, out); + binaryDivideRecursive(divider, sub[1], count - mid, out); + } + return out; + } + function clone$4(path, count) { + var paths = []; + for (var i = 0; i < count; i++) { + paths.push(clonePath(path)); + } + return paths; + } + function copyPathProps(source, target) { + target.setStyle(source.style); + target.z = source.z; + target.z2 = source.z2; + target.zlevel = source.zlevel; + } + function polygonConvert(points) { + var out = []; + for (var i = 0; i < points.length;) { + out.push([points[i++], points[i++]]); + } + return out; + } + function split(path, count) { + var outShapes = []; + var shape = path.shape; + var OutShapeCtor; + switch (path.type) { + case 'rect': + divideRect(shape, count, outShapes); + OutShapeCtor = Rect; + break; + case 'sector': + divideSector(shape, count, outShapes); + OutShapeCtor = Sector; + break; + case 'circle': + divideSector({ + r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2, + cx: shape.cx, cy: shape.cy + }, count, outShapes); + OutShapeCtor = Sector; + break; + default: + var m = path.getComputedTransform(); + var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1; + var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { return polygonConvert(poly); }); + var polygonCount = polygons.length; + if (polygonCount === 0) { + binaryDivideRecursive(binaryDividePolygon, { + points: polygons[0] + }, count, outShapes); + } + else if (polygonCount === count) { + for (var i = 0; i < polygonCount; i++) { + outShapes.push({ + points: polygons[i] + }); + } + } + else { + var totalArea_1 = 0; + var items = map(polygons, function (poly) { + var min = []; + var max = []; + fromPoints(poly, min, max); + var area = (max[1] - min[1]) * (max[0] - min[0]); + totalArea_1 += area; + return { poly: poly, area: area }; + }); + items.sort(function (a, b) { return b.area - a.area; }); + var left = count; + for (var i = 0; i < polygonCount; i++) { + var item = items[i]; + if (left <= 0) { + break; + } + var selfCount = i === polygonCount - 1 + ? left + : Math.ceil(item.area / totalArea_1 * count); + if (selfCount < 0) { + continue; + } + binaryDivideRecursive(binaryDividePolygon, { + points: item.poly + }, selfCount, outShapes); + left -= selfCount; + } + } + OutShapeCtor = Polygon; + break; + } + if (!OutShapeCtor) { + return clone$4(path, count); + } + var out = []; + for (var i = 0; i < outShapes.length; i++) { + var subPath = new OutShapeCtor(); + subPath.setShape(outShapes[i]); + copyPathProps(path, subPath); + out.push(subPath); + } + return out; + } + + function alignSubpath(subpath1, subpath2) { + var len1 = subpath1.length; + var len2 = subpath2.length; + if (len1 === len2) { + return [subpath1, subpath2]; + } + var tmpSegX = []; + var tmpSegY = []; + var shorterPath = len1 < len2 ? subpath1 : subpath2; + var shorterLen = Math.min(len1, len2); + var diff = Math.abs(len2 - len1) / 6; + var shorterBezierCount = (shorterLen - 2) / 6; + var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1; + var newSubpath = [shorterPath[0], shorterPath[1]]; + var remained = diff; + for (var i = 2; i < shorterLen;) { + var x0 = shorterPath[i - 2]; + var y0 = shorterPath[i - 1]; + var x1 = shorterPath[i++]; + var y1 = shorterPath[i++]; + var x2 = shorterPath[i++]; + var y2 = shorterPath[i++]; + var x3 = shorterPath[i++]; + var y3 = shorterPath[i++]; + if (remained <= 0) { + newSubpath.push(x1, y1, x2, y2, x3, y3); + continue; + } + var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1; + for (var k = 1; k <= actualSubDivCount; k++) { + var p = k / actualSubDivCount; + cubicSubdivide(x0, x1, x2, x3, p, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, p, tmpSegY); + x0 = tmpSegX[3]; + y0 = tmpSegY[3]; + newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0); + x1 = tmpSegX[5]; + y1 = tmpSegY[5]; + x2 = tmpSegX[6]; + y2 = tmpSegY[6]; + } + remained -= actualSubDivCount - 1; + } + return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath]; + } + function createSubpath(lastSubpathSubpath, otherSubpath) { + var len = lastSubpathSubpath.length; + var lastX = lastSubpathSubpath[len - 2]; + var lastY = lastSubpathSubpath[len - 1]; + var newSubpath = []; + for (var i = 0; i < otherSubpath.length;) { + newSubpath[i++] = lastX; + newSubpath[i++] = lastY; + } + return newSubpath; + } + function alignBezierCurves(array1, array2) { + var _a; + var lastSubpath1; + var lastSubpath2; + var newArray1 = []; + var newArray2 = []; + for (var i = 0; i < Math.max(array1.length, array2.length); i++) { + var subpath1 = array1[i]; + var subpath2 = array2[i]; + var newSubpath1 = void 0; + var newSubpath2 = void 0; + if (!subpath1) { + newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2); + newSubpath2 = subpath2; + } + else if (!subpath2) { + newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1); + newSubpath1 = subpath1; + } + else { + _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1]; + lastSubpath1 = newSubpath1; + lastSubpath2 = newSubpath2; + } + newArray1.push(newSubpath1); + newArray2.push(newSubpath2); + } + return [newArray1, newArray2]; + } + function centroid$1(array) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = array.length; + for (var i = 0, j = len - 2; i < len; j = i, i += 2) { + var x0 = array[j]; + var y0 = array[j + 1]; + var x1 = array[i]; + var y1 = array[i + 1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + } + if (signedArea === 0) { + return [array[0] || 0, array[1] || 0]; + } + return [cx / signedArea / 3, cy / signedArea / 3, signedArea]; + } + function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) { + var bezierCount = (fromSubBeziers.length - 2) / 6; + var bestScore = Infinity; + var bestOffset = 0; + var len = fromSubBeziers.length; + var len2 = len - 2; + for (var offset = 0; offset < bezierCount; offset++) { + var cursorOffset = offset * 6; + var score = 0; + for (var k = 0; k < len; k += 2) { + var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2); + var x0 = fromSubBeziers[idx] - fromCp[0]; + var y0 = fromSubBeziers[idx + 1] - fromCp[1]; + var x1 = toSubBeziers[k] - toCp[0]; + var y1 = toSubBeziers[k + 1] - toCp[1]; + var dx = x1 - x0; + var dy = y1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestOffset = offset; + } + } + return bestOffset; + } + function reverse(array) { + var newArr = []; + var len = array.length; + for (var i = 0; i < len; i += 2) { + newArr[i] = array[len - i - 2]; + newArr[i + 1] = array[len - i - 1]; + } + return newArr; + } + function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) { + var result = []; + var fromNeedsReverse; + for (var i = 0; i < fromArr.length; i++) { + var fromSubpathBezier = fromArr[i]; + var toSubpathBezier = toArr[i]; + var fromCp = centroid$1(fromSubpathBezier); + var toCp = centroid$1(toSubpathBezier); + if (fromNeedsReverse == null) { + fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0; + } + var newFromSubpathBezier = []; + var newToSubpathBezier = []; + var bestAngle = 0; + var bestScore = Infinity; + var tmpArr = []; + var len = fromSubpathBezier.length; + if (fromNeedsReverse) { + fromSubpathBezier = reverse(fromSubpathBezier); + } + var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6; + var len2 = len - 2; + for (var k = 0; k < len2; k += 2) { + var idx = (offset + k) % len2 + 2; + newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0]; + newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1]; + } + newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0]; + newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1]; + if (searchAngleIteration > 0) { + var step = searchAngleRange / searchAngleIteration; + for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) { + var sa = Math.sin(angle); + var ca = Math.cos(angle); + var score = 0; + for (var k = 0; k < fromSubpathBezier.length; k += 2) { + var x0 = newFromSubpathBezier[k]; + var y0 = newFromSubpathBezier[k + 1]; + var x1 = toSubpathBezier[k] - toCp[0]; + var y1 = toSubpathBezier[k + 1] - toCp[1]; + var newX1 = x1 * ca - y1 * sa; + var newY1 = x1 * sa + y1 * ca; + tmpArr[k] = newX1; + tmpArr[k + 1] = newY1; + var dx = newX1 - x0; + var dy = newY1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestAngle = angle; + for (var m = 0; m < tmpArr.length; m++) { + newToSubpathBezier[m] = tmpArr[m]; + } + } + } + } + else { + for (var i_1 = 0; i_1 < len; i_1 += 2) { + newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0]; + newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1]; + } + } + result.push({ + from: newFromSubpathBezier, + to: newToSubpathBezier, + fromCp: fromCp, + toCp: toCp, + rotation: -bestAngle + }); + } + return result; + } + function isCombineMorphing(path) { + return path.__isCombineMorphing; + } + var SAVED_METHOD_PREFIX = '__mOriginal_'; + function saveAndModifyMethod(obj, methodName, modifiers) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + var originalMethod = obj[savedMethodName] || obj[methodName]; + if (!obj[savedMethodName]) { + obj[savedMethodName] = obj[methodName]; + } + var replace = modifiers.replace; + var after = modifiers.after; + var before = modifiers.before; + obj[methodName] = function () { + var args = arguments; + var res; + before && before.apply(this, args); + if (replace) { + res = replace.apply(this, args); + } + else { + res = originalMethod.apply(this, args); + } + after && after.apply(this, args); + return res; + }; + } + function restoreMethod(obj, methodName) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + if (obj[savedMethodName]) { + obj[methodName] = obj[savedMethodName]; + obj[savedMethodName] = null; + } + } + function applyTransformOnBeziers(bezierCurves, mm) { + for (var i = 0; i < bezierCurves.length; i++) { + var subBeziers = bezierCurves[i]; + for (var k = 0; k < subBeziers.length;) { + var x = subBeziers[k]; + var y = subBeziers[k + 1]; + subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4]; + subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5]; + } + } + } + function prepareMorphPath(fromPath, toPath) { + var fromPathProxy = fromPath.getUpdatedPathProxy(); + var toPathProxy = toPath.getUpdatedPathProxy(); + var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1]; + var fromPathTransform = fromPath.getComputedTransform(); + var toPathTransform = toPath.getComputedTransform(); + function updateIdentityTransform() { + this.transform = null; + } + fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform); + toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform); + saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform }); + toPath.transform = null; + var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI); + var tmpArr = []; + saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) { + var t = toPath.__morphT; + var onet = 1 - t; + var newCp = []; + for (var i = 0; i < morphingData.length; i++) { + var item = morphingData[i]; + var from = item.from; + var to = item.to; + var angle = item.rotation * t; + var fromCp = item.fromCp; + var toCp = item.toCp; + var sa = Math.sin(angle); + var ca = Math.cos(angle); + lerp(newCp, fromCp, toCp, t); + for (var m = 0; m < from.length; m += 2) { + var x0_1 = from[m]; + var y0_1 = from[m + 1]; + var x1 = to[m]; + var y1 = to[m + 1]; + var x = x0_1 * onet + x1 * t; + var y = y0_1 * onet + y1 * t; + tmpArr[m] = (x * ca - y * sa) + newCp[0]; + tmpArr[m + 1] = (x * sa + y * ca) + newCp[1]; + } + var x0 = tmpArr[0]; + var y0 = tmpArr[1]; + path.moveTo(x0, y0); + for (var m = 2; m < from.length;) { + var x1 = tmpArr[m++]; + var y1 = tmpArr[m++]; + var x2 = tmpArr[m++]; + var y2 = tmpArr[m++]; + var x3 = tmpArr[m++]; + var y3 = tmpArr[m++]; + if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) { + path.lineTo(x3, y3); + } + else { + path.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + x0 = x3; + y0 = y3; + } + } + } }); + } + function morphPath(fromPath, toPath, animationOpts) { + if (!fromPath || !toPath) { + return toPath; + } + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + prepareMorphPath(fromPath, toPath); + toPath.__morphT = 0; + function restoreToPath() { + restoreMethod(toPath, 'buildPath'); + restoreMethod(toPath, 'updateTransform'); + toPath.__morphT = -1; + toPath.createPathProxy(); + toPath.dirtyShape(); + } + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + toPath.dirtyShape(); + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + oldDone && oldDone(); + } + }, animationOpts)); + return toPath; + } + function hilbert(x, y, minX, minY, maxX, maxY) { + var bits = 16; + x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX)); + y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY)); + var d = 0; + var tmp; + for (var s = (1 << bits) / 2; s > 0; s /= 2) { + var rx = 0; + var ry = 0; + if ((x & s) > 0) { + rx = 1; + } + if ((y & s) > 0) { + ry = 1; + } + d += s * s * ((3 * rx) ^ ry); + if (ry === 0) { + if (rx === 1) { + x = s - 1 - x; + y = s - 1 - y; + } + tmp = x; + x = y; + y = tmp; + } + } + return d; + } + function sortPaths(pathList) { + var xMin = Infinity; + var yMin = Infinity; + var xMax = -Infinity; + var yMax = -Infinity; + var cps = map(pathList, function (path) { + var rect = path.getBoundingRect(); + var m = path.getComputedTransform(); + var x = rect.x + rect.width / 2 + (m ? m[4] : 0); + var y = rect.y + rect.height / 2 + (m ? m[5] : 0); + xMin = Math.min(x, xMin); + yMin = Math.min(y, yMin); + xMax = Math.max(x, xMax); + yMax = Math.max(y, yMax); + return [x, y]; + }); + var items = map(cps, function (cp, idx) { + return { + cp: cp, + z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax), + path: pathList[idx] + }; + }); + return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; }); + } + function defaultDividePath(param) { + return split(param.path, param.count); + } + function createEmptyReturn() { + return { + fromIndividuals: [], + toIndividuals: [], + count: 0 + }; + } + function combineMorph(fromList, toPath, animationOpts) { + var fromPathList = []; + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } + else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + addFromPath(fromList); + var separateCount = fromPathList.length; + if (!separateCount) { + return createEmptyReturn(); + } + var dividePath = animationOpts.dividePath || defaultDividePath; + var toSubPathList = dividePath({ + path: toPath, count: separateCount + }); + if (toSubPathList.length !== separateCount) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + fromPathList = sortPaths(fromPathList); + toSubPathList = sortPaths(toSubPathList); + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + var individualDelay = animationOpts.individualDelay; + var identityTransform = new Transformable(); + for (var i = 0; i < separateCount; i++) { + var from = fromPathList[i]; + var to = toSubPathList[i]; + to.parent = toPath; + to.copyTransform(identityTransform); + if (!individualDelay) { + prepareMorphPath(from, to); + } + } + toPath.__isCombineMorphing = true; + toPath.childrenRef = function () { + return toSubPathList; + }; + function addToSubPathListToZr(zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].addSelfToZr(zr); + } + } + saveAndModifyMethod(toPath, 'addSelfToZr', { + after: function (zr) { + addToSubPathListToZr(zr); + } + }); + saveAndModifyMethod(toPath, 'removeSelfFromZr', { + after: function (zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].removeSelfFromZr(zr); + } + } + }); + function restoreToPath() { + toPath.__isCombineMorphing = false; + toPath.__morphT = -1; + toPath.childrenRef = null; + restoreMethod(toPath, 'addSelfToZr'); + restoreMethod(toPath, 'removeSelfFromZr'); + } + var toLen = toSubPathList.length; + if (individualDelay) { + var animating_1 = toLen; + var eachDone = function () { + animating_1--; + if (animating_1 === 0) { + restoreToPath(); + oldDone && oldDone(); + } + }; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]), + done: eachDone + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts); + } + } + else { + toPath.__morphT = 0; + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + for (var i = 0; i < toLen; i++) { + var child = toSubPathList[i]; + child.__morphT = toPath.__morphT; + child.dirtyShape(); + } + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + for (var i = 0; i < fromList.length; i++) { + restoreMethod(fromList[i], 'updateTransform'); + } + oldDone && oldDone(); + } + }, animationOpts)); + } + if (toPath.__zr) { + addToSubPathListToZr(toPath.__zr); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toSubPathList, + count: toLen + }; + } + function separateMorph(fromPath, toPathList, animationOpts) { + var toLen = toPathList.length; + var fromPathList = []; + var dividePath = animationOpts.dividePath || defaultDividePath; + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } + else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + if (isCombineMorphing(fromPath)) { + addFromPath(fromPath.childrenRef()); + var fromLen = fromPathList.length; + if (fromLen < toLen) { + var k = 0; + for (var i = fromLen; i < toLen; i++) { + fromPathList.push(clonePath(fromPathList[k++ % fromLen])); + } + } + fromPathList.length = toLen; + } + else { + fromPathList = dividePath({ path: fromPath, count: toLen }); + var fromPathTransform = fromPath.getComputedTransform(); + for (var i = 0; i < fromPathList.length; i++) { + fromPathList[i].setLocalTransform(fromPathTransform); + } + if (fromPathList.length !== toLen) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + } + fromPathList = sortPaths(fromPathList); + toPathList = sortPaths(toPathList); + var individualDelay = animationOpts.individualDelay; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i]) + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toPathList, + count: toPathList.length + }; + } + + function isMultiple(elements) { + return isArray(elements[0]); + } + + function prepareMorphBatches(one, many) { + var batches = []; + var batchCount = one.length; + + for (var i = 0; i < batchCount; i++) { + batches.push({ + one: one[i], + many: [] + }); + } + + for (var i = 0; i < many.length; i++) { + var len = many[i].length; + var k = void 0; + + for (k = 0; k < len; k++) { + batches[k % batchCount].many.push(many[i][k]); + } + } + + var off = 0; // If one has more paths than each one of many. average them. + + for (var i = batchCount - 1; i >= 0; i--) { + if (!batches[i].many.length) { + var moveFrom = batches[off].many; + + if (moveFrom.length <= 1) { + // Not enough + // Start from the first one. + if (off) { + off = 0; + } else { + return batches; + } + } + + var len = moveFrom.length; + var mid = Math.ceil(len / 2); + batches[i].many = moveFrom.slice(mid, len); + batches[off].many = moveFrom.slice(0, mid); + off++; + } + } + + return batches; + } + + var pathDividers = { + clone: function (params) { + var ret = []; // Fitting the alpha + + var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count); + + for (var i = 0; i < params.count; i++) { + var cloned = clonePath(params.path); + cloned.setStyle('opacity', approxOpacity); + ret.push(cloned); + } + + return ret; + }, + // Use the default divider + split: null + }; + function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) { + if (!from.length || !to.length) { + return; + } + + var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex); + + if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) { + return; + } + + var animationDelay = seriesModel.getModel('universalTransition').get('delay'); + var animationCfg = Object.assign({ + // Need to setToFinal so the further calculation based on the style can be correct. + // Like emphasis color. + setToFinal: true + }, updateAnimationCfg); + var many; + var one; + + if (isMultiple(from)) { + // manyToOne + many = from; + one = to; + } + + if (isMultiple(to)) { + // oneToMany + many = to; + one = from; + } + + function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) { + var batchMany = batch.many; + var batchOne = batch.one; + + if (batchMany.length === 1 && !forceManyOne) { + // Is one to one + var batchFrom = fromIsMany ? batchMany[0] : batchOne; + var batchTo = fromIsMany ? batchOne : batchMany[0]; + + if (isCombineMorphing(batchFrom)) { + // Keep doing combine animation. + morphOneBatch({ + many: [batchFrom], + one: batchTo + }, true, animateIndex, animateCount, true); + } else { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(animateIndex, animateCount) + }, animationCfg) : animationCfg; + morphPath(batchFrom, batchTo, individualAnimationCfg); + animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg); + } + } else { + var separateAnimationCfg = defaults({ + dividePath: pathDividers[divideShape], + individualDelay: animationDelay && function (idx, count, fromPath, toPath) { + return animationDelay(idx + animateIndex, animateCount); + } + }, animationCfg); + + var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg), + fromIndividuals = _a.fromIndividuals, + toIndividuals = _a.toIndividuals; + + var count = fromIndividuals.length; + + for (var k = 0; k < count; k++) { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(k, count) + }, animationCfg) : animationCfg; + animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg); + } + } + } + + var fromIsMany = many ? many === from // Is one to one. If the path number not match. also needs do merge and separate morphing. + : from.length > to.length; + var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]); + var animateCount = 0; + + for (var i = 0; i < morphBatches.length; i++) { + animateCount += morphBatches[i].many.length; + } + + var animateIndex = 0; + + for (var i = 0; i < morphBatches.length; i++) { + morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount); + animateIndex += morphBatches[i].many.length; + } + } + function getPathList(elements) { + if (!elements) { + return []; + } + + if (isArray(elements)) { + var pathList_1 = []; + + for (var i = 0; i < elements.length; i++) { + pathList_1.push(getPathList(elements[i])); + } + + return pathList_1; + } + + var pathList = []; + elements.traverse(function (el) { + if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) { + pathList.push(el); + } + }); + return pathList; + } + + var DATA_COUNT_THRESHOLD = 1e4; + var getUniversalTransitionGlobalStore = makeInner(); + + function getGroupIdDimension(data) { + var dimensions = data.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = data.getDimensionInfo(dimensions[i]); + + if (dimInfo && dimInfo.otherDims.itemGroupId === 0) { + return dimensions[i]; + } + } + } + + function flattenDataDiffItems(list) { + var items = []; + each(list, function (seriesInfo) { + var data = seriesInfo.data; + + if (data.count() > DATA_COUNT_THRESHOLD) { + if ("development" !== 'production') { + warn('Universal transition is disabled on large data > 10k.'); + } + + return; + } + + var indices = data.getIndices(); + var groupDim = getGroupIdDimension(data); + + for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) { + items.push({ + dataGroupId: seriesInfo.dataGroupId, + data: data, + dim: seriesInfo.dim || groupDim, + divide: seriesInfo.divide, + dataIndex: dataIndex + }); + } + }); + return items; + } + + function fadeInElement(newEl, newSeries, newIndex) { + newEl.traverse(function (el) { + if (el instanceof Path) { + // TODO use fade in animation for target element. + initProps(el, { + style: { + opacity: 0 + } + }, newSeries, { + dataIndex: newIndex, + isFrom: true + }); + } + }); + } + + function removeEl$1(el) { + if (el.parent) { + // Bake parent transform to element. + // So it can still have proper transform to transition after it's removed. + var computedTransform = el.getComputedTransform(); + el.setLocalTransform(computedTransform); + el.parent.remove(el); + } + } + + function stopAnimation(el) { + el.stopAnimation(); + + if (el.isGroup) { + el.traverse(function (child) { + child.stopAnimation(); + }); + } + } + + function animateElementStyles(el, dataIndex, seriesModel) { + var animationConfig = getAnimationConfig('update', seriesModel, dataIndex); + animationConfig && el.traverse(function (child) { + if (child instanceof Displayable) { + var oldStyle = getOldStyle(child); + + if (oldStyle) { + child.animateFrom({ + style: oldStyle + }, animationConfig); + } + } + }); + } + + function isAllIdSame(oldDiffItems, newDiffItems) { + var len = oldDiffItems.length; + + if (len !== newDiffItems.length) { + return false; + } + + for (var i = 0; i < len; i++) { + var oldItem = oldDiffItems[i]; + var newItem = newDiffItems[i]; + + if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) { + return false; + } + } + + return true; + } + + function transitionBetween(oldList, newList, api) { + var oldDiffItems = flattenDataDiffItems(oldList); + var newDiffItems = flattenDataDiffItems(newList); + + function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) { + if (rawFrom || from) { + to.animateFrom({ + style: rawFrom && rawFrom !== from ? // dividingMethod like clone may override the style(opacity) + // So extend it to raw style. + extend(extend({}, rawFrom.style), from.style) : from.style + }, animationCfg); + } + } + + function findKeyDim(items) { + for (var i = 0; i < items.length; i++) { + if (items[i].dim) { + return items[i].dim; + } + } + } + + var oldKeyDim = findKeyDim(oldDiffItems); + var newKeyDim = findKeyDim(newDiffItems); + var hasMorphAnimation = false; + + function createKeyGetter(isOld, onlyGetId) { + return function (diffItem) { + var data = diffItem.data; + var dataIndex = diffItem.dataIndex; // TODO if specified dim + + if (onlyGetId) { + return data.getId(dataIndex); + } // Use group id as transition key by default. + // So we can achieve multiple to multiple animation like drilldown / up naturally. + // If group id not exits. Use id instead. If so, only one to one transition will be applied. + + + var dataGroupId = diffItem.dataGroupId; // If specified key dimension(itemGroupId by default). Use this same dimension from other data. + // PENDING: If only use key dimension of newData. + + var keyDim = isOld ? oldKeyDim || newKeyDim : newKeyDim || oldKeyDim; + var dimInfo = keyDim && data.getDimensionInfo(keyDim); + var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta; + + if (dimInfo) { + // Get from encode.itemGroupId. + var key = data.get(dimInfo.name, dataIndex); + + if (dimOrdinalMeta) { + return dimOrdinalMeta.categories[key] || key + ''; + } + + return key + ''; + } // Get groupId from raw item. { groupId: '' } + + + var itemVal = data.getRawDataItem(dataIndex); + + if (itemVal && itemVal.groupId) { + return itemVal.groupId + ''; + } + + return dataGroupId || data.getId(dataIndex); + }; + } // Use id if it's very likely to be an one to one animation + // It's more robust than groupId + // TODO Check if key dimension is specified. + + + var useId = isAllIdSame(oldDiffItems, newDiffItems); + var isElementStillInChart = {}; + + if (!useId) { + // We may have different diff strategy with basicTransition if we use other dimension as key. + // If so, we can't simply check if oldEl is same with newEl. We need a map to check if oldEl is still being used in the new chart. + // We can't use the elements that already being morphed. Let it keep it's original basic transition. + for (var i = 0; i < newDiffItems.length; i++) { + var newItem = newDiffItems[i]; + var el = newItem.data.getItemGraphicEl(newItem.dataIndex); + + if (el) { + isElementStillInChart[el.id] = true; + } + } + } + + function updateOneToOne(newIndex, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var newItem = newDiffItems[newIndex]; + var newSeries = newItem.data.hostModel; // TODO Mark this elements is morphed and don't morph them anymore + + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); + var newEl = newItem.data.getItemGraphicEl(newItem.dataIndex); // Can't handle same elements. + + if (oldEl === newEl) { + newEl && animateElementStyles(newEl, newItem.dataIndex, newSeries); + return; + } + + if ( // We can't use the elements that already being morphed + oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + if (newEl) { + // TODO: If keep animating the group in case + // some of the elements don't want to be morphed. + // TODO Label? + stopAnimation(newEl); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newIndex); + } + } // else keep oldEl leaving animation. + + } + + new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, 'multiple').update(updateOneToOne).updateManyToOne(function (newIndex, oldIndices) { + var newItem = newDiffItems[newIndex]; + var newData = newItem.data; + var newSeries = newData.hostModel; + var newEl = newData.getItemGraphicEl(newItem.dataIndex); + var oldElsList = filter(map(oldIndices, function (idx) { + return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex); + }), function (oldEl) { + return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id]; + }); + + if (newEl) { + stopAnimation(newEl); + + if (oldElsList.length) { + // If old element is doing leaving animation. stop it and remove it immediately. + each(oldElsList, function (oldEl) { + stopAnimation(oldEl); + removeEl$1(oldEl); + }); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newItem.dataIndex); + } + } // else keep oldEl leaving animation. + + }).updateOneToMany(function (newIndices, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); // We can't use the elements that already being morphed + + if (oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + var newElsList = filter(map(newIndices, function (idx) { + return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex); + }), function (el) { + return el && el !== oldEl; + }); + var newSeris = newDiffItems[newIndices[0]].data.hostModel; + + if (newElsList.length) { + each(newElsList, function (newEl) { + return stopAnimation(newEl); + }); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newElsList), oldItem.divide, // Use divide on old. + newSeris, newIndices[0], updateMorphingPathProps); + } else { + each(newElsList, function (newEl) { + return fadeInElement(newEl, newSeris, newIndices[0]); + }); + } + } // else keep oldEl leaving animation. + + }).updateManyToMany(function (newIndices, oldIndices) { + // If two data are same and both have groupId. + // Normally they should be diff by id. + new DataDiffer(oldIndices, newIndices, function (rawIdx) { + return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex); + }, function (rawIdx) { + return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex); + }).update(function (newIndex, oldIndex) { + // Use the original index + updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]); + }).execute(); + }).execute(); + + if (hasMorphAnimation) { + each(newList, function (_a) { + var data = _a.data; + var seriesModel = data.hostModel; + var view = seriesModel && api.getViewOfSeriesModel(seriesModel); + var animationCfg = getAnimationConfig('update', seriesModel, 0); // use 0 index. + + if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) { + view.group.traverse(function (el) { + if (el instanceof Path && !el.animators.length) { + // We can't accept there still exists element that has no animation + // if universalTransition is enabled + el.animateFrom({ + style: { + opacity: 0 + } + }, animationCfg); + } + }); + } + }); + } + } + + function getSeriesTransitionKey(series) { + var seriesKey = series.getModel('universalTransition').get('seriesKey'); + + if (!seriesKey) { + // Use series id by default. + return series.id; + } + + return seriesKey; + } + + function convertArraySeriesKeyToString(seriesKey) { + if (isArray(seriesKey)) { + // Order independent. + return seriesKey.sort().join(','); + } + + return seriesKey; + } + + function getDivideShapeFromData(data) { + if (data.hostModel) { + return data.hostModel.getModel('universalTransition').get('divideShape'); + } + } + + function findTransitionSeriesBatches(globalStore, params) { + var updateBatches = createHashMap(); + var oldDataMap = createHashMap(); // Map that only store key in array seriesKey. + // Which is used to query the old data when transition from one to multiple series. + + var oldDataMapForSplit = createHashMap(); + each(globalStore.oldSeries, function (series, idx) { + var oldDataGroupId = globalStore.oldDataGroupIds[idx]; + var oldData = globalStore.oldData[idx]; + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); + oldDataMap.set(transitionKeyStr, { + dataGroupId: oldDataGroupId, + data: oldData + }); + + if (isArray(transitionKey)) { + // Same key can't in different array seriesKey. + each(transitionKey, function (key) { + oldDataMapForSplit.set(key, { + key: transitionKeyStr, + dataGroupId: oldDataGroupId, + data: oldData + }); + }); + } + }); + + function checkTransitionSeriesKeyDuplicated(transitionKeyStr) { + if (updateBatches.get(transitionKeyStr)) { + warn("Duplicated seriesKey in universalTransition " + transitionKeyStr); + } + } + + each(params.updatedSeries, function (series) { + if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) { + var newDataGroupId = series.get('dataGroupId'); + var newData = series.getData(); + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); // Only transition between series with same id. + + var oldData = oldDataMap.get(transitionKeyStr); // string transition key is the best match. + + if (oldData) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } // TODO check if data is same? + + + updateBatches.set(transitionKeyStr, { + oldSeries: [{ + dataGroupId: oldData.dataGroupId, + divide: getDivideShapeFromData(oldData.data), + data: oldData.data + }], + newSeries: [{ + dataGroupId: newDataGroupId, + divide: getDivideShapeFromData(newData), + data: newData + }] + }); + } else { + // Transition from multiple series. + if (isArray(transitionKey)) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } + + var oldSeries_1 = []; + each(transitionKey, function (key) { + var oldData = oldDataMap.get(key); + + if (oldData.data) { + oldSeries_1.push({ + dataGroupId: oldData.dataGroupId, + divide: getDivideShapeFromData(oldData.data), + data: oldData.data + }); + } + }); + + if (oldSeries_1.length) { + updateBatches.set(transitionKeyStr, { + oldSeries: oldSeries_1, + newSeries: [{ + dataGroupId: newDataGroupId, + data: newData, + divide: getDivideShapeFromData(newData) + }] + }); + } + } else { + // Try transition to multiple series. + var oldData_1 = oldDataMapForSplit.get(transitionKey); + + if (oldData_1) { + var batch = updateBatches.get(oldData_1.key); + + if (!batch) { + batch = { + oldSeries: [{ + dataGroupId: oldData_1.dataGroupId, + data: oldData_1.data, + divide: getDivideShapeFromData(oldData_1.data) + }], + newSeries: [] + }; + updateBatches.set(oldData_1.key, batch); + } + + batch.newSeries.push({ + dataGroupId: newDataGroupId, + data: newData, + divide: getDivideShapeFromData(newData) + }); + } + } + } + } + }); + return updateBatches; + } + + function querySeries(series, finder) { + for (var i = 0; i < series.length; i++) { + var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id; + + if (found) { + return i; + } + } + } + + function transitionSeriesFromOpt(transitionOpt, globalStore, params, api) { + var from = []; + var to = []; + each(normalizeToArray(transitionOpt.from), function (finder) { + var idx = querySeries(globalStore.oldSeries, finder); + + if (idx >= 0) { + from.push({ + dataGroupId: globalStore.oldDataGroupIds[idx], + data: globalStore.oldData[idx], + // TODO can specify divideShape in transition. + divide: getDivideShapeFromData(globalStore.oldData[idx]), + dim: finder.dimension + }); + } + }); + each(normalizeToArray(transitionOpt.to), function (finder) { + var idx = querySeries(params.updatedSeries, finder); + + if (idx >= 0) { + var data = params.updatedSeries[idx].getData(); + to.push({ + dataGroupId: globalStore.oldDataGroupIds[idx], + data: data, + divide: getDivideShapeFromData(data), + dim: finder.dimension + }); + } + }); + + if (from.length > 0 && to.length > 0) { + transitionBetween(from, to, api); + } + } + + function installUniversalTransition(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecMOdel, api, params) { + each(normalizeToArray(params.seriesTransition), function (transOpt) { + each(normalizeToArray(transOpt.to), function (finder) { + var series = params.updatedSeries; + + for (var i = 0; i < series.length; i++) { + if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) { + series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true; + } + } + }); + }); + }); + registers.registerUpdateLifecycle('series:transition', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var globalStore = getUniversalTransitionGlobalStore(api); // TODO multiple to multiple series. + + if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) { + // Use give transition config if its' give; + var transitionOpt = params.seriesTransition; + + if (transitionOpt) { + each(normalizeToArray(transitionOpt), function (opt) { + transitionSeriesFromOpt(opt, globalStore, params, api); + }); + } else { + // Else guess from series based on transition series key. + var updateBatches_1 = findTransitionSeriesBatches(globalStore, params); + each(updateBatches_1.keys(), function (key) { + var batch = updateBatches_1.get(key); + transitionBetween(batch.oldSeries, batch.newSeries, api); + }); + } // Reset + + + each(params.updatedSeries, function (series) { + // Reset; + if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) { + series[SERIES_UNIVERSAL_TRANSITION_PROP] = false; + } + }); + } // Save all series of current update. Not only the updated one. + + + var allSeries = ecModel.getSeries(); + var savedSeries = globalStore.oldSeries = []; + var savedDataGroupIds = globalStore.oldDataGroupIds = []; + var savedData = globalStore.oldData = []; + + for (var i = 0; i < allSeries.length; i++) { + var data = allSeries[i].getData(); // Only save the data that can have transition. + // Avoid large data costing too much extra memory + + if (data.count() < DATA_COUNT_THRESHOLD) { + savedSeries.push(allSeries[i]); + savedDataGroupIds.push(allSeries[i].get('dataGroupId')); + savedData.push(data); + } + } + }); + } + + // Render engines + // ----------------- + // Render via Canvas. + // echarts.init(dom, null, { renderer: 'canvas' }) + + use([install$1]); // Render via SVG. + // echarts.init(dom, null, { renderer: 'svg' }) + + use([install]); // ---------------- + // Charts (series) + // ---------------- + // All of the series types, for example: + // chart.setOption({ + // series: [{ + // type: 'line' // or 'bar', 'pie', ... + // }] + // }); + + use([install$2, install$3, install$4, install$6, install$8, install$a, install$b, install$c, install$d, install$e, install$f, install$h, install$i, install$j, install$k, install$l, install$m, install$n, install$o, install$p, install$q, install$r]); // ------------------- + // Coordinate systems + // ------------------- + // All of the axis modules have been included in the + // coordinate system module below, do not need to + // make extra import. + // `cartesian` coordinate system. For some historical + // reasons, it is named as grid, for example: + // chart.setOption({ + // grid: {...}, + // xAxis: {...}, + // yAxis: {...}, + // series: [{...}] + // }); + + use(install$t); // `polar` coordinate system, for example: + // chart.setOption({ + // polar: {...}, + // radiusAxis: {...}, + // angleAxis: {...}, + // series: [{ + // coordinateSystem: 'polar' + // }] + // }); + + use(install$u); // `geo` coordinate system, for example: + // chart.setOption({ + // geo: {...}, + // series: [{ + // coordinateSystem: 'geo' + // }] + // }); + + use(install$9); // `singleAxis` coordinate system (notice, it is a coordinate system + // with only one axis, work for chart like theme river), for example: + // chart.setOption({ + // singleAxis: {...} + // series: [{type: 'themeRiver', ...}] + // }); + + use(install$v); // `parallel` coordinate system, only work for parallel series, for example: + // chart.setOption({ + // parallel: {...}, + // parallelAxis: [{...}, ...], + // series: [{ + // type: 'parallel' + // }] + // }); + + use(install$g); // `calendar` coordinate system. for example, + // chart.setOptionp({ + // calendar: {...}, + // series: [{ + // coordinateSystem: 'calendar' + // }] + // ); + + use(install$w); // ------------------ + // Other components + // ------------------ + // `graphic` component, for example: + // chart.setOption({ + // graphic: {...} + // }); + + use(install$x); // `toolbox` component, for example: + // chart.setOption({ + // toolbox: {...} + // }); + + use(install$z); // `tooltip` component, for example: + // chart.setOption({ + // tooltip: {...} + // }); + + use(install$A); // `axisPointer` component, for example: + // chart.setOption({ + // tooltip: {axisPointer: {...}, ...} + // }); + // Or + // chart.setOption({ + // axisPointer: {...} + // }); + + use(install$s); // `brush` component, for example: + // chart.setOption({ + // brush: {...} + // }); + // Or + // chart.setOption({ + // tooltip: {feature: {brush: {...}} + // }) + + use(install$B); // `title` component, for example: + // chart.setOption({ + // title: {...} + // }); + + use(install$C); // `timeline` component, for example: + // chart.setOption({ + // timeline: {...} + // }); + + use(install$D); // `markPoint` component, for example: + // chart.setOption({ + // series: [{markPoint: {...}}] + // }); + + use(install$E); // `markLine` component, for example: + // chart.setOption({ + // series: [{markLine: {...}}] + // }); + + use(install$F); // `markArea` component, for example: + // chart.setOption({ + // series: [{markArea: {...}}] + // }); + + use(install$G); // `legend` component not scrollable. for example: + // chart.setOption({ + // legend: {...} + // }); + + use(install$J); // `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`. + + use(install$M); // `dataZoom` component providing drag, pinch, wheel behaviors + // inside coodinate system, for example: + // chart.setOption({ + // dataZoom: {type: 'inside'} + // }); + + use(install$K); // `dataZoom` component providing a slider bar, for example: + // chart.setOption({ + // dataZoom: {type: 'slider'} + // }); + + use(install$L); // `visualMap` component including both `visualMapContinuous` and `visualMapPiecewise`. + + use(install$P); // `visualMap` component providing continuous bar, for example: + // chart.setOption({ + // visualMap: {type: 'continuous'} + // }); + + use(install$N); // `visualMap` component providing pieces bar, for example: + // chart.setOption({ + // visualMap: {type: 'piecewise'} + // }); + + use(install$O); // `aria` component providing aria, for example: + // chart.setOption({ + // aria: {...} + // }); + + use(install$Q); // dataset transform + // chart.setOption({ + // dataset: { + // transform: [] + // } + // }); + + use(install$R); + use(install$S); // universal transition + // chart.setOption({ + // series: { + // universalTransition: { enabled: true } + // } + // }) + + use(installUniversalTransition); // label layout + // chart.setOption({ + // series: { + // labelLayout: { hideOverlap: true } + // } + // }) + + use(installLabelLayout); + + exports.Axis = Axis; + exports.ChartView = ChartView; + exports.ComponentModel = ComponentModel; + exports.ComponentView = ComponentView; + exports.List = SeriesData; + exports.Model = Model; + exports.PRIORITY = PRIORITY; + exports.SeriesModel = SeriesModel; + exports.color = color; + exports.connect = connect; + exports.dataTool = dataTool; + exports.dependencies = dependencies; + exports.disConnect = disConnect; + exports.disconnect = disconnect; + exports.dispose = dispose$1; + exports.env = env; + exports.extendChartView = extendChartView; + exports.extendComponentModel = extendComponentModel; + exports.extendComponentView = extendComponentView; + exports.extendSeriesModel = extendSeriesModel; + exports.format = format$1; + exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions; + exports.getInstanceByDom = getInstanceByDom; + exports.getInstanceById = getInstanceById; + exports.getMap = getMap; + exports.graphic = graphic$1; + exports.helper = helper; + exports.init = init$1; + exports.innerDrawElementOnCanvas = brushSingle; + exports.matrix = matrix; + exports.number = number; + exports.parseGeoJSON = parseGeoJSON; + exports.parseGeoJson = parseGeoJSON; + exports.registerAction = registerAction; + exports.registerCoordinateSystem = registerCoordinateSystem; + exports.registerLayout = registerLayout; + exports.registerLoading = registerLoading; + exports.registerLocale = registerLocale; + exports.registerMap = registerMap; + exports.registerPostInit = registerPostInit; + exports.registerPostUpdate = registerPostUpdate; + exports.registerPreprocessor = registerPreprocessor; + exports.registerProcessor = registerProcessor; + exports.registerTheme = registerTheme; + exports.registerTransform = registerTransform; + exports.registerUpdateLifecycle = registerUpdateLifecycle; + exports.registerVisual = registerVisual; + exports.setCanvasCreator = setCanvasCreator; + exports.setPlatformAPI = setPlatformAPI; + exports.throttle = throttle; + exports.time = time; + exports.use = use; + exports.util = util$1; + exports.vector = vector; + exports.version = version$1; + exports.zrUtil = util; + exports.zrender = zrender; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=echarts.js.map diff --git a/src/echartsjs/world_map.js b/src/echartsjs/world_map.js new file mode 100644 index 0000000..95f890e --- /dev/null +++ b/src/echartsjs/world_map.js @@ -0,0 +1,449 @@ +/*** + * 世界碳排放量地图 测试使用json 交付采用数据库 使用echarts生成图片 + * api 格式为 map.json (建议从数据库导入 ) + * Time.json ([ + * "2002-01-01", + * "2003-01-01", + * "2004-01-01", + * {value: "2005-01-01", //起点 + * }, + * "2006-01-01", + * "2007-01-01", + * "2008-01-01", + * "2009-01-01", + * "2010-01-01", + * {value: "2011-01-01",} // 终点 + * ]) + * + * + * nameMap: =》 地理位置中文映射 + * nameMap: { 'Central and Western': '中西区',} + * ==> 英文为键 中文为值 + * + * + * data 地图内的数据 + * // data: [{name: '中西区', value: 20057.34},]} + * + * + */ +var ROOT_PATH = './json/world.json'; + +var myChart = this.$echarts.init(document.getElementById("world_map")); + + +var option; + +$http.post('/user', { + firstName: 'Fred', + lastName: 'Flintstone' + }) + .then(function(response) { + console.log(response); + }) + .catch(function(error) { + console.log(error); + }); + + + + +myChart.showLoading(); + + +$http.get('./json/1990.json', function(data1990) { + data1 = data1990[0]; + console.log(data1); + data2 = data1990[1]; + console.log(data2); + console.log(data1990); + console.log(data1); +}); +$http.get(ROOT_PATH, function(geoJson) { + myChart.hideLoading(); + echarts.registerMap("world", geoJson); + myChart.setOption( + ( + option = { + baseOption: { + timeline: { + axisType: "category", + data: ["1990", "1991", "1992", + // {value: "1990", } + "1993", "1994", "1995", "1996", "1997", + // { + // value: "1997", + // } + ], + autoPlay: false, + playInterval: 1000 + }, + tooltip: { + trigger: 'item', + formatter: '{b}
{c} 千吨' + }, + toolbox: { + show: true, + orient: 'vertical', + left: 'right', + top: 'center', + feature: { + dataView: { readOnly: false }, + restore: {}, + saveAsImage: {} + } + }, + visualMap: { + min: 800, + max: 2062527, + text: ['排放量大', '排放量小'], + textStyle: { + color: '#fff' + }, + realtime: false, + calculable: true, + inRange: { + color: ['lightskyblue', 'yellow', 'orangered'] + } + }, + title: { + subtext: 'Data from world CO₂', + textStyle: { + color: '#fff' + }, + }, + series: [{ + name: '世界碳排放量地图', + type: 'map', + roam: true, //禁止其放大缩小 + map: 'world', + label: { + show: true + }, + nameMap: { + 'Afghanistan': '阿富汗', + 'Angola': '安哥拉', + 'Albania': '阿尔巴尼亚', + 'United Arab Emirates': '阿联酋', + 'Argentina': '阿根廷', + 'Armenia': '亚美尼亚', + 'Australia': '澳大利亚', + 'Austria': '奥地利', + 'Azerbaijan': '阿塞拜疆', + 'Burundi': '布隆迪', + 'Belgium': '比利时', + 'Benin': '贝宁', + 'Burkina Faso': '布基纳法索', + 'Bangladesh': '孟加拉', + 'Bulgaria': '保加利亚', + 'Belarus': '白俄罗斯', + 'Belize': '伯利兹', + 'Bermuda': '百慕大', + 'Bolivia': '玻利维亚', + 'Brazil': '巴西', + 'Brunei': '文莱', + 'Bhutan': '不丹', + 'Botswana': '博茨瓦纳', + 'Canada': '加拿大', + 'Switzerland': '瑞士', + 'Chile': '智利', + 'China': '中国', + 'Cameroon': '喀麦隆', + 'Colombia': '哥伦比亚', + 'Costa Rica': '哥斯达黎加', + 'Cuba': '古巴', + 'Cyprus': '塞浦路斯', + 'Germany': '德国', + 'Djibouti': '吉布提', + 'Denmark': '丹麦', + 'Algeria': '阿尔及利亚', + 'Ecuador': '厄瓜多尔', + 'Egypt': '埃及', + 'Eritrea': '厄立特里亚', + 'Spain': '西班牙', + 'Estonia': '爱沙尼亚', + 'Ethiopia': '埃塞俄比亚', + 'Finland': '芬兰', + 'Fiji': '斐济', + 'France': '法国', + 'Gabon': '加蓬', + 'United Kingdom': '英国', + 'Georgia': '格鲁吉亚', + 'Ghana': '加纳', + 'Guinea': '几内亚', + 'Gambia': '冈比亚', + 'Greece': '希腊', + 'Greenland': '格陵兰', + 'Guatemala': '危地马拉', + 'Guyana': '圭亚那', + 'Honduras': '洪都拉斯', + 'Croatia': '克罗地亚', + 'Haiti': '海地', + 'Hungary': '匈牙利', + 'Indonesia': '印度尼西亚', + 'India': '印度', + 'Ireland': '爱尔兰', + 'Iran': '伊朗', + 'Iraq': '伊拉克', + 'Iceland': '冰岛', + 'Israel': '以色列', + 'Italy': '意大利', + 'Jamaica': '牙买加', + 'Jordan': '约旦', + 'Japan': '日本', + 'Kazakhstan': '哈萨克斯坦', + 'Kenya': '肯尼亚', + 'Kyrgyzstan': '吉尔吉斯斯坦', + 'Cambodia': '柬埔寨', + 'Korea': '韩国', + 'Kuwait': '科威特', + 'Lebanon': '黎巴嫩', + 'Liberia': '利比里亚', + 'Libya': '利比亚', + 'Sri Lanka': '斯里兰卡', + 'Lesotho': '莱索托', + 'Lithuania': '立陶宛', + 'Luxembourg': '卢森堡', + 'Latvia': '拉脱维亚', + 'Morocco': '摩洛哥', + 'Moldova': '摩尔多瓦', + 'Madagascar': '马达加斯加', + 'Mexico': '墨西哥', + 'Macedonia': '马其顿', + 'Mali': '马里', + 'Myanmar': '缅甸', + 'Montenegro': '黑山', + 'Mongolia': '蒙古', + 'Mozambique': '莫桑比克', + 'Mauritania': '毛里塔尼亚', + 'Malawi': '马拉维', + 'Malaysia': '马来西亚', + 'Namibia': '纳米比亚', + 'New Caledonia': '新喀里多尼亚', + 'Niger': '尼日尔', + 'Nigeria': '尼日利亚', + 'Nicaragua': '尼加拉瓜', + 'Netherlands': '荷兰', + 'Norway': '挪威', + 'Nepal': '尼泊尔', + 'New Zealand': '新西兰', + 'Oman': '阿曼', + 'Pakistan': '巴基斯坦', + 'Panama': '巴拿马', + 'Peru': '秘鲁', + 'Philippines': '菲律宾', + 'Papua New Guinea': '巴布亚新几内亚', + 'Poland': '波兰', + 'Puerto Rico': '波多黎各', + 'Portugal': '葡萄牙', + 'Paraguay': '巴拉圭', + 'Qatar': '卡塔尔', + 'Romania': '罗马尼亚', + 'Russia': '俄罗斯', + 'Rwanda': '卢旺达', + 'Saudi Arabia': '沙特阿拉伯', + 'Sudan': '苏丹', + 'Senegal': '塞内加尔', + 'Sierra Leone': '塞拉利昂', + 'El Salvador': '萨尔瓦多', + 'Somalia': '索马里', + 'Suriname': '苏里南', + 'Slovakia': '斯洛伐克', + 'Slovenia': '斯洛文尼亚', + 'Sweden': '瑞典', + 'Swaziland': '斯威士兰', + 'Syria': '叙利亚', + 'Chad': '乍得', + 'Togo': '多哥', + 'Thailand': '泰国', + 'Tajikistan': '塔吉克斯坦', + 'Turkmenistan': '土库曼斯坦', + 'Trinidad and Tobago': '特立尼达和多巴哥', + 'Tunisia': '突尼斯', + 'Turkey': '土耳其', + 'Uganda': '乌干达', + 'Ukraine': '乌克兰', + 'Uruguay': '乌拉圭', + 'United States': '美国', + 'Uzbekistan': '乌兹别克斯坦', + 'Venezuela': '委内瑞拉', + 'Vietnam': '越南', + 'Vanuatu': '瓦努阿图', + 'Yemen': '也门', + 'South Africa': '南非', + 'Zambia': '赞比亚', + 'Zimbabwe': '津巴布韦', + 'Liechtenstein': '列支敦士登', + 'Serbia': '塞尔维亚', + "Aland": "奥兰群岛", + "Andorra": "安道尔", + "American Samoa": "美属萨摩亚", + "Antigua and Barb.": "安提瓜和巴布达", + "Bahrain": "巴林", + "Bahamas": "巴哈马", + "Bosnia and Herz.": "波斯尼亚和黑塞哥维那", + "Barbados": "巴巴多斯", + "Central African Rep.": "中非", + "Dem. Rep. Congo": "刚果民主共和国", + "Congo": "刚果", + "Comoros": "科摩罗", + "Cape Verde": "佛得角", + "Curaçao": "库拉索", + "Cayman Is.": "开曼群岛", + "Czech Rep.": "捷克", + "Dominica": "多米尼克", + "Falkland Is.": "福克兰群岛", + "Faeroe Is.": "法罗群岛", + "Micronesia": "密克罗尼西亚联邦", + "Guinea-Bissau": "几内亚比绍", + "Eq. Guinea": "赤道几内亚", + "Grenada": "格林纳达", + "Guam": "关岛", + "Isle of Man": "马恩岛", + "Br. Indian Ocean Ter.": "英属印度洋领地", + "Jersey": "泽西岛", + "Kiribati": "基里巴斯", + "Lao PDR": "老挝", + "Saint Lucia": "圣卢西亚", + "Malta": "马耳他", + "N. Mariana Is.": "北马里亚纳群岛", + "Montserrat": "蒙特塞拉特岛", + "Mauritius": "毛里求斯", + "Niue": "纽埃岛", + "Palau": "帕劳", + "Dem. Rep. Korea": "朝鲜", + "Palestine": "巴勒斯坦", + "Fr. Polynesia": "法属波利尼西亚", + "S. Sudan": "南苏丹", + "Singapore": "新加坡", + "Saint Helena": "圣赫勒拿", + "Solomon Is.": "所罗门群岛", + "St. Pierre and Miquelon": "圣皮埃尔和密克隆群岛", + "São Tomé and Principe": "圣多美和普林西比", + "Seychelles": "塞舌尔", + "Turks and Caicos Is.": "特克斯和凯科斯群岛", + "Timor-Leste": "东帝汶", + "Tonga": "汤加", + "Tanzania": "坦桑尼亚", + "St. Vin. and Gren.": "圣文森特和格林纳丁斯", + "U.S. Virgin Is.": "美属维尔京群岛", + "Samoa": "萨摩亚", + "W. Sahara": "西撒哈拉", + "Fr. S. Antarctic Lands": "马提尼克岛", + "Côte d'Ivoire": "科特迪瓦", + "N. Cyprus": "东塞浦路斯", + "Dominican Rep.": "多米尼加", + "Heard I. and McDonald Is.": "赫德岛和麦克唐纳群岛", + "Siachen Glacier": "锡亚琴冰川", + "S. Geo. and S. Sandw. Is.": "南乔治亚岛与南桑威奇群岛" + }, + }] + }, + + options: [{ + title: { + text: '1990世界各国碳排放量', + }, + series: [{ + data: data1, + }, { // 第二个时间点的 data 时间数据 + title: { + text: '1991世界各国碳排放量', + }, + series: [ + { data: data2 } + ] + }] + }], + }), ) +}); + +// option && myChart.setOption(option); +window.addEventListener("resize", function() { + myChart.resize(); +}); + + + + + +/** + * api 为 data{time,D ATA} => [时间戳,数据] + */ + +$(() => { + var chartDom = document.getElementById("echart3"); + var myChart = echarts.init(chartDom); + var option; + // var data1; + $.get('./json/wordplot.json', function(dataplot) { + // console.log(data1); + dataplot1 = dataplot; + console.log(dataplot1); + + // let base = +new Date(1988, 9, 3); + // let oneDay = 24 * 3600 * 1000; + // let data = [[base, Math.random() * 300]]; + // for (let i = 1; i < 10000; i++) { + // let now = new Date((base += oneDay)); + // data.push([+now, Math.round((Math.random() - 0.5) * 20 + data[i - 1][1])]); + // } + // console.log(data) + myChart.setOption( + option = { + tooltip: { + trigger: 'axis', + position: function(pt) { + // console.log(pt); + return [pt[0], '10%']; + }, + confine: true, + + }, + grid: { + top: 20, + bottom: 50, + left: 80, + right: 60 + }, + toolbox: { + show: true, + orient: 'vertical', + left: 'right', + top: 'center', + feature: { + dataView: { readOnly: false }, + restore: {}, + saveAsImage: {} + } + }, + xAxis: { + type: 'time', + boundaryGap: false + }, + yAxis: { + type: 'value', + boundaryGap: [0, '100%'] + }, + dataZoom: [{ + type: 'inside', + start: 0, + end: 10 + }, { + start: 10, + end: 20 + }], + series: [{ + name: '碳排放总和', + type: 'line', + smooth: true, + symbol: 'none', + areaStyle: {}, + data: dataplot, + }] + }) + }); + + window.addEventListener("resize", function() { + myChart.resize(); + }); +}) \ No newline at end of file diff --git a/src/images/bg.jpg b/src/images/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..911a5c2f90c0f1bb0f82203f25c10cd79354e341 GIT binary patch literal 1429612 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≤4b!? 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рq-8|`*-kh<6ofRwi8r%!UH2uxU>56Th(+F_{OD7@%VAl3CmmE(8)1x<`a zldcw{4kv4p5s?JLb_z_*@sJ)>Gj zn+by1FEw;e1fB4{)KY8+y%&UO4$bH-6TTs@)#Coly^<#ANB6-+2K!Ckp0j@bwKqR; zP|hvoImDuyg~q$b3f)|Y@H3a(ps*g?_WByC5apsSK0xf5QY2;}FXeSsCF2p)$#NI* zZY?EthN_Yz2cj+Sn)lt?`~0H$Tx4r&ZcKD~dyE)S&e4WX>imp)>IuTqZAwvw^sj|r zCSx;otbL%3&D2Y6+$no&zA4u73yrBLwdXJBc7 z_>>payGb4IC$%FU*B(y=Ch9?P^ha03pyyEF($JgldbL-~Sen2QJSNH zY&5<1?Ook?%WJcUs?CR;X|EYq2WBKGeGU63XV3jN+%+o!?>$|UUAAJ5C4ZZ0at;3n z$nJCHIh09&Y<$1lKR~%qcleyYRSNA?{vGc*a2w`ry2gmU*EM->tn~aYZr9c|I6P2W zY{0`mKdRUp{mzg*-Kc=}`1gyB=k8x$rqw-6mVQ>*4*vAO|0GK;)N6Kg#$JbBjkh^O ze1o;s15>m(BR45>2tsBf^1k|wB>*WFzw5tH@bug+p*P(wZ97u>^^NkIbxHTdvI@Nv zeAqBCt}QaVm-ge{(NTHH>-L?UnskZILuu)Okj>mpi9xO}17)C zratZip?P<_wwe_VgLdj{2gY6cmsgY68mEEKd zr$1XlkBD5=u@H=#HH#CKMpzAwd3PNo`a^i_)SI>X_@u|B?GdLfdKPuX^{lGhY-g=q zGkL?Shxz_}PO?!SJFze$m0sD)>h_abDR;z6xu3vF2=h4gv+*XKJ(J|Tk7BiOMx%0V zd!FQulnZKxW132wXJe)8n^E?-P#wEp9OSgjF)Y!qpw2TtMXXXZa(Uw4$uFPKy;rlA z0f-ue8Ui$NT^>{LCqC-NV%^!s;@nw@sl?TBj#f<)`$y6Y8B%PuomstezxjIl_V>K@ z5z#xdn!UjiZ`dz%#Thti+_kF;G8pNp$S6os%E^)J;v&Wzsrj$)NPrNx*a_|tV}i;U zmwZZ|42rZmb?1507urPA-}xdL4R<)YsR$%-`?7z588t?2x+q8p*Oy%$dPl`^($xA* zR~a`nn?Fi@_9j0K3tNg60qtoyf*y@(;M1=aNiX)VG;)>jk3peoRg81;S&`n#DiG8Y zlCo&^*o0FeFR%nPUn&RkX(ric4&;PXhGV9m;TsGW7r$MA(V}pUi{mWq{v=X zL-syrrRY*ft)Va*#F%mvpu=eAucc|uL_nTYekXF?!PkW&UJ>jzUD0G+jFZy)HK~Bv zaTpI6$F0X!r6XI8%h=haU^qZ^kVS3U^pbYhKn4&vvf+}fk4q{QmNW7sDGiJJ#bn_XF=?pd*Sgt#BtP_{!SuEx zndh@EAF`5m(_R>TiBsS>XU2L`8xcc5@)y`RHvt8OkS#4Hd5cg9W{=W>R#?cYzGTt} z%kmbw=n-#29Bn1y>Y}Nrbc&-pwt`Lhw#>S)ZL6NU&q}-2eZ3n2sq-h}h0{0EKi^`H z>?v>uI>dFCkTj|~TsSvhXFM$L;%q0iWG?aCMNxt}rA*_o7=tj|*e~(sA|XZMoHhsb zb@|W4vP!!vD{WmAKr`NJbIz0J$l(MjS$Vf)9$T!DGPiY)@^}3W#P>p-`8wr7Q59B5 zCSinXu(PA3#Md{6qPmt#T522&L|TE6g5dRQsOzl z|H0iikY`C7=b7+`$noA#Tzz-oC{@O(LF{b-Tmvp_0O6O=G8G3$!Xv6M2~%4yAPm%? z87qiTPpdvCJ{e zY&(hB+cMQySK^FtJ7?rwJ*+z|+c9Wr!p;qkph;(>lJM{s(}S zxu?aglSZU28rrZ`ATwfwytaE}=bgWD4$H{}y~XMUhx_t96qN;@=o)8>9A@Gm&z--xzn=uHj8tos$y3XxVV@DM#1)lOWTa5+T0C2#9{!3tA@+{>UPYMXtFD; zWR6;gnyRnUjw|@S%jf$(l1Sd>ZJtJ;2j*foZ5PZ6DelBepfp2lt+F!x^_h`HX9afM zc&iu;Fc#!4fp1!%dpV*U9a{AitKA7mLdLr$V-2~+=hd|xfAn^SBeZOFb1%p~`1@ER z6O$NY*f*YPdGDp6x9&@y9Vl*{J+mR-^_*_{-sDR}Bd?uP#In{A*^BNKM zkL^2KS8mpSfT$ne2SYw`eGA_VYw7uIcVLZ2>L0&i(P4+jfa0ndt7gjC`f@zTPZ#h} z;Z8|!Ft3nL1J#4$hs>(J$35+kbvM~q*|6U7KGzF&ZXBD+rC>k=3D!1V+aHEa`J9hg zz1)h;2QagXov9U9O8x#1;F!iNlpD?j5i4tf~OR1D2ao%pmvR>J6vS5WZ zMte9$d?)JeJziPOhPdK&dcY<6(F4y{NxZ7CGlqh z_3eU+B;rR#&mB5r;TTq;j1fsxR!tNXO+Y1lnI2+}rcrYbug&Ii7?h*;8H>iFO3SK6 zam3hVvE-1;i`<1ROL%L^EB5~zU6CopVt)9c$&aumoY;i%rF9|c)qRQ`x+*z2>J(>w zI6)#W{OCo!g`D@45|wHp6H_Z<6DT`t-bI=*M%o)5=y%I!ZytRfbD4BljeWas@ANx} zPz&S4WWGAks;j<(CrJ^jLN2CJfBc%k{cB=sui4G81G1+_QSdox@fEHw47ozNqz9no z)9J|j9FvLJLfa(xrm{E(rQ{SbW0fpV`!9A>2U9hpl5%uSoH_1b5;=%OJgA5u^mUgU zS;W_G(tW0LJA>IiDww(Z9{gT%s+G+Y?Cb&aLou(uBs1&n=#`RpiOZw<&sgi^kEh*o z??l#%L#hV|_QD7buCA<`iwyQp=bm>p@AxjKpJr{e9G}1S2>xnGev(MdoL;ufB51alyiruH6Wk8h zh@2h(;KsGvBD7iGe>7;&Je&|85FVXd;3Y@2&Cr7{wg6@afPcm5QfR*^&>SbEm4hbt z-=qWTXTXcd#YtMB_v3A$hVW$q!xdYO20~{4CFOIoUV1NN57C5E@tY)VXC1;|qlJ?Z zBgj`vz>1Y2#%zz1h?^WEFbtiUTEu5B`QTJc4vMf~djtaw@rZCjq$-$&LQ?6RrV^D) z225!=tgk=*(V~*MA>hoRP>HwXW-{bwDZpXxuLT@1>X^LX=3+$1%lrKl93c0_wdc#) zXHBUp`^LZk60g^xmKYz$aWbi@lD^b#6ez|TOy%~goIp6AyA0%W!Fa`)Uh=JHV`Iq$ z90BU{c(=sUiPBV&+YGH0VDPL1FgbEZOG`Nsx(t6JRBzDEdFibv_+4w8qRjdSznX+i zGQL-=V~LYnIcABxs#nM_sncn;4OFb_5j|ZDhB{i*@ryaiSyv_B8{4g<_mWRdyRaLy z8iD84uJ%QLRhVId_U2LLl=v^IhWR7%d@-4O+SimZSmVfiBzJG;ejWZUez8_=vKknY z0enIPIEaro&**=;=Tn zD`y@9!x0{Brtp}?w?{60IGRq-B#(YotTB_Q0_!vFU?VXMAgO_X@u^@73r2)G^0}!b zO>nu!J?AnQl#qpcr7;&*r_wv|>DOvWm&qyWD5p&-sRXB-$Sg-raV}tf!!Q*flbm>j zm`;RBnv?_Jd*4;*TTslu?<$^zypNi^&CD?Gu6bB?Ff|bDJ9j* ztF>^on#sm$#4r@it*m4@!`vOhBifGenkkAEV5G$x96X}Oz)85%1M#g0K|&INO(G7N zKoW2OEFG_QtI;UfAkl+oi{AgX+nC*|;e-u*%W#z}5M?=2W|$RzF;@-mfj$RE|ICa?h_5DQzYOMg>l`V~zYEK3HOC@RvB@${^ppQ%U}c^n(Z-_vaB}~CXcVZE*^@{# zWdv6ZBXPmN-f%IW(okXS6%mwB!RD9$zX{|@d;0U%?dwyPp%<*f)Y~?(aaf-zNIvp< zSv;vEX>RXm*(2y9FPC>HT{XX+e1(JC`G@F@N|daNr8}>|nGQ7CFNYOOPNPhavxj8K z!_n}fB+KLpCKA`pGL8OQrIrs)a?cKmX&4k|D)$IXEVk2uUQvx`+tttAi|7v>if2nR zTl&BoE9rP6jbC-u&#+4E-i^v_&6PY$@C43x~gWvgjR?iLH$f-M>59iM(|*Z@B(^v;0Aw=T&or#F3YECka+j`RKk+x zR2wXfkeY)rk$}H8nrX^91Zvyu6A~eEAicNN1|F!|?&C9)PkVD?9_@3DFF{to*LwnC zRN`Z1P}A4K`YxwgnJ4=H>M=O&Of%N^^zL+j2pgdH@w#gtB9$7H{lcPaD`+dC)jXhB zuD$`v=3(-$`Z}CMnaC@Fie67q&xk)DHs?tm5Z+xUElTZdoOou*_8qO^H!Z7gd$USB=4O6!_{@?W2oR<5BwKZ+1)KdM3~nFj z=oR*9Dl#W!<$hD9%{3fr>~!h=%I96daA=esNlM}|wcn&B@=^Mqx9hJg8^VRu5pju$ zsY=pKCQHwGiX0a{HmZYJoCq@Or*+&WVDo^xjt3`9)awCi&ghT$`?r_c&d>?Cu%mm5&cuPXsZZKGbMy#jskx zfJ%T^{gTf5(e?tv_-7z=wakW0`AxYc3D0OFQM~Z7>Si7BB_jwNNh}&kQ9TxC=r57- zl`n=lLzKito&=g6jQ(9S6WGz$`K>2ba(L2Lj#w>Ov(AgKHfe9Cx ztEP`Fr@Lozy5}E-h9vHFF?K)K51l-Z>m z1CU$4B2C&Q=*Hae-;*b`hG_Tr_;3dXB0`&YdCd7%xvzZ$+jHUwDLzS~h_irp zaEeG~#I|>C%5Cpo7n8SKU3PE)JS?ZedjuB6|3tNB90) zk39qL^<8sp`|mv=60uBd-mrbnM`MAO#uKJJPQD#8h!(Su-^!a`M}1i>-{RdrKiqBA76N^qLa;<;iNsfFy-03 zEFY4JS*1tDbBzJ7nm@X;#{Xg7K?8k&Y}vr4$hfq(F59*8Jxw0!)|IYf?d@{d-{!F+cbEuPbLIwaExz796h|As+RchL&>`DplELGgTLFv;e-o4 zjtBe&^>^E#^%j#)b(2G;wVM$MlEgXyPMvf>r&yFZ>zGv~%@&i|Rze#0Nl6HoH$Nu>6Xs;dds_dvaXU$rUGtl+x;)o}~OGdY>S~i9Tc=B~x{Bqd44UacVE?e;bUxC|w} zMSqR;o(?AF@;NTg}(ZwM4=a3iGK08-}lAbY- z1g}(4qow6CxkBd`I6d2w{&Z}7H$$45a%`L2BhlcgjCH{nY3aLD$R_9UMtc45+ifEz?oy#t&kk0De`Y(TpSwG!(Rw{~V%8A&sB z&iea?R*#fa7#LpmYYnf%-mb&?i1IaHw~UWytZ}hf4cwwzGYu*Lla8OF)HaWPJJm1@ zaaWsikbwK+Smgs&)8GyvlB~Jk7au;Cz4lcUb#l|k7@65Hg_|X&(2(J`j#1NeXs(G_JW)B{(Bsl^(xeKu>soW} zLj%=V!6GA>`T10w7W_2iRO||S`Q+Iyi$yOjh-ofdO}@lj7?|MMLV-&}3o%84jfyLqk|8t5*ph@2O$%A{nk4q%Z#N!{1D9jKV=1xf z5zgFbFqcnFwH%?HqPagg8(C~(uKOaD4}hS~9cVP9puZFletNRl$y7t~n|t z>@`>qn5)129{}57xPHF*{Gl|R|FGy@v0bK9{k);aMexZxcI|u(@$vBgX%I{YFlX7N zFR-=J&68h$dI+cg1I*qxb^i<&d{-mB9nj$LEdC$8)Tp6YJ5CEow&nTFZM$~&<9{Ey z?tT`2O@ICCap@OfjuAi0SENe5!lZoyeX_UUMq)hXxJ~7LOPfSAubB5X)kJAweL?@j z1P?C_rcO8#S_CYx!zVRC>BryF zKZ|_cf9+}Aw&;*6$!;uQ(%SnGy6~I8vW08rA+_ssePhe%QCI};Dcv-}_kV@jYuz#Y zqK-~5MKRF{VdDOvmX(=4GorVX*g=^GB`Y9tOZNjQ#OEgk%ONT!A*MFUkaW+l^|IjY z$mAdKla&o9^K!Io&peM@_PK9l!Y10pV>76MKmtz}#593q7Y4 zoFrw`4D-rQ6tFu6F=V_Bf}%O9enk=1AZeJK`RC_a_2b{k)}NH+AYANN{9t6nptLfB zB@Y4W=!DI>0xwSEddRw4+=D_`E;2-?H!oO2rO33~*SgvQV!~uUBJK3y#x;nM2*hCo zRb@3Mf%H+8$+9p?#?G(z`iK?lz@V$@!_uDCiusFs!3|E(%y6%83b7N-^+iRN9}$?( zu!!OSkGf0?Z)$q>zJ?c7nq{gc0(`e5D=)aOJ?Ok9cwyRC+zgUXhA~RZgK=DS#*I%e z+sZ?S^o`~!z5(Db8#lQ-OGUpn$v0+&bG7x{t6seNHyJ#Kuu1nHIM`Bd@E?fl)1m}= z05fE1=Uxk%dargCDRllS`mVRy5Hr8C^|_6Ud_2)Ie}XzO@h-B*Oh4w$YX1k-J8Pu3 zulm81XS`p41R?KUPJ7a7M4ClIUhFr1oVUh?p8+NOKx?OxCx`p{k>J^wi zz)%5dO^(@P-KH3AIpA7UXy-_@?o?^I{$bhp^g+ZWVc zu5UrJVso;@GSh*36;j|N2NvrVAV z7S2$Cs~Nf#3SA!M$G%w1cycj#E{0N%MzT9J9H3h7F@@Y6CU!6@6XIqZ@$O;IsBJ)V zF~s*sz$&T&$s}^WzUW8D9m#4}7Ew8pn;MWN2XU%$$Ox-Yk7dGFDqA;Jg4A!PrPPkW zZ=9;xJ;7oksss=ed|L#+gcO*8(oNvjA9D*v3%5S_o~w`i7gEq zan230Uv*KMM)o=jL=2*7p%UqiHz$gK)z^`bn)gsT`yaN+<*#I zQO4A@2v&FpcPkK{@+V=CH2OK`R=JiCr&cX<2Y<1tEbh8upaUP0RFM>`P>A4jXc*zt z(T*+ARfiGNzX_>zGqsz61A*X)1qfg>`ASe)2xsGi5 zV1zZvlgPX1zE{tt_U-QDP-u%1@1aNSeX+I56gFEy9>KkkR508`mT1QjIhK^(e*h(e zBDyZl(l%9fbna24--pzh+$s_4+yXLk`3|F#QuekHtofwt^|a#m^Jd#w>9vc{yq4*e z#%G?Y(Dc}N=_=B=!{1LEYCbGqz4m>jCHHSA=8*nkdwX{<;&>HtQ>~C`Z_N3PfON55 zQ~B`O5=MVemR*7}loItMVHn`Btugr2aOYKpZwTg>+|TlI&zCfK^u)^EXd)h4_ZP#L zz;XCVJ$rq;#&XY^sZ=yQW;&c`4m!+@R)$w)jP^WM@Do@pSs;gc3iE;5Yg=lUNIAWy=Dy82XsTG#)3)@_9WI%X83<=3z)oU@B^?6Bai_ z`cj_gbWaNr?Pah>x~sKH@qfy+9@e>_oIpCTm5)06k$vdS7zTqRpkCDIvcAa=l%d8P z&TT>t+9rNR)2Ibm>UejW;ePJgsSwMIDAI(<6;p2DIwjm-5&F?41~)dIb-)e)zv3t- zaH!GJ(c4!yvR|m5D!g=E(0sw2!cNr2hwYdPiOV}=6McHpoeUd7qV$K&dbxVGo${$p z_fU;V8DCAwbey~w$2HMbg!W~~{7FI;jsudwTEfdg6>=_u0weY@qeL!QiP^;H4>V<+ zW$@etd~#a6pcn>5*J$5pdTtf5V0`YWEjt@j+KV|lXAW`snwC^f1Oo@zG|A%&|+88gCgKPFLP@-)&ktux-@F7Z`7ZjzkVL5+~< z*guG`m6nsDUP{sAT48f65+%F(;w&E=gK1!7pphgVq{<|>5jW##7=plPM-t1YXcX3g4YtI< zZ9ixhillAZov9=a87UHUtF&A~v>*U?yZ-L@i0eeI&TU9<-aXgeW%AgoU()~fVEH$p2T*Ci3I#qc@;G$PiV&c%e}~4mbq>=kmMaFt_7~)ay62h zGA^Hi8=xJ1+)Ha6Wh}PlgvpA|-11@|Vm$mtr<*v-WZ!$EHe<(1O%@iK-I?69t-ON? z{}=uS(|mr~6or2@X=ar45s|dxH1zmY*ZRTtpP8S1xO=ffPE0;XQ3-F+^0J;A(F z+pnnSOd2p|Jg;)N)AXKk`Ky;E##K_W<@F%;1Td=Lsm`&kf*bj_D$dHdDS)|R%^)O^ z2-X^~VqLs2MHUDQX4e&aLtcn?!7T2P6X%kIaOxGJzAj7K~GOPDbEalccm5W{u^zx0MydhVmINyHFn3 zemqB3qOnM3dwTcJTm#)1v&xh!6;-$_^>uAcXK|s|=2_XH3Z~JPy4#s?v@CjjJiwaI z>l>n-!8t6y=+jSnZn@3m69_M09sP^n)^nucJiMdW73VD+?9v(QXeo2ivnIOUs6klm+F~PNTV$KfRrE!6P(F8EeCn5#jE{Af2dMZ$ECmYATF*JloT{^C z`8T{jgK@vGj#rxWqdkh!6%+FGI`G)iC;4Sw0O)hG?Xyvn(SKqMSlC3LDPg7C! zLS#=+v<~c*B5{H5@?P)h7t`nM^5@?+mKzkc$NX)3WwT5447)ddej>j1_X}GkrqyW~ zBE6xHB~s`VyjSgx7F#+#5*l9&4)L}Pbcfg;*>>xy^;u=G5&Z}7BHPhVMXc$*+cbUJ zRXK;f6bD}zr$%K5qQ2XL{Hr#$4y@nXcJA2p4YZ0{r7NxQ&#VCt3k?dJd+ckoWwoQ>>0{7FCAf5RM*rcLX~_9m zKKj@!`&3q`V_NC(-s-v6`c}lr{H_Ar^G52tk{8!G_Qg#LVta!xfj`=eauDMr> ztSz$lE@2NjEoQULDoVX6a3+^AkNEO)TP3LyX;sLU-b!{vP_`qZmK5+c;dAw}-`#~Y zL4LyPb;@#r$KCkLblPbN!%2?=XsF!@N0!f&Ek#E%p77gQa&0l-M#j4hAn40Ic5e4{>ia#~tvPP)e4c$2@8$UF9WN#xyt&$Vpi-_9rw( zNy?Rn1H43w7$nIasAT^7S?AWv)KH; ztG%mjL)G#ArTdWV7Pf<3XJn`SrSKy*W#$#pz??U2#-hG;=XKvJ6vYHA3^Bq+DY$q< zQ{mPd2z9IT)ee>m=6FbU;&No*UsC~7(03Qn7lP(*o26%=WGlq0&?c9W4hC`&B2i^E z%}PN;^xNu#FFgFRnVELvgq#Y-*%Z*1xNep@>rDo#9Xq3-2C>c zBLgH17-aF@{^G*Zt*F2Of2vl*^IG)rzf$S9=nVp=oNwYXK@r^AFEmw|~o7eLJ6bFGMeX2D=9P_va2QXIFFa2Ni&{`aPRWI1%21#Y4uf z0=wSQGIQr^>ppgqBYf%(<*g`U@3+n=kJNWtTIPdyjA%`F z$-^!z-yf`<+YWXNc#ig1R^{&B82`#!KsM0t*zQA94Uwb(30|k*cP1U2CFC{xdAPmHm*0PA)1qF$>Cy_Rfo%3dOlC+py-WfsKS%9-GlovIC27#gRjd@tnG8M z)IQl@dhvy+?=#2tHS6kNi&&SSxsQfHA}FycMVFVMI5*-c$~MWcC1?M$aeN>LGqya7 zXz2^8N>fl!E|lnEZsXxmfdI!=hXq*ZiVCD{2OQ4PdeRTFxo(kMkzSdNV6z#7^W?I9 zdfPLye|ye+u;2P^3}mU<=hWov9r(Hx?%btthhw`yhp{qcyHI?p=l~lSTiJVeJ0JB& zI_j`!T2n3sMCPq^jc@^sV?0Tov=!{Hj(5RGG|~l75z`%b#8x7HY|58!w|#R<2Q2U6 zs_0}YZyyZwezJo2q_+$7?C0R3#ELIFNEFO;BUn*N35v;vWH_hhF}ytG?*@)Ee0*(g zxZ;{z;bV5#rMVUQHP2My2w|CUJU+T5V3{)TVTt{CMVs<1zLgdMJB#~L3JIfeT;CWv z(Mb!R+xrHFi_;JjT`vXRv|GZaT2}kHI5mQ{J%}enCov7|H?gsiBE)rMij4ZtUyMD^~Z7a|hfTw-I9ySE@2TP`huv78F)Bud)0z=&Y?58(Zmt%!=2W;Uf?=8r*v?V1mR_Od zXsCC?#atNXw#rB#?m*Z_8MiqT)6{=h^stj`Z98#@ z=|;tBRJqC#&<^LKwLifQgwh7?ELC4Zyw4Onz0aq=NG^@-hq5XX8-0)JJ}dg<=ptP$ zI632;D653q3*Is4-?jVh`|rbjmTMc!axl6_y4xrt#dmsQUmQF&$!Lv7x!x%F&AqF? z=Iw6{+aX(wDZ=yd_MB%{K*kn z&1>UR6LVifAryZqh5i7nm(Z2u*`6_Ad$)P7?SYW$bM&4xm-Z{{x0p2jMlu)j~=|BtaAzHG~QSF=Ob>p4*e*JaK=iO3ubrK<6&=X*Vl>eiD_1soUNq(&(An0IdJ_WV&Z7LOt~L9Bw@%h`u>d@GL6Ih}$ve zBIgXo?@?l;RMe0D@i(2rv+;v#b>)XJq3k+^&;Hna>_5QG&+p!SuZ{!B&nwBLy>)gW zDdn{pTyCI`BZ0p@w>Pc4^JUNa%Kz96-zc2hIpt#^A8X8*3pt}72n?WMYO|Nzm zwtKuUPuu_Tfx`DcK&)@j`M>gqw!7yN--4TW208{@^SpQ-iEZcGq}Vfz&Av_DIza+5#3!8p%#I({TL1uP?cCEnMF6>&-pJ{$C5e z>bhf_bnO28s_%W=%uh1dnaaiNg8GkTUrK-ETu5o%b&uuvr-z7ymU~}%qpHQaf1iyH zts87oUUj(K7C^txO^6Y!wLVeJxRMZk*7O&3^zxJGFKa_y`rLqj&)@ZLl`L!yf92m! zVII|k;CuGCn#KnH`cv}T&qYC-`cT8M8?{YrE8S$12m&$PM3bq#+$){xpL$cIaI5;0 zrCH&boizP(3$ZoZB7?+Pvg#3)-4dsPmuu!H3i)1$BGUMshWGDlXG|((=jy04SWJIy zg>gNVFs?Mf9Fm&dc;?jQmkPC8HSmkSc&FJsUMmjj;m9%7a(UJ0)#0Sp^y{4o(%<}q zUrpI+Y9r8@b*RR7qoj@fa)q1T?$Gso&K3uhQ~2Xe2)5k8~R z@qYm&LE65-(L981u6kU$65s9!{X1H&k^rqO#I9fW6-sS`y51hf;<+v#X>*uvPSA2q z*xbw+3qQBqYGx(dL!|u8F*3j6h5rEX{{SP~{!H_Gu3vX&yq?#0x4E{wWi3#-89<7d z;V=#%Xtq+yR!m-vm9$$7J217P>@=B7NPyLL9UV(mYV|RC?C$|i^gS^hCsjm+DV1oF zvM$|{gMTg9ZFf`Ay1n~rWNI@rj5CO5kUUm)-C9>q?r0KE(5U{uaWVcyuFg;H2(mP^**y^-}bs!Rrdb?==`DnL;J(+&$~{} z?zjLP8)HAE2v^aZ-mxaUSJ!^K#I~gtbN%G`U)y>0-jk|H{{RQeq-~m) zJ)wFqj~ng-=|7f9LKIlg@E(+*t|SaWW9(OMutgn{V-4$b@m$w(c@jydYDpwrt#&>W zwgWVWa&00y*fVkwB0x#T7$HD(u;KfC)TJW+po@1`CgQHJXKu;@18r(1G6pv|6+dhh z_Zc->(>RF8k};xChWp8zO^`^Ip!ifH1B(`6X|R#uf-pb20hgdINVL1cEfOlLK&zK5 z38b$Gr#w%Qv&bDf6Imvbw-9i8L5wQNB8 z!ce#gltDF!0*;rDvD&imFDp+=LTQ}KV$hQq$%5Ju%GHJ+L|nE2l{%GGDJJUBXA!bZ zV)2$MN?gaWV1~C%SPeo~Lq()Z^l?c+4O$AHrRqtRXiHWe5;u5&;bTDyw$VEKXZaJR(a81DDMr6=Kw8qxFJdJG zSkE}y)Bpy(Awz*Q%9L#gNSK!xRB`A{B?P|GXC9oW#3{jUK`?-;8smZ`1hV2ShhS@y zgx!!$kOW&2i2_Urd^n=5NH<_5qgy6hLBm6hxWQs;q^rbx}I4aFg|fr56?}>2Q$lO92)Hn?osk5TGK&)n})?A;3k3%-is= zI1UN86&;1OqHsRMn?|YFnr!es#FImPiXM<6lA<95SY#t;#^xXva#&`mH3n^4vH*); z2qX+yP71Vw&<)~Vu-X}g!d%~C6_qb^sRfZ7M@KRc}u3CjgG(pZK)Z15=^GqZEG-4OI8MPvmhu+NfkCM8$uv4 z>OntocLXCbEixstPS8y|L0+Z2+!YR})9w~-LxJ`p5JiaAqzRM0VGvZ-7cr6{EAS>L3GPB@X;`lVHGPTTwb(feUYtmGuLR*ioqKj=MjK)Vuyto&;Fbz~ zhiSCL2Rs5C0(KE02wTu2Cpez9E(%GQ^uxx$;CL!c3i2z!)r`8*!E<4dHo?HvEDs}2 zg48KO41z>3VwMMycOz^_lM_~|t3-;4fD9alBe^Uh*I{=Bvh+30ECx%n8*%X$e5w(E z$*9iAwn=wz!B?RXX);_8l(iVh1voTGi!rwN6tGv^4Y=Fas-$qDAp=a%O`$k2CCybR zGiuN-UXTYCIZ-B3>=nD#$Ayawl7u#x26oP;i3#8#ij*z5CMAzjP>RUQrq+vb4(-RK zHw4qPu`-MxM4}H`oE4E0ln8o~dXm8Y;rn}0mx#ps6HpDy<3ZWAgE-|)VhKV=?nU8ZTRi38?nIcQ9oXh6kvqP7;DZ55Kd2P5o4Xfjh<;8T&y1?_yNyeWdd;N)%Tg$^H@91~vB zE$#3r755POXCi_9#eFuYDMAc|6KuwGI3Yl+oQwKKnoT-V!C!H2Z-EJ5A(QF81rmcK z`g{+uJO)C!pvqJzv`I9W7Dc`XyeYwQ!TNj;u@Z{=i1zptN(f<-Z_^Yk>ahf* zSs89n1**uvnr8cE8c3>Y2x*1je9)pq^n3#gZgPLU4WW{?&1NbU1YNX~*(|iwlmeI0I9|r^M zO9RNudNp8hIjXBf-e3o}z^Rl}F{16UY{Nz`;-l3k1t#EA!+}*OoRsk3eTiUdO1N#f zp>_zg1!P(D_!T%V8BYfe3w9zu{W*DH%NuC~ydHO=J%T1MEu$3!G|Go0 z@J?h82LtR&1Iaub53v{?N;)_cuo)<6*B1nb=;DO{<_RxM%1#TpMh26DwcFr*i6{n` zPj41I;Z_NTUx$Gm$iRKW35JMJ=kHf2l`=snV8nKXGJ&QMFyK=qCR@XSOfojew<)o3 z`KE}xohut{xqWj4Wl{MQC=+%uUX7^Cfb1E&k%E$J%1k&EiiT6efl5aVtDc^$3M~Oi zfo~24Orr8vgMse|z+|2d2fQNzkimwDP~sJ033DJkI2AZ6B=B%P#7Z7X;NX3Tlo<{Z zfRt!OLTU)Ia36zIsBulSEWi(J6GDs?3=&{+DrF5OPX`0+M4-r0(WVqR`_(uSnFGPV z`xMF^N;0-GD8S*9RlWzjCxC_&B@Yt=fy^O6HcTB>=|f(Sl%kqtyc+}F5}J$dD^wZS zqEO+H;6?=MFd%Jrb)Hf5e>qH4W zHEHue#}E${7p$W7Z0h9Cy|_0Q@866xM(m{_2X=B!G*wj?Cia&mSi}o-IpUc!lHyvX zp#x}hM-hTek|eOjP|LO>syag%JyBjsv%v!&%_%5+?A*5zBOeJgG{q#!bZJSP(Edt^ z85qpRP>TVHN=E=)hy)ziCdjC$!!w!-8>TdRBq=mnwQ}hZwH-yPfcK=@Lsf5rP7}52 zMsaC|c(^Im$|BW86ctwYN*8mgI?C~+sZ~z)Fc4Ko8G3%O(}k$czsC7WI^st zGFvxqcW~Us5RI=-L8)?I9)ZO|tTRWoH3lKU(8)ufBdRfW1k|WyB`nnlTeW`HiE9MJ z%e*As4HZ&n*#6(;JhSeN-q&pidS`B4=?3K7PV7Z|QDx-$8?COgdb)L2Wxs=WI{yF{ z?s=yE?(3D>l=iw~7?3DP0sjC}=sBp>`!uVPypPwbIb45VQx5y=j#V9`Y)^Hf?Xwu% zxuW3@5XTFRigfet+?wCPqpTk(-fU;IyhWkvSaKnE0Vb0SN#Yl)U6Od)bisR`P0Y5? z+ioxIWgC0gnQhC)T85Bc!cP&3diPPhdJ(tBvZ>9rv)>tdR_w}mZqw2cuMf>ry+!fa z@yLtYYny#=+z&@_0s*vfV_b@=>`#sa^}^32^sE~`p}aj$lRSFWOOh2(n8-pI~9beedD1^)>_>8L2fzcGu+$sF79<%t3ySw&qGlVb4tEFQFrnz z&Rj^=0WBQXjbOnc_akUsXk66>^HfzYLhTYNOw($NyVci&D{@ppnQR{wF9wRB$Z7Ds z0%!q<7~qD)6mbCYOif^QuS{QwymZ^E%doZzFTr}3x!mXT<(Dq)Wy@wSTaBi_A*zyp z=2+?N>U8-ojjpE%PH};Nmx5Tqg;vmWrs4(Z;2(}Eq?4l#Y0NC_zhi52r)en}8+ssI zyW&IT#b<3*Zet}awpd&o_pYLAnf5CsFlDMh$Vb94DXb3C%|~<&#BIGA>L=CJ{WNC& zRVu%9mhbk#iZwll+_XnMxCDEUG8fA{Py;6z#DFEJ97;))c~WP zo|aPW*0ME8x=8d}kFz=4W9w~pQrvAsM5lZkY#t!j#&dAFtL9VHQ=7?_B(gK#ouv5Mab;sa>R%dybYrktKoFu%LV&Q ze&)~hc2D~M08`8J&R4hOyTh`L*xtJV6LF8sHDxId8Lqz{YuKda^0n7ngm7ayTevPm z!zh;rA9~%XIaQ+~?p&1R>QBWfRGcxcNu(y*V=dhDwVgV(2E~xjQqU(FrbuVY9@O6i zrI0{;GE&)T1d&iO-MP*}HsEefR1pEqX_8HXP4IMfoVR(o+?}*G@|Ex_YzH+U3O`DR zu_Yz{0JpPnj5lmwwIdt0rwuIR#EfdHtuZ<}ut$b2&Z#0o(%v93$c`z=EKwv8l4CYo zgl_IF!cx#CVhp%B1ECjiMx{76OMAQ7ZY`U4^~S`bD9=n;!PUU1bghxI*=jRSJ?9&) zeZH3abamdj7{^b9QUQmSG50C)^sRM)@80%WS;CY|Nd}9ePIxrgxd>Rh83&Y`Nvcgq zRlvAdob?EJm^tVP$^@r@4h|V6A=0}OVm5U6gr8HXjFjxUz_@vWs-i6LCU2;Wkj8=1 z;oT+;fJYT62)K&-l?kJKD;N$gtj%&10Mybf&cO_{gJA85mIy>!=vzF<0*DgeZMcAD z4+B&oSYRwcXBmWjRK;W-> zM0lb%I)>)tBy~!UF2J2u3ERkn8n!CTgt zx3wMs(HRK*F&q|Jw5m4-yS%GiLpem5$VN2a0@_i}2EDbrCvl^5F>D8NT<~lZ-eU&3 z>b-C->`#S{7FsuhojkEpAoPKXa9>cPR>%WHKn&90mZBjF2?9u%$x=pk^Z+xEDiB); zw^~vma}tRT8O0Pbp@1kwdecZCIfj|apNH72nh%%66Z0Q7s zd^(d%t_ox6Vew8- z@3;HDWp+3Bx4mniFqW9d68Jy?iBnB#m_pgH-OCqZF*hNqO%hm~g4r0^V9$2dxLqRM z&r&}#Hv+RvyQH`%2Fo1NBxslvY%x?YWK4=_63ua#ji|uE$zmq>VV7bW3f~P0l=T)B zP6TV)Si5>R4Y=y`qpEcj9jaS`mbUm391u-<6+t5-SkF}%m?n&@@<1ujgj*jF1WyDJ z62btGK=6TrQZl0~0k290ZUVXHkX0E9ej}s5-9p5+(Yn@V&kZrjvuDUC=%!6RW|SE5 zEK`#f!vWl7#WG~jB6J49)p`kGfjHE+a+wPXjA~+YIHE#L3;<@L5h5*t3;vlt5;5yl zR4tqkOvJaCbf*P08PaeJ`S495LKes-M7T8rtxSZ0CNcsU;;SP=E&wNNljQ-^WLMYu zDp$@C4v|WwdWFM=f8vD2CYS>%GXknaHc>H*ghS!)RGtX4`;ZA00_18s6u{6`F`{DO zi8nQoYBZaQ=R__^Y$-L6YVvbZsq!VjHtl+n7o>W0`w)QAVra;0QV=5%fqHPQjj95BQ zf=7WEjZFOsFq1{Q7w*DWplNL$gNvwR6W0yWYZd$)E_Vw}dQ zXIwi~K1^z`NP4jPfEJBJn2@EkXp`j)y}Y}5gwCJ?0>Ch4$aEyCitT3d1)I~fUOD1@ zsAv?XHsqx^+Bgcj(X1mC%K~PMF&U*Jstyu)M_KTkN|wPtUKg(1 z)Fo~pQsiRQ2>nlqw_NsQ{^QHlu`Y|$_~>cLiN`-;^pZThg*#GtHW5sfVb<*cveNvMUJrT8Y<;zBlwaOl=XT-E zw9nJq7|&D0&q(t%S~)K&_SxPe2f3x`RG!~)_7Cvy`HSuU0JW}0A93yDcJJ41^sijD z0G^#AO{+2)72HS;O}}rS}j20CY#%QrcMB@^J}5+~QbWyjVsu zi+xSMQsCA90M2ZgxAp%3GtlyXedG1RpX>NPC;ip;j^~?hcT(l|KX0qjCL7 zlKQ6raAozLAB3q)@_cWf`wMK@_V9RHTTRXHQuUig=(k(a4S{oqVZnAv^*GkMJfLpb zma0cfd836@!JLfQ@~!^>GMTlo+RJe;?gM1ci5yhlZE4O6*QVF}QSLs~`=6NdzGJuK z{L`5Yza~1);@qv;XvoCei872#s~|I6K2M2TSG8B%cWCnMOLeos?>Wc#%k6FSInOuy zd+uu+{hrDaUu|ML z&7>i&>}5M*V7Hc1h&Wfhdyz2D1LRej!O1o&;*)XcTBDhuXKv&`kuMX0qEI)mD8$Y- zgnUJfJ6&65Rpr1F0MPX$$_Pg8+EA21gsCfJf!J!L!!%CSB=23ja#tpGPE7J)kOL&u zNwu4D#ze83=Mw6wV|<>cmGfPu;@-!VZ<}khv#wV+M3NuJFd85nWZ14P`mB_$PhU@! zTP0gzA7MO~{8PE{pJQ{vYUid%Rx@ zWv9AW`u_l_@eX0QwPSrdTN{zw*o2RzcsK+JkP8xWV!ho?)~;}T_UhKQ#|2M$yWiY^ zy*3s=j0GqJL~?JHRVfC0_d9ZEosm1lY9KAPES$8q4VxX_{{WX<8@^q+Hm^fa*QOGo z3~4Yz=f0}hLpn5h7p0{h=>GtbdBpY>w$q-A@h=_U(=FopeKx?d^VjOCuRquQPiOxC zTvIy%fH33#jF>g_0zHa~65IhQZH8FKPA_dqRkO}S%3NrEz2 z-&JnDc@j(cN=wG0d<$olc;v~=Igd5wmM81( z{cASCczSlD;c=W|55kpvdR5^R{H>O(H-pT6(qbZUsGbq0UlpmEW=Y%7OlRSiS^Jd^ zM4e8})QB5_@+J|t#j2aBl{sL;#UKZ7dQdlnHnAj`I2j;AHHiR0s7NK6_O{F1lnq2r zwN*^6_!+pBtDYiS;iEVDDT0xN%v+A29SEdlyD>d2;BE?_x}!)j)8X+IB(pTceM#y% zNBS#hDZ!RZWZ<|M6pfbw+JT&a6#oFC1!i@BZ4kmiiRcPUdlz%jvuMS>EL)?gQdl83 z+xr;d8=B0m$)a(?^HS=Wzj#NfIYqqF$ODdQ^j+GyP-o_9tt}ODjt;F? zA<*lgBbLkUC_vDh5AagZZ&8U-OMrkyz5DQe%G?>~B&fewwo|U-jEKXS> z&)gKXgQj_P(jguJjvvKUs$olVUGZYZ+}oH0;O$m$cpfS}O_EK0PJPYPEyfVDY(wUk z7H$A1B&x~3Z#mzyB4wqXq48u0=F4$-i;*&LMm7FDDyk->qbb9Q`IMCbLUXo!GSW-e zpoU4+G1kox%9y^VC#y}RC6PCR?*_RqYId$n>A=5C$U7;6M2fU>8Rx;$ z8LliEGVCZ1QJ3eY$cP$ik7q)+_?ge#b0;~IT8<7>L9`Yls2A|INE@sGAzGf)3POl$ zu^b=VojDfA_L-7{LDuF*X>d)A8e!%lrzE6=$3Ox+AvQEV;36?_)D7OQ#L@C363j*! zDKtzB*`J{Rn6d$rlFX9{3r4ukzlT*`2(!tM06#S?6xcF3Gbt$|fX@;#LqORFn02RK zL(n4;6Cy?~n|TVc5{{zcoeD-!fntHkHSA5XjAyqH*b=TVN{JPP5g=Mc6aWd1O%_Pi z*iuNFTL8odbA>3gXz5J3c!_A~934yz+Ces_5b}W?Bo;)V;9E9bh$FKfIG2l7fnA8B z7HOM0hHQxEifIZ-*oJ{Hn45F#_olcLe{uoDV!%}5QZ1r3FIPko*t$Ls(uRjDeXEZ! z_&7pYBK5%8$~v0|C6R7LUJ8^O5XxA^5YDOwnX{sqmLca%Xlgv67O&A<9xTz|ukxsfUX$LL`P~wDWgrv(z zfx$Vt0tNsjYGVqAL7RVYqc$XI1(J0%fP|wbc(W*hzzwcU^cW`4-T{!)C;%L|q7goV z%*{8jHFy8%1c6*bsYv58vl#@V3BM<&Q-^o8heMP8sD59ij9u10R1rg$p zN~&^8cmU#5vXM#1$dD96^`@B9B*h`s`KJLgz)U+AKQxhUMP30?FbrP`bRr5&6cic#G1i+{C2}Z^l#7y7H?*J# z?UDdxzchatCtgXv04W&|1V9lXl3=u3Agzj^#3WN;BqE4(AWVRGXVBjDXdB41i!2r( z@KS)^Vp@SzX3Y%5b*3pQXT>bf1X+r!0yP~+hH+6P7aOvRn2d2wM!?ibd^0ZBwa5daBh#hn91Ts0j* zD+O4m%}kC+?ui_bCWMB^$v)3|wZJ|>7=)m0gijp06M-ZGl8cX+b%Y6*KRlCSuK?4H zQW;>dWYY)>RusV!E~5$XMXQRhLK4U!DH&)?2#^O1Pf=G?O~6o55ClLG03FPG0;_UO zcmYXLL;(;14c%=Z4vOvW#zy@49 z)X7N_;dyohSSi2?3L*fA0LPMDYP|{d77M8;v;j|6bPgDC^GB^!c_!QkEOBg8Xp{`F z!l^N!6qG~&a`MBs-m1b}fTUu}>O2t9NTiBE+s0qgQ>ix=hKd?6s!&5CQL;n58;s{Ux80APytF}Q6<69vA5jsWh*e4ItHdP zAT|_!wHC5P(yq=7GK8(j#FuQH)y$ItMntqpBcTjZG>6g#EE8;sCfKP^@JdT+2xb@n zABjRH2iTP3AR!|YC#$!)Dk-Tn}OiO7Yq(vYHMjPW}8!!FPH*VHbfNi5&-c+K-LDebxX?iDOu!n zuekemC3-~JsEuUw;#509qNMOX-qQT--?{{JZT|pJlU(pn?24|p&#|veYH?(~v=9QaFXJ zHD8fC)nNSj&f&X-*-uE0)-sWR1->`I`j^mXX`{jNrhbCY+*^x-Wp4GccHYh!EkuGt zG(`cQ@~ftVn~zfqc}_FvCuhzlW0>9F$8QBMmT~%{9>)z39h$p01$|j<8-l$ zh8#j9Nqd7Z&B3YEsgjVBfh~>*2s#_Bh}+n;c*)JzqvQ;S0rITrvRoS9Oes0e>sT{@ z@r;|H3xZ-8A>!m7qLAhe-z)ofnscb$yRo$!kgx=jx+sQ{ytE0lq+F&EZ@Lt!C zudQJ4ysP%RXEN`ImZH^Rn9Pe~o=M0sp@muAwt2afcQ0qvy=qbt z5z+<90|@Zqyo>q$pHte?`tFOjCr9n$_MX?7-sgPdc|EM}2#Z@=cFdsm<{pu?FOX-N z%WB(Y)}?FdSK0D%e*EV@W$&y;*W31qygfa4e{3yK853PGIfcK2qjg{1$MSOdyY)2- zljGeLZVT9Flx(?r+^ohhh!Pl0FE)B_3WkdYM_a8+&$(}oipx`^xiI!gsNBF!Tp*cE1eqTzC2of0twRf!(t znWqFmiy*V*#Q+o{OrqHEOp60@g_^mf#ULCTE(l|hau{?W0U|1x+cpXawJ}xbWml1a zNRghbJGxLlOJW=vA&7mkL0Tk-1BQ}h)nJ`PcfnCCScm9R%aVx2sZ^2>z|_yBNlw9I zDC7YSdJri-k;?h^+x)%lOKls*;R1IJfg%H(32rNcevOuArQ>-Tl00uQor|06*LI|v zGSj8QVGs=|m|dEcy5!>C)4Prgj&WME7zjgK*R3QWb7KjCLhP&1$?|5MtC0~W31RpM zOt)AT2O6tH*@DsmxTb-yt@(h=e+24heggpMITC?3R)SK1Y^HD-#D;04G+vTrs83fC zOQt@?xJCrW)sc*IBdHeP&XGAaPnF!e6Fs5V035kvO7IyhmgJl>ui%~zc!`Xq5(~hz z$4D!AIoe_Bp@_i{3Aliw2AP-1QH{A0R9MjgqNzaSk|dA`!kx*aIV!H$bfy8Ay~z(^ z8J!*rF(Q%0G*pde0nm}0gED0h$IC#7H0)h{0Qlb-Ci7?KB;CPt^JE8Qh5bk^?S8u!~f+be@@dLlPs zDggvyW0y!ywpLP!wH;eb#~2VQFvT)W7Vce!p$VH}VWz}~919_#t26|_U=WE8Ev9{* z^desnYJ3N`y z;3uPSS%+du0I`-Sq!LE~fu{t?Hd?f9$`Gd*OAjR`m zh+`EBM~P*KAt)0nBmx*z98eNFa0Hl;-Vo`*6!kHkBrv0JWEUn$mXH#2rHYbZ=~KGbOAAsfBgzgf=z*D{9s+Yax^`m zG{tJ*eY-~G>0BkiJ(MZFNUsL%CBsk*l7MWs(kh!lBINP_3Ni+U$;Fs8O;dacenLQy zX(%-`LQ%|DCkYbDFnSuYXc8S{0W2~su8hxOgl5J>Ga$E zwh5E9Fog5ySZ=kt{kdlTHE7@8gk--Rw0C!-wzzI>BRPu~517D6=_Z2^*($8M=aVZX z+Z-Ql<==LHj`>g7yw{Qqr|)^kFtrh9d3R@SX4Hfu1E%4OWgHGm#J`K=-*UGVUsK-I z<@mMI>l0`6J~6qu8E&pzu}BgnXyDbR7%y$t2>JT{P5n!q+xM8?x^8J69a1HjH627F zOWD3fv#=q_!8A9M?tf`<0tp-wOv=a!jW}WzrX*OC${k@9Zj9x$$#T3KVS=6E1ToE=5aR7%K~QPblue_e@58CJXZ(nKWF~tsm3$? za(DjE^;Pkk%)EbGA0W_e97FJ4x#GJ?yJ2e9=XbZacf)ATKB1?Sn(@g-$M%=1t=S#E zZ@t=!mi9Yq5sjUfh8KhYl>9MrO&<;cW1^3fZ!Yz3s`NOMpQ$;Arju3IQ-bm6WFQ0K z$x1YnL_~~YGAM!@MvW#G%%wws3b-Of2}n8AYtoY~JPf%k3CBoIPDGcvrrb%hAlc-a;D(~dTb18CJBCw{Hl{wMyg?2Q6v@_htefiE z>hr;S+m^3hoy!r?2@-UW)I9-RWg|V;P0An2`L)hdIhz%^H+ctow+Tmr%XX!HO?-bM z+LjJn>|WmQ1xildtC+5Js7uk+4NEBv?r0AYJ=V&jXudw1>#NI8QM z831ruR=V!{LA|zZ)}mVe=Ojq_hGe{nb0di-7b|!-7~IG9bC5`FoYg&uba34@NfS65>FGR;~xC`DSOJQw2c#*UjNfpH4VX?4N!i*?(YPZx zX#+L`H6371$m{a{S-jug-u}W7xgE4k%Z5@BXb0j)6*t(c$yD*}vA({5+_iSq>#({& zlunWXs3B{EkyaEAj75>)s35rfbtZ<(l%sOoS|Ca;40E?Bi5xW0Vx^RrHp^O< z^(%}K{$iset;wKJ(WD)FFgGo{Lkd+0md&%ZDAqX*be{W0M?;&g&;$gt|7*D}FNc+SEwY#xZZ;nlntr7)T8l zqo|%A>a>7t6QpV)K3^zc?u3lsM&Og_xXT9VP2e?ph=FMjYE7E4_igA7PNOU{K^0PdHiA+Z0NsgLSrv_I7WEj3T25BT(1>W08Jo3Ye5X9*xu`$TYLPAl9pd>w1 zq$b90$uls-3=d*2$r^Yv2+&a^&3hVlvHFx56wxBUq4BN@nwO$rc=KlbHdj0ESC8Z!69LO9>?6K$ds>5`yGhi%*6BG&K;w`>P@Z$8U)~D?15_0 zxpY$@&}pAqcwoWZLrf!GLPf!M#1z*CYw|gyR+-`wlX|m3@W4khlm)FOc@pO)P5`?@ z>csW?kzPpH{?QszHS82TF6buNH^S6N5+&aiFhFJjm=;b(m@|Z+Vo5R@MKM)mXGh3J zIB-)2qUS4cukb+3cW#Lv3yzeerBYflFu2vhRd{4xB?(B>p^rjH1_}&N$Yg+d1Ji<} zhi8DVN#sDF28wL5EqntTWPor|Q)QY_AwUKXR;Lt5)rv75oN}tw{v!1Q0fVSxNTw1L z?nH^Qw6bzFVU~dtJw;L#m@pcoB8H8V4q(E1aXC7eDKoRo`G(hbv$t->+BR;$jdF}5 z7Y{7KJXRX@y4yS*oA*}r#tr~3DluC^IND?9j9&r*Rzlarg9wSp$5xlZNix-nlypi# z+z)CK9F#~2NaY6_+qlPvy$gaLq_&3CX2jiqkgL$F>uEY~uc?xYM9iBPAO;Sc zgp$-urW@fPl$Rvg;9;MPjDaqbSrV=W;?;11V5u!dkc}m?OkfcBcOY>E#1KzNDIr)EXK>GgmWnB;J*r@G3xh^OLkCG6C_|91d7ZKf ztWLfK>Ib2e8Un!dB_Nnl0I)c!kZf(gEW=gH;T_QSr(oRPjuy z4*Utw!h;mVnT}YH5XxoTa!VTj0HSY_D)28&03|6bqA16`G*EW#2!an9C}==Qh$$w^huK;h(OCIwm1ZbEDP4+ zA&wXjkX7WXZX!C8W49r-CJtdzWXXsE`dzrB&65h;bzBi{)Sw$W5!59ZLk6iB;n1kf zoW1BGW;uX8%3!o}uLij;&vI-vJPJXf5*ZL6zvKS^cjT9#y+Be?Me@ZafdQFxps=9Y zf_3DZa0$eCBSvbRl<(~i-j;+Eg&d|K+_=&Y;+UuP4Ef*!jzUoUH3P=cng)fJxRf#}0EsC150!N`1L#x1#kEEPb6m%`^#4Ve%A*F|F9tx2S zobp7Z7YGm?Vy*?1-zt zwo=h#KoKB-fbdVTQs9TkDp6!kK#2iy^GB>Eg!n388B2?lnCkE?sCcCXNFSO85JLfk zfe7&~t+FE}I2h)T(g`6DCWOa8)Q$mKBFGaa!Az8pI*Ma}RLIDX2XoAO6mB=Krl7*8~n8_wuK%iqG@&5oxPNdibkwXRnG8t$Q5CPotpTe$yhm+*@ z^gQVx%$CJcO*h%iAreP#TP}OMQU91F3Q!fLyr3~$;kC*F(}=+Plki?THxlEz_Vs|??%Ouu6GC!jVe!s zW7er!2(??nFL}%Ne75W?@1f{QY*?6@5F|XL)37nAzLeyBKY5i?A^S zknHYwlfhoQH^{b8Rp8BN&d4S+(q)YXeQQUPDQJ=<_>zP}$#(>XolzhWOqB^t3k8ZA z0kmAU#t^#pLlK3~N`d4k<>Cu5Rx zE@8Hr+U%#GZdx}STdYi*8H#zhtbC1Cd1pt9y47%v{{VAsx4T1T*6U2|l6@C!=#F*O}XV)Z-x z%bw4e?QHFi-_wneNo&;pDNE%aGRIz(R&?$1yQqWD(2C>5Zga#BfOyI3D3p@kOVDUU zd_AfptdOt`iUcpJiiZK()2=$pM>G=nDq3|(svjQI0vln(-Z=vO#U@n+O1C6O6Yow4 ze4eLu$@V*bRUO=Skd^XeJptyXqCPXjg6FQ*?GSfg#;T;wPc1T95;#?LdK?wxD3K!a zq;M)(r9y2N1g%RCEWhff&~5u2eXY)KzKz|!+UKY(#qLF|MWco?ZYwKRi!9QP_QEjA z-Pl~6tMdAm+!(N->kDc}p^nbU`@{CMDH6UgNWN}$u&~<9p*j>Gq+m>g1TA78i1df?C zTRzk~iE5Q5a6pt~a1|j97_LWOxNi$uX`>v{RfAjIG+BrQj2{emD{m$gOR3Piyp`)V z?3iiM@jppCI#y|9-uopQHaw@9b3YElX*=XUlmmkt+lrl=t6#~$Yw_=X5dLBI_dMkz zS25UK+Qvb_oEnbVK51+6DSjDO@pe;`ab*K5a%ixLc>_#C=C@oNtv<$SN=zb62bEGA z0~{43OBw0TBUGY5I5;Y$5ab&+K>$->Dg7D+DgYKMw>;leeaO-pR%^Rj^(?Xt5+}jO>`TVqCsh#J6F!{@%O!l z(dqIut!KtQ}rEtKIQcl_8%$$mEz!h_F>+ixW||=}maN^qCWWb7 z(~g*u)#yWM4JP;{#*EzdDr+Wn;1DaR+#CXF3^Rd1kRZ5=ilRpY2_Bh$oAOR@N?8}- zHE(K}H9*Q(wtcE(O~3--4H)*6(j+*<%!w0FtJIrt6}z&t85oB$i+A=ZwItfNfg~A| zA{p^j=tE;;;e%zEP6$k8v2xwPcG+SbsQC4|O-WU=PEoR6r1Y7|A)Y1Tl_;JTs%=L_rUfGBA*YrXtY=oyWViMC8%cz#>E!dW;p3A+xzA zrxZ2~k};?}a7B40V0Wh(OzM`N8K-VZrcjat(BgzcH34W?ktObe;8zMC;-t|>U#X5~ zQHcTcx}=DKk`gxID9cHVv0!pn=x0XNjh1a*+{_C$WqxFNVG|=y=~=dsqN}sPj_{mh zVn&`JmX#-gT17aj6K2S5Zo&|~IJK*wn91T_EFILV0>4u=`VW_7&abzGrGY_iiF1veh#=f-Gca26D-G%Vy=| zB_C`50LksGS}o$YKXU&7!SR!5MsE{}_D>0l{jI|>BX9s2=#&ED4v3R@jH$w%N`%eZ zYg639>}^C$fC=$L032r`IHB4RD_gac89i%pU`rE~KQfS@R_IE0-qcKle8g3Q99a#H ziJXW=Mt&%eGeSm|Y7O7F7bk2+RRlS2^-RaK9WifCpax~tG(~tJBv&;hES+^+TT9c& z0|a+>O>imhP~6?!-3iuW#oYpd;_h19Tf9hdf(8l{w^AUVXC7n>UtdW2q2pIgfI3XCk!yhj@7;1y_}&l{iPi=FZcm2R88q{$83m7#Lr8lY$Q3o3)1Uq!L_K*acVL|65!`Rf`!yh}qkXO=w3j!^ zm0m9$dxcvNb?Sv%tJ9l?H{9sS7I{GG?0Fp!G2@vVkiOfJv8iy?YBLBS&ZxH}Mfqd- z<`en&3!}sZe7n*7EV6UdQgre*a`mO@n)~t7WZm^g>xC<`^rqXs;KIk1kX`CB`nla# zDbH=Rvt{gqhW`Spu0q^=O^q}E%>3T(_gyYM{E|BR{bGS`Ht6VY{4O&8DnV7~C}5`#D#9crMrOWVm6=Dd>&Lpy=dg60w0C zy*QgIVGlq`U2a+}F#)s<4gOToG1;)a9JzLHl}eQt%+yzLVdyc7?$Qxz6R`M%xD)mH zuDh0|?C*m6mlKu-?cejxZ6$} zW)5%^2>y~D_*`8Oe571Qkryc z%zL{Rdu~kxwZL>(L#;_dZ1%d~`d)$eb$;2*N_RTP2fJ=8U4IYCx=KVHG2|VOR(>Hn zQUE15Ay6W3(cR-Z|0)C&fIUK;pNx@LNmJdh;qp`XYimP2#G#n59(@5d->C;_)EJe* z*BW^#S48!{*W@c_(2o4Hv@_GUc6tTz)p4?6PKeF+04o~ebZB{-c-mCudPA(MuxX9(?qOj5(5x|WHK35lZO2&4ai@(`Q{(_R0FDh zKH8LcH?N`5$E&?o{MFDjRy~P|i@g;?)jxEEWfx^C>Sc_COwHx|K2<$gmRV^tdxit# zMS6nwr(p`)s$DRZ1Z54CX+^_qCZT)mv`IZ336^YwSxiXN2mo(wCwevQxp z|E=hD2P=`4l;c>ElN37SAZj&PB5p=)t8;I6N9B8+47)!Xc8Z;74(q4g-$CTCduzWW zkDepimNdS;NexCnl#|r*tgTt$yV{TnOC?6V?sUTgab*2;kt8X=Gzoeaa(QmGt?R@`9ahAex@>}MQ~z?sV3$I;B7 z08iTW`N45Dyj{sqT?==DYZU^Q%K!%gUP1$df7Cx?%&e--)-q!Qe5gKQMAjH!ne5Y6 zE~VjV+J(Zm>>&f+?$q^^U;pD1}5vUc3}Vj0ufM{e@@B3iav^cK}(8 z#_j%D))hWYtZ=n~dQSttT}hs@4f=3k)TszwA04P%sd$ec)y&xUjGeS_K$7AsYS+I^j=`m1-|%#eTFetJj-_+VpiYcKC^ zb=i51CfM)3>>8VBwei*Q-|$gFM+yU7N403CfY^w*RQQkIg7(pD5K0*}R4{JLw7Yzu zH>&nr_FJXt9-g%;b^M{C$Gwsg!CarDXVrcws=ArwwAcQ`oMrX=(%j2yol($`>&>Vi zL@wx>_q}AxZi~DKJ3tSef8DQ2phNCl?;mvy9TsU}#_YxlOCo1jt2ou|jS>x*8ZXF2 z&;Sjn4v1SyP@)9Tj%^D|Ub0Slh14Q^!<*WU#g6Vi9VfTK*c%0}PeeK2 zEO{%m^PH64VEu}?uCf8C-yHmeb|3UF0GPOm%tw!M6RIlDb1yz15eg>(v|44x3RH7- zvXs{17A31uO_-*WbvmUT3YM5Jn%>GAqJesg67f!HDzR_UgTK+5+(?A9bsLNcb>^j+ zI^Y!t>T8NLk)UN)x0e>6oExj>Y;q9cS$(V|rY48I7pOf-i>H^u$wV=ckG?G?%TS)C ztf<#=>!Bj&#pl;O|J>Z<32ara=iw;McIaSw{UFa5%d|aU_L6G|6@c8fPx4KrEE$hj zk)~4{!LIN;Nl-EJFW-0X#9?`(4BY<3F&6app06kPduZ70vdW*P9EPc?AS(`WwQi{= z=MMfurMrgVv`(F7G?%0E$qTkA4&hf%vihtT$d(n;!$3(>Y8#52g32RyChYno*E56V z0q@i+x$2|@wE2Q<(J!&sJ%zDF&TA!J)h)U1xG=fmr0I$~Z4-30{I$2)SOkJ_Qj0Vw zaD>TTOCOy87ETli`-5HLb^!A*uww+|!3^{B6u zyE032OjiZwud?E+#^EU_tA!-3Nyao0x9rbx;2F_00bqDcvV7PT0wZNQ&P6~L+81c* z1YLd~mZ);}vvN)}>UY&q0Gad;dQN%KeeFf*fhD&-=CoKDOICEk2z_cnrRjnx9u%H9 zpde8ipp~nT+(Z$5M51}iZdQe*Vo7+!pXF-eC<$QIHKjzh)XY4>!exq)Fg;ClWMo%p zr&mA|-P*{GCa^#b)?bUoQ@y|}U+g!|Q`W(LBLL*&#nwU*2uC-}h5|ex=S+e$tbdiM zGPW&tV66Vs<>d^xXmeelo>u3Z5FFLsWfSVWLLdyMIm4^;o_f%m0o{6|o zX#qu{j##|uxMLn$zA3G)4|p|dS@fe%b!Xt3f~^_0M)0ygDaDF&gI>D8awW=Uv@u&S z*^P@pEiy1Km|{%~qR_yn75$af1#lIl(@Rc96;le==Xs-#ooL8*r1qTDV9?J=6+--@ zY)X9x>bXC=+oLzmC{HVaB^tu$hPFi=K`AkQ7eK(qkoFYGX%kJv7%zI zfpYS6uW_nlQ2UvjnGp#c+7tjMa;9p1cYx}&4u1w&H2#H`X9? zw%@3=I4tGtCpG1qYGd!m*BU3vjVhpeM2FGw6sv4!PjytRcR0~eUoRRpb0Xd|VdbHb zW~jxAx`!Ubl-Vpu3BxnQ^>G?4x$Uewckp`>E zU7DU@JBn1PjCH_ewyaZ&n*RfCM_~5VhJM%to3x zi5fL?`?=X>kTwVRjMyL~xHp~KyyvU9si1hgmX(F`&80ZrLC?=km^OA4X z6YLq{eq~cvC)%xolK@DxyhYHFZcGL%o?CTPH8Ai0FI{DU{ggcXK_G<{VHSXs=EYgE zHmMz5bxKrR6n6Hq52gb;kc3_hi`wsb5eXT%Qx+#@p;mYMdj4g(-VfK!#d^8Z+vRhe zpAD=k01GhTykyihXVTV?HRXQ`)n6%)f$GO0R;n7rDV>PYlF8aEm{YqoVJ@SG@Izu$ z6L}p$=AHf!z`wzc$g|xX#-^G6ZC;jyAV!lr=lu_ehhE`7)l?MZuHyYx$ zcBzypHGN0^D0UX0oWt&hfihFsQz>9qMZ>d|0SuohAB>LrY8PjRz{ds&xaY^4$Bh zbh@19#-REhFFg*6d|6wFWcn^TX0MsADS(3fUih=NsY;F+qwpf+?6%D1PUqvYCu0gz|nI&$B(IO)ah23J_P3O|MO? z)kL+*e>my??)hXh^=rLX_2%uUhn`ScUerrO({1!@OxXf(1_44`O)e}oT{RJLh zi9Cdl=!f)CaVnK#XH?9%Qtq6&)i49@nT>;=WHl!Uv?n&Cmdux@kXKhcxF%_K03xCh zfpV@PBpS~idi=en<+0RLX%kguu96^fy0m!8=4fAv#Vt!*iWN_)BCD6>pfN{_9EwL! z`C~D~r>3p7;dH-qoyoTY*-X+ZwdcV1v#-`1!w*dRDl(%Q z;#&dl);GL(yQvT==h5vkK;z2mQ@-lMXWuL>%jP4)5#*;aa3$nV8(AS0BD!hxfv>jV zSCP#_G4}ESl(|})G(ls4%#n}bh)X~wiCea1aQ(&-+AFR`%#p|3lwG6Z^4O-h^pB0@ z(B743@znKqQ?mxxmsAy+$XDlw{r6*jAwCg}1xKt7{#hgwKVJQ8?Gv{d3DiuWUKV$_ zie5#sys8>xD{rco{fa*3=dZ8`FvjFG$y+BUr(xCu6IVlLGZu<;P%JvEFZ~_}D^GT* zw{EYL4RLKcqh*Vq!*b;YE808#ro0)bGdM`!qO|s8>y+i5y*K!%M23F}f%~W+5=fFA zQ;!nO33E1sE?K#wZoM|<#;WEE#LIXo}qY@DFH;R?58-uF=mc&ri42nhUmxkYT3Hq-iJzV zN=Y4d8bNI5%%X$)eQs{HEt?!AL76GFPu!pgfAbxK(3 zFQLCvaC<#m6!L4Klpbg$sd*U%lNrW1_U*lRHWydlzX+obGZ!-V-QU+(2w7fhX?Y{) z=_^c4T(|IuvgSIHqJtG{*|0qHrHl$~00PiCI*nWt(?B|J9l4cQvO-5ww#WmI2q7%+EB(!{RuIBX}Bl%L%YAfhknThKzs`oU7 zK*)s>|4sCgQam|$(vyQ@s>3hIt~p@}y`K6r*)QlF%VfWkEG$F%=>Vl=0ic!dC2`WbG!`)017xzep0?cbQ9z(}AHM3@)Zxks@1t@$*ui z+1-#!6>kuorjyZj{A#ct`i|+hzG2!bYp!&-P%(Q7c^M;ssm946;N)=eS1-~L`Fe^7& z34EdI7(3^lz{^F9c}*Sd!F6<82vrI!$SFis(|e{r<7T2)Doi1`+(K78Hi^14mtwo| zplDUQ#ava|GAkd0CxC#W+g#$>j@7Gx5l0)}9QQs=Gb$rZXL1%XP9%8|ufjLI<>?rC zUEssASBy(368er@TCmC7fZyvoZq^6K2Q?l#F>+llH4R>jmWA_DeT;QWg<%r%&zl^WYBE6!6D>UF2@G*{Dz5c<0NLh!`C z$>2EOCg*)zZ+U;@%!TU5|5u@(`}nELH0P6RvUO0=Yun4E+o%OZ4L2!_5kt~#7q_!Y zdZU|W;mkBEzN5daG|qIQr{MzN@+7Op3YfmS_k<&HvdneGfSqoo`n(Sd}o0bqNzB&3O>yXz0E1a z{q_8h4Kce*E{G$u)pP~P52k8nY2SD_uI>*rnq`%OUm@YhAo>qwH-|Q7Ss5jK0f0cB zbIaZw>p_v~s+{$RoX3RIoAd)A&oEk&q>n)pB+l4sdQ-YlGyZS)bSJGKA}wm52;3NF`ATX&-q-z&lNrbY@&?}@e?J|C`xf3=BiXTE zeI!BzdU$<$I{AmOrqw*~9?}W8x8Omc^KYcR??bQG5&6xVgQ5QEeIKc#3pc7%U%%xG zZcR-98wF+%w8CA224Z^$Ut9~k9x3{B&lDdww18^)f^R?TRi3u4A?PiU0H`Z}^bU-| zQocE7lK`1qB&mhTJz20R5x|bu`Vf;on6PQL$V11SMvXk?pZ)!MDked3`sBa4wP%H@ zPx0N7lKIf?x>2O^bhlzxe&g_G_xfp0!9YLn@lRV(W=~6xUX)tqC^CXKyzVV<`NiI8 zldk+a2fHC<^6D>tjYL6yTFjiJSh2OQc;n z#w6QARQfD)s>v%TEvUCYt_k%gl1fT$HVAUrUaPoJ*n+W`sU;Ja$%p5LL*kym zw+k+ZYpvFAl%vWWS8~epCW78t?*#LFzq;WK%|=+Rx~K?1lUJD@gd1>W3X41lh8au- zY76EDy-%wx-O|Rn6Eb|WvqK4ce`uX|0K zQ^t5rsq$l&y3{*M7n(4LJr1C^-&Q!vOcGjS?%Paw6V+5rKJV2j=0Vb*1QGZ>D@5YxG zZ;=C=tK!rJ~92~9O9rPKOO-igT z;WmBn&nGTg-r^ogcA4dW0YB=q01U*X`KK#Yx-(mg7=tZM&G5vTpXqysePUDVyH6w- zLP@2(znAx$f-}x6!n;-3r64{&AyVnfQE|u^#cLhmBq3-H;5aI%vPlEa=IC1XsC41F zz`YowQ%@dU!vMc=C|1glG)bU|0IQqUC1^Y26W8ANe(Rq$+v3F|qz=j`;WgxW^Ys0a zT|ceqDvG3rHho#c><9WC{ZL>vv>nkdL{oz2IHI1-5!0N*kA;0QqEFxd1q`)~c((`%X|;aW3^(O!`iu3w_oinEX{oYbr8G!EX6wFigW_(rY;5p*?&TIb z`6Ek*D?oRMy4$mg2u`S3M2-R5aWc`iXRhJ7qgXffYu~qXpSQ_JUe=_f!V->xR8evJ z4ja26uAL51r@ceYEFd{uoEPKm4E5IS(K`FNr=35$>7|<@mv^3udMG=o@g*=$;SHy2 z+#Hwh?|pj2e6K?oc;^c=#KPq^THwYSIWp^)ZVp~ML*s@$#*C8|>(gPxl}Bv6Bl&$T zoRdhLWq68ttiQ+c3>ua@O1`-HJ;bZmgy6#o-L|E_qkrEZWCW#|wt6i6Hd{rJm3-Og znC0;;Z@n+-wI{4P&`ny=_@c+iYxKJQ+hwRztN~{tx<=aU3)dcj`_5hw8YWb{ukpR1 z&3U?%=K5lt_<1f(RieCt0p$*S#N_ckD<>Let{UI#lo}O9M7pR%#PfNdrkilG1E&pV zxR>!>y6NK~L`XEDL-KXXpr?z`SAD-t_ik>aI>Xu*I(r>hE_L0!zM^xh0>zp7?_X<; z{68B-PdPvNu$j{}{0q3|dfp6wV5E=JL3s3<657z$pY0dDCBG8=%H7Gt&LQOb%we&4 zeZ;(aOq2|#HCntq3*F2+@=8zI>h{&L&>DH|;AzQxqbF=WglE-LE8)=C1yO!7ZSZTy z+CuE~_ogj;qbAnd6hPPR>UFfXu`tdINPm~7Ad>!pQ2y-Fc)5}?E5rJ_Wg1$`u>4!^ z!rgkNV3@Y$sLf2(#B@f#c5;`ZlrDhIIEdN1xg(Us?V0-rrDhZNvEudhZ(T^mhu>sD zPQU9Vyvwl@YmfGW-Ze5O`zRjFO~-E$>!UqSil{jIvO4}0h+MhRk6iw3bnmhlq_W)| z%9`JUfjl&@cT~M|ePtp5GAv$HJ6C9UEn>GR5t!QLzOgka+iWYNed@}Ymln8WQjAGv zE&;NceGou&hgo?~i>C@fC;8Iqdg>!C-^)muFk=V+)RWFQ&L$q$@ujp&=Gxb;RIE$f z&St{aXpXzeDtPst8}!FpL{x#i@Ec9NUI+hzE>@6A@VrKq@K61{Q>z`vFJ9Yd_P)N6 zn}Ga@$=^yxp+<&^syg2Vd-XDDT>X^0@-vd(p*OABJ#HXSLa+E#L=)o**CHd_8~fQ_ zxGva2#7Je|3RHR24fCbd^n7s29h_2Lt;RW(qiR~>{>&<}Io zJB8Oz23qAMV|C)-`0G3%)6?5Y(mywqir_F8HkAvj|NgiH6L?ZCf>bHeA=u%`)+7SM zwa2n_bj)nr+qI4!Kl!f2#s6}J3jS3x>kZV42~&`44^Jvh`#M+G#k!n0oy2QZm$*%0 zY`<55=nSwLl3i+rL$rhIIm|#4%-9Ui?S8|e6}5zjl6FU+wCsv<0`j!!=C1Jab> z+-UDKY zP_26qa?R0GYPHunNVfmZb)KC(x9pRf7ExvBf?E+in&`)E4VZu1(0gy2BfCPtj#%jkiBgTH4V~=- zT=bKW`H5)}7kt4t;;VH2qq-)t56D|GOugWdK5cmHW|U}asQ>Lr08WV&>gFKsy-)bZ zr5fY+$n$$ax8pUoq(FF5mCOEIYlW_gNIRwrd|a9zGiC+$-&b|Q+LxiOEBzns!$}Pm z#R&wPb{Wl{4yf<~_&0crWJl=)ai^FpqnoOM^>PT$;`qU{vbB|5FKm6hUw`hAkUjb{7ZyU`EabHlpBh|8 zOhHq;ur+_nJ@?g?^HT@t*RRsj!RK7f!GL?)XIbBY^iL+Y+e$^ixm7`L6+ZK=4(qj= zD(PaeJ5KTaDIUZE!5<^jrMVMjTuPzz&@sR9<9dhPpBkvTY|O9v&HVx|wwmDYWj-#@Hf6Pg!hC>% zI!53R;R(Lkjod0~Uqjg+hp-2G@+$45UmcJ+{puvlCG77Q#vkt2dRwOE|G7ono4~+p z^bA3^x)Eb-_E#foJAX{3Yd_xPHI#w}!9M$E=D{J1i%hgvT2)i;~i)*_3;>O{B{aXj&t6dE@RQf*ojo2S*EDn~3s?wJXVL2tt*i zjWwxIaM!D=60sx(Ik-~2AU%{!5}MCGn*hVodlS>?gsI)H8g^4PMT9frewxE!AcoZP zbv|)%!?llRZ5qc|WS3YMpYK@yP=Bi(winU+=|Sg>AW2@`JRs8U;Q($y1@j8~y-3_@ zy5%kSG^zS8aqQZ1$+<%SOn3p6lF4561r~!WM`2mZnjU!GH&pUJ+6XweTd^&T+Dp?a z7pj^Vr&C0a#}e^~motx)aanhZV(6*3&L=XFB-dDf;Y1q|u`>7PQ0<*p+lI!goZ`KslVJkn^2Rer+Fen{d zt6E}vF}kk#31HTUBbDcAnZ2fVXJ$o=pe3y}RIIqjyabkot$2KzCq+K9fe4}Tx~3Z0 zX6}x1TvJ(FH_e8K3t9PVQV!`xz?E*3&`pN-rQzDPZ3Z2&ljIiIMbtH+_#K^*BKMIT zEv4$X&WB?1JEJy@)46MGVMZ3h)w1es&!(yv=24jq`$*VdTQ?2dn?{E`S(%%&>5y%zfr|lDUeu=+l4w!m;}VC0*&idr@GLRnqSkxP4K;+$BF(gC0Dwpbg+0H(c^Ex*1#?84bit zuzi7Fsl$`E(9RbV`(>M3&)RgtWu^n|chS!mEslz;A6P?abz@<3veL&#b7m zY>k|P6SIYf?|#fV}m?_FJ`ae z^VR6c2HJy_XG!2RPUIHN#sfeFV}F~8KxZkY`2OC!VYiFPEg-Yxvu(F*v&WeX>GEqr z9DNZhQqKmt{~m*!)-53KVxocHDAGi_%jRX2+^}@nKK%axMzmPdzBOF zynEHphqTZzX;Y$Z6Qz@F4JgiUei@!RfVY#E6vH2hJs!>7z+ssc8dQT9u`H}UPUyj$ z=tNof`aL3}xpZ3GvIvRdF4QWrM)}X!^yb#fp{%1uxC6A6Rz#{!+9dl?SIH0(xEeg( ztr(rBT)$VA>VXyS<5_9(=kXf_`Cal#WDnT&Zel4;D~%3D#YalkqW^127kM?V``@y; z7$5kbA%pC9DQN@XG%n(xCencz4a9>+K`B-c1m^+=xyljmO=OX6K8NYU69Y}_q_xZ* z;(mR&L2hxkXiy3bc`zqAx8YB7zM7`;2njz`6EP>`k7&1%%P3G3!FEzW1~(TQ;8AdW z1(A&Hc(qza2tnRvDE-%PMzhraY^Q2Mzhu}eW9D}-DrKC~tM^KIb~(X}6`i{>y`QFo zIkN+EwQTMhc>ox|vMh}~ILKEu1wL9Q<3d`HV;J4V{BKZ1GyiS1|MrAbFLF!zeyy}%mVo2pdG@5xzG4HS|cS^S(Z>)EPdDWIh6 z=R)8N&f2wSSgT_`eT2QH^K!$CDVP-!YGuhj_WUwS)WQ%yA6@S7T+3C1F3#MEoz%Lw zh9^X90OgQkLL>pCXgX@yI{4=_(?X4^u`_%7VWR(h0I5@k2EGH9K-_v1VmVkFbaItI zHjBQz>xb}mi0H#KJ_HQ7Z`4_0WOO{EE4#u9aI@-W2r;v?x3ezQ*ov=#L)+mx8#Pe z3MiJeHfZa|KgCd|{Grn!p6f(^qrT7z;ho;yOl%TD6&5GU?Y9(RI_AS=1gQpL?D0Ld zbiNmmH>dO@2t@HQWv~!5PmWh)qs4B~`9(r#DX@{LPt_>SmTuKC*%27{3!1Bj zhEw6Ee2J$nlf;2UH_G8@XpgL96W1!yW#P*O&uQ@fV3;Vx7V&uuOT~oulX3@)ondMo zq>5^IwoB85dvl`sMh4@h3A{H&+nD5DSJnIsgq=cE4EWT?3MzqDI|OX8n0lYt-?6OH*dr&%~MUUYWwPD>}DmzS8d{g1b~57<9GezyASob=iRxj z;^abTtB##$rDjkr0tQ;}WvXQ}q{)d^$KxO*a+-K1ILA;@61M6MRmUJ`V?Cjbv<(dj zp{NNYJ|Jca7o<}q&-f+9LoX{k3qKnFgis6`Liq4bj8QuMh@L>N9q2X_+;O^QD%(jP z(qu%)=xE!NHbV;-cNq0C=Lq1su{3vP{T%5`&;BzU!bmj~gJB4Na>F9if@PjG;q`c9ry9LdDeQU`B0KWE82^K!}_oJiXO*j$x(KQRP27Juj`$MSgNIN;J<9V zBAU8StCe)JWmD%MZ{ErN#w)--YhH(DLe8S@Qa;HHK_P)NLK;)%(CM`4@rXvNd&!MS zc@jN3*_L8}c40(VgYi`)+?m6ox2!(}ytJZ)&&=O*th)U&SXZH{IO2A5{@(MIM!Gv^>l!Ln-i#DwLaBJhBytk2W zdp56o!FLYqy)ehz+6Kciro4*WypX8{XULix#BtG?Z3wq^8H7`FzA1 z!Z1${^tPSslh=A5-#w|D^!!n7H}-S7cS2{qwxF7xv5;&sRJkz*u5VKD_V8}jD!bwd zfGF1_bHQLmeltLRAuZ`XbIEj@fef}LNQN3$f51sNdwva>&8>B`(UeR{>vBD9nP&AR znu0LdnRnE<$%k{A~l9 zIhK8Sc?Iu_bf8j>`hx3EP#YwsxR z?qrbw6_h-vD0qf%bjv#K0V&2r6Fd{LoFmm7()_{)n;GS;tCFfgkPz=1!eUgEy4!R0 z4Ro3LZCz!Dn{UP5PXa&%6BhM;kjjeF9#Zd->%?8ZByhOLI7%XfFOy^U=6E3U`{QwZ zU31cEVrH@gTbs{UIScpY{#nADe+Dh_YcG~NIT!uWi2c+sBFq`Op4_jdmya6Zbr%qw z!#~scI^QPKsUqclHL5b6I`x?JxPV4OB5S*xq8yUNZNxj&p71t1- zxLQ*j9aW72>rPkIT}?){$hL0&&TsDQ21rR|?(J+B2^91PLH`hz?g9URB5+3AgOic>BHDFDw}5{iVQHU-_+kQe|5`|!xYqN8i-AwKak z(V)5x#CCU}#&4uZK|a)Amzmr6Bff}mseC?=025{VQYj;7PHZ6Hw+#$~ccUkVIjnh(<8~K*>m$NRKOTBnduR2-)!oc)kl84iVeiTXs%*nu?Ph0M>bUa9{X<+P4pg8Ea z2M^Jt&4x&kvtrGz7tQ2vuj@35Vzc34n~yd^`10BK<&;tc#LGtI4H73**icH1;fThe zf~()^9!HK+kUs3FtaS`FCOF#%k?HxhtK9*eZ8nOzH@bRsI_?H-Ys2Yc(MT~V(0MG0 zK;*0SLbi3A#EO@&e8_^WRQ3t2``#K>bb^i}G9X|o`zNFqQ#bh|>^JoDAhQHDU>gwy z0k-BN`zYf05--T5>rh0&DVIY~j zYxgG%0SF;*vpV?jw2gC*ITa8l1+`+@a&={2l7%DTMc*UWcdWO~w=_(i1mo)b@;}ef z3vc-7?hP$+k62pugfYCj+AEx3^gd$zvlK>PKKG=*3u$^O*`5Bp;+Y2`W~OKnFU6hS z{THyfy$(B|pL;6Yo^?H49F{%qe{z*Mp*uOwaiAUSDCQ|pQDKo&E)~d}9sUvsR1O==%6G20@$M*v2mklg!;}cj6VCK+DS?oRaUDUZUMC%$Ge%;YmtGO zRdqZ=rHbkg<76vTV%16xp=cqEAM!}KXx~~#6#yqr-;;yFDSf?BK-F&sB_)ZL1}TFn zg*9F!>U#L;;0+v~f5AHExBJ%8SKG&iD9>0PFDN5de)Gr)vFZqwO@ahz?dKN>$m`kOmmywe53rb@Qu7Q@h?R z0F(a>&v)}z*1J|!K0En0qU*nbZyr2Y6A6!{DMHo@EP}UeF*jtV{{=|?8GUrlzq;Cf zc$7mxqjHm;TLq?q!TxlnnJ1B{Hm9;JCRDb$tplN12B$g~Oz1+6Cp4Of^ zKW{bhTMDVeh)p&7@njC`P&}%Gdai~RYauI(7RN}m(M<>0{?;5)tvRgB0GbV|I2FUgyx1hc&R1yxT(~G(s^Nb-rJ$!LspEgWuh8Vp;BU-5>Plh;FFGym-X- z99?(D;%=W}&~o`h1ShR2t`I+nUzNPsZffyHL8ZwLrmXeDoHoR5=1nm^_JmUd@toi} z&vnW&(ReTM#f}6jV5zC@pMB^4Ai1mV2^!PkkrMr%y zTib3P^5wReagy@N5F-_%=##;k{B4hIRCY6e7_HzLe=Bf5lpK?7cqkBA$U>EeWlnyZ zFy%r*_zUJVFiSHeK^So1%ZFA?8znGe$biDNg66Uj!n4}7wSWl9`6lc-lPd_`jr8ln zW2ZNL)A?<^ITr7fYA@Z-Rp()*v^O@S$!iBdaY(HooRbl}Od{s}2L#2Fgy3Xzx7RKl z8j_@)_=q~?d`_VO!|CVSsa5>nqDu2L^1C`eVdegy_9)BY=+Lt@40jDwRIXBYuqYjUF!(Cf7AQ(E~WvZeH)LB#z|RK$k{dHZZ{M9E#{=ap}_-E)X=h)^RW04n*Z)dt+ea%%XeN`ReeV1;~$`x4zld?hBg)yo`YiR{XR zX-ot7VJJ0hHduO_S2f;Z$Z9Ee%kMuU zn)+TcuD^HMLq3E1JvM532YC(CN9lzEE^Q|g|Kamp-|&DVOA9W~G8T7+UwK_jzH2-B zCs^X`pj$M(DVU#Jc4Y82lT|dp=laIm$De$$W`Gp>DE2F-boYVy@bC@$ne${?Q96Q0 z&WiZ%V~T4gQB9xdDdsERPwCeabpzFeIV59s$%nN)S}SWvlJ`0G2$rIj+hm6+o167; z7Bsc6>{XYavcA|DMKEQ!cXIexUKDPTWmXyrVM60Q3#wLG&qo$MtYp<_PO__%_@Wlj zYdjSm!vuOL-y7xj5r@{XHXfq{SJaBU)RMe3C-K9CxHd42pCC076N~2PqCiRKfXfD@ z=<2dxk@wO_616`swG&k)(xMgJVMJ^q_8t!0uD{ifDc8Kh7QQj`ly4o5$Z@gnCCPt> zjdViG@B)h^>ocr9n0kXRB={&j9LFOqTSSfRRSrYfBpR6^2gx@YnqG5K#DiWch?4f?I)=D>5c-QvJndk^T9*-4 zw^)AUNQnfyv!BAmit#>FIU7~I9c=YGUkJ}wZMhWhK?AqF_MC*@Zd}bc*x6R!g)POB z4(5>Um_5xZfwBA_SBK>MZbpiWPB7V>Tem0Yr1RA$KLHO6~HU-Kf zO^hB-#grkwC335#HI*tCLeA+cSuGI-}&qzFTnt^C3eHqkS$x)sVQ7o_76NHk0of_Y*BF146Yh2+@itM&&l z6+>#1K5=N8*6`J4dqk~Liq}Wu6vqv53d^Ez)3``3qkhyc&+=Jp`$zqbHynG=fJFfN zy&lNpL|QPg+&i-$C-7F0m3l5zZ~qwI&hw6fp-Y{@#$GQbFfMCO%gGa}Gn5m~BxIoP ztpls>ivuL5YdDx=p~?k{FfE60IIfYK6YG1)Rj5-m<5ls=u2JL%|53}5k6bH&9IXal zeGl#Bdz)(7s+%3ysAkEx3(Z5DpvQx_m0!!nPaCrtfKf;j&D3!gQCruKp8KE5Ic|AV zB}Q4MN03r=ZWtp6?{C$-;DH6(U3dPJzMnn(V`ZjoW$s_s?`$ zI!D0_22A?1)W(>}`_a=KRDJVk+1-MkCM_?|xLAS12e2+CXj& zas>+Ize&z(!sMyB6SgneSuP0B*^_Y}RX7%qkP!A@MQ4ewpI>pSY#mf=jO`X1Ej$_* z^Z7c1{)>7#hy?pRHC2|NQrg*0AD@DqpHYD*wZmSONhLeFd2SfRPkm4&Wy^0&0uC;0 znlFBpC`r47O@4TsH&`DUMw6OHQKMs-ieUxse!LsJQ%e0EUxS|04louEt^v@060h{k z_8n<(fzhx;O${g8QQNEu3xZMRu!7hf^o9g(^vumGRg~h0#;k1%2a;0-_LF(}4LFie zlSYMw)qfrpk-q_o{o-(|#2M7jCgmz;a@1y~IW_tUax(Z0lL$YtwbfHQ#FJzT-bkqf+ar2_71Z(m< z2=oz0js)u3rp_b8-sc>~aY?(7!yX*@~QfDv;T|2$JrBY>nd3CDXbaaAr z&ec;Rl5HesU{1v1vIRr28>(85Vr{&;OhP6-zhtPi6NQ`_Kw@YY8$F?hSJn;AeeY3%HdQ%QhO|+~5npkqwg7Q~ zCepK#Tp9II*5}y7$-5Jyu~3o7x;?~m=*DQy^K~TP#$^A;2*P{?mWsG2Ll%!wZB&4i zMwnxNXkci#WbwBghN2i7X^+kAMRDtmuApK}4>&|+1L{tEqHm1tO=G3@Yc(& zGkhP)DrC#S`fjLMDC3I^F(v8)BL-Ok>j@ePKcvZ<#7w&56-iDzR%I1~IlbVGC`Qatb(Jw%q8`DRZ*ik-=qw-nvb+T= zo#j?t2vctz;wJE#mD;Hu%GHyZQyt#03G`~I5u?;F3dl65DE984j@UQCv~Xa~3Xx#^ z@?>z7EEmd3Rf|Ui-yX8zo1L+HaEL<`byzbCQ z*{F(1va@j~eXK#xAZXVT_<}D$L2lEZxd@d@<_!E0-ecO|%sh89hUV)vT@**J!(e{# zvyV?^Mt`y4?76dDasMo0^)aoVJiX@*zAQ6*){mi!lo}R{i}dUGA>DdI9ci0XU&FvU zO1L*@_s{a?v2;<`!i{Zj2S3SiCAXjyUJhFpO`_nl>S6=2 zQPQcWijP+i6&Ng~HI(8c%P?*a{gsZ*ANP-(2%$Asakyf|cb%lb6G2JBEt~uCS7Yqx z;)is6>&mli)%;K2ZL5vE00Kw5qObbg<7+-IdJ(Tq(&OA zxWuJ3`Tmdz)o%uM4*WT_NyLN|6lh7K`o;8rDsjidXmnM2D#b-hR6;#J9@i{ z8nS=7s)~a)7I3~>#0v`6$SFwo-H!LOM7f%K4+By2LEucx(NdBzym}n!z$)H8pWQVxkV!#5nvVM9XF*KOxnJqXB_3i~&&b@BWPB9lN0A!`<%fC!4BA z{gPq~QMR1vzMk<1?E!j+D+P9@+)9_zRa9X02F}CfAEuDC9{BJuvoa4gdD}B(8i6@n zBYbmMLL~fBo0zNiDHps_E`su-k{OVweCCVc1Xun9&qw3TuX@*RR#Cdm>x%v!T+O(b zyZJL@O@S+q^xsWN#Lnrsp$>z!4C<;?fjS!Jx+@k5vjmzocYog&^21YLhVPRDnxj&> zAn3Bb*F4XnWG9LxgR2RJ%g_s&bwQ+ylB9pdYg-;?(6BU6^YGiI@cDnWFx9w-Pn4Ohdf6a3z|ANbel*1$v67OQ zUI%2%HiKN*LWXf!5A(U52GjpgnmCFR$qa9b^mO7sm4W*<%Yjvqo=0$2{>X)42%s($ zpGyr;NL&MuG3lD0`$`bDiZ^r3sV4Jo1L0##?Bc+?$i2EVdP5D@(L&SlVHh)^~MM^9WCm@JHON z#*}NirWw;&G&D>Kr*av%LF!9LpGh&9@Fey>{{tlEY8HJ5k&`4APIe*JHH`=N(jlp_ zi!P70d^Fea4RJN5Obj{l^(P7R^zVkIi_r|991=k5PRMZZ0&fglH)jIm$WVCBooru= ze=WdSfL=Dd7gX<%L@+>6D9oYhUfYM>Xxbr3=BI0g9V<02pDU6bO?M6qB@D0x^Wt!`a;QgjYfrh>+toN*hsu^G zmZ<*C;XZzX^pV}_(Y77Su?atx$aJI>VcdMltCN2=9s14de1P}kBax2xsoSAipQ62T zHEWif8%^R=@AxMUJX5O?gyDlBJ+-iPyi&miBYA~d?iR5*HNf-;p%*CRYJ?uDM^^jM zC?uQ>?Ys2xih)W*!4&E_#hJcEOTB*g{`>3Q*WND&dQw+QJcTd2u5S}~Jw!8*++4>P zmmw@ku;WU`%fy0X3kxMQ`^{$Rhix?Ej{Es#!{XKUu|@au=hpJ}|NIA#N~9GmIiH-Q zHUY$Nqkvca(+~UA`PtRT6M4cb7FHj8__V3F@K8MII@aU zDrY%~4jzSkV=&iA%C^>xOBcpi|M!ztHMbGx6Xr^EWkFB@N&l|N99NUZCH1|yltT!A zXX!@%Z=o=pprxS0QH?{6b^RC}zM)wH6EC+Vs6_f=Woy7ma@P~winfFzmm{ZdAF;*0 zL9Q3#$pIT6yGhIF1!|WfRa{A~@2`gQ1tTPSy^(nfc33J%<&k$Z-YR}6{#Ozm{9@3* z<71pYzM9qw6}C?^D(z(dYAtw5c~Dxo6N z?%X)!IBDNC4u_w;c0vwr%3d;QQl=-{zqvor6G8`KtyIg(ZKo{;_|HmDiQrH-DaQmk z$hxsm#26jv(=6Zk(RI@m+y)`bA`<*S9$Ie)P5wwyTWH6N1t|VzPSHQ(=E^M^0m*~P z9uE1xoUE+;Yk5S-f#R)8URec8IcQ$nQ@kw#MX;=kH?&n)pwuL)!9$FOIWDzWsKvrt zx3d$^wiN|MD<}s+ASUfm6;s{3J^}g=Z6mUS+J-Bn0=C4ly&+vbHNsPS9~Xtf1CXn7 zw9;^T3A6Ouw8e)E-X}%mXzR}#KeJf7}Q$EP-MzWaoVTEkn zaJ~DwFo)s%_479<#HarOo|r8Dc>nOX&vgJbH165=v-R%|kh5NxUhctr{TU%0PYzX+Gb5%%~KDYJ!`(<3+FWZIjz)#Q{ z;5}!h%X@nIYluS7Uf3?Tmpn5>fjiCEm|peBqnFR^KVBKNTA#5kw^vXqk80a+jS2)c_ z8GS+-YiOE*d_0zh)PL5xC^D9ZRZ9<{u! z>+9>AACA_TfQo(+ycR~LXpHAFYHh&7pWSkzY-=~8hSKeE@SS`cO$6s19cw!cwmLM^D_Ge{$VQA@hsh;YaoRfEbAh6F^?Qiu&5MZ&6S=Dv zG8XZ;lA~Ey;%VHpd;lUUBf$5l`Uu1VH4RN(j zV0ROH&yv+%a4CYNe_;=dOldbB^jeOFQJIIIClO7JayJnmqXOgZb5k-&sTt2_Y8y)p z;dR92a2tU3Y0#R|a1^c6PtGm1GO*{BjQPgbp5C9eEvNU%g|PT+5B$jF@YHfj_G-md z(uBo`DXG267>_e3Tcb)K0>&_YoinF!c1Rfo@oXB zhR+XV3h*;@r$Q|uOTCYH0C|KTYBiv2Yb%db?DC2zan!TXiZo12^?dbOJmKmh*o%ge zifATX?F-#ZgkFpo8#J=fbWrLbvQp8phVhSx!goC(j5l#FzzurvbfbDJwUF@a0#W{f zeu5kb8C%1lsY_os_7MLSG)ACz<<#_34DOzqF-f9&L?6bBgWptAinsW3IR2LdPAX=s zN=zDCZKO+jyb&OFt#tuWA;RE1>=o9YLK3~#tA<+;q(3@hxQ6C zAa8Y?7@kS1)ZQ$=tbsO09r9fTHhx0)6*g}q>TP^Vn!jg~!I(&0Sqkh=pMWpNUn0h^ zeRMuE9IZsi0$ zzxbU1li=ubVitE}S7`w4ndYpDYjZV;&`h}MThl=}XNEpP;)B==BizU@6x0pZ0=}-j z&}?*K#skiF#5a8c0G$vcP6s@o;f7!$%$YI66r4^Ajx01(5=;7^VExtvJw9%W!l9dx z((A#cd7hD6j}X2vp1dJ8qGoo91NDGL*g6m|BFpah)|1IwtlD^VGB8vCvVtgELX$Y*L{33?Q3P^23$WMr`SL2jTo&F+yBR1<<#V zrYahK#14cz!%%8k-yDnM=C?$Vl@95rbRciE0tUGRqP5qyrsQK( zn-Uo@+cU_>V1fbif%aRS@SuOhXc>j#N)c-@S``1%MEr={m=z8ru^ABxF#*+i zX3$1pyZC6|v6nU_RzXbZDW%j&u_aXN-}HRdjsR%&KeVK|PL$vSC8Kll2(c=w2}QgR z0*Zjb7wBwaVVqEnnfJI0T@g42F%pQl6hQu5Wj+wh& z>=0=llhSisCb~Uq4JsgC<`9@z)y`3N@UKRl27N9S6qJ_#$dPBf1eB9+=R%QgON-?} zg8}lPT$|ra?|D$T84+B+4W)oVZN5@6J1;dPym7`D5VVP+QCz9;L+3=eA)`ocR7vhp zTrd4${*{}thc%$`|0j826*N2wIX#r1?|*z1W4s|1LKjXfF~w4)&rF%{4JW@)2M!#t z|No(;X%qPY*aktMi1Gf{W=mdgc*UTEfDwF0r*(X-)~R^4 zsmcbzG-k?iF8Gl9Mcdz??>jasdgXmR8kq=TTd1&dZ`S&wT#{6CBDd8@2%9e zbN+=Eq3`U-vu}+uyI-FN0)A4IyuGQ(aA}9qJWJBrsI<4eWp@ zR5wW4KUd??Ekbci)@-7&-maw)~=ROOn;nw8<(_`ckH~-Ftg&C*`9* z4CphmmQA z#7~-(skTC(dV4UBS$KaAI4q0WgT-!o6ZPK5M=`rG;%qw^>CD~+1U0z~8mCN2eh(l^ zr}vJQf=r=TA6Y6ORQY?Ic?dTXenp1GY7u8HLT}^=eVAg8Iy$MdC|o>~JWqY_n9wH- ziWuLtxU^dG%3fi%ble~=Fq6p2XJT1Q=3+C;EEq7^n^FF}`X4E#*ue3BfVSwJA)yc3 zA6{%Io7;*`uZo|AJ;B-=)>jPZ13wr?pK>0+=K7mI#$=1Yh=`oCjFx!ln3M|X5KOxf z*)l(NZ0CuR!mMkE=XGy2J8B$*8z)CTdYjO26{``)>33y#**DJkbN5}G#tlQy1u#Q}=8^;z zJGG+{CcaakSf5`1oT928H6QVQj=BI$}bs=H?&j3hZOob#p~FqZ*c#T_X6F?mY-geRGeA11CpQut_TXW3@o$wfRNeQu_b zf7qx7nNs&qhEtu$Gi(;@yzn6_9F$?PwMI!N=A0CV42)+~jAQ}W>2?XLo#0er7y_?r0 z7P~7ldSkKUsQ9++&JMd`pL&WiWBegt!oIJ*R^4mu@+gm8Rp>0aANQL70}#>84PFMw zpJ)`r%T&3>^q)@U2 zj%Ag}MYX)~CS9^W{m%ZmSR`^gm$yIYTtowSnAKcgm7}MBNv5=!aTzLdc+t(k9i%Z^ zM+N=CcuWBD*lMm~=vQ0WFC5Rs{gGOG+|e%1H)i^l+TjGPULaGD=lMw}xYw8nh}-Sqa#dzM!u!3kH{zO2Q>D;+Lg-+nV;qp(6l92x5s#c%L*jACn}7GUa; zwV?4%%U5s~VbDZ9%X7@;Rv+OaE-QC;nH>kzmr?#>B#~nRwXZIu9L0F0M$OjsUQn_c z^7;PEWW{oO-@&xRv~sp?l1VA^QVdzjLM$_talhBBPT9&oyo4*R(b}4N#*j#ct*ehJqGofLl6_rhxon;=5jKY{uR-2 z9Uq`Kt*^na%m&NDRhRl5@;H$%&)?a2`?fq4o8ABTag_JS%Io`ia7Je+c>{rff8mj0 z+yP|#u5X=hD5W42#F(3*vr1Ptpv5C?}>#-x|+pRRCI|>UlXPxAo6tIpC(-B5jw^v*O?;{bqWV5 zx#@=#X%HE9{rs(2@S6S1O81L30*9I5azbeOazlN1#vUjTqYV|54JR*xMP~5z>HsLL z88h%XnJCr1V`W1e=3xnU#^6qQ&)4(xR^T*1xTW8;jtGKLolUKmEMqhUl41J?%Zo52 zlRjhkur09gTlcTF)85e#FufzTDx{j9w~C8^-SEZq{Xs;zP1;gYk^19ag==gvSC(2h zA~RQ2$(Y6^4?s8@X-GWh7M<^D5Pg8sC*lZAjpQ2?=q2RWrjBW4L~|;+C1$1wEjiec zd($yZ_<`_eA>`UL*?Cb1rMl*!LN1_eYxBOb1j)a ze)?sUu1n5hJmC{^RJ{CQ7;)jb*ftGO5(3pNuAXiZMZKn}%}+=$4;V&QiTKH%i`pUU zYv9v?>SVuJ&x^U&UK$lk7nke8Gxi_Ks$XGLH6GfmGM1F$SRj!7ll6;fc1wW!Awz=` zJI_a#?G59Dd$BvG4_)leoxih8XWf7@3+*I#F0Y_Rxs%WvJfd)E3f)XAIjN?yFHsFM z&DR6Rzk)-RH=gU|C98XGDOA-Gf9C(aV*Sixgc5^!Hb zt{+M69wBP~Ex|D~byq;@DrN`w!dR+vRWRi&VM1n-43~sUYI}c5e{f2FvL*Q#fpQhX z0nxY4+P^3PAdV^t)69_Ba-*Px_Ew`wH~r_c`olOi=6|)lc)DV2>6%i@0Fc(qi-FH< z(ZZHduzTA!&%`U!7kYbsd9Xzm?;x+OUtMIIfgzEa8hZ76eOA0^lR0nQ4Sf2;7vdvv zokVibRsA(dJ8H`CLGyayQLQ)W!j!iP(XXZRDrAy5)J9B+katgfE@i)5eCzS@><+ry z^sl`1)E%>%r5OB+=c%sz8fwA5$G<*1W*0Z~eu2}#aqoY4!mM&Dig^8mh!4|325Tg`G0`r-`X zhk7DU`2dyxtTLlOKxH4>8dG3nMZ=-5KHO8f|IN~Co19wlHY7Lu z>gCkM?)Tkw3whGsx!)MK?&E%&jI@iRkY|OY72asYRGQZ!Iv=l<{+_$pH*?&6eaVsZ z>phc2x69_QUxgIcK07Zye=BO<_3!!}95@w9!QUbC^Jg%poA=>Vg;O=G=q4%d4&$i*1ef{> zh|L|KX7U8#=Fa65#7HxU>v|VQ_szxV3DnJmd11iAv!wJ{r#~lI%Cx8KnTzNcq9DwT}4UO`(@>Fb9&E7Wye%J9aYTI zMcLiobK}g$U(o3m?@ctlX1#)QfOlb); z)o&pW*4bKz^6dyZl0)_Gl46<{3_bxyMn>oVm}$vC0P|#vJXeofIMM02g11UusbYvMaNlsy|of{`qb4w z0MP6J>PR3%;^X`>@k9kY_(;8<#3pVGnH~Fw7mpST4d_yC8osP;8f4t|{8Vz24Bai- zwjNMLumzfC6X?hUfBtD9v+e1H8W{a-zksiZFOctpD!0*PDjD z&DJl@Zrxi}^fUcqA9+cEWAXpY=G(Pg{hwa{s!4?%*%aH#`jtqx3NObs^^6afkhW8& zdNxn)#4>M7e8W7(UO#SM`?V-%Z+u60I^^Vjmm?Svil5dKx_^=HU1gkq_34fqm%E-~ z&oGOwEE*t6FnxnpjB82JiRDm-M zj2`QQwrU{9rPZ$@B8NI_e80>WM!X|SnYb;#7wDZmy{f9!U&7?Nwd?3iuiauMl2_%v0_W45s z8q07_=?%dTDJ@Zh9%$JnSKn3|dFw0>`Smg(CpFK+;^|!j2+?o7h(;e%`h@&hy2WVQ zmBKTd2x^kpM|`3x_4T} zL%n>hpybSa_$gEqnCfEUK*mCQGeqfQ;iCFx zlm@mYEUI+`s^9N`56vK@j&?U2rE)tXfnDSlw@w0r)iW~OTGCFagE+Bd&LQyGEE3yBp5d?$|{c^Y}hu91`@l54bwF3n0bwmZYB&~3#^23&f%II9xiQpWRLtb#HeR_ql_Qix$ zh{U8kWqXwRlQ@ zgCNeI6KHGo-$sStJDg`pN~sA;)ZpZyjB%*R!q3&i#T`6Yd4N*%^!uDP^n^Fi_ZS)p zc6UnAZ0DZwur67v* z#pA1~#9YuwL8qfEHz1y=9?3-20QWS(8kHhwx}V-+HqA&|MG2_lmmaE(@sD~xRElM( zX7l3|6Eqp`@q%M(nw-Spj!eT8gy-4>;9HsnV-8R9l)AS_U_iqgu2;ZrMs=k9>lS#;*`mbMc-%Wx(@~1b6Epkp04R&NRzPCel#3JYYlKISHZT3 zR_e&8Q?v1jkOeh;(A~eUrwi{VF)RT5(ei)6bFSfqQireY{FbCAnzQ z);MiFLh!3X1E2}E33Nak?`j&p{xV@O0#O#{GxL}U{1)>HU~JjOQilg6#% z30t6g68zH>sbW1NZ22HyQbT# zjI{=h1M`nE0FsAkUUbTYwn^txJUlstD7t#kRIQQ;PWGSC6xC>rAwGO-d|JPnur|x# zJg!;x!2)RcQl>Ukq7Ma|Vn@^`lPp;qT2X@3aJ8n{TdGjJLp;YhR%(X~co2#I^h0|% zwy_S|?iXHJo=7>FO4Q;E78EHjLbT(=;qk!nhW1WVamPfK2)nRnG@A9#_Rf*{q1oO{ z>C%54ee8(9=)XiS!qMt5Dgdj}{D1N!>Dz^KL?k~DON0g-9mRQ6YlPw;TuO;y1Qcn% zv;(1o5F<*wGMxW9@G`NF4W;@7f-+fFVvqB><51}D z%>MdOqu)*Ut$B+3sp3Uog`G(h09Xw(jJXu*os!a{+I>}iiH+~3a^O;3M*t?olxR$yI%QYUCo!z zRON{e&-R=%JQIZgM@99COHIb5AY1^9ea3xxXp;Md+5Jv7dE{aOB(OK+0`xuBLmyJ_Y zhhP^hu}E*;JKH_zgA8BDk8Edu3~foNo!Pn9vYqPjCVk`DyrMg+f7$tL>ofIXu^e8x zrsJTddZZ-)p1lALx_VzvzXN+!l0W7bKVXR9JR>+3h3R8)*c zB}&{JDC*L{m#H9%&X2RsubOv)-6F>hs z|0KJpS^pj4$wRV=H(UF?mziZjNlW$NEaXQ&@1p0{KOqi+9{ppJEp&|$^s~cZ@6R{S zli7j4+g@7u+{yB7p$dYv#L!z?;k+lK8Da@;k9ZTWeZFkla}(6RWmdQjQFfUW@+AAF z`Oq)?cDf%ezVMaj$sdb~3jc22qN9+r1_E4JH}|tH%fd4SluaO}I6K@0g@T%hg4b3- z%Z3HnJR9{x?Q>S^*AJ+a(c@r)%g?|37UyY_0>0aJt$Tkz2{g|7meez=Oh-L$qZQMOWh4Mmvy%q+C2Dk*rt8MWW#HJpndtbq8F9o)fkUf!Dh z%1Mq6K3z)y8j|=Ax2{T;S~WfM$t$MEYtv6JnAIh1@XFBvv*KzRZ@o5(qu2)MiW7fC|^!` zZ#fL`DZihm+%gG6#(gt8aL}`z?B$+4!|6J5 zgr1r4mHtK?w@TG2ulDDB*s`3om8gIn0pqO-znfuRYdcU&_aG3U^d9E+jm^ zPIc}(D#+d0w96#KOoEN6lxdjb(IYP1dR~^UeL)*JhJyLuM1QayP0t*>syw#MK{Mif zrx{{)uP>u}cX^lXKWsOX?eePH(Arb8src+}=8x#QusG~lM726!p!t``hG5&W{(mlg z#|&iCOMeljL^NQl-2)!Ir`A_ycm3D?Z7wJmo@e5epn+)XhAo#Hu5A`=MsBH1dU6|zSG#u+l^0W}5N#aUSbYtR z{UEVzU|IoofG5YIjhK87dh>%iYN7_Lo*B7dW(iZI?F@bIhJ<0-7p(#?bnOj|X$g)c zrgfkw9t+#uG^Dz9iGUUXBd6@12(7-%rk0y06)+zqMMJSh2hRC7ex3B{ZY=r9ZQO6} z`7AIx^AIpqtz2KIuJSA0{` zp>t19gYPSbU+X8xPJ-*qCAml{9;L9A(wmSb<*QfjzCRJ{Ry%o^G~WB@DcwZ=P92RF zgqe$YYVJf0C4BMtsiN1x66E$L9UIEW4sGe`pOk!U?zE#FR%&eE;gsGCI2^w>TSv}h z4>}V&W}q`*r$Rv{_~PIt+x!ANMBVWO6aSe0SzOS-K$X(# zCnodX@6H0wR$jj;JM1>!_qe^cX=;_M5MU1Pe|lg1YRy8@S>q{FKk%ru&H{+;y2zsl zwq}7K!Ha1vP;}7_pp@sM0fd41AbP=zergXj8;~O zRH)E$obPk2ih4Rt1qm8IwUzvyh>m@nFHkBR^dL@9SgiZyd%n9~oLt8&trap~iA9EG zbF1H#2HbyIn1)prE$_&mVdVGVQm4O-s&!#n|h5J79JVTEFF|rXn~X@=+Qlk z(ren~6&utTn()jUf1t3O!x4Id=Z7_W0tl#c#kO#jC&JKrTcz@J`qO$>?mmiufQG?niP4f1g156Y~q#krd&LCkPKLX&a%7vR4UeU#y&p`^UK4J6REJ~%L z8-9!Y%&Y|6iNs%@Ex_0h=Ot9ABigF=7uYJ{M11H+^2)>$Z*Y3z#XTjpjAK|m zj3ez5-GbC;7+yTeMGn`l+j59%CKKVJ6l2$0kj)m0zH;mYH`8&v6c9vE<1{w*_8 z@H||4n3_WMVI5Pe!teX0=J+lB=D|QrGaXx^1Qk z1o<38*TY0OJ<$V#dG8z)#v!EP;egS|y2f(PvOxwFC~rInJUk!gH7&-g+*zQpin0C4 zGO_Wu?!BBPf#Fjf_8NqdZo#7&POntQf%R>UKfnJ)yfhym8cYSF~DeAfu%Y37W>KaUejjo z_1%hxm*7v-Kc3^)&J=%R3Nm(452L{%b|n=Qx+IZ8^F4^lSe(bepL9FFexZL;EIrb; zAeiZW{OzX&ud}0rebF3fC_RaY{xub=MO_!zoNBfo|4a0(o@UYJjm53+X*0$fu0av3EH zo8ft6++|YZd!D>UN&74Lt-@@Cgp)F^S~(^$Z_2VPwx+Xx;#veuN81p8*Tx;Eu(W+U z3KoxX7w}cb)mnPB@!P<0=0WE7b7f@EX39WQP!oy55a(7!&jUljVQ5g*0fpPh6@R;F zH|dpPf84Xa9k0Oizi(>@w`yNXcnS=#`7RYJ|57{uI>WWKB|hgN*L!BTUc*SGn8BHP zc$f__uk2RENuJyP9f?L%EXeW@#x22ohOBKe1iZStirU%K3e@NqF197LIM?A3D=nhtdK;NpT>6}w9bW)1&zgql zLLE*@XUh=ADjcqG+Gy@#c>4HnfToGuy&m1tV2V%-Cz?ne)sK>qxWs~y^Lo^X)p&vrXDx7>CVhJ=)paWC zB2#|!I6G_shj-@UnWljLy)*@e^mxDh`S>dX9x=_jKQbUKeZkEv`wLoMI`gxD-8ol% zbdQms?kkB*p!=Tr#yWbnF8pJ!G>`rGslNRFkWq}4Ih+BEv`khFv?5Ex`&I4FoRBG; zuQBzC4^vkq9Ch*d+5Z4(pQrz=_x|+so($@u%Gw^C(i>p*(ms_&hy7BLwCBM5RxWt= z_*L$W*5m8q8F&OX_yd3!i!D zIfxZhVte@xTkH3nMJ)bTwK!@$U6MP|Mi_K|^NsM7EH%aal1#zI2;gR)$$KW8b+$Jp zs-+n}UPQ~5xtGr+;ni*7$~ZQ4jJkpCf-iNGiW_}b4v8JHOGcBQ#5>;2lj1jjI1|$i zC@VL5DmDRQfwphNwo)@?Iu8U$@@*#p?Dwgyi(+oM~I&O)7 zyt(jQJG?k;f-=d51-5-N&J3hVJBSZu)0R{SXtM$(XC$DE&#WD{5`G0VmrN^y`OkzR z2C*PP2flP1`74-;^|S&F<-VlcHZ)nxv_~?;edbGed4i0tr>HjXB*}5~M4-B2qzb-* z5!lpN2tFQpd0K;B=L$X#vU6`6ul={M9s#c-7V}Sl5tJpMha`{zRW}D<$v;_|ga(&% zqS4G|y7ZFfxl(=y5h~_GJuvhLA=A5&cqM(IKXStS6RE3rk@oUpMm*!ah_U0y^n?v` zt=wVyU`l-sB85QiUHTfJ{$KR`wcA@hMk6(8U0nwXRRLLtVVhP%gaeQzb7(>DI}&s;+L;CW1S*rL1jJyt3MNv2JRR8_hZBJBs@ z4p3P5*Z@C2cwD)VKY{-jb;%a##SDRN6g$U_ahr`He0*e+x)2`D^+TV4_jS(o?}DP@ zZ^29_-5ueQq?d;gxqGeO=%WlGHd21GV&si`z@*4BlxprxIlarK_PuK4t(F-x*sENJqybgvd|H#3EC3nnBBqUS;?3m1QxI)!P#ot$?woONH7K?Accv6H zp*y)s%nfE>?QR~zgc9aAJ2Upi8Y=9B z581X^ji=t3rM1)oaA`#O00H5!db%=A231yWl$aW0)Q5N}4U$oi7(p3dMux!GPJ)qn zT-A#Y)UR_n>twXqmE6~OoE3zazSK^^X^q{9V&l)ar|b`7%{Ke?fkIJkkb4pmtiC12PpKam7TSe62uq{!>S1Q{pV4Lx6@wk6b1@kJn<{zMDAG@{z-I<+lsFf0L$;8w>Gve~FA&!D~)usr0;&iNb}NS8}quBr{A4+mEQ zdE(F54=={gh&8Bip-=Jwatk#7MTV&#uyWnfJT5(P$ z5H6SU64#*H&F4+izeGBmn2m=@DQ)8(PG3g3dSuH*j_8~TJPEh5oD-OahiqAZ2I>0qx2zaLtSkY1X-j2}9UW!L|ARv3mYg2Mxm z$~lE4)?*w@lPU3uQdQyVFgykL-SaFPv_+Icl=^?E-?0ok$H%HqII-g5e@00u6Whcs zT0egA@^lakL5VZjf)yfFtsMSOmn10hzuG!Zd|NLRYD+N-J0M|yp4n#;@*_Jc14R#N zR$zrPdeCWl&Mm}^>*@j;qcO?v)Y0rPwdao!GML8oM3meQHI5%XYGaI`1`!16M>Z< z!~(OS$l-L5P5@Z_l$?mA0_aJThukD@5xJcRizWoFVdw-SfuiEcPv;6#fyqPPwW(@U zA$IuJ?;QPe{2!HwcjCNx8pOZ_`-V&I5R<+Avi|(itA1Ok>FZ09%iU|d-QM0{;dLD^ zLDVKwSUWm8Iw3ayX}oPQZ_Iaj#TRcB4~;NiG(#B^14LB~B-lY#Dljwc42;aG%3-A5MxGgB5ExUo2(I?oKI>c z;@_ygOgOQBf5bMPe&(~~|7hlHxnCA8*2T}mY11#Qk~-a?i#rGQTGaTIev z0Dqfa{>qA31l54t2SWhi6y;?}@{L#1U!vhr2M+*nexc1w?{K$WhjfT!vG5Ry zvvQ0rPB0(;(&smhAD~RNl|WwV@y|#<`cR=b4sCPP?TsCF))+^H0^}XOaU7>sYs>c~tJf?lYO_c%B?}5}DOhBpsd zD3pQmvwud|FH)8l!oAOQn80HJP3j(*<6&{)X}Nej;$nvX^JUCtA7>yVk#mk}m)}#Xa3!x{;HgwRwaATWqh2ju3nEmVo%VkK4WWvlo%MGCXDMCyl>t@H#!Bm& zUpmZp>|EU4$%^%N--_6Z-&FGf@H+x!^xAH%%%o;sK!ih8$GIK@H$yi5~XHOE3r;pu9xn1$hDG!K_XzNtii?uIR%v>iSl>%``vEIATXXegc+!dC zmy)CtI6aN3g?{di4i-QMico(i2p7dbM5=R%^gcNO6=P3Lzv=}}xjC=)PY=I*Ioy{3!l&Z(Bv zh1r@)!s)HI9mA|M-bE}rkc;v{0+A&xF>5OkM^M`a8~$fKO8o$^G3M3ID^d2f$vBykvX`jFxS((g?>U;(gc_ z2#_^F7^y`)A(J7{;WgH~xc#fJ!LNH^%+KM2Uk@Hzg|Fdl<8pt#!VAC4xF5|vy~mpc z&j+U0cHi@9LL!&}NX8Q!gR~|iRne*b{_Gh@mC1gBl2rg=%0oq(BR!b2IC`0ji491l zX(q>D8^ID@LW{%7q?a5<1Ktjw?>}bO+lVEty9L@wkd6l+vzi$R_R| zX-ugsL3=OqqnBaqkKF0{J>-B-UaTC3n6!f*g zC}!MN;>Wmy*y*W>PS?|RWBV%oEn$68KKqD==U5k#7x9MU4{njs%MCTV5*@>kNWuzq zi7{PP#M!g0S(2!w>oHaN>{UW%34@_V?YLkInz48FN11k%RnBja;Xt z1Ff7~f+XL%kvNH=h3O|N1y=U+yb)Jm25GqZFvCPv5QDL%a6lB`b48uVhk)_Fx|YLF z_r|~Sz{qB($g=35vX>CUua9cqC*JoOSxaDY@KIRMX?I2^9cJLax_ z#hDhS{jsYnD*7$M3#wWs0f|mj_$?uAv~2+AyNHBIl@84TLi7t~Ph0j%ZoW}*h)0Fd zulW-m4W)wM-LCE)@r~0$@HCfg974zDRn@l@%tvusQF$7|pTag1G1&KhT&(a?wJLee zzs(>S<253RO-$|PBCBR`+`Xnp7(d3PZ#!&;+^R?CtqLzQ9?E4Y{4A-!DUM#>*JbsR zjfmJI9Lu!|WUDnjr8_YLpP4sCb8i)<)&4e72&beQO;|phydC0FQi&&9tYZK2 zs0|DcLI#7mTLK^H{y%iRRX|kV8}B`I$IzX_&`3*54Bg$`4MPdiAkr`l(%p^Z5YpY< zArdMnps1kW8GrxxT%3#dh8s3}?X}kPu=al9^9^QL`3ukq&g>rFe|}P}H8OH$tT2%B zB$TCS`}FZ=ykz!k?KFf(QQ&bIgaO!~q+U1sO=P1W$2*<*BZBTF&vA#oSm7fG&sSh! zxTdKpemw9ai9H&pJp~_EM6}wNxfNI;rTm#bQdD4{h04y5+h*D$h`0_F`tR z6=UVhg@h3l!jbpx=xpi?JL4t|3gtFXtZ(TJCB<%67joQx>rs)dzZ%x}3a(tB6#CWc z8T5v>sIqHDPSBemU_|C^TDJT5-@y{^anCP$XQ}&-2Bxd$p0j6MK1#r=aD*;AEtAXoaP{ySK0X~!g)w?mG| z_?%nZ7anBRYp3P&9+TqZZk0my+Us+i;6{aR5^Kn#$z|u2=uc5Ei#BSr4zXz;l!SPu zbRrc^AKY$>qJdmLLgP6e&n9TNA#dYe1!Jfqr-cu1Jp2`;$?2nSZV_ zkvC~?@-|Wk)G&TxyZtK`oBsmODE{ScuvyFvpzcDU?x(%Ch8pO>Cmg@N1$V$GjPfGl z=I+D$`ykPM^Uu9}hB8K&DV5h@>Z3bv$0JD?xozHmmHgqZpt|mG7y4|q@6Nkj?kKn; zW*V{6ZwMtGh_Dy(3OXcApwdi02|OPNsSgqMkybYkD5$b4x?Mten7w0$GC-AN)>LI1 zsuOUZ&%;=$euCruA6g%EoFJDIxVmVkch2gW-z4AH=Xi7%)}Z-iTfRQ`K!cNf>=66G zvHiAYqdTNnGjaJktlswt`bp~BWxwr@xW53`z)v3vv9|-?u~G^U`kN>B6T2A4Sg#o6 zQ>>Asl|*#E;<)Rcx*8b$P1GW@8TT!0;lAjD@4yGo%cmJv+Qkm(_p>R3PHbICu#csQ zA0Im(f7=>$X^VY+QZ9cOpww#Ub!-lQ@hLd%_UmqFb%edUyJP#?4@$><^jqnfn7zz@ zT3LY?mM>~HLJ<6Z;d{CptM?Iq0ZyG#A0oWHr=Rb_+j!;{p>H`%I$aRkM*wtpWc77oeoSDepvqr6eMwKI6_H|bD#YuDR*{>+t{{* z)NPyc2*|gTyPwFpY`T5?bmR`5wf~~!L$WNJo;+*eHre{XYu;<5`^~&v!i+8#ID_^PK! z4J4;9Bq~A*insWU(;ZY7T-@Ye?{&LWoa5Em+c^5w^T+UBEkDJH9u1R&+J>P=mWJqE zN2QulVYT?4=MVVSPUH$}U9^8o7eQ+I?&L1)a5TsQ)0G}acyO1zb-`7bQ zZ(AI&h7F%Me_&YG(=u4v8?aTl`6{|P1pWyY59+*qJ(Z>=A|74(u6_cH_wM`7sZt+? zf{0p}>~lbh=SVjvclBBn_Z#)`RqF@+3`3cQZc7P|zM5$3kEaHk_07*%<7!a=Q#`9cnswF!1BR4eKvU)K6kIJ|JH!P^U)6 z3SC=1!Pukxn&oGWM0!B3Vk15Q_w=lsTxkVx^xZ^FpC4)V3i6x~F}130JB|no z8=4gN7Cf=&ziw;&)H&C9(yX<#MgkTn04bl*VOvQ4AqeVeGgU4F&C6UOSYL+YWWklDu16jUE*WB$Bd-p}zwlTtpjPEpMyo1F2L{sotJvUse zk5m2o0Tuygps?8-5lxubN~vH-7G0iM0`(Hg#+g5_o~}%$%YuAnjas9}ww*nu?7Kn&J^FQK2pggvGkx8zBLT zvXHXWF<$Ro$MfPUX|Xe)2k};+%gOOPyP!MvU%+-|p1Qc*DzCt_*s)XYpGHRPIO`Wa1X99Opt%F`kKPFK&YCt?H zwvP$(-oXD@2%7Bp8O2N7{R#*unjnOr9mk`Uy3L0d>yjpPiC`^1g}@B>lOnZ~WBS4C(VbS;iH4P4@P-oo^Y*(nV}pQTUaRGb<7sDZ-z&4J z`Pw@^p}_~=(=sUGfPT6CE3utkCt$KIlvkj_fUun{mptDv!HEM$HC@g5jn(Hm1Cqqgd^ z2sqQUa4Xg+V*Vpg<~4G9XFGlhk{#v|azG}EJC0yZW{ylu)bnbd9OvAd9@*m$T zy$eRhwQL+CWr&YBSLI}%*bL@#lj15)INN52%AM^)-uup@-P95PCyj?~2U^?uY&H7m zo~JTLe=K0^E7+#Yi+akC&+%#k2{sIg&Gyp%Ls`ZNe*vk|Gcx1T#rnK6tx=C0cc+lN z0BYLKV;qX3nj;Mu=%Wld$I+Y^*5-^s1;>(Gwr36(pg~6wUqK`$2!}jXIT2b3B%C<}VrbVImEgx`vJg?6DcgR3 zNRRT^yB>`p&2WW>`2NY6eJ8=PwFJqlLv^70#qtWsdZub=BL(zbOy|OIgW7ZK#EWNf zVCh4eq}P*`$gjR=&87qlq8=aloJI~;W?Z=3J*o+H`(#HhhK{9gK0K-u$BO{Ha3%3- zo%o4)Ftp{HHYqI<1(xTCZ%fON*^83wDU-ZJ8%u>kwNh%x zo8f7J*Bj!;%S6S1c9ZdDs=2g)M3slOmOiGYmQD$_n>yS9b?W8CrxG6`NUKSL6JRAP ziTjss8dRC)uSP^mPYQoA8aPgaX500oTX@F?v2AL_UA9P6_@fRUH+8Z$DbvP5+OhPR z+Z>e`T3I=0Z72@1Z6#!LcKOk%uw=}b-$jSChN9h}_rB5js-mWM{pN5Fx8at{7?XOk zkA*XZtR4fFIbA)%aJ-jfh-G|BcpOs`@>HB5<3*3{jea*tgQPD=PlNg^-I1FM+6(~y zdlt))8Xcr)4b@$1K&PVHfhvp<9cfKV28|I@499_tddUMB(vt@foPtu^SZ;$~+m7mP!%&VLWW6zL7x;x};pw4#5OHW={>xBKgtD`@A?H|~ciUg+f z_n{@am+YXrW9`~E(bB?l)jECJC-hUQ(m2gX*Dtoc!`=O3KP=fpR_~C%0r+pg3*-Mr zVEO+-ooWiTX8)!?^@CB*qLBH3%E#b>tfobVI1T#NZcqJ=P=bXBQ@e$$RO!T8!@8C} zYIO(i+uLr)xP;59p}9?xK5N6~^D@U0{?JsF^p}LIp3x>)IB$%m2mB$CfOCg@n%bGd ziS+AV?rz)^38tjzNjPfXpD!mZjRppO|iS!VyRS}Vf zljYEoFUTbn{=%mh=rYl*-mQwezPc#kk~(sxqCSS4CAUMq0fF_jWabYpJgj^9O4~a; zD+a2c?3)tV&G+`ZsY8pL^DWooB@X#^jdB}*TCVgrn_|~xOpsSt>LTO3OjpV_XLQa7 z#gUHLYHp)F3Rot{Kg)c(+88l|++r-`I+^@rQC{U(7-Pg9b%-5vJLp#Zj4XC;^*lym zt?k7K6FD;qRcrgPf3mjl)#PoGR-nBly+Fo-3;D0Hnp6r%>eEFKNUQ6m;mQIp9FTj! zGeRiOJ~2tcm}cv^o(+;h>$lZWM(IJ0o$?`uH6bX!HYAI;2NQV(H!e1@Iu( zLE;TGT5P6yJL{D>AIL&+iIDo zklb|TF;3i0>xEOWD<0loS;RG$A80)kk7?wLQ3ZkkrXcNF8eDP19mvxgyz6`zi*37I zUJF(KhTwb@bD?Maj$Lz!rETjM-1gl&eAVh5ejcX6sD{d+&zY%pW1r?-P;*7e{c(fV z_vS%7{cfuB7OHniViPSiY#fxi^l&i+l)-~eWibyx&;=v~^<`D;@L*yo+Ck{05`W62 zmxKD)yU}pf=dil4R%Bv5+%+TewF)&^j)6lt74d}ru>z(>H0gm8MSDi{e59+TpHwD?Qqs^T0{6+`!WHZ_B zE++>C=pR z;S15?z7L+AMb*{xqp=!WTl2h%Su+6*`R*Iriyoh)S~s|N3;P;}b`g0>H0C3uqc^(M zemxm~Qn*qHC3Zgx%Tqi`J6Q=Zp_{YgXsMs|B>Y3*=pu8uRFCgH^IPuJWohCf4y!JQ zs@khTyAM_kubY`hu7}8SC`PMMw~o9^*7OA}QsP%-*|I#^qXs-ob7LKA99|i+M>mx4 zcCqO8R$JJF%2ALMsX}$TLr#VW_%4Bwii+-9a-EPjXixD`&+%PgfEK3IywWnqM0&4d zCM<(gY!z6~EEpt^Bw%Q>;quJ4tGny_-0)K&rWijpd`L}qsIuvDvX|19c5pYYizxQa zKRQm@R~%g8V8Sngf|Ef7AGbY+d`1mTWJ^;Wa?ms7ma7%7%C(^X3qU-l>vbPM$T%Zt zlW5B8Kxmr2M>xlX>O{=XE$FS->Kfq}#3utz-zF_+d2>2Ah!vOcyq27UT8MIAo(G

U; zY2to}fkBZXIi86q>=I^6y0*+4DNTPN>B^)Wf4bDKvntNwlI zQg?){oe}RoZx5rH4709A5?TFE@$kqGhIp$ZH3@DZ(T`1?$y5kh9^7GC?M zocp!m*{$bJP%n2#Gv;m6<@AD+k6X)`UXS3&A5>hX+l0tPOsUsadj18F{4}rc&F`-q zzO|vB8bryJB5gE$$+ouxlNXc$9n;v_g&^O0Aa;WVDi|xl7%l)}RxT0w%AtJd*z{&X za#WD%RJ{p0zMhJT4d&Yt12mKx+q{5amIVM-Z6G0>hEG8UJ%|ZpA%~giKj`s2Cvnvw zP9lco29d@2Kx$iP}?Ma-T3qm{@DzpbH*i${s(hGNj?-|FVlgKbWe z2wFRdD&aS5Cy{80ckPy2>QWz`Bbhow@qA)@v8jAiivXX!8q#QSloky1PRj*x$H3$H z0xVi%Hc}|?GI1-j5%FiYKy;aSHvndIn1Y3LQ1 zItBcKG${au8AhFC*`$myJz~LI#d_^I(arivffD;f+;>B$A*3J&CMOLM*F)29dRvuT z6{Yk7uy6cSToyoQm{ZC38lEn>HfS8nBuiuqhrCLu53U-B1tk@BLlfA@2r{&ZuEhs4 zf0Gl$D^NL8O({h%5!5?=(5<<^8OQ&8#Ro7?!z7+3=BT5TUQFE`>J-_p;ejx zVh*>KaKoclv+OGcz9H34CXZN-lz>W0UR_r8-cs)riJ+c}Le(=AyBI zSPY_=y^f&N1F|46SuVZ@TaWxIi?z&rhY_L=5g3I1AE=u_=Ea3qBw$U}H7Yob zZwrmfWQN8mOX;X_TU@C|uB_K6nT}gkbkMDPfVgFGqJ_lRwN%>%zwv|RO4-ScjtyR7 zXQ;5^FA_{Cj=(ozf@~P%AzOttz<7UC8krLdLcWS1-XSwMY#7IxFDbTI$no`6}H& z0B=|KXJFyvK**w!n#>#N@_&9%db@iuXzdv9P27UT9dxhp45kyOCE( zxMds`v~rA4K3ZR)e){kwh`+ld)-dVuAYem3@tJ>seZgq9B z!LK^au1uakQ~P5}stZ_}z;vurGHSacr_~pVCn-P3W80Ej>P3itbQ9tQvv1ERXF9AH zIeQ0Bi@stoZU3NW+3F`GZtv+Bhj_fi(mwhKaW0H_`xl`7T{8RfXA|RN#HzLM zZ+O06ec+|{Pm(@b-xYv!pn>nRdv-p&Fd2rvP`clLF7thz*=Y`PayFDvf+XpLO(?mu zJiEG~{ID7**89qBEG(AK&sTgeF}-pMejD^s)NIB5I5h8D_1;a*(D3mgDD5 z-qJ?x$ts5BgJkdfKN~%G`L4y;$5TkhhN|BZPmE95WXBR1teWt}fZcY)JIExnDH^51 zl-|ZN1(=*X$QG$p01t|8Ql?og&}*GEj!Elp<8H(rn{2AP{vucDiN#{>Iy5?Ah^5f*<@I8|)thl0|SWdQ)DnWILO^C@34`RbnBIo08 zQhUVt3lN%Lu!Y_&NoJ!H^t51h1^AfWNt}0p+!?i)LQCJ+wTk1TaovoedX#J*Q8IAZ z%z=@s3gYByN}2qPR^8Zm&}W{zV+%(jgx#W72VcCs zH}}0Do%wR@3Gt|t0?vf074}!^W&x&9=}u$BcF9;c2`Uh!3MKpwQTp0Z^mRJA1tlw4 z`U(^sy&^zGj0)o!n~&7yuIt@cb7ds_NsO~#$Sak7vECP!f)o)`H0n^I2u1b8Zqs8I z?#XPD0LvI(YRctnEItRKtst~>R>(?8&SRv0`bD{@nh)|cr4WakFEd#+b2(K=AWNuf~;qir*6Yp7IOIA^3H zqqbb4+hceHb_UGW@S?NStTh1ImDRach<~Z`-r!U2Qy?#?i7wbS$4^CNfr^&J5y*U z$V6#pai>>G%p1b};KTpA3$DbbAs1F*n;vU=^Te5v-d=)b=CVsjXW0AJID_v~nZ2lR zDHmu{ti4#bnQVzgLq&Lqd-2MsCg||9PZDn)DDj5K;0|WylItMdF;+tid8 z${VW2lF#Y*A`Wm3P$LPjv>N@OX%JavwMourNpUb2t}(?yDb91Su6jxdWo!|{veBRw z2J9Gp&|RG+Am>xr8p;uq0%jb)zEzNyeP0Mp98@I{{5Gw_&P2Q~443R^24THR_TG zOS8Ro_d_``G;Gh!(@l0}!F1h$lU*l&gBQ4D(il)p5-a8X`4CyfG*BWjXHN}8O5P@j zk|UEdhQEPlWUs}zIJgCfvvVj-dty^XK!;>;{&%POQ8t9f94WzF6~5ZMyZt$Yrr%etx|lXags;DE3z zdCxEyyntcR834=`0}p2nMhob;3vK9$qJhvC&D6xwKSQtYElrAiW@q%2*K zEgfvjP(t=+OcJX35<^ar_|YvcrTix4#-6}tBLg3aFKG%!mW#MlYFKAZs+nd zHP$)^IyktE`kW;syTV)n3y|ZNXFsfC14kTb4spnBvIFP6i3Zn zu9AZ~zZKATa7*;r)O8ZzYrsoo2DP#ea$yo1#F;rFi5Fk&3(>0WxKI_dx1&^1q)P#G z+R;Z&``{M}*xaUKt`?I2BHMf$WCN)%FmD=wUa zSdUSQHHr%f{afSh6Uaue^wzSr`I zQv|T2p0dDEQf=qBedzZXDhEv>XRUPfB@YPFp9z)LpvYj7pAt+Vc3_@6yl$)3cLU# zTU7je+y4QM`Aj&4<(H8V>Ho_h{$F+d0}}L6v2X;soDw-e)4BhYKA-s+dHWk){62-) z$>anEu%@6#t8s12A}3?bMA`nwo$&@Woz1SGmn6S`I_iOaTXAhMI2cpo)f=jt#Oh5&bk&Mw*nhbcI zi``y9b~otM%A(<86w^ZiI=2DAMPD7m*XL=a5oMlZ%__O{dbZ=xgSIuLZqdDv_L3vY zF%O$f=Shhbl4CT`8)g(1I|2Xvs5RB~PrLm;hA&uO0y(h=v3+aXP#o)>?IT#t>&3JF z41V&(bDWxUjxHxxDX)%Jnnvu(!x;;$kz1<;HMac%_?83)EBdNNqAlIAwv*B!SAGEylf%1@cl#SYs zkt(v!m!={ z<-^()T;>jWA|o3+-EO}k<~}?YG|n46s%Tt!3Ma|Fd-)8{_#(*Mo9c-u@Cmb{@qw{e z{B;to=iYD0S4E9A)Oh;7>}XZO){1p=4aMU9bxpvy(PVo8vDG}9m2T8fbcfM?S2z`S zlv^ybP_vAFKcemN`-O_<>CuX4y>n$hb6#;)<3w%Xl0(JkT^figRb)HTmAJ5D+s~I5 zxg7daG2&AoK}^81J2)aeIjJjRiZkP@R>MZi*4`({!p;S6%HEy=CKkH;G+8#yuj`F1 z8`ka>ecIJme*t5G_d&df{{3%6N_R8zzU^M|zv9VUx3H-3H?pm_1KZgiBS!B&oMkj1 z9wP?t_kX`7sIFmtX~_=~Epb6RM!ni-YZ*a|pZS`o2;e#R&C>jk8VR0pig5Nf-%x#T z&yF5*gEq*ry>^d#*VD-b3It@sp3?RE)(lz$*50$87duBJB7UDD zgLnlA9-=#@!&cAq)@uL`DtElZuQp&OPfKj%Q|B*>oBTv2UK|soZA{DOWIv%6mo z-v2z9t880tzK~cak>WXa=A6x&gzsC1V1F~a6B$9W6gz{9>#Suu%Nss;jkgD!-wA93 zrsYLS9b3h{azm)P`8Ls+9CM#rqmQP8wTMxosAaovjN(Z_F`C;^a0Ih*jOE^Bj*GH- z;u8+Hh=RE%To|IM>P7FaKuv{%QcS1Mwn=ToJDON}&DD_Qxr#NyhM8q|ErJspN5Da^ z5|2WfAdGBCYaPO4B$Pc`&ZnVbk_7}-aPq`=m5aJYlEm}uRf2^#{UQb849bu_bJ$cq zID(r)f;iO7uYKHGdImZL-sb1Ap|X(-wqT4i)pU>^*Il^Bd_i);xgHn%vLeodB$I-e z>7h~Id82XA?J4dP51P*c>eVDKf2S1cIY$ok?SA#5zN)S_#nb={@(*=AlkZtGBINcC z3kUICUqU`_ z3J>lqu?3xcy8{C@u}zG}T}f6eDlT8c7N(^hoK@F;9^ZKb|k9@ zT85MAag~}T3HD^3WKbom%DL4CWbyA~|EA}t_Z9*7{`0rA;;;+TMlXlc&igtYzs8Ty zG!5J>x*$_o6t%-PkE)S4m>3RLQi`Qk)J8$!zH7?~|EA|pbKWJ%+F|h3hcyH^8!2g8 zPMSBLx>7_qw|#e~)y!U)4B3PkF8aLt6siOYU_a9o!v@s(q=8^}T5Is2LpBO?v6jlm<2@V}`YH zm&pTt0Vgr<=v93z-B}LNPG^}XyQtJLKPG6hV8BH&6$X9AbS-^Zn&11Q09rjZV5x??}< z?HFizV;ro7v8^mSHJE;;Ns8~@a+q(IK<)Bt_i$pj?ma9VAVy%orKZ3{#gs2FC;>`{ zj5Xz8YuVsn!kQ-EqF!EL>A*tk;}A)vaYAoU{CtQBt5zeK>L}PabKYPuz0bq#yd_n?R4cdKc4tN1z z+2LnV#q{wD9h;Z37GCnKEvrDqF)`^ElUM2C)FoN3<8L%9->8A)32AA-zrb`kSF@y* zIlg-Sdi~YPe(xWV)qwk=5Mj)XL%)+F){*G(p0eeDi(996E}IHVyPk+_qFQ%n0jPXs zvR283l6_(jw0t+k)o7}?=4lsM*POV2yU_9R#~)FF7i}Hop8h6LSSnp;xn5}ZaVVjm zK0LWv2Sr4jZ$9Au1$>9q*IW2Ls@^R0zL@$D^0+{MlJe;X@k!8$kh>#&|2_+U0YT^L zau)g@#gKi*Ghx?h(4&KI{4KJ5oj}+oH z;*W>?BC`!w+s=yQ9<2_^Tah(}JQFp)GeD!yhb0Y7bM-0*m33JeuxUN)XAKxCa?)*N zqa8m@5k*z0B*d$XcA=9R4Zqhjbj9g*K#GCG$aThx)DzH$o_KT;z1f@gJ@~#hdUXDl z{`|GvV|JPd#|2ZqdMRn`o2k)bu;h=^dlJ>Dp$_lm-H_)>xmh7J;&k$7>nqOLJxy)Q zAGQal1Dx1W#OecBnz6V}%Jm4bFr?LuNWBgS2{~Ds^({oC*l9WpsoKhYrvG@VDYc-# zGHQu+-0Kw=F{h2#*^Rw)>jtj`%p|6L^628Rw8&ox2pJK&4D6kv9iD3w8+7YZ$O2G1 z{J{-$bug%J^>IPq4N^}!t^EZwt1Yw9eS=p7hi#g@{tXjAgfeQGsf5UY(A`_TaQB+l z>bzsfIzjIes$R08!t^?zWGJz|e8f?kcjnI!&#fQ&CPenBJul1vJLuCAQGhgI_fOPK z=D{x_3<8aZ3%z~_U7pZBKSGk)%EUm0YO^x?@t+h3QV{V3o z)TZ!7ly-}g2-h@;i%fol1&YWS^fxmJcWLe*(F6{fIm$-r4 zF9phn%7mbpStKRWuKY3D)gDS{`m+&a6{x}`JVL7FW~1b^5n6f}lUdSoW(S{ofByxv z%y!qz>Q0SvI^CH7;&WYdoaQhE!_SiR2na+MHv%~V$tL4TE9w)NTA0?O|dggMz(d#O~$ zBNTcw=Zx!s2$iKc0TJ%-DK?x%BNZ2x zpB~F{9Pfr&l?Jh?K~@GnRB{YL`~!HOO{I24`SgmZS6H(X51*vp)QYR}Zus^X5_(?>oEp-kjvTjOCR$9!=yCsA+kbJ)5l`m|-vN=Z=)5Xy z^d41$ce5ZC)g-hiEoBsQCi$Z`PMT8GA2NBKW3jWb5yWk}gI2oL?L909mzf;3-Iz$Z z2x`!xka2&(6I2|Q^2B^7*-I=PK_~Rg7Q^$}1%7sIN#|atQ@9%LB@Xey=p6n`iP2 z!s>-G;#_hBZ7EQukS`0|v$TYn6GLTd>~yeM#fsDlrb7E z@fMP@HHs1f*7J=)|2joegfE$(2K4=~T}e~r6nALm@9N_>UlWPm#i|*ie`b)H0AAhi z!2VA5IGli5DOZYuS&lBNBI}$@&QBt`DDg3ueYP-|Wm=aH*raS!ZdPY&7$tU+m^p`= z159c~G10(3HpeblrpxPN#+H>lvRcg_Dmcj~k<@V_XOE6#V4X-*WHx3Al@}A`prU9< z2aio9unBAC(BS!BtF#EFkC3>KxHx@mW!W!zNHbPbfb+Mbuqc&-R02gUSaqs+uQcI` zQQ4m7&edvjV!SqU9Og9p$_74$JT}_^ap`G~sMjI7v7ib5#B0#44Jio^=tN8@MVQV8 zbg+1%H=ZPF!w(A(B(dN2}w(lpvCshAdyPevlp|RfAt(yaV zF7{TYc?!ZQZm5btfLp5y36(CnAc9@nw|Doe23uG6nHrjgI)on@PApbqsB-$svKw{R zyv1b+Ut9wc>AGBnil5=BSVt;5T%elo>!h^{(?Z{mE#*jXqT^KQoQ2|tEZdVPFq1`l zSNsLc{TG=;Vs!@-06O0kC2lplP@I+^DmE(4`+4>nSnr+i&d#)x zKzx|#5(g~sx!Df(Iq9fSB6qw{N2~g=!Z5!|gcLgrG<=G)HB8M`7E~wzh4jaLj6I{$N9TncB*z`qQTowS+gX3nckNPpd zSI^W1NQ^Ooq$KAZYe%ck@wL90`2^judmR0DAzSE3*ix~= zlo(~?=m}XU`woW;so91ui{JfOy6E^H8yW3NPj@XIY_Agr;Wuk{DAM{Vmh3;G%@;Ry zNH;h*kZ8?;N5D9nfB!65?lW5r@u2IRmo3^*d~6BJ@kc)F$jc}*y1Ob+(hcea2pRRU zFZ@Q(wEbgx{LttJLVdTLogc@?Cpq$$lDed8efvY6`v*r8WwsBa9YXd$e$4HxH$q-E zsWAm)OnZDJH{{ux?L>6KU)L}54aFd9K^k>68WlD8PdpYZCekJa_g)!f8xU;1o^6N zF|Vgwb1BZ_Z&o2gGi%(sY_aXpAzuoUzqo$5r%Sz$LVSto4_kvc`Q%Uh;n)E0rmy#W=Cxh87SxG$jwKPErQ{V49dx85qK z&%O+PBk`hl7kP|G3bj!WGfnHJ{dq29CEiRrz0?2G?L86?x^vThT1n}po#IEk{`G5+ zF^@S?_v3i3-Yya{o6b+||IFFatoHD-eFsw(%B>*AjgIe%5b(mNWib^W;%ZWCiOor@ z5aXOV8!SVy*?Iqow((D?^x6nihsI77Rz5JQmUpfmqka*1yxfS#TnFNPMK zIirsDdIu^05F)$3dU)kILNv$M6#jbp921Hr!vz=O&<8?9#c-WkSR*y^igkXIUR)yf zM1wZ&s~%oib}rA?V+thin^n?*E>*6rlrN+vYAdbvH?BjqvsxF5y#rbHpPsgd*6`#( zYB5x!MRdmH&CWaQ#bFWtbaQMwBJDYY^01tl_vXgcWeEQ$7F#3ErwrE>3c0rP%0XE@>_j zGw#Fp!3RLq?ZT( zWmSD^PK{vrXA6a2om(aGvQ=B;DnDlx6!rr%#@yj-w?`2jD)?kLQ$1KoSC~Iw`|6R1jd%YL zn$=q|kk@*!YphqNEVSi335OZMa(h;J)s|wUmqXd=VPl!<8E5d?(;xYbX**esS06pR z?xR?Yjs&XZki=7I2D-c87xLqC5Y+gq1z6c2xu76)zSkX+$(pc-cm`(*Q!;rm+@Uhb zy}05<2`Q%h>afuw0B@WXm-!2TkB=g<(3Q?mPY{`G9|M0m7||fszhWuPQLMN69x>rf z>iW~|MZ(o}XFh&4{PIlaV(?eRzOG)ZW;HBbATwr>Wyne)(_Va%=*Le`5pIAU!FdqR zqxghIiV~G=M#b?Pqi#(8tPJyE0S=hRnT$RuaocGW7g~_um)6PifOQPD{b;~J0gyQo zaH?QOPwVsjgcY1V%$uk;ZJ>iqKvKV$rfWl>MP!zdqXO`6FJ{ePQYy#uP3azYf~I52 zz4JNMJ#MVO6g1XlMb+*z05T^m-DqM062hQU98}|hbUFm7@CP3cx7@eE>?_{~$#X|J z?a(LQaz2gW7Hq|vS&o!pb@-&^KI#5y2QTgX?A6R;&&spnqrU*G zndbM+5D7;I%-wpp_xLZ`hVE^%BVJ%Xl>jj zcyI{8-L()PNFcbhSc|(;q|j2_-L=IbxCbdkio0u&A}vs$P^6`lo||*-`u=?D{z|ge zyl-Y^@3Fm~c^E*Kl8HiYv+dXgk z_@vWL5n7&&phITnO=K`-%$sBEK^zw)MyI`65Wgir1LDtuc`PCFn!U^zw;U zz=KDURO`lf&R~lga+C(VwA|PZguW7Mw$l0I`zV?l7XFj~go$ z^4KI?%nB4x=1s19s7um6ZiN`4!z}VA&lUE8Ew6UM3Q5=DW1mW1zFp8WY_J~$%VI1g zbcsit!!D$ifATeP1qOi$$K^TkQmR#?Y~6{`;qwm`5i=iRM|;MrND~$~-Y=(7km13) z86|WX`b5q+ff2zg;!m`dP`|n5j{d=L^ZnlTai_0&JM{XU*Kn#>r#mnh3~hsNG1O{| zWL!&Zc_3v+^t{Ha3XbbT;rAmih=dJ{e<-u{)+uv%j1BrFKRM2n@9$=GXx_GHVP2Wi zv4v1PF_7uhy+>G357w=DwjDcShnWK>s&4Zvkgh(x^(bAG|uMn+`0^6{_m)mBlf|ZBLAxX9EQmI6>y@%Z^PUemOJg5m6Xw;yPqyk zOg&w)2P@KfiKymP>fB7tNJFexu(v$|)sIoS940u4s|g*81iLNWlAfKN9%s?NF2G*2 zA?gy1MGsoJf$M9JeQ4C<#B5tfx3{a!?q-MPVE|A{Y=NDPoa`bkrL3bUAvqp;vUD^V zuPk)H%}mje&d_)INKtIrN#aQ2`n3{N|FSdiC#~9&eY+4|H=6ZN9qPm9o+HeiiC02^K;OW&)cXMVG(ATLnRWFF;dA(}|Jg2BHr zky9B-``~d30j^r=nh+V7M9pyoPKpRh=pKN<2HJwZn9Y$07~ zIou&ZKn9YC?NIJ_YbfIij<7RB*IMCa9%pAqUHvpE&Voayc(8P^i~X3_{)m<>mwhT# z?$7Eqj=BLrFTIus3$Id~ByO+)w&sfOdYT8Q8%!&kdp^lo3D_n|C>PI*8`_v3!20E* zb7}a>c2l@kGJSxTpM!%cTtLT&OQqX3_!fE^73unRf83eh`w4%EWf}``$h@Jt>Pid{rpiJ^dL|MI;*2$-`!ia2{gI~hEOVUd031%;C zr^p(!y2^5*CM(7SkAOD|8*Zp|rW%;KaC;QM@f}#y| z^NP=^QaX?bU``V*SKOQuf}Ijr6awIq+pbYR!z;F$L`*QUU~zY6 z=?9L3jgw*!+6J>p84w9s$1Ykr?T$KZ3=fwzisloQ%R*oKA9pF0S8 zCT6|b`XiXt6nOf|h*SVFCb{YjPl+O=92nDm!n=aLK%l;mtU}4^XMFcl&`es0RQPD% zAytcJIonmDVn`BIA~d-q_5`25*LC?Ku`p;?+S(SUaOlvqqMivg4%(=1t0ILY>x27R~bVEGW~3bak|{q)ZH^yZh48k-P=B9UA5- zUlO86KNmNE)KyKr24x>$sa@_)qNJj=fK3(QxVU^PQlVc|3lg30HWBe|KkxmPP3BW#|4*G6bTTkVwpZQ{hde9}3Rc4|^v)v_mMl1mLs?0gY zxZ;{}yny>@S`i7DP&egybb6?o+Fb@J%o*^aO)P^^9YFzPbuE{ihzXSqa$!y6Lpa{5 zFI3ORVHF@y?@LqfiA8aF1Vvt6LLO)_@u|V21s+hw^zqf=gxXe{mc5*F&4QmjF(uXb zez_i{JhMg&738sG%shwbyT5C8lV)~F4u1oaF2~Dj_*p`Hkn$EW8*&x&o88!G9fLs# z$_p&S%GK{l}`nXkRz0=*)VPZ|GrMubH0yTWZ zr20`Vh=tD;RlNH*pt_C5&!HogzoU;aQ*ikrPurs+3^aVYvR>QE>MY(_(D0^O%pOgz zKIPjD{Dp}zF)DF#VtkS0R=S}npC_7xQG@wd>YU{EOniuoBTRAK537B_?>!E;L-fDFHW*b`{knO0&hYnvi9XJpVK+JS-hto8A^a zdf(!E9F+v~VPj1^TCO@ZGxuB+(>>I5w67%VaC{?kG>8tYLI5hx6=j@kr;9`dLf*tYGh4liQb$8-VNd>lyf>D}{C;Y>zN zZ0AI3v%0x8XWyKu(jID2$mh$vq8*2)?OWCA4fl1T#f^&qPFI zVGu(%K04Y7uAZ^wRF*9FB=GA|upF9{o53g|?M$ zRT;$d=r!N*5k=aUQ%Fm)k^3&>FYK92Eu<|JM3u~cnbp7LjpM|ITW!TqlEm|X9OMnl z&_pC0G^P8hQa6&PRawn?xTo!-ly8C%Hf)2#BYHYUnuV7nhu_b?8(IZX!`PxA8}mmY zQ>c&M8<0I7mY?*+@ByK;vOIk>%`^TUFDHqMU-b4-_6Iu#g84zP5}PYI|JB-Nevb}R z+Z2kN*sf^@QO@T(9cz?62%e1!_ZyKKBE~NPN00_so}SifPR?-+05ybo3zk=cSEf{^ zD@jFr6u7df8|0R&TwYGEDGLn6XC(d2ab_xrPpVQCN7F|eMG9X2AT?zzP@Bkrq=hRN zYtm{gR?pmXgY+&a^Gm7Q#j?V@uW`OjNTKz(KsjNA_8EL7`}xY+1h=8CXIf}vrlc}7 z1=94pdO{VXoIFYjU1a|e7JqJ^;2~mcd!^4Fi<*sRz{ypPTAr+SPS* z6R4{PAtUlvoO1{qCjY=asZ_k5AW9`O^L;PMo-L?4BIql*9Sv|X(h{85s$$t@I#_ru z($~Vs2x&If^ z^rmZbE4w%3WaO(aT)n&&H7-HlNV9LzUQKZGc6*T>5&0!#E9b(hH((jJFp!(WbAE^| z7b`3zx7s95Az$}w5Og+~!Go11mVwq|+c{)6v&JDKpbRgYmw=MU_Ky6(loxZxA_766 z7(PGr+I9-|a>ohLl6RQ2BLu`O&MT);+Izh3nQBh+o`#7v;L~upw-V5Nhnw(~Cf>2( zQSHT#Rz5A|Pt)aWnNilPrx)Q(%z^OGyBp^fi0V){LV#jwwBZyIm?X}5d0RzKma`BT732MUl4voxv!7!(|Y zRR3Un=2@yV?)$5T<|D(w$5ZKZ-G*5(V1yC7jx~sdP((9?4#kn7$z}?^-LWy+XW2Ti zIi2ygx}vDrDU|vA!A4%|$2%K(PNa>8day2>JO5F$c|SE$KJ!UMDVLdn6s}gk(!bN;+}9dWHv4d4nO!$F|h|8_P!iDUPG2f&`ij zX@iWlrDTZh)nmeV4owTQ-Pjp#nGlNf-D*ICd7m`xccp4U&P0ENsm@?sLq?vQ#f1%W z`@CTzxzv3tT`s16@IZXTK}Y|KPN!Ekz;5FOYAd~?<0G4={4eD_Km3Tr+viomcUInx zy-rK{NniJe=dX+l#M`UPI%+|-x@_1vJRU@udFR?svz(Ry{7Sa=bxL*to973}-ZrG@$u`K4;dyC)M68;a;f8aRooF1G z{_}i|ypk;@z(vUxsLcVTTZ>h}Zj;!E*@5aFjk3+##G2<2M|e7VQPdus42adhGMXG) zoutkSeL)9$Y!Pc1>Js&R(PGSb=C&hWQ_+ty`hG6%^${nfG%qqV(Nxry;tWT;Z;?^n z$l-85K>x>5TEl=_A`I0gI-B4DkdszmX?)@K9NE?}Eg9)~^8|vKjTzIFdu_S=BeR{^ zLgDGEp0F=ib5r~WC4HB{OK`Vrq02DV0`_m`McOIB=TP=bhOx~3XcTulXLPv z7p147RL24IS~5v^t#3Kyd)=8jwQpTO1!gl+;&O4X)09M?ZRrRc6*hrx^;3enWvFua2qBGzifE+!a5OW7>Rlp@MPlHlXb#QEXtJ6e)&%>)}?UX(k%oTW|y%Rfj;gGmSHlmxU*pKjrdlYw#RX$Z)%pGmE7Z^OAKcmoI?PiUca6D_rkm`MBbGz4hbn!;J_k9iPSB z4~dY?t=nmQHBJ|sT%a;ikfU^d^S*@>n2+JOP^DEL-|#V#n-Kz0_m@FvX}8g`0}kiv zs0(nN&iI$&-!dERy;*;-rReZ8PN}Y>2$#;tV@+*Luu?I5BFc5OCdUnsbkx(tHrtC= z2?!k=fWo!Ju_IgvH!4(F4G$~jQ@Le*I00$$QqK#dK8|YP3b2!q^=OnDvzh|CyVr_7jG`#dw>}R+$7sSu_A+8*1V_Z6TUDpmn+GXh zKOu`a+%JpqC3lXUqH$86vMwrHAHV+*lMv*)@6Z0o!l&pu&G1LcKTqn%M?2EuhS}9a zoYL-;d|1Wj4)Q$mc>a^KL-U_KHO_}t9iFIhq|fIaWE0-gS41LNke+kkfgooW2bR{9 zNI*d0lR2^C^YcDwB^%~I+r@fF)?c#ng4v6XvF;A}?Yk7R=NGm|-!i}!e$OzTNt^L& zt$^*`EGJQvc>Jpd9lL#uza$%0!t*pecQ_J+ zMU$ZXxe2V^H>;x@^o&@dAiYY~a9c%@kogR>f4nRqVUxU?kb&~c+L*PSS|VMku25`5 zOfdT*>dG#O?ak0NAJ^4WI9NG{;}aq^zl)Q%oQMVm-zLU5C z%`e@ztBZ%HyTShY-ch#jg69A-HUHJ>;?{v+{aL+1a6+KHNc^u}qtkd(d*{^n%&@ah zNw%R%w%)vSR-A1o*_gzMs31yw}U%soaO=uCZzz&C_eC{3T ze3A9c#sq_sQZpioa#ZE;T&ddUed(gV+LA{umgcMO!W*%Qv;cSiF6emB3ST+DH0DW6 zj`%0CpHQ}^p#$0wJW!~6M)=enO^JMP81`yJX6Oh-^?u-J+@RLndPZClCgmH|@UnpV zGPghlOahECqs-MRz)CU*TlQ!W&^NLX1;q$U9=#7IIF0#)B`8eUvqHbojjbuU9MLP1 z+|?!bZ8?t4Q5DGGc1K+zFLDDB*CT7EJo{8+SJQqq8sCxO;=}|{XM6PkEW_M*pn`|K zwSjS7Fu!j$=TL3KrBv8`wnA(?p5=taR!yw zde`WV(O4<7+QtJZvO-sM_4j*DliGCm-c!Yy#K7;Hot~ZD>Rd(Iyr1cyXM2v<=mmQJ zDE*}-l#Ck~|I)|AVv^AK_-OzT_uP~LvXx@%%Rl(i2tA%UC)JH^8WWOhkHabdlHK+w9d=oVTTrGQ$3D zo^;cz>(W#}}lB$Zy+5(O$b%D^ol zp;vKJ@oJ_T+YdDS`o$CDsJU?CJ@YRz)OG+>%WtLn_Y7@!yba?m@90}agyzZ^@}`LD^68%wwE#@{6!XTtI?p=%;!!Dna_wbPgzla{>nLg9ZF%X&l>l z{SU?)>JbFNm|6Y)WB6WOm57QQPR3;6K^&SyQM7cTi#g2JU&_iGo zqTa(*$0ddCzSL*LLfk&FH#vi3ac?<7qlZvnLb^}>>?VZU4-Dl2fLDawlX0++Oo6i> z?;JvGKDPAs5nQ0@JQlO;LH^L89ul(Gh94Uz!Tvwww%TFk#n*|J-`;#fAsHEP%7G9# zo|xFLuN?2GJDiP&3tlN&Y><(dH{`W*U;O0{dj6H8_YNQ0F7i>~#U$lv-$Y>OP#A!V zs@LdB48|T1I^5@oC#6>xQ`<6K*E$61WpxS{MY^;HXNTfC5v+CerBw4FABtBR!n*`5 z`h6*~hdy^`lIYED6RKoPzMoEuVJ>~T@Mc=Zqyg@(G!|x;RzGOLflh@&@Y}s|V)p0V?|7 z(gEDOYFC6TqIF@w;3ky6Yo9(NydmdK9JTJ@MRyDNu2ev&_ImYsW^Fi9fF?_qR zimcCoJG0*mr366T=QXzK8W9y)^t~UaaEtLGLPvNx^wJ+NeW!)+ZlN!v&{IV39W$}% z`H-k|_#*v!CFRqQ5Hj@OFCyq6RacWl2fBR*ZAXxqDBvaUW;fAx<)Hq?vvBdG(en5! zPK-{A^;`}|Zumvp&09(uzF4O-ze-PW9LAMkBk=E%r*8A=-`wq7R})JU`^cC_Xlq{{6`Cd8Dhz0)L78uRP>ohNgVKb#x** z1>@&kTBQ*l)(I~=jdMX)tiTq1P6z?L2_mW(3df zX`J!~dT*}2{9V;*p`_qyP$IXhq2)J+?sqS1Exhe{TjgMer}ecPCKrP8g8Aw`ZZIUr zOF|2_p}bIf>(gY@Ej=dIrw@UDvb#6VHF&;?#)=$8OtfL2xD*K{`X-s1UYJt{?f(kA zSJXS@4GE}=eSFK^u^)PR;@^`+&Vv@QdtCYpL0zYK+d4icVIn8spt29b%D~N!(w+Iu@bmT1chQv1m5pHyFA9QiN*+drcSO7h?upJ_ zt~E1D0>&Ve_l zd3VV}3cnts9D%|r`t7V{KD-enH^$@=8j&`+;5!Q);|l>eI&xi&OSBj)(EU)dE^p25 z4K3+mG&)%f;ydp7;du8E6-)zIOwanjK}5qV?EBDfU4F9T$E%>B{3jC@64h~Rd1Sku z2y5{}V?$(q;yON(eD^#b?>G~wzElG#Z&VJ(9CeMSpC-KIabc)avexN(f3M-A1z6c_ zX5e_7mLu{`xHt%lVoyb+zzw5>zOUP#5C3*r0pgdMn+f~!I~8Hz5PBJ{mnl}tD_P$_ z|G^lSPw^29S4UZn^Q6#cXm{6v`zdP|fYjZE=I$#kn9$Wr6 z-R)7rlsJ$+A5={s-*00(t@o!Sfci6e+Z{9M2SQe3fMy-_igBh#ij3rxm%Cd?les?H z;AXrWRw!@ML?22nqtj9&g2mO)A>mJEKB5)Yz)RIspOt=Vb|hsJqPn>hY}ETa=E@Ok z8l#I>h?%gxWUTFcKry-h;;sb>>a|#J(qi4dqyCKV76PycQ>r`T^+&IuqkVmG^rO$) z+73-PGfB4u*U-UPEM7ShXJd)P?_PGu_P&lSGp;~LX0KBieO5-eyv6#!s}Gg*aWS`; zfGYC!nAps0(soCC&s_?EtIMxvQ0hA++l%v~F??RNol;AO?rXfjVcP-5$ZnSvAiCl* zLmSa^h)9!EYJW7HOm=u^78pk5oJ5SyCsYTXsbYGseqknvV%}|0U+FpsTsLyT>V1cm z+=Wd@Tv}vr6h$^G13qxqdi#{gIgt}oS>(+mI3(&P0&O1A*8KQ=9ezG)$R!OVvNk+L zZ_^kSC@Kduhg;=J??MN5H}y_No6t8382(bp z0PRFYmqJo(s=p(Oab?t=GzJM#BsoI52<+5#5t?S5T@+RLjOAs~dd6-W57c&;|6p*p z2*uI7Z^5zAt6@Y4)%ZTf4EZK;dPPtf%-zyw%3e_^i>brvgTddaWA}xPD(JrQPmRKX&@F zKu{TY<|1`IwglQ6wl{=PxXJ9z_=;qGc>|xd;^{EXZJd>nqYI?iA#Fq*BN+{nB%!b= zNjHu`$BxR=fVW*8pCxR2JEQ9|!#;3U_V|z$)H;t|TR;hy@E`STbWA8V<}fEwoIp&! z6pe&xfSTun0)yaYax-QgcTFi+DSZwzPvZ+N0KFb!FQpjWQCqvtt#=K9C%!C8+7@Ug z=Y|fEaAa+@z#0CacV^0iZjoIj=%~Pp4shJ)UL!nsku^|(pxaR-AIWRdVpo9OcE@)E z+O63m! z-h>RD(}p#1NDyYtHuH#12{Q1^Q6#Kur$olyfB^PvYP^n+ohp=i=?^f%sY^p^HaT~U}ZXU|9zeT;5` znJ(7it`fFQ{*0iC7k(i(AQCnbHhbC+ncea>pzy{IG-VvFQOyM7?jH*S?cABdrBIfO}iBkLnV zHLla8=){n>k^z+cE_84faQQ|#7JEc0i^@XD#!=+&*A_VFL9Bi3>m9YfYK}n^=@Vs? zzN8}{N@Au8SB8ZzgL7jJgJ3{uh31&gx^uS$2SofkdvAm*Ex>_bfbJI8yA&ez7+)sy zt%;T=JitbmVl}k7x!S(MxGe=YFZMdBl(ru26-De7iqi!g*HJwsXG2TO*kkD1C&t$K zzIb_m4!SCFweg|oO2Zqc3)mkAQTph!yy<6ByHk=M3Y528cRmB?C2|l|MT|aMJENNt zNZo_BSn$8iwNev^pm;0YT)q4z@7_EfaCJ0L>(ABc5`R;Uej$3WR~ z&ve*Nq&%ZO6Ft)pd#k7cp10a-=D0@MXyJ06q|SZU&_^Gq|NI^PjME&&aoun0&Fv_5 zXuIcTJ(Ls^SDDvGf%Y|A^s0s~d&Xy_AI36%Yj;=cdM}$qWj1V~h%ZWgg+- zGkcCUhyiBC0J<|0*f^tsW5%yvB_+5JB5~4E5J98dpqPk;LA1Hh9-v|-fp%UH)_)%y zHQMw%V^D?HZ%#TQOo|fGhULT!uwP<*zizP1nT_tk=JJ}OSb~wcRE~5VkoyKVWAF#c zYQ5j+>k|Y2mNJUs{om3AoSFYdme2!<>3~^d>=VbJw4o~s^WQgA5+MHnGC+z2VHP`3 z!81n^ps1mizaFExVhVZ7(Jf#@dkgxl zWq```e}C%73W#x3u_(&2@D*@MgDQc@_v=+eI+0bZs5?&FJM=#n1DNx?lU_epNP$)8 z)c;rQESimft82^lp97&ySzvcvhTTSXXjk*=9}JS>99W$SR7APP*xjg8f2%sVp~fCi}AgxUNFyrFAG6gQSFEcr#D% zRSw8YwF-%59dZB;_moZxy`x$K13%Qtds?)kPOo;zWjgV-ulN}}a=hLU^2+{cwRq;` zuKmh_B8zlzzlI9u-Yv3r^SvcSb#13!^_%a)?LR+6FwW{soxA_+^i)x7=(3E@@}C$C z8h&kd`TS|DRieGw>22DZ@?<=DL$YwW(VutLtpf=ZOW6C6gC67E`omKw^hm`GbWK^ko4? z=kyG!EHEb_aNJs*Z&O^CkayPMh=XG|7mCiXNpk{&t$#UUM-|WrPEtx@ea60J_I>=; z5+#HZPp-9y7s4~XP^nduM~?TVWj8OD?`I{jIUpw2vr1l0fvA$GHi3>($!**ru}us- z(*;ARHMFDMTb(QU6yF698L5>&-d`a_cRcVV`)Q9p=5={~Adj7PVJv%wopCK4I%0Bb z`L62ynmq4oRw>kw)KAI|aR`mX*wzmeaTy#4*oTc|vpq=O#S zO<*C&%K-kxU^tuq<@GAZo!=KaokGZ{6nr*~KL0%~%?d1!-*Kvv(mE!eUhD9~YqwNe zca;?OOC5smKfZU#rgHy-arI>SfZ>BOMo`N&_MqSHSi`-BX%pYFesc3e|EoYB#t)<8 zUqtcJddsZISa`G&SYwS_BGwAg$XNcOYXU#gX|IhO4);wA}brPjSqcpLMUBmFT23=qi zeIH_1I20Oxr(;9nu_`cry~OQv!7+b4<5c>~`SLpzM@Fc6}a^tu~l0W<= zeBr)wowgH2v?Oe_#2!D_vUEdPr6YY;?!mKiYq$Bx9bw$w`t$TOi866~oR&%61d!+< z$+?RY4YnQrJSdVO3QWLZvzyDoMk8Y`9lLET(xamG;Z6)&X~Puyl?aKth>O{aFTqXI z+i9e=(997)v`6v}E>SFK0j@p=+z%U1s2F}m1c5>h>G3hmA<0{s9y)c^K7!Ja-##w6 zlJ_CB0Rcsf-x|y(3O--GoAX^M%G$%Bent)ra|baglCdJRty`IHa+i+0wQ-**4gVZ*cieKaB@5=6|FKDmfvR;>VQ?rS6h;_n_Elq=9|w) z%{q*KiqNbGC)*pBfy`-7biWne8S{JSJ}IuzHJ#D}o_O&xJyqP=P+)#1Rl8xomnPG5 zEOWTq#c0&NrGkQd7+aS7`(n@du<9F7bab0A$%RROJZ6$3nh3z9KKG$cnSIL^EQ7N^ zclZoPx&yaU0{@h7f&@X4Lj(lvi})=A!du!%K~zYtmq9{ow%#fZv=~#^8PHsoDkvGY z*pgR=;a=(w%;Wt&B5Rv4EpL)CkT;3C>vDo>r-F~{)tPDfyRo}mdZ3nAybvFliB3Bc zy64`gb(mBw?yEsh2^(yK@!&fSPRM`_;we{BHOy6nK69&HQkyQ&U~7_n>Bgy`*QWtz z5vHZ9%h*9D!_zR-50ctmj<-z;aWRmPsFyjL@d#P~NWw5n+zKjSK5@W(LySEJgW2+( zs8+6Ksb3)IK8@93vKN+ST4KcBVM&#Mis$hBo^xJFm&KA&e(~<3K54-Xrn9%0;?eUc zJrr9i)hi7{7i!u9fXIY|5@Zib;=D&u)oo_EKp|ZaPFD(E@!NtMe&ZDRjY~1nw&UU#wKropg}z$f z@Mg`rJ6cggkK6Uq-idwrae2A%tkm}6dpVQx>?i987gq=hMTevl8p2u@%H-Kdlu%9= z021NvA#9koE0MPVY=%mZ`vQ;`|6i82fRpt`~zy43l)J zO|7Z&U4X_RD`4$C%cKKY+u6z=ateT72XJ*>2qszzyElOlzM`t34AIuB#^B>?PomdD z1+(bQ-3RgPj?g#vNb zKaT08d%B<9_Y0#u1xZH|>1_CWU%he!StXNqJM=UxRJ?R{ao2hO>g(GhmruE4*+0;1 z{bxV=`pZ1F`rYR742qkXPPT@B7OfTQEhEm(h0!bwh~urFQZHQVh0p)S4oFKoy!C(U z2m0GLG3)ym;i`Chx}Xv{z7aapN;qXP1XVNlgrB9OnfdX0*$BsGmUbFCj#YFD+%E(z zI(+@Yq+v9Q)7e!eqbqOHjrv`0o*$~RiXX~ncxsTr109eU#D)}}op%U9ehi_OmCG>% zfd?~b;~z^dI#*&BftAoOgs(&Edp9hVjb1S>KJ6P5BQvgsTjCWL$<_lY%{MxtA8rEN zi*ed1a_UttGjPN{vt&1}e%HBlcrlS*whxJ0PWu`GV{CUv1}=6pHp@9s5@f+}C@fWK z*roDo?|y{TL6OVG_`m+W70ddl^hXcx5q_LHdNbw0BRFGG*@Qay=gsv4FK6^^)= z7u8)A?pF4oFAE5J5m6>Q7%03Op9u@&X4AjtD$|5w8=y6(V#CMS07GACsM>SV4nC{E^3ilIJ#_g@B)L` zG!l7}Qp_?eo(+NHTq;FJvU&zg&&H5Nx6@A~awWd0X>H_53}l#XUyl8Nk(R$$PSRu> zX*S{VHbKO(0^dB7qe<|WH0LrBCMT50v`JNQDGQR;owfsUF*PrSV69G?r8HtAJE?HD zQyi8VMEbo5T&=HJ^uJO=O5Wt@8oc^M!rW|6SWt;<;}-+tasM#x5=XNl=LXCtwPUK@ zx9WRX<~5mtbUb%T+4pS<5v}|Yqzw}q(1zn!O?%}hDGm#w!69D-T7x)6dDpu9sktKEBRkD(Vbqg_{ZW~hxpb12g-b0tKS)kcP46qWF2{sEB;izOy zoa8_cv`mEPsG<<^X1bvbOYQe!tayfs4;CGMw=xa0FIXr}Xq6jF|q1QmI{Q z_s-XaJ`;jl8=FW*i@xJ5f2;V9p3EwY78yetVjqpr0m{>CYhXIb z@%u)@4Nd)a*|_w5`{Mfr`PHAO&ppX~0UT8B*v_OM`u})7Hd06sD-r+H8*8%q_r>e>G?TKDp?3R9-8z;4$sXft~3d5XpW7qE$m=Px}felQ$x5Y-ZAHP`D$j1h;x$KRz~oN z@+l^sJt zT3aHG>+x7Iw)>dk|CxdXXHVW#N~)SGM2?-AtI;*XL1H82rh}Pdk~yon3=d6l$31j^ z$E~Z;dqok?D^`u`f-hH+FRY=Z1~Viru;FmRPi~8iscjsu?B?t>C@P#3&&B0%&xpf` z9XJ>CuYe`1hfz;MVUy>0s%%PQ%}pT%{MB#Y0JL%VvQ|f0Xh@E2w;sQ_AKR!2scwLbut8(NkQ0K)?AyHoFCwiGPGECVxFw5VgKVIy3&rKO`0&w5PeJM~(0ww0PM; zGR^_u%%6~oXrL5rcHg;m3x1d8@>ZH`gj8JXHdZ08-2GIDF~WtuA|`@|(^SR;+^X{q z7(X@w!p72}kzwhzE+xeHyswV?FJ+rTQ6@JxrD0gWJ7vy^eM-Bq3WDgKw#*TuXX14a zdB1j+l2vWru5cxuN{O%fXu(J##Hy)BEmbp@O^g#0M47F4>A-OcW|UUXR6_FuYtGAn zmkuA{M>X%oMelesEa*Z}ue=x9Tdb= zc3+0VKBGKN-vR5HL1mYSMZDr@i7~D^(=V@$sHd}rr;=<=EdisDs`y^JN?X$p;)#yS ze=^`Ji!93X`w?;J654kq9^sxDGC6hWWSi-2*aKK|+KnUvHz@Nuxw_I+yzu!ru zYBeq{6zD=$D@JN~aqU7&ukC`kK>;!YR`nUFF`pIWZ zpu=e+8~aW@X%nWW5DOGehr+&gW2SK<6Y-gOPi!01^0UC9fd6qfSE3 zWVkQr6dF#!2K*O+|Grc>&8N&xVDChfjXG-zn9>}sNc=vp>YnJ52x6(H z;tYho?P!K8Pu(0mmsH)09xtLUP`0Bcky}gAN;5`cPl~6|dZ4Bq@d9M;TAHhGz)34gSSlf>=zJTs#^v=dvq-y$ zC3V_(7|0nrH-q`(t&Vl}IFU6PQ=j%9{NCUh4F?*0kHv=dzOWZni%R%_RZ-RgNre1| zzt6?_2r)DO;Ic$v7+h=AbA?~3#;f8OLZFy0Vj%d!0`hN8^La>oh_pG#2(U!o@8B3L*>E75r9IR+C?&YT(=+AL-R!=E}s<{e+kXIzx(g))LD53$5#swTh=@_tDN=`aMdC4-me z_vc8URbkj`%xK?MOyuD~zeL_Y-Mox*;kO5Qh`Y%Y)?D53nM26MEOO$m=eZ{tS^{j9@Vqgdc zZ=6DS@MM#! z(@u31Zm)7wfq65>7x!NRIoV>KKR-76-NX%XfWGHJ6z~e9J=@+Kg_!kzO~g6_i=vgZRBAo7LKy0Sl`1iCk~W~0 z&dU>K>Yp|4?OBKN(qFAJ-P`u}XuR|4T2}TfC$f@K#C+eJTpY@7=;g7nL ziH_Iuzl(Uc7Ci?5FLOf6rVt8DPwSt-QUO_q;Ny*>!n$6Ui_a9tn`AJ`0YY!mOGKa% zUY$;{)BIqg3Lf{A=~Fzb7OZj*H~z1L$_d)NMX0$+t-iS{QQT6tmPfh>ATz<%Nb^mM z3J8iN3hJw|pH4+tBqIpabs3_!X(qWH4BH|lY7`W0&|)z(w6HXv7zZwiaSR|ByJ2}M zl9p(pc#4vvgN;u&c*%xS1zcoB;Qq2gQl#8Io-;;G%RK=Ec82iXf5}Qh7>Dtx^RmaH zl>tSG`bc&;ATk5Azy;0S`L6$A>#X0JeEfJlx{;0U9$lkBlo+_t-5}jL8bpBs(he9M z(%l^*ARQ{*Aj&{MKu}uobM`&gb$&a4z;iu$J@I;8@B5xM;4%AkpOhq8XM}FyWdUfI0+qR+cv#PSBh#fPcj?PPThMbPcsiUvSQFCcQH&wR~>$bl= z-=ozWF;V^LJJG|+pq(X{#C-V`&9SSUKI#LIhZ?18=g~%jZ@gHJzlfi}uq;93Cxyub zzX3!YO>Qdv+j;K(sGG;>-^&^cJFLLr%e&(SJgYG4&5m(AQ zwRW(Un`+5{Ai~&Ev(C0;2#2wopiDzH3uX+=zo<-n-809_RvqiB(2W10EwTV+$$6x`70+J~P9ChHuZ+ zTO;Wkez7hV!9HUZAz9$wXUp@%|Hb`+u4X4wYt8~X6(@aH=*%=9I*P=SdPpdEFsg>& zl0`eKEAAh7M{mVxgp)5~4wo>0o~^$Me^@5--)Bh<@$_`fCfvW?_n<~6>+Zp(CBfyq z-|k*g=J>1_e&Orhd-*xU7M)wpE*mJl&orsWT4B z=4sQpw1-XYi2N)2?_XRuebv6(DO^3`(gLbbqyd6tVCgat@2`$1^^~JyvXoYseV7w* zJr?)p=(~M2Gl`@9_BTH)q`#dO#O-s07Z+h#j}-a`gH~-kSAeLutM?RSq!2=c6{g^= z6`Q2{y;g;dGYoU3enK^Nn<)dzdRgbHF2SMn;V%WC@nSJmF>ezjc*YX2ZZ>97rnE*0 z2;S__V((*Iy}6*&xlP-+5sGkFXwKw&sGsH)+OzJ#8(i%CPVt*8lX|%zws9~NnE6v( zV5LQ4d!S1OAtbET<~|9BvT&8HJ2)ym#fzC}BzZ)|=W}pbj?j2h;ZScmr5HMN_e@VU zJ5g5!!6?V9jM6nP(Z<7)E*LVxL2e7F?ZJBih_Br~&;<$dHG?dm@h^^1fXa~}&$#!= z_B(Ci&8!7+U}Cz@Xs}jBU-yto2G!E>-i?D*nblzGv zA0cu%O0{vegsPA(YruEOF@83NwZ}pnm}-0}x0EY@a+yb!Px)++RTrW@qz)1Tv~)98`QT;0n|FXxR{aM%?F2%j!)w#@xBS z%ndk0NhX@kYO)*j#0gOsEQl$H*Qc>kMFT?fn??h4%76zVwJM!_zo^~BX?Oa~nL}g% zqv}>10eN<0YRQ}vxk~DD0z{%0*@-3Oe2{Xf5v4uCS^=%DDyFu6$}3&dWxm|CxtZ$Z z0hs_U6@geAo(6a{vq)Z7JMoN?fw+z2STz;iw03<)J%h0-)y+woOufscNBJW9-{l?~ zrrPh}isNi^d&WPP6?qT<-OszSo=|js*6~db~k)agAha10WGno!#HJ*}s zzq{_ma`$U{*5}h9P+}?IL%on0IIAzZ%R5toaY28qKi$yVi=lg^>l>z09tC5dOsjy@ ztd%OV6(?lcnN|Dau52TJwguw2Dd&uA4H}q>E*IWIkn-MzW zAC}9*=X%|C2+jB;_|U%4Z}cgE#ZFvu2-nL z)jRegtuwYr=BNF=WTwR*%RLmlMx)gP{B6Jg_zz&yJYH?-_u}T{seAi$$Alvx%&G6AF6094Tl^qp90?aYt zA8MwQS^_#@j%M2S%G3ys{dC=WuoZS*!&3iXiZ0h6&MjIZBMmJ97K3Gx61w%WQ?wQr znpkl0-{FfVro5P-6`<6-JWz{ba4_KJPl%Da{)bBhP6m8l2G#hE3m(sQA>wpFOUhDH zDrJt|L&`-OJv12B_`JHPVfq6AOgDI|}r_$A}L#UZ7umHF}a)nR>S+JAu6m;J7pZnf9X z2cP~aeEIDU(aB-t%KZkdLyEp7GY&CdPauCArtJX<~NnYw3vsj-vHe*Pc8 zX#MwpfV&^=3qK*NS0^t6WM;jkRhA9b-e*1Sxbyu*2oy6~${>40wR})bpy8aGyJR8( zZ}#AF!r!yJZJja+lia>d?y~n~xNb2Z{6(?x7)d`Q1EY4Z_u9g5C8CL^De;P~QQVD> zW!tmn_R7s2_a_8#ygt^!6a~KeEkBfhEcJIG)76*|6o4&j>1NOPGgGHxt%?%iK+PBk zN9}+!VSk@Idr#5F{mnnwxQ2^$Tv6h7pA0lVAeB~613v{4HT!SJBCwZjT@8Qa9Swh|}ym^U&1H^h~lG-_C@u`MXBCq*yjXT`8_&?aiJj*X4!E^IYrXJ`^+gZom zU&T3O?W5JE>^zND9H=}k+VeOfR4I&s)ey;8nEp!b@;LsQCsn7Nk|Si8>Q9<@qP&0= zF_*~6ShOmweE03_z^@F8g}-EF9~Mai+R9Xi;K>%aoixq()|<>YH<_$OTgN2Hi%l-h z4`nl{xDwH}xs6eguV)CbKHWMK_13AKIvs*S#c7D@O9f2?*gj^X2gt+N!=1_i#2lDH zbgo~UYr_QbYb6z|BCp<|gFc!3gJ-7VIT$0YY4D-4f8L2El+v5o&Q%>vXO9x8kExe{ z7sBr2n?bMULGlW?TW8~=-p{P3>=-Yq4_?PIEv*k*CDVIdoyu z000)5$ht(Na<3#^)Y21dfuoK9XWS$mwGf!k)y!l4nQIithrcACK3qcOzz|%5l{op$ zRvCuU*zsD&#fZ^ zd8)W!$s2MGz+onIERn=6QNUa~0YR0kNblA0&9;!5wy@L;`N_Dv!f=-Y;Bo}XAWjvg zU@KLD=Zk*H`pUo%CDKpz)3&X=)~w%+1n0=gC!4jdaX8D?BI6l6ARdmere}^~T5e?x zG{PQb<`2Os`EhGPR90@Dk_86+28KSj>;lw$=?MM|>0mFq&q+))=ud(fEZGhxlsGct zP1~_N*0=7qF# z$}#%=9*dJJ6;9g1mnGQup=xFy)|~8UF`9hKN`#*Sh}|YsUmqF~jO`I>Nj|L@pi~hr zWbg?Sx&AXZSuM=nliqshmP{9Ba=5KTCaYcaTy~QX0>lSn3FE&iT+hA<`gZtCN3NXj+mEcQG8V){3r z*Zig2a{kQ^W3iO70UIniv8IHX0HDG~Rvl8!t+#pKKmNGo{M`b)OmP%Q5i~VPZG}D`955 z+9p!oW#q*w-&p5y9Gcx%wDHJev_ayZ>AzL!kR^m}o!nIE^s3GofN;|}gfn12NF%kP zM6sk|T3v!-K`mVMiG$K9n57-?LGB9OI4qRzP+rQTFFa<5u+bv_r0JO6<<0|akAiy{ z@~4!R@cZ*CPb%}LS83%=)CjfcTV^C2P0~eCK7n6HEQ^x7K(qHt#ZN2AIf3w_Va_S4 z_%m+{|8F3tMk-=7ETv^1*nh5_NBXLgZ3Dc6pAD^%;uwvXBbRmkXbhTLQ(TNL1Io~S z)a4h1ji;K9Dtx;r zRGCK2RqR~;upxzjG1hBlZ%d5AMv+7EVOT1L?$-a~{jxj}EvqYQA=S`DlUIMl0(=GT z-njOf^n$U$-2d>vRKK(u{zp2YHxj5$-EE$6<<9~@DT{QlSmQ(B} zG6+KxkA-mn)V}@8NXq*EWpedK+$I&dGE~221v!)F^(pjdk}}T6h>3IQqLgHL4n`b< z4>m(y`tPrHGI!xO5$D~Sr~CAbibme|KSl(F7TnjoU|~K_ESkx#cbYts9?Ew#X|%}t zaU8cXf2_9rROhex*R_HSPij>2y>02`<2=V9e|6U-G3uyCXd`Lc*!w7d!||!gjL$8{FrZYK*WzFk(u&;3qs@Sw=~z4Po_xRF-9Gkv>N z6=Qpjr1Zi`7`pVbC)IDgT_TcNHI<1e6a6JQNh62pSwLe3vt39Bx*2%mY2pU43 zX?_9*HnfH~a7qFVKx$WfrdkIS1v^#|4kDUo^p16M_G_9+-r5WIMcUbGz%e&0nwQ`S zOQ-H2$>9ug%0fku#Op2TpovkU!CVrvn)fHzbSqX<>0W#cuZnC6lA4AG+;O%VE- zTd35@$-m=^F0JtRfl5?aJi9c6#?adnWS!$!~_0m5-bi+6Cuke>}^LZb_T< zE`fy%RuQUSxj5Wim=C-P%x^p|qYO)dmW|yg{l&~dfl$d&&M^R#mrte*UqV4pld%t1>v_QC@~}gYrv^MSS1%Bj0!1r=rXS-lNwy>e3%H z_^1%aM&3bfQzq*k?;y{2&Th;iZC1WT)aQEkazloUW)CeF^rKI)!qno4S2yE-^1V*I zM2EafJ!HO#jzHmb=dX0P^g8_)hl~*+R@aov@uAgR5T0J}fY9LFujkxl(61FZHH!I9 zX$hANQzZ@*>#Z!jx&4wM_?l8fJzp2n5_{P{JKI*v57Szzq~KH>lh(!g5DuB8zLF|n z)%eosr$O(qq0A_ty|O&ypW5yO3#*@~l%EnWQxz}dW~BNY&j>C=9WG>4Xve}uL+dXk z3KLP;>Sg}0PAuP@MjLlg8;FZ)%zYO%mRw4W=p=HYBy_LTk6+?oz=dh2mvI)Q3&W1q z*9*F2=@TF1GTDa0!)a{S6{J1#rwV*T7#|SxK84nPI#V?9zhr&?=-F}y+>-}|^}G`C zHwsH3V2yA^p7e`#|NGE8dBZ%l2^u8M`@t9X6?e<|x3tH*XBgj~?1vFQM(2*69*6Dd zT|=Mj?bzlBip-pT*1jmou6?vrs7u~2bJuK{jPN@?7mCym7+EDL z5oarr?ebifcJR%BZJRUZ_6uuY`A7JP?tU$ffcUP($mNBNBp>OYFrevC+1zALW}Onh zb>>TAf2CRp^p-wB6<0245_P_x6nmAn1AIhk6Z|d~Oe`~r<;O1(w=5Cc>Clp-#cCsy z(vz%l8_sF4cj~5^@v%UcJjd%l5jj^_i@>+11UmT|`G*@r^i9lFxCX$>@r)rNpAzc2 z7~e2Zfr}&fv9runGeJ!{Z9bqS0q0kGR$shhGN4hIpiy{=3&E;RuuMxF0}n67a~ygZ zI|)ngY{G1?lE;^t{X2?gfo}u1v%g%=(-Nl zuDqE!DR*8%L)mBNqo=N}G~Eo*e4|=!EilF(74>k0s}NCa(zEF;>~j|1-IIVOdX3A4 zNWaTyT=esfr0mRmOLbn&6e2P}DgS3?qLg0>XI2ZW#qCjUA5$SOWr=6){`^uEGZXMf zSu|5P^(}&fV$*y7V+WWMD5ft}2t9Z-`iMX@!$zjV(cbU}wB!>{I|ypNukJM^&WjiC z%sESN^d_zC2aKnj#6#YX4IS7DE07R%aev0iOTympX19AGxeX^RwcNc zQU3u(2`qmQTLlLrgrS9Q9gxiOneKw3)Wa|9XRcknOg~~%w4y?TvL4xZPowU^7!`h(SHD*^;oYWdX$whLRTkD^)eas9`n##)!+2LOfmPmLMYk%~R;FP)7V0V#T~r41TaU@=oT`*jMdJBGhec9RPl^Vy zoG(K6hgoyliB=aQdt4$-9v%9Ic0$0nv|0TppYoW#shH_%pXH|eaPG56lJab5NhGF~ z?&|_r!Nr%#n4tQ$_L^}n4Qr?#doG)xjZ>Y?5_30~s0JpAH`+rsn6%MQx@+q}-I}cw zo!9Baz$vD36CWZ^B-cCT%Y3o1xs7DR^TCMd(f!-+JvR?ydm1#$%JjIhaTfmR!0JE1 zj?dW{w~I`qj);#0Faem51_UztnN=Ir#mGuWXb#onk(seXEwHg%*pMO9zMxbCX#G{b zvJwjdUzSgLGL`u|m5?b!sxBout4fc{jFza(N{5?>!rO;NWO_LSS^7=nK<1RZKX$0n zg}tCGl-Td&9Pk@$_9-5h+z{^FPL_JxW!177>LWZpN<0&8+Y##{D3Fnd|M^lXXJujW&CzO*Ymzd&Y`Lp@QDk4Vs7emxU^f#ITlub}qYWB^w zkM}+VYW*5ND)NU(5TVS5Z(9@+V=IU5dyg!)%i+<618#XO2<$6iMt94fCC8SN-d*qiBrZ`W4_&N+l~xFk^n_6ujPIApQt=$NSZC8AA>r^z@PV}al)L{# z^gn>u`j8wCd0JCi7M10@=2r(=KUZn4BiKiW3p1@ZsrJVOX7Q>B; zUv9{MvR%8H?$rcX_3%r`T|CO+!`&TZi+#&Ga!Idr+N*8VO4P%DP*w!33{e?bMDO2*0Cp zw(){%N02i4ckVHh71+`ilOuywJK=B18#GE<_`9|$0<7MX<4omNq46iIAKi5zvFPcs zlbhl|Ao!0VI@?p>7atyGf1~I3wZe9L zQP+<$ie!+5kPz?9#IepTs@b&1#y*3ZUC&dS2bLq(vHx+N|J(oB-5dNl+ox+aX#AEt zAV6pL*OeF!+~<=)8rj#!&;Qk3x9h$AarhG1{vQB6|NIEs(!G0DfY9scC6e1d_0?Kw zbqL`mVK`Ifu+D0ImP2s45q!riB=m3M)7=yH)Ots~xWC1u5B-X%+YjRlxGS5+vm9*c zJn6|!X0>%5883>7(&@8X()44ukkLUM+~D|ea$B`pFo$S{Iw4~j4sl8kX^N&o7U4OY zczCFvdWvA%Cl%Z(vAsAb$(S0|3gS$Fwp zZfMUc4JSF*;Q&|`Mo<^#YY=MimP?ER^anXDBHOUA_(^vjOw*my@hi6ooA-Mm2$?cA z^DY{q%53l9PX3>6&-yUWLjzv5LkIuJ4!jlJ*>a2s^VIek_fL%D<)4fX*ypC58vIc8 zAK)|p<%?JA&nFDDpBl~k{0Er*@-pD1MejblU*t&N_pSb5sjW>PpX62`WXZ~!N8Nle z%G~JkUchGwE`8$ZyW=xpRC?zg!{F%WE8QSS*1Hz*iCA;R#JvM(P8aEd4au)=aX3K^IrEx%xA<95&M*Owh?6o zrEdJrc4o(*VsR*n^I*hS!+0nwwcwQPwGMv~^A&Y?gqj!eP*1|_U49+snM$3|+02x|u*b&iWy5Ne!&JU=l0E8(80KA-?~W|1J8@+9;b1$YD)41+Tnp~a9aM6ms!A7KtqQ6A&lF&payxRUo=7OH-nZ6t)CLJQW|5jC@ zaj5r)JT{mk%qy7Z!Nu!+w31KeXP+x`rgJf6#A;o^qT36V%&5e^6TprWKcXRHTXGkS z7g{wk;IFG5kCaJFun(^ujod8CN(>3H@*?|?4o#fxfMR-z8~!WCiaHy8W{c_Vi*SfU zAXllLp~+U7?^YK#WB*{axn~aAwu32gQy6rYpe1+_qnC zWSTbyJ4Fzai6BBz{+CYPnh^JI8_NMk(t9ueeLLM;SPsS{_UJm_gY;2dHrQ8h%C#c= zIIehy@p0axwR}elsnJXiM;7J*OHD?)j&=HfXD#{}EiF4uD~C`XKWNYW@cJ!(^mNRU>u_3`Pk+?J z#qD{cpX)L-pM|S39D&b{AR_iFIATxH&l7**^$=~-rcOryBNXJAXZ-4NI=MynwFWAG zO@6=BuTm+k$g=3c4LpS=nXeJXuE~&Q4nM_kg;xX~+xaurNOh4Za01wBX!2ed4h2^N zY+54CM=!<{eu=4MuyH9I*5)s1WKbxA(&4VgDcW%k{4sL|OgMbhSn^0i{2K2lht2lG zp(p9}THmbfE0>j1jEv!kJ%CfC$Y9d9^pYa#)8QQKZ7A|m`#Ge{5 zmX0(utiQ;q9EqJ<#E$_I!1R9;sfW?_5JJ$rB668Y+Lc2Z2);_LOhU^t{F2AMYm-sp zKGMvwGc5fv>Wod;2+MY9Jp-ev5yxUdB~HwKSW)ruk2ssPvT#1vcnq9l*I1=Yu}k!K z(Z2=EBk{oi&n}4w!jlxjGQfEr&UxBCvXVO2FxcR9Aj}WZ5wnEov)gwnh#L8zA&P<{ z3h^=UFawjkqNmi4N5MgOr-t)&lCzSrxsp6%EW4$x<|^#k80nXqgQHsM&i%$T(b{Dk zWQiB?V}kGEdg#>pNVRFE1+;JrXehNZ6GrNP8;{wll$1Z!G&Hc_fw&(TaiPjyNKPkZ zQ@!O{s<2?BB9O(Wgs~wvYHs*IL)hD?CKl|;Cq7tkIzlu*4#!n%l9L%h9# z9$llhulh#$O2V2OCu$fxUHi6Cc?wuXFK4vVh!>`6JOzcf;3~VWr3c}~!2AeC42P4; zKJ$9g=)J~Ijw0a|VBlvGei8+%3DM?+Kaba+OTHIE>oZ&DcA+?sV7drYS4%=dHCI@!p4mldz* zo7%Q@v#?9C0-vrw{VUa-on;aLU=>%%lV6f|PENF?Vg^hmTn@1b*C z-mrS=r?GQSN3iKBcu#i6E|&Td;xDKX3bewML&ZJNq6C7PxN1ZMcxVN>PW7EyiF&GO zOhW1uBM_Mpd8A_VzEqXZNQR_h_H2G(KVakZd-%Z_)9{;l3J^5OYG06Sv=23NyLIyj9_D9YwJD} z8LCn1_^;-az;qzxJts0wABq~cCRV0=bd*U2MVkFffX6kp;H(N#>A?d_6yd5{3Ck7T zbONoAQMshb^k7m6j;Li-3u;H=yk4&5Mn(NadiQ7bTMx~>8^4BU_g^lZ9)T|R1Q^Y9 zn3eB(n!>}V-H=`X_$;q8r$3t`xFT{?CK3g)RSV)MFZuTgi^-)8)TR~LC)56X#3?iX zG?|g=7DS%iMYof8P+i_}y_fA7m?2nhHTD^l14b+aTreA#4Xj+Tl2 zPG-P827FVYOE%nn5-e1_{X#^y8b$h2#9qaKyy(MZY8&s_5INQEq`qq(@gj3U_Dhsz6%n;5e?NRSKyPzfe)t zwuu5hexy!IsiEpFF>LCW8qP^XawOv-3%ij4E17 z@|fP*Loc129|e&=|LLox`S?G8#DUc(_r8I5+gn*PHyBrWMs4i8g$3V6*K(zSs{Bou z%-Vi?;Q}O>=fD)@aAH9{0e@Ms3orZ1C|7z^R?#NZN#LI4rbo)N@@$>HO#5C_Z78^5 zt6y$27LJ|-NQ`Drv2Zk5Gx;DMmh0aqwhL^LYdbPBQT+v-m4vJ;M!zf^bs*O|V5oEZ z_&Dh@5u%{=44)Q!i-^4b?)oayV@lDc=Du6%W6KMu)kgUNe4@5fO4iI*jkRF4(KCe` z9xo+k;?w48gNj$>8~ZB9lAZA36sIIp-_Wa*B6FNIn)Q(0uF}H*=x@j_m9E2&2d|GQ z(1?uJxVr%)v?6{a+H%kdCXoaA;W#N;lRx^V3|V< zZ%->cKUhU${gDWdLM}=A5bOnSUnV&bMfeEb_FOGO=Nn*=>qS+ag$+uT2{EiK5iBf+ zI?s^Qs{tc>7V;$U@iJfGFWWU{>+IHQJkueARHgiIqC}!26Cbq+Yv}9?3>By!<=|}< z;+M`Rx-atZB88;+LBykw1ZQBfqFn;v94OdD`VdOw#1PxV)&-RaR&(|Gk-m8A?3->l zO#(Wo$=_&Ny+g#^d%8E92u_DpFllPMA@X0ezjTBWDQ~ z#v3NgV2B>k}~H!^oYn3O!~-l zZB^bma7;|n!wttzy5SAi6tmqo<9N<>I;E$ksBZ+AuD1rZJ9w3njH<@R6diAfH~z9t z%*nO8bTm;Si{JrW08kkFTM{*=V2v;m5QbifG(*&gmBAX=ON~px0{m-KH`MHuukeTc z!EV2QzQ0>?5Zi7@_`u}%*(4&{tg-SLk!k&p!|$1?LeSn6N~u!IEBT00m#tiVUVY~vbL^F52TMTP!4e@nZid1~>;K+w1&^*y^?}~F3 zK5Wi7E@coI_i=Kt{;Jw}?6~#k_3ih+owNVuTYL5u3k-UveK%6un7$T)UwY1^(eq|t z>pSlE9%t@NW>+T>gN+ZXqkWqR{{}R$g2MOz)+6_4u ze!%Qh$2>K<|KaA{J(Y9%)K%xmB%GaU+bd+#^X=c%%1uf(K|1m4d z0VK8X%wDflq};o|+urMRm$D#((EL63EvM(yD@7CJmxt1SQU`;fULo%$+y^#Jg-`kT zHR;c`VyE6zN5$2?xg+#Metbv`{8F!d`PAlqV(_`s0_<+IF&t3{eiVyxv!b(o!@T)& zDTx;JWnM4v&&xa-SX2AG-(ATQDn!>>8a8Qn*{E1@dtZgVrXsl!h$*U=<@D24Q<*@6?i^*PNv{ z%5GcG+g(SNXp-T``a}4JWGa_-t*O9J)-Q$ag0^-EexQLVwk(=#5lsKbosmj~g^YKp z=^()?8Kgzod}V^KRO5RBs}Tbxmi%3eeo>p>>$COgD4huAawIlaWU76$tx_K5yV!eq zn#XkPDt}!ywd`K|M!S#|UrT`|-(`BzsbNbZSvj+aRG}qAO=SGm&Q7Cn{YgXi@u#RO zK9}`5m3pH}%gh|o*>;e5Yd|KA6iF$fGe9pMe=kFSrg15n*^I44`cRY6XL8$Pt8c+2^i4&UvRG}E z2d?V$yO_oz?f=@iT=p>S^b04ng|widoB|^p9RF7IGo?<=F_-;rJ``O8UgIWT??jWT zj{|If%oq9C^yG+cKMNMQ&*m?!I`f|i zzP@__SUj{q758jOK04k)zvRyN9rUkxuN%u9YVE)AbhhzAW39ReW~XmVZ>lJf0&YZf z;dTQ~Z)?9Qn$4-SbE~m+6q)yP?77!gWM=4(Z4+|(4@pR|P+@FPizGn2ii5hTjszVo zJT-O!qMDj`Gkci_$KDI&WIHOJZGQMvB$`Q#7^Q)qgueqfo%-0`zW75^f+v@bcDJrJ z*=Otx=993tVeo7yxv`qG*)vVqW@X}Vjl6%jPP;lYt9pN(GEb@vIa8%#m8US*Gn4OM z4YLw>avPt{+MrW291wN&tKjgnl79cV`tcK-nqRGZ|B~#pPaaP{OfhQA1Eoh^JNQka z$v^$tlg>-08X_L-;ag7g@M!nIbX8arf|kwRsQUCkLNqbm?!%#Z34>Br4V zC7IIh<@d}wM~kaL&EHk~W1fcmR68fDTBlQ(EX9bAj58lYl+|neEWAF*Pe&zOFwcc> zXq;x{q65A~ikB)Tx`aaQ_M;+rb~)2)i~^B^PG9~DLY8*CF}a?QY@fVaSOO z30^9#0eNfUjLrt+&`unEazB(;OPsTN?DVAIaO72NNSm)0`KE~30Xh%ZRGNsX9gl1ML=7d(^>bQla*c1z%KRm(lrE7crl&OY#dl8Dpz z@zKmet;vv3(|>?9;)0e1Z;zC3Dk;dAM-Dl90k#K&4{u~e|D4Xg#VR-gZfk6nlyd%3 zuxGvc4}kR^k4_!gqAP1)v)^T z`Il%K!XM-k*fy!(8SKv`F2dp#e#_q`MjpSExLEOZsJvDw=2Fy1pXZ8qNl{GAWZ+#s z#!5#raM@3%Odsi?ns3uXprj+bz;BgKlZYjHnk3p#W^I;Dwr~x(jQ##6$STSEVw(H| zeIYA2)}2DN){LjWsdRdIN*B5*sv|I0w~Wy3uQVE%ynf$wPj@zHxy*Q55tu|YUQcm! zrT9Xlu{~EZz$SO|H^o?it2Kvnm2&^>%@tg_|V^Wz(d(gTh;mE;Fs(Fdevf@s3kgNo?zbe^(@ZS_^^IlUTuyq^@a2z0&SN zy_~$w{{SnNy+;YD;iEVqV)v0r($`ngznbe_e)+?KA_3&KtuRikc_#paiL^*pTiqKY zN4?vQ;k|ZTD#vO9QXyejYQyGl&hCe%wY51X7by+7C?a$**;~_YTRp9rU$w3Lk5?0z zV!9E2)1-Psb(85|Hh(pC?PdP#z7ajz@-Ba*xflf#NvDjUV-A)MEGIv@xSIdb?kiC2 zp`Tk4eP)IEuJ7L6Raj!phEY+P>)j~CIj7nttPLV?GTku~(Zr0Eb1jjFhbx%yd`&ua z1Sc;H`WT>9xU^5{Ss+9)xz0ky%M`OZq7)QGS~vJb=9NrJ5jqxfk6Hf2C}i>}$k@w= z`bg&EGCx5tI1ZdU4|YUk)=ZS&R@?vRLrSzGKnXMnpK0X<4eFdU=K$1lmu#_Fcx@03 z5SmRT?+eY>)DHNFdJmQK{}@Y}o~>!7`||osm@%z-Su;4mYf^pIb1BD~_80f##*Zz0 z2~MxqnV>&yQ~MFGV`gDUydi%jQuiiCt8N|Lz^@z{xfznBx;W-9IF+QMeS{5zxK<2t zi1>4k1#L)CyjVgx#q<6;R#4?Z&=RJRLzH>UE)aCM4q`#Qgz)QL^c^;daPMH z+2{NO?IiNkh->U1`or<-cV3WB+M@rMea8OR3a% zu|X1=S|=$RqS~#Ahh=0Z@z$*pK66w&w{4I0)kXUy)Vu@as2)fyU6PLIM0D37K%Vmn zn!-12&YB_Kw;lAX?1yMrOK`90G2Q9efR)pBFJZKYBAamKa*j<_O){#GXH*Fia0eC| zMOLnVwO!VqGR3l?EWwFEOb$MqVC8h}c|5f17G70V1D?eUy_dpOKW15vA zoes63dj4=(a3vF9uNF#^&(EAL!m7-o?3ZKsCynkv!t5DeOf)-<>w$b z-Eph7-eb+z!hO_jlQrl1>Cz60pqS;?NbUrs$>@F@MW^LNO@<2Xa!$OjPkg5+2i+wz zB|szaGb6&pvW}U3rKvOn?N9;t*eo0o`}h|?V@$9I@k9(~EZRXA7Ee0lj+&yHF;$ls zPA5mOPEL-qQO67BgS!m*$IXwp2jK2y3F)^M{3KAIJaQrWnvzRLh6eAqZaaP#Va6rJ zm^P#zui{+EO%1IB*)@s>B`sLf36x%op6JzbR(JLRokW85NmBAI|A1n$(sjhpgZO>1 zW$xMj92X9S_$3>*#f*ih6_PBj$t-^Nxk|1@<=p(aisSJ-9kDEaM>K7tfgEGm;AszS_C!0BsT${4EVumiyP_d8V{%(^%_jZ+1l z+{fFbO+m_N>_O0R%&=MtmL_n|nKq2RR+nJpBH}!HQfSFrh^Z5Q=7p>{7qsieMhVjq z8E%p3mhe|3XHeWW$|WZre#>6Lnx-Y3Dhp^@wk9dsJf(Hvc`XiqzVokQOdNl{9&V-@ z+B&)tV&VhMCFI#RkryzhfZXXJY6SI_VfNI}UBj3Z=d$my`#*KXwLFv;1s`h(#8gs^ zTT?)sl!Z6~XIOb*`&78Qt%m}oa-;?dsT6Q03nvo~oJCOru8J5)B`JrY>LWsamXw7+ zwGSRzbt#OWU<=Y7bFLb-6&azzDDx|8`Wf!J$l^7zSQzVpxxFLr0N6!~yCiHkrY!@wA;$vnJd znpD9#3Q+>MA=NT60_%8$a2%&H^wjxjg$nwMfr&s@TBhWXNz8d-9m3 z3bS(AKvGy)vy|mE-Z`u%mRqJ7s6LwG3UBS>cCGcX^7kSf03Oum5B9p|Nt@KyqNc+w zw%=en3mJk8>FYx$^lC-$z9NM*}Lyj2M6O7nSJrAmFEuIU}!Z&qf z$0~Iy-;RP&fr^S}CIkC_B8$(r#F-2H3yJLlQIrzt@(rE?7Q^)yMKp!};ZBp&8qhs1 z>#T;{4r`Lky`9(gSLz>RMfIRssLPU@(hVv>*b16_k84yimM=!cghLY(O=OViFZL5o zA0?gfJjs5UDvw+f@uVh3eS`+qS5k>EfG`Zw{hh;r^jW?l)(Bl^S@=!U2mAo&T$G=# ziU|!_9-|hEV1bvACGy)M6N+SSOn#WEpZz)J>9^GX080D%2f;W05(>ZLJkkaI$_|k& zKeLrh{}a^oV0Rt(uU1+FtBP>ldAsL-{e|z1)TYmaudZq1mo(%fmZBd*Z8v;h|9w0e zG<_<0)wv3{e#`A+-8=@&?!qCd6}3q;X5E{QjkT5_vWt5aa<_xAM{&^(#! z!g=BE|0{h=W2Pg}eWhUPbFV~0L14VeV+E5HN3cwzEAEw6QfUyh$H{8cA|{NhlXBz|1MnQolxzy6yfGV|qId^Q9FP6Q}{?! zK59j*yIV2rppqbBf~|Gl>6SH8McA0SsI|NJ{_=#5EwNt`Cm!0RNozdI)ZYUPmQ2Jm zih0UdpAlY)Sfygvf9;@1WK7a4pehO*lQ~x{ODBA|xjda6XI$-scUr>cncJd(DYK!i z+&nUxDv8>?5P``+H4dkP+IpY|zl_z^MysbUV$FNIHjzJANNOhjV>hyjAnEwH!*rl7^73Vh0%yg zJDLRz3P^28H;4iv9TG#*8xfFJ5ES!%_IsY^|GloWb9P;4=lY({_x+CKA@R!D8~SOR zF2vRQ3nJCW^Xk7$>KF1kFY|V=FFktdfj%uWw%y)~%&-ij$x!KLvnVS!0&o`t43E^|KHru% z$*49(i(+naUdmEqsIya!MD~ICfwcS_e0{?tU3v>C8{9?CC$0YAQ^Oe>zP!}w9ek`p z$a{m8_NasN8*|iOg$w>V_Z6;O<~346)4*P2Dbg??Q3(-nH_^#OD{5ft869`zGA- zkCB-g%uFS`6H;G1R3nLrh|(F*MYFaH;FPx|k_eZmkV2CXrp%_#-dBl++zJu@WP zB~kpPm$h<%Xs|h)wR)4Av|C2fGe)7@36iTa)l^}vK>3v?`Ze0KzXtBFoEcc^c$-V4 zLlhw4*dh$+HSX<+)@Aqiv$G!cXML|k7F4q7uZ?M`Jv0^WAC`-E*yrQQq&0B^%Fv1o zVW#@GAIvO-yEeAAsC;KbXA-HB@*EizJDMH42VGn9>QIk5|DL{@{CpaGc3VFEqA28G zeeyTQ%!~!?Y@E)cy9BofkNQshzo`EXiT`K&;?~Dg%g^G zJIfXT%NvcCsqc{CfX>h^pXJWDTFJ}7G6PbGd=e_8lE@7%(T;b|UrgWh44JHusmv2e z82wglagfDXjAP)1n~->Xl!L?@&(zumWWQy>0&`r#8{n`l z&jn%mi6K#e)@dC5o%n3BaJ@l#H$pm(2tEq?#2i?j$-y!L;;R)odOS4uA=`6zy1weG ziAQtizjQWnt^bD5;Cj15ezuaRh`{i_i^zAV9;#QFM;E!)z9JaTv(v#25n#wHOU}Y~DR{XbT7`(e*+ykZ7eu zEscArE0St>$jfRycO*5koASrzsaMa_mA+_>&K*!7J_Ugs&vbqylxO?TA1>jRevR^# zzuy=3v3X7Ydbi|PyXi$H5Tkn6MgQbD)u!~!pS~ym{oMO?!|@aUXpo#~^7Oa1rcJhzyEz3`t^-)n>>MR?$Lea;k-dowV-1j+r?A54D7#BvdOL?4 z(3DELBj|QuO>RbZ`QGJklPQ_QZX=nrn^uo`=?|>s>Y@H!y~P5s@^iS+f`Hoez5+pA zp+I{7Zdjn`hAy5|&VDc;s$Hjq5my!aDfSU%-2nPlr(XL>!&_l`>v!&W)^3g-EyxZ8}>I*4##O0B2I z9GQD%D3tnk6MZtKKPeWHW6B0{@AE~DpXbpB7Ff1R zH&;1rnH#H*&Jl!M_7R~hJovTh4}`SIBEbEi#f%Up-!8id(cS?@-AYyos>p`xv(PMi zrcVO5c`~-=i6=?C&E`&BJX1uAsD^(xXRIckJcd0fAd`Id@!x@oH_wxu&?m2}-5wj0 zKJahwgqq8Xws4pnF&4D@1cGDf!u!jcr_^`NBA#Pozk%KxSq6wPOnIBaF>e^!e=bKV z!b+#obY~tn=^bOm)Oz&~j_pp20(Dl3JA7*VKfB?h1K2z3edXNx8Xl`1T6Cyh6WIqM zy_5|&y{?b!n{K`yP%pqwB^l_mit~0j~Al3sKBAd5E5wPf$!4#D; z&W6H6>1nBISrP_Ng0UN|Ir}GvOL24gmdOjk55B)Lr3&!<>WgT;{(*J=3TX#w^N@WJ zZ>|`hD7V+*Iwi30b19PMYNb*2tHp*ukO)*|^=_FGpfhi+rS1;gM2j^~D^ zAFU|odVGskatr%<%KKlQ-m1xL?4l=a&vPEOncKW8m`ura?f4_(^LU;&ALyV315 zQ|CP|3ZK8URbc+vJjUSuWs1k&R6EZwTFkPr#)I~bIDg3;=$Ah(xCi=&N^p9y(?@xn zlHxW4(?>$?=$ZQfZwW+L=IBBmZ~pv%L!5>7(ZXlLe54f@Y>&-!a`jc18C$h{Een(< zpYNAVI%DJNr!(r=XVNg7+<+r!stK8-!4u*PsxZ7!=cGQ-ga|4B8hZ9#zs_f<0N+u^ zX?$(q+}k|}LMCb>2iS;iNjbF#2#sCO@SDlGGldO*SV>PF&A{I$w0w_IINAAn$-Gx{ zht9J=t>)8m&Pp`V4T~E46w&j3JjVCr8JJBvfSK=YF5}4nSQycWtC#(*p6>xD^D)8O;LTK1$%l3z=X(K1IQ9Qx{7OL0FOq*wWL~H5^-vCqhPtD!W@79gS zxOzl&l;aiee}I}-iaj9_RSEMhmp>nYZ!{Ju{|7kya_7%z@R8!TfWyy!;>!iCHvi3@ zVZetZ!^%Chr`~UP?7e%|CKuFi*}Ex{ct%()J+vHN*m&Q0O9y={$->VmWA)`wCc6GW zKwBEm)~IQ|odikU8aIl)6q8{8xInG2&fXgev|v#yfNa-o<*3=X`0$^ef%F8XM+dHC zQHJl_y`U{qpBm+jbp_gtB*ZlA1~HG{6-$koYVv~9Zwh#YxRkN+C%6&3;b?66Z(HsD z#Uj!3%9E07=KXMiXUn$IbkHDj`l>@cgJb8@SMy-*+W0R%Ie$jIB|j8 zx}2Jo?%0Q;Q25X0D9s7%oh~RFQ96T(#W0M`OR7+0H5(3dop^IiO+aOVm)a_zf}yq4GGowB#1(jD8wj^0mN=6ap%-` z%V6V({CCQf#BNRft@2Z|k731`9fgJ+`in2ebc#N^Xtr)2|AXl;YJNG^)EO!$n6-%G zQ^#bz`(xMDks^$5@kYk**7GIbV#^JXoW0SXx#e8ZVS#PA!&*~gON7K1$=o*hD1aYO zfoH8YYz{Qbqu?Kv$-NA(!TnAk6G)2>6F@g;v1`Ep{>LDTe)Vb$c1=&u#?-?|yHo31lrOZn-4Bl5VPZ2bw0 zyne|x9YZG@bre$PAsJ=#v{To-V8i&H0h~YUJ1_XF6dF}$eoeI89K!qfLdP6FqK^%H zw2^|mp~-GA5R0p=8|>SHei13ZsQ5`5Fld2RafbGaK}eJz!rAe6K*l6 z9-3;4Lt9)VAYi<@d{K3ZEkU$2V9<><;pbKf9s|=;R*a|3^3M{#sgZ$x6_PPC*$`<^r*XJj@5jF7H(SQemyz;cg?=L`^4ZT zYPE+&1A6ZWpDNF9Z<+@4DZSAC>|FP7={@oM^T$r?SsosK`c5fYN!!PTul?%R4aL!v z4%7#HMu}+F4nf_o9SxDiju=ixTRa{F{D>+PmSAbUe)~+TG)PVx z*~eO-#ldLc;HlG4k42L=spnHiEb75xmQ3pW0hn!4(9MSUo&7gTfz&5(KQ?;_BN zb&|j}s`NVmW9(CF`8gG^ceo|DIMqYWI+F(WgcZ*WI~Zl=srEzX)&_z`DMB>wFUH6R z;GRaGj)@^lM*lJAMn|Sdehim4RiUa?j1B*Gm)H8)^$+TB!|9`3bAZa_QDa8)rF{=6OMEM=u_1KlKy%Oos}e6W4)Qu` zZxFLt7J%BSPIe*LgFr8)eQVbWiAi|0h_MlH>>%apQ%H@J!^&+>f;z$+Zg(6J6CQ0J zdIwoU@=#*Ifm&_E2g7_cJGW-ZuM9PJthw{Z!7mihow+6Mb|Smg=&$G|C?QlTvC7g~U{b30{dMR5E)^Gh96noftS54?GzLg@^pVf6cbZ=5$fuh4K zh&bv!DP3`ByAzQL*^94fZV*QO$cq=eiFA=tQBvcw?c+YGEUk4aP?&jOt!A+=9nFih zRu-SJdOn7wp7QL^b0%8iv5cs~;@DiFcv~IiAX~ASdVJ<%Uw>laJGot}jhjeI)bRNT z!Gg5`Jm=)MqbXyVNkY&O6eM76mqy1$z==X(EA1Lx@%J_-<0MX(mtOBvSEKY@%DW~q z*s~ln3#{Ze%i=P?SQ3X@%}dXsyO(-pIPzBnJz$UDI~+aI#BYS%v0Y_BB_O9|iL~|- z)&$j668nvszn(a3zi45-isp6h!(B=ER0G)D=!KDlFKa_&sCj|RYLwvz>6_^MIwN}j z?7fD^+Ceha2JD>p7ZMkS-dDx}u7%J`lC%%8Qf+=;g3642&O|vwNG!0hDTa z5VM!MiGH$TE!jl``iY<4xKwwlrnJG_h=A7OiTODZ%e2q(xOf&7_9g@Kml52+B&Xf$ zCzoXk9G($3IgZSY7TC?*A#g(?f3q7tFkE_$npl&k%_(-Q;j5{KllscLeMmkbnqAq3 zDoB)J$duEIOry8w}HxzGqBevpzg>EGvep#P1r4=xn8_C&;9 zH!w=15EX2m5bRY?HZ!}dSo_E`)a%HtFJa>3HBr_jZ!~w9MC*5(Lm>iAzV0GFu{-w{ zvHjJ5%$Seg=ngNiyA*M{;RhJ3=|Xoa%HIl+BrO{fuOvpl6R`bae;mVaALJio@iNps zdtaVG;%#<^nD~MXrKB~_g(w@zlZS?3;uCb~CXz$>*~Am@|7t@&@ZD2KS-`@K*j#g5 zm?R!uUi+1srNf*=DItE&Ra-!xj0$(rww8mFr8BDHLO6?Cm-fJ`8eWFK-DJn)jnSZ#0=Q2@m*u} z0wjivT59|*gQO8>z8N>s&E3{ z67T;$1`5k~o`=&!Eyy&w$jmj*|hve>+~wvnsDIQ{QTy^gZpDV6}qza6xdDId#eMAi=D5(?WyDyyg|f2|@8!cvQB>-vPC=&R zlryP;D(m!=#_h~l8Qia6>?69x;+YKY`4n%A&6KxO`-W8|?ZAA0x}MsHd#-8IOd4zF z(4jkOL8_tqn=ju_FJvnkocG>x0)gK1O^awg?{b6Z{3Lm@YEnlw<;Kz5Qr!{%E|@it zVH{)Wp*k+4V`k%2W*%&bsA@uSUnjYt*BpPk)-JU^o|5Fvlp4`D(*5KYKUEUCmoAM1O8 ziQ`J&@L^=Dv|{%G5A@xrH#j z^=^?M`(gehW3!<9gB_PAXUzs$dT@__tYlneW`nw?(?hyuVg{UfgI&sJ6onDl*{ek~ zMzMEii4k)-0cZ`hI^nbyzmAe3Aa*P5MvOgDLkA~+WvQ7pratCQ*M1Jn&U=ispzx` z#3eIxWzn|DVR#lp)A_B5tE8Kp$Z1N|dT=^;OzTW2DYJ)q=*6}Y6f?(`J35?KIorGkHq8YP?DRs=QSG%a;~zY>CFeb1xh~ zbGOr%`OxuI|6q@xsFK|1k*80|ZTWMd!f12v_eC96US9lwKtp+soE7>{qt-{}+b-UL z4Bk^ottHthydncvpwV)+P4mk)ee;u+k}tI5@eQi&_i(pgSBvD2zAOmw7!yKgUt(i- zlGk-MZrI+7n2yU+=G~EKhj46^P-q?1r^~tDkYzf{0!1D#tmpg^T4YXGP}0)$v|EzW zuuFF;$&gf&voYvUeI0akI`?rIE&7|*wsLz~VeHst1qOVeYELVTtx6$*`6J;BILoHN zb6Jt23Nt43bMFWaCXE4HO5uFjJbbY>hIBbZGmR@C%GN*1;&L zB=b#QqkJi8O-x7B3{2~NDXT4R+=U$_sla+PnjQYMi7#eUHtsF`CdL!gemr%6WN_p% zR-#!p)kUd?0ZmGJ>il%j`wtF>rFRcee}e}1s@=PKLyi??W;_Hxi28Jx_ed^Z$itaq zTHwEDrynDC&&;HNKbp7^DrA~Pn}>F1_J%O~{Br6nK8?jzD~@P=XK$oAD>yGvdi%eUFVps3s?Sb}m+ z>AO9YEPJVb2^98~SB(2D$6eyh|8}nb2dE3{tN&-eeA`*@cz?UyEK#{P9B}hi?Qmq^ z`5~Ou^}X%q$>~J@*>lf+j>#~J$n>`xVVpSN+{e|r8Cgd^_p*zPg#JCW^DDufOEuFm zawke@BKTd5m%Eg~v*GatlS%*FI6-iZ(ZydT3pt#9B0G&Kke&-Hz;gpEi#fk(diB>V zo>6zFnm^NYKq*%`gNKf*jMK{tZKS2r1Nhbs1V7mw%H^b&6dkbyphkqv+GVG~bcSBR zy4i*PSaf4O6((Pi|4LqVm}mFs!gXG8{qt=%KTqeJ?hH0Kq(`NpgQr)|VN1O=Dt1HG z*|I$snFzw@nR#@Yeu|?r3u`vpRuZtp7_hGumIzyJ5~>4+4HVrN%&gq^Q>p#xxwdKP zF#u)YZ`>uMxD~ai2S9q_)Pk2Zp-x@ARP?ygvb(&su-KhI_ zeXw-P{fZpJ+q*y);kO43$HC52GcH6-x6&90s3~e%W;FgfFf!rx(L36E^87ybx+L&& zZ>bH}&y31Xynt-YI*bZ+QWINgM$QHWTvscqZU&c%)NACT-|AYcm{Hv16=yS$v=k$! zyzsZUoZbet*a!Ti56*R2~>|@ zqM9I=X^l@~7^l3A-R+Detokj+Y`t4RRc1WNNJ19$%&P9SAWAifk3Lg!=5YQy7e!!U z0yf3CCQ&WImRe3gev^w%RbOGOQqAC#R}9fO`VoqUMjNYYB-C(Nr6j4%4=9cQXjK>0S$fikLtcJs?`Tl%(pN2Sx2OEW)#Yz&fJ!VE&?d_ICapa)ho4|#62H_j- zFPVn!|dTxBI}bHKJZ{f;x?~lN;2LbUxkCDn2qy5 zIgz@1#W@{atkmjym9`zY+gYJTx}0ZDR_gy!4gy(>RIC>2J@>q=63ZFQ}lrK zno97a@oGGw!Ustgy1V*#i=I?1TiW>5tp5OTMPA9~M+enom%F19DC3&8spj^XGAEX{ zB#N5*2AliQ{CtCrPh>O$iI-yYXT}kniKuI^FQK&iRKV=tdIGn%bBSse27S@DLumIX zR2bu>@KcaBe#0Fnc}x{*$`22($ zhOR(zz6z`>a3s~U^Oa;&EUVo6U>+Z(*D|JLWc(EjmBXI5csuab=os0_ zY!EFn&ez)4y4(y6D0d|9NMHHdgn*JYqpL&`m{t1tMwGc97QNA}*0Tr@9-TP@LOm0- zd`53D5-m?TewUsaKoWcSTA8=x>KN~di;d_F(n=4RAp~OwUq@`*95aPZG#05>t5x`< z@Kwe!?vowCfpMm^5u@6TVrm;S7I*6w@c#i2FVFI^(hf_V?bPx|m3*(9{9*6nuLgi* z{R7dU?kU!iJ>TBfuSetNn1tySB~i)1J#JPK(xro;LMGAm5=>WjZsjbAi<4XTO~@~dm}|{L#Z!< z1RQ>$Itf;&OZulymmQMJPY|TlFud9>XWuM1G~1-4IEGUVc=`2o1={qU`R`N&ex9t5 z|Awyk$~Yq0KcFlVUka-bZc!iblynZ5BF*eGWDFB(a%G?V)Imia|4TB^eAlytmlDL@ zZwE~oZDN0$Z_s}Vbk6B5ts+(?cCm^EczU}H% zc`I|BUe?V(L;yufHDBDoLAsd1@_vGN4P#wuXj)NQSZTiOLS~e4Oq_vHqb~;lGEXB} zkrog*x&Rg+_n2pf(39B3C?0Y6SpwfvzmIdlP}a)IWw}$(tFeORAtOql+kylOL;t&p z`Pz=j#e8Dg@|l{;CT%VrQxCsX)ABc%)=hB`W_EFgILpTHC6zF~?QypFxzo}kvyu~@ z0gha?6Q|?d*D)0FlzV*`@KN5#)%>;GFa5y)@FZ%cR2N8{E@x|6>TgZ13U9N&&8Wof z9l=hA5F!|b{3(2 zH;+Nn0V>RpV|du;iq)+6x3>I(D51k7OURtT;8ngL z%2DiD;qZJ)`SQ#~;Vgc^FTWa3KOo+a!G~L%lx1sB6mi!DV_RiR91mxurNM$nQ|eXK zzRD3+4!<}9RAtnkZ_lW|)1dqS%ro4m=MNA<=hNPnTlrmb)}OkR&rBBC%uIrlMH zq}m`vG=o||wnZ{#yUkNMy~^Mrw{F^iw_b*-syIcd74osHF9h`Dg;lXB^EKrI0$Ymj zW5~xE8DB6da7Z9~+klb>bqnHFy)R}N2f@V_u!^He90XDksyM%k9C%y#}Fy-WAI ziQ-Va4%2)--u7MC2dE%WlD>Tl7caS6#yD%vag5<5Vi74wkV8y40a zbKFvdPW1O*@>RPps;@h`JLw>sIlUYjfD9?ydKTC_d3n;ydEDZKQ=}{J*Ob}y)Mr`@ zl-ul{DB0%6CE-uXJ6~8v!1W;!8Hu#UwW5>h2<7O9o#{73TVW_|#A3XI2FeZ^L4?lMb7HC{B#_dfv0_sZAhwvLtmG`lK<6|QQ^ z7WA#)%&2oS)Nj7~>!xExNfsnqZnl|UpAeVMmb`Z%9sP1?V0ex2&)}oC&CV}&%Pf}_ zL)EbZ?5Aw-nKmJiLD|vj7pH%TeR)6mba(bw;(FA1zx|3m4R+4RmZxWWbitX3;p2X& zUS$4S<>GfiTOD3#5p`9 z?y8mZ`R3~#ix>^D^3}s(-8=u_)P5Bt+7LlG99nh*n{FJezfZmC^3`?IX#;cjqI}PZNM4P z!1KG=s6Jahr$nrl7=ebktyF9qRg|t&Eta@cJm+100j2HVy*(PD3e*dmL>R|V!ad0F zQ4&nRlxN2jaNZJcne;S9CXt1PF5Zl_UO85Bti=8i!u83XA~xy^r4NVF%|O?W+)4k`g)aV9nuqGFoZDG zSL8@}rqzNEUq5Y9lXS8V9gmnEGtM*%VC=YyK`{c_;}O&d|GRhQLCqJIv4AvXht4T! zD*DA`6SMEKm%!g?qvvLY3nst`y-b*w{KFa(_dZa&@f?8lq(eHr)H}CF?Bq}8s@dD@ zY!8RF0>)yg<@snmz;%8_dLN|pU8WINqNpjq{^h3SEryHib_JxM2*@8NFX|&LXHE0w zzPV*CQ{N{nA7O|UXk_Lg1xP`ESyD|C4bT=}vDHZC1zAml({52GrE!9F9)>a=Szc2> z@y@nD>I1VRc+$}Sm#K9rIrJfulJ!bJDh#5NUehY1&vw0Z|09EVKm+0EnlMAL40;-tZ0|>K*UZLYHVh|?p<075A4plmXY~59gMoKDS)}4$ck_>2b+vyhVIfjkGUF=_mgi3|IdBK_%QS{s*#b5ZT8`v zq>`sp{Gd8xi`aInK93m|n+{Xp#PD%sWY|bUNbhq!;@+xjH?3} zngP_zL_F784Cp5mg}}hCHA4Cd$*s!1r%het2jZ;{btjQSy)82gGYv2M*LD{N7o@3q_zK&|`{gP;~s38d#|qPOR* zu9lL3zI}zV-qT(~KxPMC)2ePiK@NIPcrrEqUgvzO8P)jxfrW;Mh}c^e4ho(x!xuZfAs_5tdB<~obvO0Pdzu>~ zh2J%G4Wi!(b;;ryA5@o&{3aC;iqJs^3BdC&m;)}JpR6sk5FNGJZ-`yXJI?hA(hD0< zYZc)=s_=zIn>{)v<17LdDJf^j@-$4Ce0`d*{}0faqCyn)uOgn4YP^Ij zaxH1Q%*SHz#_v+Gv#n=s2p>hyskz+*F0Y>{G^pAsgO=| zp1ez3EoZc}dKEq6M{iaYNue~-DX!b;=q(+?2k=@+HA5t2XT8lv2H z*`JY)mlAP zH0jNkNh&*V%CZeLfQ}$J9SkZHxl4TzpKcpU?^fHp({V*9#0fAIGI6w}5@eGrOO8_M zn4(e5#1d}|8YyE%qMN1j$Hqkr+rugSbuj0zcceN z>-G}hF0|qd-mr?g{uO}y6<>ZA2mmQ*%Gc~23l;HkGCdOl6T-9f^u!fM;x{x!Pj--hXYCvOLVQ72Ly8WRm#WQ4tBlbWPe=~&E`346_k9=W zu{tp{gZ`(uFOch*81>_y z!15F4XtMvh%}=h3r@Z%PQeT@aZ|yz1L6#lg7`CN1+*67n+UqnF4Q-4wSVjHpBrfkt zmhMl)&7T4lMC@=ypAm(5jk`xwfMoG*vLg!&Ho%o^8ZvNCX)K9*_klM7L)7meHp-Q} zOKwb3Se2lPNf3zsrr@qEZ-OL}r~p5DXyk_u9b;*&3i{xiui>B!Mo+>m{tZ@2e3Wy~ zSaVsd%G17#{s&58;)Ji;m|Ck>#tO6`64eiW4Me#-Jv3JTYjl)kio3YFH;xW>#C1Ef zaZ(4HVui*r#1Nq0k`~aukT4Y@14g4tvM`hOjgzors&n~M$LI0Na298YU(jOSYXiA< zc$)$BwlH(|>cfipBG%+&P!&bZltY+>vVUWu>Y@+fgXhz#8&$*G(DgLXEnY3y1k9F) znF&9MF9p$B2eB#zZs7Pg@afd|Nh@p0YeT>4T_<^-l}0yqh_wI$_!-X~d!<)5dVqk~ zv7|4)O`PJP24ZfNY7>&9t3$9444PplIyOD@b1ia-$(rFZpqGonj@A0|AHbm$DT1hC zr5A3-)rOC~!r)NLu4jRV+hX_cla}Yb)HWa}Bc31{7Le&>>cwQR2P^-11AVfybYhIc zHT5=Uu=fOzs#4|^Xt7sC0B9U5odW%$uFR66E{#3Te-M~Xos6clc^2xmsO8b}_RU{? zPW?Bq!jkxMF+SyCIJNpxP}aG@uG~AT(6|~JKK##JPAl*nL=4oX>5*GS1(;cuq8Cxm zG1M>*pr%0?kjml{d~zu3T768ut1t}qmaqjM^3jg3;sperp~4c2lce_M1~b~s3jZE2 zdxl^{^u6AusjWp$_L*Z210V#Y~cC0FehW@ z=&sr9#4O)5%mn2s@9sscULm8sxXwV?w@{aKYi3nVNzAdcGwvzkmuVbcUSQnn+LQi` zMO(d|)Qp4&=hv;K@wu~Io};R3zb|jLOFH7kQX?BLc)Dz4()) z8ZNHB*J1eS;$cneKpY=ql=eU`)CL$HLe*j|=N+(a$E|8NG2JsEMh&6I{^ALl@^HDL z38b{jh!*sQi+w<=Wsu2(K7PZ|)x*1xNm!XITVHVg+!k}0>ZOVxlsAUI8s=KLb$p9j z;F<0i(tLM5HmFbiNj~Ita?Ebdol|A>i`m}TU74Yz$BsgF(QEXFq?V3UmX0HafQ;Pa zH^cQ@vm->`snlsxoGq8MCJ6me(pk*z+-*K4(o{2UE%WZ zn+HTjyF?g$pvrwKhRK#dFVyofn$B~0)|t2;EyHU#fpYt%LZC;dkT^rWYp%XXuoyi? zh=UTl+VP7WnN#w}l;cb0x5fdnJZwM$(%PXy2-P4g#pTiU1vb3sIQGBH&G_J2rq^==l$D z0@m9Ejd@avPPZ4U=0AgkhU2WE&tSfn=C|O{@Rw8Myt#%b4AAmI>X}u>7gE7B6TQ+IWW}0ns=(J(8rMcVIYM2rg0fG9Wa%LQ^Mp4OAMLRnT#WQ}goLIix?z_`+W zM&vZcXLZ!AP`{Ftw2puwyZzf|AscfVERC=K@J*q?}x3_WYo5c z8*KS6a@R^_Nt}HiYer@))V$lwkfFcJ!Q`E*d%0HeNRk%4TeA#gN<2_7(GyH{Cgttd z(PI|!p2-%@I!SeDV`9cHA{0XI>eQjWd^F!bx-U?5DH3pkSo1@S%NCqRH3wW)N+oKU zp8vJQy%1JgSp8a-Q@ap-j$W3>Uexo<)L)3X)%k616!hKtO~x8>SHE1GIkYQ;w&kl( z!IT!ub74LFhnY{U>*P$Vhp$Bv${v6PfrX_hX}0nF|4ht6OtDIu(yBKpr8pJAxooAL z-ZI8h==0=KZ^vzCa{hqXKUTB@8kD{ce4M%K{#DgFZs0ugS!GuFL;$Bfcj^Gc^@-fucZqqdwo{4*CyZ3q$!7GAUat zvJn*KQPGY(FKMa-I3P4sHT^KUscoJ~%EZ5B#uUzHkh%D*59HShHI!b|hs>4D2HnPO ziv&4bR1#E63!Gx`CAty;WOemVq!*%))>GQs%d-x>vJvH)t#M`KPAWN<#3n>oDKmUFBw~w8%BCoR zq2;iE`TTIy(<<3~vOFGO`mhUJGkI^O)6{<3DS6sbM7&-EVMXOD%lVeWQ${ZR#M~Uv zk%(-^Ko^ot{o8g+hSw{I?WP0~ z24yb2ApJ`;ZV_O6V6e-TB?dqPK4ct8R|hkai&}C#VA^Eb<_M&Pp_FJt6!nRb9b;Hc zwFp#?Iqz`3%{5l^LdF5?i>4f6PUd?H`c^Y$`jji6)OOc$yZsiTaru8PG1nWJ>4GFI zsFVKxy1kIs5-3V6I#CRu=^39%L|G;xtl6o_Dle|zTkm&Q8;7Ks>-8q#%K)!Qg;w&D zXQj?Jk-7{tQ4hAnXUMUF<=iGP8#DCeLrs0u#WSgG?!GP0H57j>aQ?l{e79CywuuUy z?5H|S2Uu@3maYzc)B82tv=uI4Aq#Ayr6z?~EY$Z;ES<7T>Y1DXFJVPLRxU z`q91Sf|A%?DV(R9{eiEN-&?g~$-AK!3V53U7%`&9Jr zzRHu0V6U!ny&nIORT1>#8Vl(rxkl`-g@5TZB6o*k{x$33`G)P*3Wj~Y15JV~MhLugOWQlni9!9i zT~^=WG)_17Dk%PJ=QK-wPisSBN6f4$7~qC&&$#v2_+*ja&ri17C(_i!%nRtShl{K^ z<0i@Ir)`9-Z*_Zo2kCR(O;bVQB)ZtWQp``h8ci_-%VbB^6DVk*@MXR$Xg7pObO@R1 zR-w$Ax*P0WBg@k;RI_5%I9%_SaQa;*WcPRY#*{MT&5#1ghZj+~SQyZF|HgRvpM|Nu zR|@ItLa&U^w%S5@Zwubt`_Py%vD>E>yHZ>GLUxkmT>imo#Imi2-Lw?DV7 z@h&R+ygs32so~Df=8ok*=$zh8%HfqF3IkYr)kC{68zajfBVn5yAOKnNX+7q%@6N0k~TkaM6i=Y|)cB+i+0%`ieG94}DSKPh< zg+lwoB8+x3g0?rQah$`%xw-pUF=u*72T)-}8^bg<>Xvo^S-Y2$#oqLiQXB@{*addl z*KM0DPe1?R7jAC4@vHUM|@c$cg|P{w59Yviuu4nuulox%2706?9AUfjx&5>ON>#ExXi|6)YQvDIZ> znrP#D^5nLR#m&&uX<+Ipi*h>6#CLFa=XBk)*mn(|zT&<|PLunJS_C6KobFQ z{p_G&HAMbK&zU>EKJ2=fnf!Vlq~q8vS+6ZduZ>&#>1^t@B5@3WxlTmi(zbT?9ymh# z@&uPymvD0OQQ4^WNnk<86snS~%r$1xZ8eNWETdttWD!Hqx_pm${je-H)x{>$wDJv@ z%}G$qg5oU$FS}5!n|TMA_OCS8$hSH%z=3D57d1wiW3-8%d%Gr6I@wAKtm{v!6bI4{ zL-vYZFdFG0fO)CkML<<_B7-VIHp$NX>=exWs_1((e55T&WST#VNfndGDnd;mK7Slw ztR1dko6)v-gD;FoUFcv}OTU>^{0?B;O4fW?KV%^=6!jI9Y?3?$MCb|e(arPl&HT0 zlmqFdThA zOJun1&{)85CWBXK+}`yhyZj?G&61!TU9)L$k>`$km1IUzb^ht^f_V0)oAfl0wnUIL z_Gf;E*Ga&6AnSFEtV?S1bDN}e2E9oH|59-J2v;?%gx*T>@qzm1LaN)MwrfvbSyN_1 zWGwXGrLlsgCl@x(=o+c|@(6*Vovry_b%8R%mO%--fFYN107aUTT|2tp6_csQ5Vc*( z-I%YM@A|W#+KtH%%D$>?Cc-Exhx1mY#XlX?K^es|FmP!yJ`6DJlg!trZOH_bI!ypH zGBXF6Kb^@aP#Se}v^eRRj`B82O7nZGzV_&Bk#v@7XvI|Xf%!<%600JbzIduIYmhp2 z(-tJh-22J+*_TXNZ#$LWS;OpF$zN`RxtK*?ixOFf0+8pfF|Gf`@sf`9wSF6F;Z%jgdj0s!01kifiT!;L@*fLZgeW$ zAf2M5l8SVL2nqHRHnq#bW zN}kuF{uoWIT^U=gynjKSTF%weZda|e*@hnfjkvD%s;jT-)jixJ>WwuyL=PpHf25_< zz3&TVzWnuyzN5k~P0jEGhXqOEPrAQ_IaLphf(Y3<(Y$JR=c^Vi=o%$c_*6;}^7DV& z-Zq{Zzuq}(_+7Ot%vH=!s#}=6KXF@bcx+)qYvsdzBS&0O@!r=B{H0^rjqajd8b;lp z*_AigV=}|uF8Z(A{EeIVgoqqT$kDNo&mgrLdt z=X$t=u+ne5kSr>+d~BL7?Kt%zL_S!II!KU$w%wS^yd~I@?CBE+Md8N|Ur$kWM^kq; zvcuhcxvJaJH35%#&EEUE(7S@^X?B3|Y6WPQkZqiqgJQfSBvt0N;@uSjJ|gZJ2O$eREX(|Raqp~g(N3#wE| zA4h(%6d2IGP6VKftdRA!>2De0ksJ{B;4ThOgy#@C;?_!tpxspHR30r81)bkrI zKjXY$8_&UZiFC-G7|``@PfVU%GrACuCK;r*AVXPUe$OoUKoZtMcNqjtdP1K?a9Ndu zp$uiTTu>;wCq@$|8Ot=9*l&qcaybP#wgt`mI%_|BX5k;}se6e~`l^GX1};#NrLPpc z69TTAR#$xgL#65U`(9K%Obu2!=3#@tK~b&zAmSHolU2vRp$jG zNg*gUUKrwhc;oN@>kWxj&`Ja#D?QD$fJ!9EUZdLXq^!Rve|DML@g|WZt!F*iftI^M zK)V8rV_)z;p+*z0T-Ug^1?>|OLrU@`Yz#UdYJGQGnQ4@1Pycn@7aPigR~1~Ks6RGf zCbgyYJ%aJUJ<=kx*-|^vac|lY5x2h^xWZOiL!jt-8@?1nN4Vc(pV6Y{_@?!EMC{~; ztUhJQqe&B%){nT(*35%^w`<>*2HDx+pL9a*Do^NJe!R9>!HzBda#P5Txckfc2Bbms z{vk?}&f}|fTdb#kj?iph`FvWfA;hpiW$231g5)UiB_XYOG&g&ik?iRhUSWMtF^+S32Gnz=o^rZ0=}ot?BKi-m#C$ zcimA$9C&7z&z~%U@0u7XJ zr_RJCwUao7W_{P|>fyLQD1I;0T{`>Hs>MwfYKtdW{v5_-O`t6AKT4GMG^Z#^(HiKt z5;pmIg{nZTC0lB2*^XLLTo|G>=9iZ)s_;7+lgQ}6Hb={cU-2y#@YNsZXdiSTraHwx z-pML}HED~u@LF}+y6R?Z2rCZUV^Y#YRBBz5UNE3~PH1E06bUt-Yd7G2wkny2pp^7j ztYU;4R+}lTZ5YlAS7g}duR%udV%hRObj!Chlw%I)7|qeC9m}$O&+a z)L45|ksT=CiGe55YnM8KX2*TZT<~GZ=dILZ7h={6_>ABep{0SI2v35Be705Y8b1fn z$W|^ZTU6suTo2vMPOLKB8B*zDOvC-LBJN?8&+f#74(XqgA4Q^R@A+x-SA<^hpiVlk z#!Z9iZ+8%~gj5dXRSmqmW%le>hE?0GU7p|K5`xmc<4}=0zg1KSi4ulUVmX4QS+D)x z0Sy-s>Lqm5#x)gU%j~l?Xlxly{CjFY+2Hi=Gu~^^(an!K=DsTqZLZ4OKHAv3XTLk< z{`+x-^y}vPsQs_^czpYui|duB`a0d0PQb5KQz#N^2i*)6Ru=kjIID6IUml*dddHN- zoo{RU*5im0KoMa(#qV(2;jGX4l?PlZqHQkI+7W?X!moQ^k6%`)d$PnR{oBQK8+S46 zZhMzE6qKrd3MBE>?8}C70u_3r-X+r{T{|Nw<++OnHjT09E1C@IUc|a+5nL_M%@39E zRETJSy6rCR2_*P?UCwr0!@%+8#J|NqVO?d&!Be6Wwq`^F8##@cUF8ewCBRnOux4lH zc#80MCH&~s=6hz!`Q6ZI*}%1_1L`)%d}dqRE(hG%6vIE%%&}?`7Zy{te?Uy z79b+vQPzy+8c88IUO-97Y0Ye(!n%2UQDS!hpcq~oqiH{*$Pb~ohmTb-gTD|_ZiNm? z4RiXjN(qak8>~o@MD32rW#7*mKsrEu;>BgxEdQwusroLYRv+sl4;n(U1HDJV$Q0dVkZLhQ6nvk zZ+?p3n5p#_RzZEPAV_~0WJlW5_`%i|#5u=}NzbVOgYgt1PASts4_1;hRhf}QpPicF5C9N^5_2cU?5ypHVK|9-rXe(}usHyFE7epPgx z{Lj2~buV&SI;csjBUb4}@1HZg2R;8=Zb5)tiy+f|=~oK}%k``4Z3!2TbfwrETz~#L z2QkFbraA3$Ry`578rmIuVW**B^@Tu<2;i0cDbCEvT&ckX^X?XINb>u<1EYf2=x{bZ z0X+HG11edLN;lL6oF-Q!zM@PG$!8%irR}EG=92i)>9M=*Q@OOHAg3C?3Qytr!7^me z-v4m7#({%LXvs_>b@KBFOgnyciga^~^Tdjjc|XQVhq!>u;alIvowvd6ovKhe9xsY%|aPN?F|-ZM*%JRLhE@w<1zOAme^2+;3{c zdqqle$F;@jh&3>B-Jw-9V8k;yUY1a?{>`de_*61}xV<99nCXC*m+~)mS%}up%>zpHIN%r zu9(QkAUD?YnVfiC@VO|c*l`-ez-{*S@*J)YWwJzBY0G*vz7fI9ppa`sk?}8&3rZ(U zZF=V--Vyhr=m1j~Dsd_ukB&8XDmkEd5;-s0D9y+%jdJHgNY;+_WfCrEeS zRO8ynJ#HFZ9^8Lx;OOmN_Y{3AtM9{v$|c?*d%XF}o9HzfIU?wI!~&jG#L3Y8%mOWy zDGmG!&5CL4XXJ4MpGX?ImBIN=-K(Z`Za4%zaeZ|9+3Dp-SfA9V;&zI-Zm@kO(8-fB zc&F#p%9qxh*08m=E4H-TKRA1;F3#8P-3z{{kXIzYd%H>i-(l{?yCprIb9c-CcI1Q2 zJZbU@q@*d^fVK0Yjl^-H$*DATwmqsuQuM>m<4#T<)t;3~S&NoDjU7+gH6B}K?coY9 zg@(LK)b_S9Mg*pM3a~&uCDptW+~CVAgwDPXfy$rJSF`oToR~QYTgFq*02oOhzfLUB zZfo1!YVGRmf3$v&htv^E6MvK!H9*pb#ani~0Y6fG>%?uUymeIBvxd7_&|tic5%5bI zDwnn2&|c8bNt5b57z&qN*>r9Rvpq(={`>CMs_@}Y$i!+b-K8m|;>WpUEchyIy)CqB z6|Ww7(eLXH=fWat516v+6=QAcRaX#ej*gM69liZ_&hY&pF4?Ka784gmJhP;n;7gaR zF3vsdZ4(O-c9GbZz7C4iH%*Xw2nCiJtD{7N=BMy^YdVT*U|e~~ehb!CTJx8RM z@U_MjZs8iO((O_`S-3_rzJ$&5j;nB>u0fe23~4ebMKs+_3_j4TzfF+e`@Xj%H9UX* z(C)CDx*lUV>GJkV4coiQ};H(=!pJynyWP@hJm7??4Lsn@7jX zn|AOBgY22{HWA@P#L{C?P#{mc$rMo_`oYW zZBvLloW{g(75z4S%wFjb6)aIv!rd%G%N@-J9B=q~3B3Cspy}rApY9QVMV=IenWV+gaDbv=|bdq#2E%sel)VSCO{<1FRfV4>_85i0sDD z7wn}_#Dqv*d(~_5)kMIL`a?&3dp({h;a~Lw;m3M!gVQ%g zSLg^jDWU9a8`>A)SDZB5yB_?jzKiXH1%Ad!Be%ThtD{l z;~l&#yqSUUrFOtK8sK74It)YhY>*#Eo4OZQDsX=k_%Tg#(;w3bU?s7l$6oLL3s zhrr;g(p-}fw9<0o3uQ9GBWtQfqGACPzcI6-{o>l=I1VpEGfWowCJcE!WwMe~k9vILz*-lNM3JP%XJHLYLB51D^W zlpaKU>dat7H}~%-Qykf+v!7d+-&mb=9H^zhrJ-Sq6^bkMCWD zuWTMmvU*wchr`xc@>~HF8@Z%cZ&o&KX}YS%7G|%@K4{u46(?IpuRfXSPp-LTRHcnO zh-1R$7qb!{Fl%Bfwdzf0&I@^ps&V5gMgAK!k=;>$`>TmEm9231V5dGcwdWqa#WvM4 zqM6*vk+xRzKX?=PG(`>135O!U>Ny1Tg zSY|*r`5{T=#;^nTN9)_(7;(MLyjuok^;-1pnFl1hoG%7i=I(DQ<1{Rb zF4;o>9|jb#Bj^`rSDD%iRr6Op6#-o_IKEGx)PkEv@Kg4A(!vyiBe%8pt6?fPZBGIR zQsSvS3HXlkB-yfdwu?7I5wm8t>(^uUkY(I0x45DrvR%2G-%)g~8ok;rs*wv`t_!df zd(j;Klu8kF-t6FtdYv@E+8D1t2L+5eb7v^s2nBfy0q3(yJKX;OKZqL}q(CC@56FqA zMSQy4lo4rZQvSt5>+EbK@0pZDaf#wvWPf#q(RZDwtBR^vqn6;b$I-G%jfZj~EBB~+ zX9spRKOI-*m|BxU{2)!BZ>- zf(jd)nCRPI7YSW^y<9KD@Nr1VxGz4WNH%E{ry^@GP$qDCBgNNX05IL6yS^x%ZL&iC1B7^oDlpfmh^pey%gpiqa%j0zn$ z6GEuNYCg#;N}vqKn#p;f9U6_3ONMrWLD$YQYj)nu^w|DVJNaiccJB`EbQ2r)r~01n z?5obRu*^u;vCjION}1FT!kIo=%U%z+2R7 zm{XUxIk_UTLQJvZHrNlTWWA&TdeMwR)huz8jrp@3_k6{V#}i^%nyM4+yH(jH6#c{W z=O{Zd^2ssenvn59_IH zTehz5<^}yTfAr}x*khp&6XU+wqu1-n`7I{qo6}31>QM06EvaJOms+212QURrOZywQ zfr%iG+EqjskB8VE`}3q)-v-`)p~t>OEaetIX>x$(CK>R7t@vgw^YQiOSOGRD?Nl z9AyFvZ7VIY4E2s-ZhC*4H(>x(^XOi?kQ3Yq&3k@5m>?vhmu9|I6ADe$gHqk1apb|# zVI{8A6uo5>O1*EY5VMB6lhD%i|!R?_|kk z-N0;1g_BHmujo;-Nl1-}xXYd~K2_+dT z+$Bpac&k0^??i|ibwpa48QDInR=X7Z+8~9@tRsvWD^kqP-YY#w)VHEp zwsNg$ao=l8Wq$m-OyYXLpfYppWi?oJIdqb!R3c2a6UA10M~ko8N7;8`JSzyJ6Zv{1 zw-SfcQ7~hg*|Ax_r1YcI3beZ;JgoNFI(zNVN;iX%kBqf-ui)YGKXfL?U8xAnU%xhd z)w4hcoM9P_Rp4__rsfq>Vyn@ELX(T zXic^nZr}>-aup8a1Sk=1=@2Uis~x$XKXez=icfgV`Rx&{wnW`np<}!SgyUTTLS*Pk zazFxhdH>G(O52S<+03!Fi_p3XQ);G8!tLI*wN8wygSEQKKdggZa+jCSX8hS}ND{}# zD0r&c&#F>(4!uH0M+ARixb=DT`0+AAsp|9zKdS z*53F#-kV+6%F+ca+$*R$gf}qYmOF<6)I-D{mR?3?oNSJ+&2sE$Ua#S$Gq+wPVUL$G zUFQ6~M%t4iAl?5e3gouK11UTr-WRKOZnzug+<(1B!Z#H+JhaOXhjUSLmoXw+C1h%y z`CMc&aY_O25bdqfg?%YR@3$6Nbw6{JsT!o2)N|VI%IBF(eZCQ9@Y+^oVtmqS3ZbK0Vim*^1@;}Wv$re6W6tEUgo(LtCz`Ie`>SC@aSX^WiQw)N-!%~sE^EMaeW|sx^Du>_0Uv` zIJ9oS z?=;M>eWmCNu?-APWR+024A4Guo5RYHBgbO8yDiRY6!`3|6)97AR2~fnPRsD+OybmE zf7%XrNQWa~yuaBt&ng`~zs$8>8uoalhhDt8wHr}Bt)l)nDN0Tx5Wzs3@{+6Rp^HoX zKWUTVmo%j3r)B|1cn_{(L{5qF`B_t*zIN^tjlDA(Lbw< zq7YMY9I?&5&mH|GttZ3C6M7g6^d1LtLBv zv{4S1(qIMc6FX}~9=~uUAO&@$rRZtBGiC;$@kR+V~zZlew)ii>91LGU1`9FQss8qhbE|!Nx zP5eOmMEG+jyTYi_G5JCZ}6{8bizf0n&`q_P#i7^;{x0^*)?`9SU4J ze0>cJq@%dj@gwpDZt+xDbm{tq#;|^IRWI*~THEPvh#|C)Gv$-AObNbv(x&r1DTqi~ z2wI_b@+mA;O>yrFnvCSX&m3Ww(bvq6gP9KLGWi-R1Rovwc1=B$DqS65foYVRJQb?+ zIwGr!h1)H*z2nAh-0)%t>b zMK|O~E<#e(Y{M`<#DDVc)x*xjXZ9~UOh3iXwp9NI_-H=fH%|$M2J9 zztW7-z|$nIG|~QB99Ps*I>;BowYJ)c0*kX6)AjgIAi`|bjMeg@2RLEIv7#nRtT`Vq z84VyvC1dHVTX6VKPiUF6M(N;%VNp^J9oQhbq>+vYv+a&mnu$-V{IG6O3ad(xJ>j~E zDL*}fnmJ*Z?Jn@!)7XdQDbV1kSRnVSe#=C`y4jID-Fj9RVineb6cmf{fU22oSLA0z zDj%`}(&w9uzJ%gB;S_PrTlJ^uG_a){xdo2Bd>)g zUt(@jwjEZP#6^b26zS&i(sQ~W=Ch;wZBp8eLTe9Gf)tN_TZVJMy=sxL4o^4v4(xI; z%(l{mZrmoUWj%A>G3zs@d}<)YeBT0hW7q?ls%6!X+_xPjSobgPWv-r3eyk(AHCERr z>aJQq>h2qbLS1Y5Y?ZaFBo@U3v!j&wyIIGqc2Cc=6|9@f{I>ZW8^p=ug0$CSia(I> zu9Au0+9pT*=ugI1BdXElNPEr8GP9jg^;cQst8Utwo8Rr&U%u8@2FapAK{vgm1A{>y z2i+3|p9&)uhe|Q531&(V%WPRGmMwV{^px-543P zke1|GJ4?~*Y*GhjgLM1o{`WP@=zrVH6&k?Jr*zJ-`D-*|k@HGv>~=QQjDg>tp3PYp zA8y+#t^YKQut+f=9sjBBhd{WrKE@2MXKD7&H7$Tr@*mhG%oyL@JqjH*^$ z=EEZOeh)vx&$#V``&roNwmHWz|sf3~-hFiLP$4$fCLWfve#Ey~|3mK-bN!s#~J0 z&$MgJOfWQEr%%u2lH>Ks*E2(K^KJ5Cb)WQi*pJ7h!a=m(+6A@RNTavVZSWn0`B_dG zBppE^WN=W&%Pb=2F>qNKHSWSh(~mA04?bJH#+txx$ByCbd{=Q<_pDH&cZ;AKKZlWD`yp}!c+MoxJ*>G1pmI_&?amowor@VnJK~0?00i~!Zp^-0)oQ! zjRMfS*vrxZ+jh2@k&!u&fj#YU7daQGE+N0e4}>}-DKl7^$zHul)5-(l#B0~Z_2}aD z6DA^O17PAG$T0~pD3eRn#20DX2iguiDlSX49tWEG^9g4ToZgx97q1hhlQabkk@xuw z2~up|iYTQ(i@HB429^}1>4O-iyC@PLWx4vuQp7okRx%28ZfM?pqIc}P-~`bq7@#Xj?bYp$hz19ZWegU=_dd;^K@YTTB1YF>D~>j z_kjas!vNPBOt>347s##b!?<_%2a2*~j5nS{@KRaA|K1!Rzooi-p>haw1gowJ*Z*>? zs7xT|+b_cgY8`F`vX9zaw7g(ajD_&;dDr(S`S+%@Ur|t3_1>9R4!rCc+irCV%CT7} zh3ztThNq&pW>%pll;5mc@EvyC8R1;TBE@1Hn46uO7OAvVPN^Wb59RMwknr6nXq0RqL65}F&XBp%aVYx z|0Oyl3`r&em&iG(t7{^J=g`~%=7=Q%_EQ4T5){679cu^ne4$~v85M6!Zf>8X!;t6m zB=++&Lp&&xWQtGc<*&;3&=V29)b*mvVaT8 zb2D$`%;md(5wfi+NaeWXX>%bQxpM}YJfm%N8cV=7{)@G+JJChy6$$P@v1095Az%}& z_=LrR;O=Mg?h>xCqD})}_mf)P(22y#=gXd9JSc~re|B2?;xo8Vwvbx1W^-&}DPQPw z4YJey-O;&QrNdg~X3%l`T_0>&*pGMM5?vo{e&`B1 z(>nW@RPVkHS?+a5QtGjVKthfk)+YV^tzz*LE`n$sy43l}Ogm@O@`t2x6~%YmxU|hv z8XvIpl2FilLTfWy6y?^>ALbWUQ-L%)j;31!=aqDa*$LK@0XBvm2kaOA+ zorVn#2QSrL*bkElGwabg84SKT#h)Fw+?gZ82PFzB?6x!0^hrDt4E8xLob1C*7;izs~q62V$eT(N71EkLYy(?ceH~+vcnoG`hBre?^)CJWPLLj@5(jX&ht#ONA zpb3w7l!UewN~?}Z6toQwR&ZN$Sul-JIMo$aK(gsdQaiG%>pHV=Zd2Ebd!hzl5F^hj z!GfklS~{JPKdkQ0smKx_l&%`xC%Iux|5UigQYFI5mD$Q z$0>9e#pN;kGHl^_>fY*|(}(J6_a#(E{xYZh{dlqaXz}yCo;!_SerxLmLl?}$!p0uT z{!*5S968l+4thW?^}OYu;BPsZVMOHRT?v5)_ECWs)!njTE2(+kA$5~*+bH_o$}H5E z!Gi+0MZDWJA~D{FdfvqUm&BR;vu>x#L4}kksyhmUjEOriMi67?C!MbK+Mv4~f6G$3 z8MaFqi6d>UMX`f{V=T*ww7k*Uh2cyQ+EsT=Efi@CE!5<|Q8$u}GxW+a#7r1)yPHP8 z-{J%Dm-YZC+Sr^rLrx0n(l2%&DuYrSoXxNs^SBnxsuvbc7pS_sd{{>=`rk&UmLrD$ zLQyL=W*=ArpS2*+)VG9w7}JZ+XpDVQQ{(-JllJApD_s_>?}h8RBeM5Zu9X60sRHk> zZjD}?MqIByg>GF2Jbd=2eC*YmJJ`QH{-NVtk&k?)RpKVK*QM5%x0F6KxpsGOp)8iV zD#PzIZ0+LKIE;n=JTtyh*N|>huV>m?{?mfN3R=1|-T0EBA?m@W=3(wys9i7rZ*4y7 z>?aEPaZt5%^IJNm!MPKAy)x-fmex!sbn3Hrl6G3kW#uZvQN`i$<<6cA^)H8_@NDZB zd5-37i%F-}->uFJajlif zrAlVf;<8-c1VCM9HZjM6a8DYBGPK6WQgW)57PMqFhrk^aXdm8SVSi{%S2&pcScFZ` z=qZ?oajGnwO8Z?(tQQTkRHahN8DsQW8tbPtzo*ba^8R zrN+soo|xgNK+q2vk$Iri8A?-f85g#jrms3$1N8!S^3~l}^xGf$K&+#6BZ39(c+H3m zEnW-VCa&_NpBHu3gT-6xX&H?{p8Uy;JfK;&fk07U2C&&Yafx-LzHa>Kn~MycQNfk0 z!ZGXZ7;0^@O)5>Tp<&H5Kkyl-;(eT0yHw6yD#vh@!`9Kx1}nLR6s3>+TLpO%OY(+` zIYcs%6$uj+Y=D{AG7wm1gRDrlM%Twh@$k_~ZBnWGOhndp{B%I#xJW)@!H59Yq4XXt zE#a|CEe*F(WKNF7RL2XhN-P|T;$up$`Wpq%gKtx+rZtC-amG7YT({@>*ys8d{RthJ znF{;h#G|J~!C%scY19uC%^lXXG^3~faU-yEfDkkOA0U|$8Ve^rM)rasTvTF zNUNG7h5LX%5H8b_{;0H*Jf8E;bazxet}r8QnX{cHxxKWGQH`QY_B&#Z+lO!8J4}xd zwvI|vRL+(z-}dJCilPZqbk9;iU47cZrv@X%3UFSywN|n zcb{R447%x4tPy&Eb*dgNw+nEB4$_eiBVnRc1LgJgzFaHB9@4|30&;BVt zQhZdDq^&rCc!v{`i2nO(P$Y%8*F~U|gR>-tqSffzTvLX1J)l+#nBr$ib6sF>c^03~ zM>=Ro+UOH2fG+)Fzd;2njoM6)$2_H|!9WX=BenIMp`AFKM5k?hI`4tee#vs@w?y=f zL&aFC2kTIji0<2U(?rVaY@r$Tflsq3$U>6@HKvr5U_QDGxh^r(JQc#?5Q~}|bu!E$ z5QGkOi*A+bibU0P9IKPd-+Piz6I%joE1nr5vdPp$EgYs<$#* z{#J2h;YXicqqFaF%Z>ApPEMUg#presgJa;bAL%u3rE^&;P!C7E&ra0SnS@})ihl|j zlBKRlysu|ge|z1GduM|nxzocm4Vrmv9F9f3HXgcuib&^M-ffR1Tboaq*7dL{0FQs9 zEs5lB9DOb1>1M7Dl0#%(r)@x+P8^W5)PehQBCED4;Bm<@MLGF9z` z`xL}Zm2;%D$4TrPuzE&$(pT*crhuOz0t$Dn{+Oo(faRdvNyE{33i4~jbYqz}Yz4d- zdjs^}rp1_$hIb6v>$A-XGGhkMznfFfnkVIO#mTDnC`=rAGOFs8ewQ;-m{Bs2cXx^F z%bv?*Y@_NBEAcMX&YQaqMnLakW(1aQVJwZPZK)OpuBI6ov$U&HLwBuvl4xmj+&=ta z7a_~$tiqEtXLd57o)AIJ;YuaAn!y>Kz-kOnpI-v4o$49OICaCP`JKuoT6MHmi`O)i zQA18z{8wzNtv=4_FW6y*_XO`sS-@|lE7#e{uX()>?oqc$Qb>~0%(RgB7B>+jJC``l zr%!F)gMb>cc$ZUtU9T)1TR|4e0@Mwq{x{Zoeb+-Dk4TnmbpqF&7m>R-rafwhR8gZErV@X3x8+s)+Q{pv6ZOfLN{<FPK1g7)(9%3r8bEm6?1;KacBr*ASOzDd4G(@s)E zQ?m@px*de6)E`=SU4^|V7u2V6iO2mNi&CN&Nmf-WUflfmj;yxY#qrhdvCDp}R^fO4 z9{alXw`qkEhZ*)N@hotT8XNcJF@Psz8Inxa7MI@=5izzECb`#C!f^IWLC_v^)@Z%d ztul1TXgRS?n}`Tvc74D{}c{(|J(=k~%(41V?F3R(x~%tq}68 zc4_y%^Q_Ao#+b;7ee|whUpm~B-DWp5oL$^JIyQv_Wl{~Y8q#wF8cfx+SU11^9aQB; zAI)=>+)(E93PdW2#O)myRrtkc#V9ZQg0%Hx)@)~6VS`m!s8+S5okJoxkL~Pnev+L677^l#Yfgm z=fKSDmKDOPasF>$iWJX-e94O3Jm4w!0@u7+4#Q!;2@+gKldbuQgKap=@a5MLu9Iu{Zdjsv!UC6Pboj>s?J0EX2b zaq%45hz|v3$}%ig;8u;Ih>0NhsW{ZzIb4|EB8q9N=#iYYh5rDZA&8&{s}@4H9ci+o z-$j6Cg6=U7h`L$Ps+o(4Ii=}b)S@bqt5mklsdWCzoD68$BOc&wVzm8(Ngtha5vLXNtPk4 z0wPM~90o-{-QunI1=6wDGuv*Tqm~W$P~b<(_@B^X!XP~nDw)Uvp%`YJx3aKdVq|Z&*cas2dd8B98U4-CA=?E{^(-zDZ2&Ii$HKDYeNI?hb=Tgj!z;at?gM$iSX{HnwPms0iAxF>PIPnVts#u^5ITI(_?!{Y~IBm@BGn7qj#Y%Eo@7y*$r zCm2x133{ms7=uVq8Ej{I4$H0QljeBaObk(eREyt%)$lmN%rya%k@r&D!7Sno;Co+n zlAzmF?o2)m2dBjgjk$6wCtn@Uakx*yYIyf;23|^=NMA+oIo$<(p<;0V#a5pG$w}v8 z|BZX_oy}T*3ZR0IjN4AI;;c)osJS_V$JE{+W|JjuTKpGv}WUf z4o%^PR7J`Dv}&*1Xcv1FI=4ERyfB{v(WA|G!P5j2q(_k`-XRv1t}8dE=#Ynap6q01 zq=0JSGt4gzr}`OIQWBGzl@wcmjHiirPELA28uqXfAR1=ZB9rN%eEP{jVhrx`b)cUD zBe4}m(U~xxsIgHcQz6G;ngh%hXu&gUEJl0xMjTsW@PR5b+2^ylqyjcbD(I^C(Mt+1~c79^joY*$5>3+VC0_%LXqL9^0 zaJ?r)4hIqNSv31C#uD!yU{qisMMv zd9!5{iohaECpx7}*;LkIK9;pSDKGLwCqoO+b|%nL5=8+|fd#*P43ofEMrnphR=oyL zLHYZIzlDHO=gzh&q}0JhQ4t%0$(o$e)O;;FRH~=CKV@3$bm0fcsMi3c`z1CKdcxh6 zfHZy}*iyK%TmD>*IB&pBRNJnP+IHhN7ZK;VF4>!jwEuROKYCbEml{-1DS(lVy+z?J zvz+&gIw?M@?(msN$Tr7zbRicoq!h9e1PT$z7`v75{M2;j-Jj$?s*EtN4jsymoQEiM zX!p+@Dw^M-Cg`vR`r%4L-9a33h<=jYhuXktj`swwi^^D%y^j15%o;B6tiqAjq`z8EJ$U6$-IkD|n;cIVtZ8I((oBBW_ zzv75Df&B@2(!m}ztdm#G<2HZy>I&{G{dto4gXiPppi9|x7uF5DsEP>##do7SL&GrM z+_t)6D{1EI4~zeOIt}WT+wN4MOu;g6mnCP2taApA?ACo1tOg`0>)Ot+6>L>?9;oy*+RTBlePH6`3U;LomN)8S}u~o)+iAB~l zPzy}K6EDPZ*~kfUJk`#N7OT>WaT`Qc z-WXTzw;0kbn}Vi7xl=_|YlF9fG+fckz1_%KjU?ZKhdus(?)?X-$#PeDzm7#Lg`P$9 z{%NeH+CKTNbX&CbkLzW}eTUqXg?|yx3Qw)^6CMks7V zZWWifWQ_>|V6qRL9@9+A8DLHG{$PDy@DIlN=cK*T)#UV>H8Atq&ier54c@B^iPWy*KAT_-iGaH5fik~oL612RxIQPC)9yYyPt_wx zpaEjF*|(D$&efu5<%u`G3S_P6D;DWbKJ;isDJF5hq7r-GEKGa2$fROX!<)-z-UQe! z0`k&oT*n3=nfv@EwB;M@l&wSVJ|_frft3?o1OKqAyY|TGeh4_sWa6uX3sH~dN*-K@ ziV$ccZYs=oyVg2_ZjZfb+1ls{IetEnG&&|)R>ZdWYrJzKJS+5&(OAxA!bi)`mx<_|NKg1XtJ-VeE1SAwu=>{3y5~D-95hgWCiGj3$zylLd5qJ#L-@d>9 z?$=(gZRgzQ-1oW8=UmtO6V=jB`R0}6+{vi8y9xOWoZg6Q1&^UBm?x`krLe~F#|wfp z5`kML6m~Yv68$fZob(3`EOA~|xr#y9FhFM#<)jEPYQ22w`Uavu$aNfBpazQ5o=1_N zkq1)J@l0;TD_IW}{~O#e)e?7@;07VB%si~_EaHUOJ$fWeYawr*)A6nfe^-dQ&3U;a z5c;UIFvnCJ8hjMv>UK+T)o#?6UyNAo!=3IZ#)K=a4VFT*+H{Eu2Dukl!pt4hCye=Fp3=Koytm`m_eduRywsoS zk07(E{XSt~{8*WUHMYleMi<%{Y#t9y=Djs^xVgo}kCyARLI{6-+`N=;)Kh?lX0f@E zfT>7mCj_8)nNWAm3=sK!_}k9el6#oaslR~EDNgk#0m(M0jD>o%GoWrYPLHHt?yj@w zN1@Gb#FY1__^d?)?G!KE1yvFlEnSXIyL^T|1SoAP_so&=g+80qF`kb`y7O=DBvVex zs9v9}M3X?#_1vETTNHZgkH-H{MvzV@ANV@B{$c!Vvv7K1l<)R$kh8cEvAd8f@3FRU zPIB>7FS5fB;8pCO^s&LxfOJJ+b56ljmmUBh=nG14qQJK`DMC}S(jj>%+0`Y6)GZiI z_;$WFJ(miiT1nIsEfVSKdbY`=&%z`I6UvPCuWhQa<1+SoVAD{Dh;UC(P7t_i)YCUq z;uaYH*m7ldXYBD=)(Lm{gt;ehsxvM6J(;E8rA^w@FpdKX{74Y#ox0IiBrR|kBH>x5w02*smLcc2Buk0cLaVkh@WU=ME#Nu z=u>xI%Je#8*L7icb=l0B<%nFz+Y*2Hc;C5Zj(uXRcW~&vh`|x5(ka-k z_jFs40lB)DY7}={Y1~~{t9NWkWMzjEsC+QPT*VhL+|{qLp3Nm<;bI>3AH+h<&*F;A z@+i8HwqKfRs%In_v?y@yQ=m9Za$yl~oGS@FOtv$)K0Ii)3;?vDRLZ$R_tCYm4?#~J zhC6l!+e+s+@L9)~*$bLPbU$KJnG=Ck$fpT-$m;s0$g2lyn1+#2dAGGsx| z-nS#*#U%gb-Jr5m%n|;9S6|vd^c^0F+dUo0j! zEq&jJP?z$zGP>C3A{B~KW+3BY0pvFdWw!iLCfMQ}e|i(>sBC~2SZ1|g_6@KV9X@G+ zE<}z8z)FHH?aJGBvr8yTRaC>7rcBs5Pd{OYquT62@_omRIs&6{)^s%nlDd}s!4)h-hKg86?rpm3W)EXIMv9nRUpiHHc7!3P z!Y*8Bg~W7Sz5>(QPZSTbkeH<0S@{~vF^136w@q-)kX!N8f9CRsnp|=6NDM=1LOJO9 zx++vx+@Q=|`QV@}V5{j%=IXrsZYqG{98n9MG?Z3jW+6vPz@!~WW8jp`!P=jImGx=1 zHjvEH7fjYAja{T&o)bO!&__s!2%jI>M9-tDW}4v>@iuG=ru=m?n;4o@BwT|i{aRDL$%6Up%k#1qwiTJ zdI2usP+M^o9yyHi`l#|LbI37;XsL75^V3=c@S!(V^U~zMdl{A#+IftkUuaPlMq~ev zQ9P;$Aig?-R|)NlW#-356Jf{*ysV7hA97#m{)4qxtkw1+zycjiSeYrZh1Jq`s8sSx z6}6k#xk!n)0o>zX``3OnLtaSgF>}m&5D_`EiQD+lm+7H`zZy#w zaWVcpZcD4gO*jX=V>T2EaUYeLVG%|9kS#4KI#fcrUh~ui=1W_VA$;E&6+p1iBQl~H zWMWd33IUh(-=(wLcpxxFiYn!tFQo>*+4>o@91w9&r$o}WZu#RKAGmG|*9r8$R6g8|(AU}vMKPjvHM3KAG?CJ{x_9wWWBgZ@ zYe5`)*f*m#%Oi<#&7OUYGRF^xyFr>?WN2W&&zGa4(P;HoS({aVH= zI_R=VT6k5N6EK>DUso2MMM_#|PpEdZ>&qij+f}PbvXpv#EukC4*TJ}S)=)8d6r8|1 z+xhl#8nK=0H%`SI*?82|4VZw*3$j=X>=fWptSn)*P0f9jM=!;j6yWOd#LC5w&_9#d zO`J-5DebazpU%#b8NCyk|1QzdI|85}vMPQrjH*YkiRJKRtbr`O{sN{M3<*{n^a5?U zg_dqkTD6AZx9B8(I6yneqZFu^#uZ9P`x_dUcBSD8r3$mk7w1)^rc|OGTC$>L1d*yU z=b)E@NFLauZ~(XOl-=S56W;1wIe>9FL-L$P=OH-7=#nLT_tzsV>=`;~#VpaB$SUV6 zujO*kvy+pZJfA4P?mef}fe4d!CjdyNzGUW@rgBdy__#vxssaSR@>v@Tzm$1vE4{0h zIU9B~*d%n)-)xjn`o1WyEimYLfM%G$FFMA+4^1Kp*Pu_l=6$~;`p<)uS{R|}) zd5Tq@wU+(qFj;m-8R8X9kDV&?ROy(hW>c!?#a5=E=t2n>%s!mot{)kKjQdstjNA!yj4Dok3HpdvU*DK+j{VrZa-UN=x7 z`=ChVp1@JX=hfv2)qZT4(1V__(mEIRg@Mq?n!P3=MlB}Q2>H}J6iQLRfQL}_F;ueC z${dG?3#5hfpO!Mo$DP4ngTk0Rj&NR$*IhOKT(GBej^y*tuXS~$%##^}hE}1k_3Q9R zUqI|a;%uO2%zc_v0%M;ciylMIHiW4kUit3K;lJx$$AR};B+Z8d=@N59IZR1%PTOc zS1Le}TL%;uTSEB}3;aeX(`6;7SeqJOV4U+UHfD7%Oeujr^djlNB%;!;G9`GAREj@; zty*h`5Z4&9Ae7miTo?qgNzXkSPljsv8!a3>8HvwU@IU954LP>&@5Pj=R z{1+}qK(3o0!27={llVjZG+kyk2v8N^|7vM5OzH!fe3lR&_Yl)HIX9VAYEa(|fwOCE z3g7*n;oX9EfQp!k^jc`oULH1@pcGS4SCUfMeB!?8(eapBL{^eT9=od%ZxVd}=AWQ% zWjpmZKZ4rQcE(7+>8n%hyy^dl&tR8cIhB2XZTUVXy4(ck!#%Yc&R}DK8mx$5bFfUH z%WXpmm+=&Y$mkjpm2-$gHyYD3%M_Pc-4?hlAC}s9BKI37k}15DWZzAUydgAslfv>f zV6{{2%Byo9yxt(mNS@36C_)GVrh5@4ROFhBsHV>kpuXd`nZXpWYqZuF=G;j+nNmXI z-OrEnPzy-u!n>wUknHeS|oBl|SG#$DgNv>-&)hW?TJlnH^w-Nl8P?j=%8n1Z~V zk9?l@c_>lZD-pT?UWq@5*R(6YO3224dKEd)L~sDWNJTv_Xz|+uL3&YmeMeB%r+x_O z<=lRvA3I39R`yw)wY~hd_qs8gr@p?D7Y5OsC?FqprQ#}XkrR2V1gFw2Q7)h36oRD! zzM@D}nuI$~?ntY_lhhPB)(peYB=n z_4XZkEah5RZdq$~IkQ71yHH9AX`F^Zuz#^I#BrU>l&;9aTt)UnKNF3$;KJg1Mk|B$ z>l1I~`NtV#%KI&jkYQwOT24kE&lOWx( zqPH6;jz8+8#Tbe8y-lhS_BSzyH?OylD~Gzn){5tG*W-ib#hTGpZxq`W$zE7Mw+OjC z#n5Q?k`^Ls3!zfW0>(PIX4gt;hc<`E_4C*7z6P)a zh|ZOFhQ z;VK8tx2j*9UWNJ*7Z$SE&we7GC3nzIPGTl))0E7wmll`Gc<6CVp&)S^*D2fXqn zIf3BaUU%;u|A#Z*!}$kT_8)Rz_MR1}SGcd9S`H%;GsMO>Z~D97V&8I#b|#dZkg+e2D@=caDM6xi4|Q&{<7 zpalZAN7Kh9Bx=4w^8<0}8AaM(a_xSBe9;rVjG{aA$LYeQ6 zecW|>srwhe_xaDthli&hewjivMmBocCpTENsuXbH(~Pst17r71deQgu)_+fb=JlRk zn|x03PWpafn+ko3b6cf@!iZBL9>M4K_AGm+kE7!u=6-elQ$jM#0<1CN97$f2lnVOD z)nOczEyt)LCmKfvRKheimzSL1>2GUQ^SPh&S~#L?rP#g!f$7HczaH>5wSM;}=4+qE z2INx;kB?i^7FvHtaeDj+{cPo1g~q6zj__)O4_n5FQ3wB{fkVk#8FQhDNweh~jN z*WxS{iC5%N$KYar`2w4;0HGVjQfklS8Nl0vvbY1u#A#IC>d(%H#oD_-cfSWee9wrJ}@^zS(qUu znam7{(FKH~@v|O*em6Rw{u62Q%$mPo)*B!y^hyE8lN1?S*pZ982{nZl-=ivn*?Y$4 z(FZXGJ{Ki;+Yv?{iJ+x&Ir(i^)3pgIhEx!pTCTrQ+pY_P5y9|m@8P?^;AdY? zqH4Qji${mQ?&YkKRN1hh-#(I-y6GDYZS(p0hrwuO*Lm1>ZpYx}(*0NegWH?zsD;4a z4P%32NAAkc{RRiwbuF}t6+$H*GdfhPgq)z4~v(?+dP%HEyd1{MTlB)8cNP=Ep|d^KrfV z^<+6W%hEX-6RysbJ17scBsM!jhebs0v^*Kxb{g*OZC8K5a_9xbyjUlV6jbTkzH@OJY zW?-L#oed&CBe}X}sQ8?)teHP5JhbYu`xITnVdy}`d~|=9q_GgPlx*$#6wOlFWw#I zW&}$sx!lb^LP$SzM~EoN+6~N^=ahTuuu#aF<7&|14@@7H3@Rv~ak)>=A~2l7wMw+w z(PZ>>KVuPT)q>5bcn1rAxy-hB&-;Ak;BMGzP|sL9XV$yg@YM(8Md?u1t7-eLx3^tt z;TDAGMzW-QiyS&Ye+S!Xog~W-WvxAA_IkYO`#-3%|ipvcE zCfE2ZDW`TJ$N-JZAZ-@*bj2M6Z)8zmpf5KSkM&G+qg;Y7SoP7Uxv=}H$fc`c0-P1*C~$v)llN-my8kC9HNMSstfI{ixg zIlcdlK$8)h0u>ZqxR%7NCl%&Ve&i{INfnOMaE5$w4%`3tLt4Kk6RkEg%OuH<))Nz{ zHXPJd!}E~~B+lCSa(tgTe-3XFyQsWad#F{Vm~CR3ST|eqiPut0&2NTz5@oBmfLb=4 zvN=lEpwy(|NC8dp)6$z#38`%aw)yspfKgV_GK%92k3||(gkR?sQKosA+%zcmiugdy3J-852t2=}npC$h4EaB9q-2u-r* zx#oZno6yz?ioN*RAWZkN@PqA1nZhechuk#NNg`r^%7GSI$Yc=c|40nhh@OVV%F4!c z=n4(j&PeBf5U3sR`Jb&O5##m8snu)H5z%LiUXxy%g@~~Mck~Z@-tkkOPfpTAXQU>o|#uO zd*=3`S5D{uRfE>G{fE)M#n`E4xlb0Gl6+h#77$>Dq3|~oIa8W}n6Qr+>*A*IzDCJh zY53HK_$mpI&S$vWU%(90YCJnl4pjqbM*LS#w0;$FN^#_`Jg2;1QUx(3eLl)O;uJ)U z2X*k*xj5^zS7gLD7+hDRk5Fua1L-JU8&7IZ`6S+X$opHq?ub2uT_q zF0{eACt8`mWJ;Y!Wz?n~ruK!w+JYUC`8prqbN!K^yy+fMoWdK$Urv!ohTig1CDA^i z_O;n3lO-5F=o0hkyd!LrtoI$8a#M&8?CD6Eba{FC&m9CsuwC-z^SZcv`WO|y5OWGU ziY)bIyz&>Tk(EzkTCf2!5=vUN5EE*>^K%`3Ll;WR7o+#abFrh&SaC|>3vERcCtV$! z`lHHP=<+=QJz6Lbzrx>TC}pLnIBt%#rCP5Tq;6%Vx#kNo82<{_-~UlX!rLH;FOkWS z4Nn()D>lAgK$4~hG*?QFm?G{Pmj_@!ri0%T3GrJ@K^(+L=w0k0p80i3>wwY86VHl_ z6XPPq)8lf4j~Iw^1;$famT6tNtP0crN8x*?dgoa&2q_1k3}UoLLq0i#s}5HQdLPxv z0S|^)ghV_sSuJ__Zh$Kl3T|ItzuDzY$I+e>b-xe96c6N7CsBz;<-GB8c>nzmj-O&G zQ!Y&(dX(F5+I4#BI_g5(1LQ$pQup0C$x^aDsu}%v?`ovfUg(8jjg!Ju#ElP47x|HC zpZ`sg33ZXV4zaw&Do3XS#0i*6kL?gz*bu_s>tqeWPSCDRQ=X%VsEAhTs)zY=yPxr~ zkEfQe=qt0lw2&Q894Hh?78}YQ20^n114y=-duIzi$I{a2sa3YNk5BK!otjbzj*2~_ zw8S|tA$$4nF9_kBPcpa z4CC{4Fwbig3Z5F2ZRn9m;KA}qPr|i33WUV0hVuKgiE(js$q`gHZo4dDJJkyH31a;9 z;+xuPv^6K%i$4d1*JhvQ(*Tuf8r{#+(3z;UG{x+-vNF4K8OJ=%Z=r#z2mC*hvYPy0 zz1wgfKF9pjI#VM%h4X}hvJNd3a6+6kMXxAl2XcFFu%7jxJq#@%Zf0)C$C4-R7&KMF z7`@O2SD)6NTncY#r9L06KXJTo-Ih_=8s1mMxmSOkdvjqeUu+01r2XjM`l5bQI(*NDE5lUe;8=0H=0T-qfTb5?<5D7B=m#={4HA$C8SeQbmaEQq&NR zvCd_6^^CjINcn4q8H$=h8~81=sUny*DvAX_2Nwv4)+xWg#nt;B5gbd7R{6A@P_y)@ zsH3#mNl&xFrYBKcv}=(KH%e1g+?p-?euFgCc$99t!bP4Uh?1 zCcIfVm(=W(LOXR;nX`^Cl}6J`U9}DyC{Xp+n-Ka5w_sQrp$A!V{aV~`yyd3(f^a?a z;Y(Zc0QW+wK8M<^a+Y1HYqU7KQ44Q4FtJmmVJ-JOMVIs+xN38oJ=+ku@>_pryIN$^%I z54(R6nW|!BEBiI#%WabR?0Nik!*|ix%VZdYW$9y^bX)uu!R{)2yidmV%nHB1c%RR& z=pg^b<2?QP$TIFf9Zt`+VP`ps>h)Uwwv;!IM67(C@J9<7<*0=~IV1$82EX7f@bi~x zHBOq<+;+oNNrPH+TTFP&F8v_8zu@-})3q=!BT-Uay910F%(4rTU|L|#okGb9=C{f| zbxq7B-; zw5Fl~Qlch0Y`+=&tLh__-{9Jml8sMLx;amN7Y~jwF`1>XZ2PIgyR=Jw#+KG>o>uP0 z9nUIpdLl=9LL#jR9HbWpLN<7EO3-~!E@5Qv>Fk%au(|5zHI19KFrXOJ9pjhE_rtL( z_8cN}{Jk6R&Ww^k;S$Gi0xZ4!3Fvg{N?@_+WzvkhTE`FIyiEgsIzjDLqRy%0Vh9iD zRmOg8X0d-Rpl`VL#=dDvtJTO|(!R|636i#`lT`9u3PGRhtNzw2E4B0(=B6&l5ok}c zT0!Em0>aP#06r^EnZSu=XR_j4O7?w;S-^jwGh2ywp4<=>x0enP?Ua{wvUN1MeDhP1 z$55N3ZFkWvzIc+ajiyvjkeXsj9xffJ?tMoStPPEpTTIppPng-la5wMhzZ5hdl?IxV zXAH_a+dJbKYBfgBnmg|rqv}EcVk=2718lzk9}CkJ}P%LCd!wOKjc$0!p4$%p!-H>yY`kRY_^dRotSd z6UU7f-3kfeYf3Pg5{lr-OzC(PB?A`!cJ_+fb}WOTo{X>kjn`f3E5jId-y)a{iaE&1 zA85Uv;0PpMT+#u!tAsj;=ilPk9c2~Xv&k5Cr5Hf+x9#L9Kcp6B3W4{VmW;ympFVN> zSgB<-)EU*{As}76ueNhOF~Nq-x`p*b7Ny@S9EOK*XKkkZ-& z^&n>yvcpI3GxBTKYcFz>Bk79;{d$h_BEElDnvey~y>c0j87sIg?1D1f+T)3Zy6pB_ z*!EPa;9h%=Lf_O{+HmllG@Nqz-6(yg(xo$u(kU-iY#rD*aRODoq`pTOao&YE<@)J_ z`f9Drj3C|5LBbM|N7~;@M@4%bb=L+Z6bb{KGGl9ba=K3!_vXfq9$dUqUFJ3q9?3af zrrvirJ_*ZjR~TC$mT2VpSoa{%owAQdSBN92&38HJRzP=l^|-OA(Wpi2Tu(o(cwip5 z|10Md6Q~bkidIt7H7#Ts@|s(mH3D)154183*OU#Ja72M5R^pom5Qke)nUzZB&oo+n zia(I%nVCJSBhQ)F*y&H5FUmhS=|61lg{8M&vlP2ri*WOG5>?n5vuhTdYbghxwLYyj zvv>_vW(`&VO5n0 z2D`tABp6bB_X0AoQGRl3>t*2{L3=eKGbpHH0>?_|I(tz0<8wlX@}{Mm*%$M?*zG5N zY3u;?H_q%2qNQyhUI`>Cj9)uruq6G;dvcc{$mP7Ns)PQ4@zQV=1MMf~wzuz-CIq(p zN{6jy)uL=0f!(3=00ZU6`kOa*%2>2$x9p#MRa9r>C= zHuZ%8sZ`6@E%n>!DAP8@@swEum~}sH^zHj)*#u?PzW^TeF1TfstGg$EGWjLbpiJ(& zT3&4O#d(H>n)YKQF3;cMO$I_ABBD!1xQ6KA}qMi>V5ZURFD{4+sKATH1mbdVb|-zw^=Uk)#*?C-g+b5T11#_db=rx zT752rPdkab+YHE@xxja8pMNL)S>NYRQc*FgRs3Oox{9Weu0as4!o9nnr&bM8vf^OgQ-;)G$y{XJxzBJ*c`4!5?o$y64-Y|)Ve zmOL53Fg)Ehh{v2)_LEkftv}=G&I0+lQPXo_1HA`g^GHQ@6~uDRE&oRkF_>lTbWP*; zjn`J>c^__Lc|jhEPcr+d3SS+>g%pP=E3YxpiP*`Jk}+87{}qrDvD4uljlassKbZTGtu8 zjw5Yz!htjWkW-8~KP+`Gw@UKMk#F7T+l}hiC{`ZJ?EI2O-ah+Q^k$<-q2O!SjuMs~ zn!)(Pi#Of~`(b}?JMWr6UH<&&FQ9kLg!`$_Z-)HcPW9aURB&GE!YkVrgY^Fd>@zQ% z`=6NB2J6D4#fc)6Ykix85wn;7{CY5w)Pm~nTIM|Rf6+p6OzIwV-7fKL$j1IG;P+}< zx%Bf_9ut4|{#@Bg`!UJ^e$>KzPjt`x8E38}1{G-Th2+pxSl@Uvc)@5C8Uv$s>tMX% ziW}R`9Cg~@6BY3`CscQktM%x}2^{lMF4vS0?Q;AR6kc3J)JYI;?;6GIhQuiw44p}i zwTpL1$i*T&egL=Qk&K`q2YsgyYyWP|D08yT=ufeeCw^8>!))BAHSA#lZML~$) z*~ov7{oRc>!rOj!=M6CjnKH%FI%U48vlV>8OjXfTvXHYzpjo~bY{M~2nN@#Rv0N^= zsyX(KA()FBwSWl0|A6RX3!2~R>C(5Jmkqwt_3d2DKf9GijhLb*FK8+JELIiUCpS|! z2ghyEqRIZZ{E$VA%?w(wmSZDXcM8)qO;~COk;YacrvfIyQZ}DMs`1tKEJh_$9OV04 zoJ-1#k5fE}o4sr!?z$e_N2?Q>YJNKBXuh~OOvs=!o7B#7q6JXza-|Q~d2aUi2HNEm zbT@X}R)se^?2v4lU!3=|HPkG26POuKXVrSt2KPCKISYl{WN5q7sy~*paEkR5|8kT# znc9p7$w{F*-PfipT;jGxksFuCBw@-zuHxQP$#!+@(odoD4@4)mL_~N?8{ONtI{MWm z`hx67xuhSbjdO%YG}&_w*(*5qt2!mDEgB_T(`J=1bL;dnURi-$s!qE7k|G<4kDDAR z$PW*s>!cc;+}Qg#Ucmo|smZl97PY2*_iH>kB|OqFi87k5q>i6GuPGXuSZm>>K^6;9 z=ezyjIAX=IH0jpOK$vXso15W!zkqoM7!%xQ#XfN)xJR3!(i9-ifY2@9B$srU(DTUfNZJpEA!d|;%9bgl)d-vx^xo=#@NqQ)nbAeNUD7Y^ z%~NfqLXU@LDD11_Sli=SFJV2Oscs~WU{VXm0{YpGlzEwh^xvT7z(*Pg~+o8Zrf zTllxms70x5MXUDVo!h&=fL{y`E`P7DJbC8)>$#&}OzPY{KA-9xrx4jm?~$Zm)C4F4 z$B9|hGmdBfV1F~e6j4UYdGCK($G@Wsgvu5fJc7!e$5(W@(XTfiCMP)_nKfwfEah`V zL0Rj40qrbQirmZRKZ>@8U7Tkh+gx8BNPU)#E!mEzja9yRZ+x_osqMrOx%b{*_JtmH zt-Z9MLGmc5mOogVD21o)6#Y(M8yJ$cXt0`GJ8rv!=Qim*zjx6um%MfJ0&xU~IHY<9 zXD3zk5{@g6tZnEuE>Hp+5p5i*PXtLXuwyo&al=%j-ms&JvRBotrik}mj+*#_2`K__W>b>Sc2{R*4h({f9gatbS|@+r~K5-)QGTa{C8q2IsGzD zHfPowKeNe3Id5erVvTZ`Bf37iPyZ#m_3091rz`kNs>G1Q3hH1F6u}#A+aNeGBD|Io z&UImAG9s#yxCI$z?$8ulC7P}ll{wOnwm9`zVI;Z|AY6Q=jQs%&?UfZFoFV(8xA4%P z3NgdD8^s@tWKCa5dZk;npll7&+39u58AB4#mx5cRjlcNX9Z}^S_>c<1Udvf~%+Q(p zKq%uf?QFhwlv{5|bi2sbkk9|LJJ@?;f=9fT*w#6|+aFpKd_9!4%jp)36v$@6i+Bd* z^SLTc)fou=1vIPC4CcagUA;CjY7GLTIIh0{(+H^xDwbWAv-y->QTo$YhCVW31i_}V z{JUUdl=g1sh*XA6wYor)r;qHwbmdZAX$wC&(?c^~`=0sBq`93en5LUhiSv?q??0v| zcHSz@@S+IO#;rWtz4+HqMO|&Tjk5^hO_0s(tCJ#~DE*8u9Cw*`-EzWEe7j>|7sk?_ zJGhE5I7YKtDE%^B8SM+x&!P^EmfMTUv3j4B!)!(H%GIp3B7xlGDx^% z^pQu3s{j@U^!h0s==8MFsL7eohl+X2IwSoSKDxozQWK=wzp6{=OKz2P{Rf0M;hn)y zoLk%{OR^}a^6?4XiZf8_w2kz(>2zk3RZxU(iaI{h-0EW9DkD-n0{e-;N)0n=Axx0f zylxSkdd+WDVVrtZ)}U`TxO`11o+ZDa2BG7;4BHtaqhlbnPMR_Q1FHcRWseV8s z$!Za4b-^yvYA$~YVQz_d4yA;fnZ_{UoR=T=^Z8Ar>NgW4!cqD8UNehfxD8r#k8n-KSMR5`H~?UJUR zSoIoPSzcU!q)t#uF3$|XQ99fGeBWIkQlU)<0?++;Mw~j|r1z$TaE~54Fgebigzy=2 zghUtl@u0t+J+-rr?xz0>fBqLkkTjBHu?YIpPO5)=fZ5fXWSn8ZA_~l#(0FHD0^v)b zxLfF|#AH|vB-m#?$r&Q&~^@?K5ap0rk)%h0XS!q0VbepU=GG8aNNwi$8pdo>^w8L9@ zK>(UIaKWFOS>Ra}bb)*2$l8;d>b*8uDINg#+74_4I0O4d!DCHjZWp$s60WEfO38qf zu;weTXJlfM3R1>k(p>SkdVq4`!2AsVM810lPX{(R9YiD|(l|VILXmN&MqW&ctDQJ} z;Gg3Yb?4pRyW1%dVK)QYJm>~Z0RcHujR_0>u5$}@Z)E>R` z8AUSWa5Tdd_&>vQe~HG8yIO_Tu<^S+oIG}7A=60<#+8CkIey`KfD_CQ!U{Dy+iCe% z@C2k)Ws2MFE0q%@)7EBOV!1{;^sz1Eop^z|-$7s(2LG90P_MPWwK=N#6Lvhn880{b zB^D8tx^JuWkB<>|_#Hg^JL4g-N5fK{3Y^^7e zrjn13O^+p5xHprIkNO;@wTYHNGNHk6g?IutE6e8JM%RTnMY%Wbu~R|sBpFZjj)1;A zt%>QL;ZsDD-lf8wsBZ?XkhB=!xu`m-1O6K++ZO)N5PEf{lioXpExPRJGXAr}rgN)>om)U3pmj@<1Z3YaO9^G2h2}w8LK|bAFFUishcVhL zx#VDGKI)@(C_wApKAu#uyN_?bnTSl`s4hHRVo1<&UR)(JzF6!ObG?%Fg zWSw-7eo3p~Ex=%}bpP$UOWjOQaYCg6ZMKHBb~^vWe({oW{kJst@fXpW241n3&=Lgx zXc>&MjAN6;F~&_=izym+_h;5{q-a=DDHu-HCUg1M)i`nyv3_LzXdQF_?AYM&oM|AF zhUo;mOE3KBO7#d__P;EiQ(ypP@9po=v7&`VPnn4V+KL1B1A}8>RWoX6mH2<3f&UqV zj1S)L7wysGsL?4uOJ(<0yo;!zw(+j@oI~dOE2i98Tcff9;hQ;MHnDzLIoFdlu>{U%@Q7SrL_LCaVlbG^1KoY}w5h|`X7|DYh~tAe(a58wU;T$>VgECl=z5@VByc+ZqA zcPm627^{2{5B@%iFU7<^e<;7(1x>JGrAL40q3@O1&dAC4_{SWalF=zAP#kK1-qMBX z8%?jLT9|w*mto7C>un;Y7!-VXFe3b`ut#AlV~tT1OF`NR58{AMDC%8*F$E7WiF0&w z8KM*NRW?Fsjd&!J_{zzm8TbeWj=WR8%Y}VaEf)M3X>M)TJB&3|(YC`VUj8;vuS!Z%|IHL+1FliX=Y7 zzVK6;;zhqm&_M5C2D?MP=cIWjnFM6Q`sbkLy`8bh&woxyztPl(^n+8!4G#cN?16eN z7~6VxpLJ+8q4w?X?8Rjb9@gCfrW4;$flx=CxuZ=02~i~(WuZT-o)saZS+FBbCzZf= zBdhM0etQqDMA7LNm8}mlat{F5eqX zTV71ve9-ew42a;b&5d706=Fy1@v;|q8zPr&Q~rr3Pn#mB*v^Q6hl6!w@FqTitoQ?zpTlH|(O(AM&UUyRS^uwKIRUVO0*Htrpvy-Fr} zQ!IhH7X;)gJWRB<>mYHTRaE7IXYVx}-W4?5mb}{&xYrH^!;TV#Pf}6DqckFx)%JD7 z3+{G=>|6_k0d@Vk(6s#k*~S-{OKT&~nXq5R-IWv?(=p73%Eme5c1w^ht5WDgW-oIe zLDC~KxpSk&#Nav+qK#q#%|tWipQCD`GvZ65e@6B6%1cV!-Qu~8ypu6sy+q&YB?=LW z6}cFq>oCfXbsfJjm%`JaTH=n$zQrZ6A&3r?>!X@GgHg4S^c|KkJ*Q7`Vw*?Nd!%`` zvtnZD#Xzy7dbId%oE$hr4uQ77|tM{-U8%`%#~E zP-&Cb@L-0VyCr(8x8%c>Hr#sFJ%mP{z|$Sj#Z}+SpIG3^h#<{V-n7b1;IB*@WGMCa zWlt?3_zclDLDNRS4fc!EUce2J|q2WuEOBuKgwQt51V&p5XvUxqlPuJ^SK|CCO!?Q#W6X&JYvcqKjDoQA|NO z3o_YZ-}r)rbiub}nl{L^H_n`HC^P&Rd5)!+fJy$5>|ZSKDoS7~I9_s@1I$r~7abG8 z<$G>=&nkPmRHe(CL#`qQwSLBQhjP{|4)5bRr1h*~tT1oNKAl&ceH}?@TcFxATOSL% z`v_+5o)$FLgHlsyu%?e9IUj7T-1`fNihR2fbkNtYGA>(^@KQ7@V5zgOpa{}3cc9() zZMb7|XN$le@M*gAQya06pZfVo^m~z?%^+9x>FrIEd1T*VDC# zsGVmX87VqbQ>OxyK)%&EZ%*_Op1BGe-{t2TswsP>Y+GpwFAC|g(|mHB&`Q-R zkw2<5v~M$){f23=vPEsjdFSSRMO-=T|4RORw>V0Geq=>{`1pBCZ+ZIyw*4RZ&W#_N z{><7ZR1tQB<)`P!tHP%~KQW)5-`PL!`(7(Y@h0P6%c&;~sp%9H@W8+(ut$6Yrs6SC z+6G#z9QWpn~;HIptAWOPR#tqt!>Md11cfERvZ1_K_-ZPxd z_mBGzV#F%3XCq>d+M5PJVvDV`_TCiLMeNxmVvpJtdylG?+N-r|7Y!{%RkhWj-+zAh z|G|CS5A!I;bsfibUFZ2eKkwHoeBqh)+Pe)GzFTF)9==XtL{*)Ar^J8=-{HpmM3(5s zhEMGdsG5>$4q@$pgWHGPiDfyuJkQ}egbcSHH#EazWjQvFS`6s%!!L|`;5$D~K_rv%QzsJ*+R8ja~+C`6IcQbR%$ z(rn`FMcfhR8%KZVCR?PfRndk?cjo~tL+QXVBZic!Z)OTIpTwA}d2_akX3HfS=Hl?H z)~iVqm|m^$zd1c*&Pf~&4PuP1MSCdg@irwZJ)X32on8v+M=QA52a6+LGN&fWY_Q_) zJ@s;7EX?!h3pG;GCHL)YSD%i7aysJ0@#|0+!kUUp0-eT=2VkkPsWtu^M;{}e%0t%bYJI5tlS5S5;iqONfUa3$7b&3Wrc`|{ z>XuRua;)yYsW+p5c3Qid^6OWl-3(j%%mu%jU>?G`m^$u2Wk=alKB4t(I_cuo_rY<>oq*G*-7^+XI9H#$j$|7PS!2pv7v15hFSaTEHOMuX%w$f+xFM$}4 zvZah1-So9s&uaF+-EZ#xtTiUxx-W0cfd5)aE*XW54nx`HXsfXH$+MWi6L(quaj zJ1Bu0)H%kY$+g%2izuU(VUJ4ci5l76?#dwpVHv{x;3I{s$To@Pi59zpjJDhXJuA8V zDScSFD>9#(XW%_@luz7Y`?iWk@Ka*b>rH<(bwyZm{DiE`v@FmN^Vveg16aFgde zIFO1pZ3n7RI=$W3-=$@qvC9)8Xb&9M@c|7HMEtI*Y3)A=ydBYXbUjGamr~UIvSvd5 zx45~l2_>F8btK1nh=pQgs0o+hv%FGjjoa3U6PB2g=blMEL9f~hrab=f=3D;phnM}a znl3=$OFDz2kQyDP617=TXya4>meVz+M*`1>$XOEc}C7|O0F;E!~EBe%4fU# z{kJ}C6)bbVtV?(2;hcgNga?1@KWUMFZ}?+nsKe{2X{yM~Oz(91v~7@Wj?25ICS~=M z2Af{$rcAs{H8L9yx^$|CG-j#D>Uo3HLiv+r6Lqo_m#?~hQ(;0TF|Q>52pI1T&KR{7%+jqBUrgF8t>#4Cr#F$x!AnCCep7N@#y1;yNBm> zK%UI|8?i^#W9BkAH3qj%GTbyGB!ppZqmV`0B&kwR?`DyV@5J|`sL+s)S}9>u(a}-g zHrF>lvFbEcda>1MgQ%!Ael`$y2Fetl5nof@IqFUTDZV-5v47$YsgBQD<6?Spt31?9 z3>jf*eZfUM`Y`Zn=9g_VsvAlG6)0=zmwQ)*W>#;*m=57R6JW z=LU+xn60fYQRR1zanerRH%44wCy7O$6$`TG$rQ`q1<$U1ihbYx@BQk-p;u%{>#18u z_BKtFPbBtQDuUjGw>d<3qPz2{nBfz_;#=r2^|xZ1=cT6~L&7&}yk{q0uaFG&HZSsG z@RFR*qor0%dp<>WQcV1^>3b{3Cmt-+h0Cn@?0kMn&U0S*7*E8k_phsIy!a1*KY2tJ zWi$U+A%pV}77d=gl;*c)=i0vh)b2}FJ&%0nlaQYt@ZmJNOPoqb#x@i+lbsE+&Fyd&HauEc z*Nk}sUVcz;L`4IA#U+@S^Dy1E1#x8_n&#slX1A83dh*3^tGL?}^qq=Q(=JM-X~9xo zQ!p;m{h@1sbkTq|%G)6IcRr6HbhFLp?(Jm1;hZm88D$&W4+qrGC+NPhg~Oc)V->8B z3(9+uH)x~sU7kkMF8FP?w49KBt$lnP7H&qymkiNHH#+k|sRS&Qb6*`u%{eJ=dCYwa zA|0=6{{9bedpsxa2)%7`|33ii)c80_Yay@sI{w%;iI%$i;Z~CKfYi^^?L1ZfvaTl9 z?2YN1+v5Q}uNV$4Mnvc)MyG86Ye{^v^Ud|5?crxmRg@4900Z z5Y~V>ae$B}s0^xf174?Gr3ukAT-&)tO)k$%U1WJ&BzV;iZ)1@y?wsIo4F&5)VHjh4 z<3&Vbo5~_m3$nqx$)+$a}jZ~20ETeF}qfMpV zK#i7v4O&PM99NKzRf>g4(C+4uy+zbV0PRV3BY;PGI54^j0`b(E|7_gs$hq@Uascki z$li^bze+f+=>J~6@VNS)q>fAa{R8GFDJMB4NNQ(pxU~-VkA@4OaH%RC5N{MPdjyUg z6@u8IF|=A3 z(R5AavaED!9IVKySR}6+%oz`-IpM*CHD3y&N`0?`B1Bs&BkV6nm8ODcwKfQec@*Lf z!c)S+hLy@$KJ`o43i6g*KaiCRKZzQTNFkESLc$^*Nzz`LYC(Mc%Uk&Z1Xr=|St@fX> z%4xZaH{poi{>GQLsxeD&35`ip`&uK-5@L10Z$1E-!a4d_-CgG{{fWX-Eq&B{I2Z^x zzMK%wO0KDV#`xvhQMi8(&cu5$CIaM`;^{cbC|;Zqz5$9vN6o1d>L`5`(UybaBbPC? z6x>HZz+p9=U!qyR>uBMbK_26B`xNJ@x}e}FWIDMp;n|c13uX2?mzLeWZWirt*pckm z)yrvwN4P35bJI8U7pdWnocZ#PiL{`2u@UFxLMBRYsqT?$1-lqarO`nuBW+1MjgDrR zmW8Dm{y2)Mf)zl;B*bZG6GJy9v`Mjw*LN)#Y4zrJbkg^A>

Z?m!FyU8ysw8Hd^5 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

KN|=5O=7k8g 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

g@-sLN;l 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�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�RgsDB8CJIp!Y$?c$+{ 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

)GI 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≈hN69Jnc3r#0 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�VO_C|t;ekfvwydMS?|6L^-x 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%0A#FuIM# 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Ν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�*FI4M7}kTYk>Bs6mb=Vrg08^rCEvC%+7ktz$KQmjaF7zF6^67O+?% z9EJRn@>>{j*Sy>img}Z4sSj;_o97dzZ4<{^UOn42m>R1wrk>b12`dnnK3)Jilq2}x z!d+6i-5Z{rv|ft$ZTo^w^uluUO3&`O3_E$*#DO}>@<}4b(xOI}Vq}y7dDB9n#9Juj zb#*(P^Wyg5#?vJ{{4gJIO|T(Qp`YsE7Qo2+1!^0P$JC9%OcX|Mg`EI|(Cc&?k)a@7o%Qn}GQDACvKg7e*vWF1=b z2O9m)D!GK$^Evl3IggvPz@IW&8MXXc@CkX+guhMpxl&MoB}qwO zG+3k5T=ux|7Nv%lUtwP~oCJ<{D!}=Y4Oh#w#1#6AK)| zCZL;5TISmp@7E0k$oYckWigFDA|^(R$& zShfR=OK#wNCZG(cKLiH*7#y0^i9v5KW{D1P4Y1ox{`>~f6&Tseb9E}emX(AclWl_) zKt5^nV?}J+b6v?SEMaMh!J&y*j#G1o`nQ}O^Rmbj3_Z`P>1gMR810L(l^vL#`u*}N z{hDS_@;2VrM3$O=l~7};y#4y{CerqdlzLJFrJ&H`M?I4|4s4S$z(}gkvYO0& z8#rbCE(P)4;XX!^p=w?VLW)b`0oJTlX7p;$ZGZzRBa_m%+O~?vM`uN6&R*sEdeN}} zq#KT?ELMQw#5Wy78~4s+JbSU(!@oTPForo|oTa4{^;3Zpg)|Nev%R@Hp7l0Cz$;5F zaCDVyAoI1qVKEcN4Cw`A5(?4cEtx4_KB_GN1l~OM7)+KJ2^P$v;1i}d0RK*6@^O$< za=|-SLt4hP!sPE~U3RV~kLLCyqUl1w7%jB!u|#vVq_R!lFwrr#4pNi>rZ^vHV{A4w z36dT+yRdne|FO@=7o39{JM`f`;HQ0NE{7t`h~D!rAC{qtQYvH55k55Cxn^V&G%zCcCmvN5xuI;hR>0d3Hw z`h<~A?#HA!-+OX8buVtejyu)FY`}ysV>@sw5f$Bc&Kf@%c>gt1)*j&!aEW=53z;oi z$?j|T@e?gDihKFz1viMkd40mP}!BSYk)+#8yi7FC4+6-;7TTULH5b5^QfDb1MF6i4- zk;;v-AGh!@Zb-|x5Jx*s!P+2Vy2lG6N`3W5dD!hXJv2}cdr!8>2P&xuY#!}}rP+FZ z;VG!;QxoT)ny~4{CyBz#aWVL>dh740oGA3VgwOmx=QK+w$~*vL>r8n z)VKDvy^xTia$8iJcSU-odR~~#gz2+^cGZQIaoqU5XnlgSJGs)YbJxa;_sPqK9!ec8 ze>tQ*p0h6gEF<0?A}YBd7vfU=L;b7x!@`&mavldW7gfeqk%2#Ycf(UT5|jj8#Js2~ zQ4d3p6^dnHGM{`g)NTb!&r*s(xltEWBsA#sTPgAN?Gq`P6a)lOuciu*$^=k}q6C!Ji{1AjDcj z_XImU2+u{dZvQZrlJeuo5s0RrUgfN?{n#!Sp)#yEy89_3e0$*G?K`FmI#p9};e^;x zn}7|DO+iqx%7p?N=SRxP$w!c-UZ)|%;h{0LUS%D!xXHq@8j)^5V;G;sISD|!9VSu> zVt7`sYo3r8gBS9a9a67XBS>fsjIqa0kL}DVmyxn1Xff}VR0_ItUN+`iAaS#Z6MD1~ z1svWG>;Aa^J=O^vpUzEEP+YnLEmLG~j-|~bAdSr@;xny}__>PmcR4G~-SKt>hi*Iu0bB3)qKd4|YwVl54 zvOhq^f(}-BL9}#k-hOV-nNtpf&TDfDmBf_G%J8ro4T^8=YG_I(9F5*1FiOg=qt!VL z4cm-xjNP$;&?{Hz##(L@mk%TEzDm8NC%Zdo@}RFy*s<`ki&eOawvM^sSV45b{m~Mc z9oK?vkK?aJON0BZ!mi#RP@v*PruC097FYB%ZzD�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�>bWFX0LIAl5hbvEFU9W07jWW?T|Q0KnH9G4?~vh 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

*T=~`HtoW=Je#``n=8XSlJM9 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

MnnS#?+nzsUFLa<){$HKs`K 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 Pd}qSfI;9Db|8D{S&{!t+ literal 0 HcmV?d00001 diff --git a/src/images/head_bg.png b/src/images/head_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e45f6911fa3d1616d0b75a122161a3896aa3c4 GIT binary patch literal 7881 zcmeHs_gfQNw00;0B1NQ2Q#eOdno5-_N>M3_bP)nd5dwtXNl-)(1Vj`Ngir*eOAS4s zq99U22|WQRp(T{i)9!H2`M$s5{&44+C(lYUvuCaSuJx{W?|F6K)R2??EISAU;=FTP z?*RzJ8U@(yY%IX%l&Ll&2qgaIj-IYX$VbAASFq^f2kFhShc)HWQ?s+Iug|MoIGDKN z7Q_~EEtSb>smoQ-_U*c1#=R>NZm3Svw>{r_+Q(hoR5TR-dhkztzhGY6bL7SU4f(%$F7?2mk1iAOU}xol{{YQ}$kj|Li!jJC{|CEGcKt6q!vw)z zQtN7q-a@Een!W(q+Rp;V{1kEN?}X6~7Xf zt9Vr|wka@t19@{+Q*uCZARam_!pKxE_>4ab-KHH-71ZM6&I&v>k&y7Bj?rP+tp$X! zzC`g#-tMb;in~zotTs-mPE5`rw^jWO%VlB|g@H@?7A3E?_ zjJlRy5K?*WA75-t=-s*aWyrJe>O>H?L0C3UiDF_%7l_He(WvDSQnxx<(>-ObV<^q+ zeFAldZ93;{a|X-VSz4KPW6i1Oh0(ZCW0I#5P>LNtzP#;dC=J>q#XR!#?vDXs%rPc# zJJmY}SxGdnn07RB_$)yiIfc&B5B>xd4}~1~Tw+dIo>t=nVJw@$yf)RsmIFUhtXWVp z!gDgmcnf*=a>C0hIc-WmhxB{EFON6Aj$(ajaE1~@ypRXQPojF11}mDa&V76hBAPPI zoIRL|hl!x$T$MD=`#>JAv??E|)?m6dH1r+cZ^yf5qvC!=D=`SvkI_}JBJB9c&JDkB z_CVTzI(#0Q988fv22fYQ5-R1ao2og&+N==_*)tXc^)S0Rs1&3QBiQM4jq0y=1|(Pz z)pC{xz5b#j^sg~y@7VUxx}qq7N>Ew-P;{;(!J9?&cSYa<$66spFbAoC9&7_ouW&w3 z*Enm#25{4rM`^tMSeXMklpYSk9#!(Hp2NvYpo3{xm9bH46{*PB$WL>%E#RdE6-6gq z1T(3vJsL*tzQl0?;1ZReP3ihr8H;#Tv6ffs&aHRM^j-dX$!)e8%|TIwBHoQQO_4r& z3$3StTFYOCHE2%CBl;_rJ=}Y@MWRynR|qFQL6uIs`{}j~WCXc0&08 zgdz*jagX0X^OP7HRhi}0LrHt8m!8jJa&g{5j|MMsl>cJqda0ggwO9`;a|qi^m~yMm zdv8chQ|KAw3QZ_SiZUbb+L?!a>Lj+^bod9xBb$WH;QO0X8uuIdSd6O2XRSoB@@C%Q zARTl2t9Or49Q*bGK59WQ)7#OBE`QrTurixIS#Vi# zt}t45{QfT{T!E5@s@S0&^H-+lvwync(H%4B&i$M-50Amzbd*!2*jsLDIIiNK;mm{C zm1}ka@chXYxjJTJQl7HkhGr(x=?42+tr0b2xtpqwZ-Az$EM2^$Zc?j;zB4ktk^I8h zqleS!7WK=0Xm+2kaQOHyk}*qm#DmPjT>9MkiGpu_f5ZFR3gETN4j=MF`j@)w_M*;( zl%P9qIs!~E_vOOe#+gniZs+Yx`fcK>k;{BD{@fdeWa}kV?}UIe_mzk=bnBZN2e6_E#5E&XxJxFNok zP*o0bKIYfDx5i2SNJ<}3YxhxV$4khVwb5xP{BwBsxK8{qmC%Ed7x`FqLmdRdGk$e_59%o58 zI=hcYpuSTu?DTqeMs~|E=ktWI-rAwM!IgJ||3tdmkhvK=_!;MY2XhiuTzuiNM_9i3 zFzKOIcApW2<4AwviR^16>&p*srVB3YAd(4ak2sM<%Q0X2wmsa2!baIJ{%B5uCp_A$s`f-ssC zg7ArtT{}B^)7e>v%hXeJic_67Xz%0WR#*CI&@Ai{7L`S45aKySP(kQ_=S54<*rOO6 z=kMStt98=Jv@Tk8$xL!z|I90^y{!Eg9X#$A|0z(Ldk`L4T5$x?c>klm@ja98Gff}3 zaj4A!>w>A!k1sp4rx`jn%h;m;J`>;}7wAyr7-#F4gdH=+6?9QbAn&?#5gxQ!z`DYI zvI!AOpO_}JpH`D>{tvD-*NU&W(n|=bgmD#R;b7>%BkJxHeZwO_<8?u#4CrO2r(nmI zJNIVqGR<~9W$g$rfUn|HmV?Ak*+x0tuUDvnKd;Ob`7V!xwavJmNnI{_Vfqz2 z`l6$^0_e}Viw>R8hvr=H;k7-k%Tk}*{koJ_c5Bwk z_w0J5(gHs_(3)ix*2OGv4~eE5triD%%qSkh=6=7lH9V4rN4@es$ZAkxOFHeX`+XMj zWJ){A=}k_ZB@7Jimi#j(6fpxH)?r%nn(fA=4p95hKgRb8{QZL^CI9rV?cIA_q&b3s9UV4M$sNJC2tTez+FePl#W7TXrOH7%k; zI4mzUFv*5w21D)D$UpAM*GZ_H5fV}fEeXWp4J99!|LF|)>=TN8YBF56`?PPNL71oS z1Gj?xRPDxn6&3BKa2V`-!)p`mYfVp}BurxOShMoR?{(OYV?$tshjp@>u&qZt`t zPsx;-7}Me#dUfe`r)-^jsQKW$KyRC{qR=!K8SQ8>fTTQD+{%f5N4DhwZMel)R5tB> z8|yuZjPVA1i7aGvfrOOLp(7D(Vt44hv|_NP=2dE80T1DvC$07r9(&Mpc-w%p%*?zX zbBXp%LHt9;DrVu7KYpN{HeY+kWYW6n^k`&8W|8|EI@4@YfnN$P#WKJv2f`?MY1xg| z>19VFA=U~G;XBn;-_t61!)Ye+TI8*o!m<+EMh{6vaOXoIQ^G=w80by$%8j1I1Uzo1tvex<+=Kf8*MN zcH8{5q~L;k;+l~@e&LV>D1>ieJ;onOX%sp!!TvR=H6mi|dr~UT%(?YGFeMkSxWa4b zpnbi_z{DPs3D+boL2z)Hw^3^DX4M>Du5@NB;gX+Itj+;9;DvfB`%LM$!&u1A0C;pBc9qcT7qk4&WKl;3d58V)6V zCvM2QZ_m8+t7Fuz6;@i=Fh4xNEHH1jRPm9L$*{OH#7fq%Mn1nyf_(66N@63Na=XFB zGh%~6x%t{t7^g_xq&0?8sgOH;zYE9+qOq`6jZ4J9&aLFGzO{{kI(&MlxXW8kTOR=bgWbM$S*@eBfdoH#G{Iq^tv(H{4f^S$G&y%79TUg|^BOB^+ znOrG0=sP>Ma8Hz4X5KcpF@u~08in9Q6Q6wmvZS@nVfeUQU0yz5?g$NdpI%P`=N7qh z7wLCVZ>QBd+Y9h)ZM`Rrh25M*SKM?|&MI}S<7dPpD^c`2TdF#wxx%#;39UC?*%{ct zed0|S=A6libRNW z;@aI2u{y2h1xpFBsQD?QxefYfc6e`ZG_fjJr?kkcLEzS=B8QR8j;tVqPg=Qgx@u}E zI8zK+#Azt2SE=1Va(D`h@G)+98=LCXMZ%o&hMNY%V&ZglePosiZA1&?w|sRW%>RpRYNP@k zC%a}6t?>+cb#h<46MA)372;g&6?Sb2uU*0gM-n10_dWy?n^=)R*hCI*Y#*dRMRDp| z_d_S~PFx!!pAYku3sX=C#9=a=O5VvtEt;W1E!<9QGnt4a2{2*246@>LRJ8s+Lvg{>xTgc9G{2T#-LZ`GFDoAZ~KnAQ41#L0Kn&xGucBt`nJ z{a{7#O?CZ_O|RUTBrle;J^R^Ux-qT3Te!5o0iP0Nyl1Rc7wH7c<6UwE6u4Ea{u!b{ z@O5>2!CQk(`R)MmAD=45a)%xP7(=(a`0kozQ>v!gftRx_ps0QTimGfQhg{r?=B2?1 z9V7oFs?5T})^O6FCRNx`(B#@atKqgU*S%szTAUdZs`A9wQ^4 zmVRedMe2whW;M93G_-P*qe@%P**k1-Z0k1c;6!ZoUdzu5TBt5&`#bpB)yqptn$mZ1 zSQLU|d25n>w82Bws50==`0T=i4guKun4Zl4l^`Sy)d7d5gVm;;a81(JVACJn3n!I5 zJnpAz9e>*ynWj+>WzuO|gxd`W-hs%q2&%Q>jLOcZNzHa}lY{8VY6Z+FWrg>bNKcQ$}U#I^`dgtsVWp5 zlMII9#FQd5C0}%G=KiIzTdMeQs3Z8VyK~TL%K9ms*861RkLxUt;cCH)L-gwi7{blr zpnnTHXq=eI`G`c3k$xPo8e&HJIfZDC+#S*>Jnv)0^$dF4yA1iyZ(>&3$Zl@XV8&_F z)1qc#EJ$L2;0YA4W?^!1KRsPLE^^e6*0Ltm`#3D@nl^&ks6d$sUWTw^D2+JWvldB2S80zUywy%d8D%B}<3i}a@8RMK@jR^Jt)*f|52T{Pzs|O&q*j=v zXt6#o&Vet6q`hzjGOMIWj1l})XPW&PeckS-K?6~()q;(()058i+GJw_JhBjqWrs~c zW8HEY`6qt&GVA~_e9LVd} zT1ao5i8sO%hs)K&Yt&mDspVI<$CK=1Yjl3Ml3E^H?jTI=J5;$(9@YKugH+nLZT4Uz zV{59ndS)ut3QX5?CbynWH*a1nlKC@p_a7lkBXts-)ob$W zE3NBC0;}?O@3u!AZZGzxD}av;%ibyjjLp%*j>MsP0tBQwG+`3x&1^9^K6AO4Qpf@5tE*rF1b27`swz=5)mAOwwL!#w5ulsE-z(c*A1Ijj4 zotQU42_!fL$=y#~x1L)U7rJ2UXNTQVxX#%4S!)-_%F71&X$GdWvH6MRovT3UJ{s0I z6CymUs}s4psE`buA|Fgo6S`AN5T~-qi@Vrszyg8gm%6=JSA2P7>U%5XS6oR+&%wN# z1UMA`yA1W}y$Siz)$QOtf+C7yHsIDxjRk8~0d@DbJKTMyeT!&#{Ua)Zvc^E|iW28^!_ZXC0#J*+#d@+4u%OUhOrlRj3s zJ5gUI=(e|$#EcykzkYb9MZVO)wDdS7dc?x#f%SpDi8g6Yzckz&+C*m{ z@8pRZJN41-2UD%#YXIr00~-Bu<)Iyan$|y(I8~#!;1W<~cTA)ya-W>M&k|LP)@m23 zb6^H0!b=pR9pIcDRf%1IGw<1|Ut!-k&nOWN1Oi(xJ8K_tW4i%fw7pi(y5% zp&mSK$>xb?c<^7FZev*TavMBU=b_XyL&<#KgAeK44F-(3mDZr(L8u=U*GhLDFAW4( zBFiMrW#1;fek^dz*u>N4?we1nplEgsSMG-+-E_17F{^X?)@;a9%*Mxz$-P3} zWA0wVV=s$c(FPbk38+L;CUPpcHty+1$|^G1YpR<3)XbmsBX%Q)zE8J((UBM@bbWgr zEH>Rl?%=KFxCREaYUkye*}I7TM>Im0Dt(_d#h4sHxko3ZYP9c+TgPV(c=tb2BOfK> zl8ANnTfa$FqFIx)+xz~rZmRulz>;?lW)(quKM$}^Ymv}lmZ2VPePtsj<0JMG<%EY^ zLfi~mY+`t2IuUz*G|)U}C{OL;s_2csd%LJR%^;qo!`NLbZRG|{PQ6jTP?XhAsz|wB zsNF@VYFEJJm95U(J7BjK4>Hhi92b9$iO7KwN(7`aSz&nXLt2%2sYGgDrAIS<8`yp9 zU1{KR(s;gWwR63Qn&PhGV)?^XQ@{)d>kWX9rurr|oMH)_#_S3{xVW?l)muv+x>zCO z5&yHm;z=?0np;VvWwVz`L5m6gJm_Ujsn?|$?|84`5Cu6=nv zDud5x%^*9A4AhRt2&#Id?AZ8@waS9ivE(6mw^jXal{wbEpeH)(5R^yRkPUuZeBPIb zvSfzS5g5OHr0{mQ<(m=rYJA|$%gf47^&%%H?tj#hK7I?;sFTJE!a)``T-T>!!b{kr zSmgw%=iPC)tHo_}+;LB&O8r|cEMHpx-0#{Z!-^9P=nVP-7143q3SYcgvR6_|R|hL6 z51Ec*u?WQ@-$pl-{w&+$0s8As=Jpdy=^Ok%nHM)zwX!OSZbJZXXtG5Y70a=9tTdOp zBMJiGHrmmpW~5w?w6KW5y_%6VV5Gs>_qv_XOnRYWG{$Un>!viw;q_`iZb$GzG1z!C zsayt-#HD~9h5o6A3(MQ7@croK>v1c$-)=&+d`S zr&6xZzs~y{-YBDJIv$iS{BCO|;vD7po_Q;VF=79FuP&@C2IA>heaHIgT{O0IEzPRW zlP%z6n9~!PrhI&rPJmEDcD+TWO_1dSS7=w={trby%DnD1D8SJpq1wBYgaUl z7a1XCtLI80eCmZ=Ie<}YxT9Ih-bu)eG09jf-`CS&p_fw@Eu9!>FtJ@yjq9NHojmcN=T?D21X@`b`9jr>v1zZI*j@ zrKWCq#&&4!%k~?Q97nVBOg!aUc?tk5)ZnTsLI;0XcHNiPKq~n;pb*7-ha4jaZbKis z+VPN$^c}AbY5|n#b3w#)4ONXBj#8UWY%de$k6%tL4p%XJ(?_v<;o;DP9nfui9b_S? S4ims_pga1edX+aFpZ^cs0d1uK literal 0 HcmV?d00001 diff --git a/src/images/inp.png b/src/images/inp.png new file mode 100644 index 0000000000000000000000000000000000000000..9609ab3a092d74330131b23d391711a8740fac54 GIT binary patch literal 9696 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 literal 0 HcmV?d00001 diff --git a/src/json/1990.json b/src/json/1990.json new file mode 100644 index 0000000..ffab70b --- /dev/null +++ b/src/json/1990.json @@ -0,0 +1,2135 @@ +[ + [ + { + "name": "\u963f\u9c81\u5df4", + "value": null + }, + { + "name": null, + "value": 304354.8827 + }, + { + "name": "\u963f\u5bcc\u6c57", + "value": 2380.0 + }, + { + "name": null, + "value": 97925.79689 + }, + { + "name": "\u5b89\u54e5\u62c9", + "value": 6560.0 + }, + { + "name": "\u963f\u5c14\u5df4\u5c3c\u4e9a", + "value": 5980.0 + }, + { + "name": "\u5b89\u9053\u5c14\u5171\u548c\u56fd", + "value": 410.0 + }, + { + "name": "\u963f\u62c9\u4f2f\u8054\u76df\u56fd\u5bb6", + "value": 636128.9932 + }, + { + "name": "\u963f\u62c9\u4f2f\u8054\u5408\u914b\u957f\u56fd", + "value": 55210.0 + }, + { + "name": "\u963f\u6839\u5ef7", + "value": 100320.0 + }, + { + "name": "\u4e9a\u7f8e\u5c3c\u4e9a", + "value": 19850.0 + }, + { + "name": "\u7f8e\u5c5e\u8428\u6469\u4e9a", + "value": null + }, + { + "name": "\u5b89\u63d0\u74dc\u548c\u5df4\u5e03\u8fbe", + "value": 210.0 + }, + { + "name": "\u6fb3\u5927\u5229\u4e9a", + "value": 263630.0 + }, + { + "name": "\u5965\u5730\u5229", + "value": 58270.0 + }, + { + "name": "\u963f\u585e\u62dc\u7586", + "value": 53480.0 + }, + { + "name": "\u5e03\u9686\u8fea", + "value": 170.0 + }, + { + "name": "\u6bd4\u5229\u65f6", + "value": 109310.0 + }, + { + "name": "\u8d1d\u5b81", + "value": 330.0 + }, + { + "name": "\u5e03\u57fa\u7eb3\u6cd5\u7d22", + "value": 500.0 + }, + { + "name": "\u5b5f\u52a0\u62c9", + "value": 11520.0 + }, + { + "name": "\u4fdd\u52a0\u5229\u4e9a", + "value": 73610.0 + }, + { + "name": "\u5df4\u6797", + "value": 10740.0 + }, + { + "name": "\u5df4\u54c8\u9a6c", + "value": 1960.0 + }, + { + "name": "\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3", + "value": 23970.0 + }, + { + "name": "\u767d\u4fc4\u7f57\u65af", + "value": 99830.0 + }, + { + "name": "\u4f2f\u5229\u5179", + "value": 330.0 + }, + { + "name": "\u767e\u6155\u5927", + "value": null + }, + { + "name": "\u73bb\u5229\u7ef4\u4e9a", + "value": 10410.0 + }, + { + "name": "\u5df4\u897f", + "value": 197900.0 + }, + { + "name": "\u5df4\u5df4\u591a\u65af", + "value": 980.0 + }, + { + "name": "\u6587\u83b1\u8fbe\u9c81\u8428\u5170\u56fd", + "value": 3260.0 + }, + { + "name": "\u4e0d\u4e39", + "value": 80.0 + }, + { + "name": "\u535a\u8328\u74e6\u7eb3", + "value": 2810.0 + }, + { + "name": "\u4e2d\u975e\u5171\u548c\u56fd", + "value": 150.0 + }, + { + "name": "\u52a0\u62ff\u5927", + "value": 419490.0 + }, + { + "name": "\u4e2d\u6b50\u548c\u6ce2\u7f85\u7684\u6d77", + "value": 989030.0 + }, + { + "name": "\u745e\u58eb", + "value": 43330.0 + }, + { + "name": "\u6d77\u5ce1\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u667a\u5229", + "value": 30520.0 + }, + { + "name": "\u4e2d\u56fd", + "value": 2173360.0 + }, + { + "name": "\u79d1\u7279\u8fea\u74e6", + "value": 2710.0 + }, + { + "name": "\u5580\u9ea6\u9686", + "value": 2900.0 + }, + { + "name": "\u521a\u679c\uff08\u91d1\uff09", + "value": 3180.0 + }, + { + "name": "\u521a\u679c\uff08\u5e03\uff09", + "value": 3200.0 + }, + { + "name": "\u54e5\u4f26\u6bd4\u4e9a", + "value": 48730.0 + }, + { + "name": "\u79d1\u6469\u7f57", + "value": 70.0 + }, + { + "name": "\u4f5b\u5f97\u89d2", + "value": 100.0 + }, + { + "name": "\u54e5\u65af\u8fbe\u9ece\u52a0", + "value": 2870.0 + }, + { + "name": "\u52a0\u52d2\u6bd4\u5c0f\u56fd", + "value": 27580.0 + }, + { + "name": "\u53e4\u5df4", + "value": 35620.0 + }, + { + "name": "\u5e93\u62c9\u7d22", + "value": null + }, + { + "name": "\u5f00\u66fc\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u585e\u6d66\u8def\u65af", + "value": 4590.0 + }, + { + "name": "\u6377\u514b\u5171\u548c\u56fd", + "value": 150200.0 + }, + { + "name": "\u5fb7\u56fd", + "value": 955310.0 + }, + { + "name": "\u5409\u5e03\u63d0", + "value": 270.0 + }, + { + "name": "\u591a\u7c73\u5c3c\u514b", + "value": 60.0 + }, + { + "name": "\u4e39\u9ea6", + "value": 52090.0 + }, + { + "name": "\u591a\u7c73\u5c3c\u52a0\u5171\u548c\u56fd", + "value": 7860.0 + }, + { + "name": "\u963f\u5c14\u53ca\u5229\u4e9a", + "value": 62940.0 + }, + { + "name": "\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09", + "value": 2672061.7740000002 + }, + { + "name": "\u65e9\u4eba\u53e3\u7d05\u5229", + "value": 2616614.0219999999 + }, + { + "name": "\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a", + "value": 4510718.5599999996 + }, + { + "name": "\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09", + "value": 3845991.7930000001 + }, + { + "name": "\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a", + "value": 7975648.0820000004 + }, + { + "name": "\u5384\u74dc\u591a\u5c14", + "value": 15420.0 + }, + { + "name": "\u57c3\u53ca", + "value": 87750.0 + }, + { + "name": "\u6b27\u6d32\u8d27\u5e01\u8054\u76df", + "value": 2622740.0 + }, + { + "name": "\u5384\u7acb\u7279\u91cc\u4e9a", + "value": null + }, + { + "name": "\u897f\u73ed\u7259", + "value": 214950.0 + }, + { + "name": "\u7231\u6c99\u5c3c\u4e9a", + "value": 35280.0 + }, + { + "name": "\u57c3\u585e\u4fc4\u6bd4\u4e9a", + "value": 2310.0 + }, + { + "name": "\u6b27\u6d32\u8054\u76df", + "value": 3562590.0 + }, + { + "name": "\u8106\u5f31\u548c\u53d7\u885d\u7a81\u5f71\u97ff\u7684\u60c5\u6cc1\u4e0b", + "value": 440846.9422 + }, + { + "name": "\u82ac\u5170", + "value": 54560.0 + }, + { + "name": "\u6590\u6d4e", + "value": 690.0 + }, + { + "name": "\u6cd5\u56fd", + "value": 356240.0 + }, + { + "name": "\u6cd5\u7f57\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a\u8054\u90a6", + "value": null + }, + { + "name": "\u52a0\u84ec", + "value": 4100.0 + }, + { + "name": "\u82f1\u56fd", + "value": 561770.0 + }, + { + "name": "\u683c\u9c81\u5409\u4e9a", + "value": 33490.0 + }, + { + "name": "\u52a0\u7eb3", + "value": 2790.0 + }, + { + "name": "\u76f4\u5e03\u7f57\u9640", + "value": null + }, + { + "name": "\u51e0\u5185\u4e9a", + "value": 1000.0 + }, + { + "name": "\u5188\u6bd4\u4e9a", + "value": 190.0 + }, + { + "name": "\u51e0\u5185\u4e9a\u6bd4\u7ecd\u5171\u548c\u56fd", + "value": 170.0 + }, + { + "name": "\u8d64\u9053\u51e0\u5185\u4e9a", + "value": 60.0 + }, + { + "name": "\u5e0c\u814a", + "value": 75620.0 + }, + { + "name": "\u683c\u6797\u7eb3\u8fbe", + "value": 110.0 + }, + { + "name": "\u683c\u9675\u5170", + "value": null + }, + { + "name": "\u5371\u5730\u9a6c\u62c9", + "value": 3930.0 + }, + { + "name": "\u5173\u5c9b", + "value": null + }, + { + "name": "\u572d\u4e9a\u90a3", + "value": 1170.0 + }, + { + "name": "\u9ad8\u6536\u5165\u56fd\u5bb6", + "value": 11662286.3000000007 + }, + { + "name": "\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a", + "value": null + }, + { + "name": "\u6d2a\u90fd\u62c9\u65af", + "value": 2450.0 + }, + { + "name": "\u91cd\u503a\u7a77\u56fd (HIPC)", + "value": 61205.0312 + }, + { + "name": "\u514b\u7f57\u5730\u4e9a", + "value": 20340.0 + }, + { + "name": "\u6d77\u5730", + "value": 1020.0 + }, + { + "name": "\u5308\u7259\u5229", + "value": 67420.0 + }, + { + "name": "\u53ea\u6709IBRD", + "value": 8938244.4169999994 + }, + { + "name": "IBRD\u4e0eIDA", + "value": 9360337.7430000007 + }, + { + "name": "IDA\u7e3d", + "value": 421130.4774 + }, + { + "name": "IDA\u6df7\u5408", + "value": 281883.7732 + }, + { + "name": "\u5370\u5ea6\u5c3c\u897f\u4e9a", + "value": 148530.0 + }, + { + "name": "\u53ea\u6709IDA", + "value": 138844.7934 + }, + { + "name": "\u9a6c\u6069\u5c9b", + "value": null + }, + { + "name": "\u5370\u5ea6", + "value": 563580.0 + }, + { + "name": "\u672a\u5206\u7c7b\u56fd\u5bb6", + "value": null + }, + { + "name": "\u7231\u5c14\u5170", + "value": 30960.0 + }, + { + "name": "\u4f0a\u6717", + "value": 198470.0 + }, + { + "name": "\u4f0a\u62c9\u514b", + "value": 64210.0 + }, + { + "name": "\u51b0\u5c9b", + "value": 1950.0 + }, + { + "name": "\u4ee5\u8272\u5217", + "value": 33810.0 + }, + { + "name": "\u610f\u5927\u5229", + "value": 405260.0 + }, + { + "name": "\u7259\u4e70\u52a0", + "value": 7470.0 + }, + { + "name": "\u7ea6\u65e6", + "value": 9930.0 + }, + { + "name": "\u65e5\u672c", + "value": 1090530.0 + }, + { + "name": "\u54c8\u8428\u514b\u65af\u5766", + "value": 237250.0 + }, + { + "name": "\u80af\u5c3c\u4e9a", + "value": 6140.0 + }, + { + "name": "\u5409\u5c14\u5409\u65af\u65af\u5766", + "value": 22760.0 + }, + { + "name": "\u67ec\u57d4\u5be8", + "value": 1260.0 + }, + { + "name": "\u57fa\u91cc\u5df4\u65af", + "value": 20.0 + }, + { + "name": "\u5723\u57fa\u8328\u548c\u5c3c\u7ef4\u65af", + "value": 110.0 + }, + { + "name": "\u97e9\u56fd", + "value": 247680.0 + }, + { + "name": "\u79d1\u5a01\u7279", + "value": 29130.0 + }, + { + "name": "\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09", + "value": 734540.0 + }, + { + "name": "\u8001\u631d", + "value": 510.0 + }, + { + "name": "\u9ece\u5df4\u5ae9", + "value": 5620.0 + }, + { + "name": "\u5229\u6bd4\u91cc\u4e9a", + "value": 450.0 + }, + { + "name": "\u5229\u6bd4\u4e9a", + "value": 28600.0 + }, + { + "name": "\u5723\u5362\u897f\u4e9a", + "value": 190.0 + }, + { + "name": "\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a", + "value": 902966.2182 + }, + { + "name": "\u6700\u4e0d\u53d1\u8fbe\u56fd\u5bb6\uff1a\u8054\u5408\u56fd\u5206\u7c7b", + "value": 66332.23975 + }, + { + "name": "\u4f4e\u6536\u5165\u56fd\u5bb6", + "value": 190456.2098 + }, + { + "name": "\u5217\u652f\u6566\u58eb\u767b", + "value": 200.0 + }, + { + "name": "\u65af\u91cc\u5170\u5361", + "value": 3840.0 + }, + { + "name": "\u4e2d\u4f4e\u7b49\u6536\u5165\u56fd\u5bb6", + "value": 2244488.8829999999 + }, + { + "name": "\u4e2d\u4f4e\u6536\u5165\u56fd\u5bb6", + "value": 8828738.3190000001 + }, + { + "name": "\u83b1\u7d22\u6258", + "value": 340.0 + }, + { + "name": "\u5f8c\u671f\u4eba\u53e3\u7d05\u5229", + "value": 6279667.9850000003 + }, + { + "name": "\u7acb\u9676\u5b9b", + "value": 32220.0 + }, + { + "name": "\u5362\u68ee\u5821", + "value": 11290.0 + }, + { + "name": "\u62c9\u8131\u7ef4\u4e9a", + "value": 18780.0 + }, + { + "name": "\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a", + "value": null + }, + { + "name": "\u5723\u9a6c\u4e01\uff08\u6cd5\u5c5e\uff09", + "value": null + }, + { + "name": "\u6469\u6d1b\u54e5", + "value": 21500.0 + }, + { + "name": "\u6469\u7eb3\u54e5", + "value": null + }, + { + "name": "\u6469\u5c14\u591a\u74e6", + "value": 30530.0 + }, + { + "name": "\u9a6c\u8fbe\u52a0\u65af\u52a0", + "value": 890.0 + }, + { + "name": "\u9a6c\u5c14\u4ee3\u592b", + "value": 160.0 + }, + { + "name": "\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a", + "value": 863944.0956 + }, + { + "name": "\u58a8\u897f\u54e5", + "value": 269580.0 + }, + { + "name": "\u9a6c\u7ecd\u5c14\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u4e2d\u7b49\u6536\u5165\u56fd\u5bb6", + "value": 8638739.102 + }, + { + "name": "\u5317\u9a6c\u5176\u987f", + "value": 8590.0 + }, + { + "name": "\u9a6c\u91cc", + "value": 10.0 + }, + { + "name": "\u9a6c\u8033\u4ed6", + "value": 2310.0 + }, + { + "name": "\u7f05\u7538", + "value": 4080.0 + }, + { + "name": "\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09", + "value": 538660.5061 + }, + { + "name": "\u9ed1\u5c71", + "value": 1920.0 + }, + { + "name": "\u8499\u53e4", + "value": 12970.0 + }, + { + "name": "\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u83ab\u6851\u6bd4\u514b", + "value": 1120.0 + }, + { + "name": "\u6bdb\u91cc\u5854\u5c3c\u4e9a", + "value": 940.0 + }, + { + "name": "\u6bdb\u91cc\u6c42\u65af", + "value": 1160.0 + }, + { + "name": "\u9a6c\u62c9\u7ef4", + "value": 550.0 + }, + { + "name": "\u9a6c\u6765\u897f\u4e9a", + "value": 54620.0 + }, + { + "name": "\u5317\u7f8e", + "value": 5265754.9960000003 + }, + { + "name": "\u7eb3\u7c73\u6bd4\u4e9a", + "value": null + }, + { + "name": "\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a", + "value": null + }, + { + "name": "\u5c3c\u65e5\u5c14", + "value": 570.0 + }, + { + "name": "\u5c3c\u65e5\u5229\u4e9a", + "value": 72770.0 + }, + { + "name": "\u5c3c\u52a0\u62c9\u74dc", + "value": 1930.0 + }, + { + "name": "\u8377\u5170", + "value": 148380.0 + }, + { + "name": "\u632a\u5a01", + "value": 29310.0 + }, + { + "name": "\u5c3c\u6cca\u5c14", + "value": 940.0 + }, + { + "name": "\u7459\u9b6f", + "value": 130.0 + }, + { + "name": "\u65b0\u897f\u5170", + "value": 22310.0 + }, + { + "name": "\u7ecf\u5408\u7ec4\u7ec7\u6210\u5458", + "value": 11338340.0 + }, + { + "name": "\u963f\u66fc", + "value": 11920.0 + }, + { + "name": "\u5176\u4ed6\u5c0f\u56fd", + "value": 84408.91967 + }, + { + "name": "\u5df4\u57fa\u65af\u5766", + "value": 59030.0 + }, + { + "name": "\u5df4\u62ff\u9a6c", + "value": 2690.0 + }, + { + "name": "\u79d8\u9c81", + "value": 20880.0 + }, + { + "name": "\u83f2\u5f8b\u5bbe", + "value": 41080.0 + }, + { + "name": "\u5e15\u52b3", + "value": null + }, + { + "name": "\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a", + "value": 2170.0 + }, + { + "name": "\u6ce2\u5170", + "value": 350210.0 + }, + { + "name": "\u9810\u4eba\u53e3\u7d05\u5229", + "value": 188709.7481 + }, + { + "name": "\u6ce2\u591a\u9ece\u5404", + "value": null + }, + { + "name": "\u671d\u9c9c\u6c11\u4e3b\u4e3b\u4e49\u4eba\u6c11\u5171\u548c\u56fd", + "value": 123330.0 + }, + { + "name": "\u8461\u8404\u7259", + "value": 41070.0 + }, + { + "name": "\u5df4\u62c9\u572d", + "value": 2070.0 + }, + { + "name": "\u7ea6\u65e6\u6cb3\u897f\u5cb8\u548c\u52a0\u6c99", + "value": null + }, + { + "name": "\u592a\u5e73\u6d0b\u5c9b\u56fd", + "value": 1617.8125 + }, + { + "name": "\u4eba\u53e3\u7d05\u5229\u4e4b\u5f8c", + "value": 11378373.3000000007 + }, + { + "name": "\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a", + "value": null + }, + { + "name": "\u5361\u5854\u5c14", + "value": 12540.0 + }, + { + "name": "\u7f57\u9a6c\u5c3c\u4e9a", + "value": 172630.0 + }, + { + "name": "\u4fc4\u7f57\u65af", + "value": 2163530.0 + }, + { + "name": "\u5362\u65fa\u8fbe", + "value": 550.0 + }, + { + "name": "\u5357\u4e9a", + "value": 641530.0 + }, + { + "name": "\u6c99\u7279\u963f\u62c9\u4f2f", + "value": 171410.0 + }, + { + "name": "\u82cf\u4e39", + "value": 5370.0 + }, + { + "name": "\u585e\u5185\u52a0\u5c14", + "value": 2330.0 + }, + { + "name": "\u65b0\u52a0\u5761", + "value": 28970.0 + }, + { + "name": "\u6240\u7f57\u95e8\u7fa4\u5c9b", + "value": 150.0 + }, + { + "name": "\u585e\u62c9\u5229\u6602", + "value": 320.0 + }, + { + "name": "\u8428\u5c14\u74e6\u591a", + "value": 2380.0 + }, + { + "name": "\u5723\u9a6c\u529b\u8bfa", + "value": null + }, + { + "name": "\u7d22\u9a6c\u91cc", + "value": 730.0 + }, + { + "name": "\u585e\u5c14\u7ef4\u4e9a", + "value": 61910.0 + }, + { + "name": "\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09", + "value": 402223.5339 + }, + { + "name": "\u5357\u82cf\u4e39", + "value": 430.0 + }, + { + "name": "\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a", + "value": 402373.2235 + }, + { + "name": "\u5c0f\u56fd", + "value": 113658.6093 + }, + { + "name": "\u5723\u591a\u7f8e\u548c\u666e\u6797\u897f\u6bd4", + "value": 50.0 + }, + { + "name": "\u82cf\u91cc\u5357", + "value": 1760.0 + }, + { + "name": "\u65af\u6d1b\u4f10\u514b\u5171\u548c\u56fd", + "value": 54810.0 + }, + { + "name": "\u65af\u6d1b\u6587\u5c3c\u4e9a", + "value": 13530.0 + }, + { + "name": "\u745e\u5178", + "value": 53350.0 + }, + { + "name": "\u65af\u5a01\u58eb\u5170", + "value": 560.0 + }, + { + "name": "\u5723\u9a6c\u4e01(\u8377\u5c5e)", + "value": null + }, + { + "name": "\u585e\u820c\u5c14", + "value": 150.0 + }, + { + "name": "\u53d9\u5229\u4e9a", + "value": 32390.0 + }, + { + "name": "\u7279\u514b\u65af\u79d1\u65af\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u4e4d\u5f97", + "value": 390.0 + }, + { + "name": "\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a (IBRD\u4e0eIDA)", + "value": 2548812.6209999998 + }, + { + "name": "\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a (IBRD\u4e0eIDA)", + "value": 4388662.176 + }, + { + "name": "\u591a\u54e5", + "value": 980.0 + }, + { + "name": "\u6cf0\u56fd", + "value": 89220.0 + }, + { + "name": "\u5854\u5409\u514b\u65af\u5766", + "value": 11020.0 + }, + { + "name": "\u571f\u5e93\u66fc\u65af\u5766", + "value": 44650.0 + }, + { + "name": "\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a (IBRD\u4e0eIDA)", + "value": 851080.0 + }, + { + "name": "\u4e1c\u5e1d\u6c76", + "value": null + }, + { + "name": "\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a (IBRD\u4e0eIDA)", + "value": 532860.0 + }, + { + "name": "\u6c64\u52a0", + "value": 80.0 + }, + { + "name": "\u5357\u4e9a (IBRD\u4e0eIDA)", + "value": 641530.0 + }, + { + "name": "\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a (IBRD\u4e0eIDA)", + "value": 402373.2235 + }, + { + "name": "\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5", + "value": 13150.0 + }, + { + "name": "\u7a81\u5c3c\u65af", + "value": 14540.0 + }, + { + "name": "\u571f\u8033\u5176", + "value": 139200.0 + }, + { + "name": "\u56fe\u74e6\u5362", + "value": 10.0 + }, + { + "name": "\u5766\u6851\u5c3c\u4e9a", + "value": 1890.0 + }, + { + "name": "\u4e4c\u5e72\u8fbe", + "value": 790.0 + }, + { + "name": "\u4e4c\u514b\u5170", + "value": 688620.0 + }, + { + "name": "\u4e2d\u9ad8\u7b49\u6536\u5165\u56fd\u5bb6", + "value": 6394510.0870000003 + }, + { + "name": "\u4e4c\u62c9\u572d", + "value": 3850.0 + }, + { + "name": "\u7f8e\u56fd", + "value": 4844520.0 + }, + { + "name": "\u4e4c\u5179\u522b\u514b\u65af\u5766", + "value": 117770.0 + }, + { + "name": "\u5723\u6587\u68ee\u7279\u548c\u683c\u6797\u7eb3\u4e01\u65af", + "value": 80.0 + }, + { + "name": "\u59d4\u5185\u745e\u62c9", + "value": 101630.0 + }, + { + "name": "\u82f1\u5c6c\u7dad\u723e\u4eac\u7fa4\u5cf6", + "value": null + }, + { + "name": "\u7f8e\u5c5e\u7ef4\u4eac\u7fa4\u5c9b", + "value": null + }, + { + "name": "\u8d8a\u5357", + "value": 19330.0 + }, + { + "name": "\u74e6\u52aa\u963f\u56fe", + "value": 70.0 + }, + { + "name": "\u4e16\u754c", + "value": 20625272.9699999988 + }, + { + "name": "\u8428\u6469\u4e9a", + "value": 90.0 + }, + { + "name": "\u79d1\u7d22\u6c83", + "value": null + }, + { + "name": "\u4e5f\u95e8", + "value": 6640.0 + }, + { + "name": "\u5357\u975e", + "value": 247660.0 + }, + { + "name": "\u8d5e\u6bd4\u4e9a", + "value": 2740.0 + }, + { + "name": "\u6d25\u5df4\u5e03\u97e6", + "value": 16540.0 + } + ], + [{"name":"\u963f\u9c81\u5df4","value":null},{"name":null,"value":298735.4356},{"name":"\u963f\u5bcc\u6c57","value":2230.0},{"name":null,"value":111479.4705},{"name":"\u5b89\u54e5\u62c9","value":6670.0},{"name":"\u963f\u5c14\u5df4\u5c3c\u4e9a","value":4060.0},{"name":"\u5b89\u9053\u5c14\u5171\u548c\u56fd","value":410.0},{"name":"\u963f\u62c9\u4f2f\u8054\u76df\u56fd\u5bb6","value":638311.6162},{"name":"\u963f\u62c9\u4f2f\u8054\u5408\u914b\u957f\u56fd","value":61560.0},{"name":"\u963f\u6839\u5ef7","value":105920.0},{"name":"\u4e9a\u7f8e\u5c3c\u4e9a","value":20690.0},{"name":"\u7f8e\u5c5e\u8428\u6469\u4e9a","value":null},{"name":"\u5b89\u63d0\u74dc\u548c\u5df4\u5e03\u8fbe","value":220.0},{"name":"\u6fb3\u5927\u5229\u4e9a","value":264760.0},{"name":"\u5965\u5730\u5229","value":62420.0},{"name":"\u963f\u585e\u62dc\u7586","value":52060.0},{"name":"\u5e03\u9686\u8fea","value":220.0},{"name":"\u6bd4\u5229\u65f6","value":113960.0},{"name":"\u8d1d\u5b81","value":270.0},{"name":"\u5e03\u57fa\u7eb3\u6cd5\u7d22","value":510.0},{"name":"\u5b5f\u52a0\u62c9","value":10830.0},{"name":"\u4fdd\u52a0\u5229\u4e9a","value":58830.0},{"name":"\u5df4\u6797","value":10350.0},{"name":"\u5df4\u54c8\u9a6c","value":2040.0},{"name":"\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3","value":21440.0},{"name":"\u767d\u4fc4\u7f57\u65af","value":96220.0},{"name":"\u4f2f\u5229\u5179","value":430.0},{"name":"\u767e\u6155\u5927","value":null},{"name":"\u73bb\u5229\u7ef4\u4e9a","value":10870.0},{"name":"\u5df4\u897f","value":205480.0},{"name":"\u5df4\u5df4\u591a\u65af","value":980.0},{"name":"\u6587\u83b1\u8fbe\u9c81\u8428\u5170\u56fd","value":3380.0},{"name":"\u4e0d\u4e39","value":130.0},{"name":"\u535a\u8328\u74e6\u7eb3","value":2730.0},{"name":"\u4e2d\u975e\u5171\u548c\u56fd","value":140.0},{"name":"\u52a0\u62ff\u5927","value":413300.0},{"name":"\u4e2d\u6b50\u548c\u6ce2\u7f85\u7684\u6d77","value":913110.0},{"name":"\u745e\u58eb","value":45670.0},{"name":"\u6d77\u5ce1\u7fa4\u5c9b","value":null},{"name":"\u667a\u5229","value":29300.0},{"name":"\u4e2d\u56fd","value":2302180.0},{"name":"\u79d1\u7279\u8fea\u74e6","value":2790.0},{"name":"\u5580\u9ea6\u9686","value":6970.0},{"name":"\u521a\u679c\uff08\u91d1\uff09","value":1740.0},{"name":"\u521a\u679c\uff08\u5e03\uff09","value":3190.0},{"name":"\u54e5\u4f26\u6bd4\u4e9a","value":50440.0},{"name":"\u79d1\u6469\u7f57","value":70.0},{"name":"\u4f5b\u5f97\u89d2","value":100.0},{"name":"\u54e5\u65af\u8fbe\u9ece\u52a0","value":3060.0},{"name":"\u52a0\u52d2\u6bd4\u5c0f\u56fd","value":27900.0},{"name":"\u53e4\u5df4","value":27420.0},{"name":"\u5e93\u62c9\u7d22","value":null},{"name":"\u5f00\u66fc\u7fa4\u5c9b","value":null},{"name":"\u585e\u6d66\u8def\u65af","value":5110.0},{"name":"\u6377\u514b\u5171\u548c\u56fd","value":136900.0},{"name":"\u5fb7\u56fd","value":932550.0},{"name":"\u5409\u5e03\u63d0","value":290.0},{"name":"\u591a\u7c73\u5c3c\u514b","value":60.0},{"name":"\u4e39\u9ea6","value":62800.0},{"name":"\u591a\u7c73\u5c3c\u52a0\u5171\u548c\u56fd","value":8230.0},{"name":"\u963f\u5c14\u53ca\u5229\u4e9a","value":66430.0},{"name":"\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09","value":2830000.8420000002},{"name":"\u65e9\u4eba\u53e3\u7d05\u5229","value":2742521.5440000002},{"name":"\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a","value":4720763.2489999998},{"name":"\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09","value":3738657.6409999998},{"name":"\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a","value":7854524.7379999999},{"name":"\u5384\u74dc\u591a\u5c14","value":15740.0},{"name":"\u57c3\u53ca","value":89370.0},{"name":"\u6b27\u6d32\u8d27\u5e01\u8054\u76df","value":2638230.0},{"name":"\u5384\u7acb\u7279\u91cc\u4e9a","value":null},{"name":"\u897f\u73ed\u7259","value":222100.0},{"name":"\u7231\u6c99\u5c3c\u4e9a","value":31540.0},{"name":"\u57c3\u585e\u4fc4\u6bd4\u4e9a","value":2330.0},{"name":"\u6b27\u6d32\u8054\u76df","value":3524670.0},{"name":"\u8106\u5f31\u548c\u53d7\u885d\u7a81\u5f71\u97ff\u7684\u60c5\u6cc1\u4e0b","value":440429.3482},{"name":"\u82ac\u5170","value":55130.0},{"name":"\u6590\u6d4e","value":680.0},{"name":"\u6cd5\u56fd","value":380650.0},{"name":"\u6cd5\u7f57\u7fa4\u5c9b","value":null},{"name":"\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a\u8054\u90a6","value":null},{"name":"\u52a0\u84ec","value":4560.0},{"name":"\u82f1\u56fd","value":570680.0},{"name":"\u683c\u9c81\u5409\u4e9a","value":25510.0},{"name":"\u52a0\u7eb3","value":2560.0},{"name":"\u76f4\u5e03\u7f57\u9640","value":null},{"name":"\u51e0\u5185\u4e9a","value":1020.0},{"name":"\u5188\u6bd4\u4e9a","value":200.0},{"name":"\u51e0\u5185\u4e9a\u6bd4\u7ecd\u5171\u548c\u56fd","value":170.0},{"name":"\u8d64\u9053\u51e0\u5185\u4e9a","value":70.0},{"name":"\u5e0c\u814a","value":75820.0},{"name":"\u683c\u6797\u7eb3\u8fbe","value":120.0},{"name":"\u683c\u9675\u5170","value":null},{"name":"\u5371\u5730\u9a6c\u62c9","value":4030.0},{"name":"\u5173\u5c9b","value":null},{"name":"\u572d\u4e9a\u90a3","value":1140.0},{"name":"\u9ad8\u6536\u5165\u56fd\u5bb6","value":11656549.5},{"name":"\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a","value":null},{"name":"\u6d2a\u90fd\u62c9\u65af","value":2450.0},{"name":"\u91cd\u503a\u7a77\u56fd (HIPC)","value":63398.98039},{"name":"\u514b\u7f57\u5730\u4e9a","value":14740.0},{"name":"\u6d77\u5730","value":1000.0},{"name":"\u5308\u7259\u5229","value":64550.0},{"name":"\u53ea\u6709IBRD","value":9047190.3159999996},{"name":"IBRD\u4e0eIDA","value":9485523.1420000009},{"name":"IDA\u7e3d","value":437441.0172},{"name":"IDA\u6df7\u5408","value":298741.7735},{"name":"\u5370\u5ea6\u5c3c\u897f\u4e9a","value":162400.0},{"name":"\u53ea\u6709IDA","value":138160.8289},{"name":"\u9a6c\u6069\u5c9b","value":null},{"name":"\u5370\u5ea6","value":607230.0},{"name":"\u672a\u5206\u7c7b\u56fd\u5bb6","value":null},{"name":"\u7231\u5c14\u5170","value":31470.0},{"name":"\u4f0a\u6717","value":219100.0},{"name":"\u4f0a\u62c9\u514b","value":45550.0},{"name":"\u51b0\u5c9b","value":1910.0},{"name":"\u4ee5\u8272\u5217","value":34520.0},{"name":"\u610f\u5927\u5229","value":404070.0},{"name":"\u7259\u4e70\u52a0","value":7410.0},{"name":"\u7ea6\u65e6","value":9780.0},{"name":"\u65e5\u672c","value":1103980.0},{"name":"\u54c8\u8428\u514b\u65af\u5766","value":246370.0},{"name":"\u80af\u5c3c\u4e9a","value":5890.0},{"name":"\u5409\u5c14\u5409\u65af\u65af\u5766","value":20420.0},{"name":"\u67ec\u57d4\u5be8","value":1300.0},{"name":"\u57fa\u91cc\u5df4\u65af","value":20.0},{"name":"\u5723\u57fa\u8328\u548c\u5c3c\u7ef4\u65af","value":110.0},{"name":"\u97e9\u56fd","value":274790.0},{"name":"\u79d1\u5a01\u7279","value":7820.0},{"name":"\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09","value":761420.0},{"name":"\u8001\u631d","value":550.0},{"name":"\u9ece\u5df4\u5ae9","value":7040.0},{"name":"\u5229\u6bd4\u91cc\u4e9a","value":370.0},{"name":"\u5229\u6bd4\u4e9a","value":28820.0},{"name":"\u5723\u5362\u897f\u4e9a","value":200.0},{"name":"\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a","value":929315.0818},{"name":"\u6700\u4e0d\u53d1\u8fbe\u56fd\u5bb6\uff1a\u8054\u5408\u56fd\u5206\u7c7b","value":65739.89642},{"name":"\u4f4e\u6536\u5165\u56fd\u5bb6","value":187523.0021},{"name":"\u5217\u652f\u6566\u58eb\u767b","value":210.0},{"name":"\u65af\u91cc\u5170\u5361","value":3990.0},{"name":"\u4e2d\u4f4e\u7b49\u6536\u5165\u56fd\u5bb6","value":2311084.1140000001},{"name":"\u4e2d\u4f4e\u6536\u5165\u56fd\u5bb6","value":8974875.5669999998},{"name":"\u83b1\u7d22\u6258","value":350.0},{"name":"\u5f8c\u671f\u4eba\u53e3\u7d05\u5229","value":6341401.6359999999},{"name":"\u7acb\u9676\u5b9b","value":34290.0},{"name":"\u5362\u68ee\u5821","value":11750.0},{"name":"\u62c9\u8131\u7ef4\u4e9a","value":17200.0},{"name":"\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a","value":null},{"name":"\u5723\u9a6c\u4e01\uff08\u6cd5\u5c5e\uff09","value":null},{"name":"\u6469\u6d1b\u54e5","value":23120.0},{"name":"\u6469\u7eb3\u54e5","value":null},{"name":"\u6469\u5c14\u591a\u74e6","value":24600.0},{"name":"\u9a6c\u8fbe\u52a0\u65af\u52a0","value":950.0},{"name":"\u9a6c\u5c14\u4ee3\u592b","value":160.0},{"name":"\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a","value":888015.9393},{"name":"\u58a8\u897f\u54e5","value":288000.0},{"name":"\u9a6c\u7ecd\u5c14\u7fa4\u5c9b","value":null},{"name":"\u4e2d\u7b49\u6536\u5165\u56fd\u5bb6","value":8787754.5059999991},{"name":"\u5317\u9a6c\u5176\u987f","value":8380.0},{"name":"\u9a6c\u91cc","value":10.0},{"name":"\u9a6c\u8033\u4ed6","value":2210.0},{"name":"\u7f05\u7538","value":4020.0},{"name":"\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09","value":554774.0227},{"name":"\u9ed1\u5c71","value":1360.0},{"name":"\u8499\u53e4","value":14760.0},{"name":"\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b","value":null},{"name":"\u83ab\u6851\u6bd4\u514b","value":940.0},{"name":"\u6bdb\u91cc\u5854\u5c3c\u4e9a","value":980.0},{"name":"\u6bdb\u91cc\u6c42\u65af","value":1250.0},{"name":"\u9a6c\u62c9\u7ef4","value":640.0},{"name":"\u9a6c\u6765\u897f\u4e9a","value":65100.0},{"name":"\u5317\u7f8e","value":5222530.6720000003},{"name":"\u7eb3\u7c73\u6bd4\u4e9a","value":1120.0},{"name":"\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a","value":null},{"name":"\u5c3c\u65e5\u5c14","value":540.0},{"name":"\u5c3c\u65e5\u5229\u4e9a","value":81930.0},{"name":"\u5c3c\u52a0\u62c9\u74dc","value":1920.0},{"name":"\u8377\u5170","value":154510.0},{"name":"\u632a\u5a01","value":27330.0},{"name":"\u5c3c\u6cca\u5c14","value":1180.0},{"name":"\u7459\u9b6f","value":130.0},{"name":"\u65b0\u897f\u5170","value":22630.0},{"name":"\u7ecf\u5408\u7ec4\u7ec7\u6210\u5458","value":11382690.0},{"name":"\u963f\u66fc","value":15720.0},{"name":"\u5176\u4ed6\u5c0f\u56fd","value":83227.23554},{"name":"\u5df4\u57fa\u65af\u5766","value":60310.0},{"name":"\u5df4\u62ff\u9a6c","value":3120.0},{"name":"\u79d8\u9c81","value":20270.0},{"name":"\u83f2\u5f8b\u5bbe","value":40650.0},{"name":"\u5e15\u52b3","value":null},{"name":"\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a","value":2180.0},{"name":"\u6ce2\u5170","value":351620.0},{"name":"\u9810\u4eba\u53e3\u7d05\u5229","value":180997.6397},{"name":"\u6ce2\u591a\u9ece\u5404","value":null},{"name":"\u671d\u9c9c\u6c11\u4e3b\u4e3b\u4e49\u4eba\u6c11\u5171\u548c\u56fd","value":117340.0},{"name":"\u8461\u8404\u7259","value":42770.0},{"name":"\u5df4\u62c9\u572d","value":2020.0},{"name":"\u7ea6\u65e6\u6cb3\u897f\u5cb8\u548c\u52a0\u6c99","value":null},{"name":"\u592a\u5e73\u6d0b\u5c9b\u56fd","value":1643.90625},{"name":"\u4eba\u53e3\u7d05\u5229\u4e4b\u5f8c","value":11338333.7799999993},{"name":"\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a","value":null},{"name":"\u5361\u5854\u5c14","value":14980.0},{"name":"\u7f57\u9a6c\u5c3c\u4e9a","value":142760.0},{"name":"\u4fc4\u7f57\u65af","value":2136440.0},{"name":"\u5362\u65fa\u8fbe","value":500.0},{"name":"\u5357\u4e9a","value":686060.0},{"name":"\u6c99\u7279\u963f\u62c9\u4f2f","value":187930.0},{"name":"\u82cf\u4e39","value":4800.0},{"name":"\u585e\u5185\u52a0\u5c14","value":2330.0},{"name":"\u65b0\u52a0\u5761","value":30470.0},{"name":"\u6240\u7f57\u95e8\u7fa4\u5c9b","value":160.0},{"name":"\u585e\u62c9\u5229\u6602","value":340.0},{"name":"\u8428\u5c14\u74e6\u591a","value":3070.0},{"name":"\u5723\u9a6c\u529b\u8bfa","value":null},{"name":"\u7d22\u9a6c\u91cc","value":710.0},{"name":"\u585e\u5c14\u7ef4\u4e9a","value":52200.0},{"name":"\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a\uff08\u4e0d\u5305\u62ec\u9ad8\u6536\u5165\uff09","value":410085.3999},{"name":"\u5357\u82cf\u4e39","value":410.0},{"name":"\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a","value":410255.1967},{"name":"\u5c0f\u56fd","value":112824.0815},{"name":"\u5723\u591a\u7f8e\u548c\u666e\u6797\u897f\u6bd4","value":50.0},{"name":"\u82cf\u91cc\u5357","value":2050.0},{"name":"\u65af\u6d1b\u4f10\u514b\u5171\u548c\u56fd","value":47940.0},{"name":"\u65af\u6d1b\u6587\u5c3c\u4e9a","value":12740.0},{"name":"\u745e\u5178","value":54240.0},{"name":"\u65af\u5a01\u58eb\u5170","value":560.0},{"name":"\u5723\u9a6c\u4e01(\u8377\u5c5e)","value":null},{"name":"\u585e\u820c\u5c14","value":170.0},{"name":"\u53d9\u5229\u4e9a","value":35770.0},{"name":"\u7279\u514b\u65af\u79d1\u65af\u7fa4\u5c9b","value":null},{"name":"\u4e4d\u5f97","value":400.0},{"name":"\u4e1c\u4e9a\u4e0e\u592a\u5e73\u6d0b\u5730\u533a (IBRD\u4e0eIDA)","value":2712741.0890000002},{"name":"\u6b27\u6d32\u4e0e\u4e2d\u4e9a\u5730\u533a (IBRD\u4e0eIDA)","value":4247249.7949999999},{"name":"\u591a\u54e5","value":930.0},{"name":"\u6cf0\u56fd","value":98070.0},{"name":"\u5854\u5409\u514b\u65af\u5766","value":10170.0},{"name":"\u571f\u5e93\u66fc\u65af\u5766","value":37790.0},{"name":"\u62c9\u4e01\u7f8e\u6d32\u4e0e\u52a0\u52d2\u6bd4\u6d77\u5730\u533a (IBRD\u4e0eIDA)","value":885160.0},{"name":"\u4e1c\u5e1d\u6c76","value":null},{"name":"\u4e2d\u4e1c\u4e0e\u5317\u975e\u5730\u533a (IBRD\u4e0eIDA)","value":548800.0},{"name":"\u6c64\u52a0","value":90.0},{"name":"\u5357\u4e9a (IBRD\u4e0eIDA)","value":686060.0},{"name":"\u6492\u54c8\u62c9\u4ee5\u5357\u975e\u6d32\u5730\u533a (IBRD\u4e0eIDA)","value":410255.1967},{"name":"\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5","value":13050.0},{"name":"\u7a81\u5c3c\u65af","value":15030.0},{"name":"\u571f\u8033\u5176","value":143800.0},{"name":"\u56fe\u74e6\u5362","value":10.0},{"name":"\u5766\u6851\u5c3c\u4e9a","value":1870.0},{"name":"\u4e4c\u5e72\u8fbe","value":810.0},{"name":"\u4e4c\u514b\u5170","value":651930.0},{"name":"\u4e2d\u9ad8\u7b49\u6536\u5165\u56fd\u5bb6","value":6476987.8119999999},{"name":"\u4e4c\u62c9\u572d","value":4370.0},{"name":"\u7f8e\u56fd","value":4807500.0},{"name":"\u4e4c\u5179\u522b\u514b\u65af\u5766","value":118580.0},{"name":"\u5723\u6587\u68ee\u7279\u548c\u683c\u6797\u7eb3\u4e01\u65af","value":90.0},{"name":"\u59d4\u5185\u745e\u62c9","value":100990.0},{"name":"\u82f1\u5c6c\u7dad\u723e\u4eac\u7fa4\u5cf6","value":null},{"name":"\u7f8e\u5c5e\u7ef4\u4eac\u7fa4\u5c9b","value":null},{"name":"\u8d8a\u5357","value":19800.0},{"name":"\u74e6\u52aa\u963f\u56fe","value":70.0},{"name":"\u4e16\u754c","value":20766900.8900000006},{"name":"\u8428\u6469\u4e9a","value":100.0},{"name":"\u79d1\u7d22\u6c83","value":null},{"name":"\u4e5f\u95e8","value":8500.0},{"name":"\u5357\u975e","value":242330.0},{"name":"\u8d5e\u6bd4\u4e9a","value":2880.0},{"name":"\u6d25\u5df4\u5e03\u97e6","value":18300.0}], + [ + { + "name": "\\u963f\\u9c81\\u5df4", + "value": null + }, + { + "name": null, + "value": 298735.4356 + }, + { + "name": "\\u963f\\u5bcc\\u6c57", + "value": 2230.0 + }, + { + "name": null, + "value": 111479.4705 + }, + { + "name": "\\u5b89\\u54e5\\u62c9", + "value": 6670.0 + }, + { + "name": "\\u963f\\u5c14\\u5df4\\u5c3c\\u4e9a", + "value": 4060.0 + }, + { + "name": "\\u5b89\\u9053\\u5c14\\u5171\\u548c\\u56fd", + "value": 410.0 + }, + { + "name": "\\u963f\\u62c9\\u4f2f\\u8054\\u76df\\u56fd\\u5bb6", + "value": 638311.6162 + }, + { + "name": "\\u963f\\u62c9\\u4f2f\\u8054\\u5408\\u914b\\u957f\\u56fd", + "value": 61560.0 + }, + { + "name": "\\u963f\\u6839\\u5ef7", + "value": 105920.0 + }, + { + "name": "\\u4e9a\\u7f8e\\u5c3c\\u4e9a", + "value": 20690.0 + }, + { + "name": "\\u7f8e\\u5c5e\\u8428\\u6469\\u4e9a", + "value": null + }, + { + "name": "\\u5b89\\u63d0\\u74dc\\u548c\\u5df4\\u5e03\\u8fbe", + "value": 220.0 + }, + { + "name": "\\u6fb3\\u5927\\u5229\\u4e9a", + "value": 264760.0 + }, + { + "name": "\\u5965\\u5730\\u5229", + "value": 62420.0 + }, + { + "name": "\\u963f\\u585e\\u62dc\\u7586", + "value": 52060.0 + }, + { + "name": "\\u5e03\\u9686\\u8fea", + "value": 220.0 + }, + { + "name": "\\u6bd4\\u5229\\u65f6", + "value": 113960.0 + }, + { + "name": "\\u8d1d\\u5b81", + "value": 270.0 + }, + { + "name": "\\u5e03\\u57fa\\u7eb3\\u6cd5\\u7d22", + "value": 510.0 + }, + { + "name": "\\u5b5f\\u52a0\\u62c9", + "value": 10830.0 + }, + { + "name": "\\u4fdd\\u52a0\\u5229\\u4e9a", + "value": 58830.0 + }, + { + "name": "\\u5df4\\u6797", + "value": 10350.0 + }, + { + "name": "\\u5df4\\u54c8\\u9a6c", + "value": 2040.0 + }, + { + "name": "\\u6ce2\\u65af\\u5c3c\\u4e9a\\u548c\\u9ed1\\u585e\\u54e5\\u7ef4\\u90a3", + "value": 21440.0 + }, + { + "name": "\\u767d\\u4fc4\\u7f57\\u65af", + "value": 96220.0 + }, + { + "name": "\\u4f2f\\u5229\\u5179", + "value": 430.0 + }, + { + "name": "\\u767e\\u6155\\u5927", + "value": null + }, + { + "name": "\\u73bb\\u5229\\u7ef4\\u4e9a", + "value": 10870.0 + }, + { + "name": "\\u5df4\\u897f", + "value": 205480.0 + }, + { + "name": "\\u5df4\\u5df4\\u591a\\u65af", + "value": 980.0 + }, + { + "name": "\\u6587\\u83b1\\u8fbe\\u9c81\\u8428\\u5170\\u56fd", + "value": 3380.0 + }, + { + "name": "\\u4e0d\\u4e39", + "value": 130.0 + }, + { + "name": "\\u535a\\u8328\\u74e6\\u7eb3", + "value": 2730.0 + }, + { + "name": "\\u4e2d\\u975e\\u5171\\u548c\\u56fd", + "value": 140.0 + }, + { + "name": "\\u52a0\\u62ff\\u5927", + "value": 413300.0 + }, + { + "name": "\\u4e2d\\u6b50\\u548c\\u6ce2\\u7f85\\u7684\\u6d77", + "value": 913110.0 + }, + { + "name": "\\u745e\\u58eb", + "value": 45670.0 + }, + { + "name": "\\u6d77\\u5ce1\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u667a\\u5229", + "value": 29300.0 + }, + { + "name": "\\u4e2d\\u56fd", + "value": 2302180.0 + }, + { + "name": "\\u79d1\\u7279\\u8fea\\u74e6", + "value": 2790.0 + }, + { + "name": "\\u5580\\u9ea6\\u9686", + "value": 6970.0 + }, + { + "name": "\\u521a\\u679c\\uff08\\u91d1\\uff09", + "value": 1740.0 + }, + { + "name": "\\u521a\\u679c\\uff08\\u5e03\\uff09", + "value": 3190.0 + }, + { + "name": "\\u54e5\\u4f26\\u6bd4\\u4e9a", + "value": 50440.0 + }, + { + "name": "\\u79d1\\u6469\\u7f57", + "value": 70.0 + }, + { + "name": "\\u4f5b\\u5f97\\u89d2", + "value": 100.0 + }, + { + "name": "\\u54e5\\u65af\\u8fbe\\u9ece\\u52a0", + "value": 3060.0 + }, + { + "name": "\\u52a0\\u52d2\\u6bd4\\u5c0f\\u56fd", + "value": 27900.0 + }, + { + "name": "\\u53e4\\u5df4", + "value": 27420.0 + }, + { + "name": "\\u5e93\\u62c9\\u7d22", + "value": null + }, + { + "name": "\\u5f00\\u66fc\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u585e\\u6d66\\u8def\\u65af", + "value": 5110.0 + }, + { + "name": "\\u6377\\u514b\\u5171\\u548c\\u56fd", + "value": 136900.0 + }, + { + "name": "\\u5fb7\\u56fd", + "value": 932550.0 + }, + { + "name": "\\u5409\\u5e03\\u63d0", + "value": 290.0 + }, + { + "name": "\\u591a\\u7c73\\u5c3c\\u514b", + "value": 60.0 + }, + { + "name": "\\u4e39\\u9ea6", + "value": 62800.0 + }, + { + "name": "\\u591a\\u7c73\\u5c3c\\u52a0\\u5171\\u548c\\u56fd", + "value": 8230.0 + }, + { + "name": "\\u963f\\u5c14\\u53ca\\u5229\\u4e9a", + "value": 66430.0 + }, + { + "name": "\\u4e1c\\u4e9a\\u4e0e\\u592a\\u5e73\\u6d0b\\u5730\\u533a\\uff08\\u4e0d\\u5305\\u62ec\\u9ad8\\u6536\\u5165\\uff09", + "value": 2830000.8420000002 + }, + { + "name": "\\u65e9\\u4eba\\u53e3\\u7d05\\u5229", + "value": 2742521.5440000002 + }, + { + "name": "\\u4e1c\\u4e9a\\u4e0e\\u592a\\u5e73\\u6d0b\\u5730\\u533a", + "value": 4720763.2489999998 + }, + { + "name": "\\u6b27\\u6d32\\u4e0e\\u4e2d\\u4e9a\\u5730\\u533a\\uff08\\u4e0d\\u5305\\u62ec\\u9ad8\\u6536\\u5165\\uff09", + "value": 3738657.6409999998 + }, + { + "name": "\\u6b27\\u6d32\\u4e0e\\u4e2d\\u4e9a\\u5730\\u533a", + "value": 7854524.7379999999 + }, + { + "name": "\\u5384\\u74dc\\u591a\\u5c14", + "value": 15740.0 + }, + { + "name": "\\u57c3\\u53ca", + "value": 89370.0 + }, + { + "name": "\\u6b27\\u6d32\\u8d27\\u5e01\\u8054\\u76df", + "value": 2638230.0 + }, + { + "name": "\\u5384\\u7acb\\u7279\\u91cc\\u4e9a", + "value": null + }, + { + "name": "\\u897f\\u73ed\\u7259", + "value": 222100.0 + }, + { + "name": "\\u7231\\u6c99\\u5c3c\\u4e9a", + "value": 31540.0 + }, + { + "name": "\\u57c3\\u585e\\u4fc4\\u6bd4\\u4e9a", + "value": 2330.0 + }, + { + "name": "\\u6b27\\u6d32\\u8054\\u76df", + "value": 3524670.0 + }, + { + "name": "\\u8106\\u5f31\\u548c\\u53d7\\u885d\\u7a81\\u5f71\\u97ff\\u7684\\u60c5\\u6cc1\\u4e0b", + "value": 440429.3482 + }, + { + "name": "\\u82ac\\u5170", + "value": 55130.0 + }, + { + "name": "\\u6590\\u6d4e", + "value": 680.0 + }, + { + "name": "\\u6cd5\\u56fd", + "value": 380650.0 + }, + { + "name": "\\u6cd5\\u7f57\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u5bc6\\u514b\\u7f57\\u5c3c\\u897f\\u4e9a\\u8054\\u90a6", + "value": null + }, + { + "name": "\\u52a0\\u84ec", + "value": 4560.0 + }, + { + "name": "\\u82f1\\u56fd", + "value": 570680.0 + }, + { + "name": "\\u683c\\u9c81\\u5409\\u4e9a", + "value": 25510.0 + }, + { + "name": "\\u52a0\\u7eb3", + "value": 2560.0 + }, + { + "name": "\\u76f4\\u5e03\\u7f57\\u9640", + "value": null + }, + { + "name": "\\u51e0\\u5185\\u4e9a", + "value": 1020.0 + }, + { + "name": "\\u5188\\u6bd4\\u4e9a", + "value": 200.0 + }, + { + "name": "\\u51e0\\u5185\\u4e9a\\u6bd4\\u7ecd\\u5171\\u548c\\u56fd", + "value": 170.0 + }, + { + "name": "\\u8d64\\u9053\\u51e0\\u5185\\u4e9a", + "value": 70.0 + }, + { + "name": "\\u5e0c\\u814a", + "value": 75820.0 + }, + { + "name": "\\u683c\\u6797\\u7eb3\\u8fbe", + "value": 120.0 + }, + { + "name": "\\u683c\\u9675\\u5170", + "value": null + }, + { + "name": "\\u5371\\u5730\\u9a6c\\u62c9", + "value": 4030.0 + }, + { + "name": "\\u5173\\u5c9b", + "value": null + }, + { + "name": "\\u572d\\u4e9a\\u90a3", + "value": 1140.0 + }, + { + "name": "\\u9ad8\\u6536\\u5165\\u56fd\\u5bb6", + "value": 11656549.5 + }, + { + "name": "\\u4e2d\\u56fd\\u9999\\u6e2f\\u7279\\u522b\\u884c\\u653f\\u533a", + "value": null + }, + { + "name": "\\u6d2a\\u90fd\\u62c9\\u65af", + "value": 2450.0 + }, + { + "name": "\\u91cd\\u503a\\u7a77\\u56fd (HIPC)", + "value": 63398.98039 + }, + { + "name": "\\u514b\\u7f57\\u5730\\u4e9a", + "value": 14740.0 + }, + { + "name": "\\u6d77\\u5730", + "value": 1000.0 + }, + { + "name": "\\u5308\\u7259\\u5229", + "value": 64550.0 + }, + { + "name": "\\u53ea\\u6709IBRD", + "value": 9047190.3159999996 + }, + { + "name": "IBRD\\u4e0eIDA", + "value": 9485523.1420000009 + }, + { + "name": "IDA\\u7e3d", + "value": 437441.0172 + }, + { + "name": "IDA\\u6df7\\u5408", + "value": 298741.7735 + }, + { + "name": "\\u5370\\u5ea6\\u5c3c\\u897f\\u4e9a", + "value": 162400.0 + }, + { + "name": "\\u53ea\\u6709IDA", + "value": 138160.8289 + }, + { + "name": "\\u9a6c\\u6069\\u5c9b", + "value": null + }, + { + "name": "\\u5370\\u5ea6", + "value": 607230.0 + }, + { + "name": "\\u672a\\u5206\\u7c7b\\u56fd\\u5bb6", + "value": null + }, + { + "name": "\\u7231\\u5c14\\u5170", + "value": 31470.0 + }, + { + "name": "\\u4f0a\\u6717", + "value": 219100.0 + }, + { + "name": "\\u4f0a\\u62c9\\u514b", + "value": 45550.0 + }, + { + "name": "\\u51b0\\u5c9b", + "value": 1910.0 + }, + { + "name": "\\u4ee5\\u8272\\u5217", + "value": 34520.0 + }, + { + "name": "\\u610f\\u5927\\u5229", + "value": 404070.0 + }, + { + "name": "\\u7259\\u4e70\\u52a0", + "value": 7410.0 + }, + { + "name": "\\u7ea6\\u65e6", + "value": 9780.0 + }, + { + "name": "\\u65e5\\u672c", + "value": 1103980.0 + }, + { + "name": "\\u54c8\\u8428\\u514b\\u65af\\u5766", + "value": 246370.0 + }, + { + "name": "\\u80af\\u5c3c\\u4e9a", + "value": 5890.0 + }, + { + "name": "\\u5409\\u5c14\\u5409\\u65af\\u65af\\u5766", + "value": 20420.0 + }, + { + "name": "\\u67ec\\u57d4\\u5be8", + "value": 1300.0 + }, + { + "name": "\\u57fa\\u91cc\\u5df4\\u65af", + "value": 20.0 + }, + { + "name": "\\u5723\\u57fa\\u8328\\u548c\\u5c3c\\u7ef4\\u65af", + "value": 110.0 + }, + { + "name": "\\u97e9\\u56fd", + "value": 274790.0 + }, + { + "name": "\\u79d1\\u5a01\\u7279", + "value": 7820.0 + }, + { + "name": "\\u62c9\\u4e01\\u7f8e\\u6d32\\u4e0e\\u52a0\\u52d2\\u6bd4\\u6d77\\u5730\\u533a\\uff08\\u4e0d\\u5305\\u62ec\\u9ad8\\u6536\\u5165\\uff09", + "value": 761420.0 + }, + { + "name": "\\u8001\\u631d", + "value": 550.0 + }, + { + "name": "\\u9ece\\u5df4\\u5ae9", + "value": 7040.0 + }, + { + "name": "\\u5229\\u6bd4\\u91cc\\u4e9a", + "value": 370.0 + }, + { + "name": "\\u5229\\u6bd4\\u4e9a", + "value": 28820.0 + }, + { + "name": "\\u5723\\u5362\\u897f\\u4e9a", + "value": 200.0 + }, + { + "name": "\\u62c9\\u4e01\\u7f8e\\u6d32\\u4e0e\\u52a0\\u52d2\\u6bd4\\u6d77\\u5730\\u533a", + "value": 929315.0818 + }, + { + "name": "\\u6700\\u4e0d\\u53d1\\u8fbe\\u56fd\\u5bb6\\uff1a\\u8054\\u5408\\u56fd\\u5206\\u7c7b", + "value": 65739.89642 + }, + { + "name": "\\u4f4e\\u6536\\u5165\\u56fd\\u5bb6", + "value": 187523.0021 + }, + { + "name": "\\u5217\\u652f\\u6566\\u58eb\\u767b", + "value": 210.0 + }, + { + "name": "\\u65af\\u91cc\\u5170\\u5361", + "value": 3990.0 + }, + { + "name": "\\u4e2d\\u4f4e\\u7b49\\u6536\\u5165\\u56fd\\u5bb6", + "value": 2311084.1140000001 + }, + { + "name": "\\u4e2d\\u4f4e\\u6536\\u5165\\u56fd\\u5bb6", + "value": 8974875.5669999998 + }, + { + "name": "\\u83b1\\u7d22\\u6258", + "value": 350.0 + }, + { + "name": "\\u5f8c\\u671f\\u4eba\\u53e3\\u7d05\\u5229", + "value": 6341401.6359999999 + }, + { + "name": "\\u7acb\\u9676\\u5b9b", + "value": 34290.0 + }, + { + "name": "\\u5362\\u68ee\\u5821", + "value": 11750.0 + }, + { + "name": "\\u62c9\\u8131\\u7ef4\\u4e9a", + "value": 17200.0 + }, + { + "name": "\\u4e2d\\u56fd\\u6fb3\\u95e8\\u7279\\u522b\\u884c\\u653f\\u533a", + "value": null + }, + { + "name": "\\u5723\\u9a6c\\u4e01\\uff08\\u6cd5\\u5c5e\\uff09", + "value": null + }, + { + "name": "\\u6469\\u6d1b\\u54e5", + "value": 23120.0 + }, + { + "name": "\\u6469\\u7eb3\\u54e5", + "value": null + }, + { + "name": "\\u6469\\u5c14\\u591a\\u74e6", + "value": 24600.0 + }, + { + "name": "\\u9a6c\\u8fbe\\u52a0\\u65af\\u52a0", + "value": 950.0 + }, + { + "name": "\\u9a6c\\u5c14\\u4ee3\\u592b", + "value": 160.0 + }, + { + "name": "\\u4e2d\\u4e1c\\u4e0e\\u5317\\u975e\\u5730\\u533a", + "value": 888015.9393 + }, + { + "name": "\\u58a8\\u897f\\u54e5", + "value": 288000.0 + }, + { + "name": "\\u9a6c\\u7ecd\\u5c14\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u4e2d\\u7b49\\u6536\\u5165\\u56fd\\u5bb6", + "value": 8787754.5059999991 + }, + { + "name": "\\u5317\\u9a6c\\u5176\\u987f", + "value": 8380.0 + }, + { + "name": "\\u9a6c\\u91cc", + "value": 10.0 + }, + { + "name": "\\u9a6c\\u8033\\u4ed6", + "value": 2210.0 + }, + { + "name": "\\u7f05\\u7538", + "value": 4020.0 + }, + { + "name": "\\u4e2d\\u4e1c\\u4e0e\\u5317\\u975e\\u5730\\u533a\\uff08\\u4e0d\\u5305\\u62ec\\u9ad8\\u6536\\u5165\\uff09", + "value": 554774.0227 + }, + { + "name": "\\u9ed1\\u5c71", + "value": 1360.0 + }, + { + "name": "\\u8499\\u53e4", + "value": 14760.0 + }, + { + "name": "\\u5317\\u9a6c\\u91cc\\u4e9a\\u7eb3\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u83ab\\u6851\\u6bd4\\u514b", + "value": 940.0 + }, + { + "name": "\\u6bdb\\u91cc\\u5854\\u5c3c\\u4e9a", + "value": 980.0 + }, + { + "name": "\\u6bdb\\u91cc\\u6c42\\u65af", + "value": 1250.0 + }, + { + "name": "\\u9a6c\\u62c9\\u7ef4", + "value": 640.0 + }, + { + "name": "\\u9a6c\\u6765\\u897f\\u4e9a", + "value": 65100.0 + }, + { + "name": "\\u5317\\u7f8e", + "value": 5222530.6720000003 + }, + { + "name": "\\u7eb3\\u7c73\\u6bd4\\u4e9a", + "value": 1120.0 + }, + { + "name": "\\u65b0\\u5580\\u91cc\\u591a\\u5c3c\\u4e9a", + "value": null + }, + { + "name": "\\u5c3c\\u65e5\\u5c14", + "value": 540.0 + }, + { + "name": "\\u5c3c\\u65e5\\u5229\\u4e9a", + "value": 81930.0 + }, + { + "name": "\\u5c3c\\u52a0\\u62c9\\u74dc", + "value": 1920.0 + }, + { + "name": "\\u8377\\u5170", + "value": 154510.0 + }, + { + "name": "\\u632a\\u5a01", + "value": 27330.0 + }, + { + "name": "\\u5c3c\\u6cca\\u5c14", + "value": 1180.0 + }, + { + "name": "\\u7459\\u9b6f", + "value": 130.0 + }, + { + "name": "\\u65b0\\u897f\\u5170", + "value": 22630.0 + }, + { + "name": "\\u7ecf\\u5408\\u7ec4\\u7ec7\\u6210\\u5458", + "value": 11382690.0 + }, + { + "name": "\\u963f\\u66fc", + "value": 15720.0 + }, + { + "name": "\\u5176\\u4ed6\\u5c0f\\u56fd", + "value": 83227.23554 + }, + { + "name": "\\u5df4\\u57fa\\u65af\\u5766", + "value": 60310.0 + }, + { + "name": "\\u5df4\\u62ff\\u9a6c", + "value": 3120.0 + }, + { + "name": "\\u79d8\\u9c81", + "value": 20270.0 + }, + { + "name": "\\u83f2\\u5f8b\\u5bbe", + "value": 40650.0 + }, + { + "name": "\\u5e15\\u52b3", + "value": null + }, + { + "name": "\\u5df4\\u5e03\\u4e9a\\u65b0\\u51e0\\u5185\\u4e9a", + "value": 2180.0 + }, + { + "name": "\\u6ce2\\u5170", + "value": 351620.0 + }, + { + "name": "\\u9810\\u4eba\\u53e3\\u7d05\\u5229", + "value": 180997.6397 + }, + { + "name": "\\u6ce2\\u591a\\u9ece\\u5404", + "value": null + }, + { + "name": "\\u671d\\u9c9c\\u6c11\\u4e3b\\u4e3b\\u4e49\\u4eba\\u6c11\\u5171\\u548c\\u56fd", + "value": 117340.0 + }, + { + "name": "\\u8461\\u8404\\u7259", + "value": 42770.0 + }, + { + "name": "\\u5df4\\u62c9\\u572d", + "value": 2020.0 + }, + { + "name": "\\u7ea6\\u65e6\\u6cb3\\u897f\\u5cb8\\u548c\\u52a0\\u6c99", + "value": null + }, + { + "name": "\\u592a\\u5e73\\u6d0b\\u5c9b\\u56fd", + "value": 1643.90625 + }, + { + "name": "\\u4eba\\u53e3\\u7d05\\u5229\\u4e4b\\u5f8c", + "value": 11338333.7799999993 + }, + { + "name": "\\u6cd5\\u5c5e\\u6ce2\\u5229\\u5c3c\\u897f\\u4e9a", + "value": null + }, + { + "name": "\\u5361\\u5854\\u5c14", + "value": 14980.0 + }, + { + "name": "\\u7f57\\u9a6c\\u5c3c\\u4e9a", + "value": 142760.0 + }, + { + "name": "\\u4fc4\\u7f57\\u65af", + "value": 2136440.0 + }, + { + "name": "\\u5362\\u65fa\\u8fbe", + "value": 500.0 + }, + { + "name": "\\u5357\\u4e9a", + "value": 686060.0 + }, + { + "name": "\\u6c99\\u7279\\u963f\\u62c9\\u4f2f", + "value": 187930.0 + }, + { + "name": "\\u82cf\\u4e39", + "value": 4800.0 + }, + { + "name": "\\u585e\\u5185\\u52a0\\u5c14", + "value": 2330.0 + }, + { + "name": "\\u65b0\\u52a0\\u5761", + "value": 30470.0 + }, + { + "name": "\\u6240\\u7f57\\u95e8\\u7fa4\\u5c9b", + "value": 160.0 + }, + { + "name": "\\u585e\\u62c9\\u5229\\u6602", + "value": 340.0 + }, + { + "name": "\\u8428\\u5c14\\u74e6\\u591a", + "value": 3070.0 + }, + { + "name": "\\u5723\\u9a6c\\u529b\\u8bfa", + "value": null + }, + { + "name": "\\u7d22\\u9a6c\\u91cc", + "value": 710.0 + }, + { + "name": "\\u585e\\u5c14\\u7ef4\\u4e9a", + "value": 52200.0 + }, + { + "name": "\\u6492\\u54c8\\u62c9\\u4ee5\\u5357\\u975e\\u6d32\\u5730\\u533a\\uff08\\u4e0d\\u5305\\u62ec\\u9ad8\\u6536\\u5165\\uff09", + "value": 410085.3999 + }, + { + "name": "\\u5357\\u82cf\\u4e39", + "value": 410.0 + }, + { + "name": "\\u6492\\u54c8\\u62c9\\u4ee5\\u5357\\u975e\\u6d32\\u5730\\u533a", + "value": 410255.1967 + }, + { + "name": "\\u5c0f\\u56fd", + "value": 112824.0815 + }, + { + "name": "\\u5723\\u591a\\u7f8e\\u548c\\u666e\\u6797\\u897f\\u6bd4", + "value": 50.0 + }, + { + "name": "\\u82cf\\u91cc\\u5357", + "value": 2050.0 + }, + { + "name": "\\u65af\\u6d1b\\u4f10\\u514b\\u5171\\u548c\\u56fd", + "value": 47940.0 + }, + { + "name": "\\u65af\\u6d1b\\u6587\\u5c3c\\u4e9a", + "value": 12740.0 + }, + { + "name": "\\u745e\\u5178", + "value": 54240.0 + }, + { + "name": "\\u65af\\u5a01\\u58eb\\u5170", + "value": 560.0 + }, + { + "name": "\\u5723\\u9a6c\\u4e01(\\u8377\\u5c5e)", + "value": null + }, + { + "name": "\\u585e\\u820c\\u5c14", + "value": 170.0 + }, + { + "name": "\\u53d9\\u5229\\u4e9a", + "value": 35770.0 + }, + { + "name": "\\u7279\\u514b\\u65af\\u79d1\\u65af\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u4e4d\\u5f97", + "value": 400.0 + }, + { + "name": "\\u4e1c\\u4e9a\\u4e0e\\u592a\\u5e73\\u6d0b\\u5730\\u533a (IBRD\\u4e0eIDA)", + "value": 2712741.0890000002 + }, + { + "name": "\\u6b27\\u6d32\\u4e0e\\u4e2d\\u4e9a\\u5730\\u533a (IBRD\\u4e0eIDA)", + "value": 4247249.7949999999 + }, + { + "name": "\\u591a\\u54e5", + "value": 930.0 + }, + { + "name": "\\u6cf0\\u56fd", + "value": 98070.0 + }, + { + "name": "\\u5854\\u5409\\u514b\\u65af\\u5766", + "value": 10170.0 + }, + { + "name": "\\u571f\\u5e93\\u66fc\\u65af\\u5766", + "value": 37790.0 + }, + { + "name": "\\u62c9\\u4e01\\u7f8e\\u6d32\\u4e0e\\u52a0\\u52d2\\u6bd4\\u6d77\\u5730\\u533a (IBRD\\u4e0eIDA)", + "value": 885160.0 + }, + { + "name": "\\u4e1c\\u5e1d\\u6c76", + "value": null + }, + { + "name": "\\u4e2d\\u4e1c\\u4e0e\\u5317\\u975e\\u5730\\u533a (IBRD\\u4e0eIDA)", + "value": 548800.0 + }, + { + "name": "\\u6c64\\u52a0", + "value": 90.0 + }, + { + "name": "\\u5357\\u4e9a (IBRD\\u4e0eIDA)", + "value": 686060.0 + }, + { + "name": "\\u6492\\u54c8\\u62c9\\u4ee5\\u5357\\u975e\\u6d32\\u5730\\u533a (IBRD\\u4e0eIDA)", + "value": 410255.1967 + }, + { + "name": "\\u7279\\u7acb\\u5c3c\\u8fbe\\u548c\\u591a\\u5df4\\u54e5", + "value": 13050.0 + }, + { + "name": "\\u7a81\\u5c3c\\u65af", + "value": 15030.0 + }, + { + "name": "\\u571f\\u8033\\u5176", + "value": 143800.0 + }, + { + "name": "\\u56fe\\u74e6\\u5362", + "value": 10.0 + }, + { + "name": "\\u5766\\u6851\\u5c3c\\u4e9a", + "value": 1870.0 + }, + { + "name": "\\u4e4c\\u5e72\\u8fbe", + "value": 810.0 + }, + { + "name": "\\u4e4c\\u514b\\u5170", + "value": 651930.0 + }, + { + "name": "\\u4e2d\\u9ad8\\u7b49\\u6536\\u5165\\u56fd\\u5bb6", + "value": 6476987.8119999999 + }, + { + "name": "\\u4e4c\\u62c9\\u572d", + "value": 4370.0 + }, + { + "name": "\\u7f8e\\u56fd", + "value": 4807500.0 + }, + { + "name": "\\u4e4c\\u5179\\u522b\\u514b\\u65af\\u5766", + "value": 118580.0 + }, + { + "name": "\\u5723\\u6587\\u68ee\\u7279\\u548c\\u683c\\u6797\\u7eb3\\u4e01\\u65af", + "value": 90.0 + }, + { + "name": "\\u59d4\\u5185\\u745e\\u62c9", + "value": 100990.0 + }, + { + "name": "\\u82f1\\u5c6c\\u7dad\\u723e\\u4eac\\u7fa4\\u5cf6", + "value": null + }, + { + "name": "\\u7f8e\\u5c5e\\u7ef4\\u4eac\\u7fa4\\u5c9b", + "value": null + }, + { + "name": "\\u8d8a\\u5357", + "value": 19800.0 + }, + { + "name": "\\u74e6\\u52aa\\u963f\\u56fe", + "value": 70.0 + }, + { + "name": "\\u4e16\\u754c", + "value": 20766900.8900000006 + }, + { + "name": "\\u8428\\u6469\\u4e9a", + "value": 100.0 + }, + { + "name": "\\u79d1\\u7d22\\u6c83", + "value": null + }, + { + "name": "\\u4e5f\\u95e8", + "value": 8500.0 + }, + { + "name": "\\u5357\\u975e", + "value": 242330.0 + }, + { + "name": "\\u8d5e\\u6bd4\\u4e9a", + "value": 2880.0 + }, + { + "name": "\\u6d25\\u5df4\\u5e03\\u97e6", + "value": 18300.0 + } + ] +] \ No newline at end of file diff --git a/src/json/world.json b/src/json/world.json new file mode 100644 index 0000000..9df0a61 --- /dev/null +++ b/src/json/world.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"geometry":{"type":"Polygon","coordinates":[[[47.97822265625001,7.9970703125],[46.97822265625001,7.9970703125],[43.98378906250002,9.008837890624989],[43.482519531250006,9.379492187499991],[43.181640625,9.879980468749991],[42.84160156250002,10.203076171874997],[42.65644531250001,10.6],[42.92275390625002,10.999316406249989],[43.24599609375002,11.499804687499989],[43.85273437500001,10.784277343749991],[44.38652343750002,10.430224609374989],[44.94296875,10.43671875],[45.81669921875002,10.835888671874997],[46.565039062500006,10.745996093749994],[47.40498046875001,11.174023437499997],[48.01923828125001,11.139355468749997],[48.57255859375002,11.320507812499997],[48.938574218750006,11.258447265624994],[50.11005859375001,11.529296875],[50.79228515625002,11.983691406249989],[51.2548828125,11.830712890624994],[51.08427734375002,11.335644531249997],[51.140625,10.656884765624994],[51.031835937500006,10.444775390624997],[51.19296875,10.554638671874997],[51.390234375,10.422607421875],[50.93007812500002,10.33554687499999],[50.825,9.428173828124997],[50.10283203125002,8.199804687499991],[49.85205078125,7.962548828124994],[49.234960937500006,6.77734375],[49.04931640625,6.173632812499989],[47.97529296875001,4.497021484374997],[46.87880859375002,3.28564453125],[46.05117187500002,2.475146484374989],[44.92021484375002,1.81015625],[43.71757812500002,0.857861328124997],[41.97988281250002,-0.973046875],[41.53271484375,-1.6953125],[41.521875,-1.572265625],[41.42695312500001,-1.449511718750003],[41.24980468750002,-1.220507812500003],[40.97871093750001,-0.870312500000011],[40.964453125,2.814648437499997],[41.341796875,3.20166015625],[41.61347656250001,3.590478515624994],[41.88398437500001,3.977734375],[41.91533203125002,4.031298828124989],[42.02412109375001,4.137939453125],[42.85664062500001,4.32421875],[43.12568359375001,4.644482421874997],[43.58349609375,4.85498046875],[43.988867187500006,4.950537109374991],[44.940527343750006,4.912011718749994],[47.97822265625001,7.9970703125]]]},"properties":{"name":"Somalia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[9.579979133936737,47.05856388629306],[9.409458596647225,47.02019676540292],[9.46249431093294,47.09010747968864],[9.46249431093294,47.19858962254578],[9.527658197470123,47.27026989773668],[9.579979133936737,47.05856388629306]]]},"properties":{"name":"Liechtenstein","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-8.683349609375,27.77800740805682],[-13.038761787013554,27.81190166624856],[-12.948925781249926,27.914160156250034],[-11.552685546874955,28.31010742187496],[-10.486474609374994,29.06494140625],[-10.200585937499994,29.380371093750057],[-9.667089843749949,30.10927734375005],[-9.652929687499977,30.447558593750045],[-9.875488281249943,30.717919921874966],[-9.80869140624992,31.42460937499996],[-9.347460937499932,32.086376953124955],[-9.245849609375,32.572460937499955],[-8.512841796874994,33.25244140625003],[-6.900976562499949,33.96904296874999],[-6.353125,34.77607421875001],[-5.924804687499943,35.78579101562502],[-5.277832031249943,35.90273437500002],[-5.252685546874972,35.61474609374997],[-4.628320312499966,35.206396484375006],[-4.329980468749937,35.161474609375006],[-3.693261718749994,35.27998046874998],[-3.394726562499926,35.21181640625005],[-2.972216796874989,35.40727539062499],[-2.839941406249949,35.127832031249994],[-2.731396484374955,35.13520507812498],[-2.636816406249977,35.11269531250002],[-2.423730468749994,35.12348632812498],[-2.219628906249966,35.10419921874998],[-1.795605468749926,34.751904296874955],[-1.67919921875,33.31865234375002],[-1.550732421874955,33.073583984375006],[-1.510009765625,32.877636718749955],[-1.45,32.784814453124966],[-1.352148437499977,32.70336914062497],[-1.29638671875,32.67568359375002],[-1.188232421875,32.608496093750006],[-1.111035156249983,32.55229492187502],[-1.065527343749949,32.46831054687496],[-1.16259765625,32.399169921875],[-1.275341796874983,32.089013671874966],[-2.863427734374937,32.07470703124997],[-2.930859374999926,32.04252929687499],[-2.988232421874983,31.874218749999983],[-3.01738281249996,31.834277343750017],[-3.439794921874949,31.704541015624983],[-3.604589843749949,31.686767578125],[-3.700244140624989,31.70009765625005],[-3.768164062499977,31.689550781250034],[-3.837109374999983,31.512353515624994],[-3.833398437499937,31.197802734375045],[-3.626904296874955,31.000927734374983],[-4.148779296874977,30.8095703125],[-4.322851562500006,30.698876953124994],[-4.52915039062492,30.62553710937499],[-4.778515624999926,30.552392578124994],[-4.968261718749943,30.465380859375045],[-5.061914062499937,30.326416015625057],[-5.180126953124955,30.166162109374994],[-5.293652343749983,30.058642578125045],[-5.44877929687496,29.956933593750023],[-6.00429687499999,29.83125],[-6.479736328124943,29.82036132812499],[-6.520556640624989,29.659863281249983],[-6.59775390624992,29.578955078125006],[-6.635351562499949,29.568798828124983],[-6.755126953125,29.583837890625034],[-6.855566406249949,29.601611328125017],[-7.142431640624949,29.61958007812504],[-7.427685546874983,29.425],[-7.485742187499994,29.392236328124994],[-8.659912109375,28.718603515625063],[-8.683349609375,27.900390625],[-8.683349609375,27.77800740805682]]]},"properties":{"name":"Morocco","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-13.038761787013554,27.81190166624856],[-8.683349609375,27.77800740805682],[-8.683349609375,27.65644531250004],[-8.817822265624955,27.65644531250004],[-8.817822265624951,27.656445312499997],[-8.683349609375,27.656445312499997],[-8.683349609375,27.2859375],[-8.682861328125,26.921337890624997],[-8.6826171875,26.72314453125],[-8.682324218749983,26.497705078124994],[-8.68212890625,26.273193359375],[-8.68212890625,26.10947265625],[-8.682226562499977,25.995507812499994],[-12.016308593749983,25.995410156250003],[-12.016308593749983,25.740136718749994],[-12.016308593749983,25.331689453124994],[-12.016308593749983,25.059375],[-12.016308593749983,24.923242187499994],[-12.016308593749983,24.378662109375],[-12.016308593749983,23.97021484375],[-12.0234375,23.467578125],[-12.372900390624977,23.318017578124994],[-12.559375,23.290820312500003],[-12.620410156249989,23.27133789062499],[-13.031494140625,23.000244140625],[-13.153271484374983,22.820507812499997],[-13.12702845982141,22.703770926339278],[-13.136540684091575,22.708182548616723],[-13.094335937499977,22.495996093749994],[-13.051220703124983,21.854785156250003],[-13.041748046875,21.713818359374997],[-13.0322265625,21.572070312500003],[-13.025097656249983,21.466796875],[-13.016210937499977,21.333935546874997],[-15.231201171875,21.331298828125],[-16.964550781249983,21.329248046874994],[-17.06396484375,20.89882812499999],[-17.048046874999983,20.80615234375],[-17.098779296874994,20.856884765624997],[-16.930859374999983,21.9],[-16.35874023437495,22.594531250000045],[-16.21025390624999,23.097900390625],[-15.789257812499926,23.792871093750023],[-15.980712890624943,23.670312500000023],[-15.899316406249966,23.844433593749955],[-14.904296875000028,24.719775390625017],[-14.794921874999943,25.404150390625006],[-14.413867187499932,26.25371093749999],[-13.57578125,26.735107421875],[-13.175976562499983,27.655712890624983],[-13.038761787013554,27.81190166624856]],[[-8.774365234374983,27.460546875],[-8.794873046874983,27.120703125000034],[-8.794873046874983,27.120703125],[-8.774365234374983,27.460546875]]]},"properties":{"name":"W. Sahara","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[21.5625,42.247509765625],[21.560839843750017,42.24765625],[21.389550781250023,42.21982421875],[21.28662109375,42.100390625],[21.05976562500001,42.171289062499994],[20.778125,42.071044921875],[20.725,41.87353515625],[20.566210937500017,41.873681640624994],[20.485449218750006,42.223388671875],[20.06396484375,42.54726562499999],[20.054296875,42.760058593749996],[20.344335937500006,42.827929687499996],[20.40996305279786,42.84373166741877],[20.344335937500063,42.82792968750002],[19.670996093750006,43.163964843749994],[19.21875,43.449951171875],[19.196484375000068,43.48500976562502],[19.19160156250004,43.52104492187499],[19.19433593749997,43.533300781250006],[19.495117187500057,43.642871093750045],[19.245019531249994,43.96503906250004],[19.583789062500017,44.04345703125003],[19.118457031250074,44.359960937500006],[19.348632812500057,44.88090820312502],[19.007128906250045,44.86918945312502],[19.062890625000023,45.13720703125],[19.4,45.2125],[19.004687500000074,45.39951171875006],[19.064257812500045,45.51499023437506],[18.839062499999983,45.83574218750002],[18.905371093750006,45.931738281250034],[19.421289062500023,46.064453125],[19.61347656250001,46.169189453125],[19.84443359375001,46.145898437499966],[19.934082031250057,46.161474609375034],[20.161425781250017,46.14189453124996],[20.210156250000068,46.12602539062502],[20.241796875000034,46.10859375000001],[20.301367187500006,46.05068359375002],[20.35859375000004,45.975488281249994],[20.581152343749977,45.86948242187506],[20.65273437499999,45.779394531250006],[20.709277343750074,45.735253906249994],[20.727832031250017,45.73740234374998],[20.746875,45.74897460937501],[20.76015625000005,45.75810546875002],[20.775,45.74980468750002],[20.794042968750006,45.467871093750034],[21.431445312500017,45.192529296874994],[21.465429687500006,45.171875],[21.357031250000034,44.99077148437502],[21.532324218750063,44.900683593750045],[21.519921875000023,44.88081054687498],[21.442187500000074,44.87338867187498],[21.384375,44.87006835937501],[21.357910156250057,44.86181640625003],[21.36005859375004,44.82666015624997],[21.52314453125004,44.79008789062499],[21.63613281250005,44.71044921875],[21.909277343750034,44.666113281250034],[22.026953125,44.61987304687503],[22.093066406250074,44.541943359374955],[22.200976562500017,44.560693359374966],[22.350683593750063,44.676123046875034],[22.497656249999977,44.70625],[22.64208984375,44.65097656249998],[22.720898437499983,44.605517578125045],[22.734375,44.56992187499998],[22.700781250000063,44.55551757812498],[22.620117187500057,44.562353515625034],[22.554003906250017,44.54033203124999],[22.49453125000005,44.43544921875002],[22.687890625000023,44.248291015625],[22.42080078125005,44.00742187500006],[22.399023437500063,43.96953125],[22.36542968750004,43.86210937500002],[22.36962890625003,43.78129882812499],[22.55458984375005,43.45449218750002],[22.767578125,43.35415039062502],[22.81972656250005,43.300732421874955],[22.85957031250001,43.252343749999966],[22.97685546874999,43.18798828125],[22.799902343750006,42.985742187499994],[22.706152343750006,42.88393554687505],[22.466796875,42.842480468749955],[22.53242187500004,42.48120117187497],[22.523535156250006,42.440966796875045],[22.44570312500005,42.35913085937497],[22.42207031250004,42.32885742187503],[22.344042968750045,42.31396484375003],[22.23974609375003,42.303110028468716],[21.81464843750001,42.303125],[21.5625,42.24750976562498],[21.5625,42.247509765625]]]},"properties":{"name":"Serbia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[74.54140625000002,37.02216796875],[74.03886718750002,36.825732421874996],[73.116796875,36.868554687499994],[72.24980468750002,36.734716796875],[71.23291015625,36.12177734375],[71.18505859375,36.04208984375],[71.57197265625001,35.546826171875],[71.62050781250002,35.183007812499994],[70.965625,34.53037109375],[71.095703125,34.369433593749996],[71.05156250000002,34.049707031249994],[70.65400390625001,33.952294921874994],[69.8896484375,34.007275390625],[70.26113281250002,33.289013671875],[69.5015625,33.020068359374996],[69.24140625000001,32.433544921875],[69.279296875,31.936816406249996],[68.86894531250002,31.634228515624997],[68.59765625,31.802978515625],[68.16103515625002,31.802978515625],[67.57822265625,31.506494140624994],[67.737890625,31.343945312499997],[67.45283203125001,31.234619140625],[66.82929687500001,31.263671875],[66.346875,30.802783203124996],[66.23125,29.86572265625],[65.09550781250002,29.559472656249994],[64.39375,29.544335937499994],[64.09873046875,29.391943359375],[63.56757812500001,29.497998046874997],[62.4765625,29.408349609374994],[62.0009765625,29.530419921874994],[61.22441406250002,29.749414062499994],[60.843359375,29.858691406249996],[61.331640625,30.363720703124997],[61.55947265625002,30.599365234375],[61.7841796875,30.831933593749994],[61.81083984375002,30.91328125],[61.81425781250002,31.072558593749996],[61.75507812500001,31.285302734374994],[61.66015625,31.382421875],[61.34648437500002,31.421630859375],[61.11074218750002,31.451123046874997],[60.854101562500006,31.483251953125],[60.82070312500002,31.495166015624996],[60.791601562500006,31.660595703124997],[60.804296875,31.73447265625],[60.7875,31.877197265625],[60.78994140625002,31.987109375],[60.827246093750006,32.16796875],[60.82929687500001,32.249414062499994],[60.71044921875,32.6],[60.57656250000002,32.994873046875],[60.560546875,33.137841796874994],[60.9169921875,33.505224609375],[60.573828125,33.588330078125],[60.4859375,33.7119140625],[60.48574218750002,34.094775390624996],[60.642675781250006,34.307177734374996],[60.88945312500002,34.31943359375],[60.80390625000001,34.418017578124996],[60.76259765625002,34.475244140624994],[60.73613281250002,34.491796875],[60.72626953125001,34.51826171875],[60.73945312500001,34.544726562499996],[60.80234375,34.554638671875],[60.8453125,34.587695312499996],[60.91474609375001,34.633984375],[60.951171875,34.653857421874996],[61.080078125,34.855615234374994],[61.1,35.272314453125],[61.18925781250002,35.31201171875],[61.24550781250002,35.474072265625],[61.27851562500001,35.51376953125],[61.281835937500006,35.55341796875],[61.26201171875002,35.619580078125],[61.3447265625,35.6294921875],[61.62099609375002,35.43232421875],[62.08964843750002,35.3796875],[62.30781250000001,35.170800781249994],[62.688085937500006,35.255322265625],[63.056640625,35.44580078125],[63.08417968750001,35.56806640625],[63.16972656250002,35.678125],[63.129980468750006,35.84619140625],[63.8625,36.012353515624994],[64.184375,36.14892578125],[64.51103515625002,36.340673828125],[64.56582031250002,36.427587890625],[64.6025390625,36.554541015625],[64.78242187500001,37.05927734375],[64.81630859375002,37.132080078125],[64.95156250000002,37.1935546875],[65.08964843750002,37.237939453124994],[65.30361328125002,37.24677734375],[65.55498046875002,37.251171875],[65.76503906250002,37.569140625],[66.471875,37.3447265625],[66.52226562500002,37.348486328125],[66.827734375,37.3712890625],[67.06884765625,37.334814453125],[67.19550781250001,37.235205078125],[67.31972656250002,37.2095703125],[67.44169921875002,37.2580078125],[67.51728515625001,37.266650390624996],[67.546484375,37.235644531249996],[67.607421875,37.222509765625],[67.7,37.22724609375],[67.7529296875,37.1998046875],[67.75898437500001,37.172216796875],[67.76601562500002,37.14013671875],[67.83447265625,37.064208984375],[67.9580078125,36.972021484375],[68.06777343750002,36.9498046875],[68.26093750000001,37.013085937499994],[68.284765625,37.036328125],[68.29951171875001,37.088427734374996],[68.38691406250001,37.1375],[68.66914062500001,37.2583984375],[68.7232421875,37.268017578125],[68.78203125000002,37.2580078125],[68.82373046875,37.270703125],[68.8384765625,37.30283203125],[68.85537109375002,37.316845703125],[68.88525390625,37.328076171875],[68.91181640625001,37.333935546875],[68.96044921875,37.325048828125],[69.18017578125,37.15830078125],[69.26484375000001,37.1083984375],[69.30390625000001,37.116943359375],[69.35380859375002,37.150048828124994],[69.41445312500002,37.207763671875],[69.4296875,37.290869140625],[69.39921875000002,37.399316406249994],[69.42011718750001,37.48671875],[69.49208984375002,37.553076171875],[69.62578125000002,37.594042968749996],[69.8208984375,37.6095703125],[69.9849609375,37.566162109375],[70.18867187500001,37.582470703125],[70.25146484375,37.66416015625],[70.25498046875,37.765380859375],[70.19941406250001,37.886035156249996],[70.21464843750002,37.9244140625],[70.41777343750002,38.075439453125],[70.7359375,38.42255859375],[71.255859375,38.306982421875],[71.33271484375001,38.170263671875],[71.27851562500001,37.918408203125],[71.319921875,37.90185546875],[71.3896484375,37.906298828124996],[71.48779296875,37.931884765625],[71.55195312500001,37.933154296874996],[71.58222656250001,37.910107421875],[71.43291015625002,37.1275390625],[71.530859375,36.845117187499994],[71.665625,36.696923828124994],[72.65742187500001,37.029052734375],[72.8955078125,37.267529296875],[73.21113281250001,37.408496093749996],[73.38291015625,37.462255859375],[73.48134765625002,37.4716796875],[73.60468750000001,37.446044921875],[73.65712890625002,37.43046875],[73.72060546875002,37.41875],[73.73378906250002,37.37578125],[73.71728515625,37.329443359375],[73.6275390625,37.261572265625],[73.65351562500001,37.23935546875],[73.749609375,37.231787109375],[74.16708984375,37.329443359375],[74.20351562500002,37.372460937499994],[74.25966796875002,37.415429687499994],[74.659375,37.394482421875],[74.73056640625,37.35703125],[74.83046875000002,37.2859375],[74.89130859375001,37.231640625],[74.84023437500002,37.225048828125],[74.76738281250002,37.249169921874994],[74.73896484375001,37.28564453125],[74.72666015625,37.29072265625],[74.6689453125,37.26669921875],[74.55898437500002,37.236621093749996],[74.37216796875,37.15771484375],[74.37617187500001,37.137353515624994],[74.49794921875002,37.0572265625],[74.52646484375,37.030664062499994],[74.54140625000002,37.02216796875]]]},"properties":{"name":"Afghanistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[17.57958984375,-8.099023437500009],[17.643359375000017,-8.090722656250009],[18.00878906250003,-8.107617187499983],[18.56269531250001,-7.9359375],[18.944433593750063,-8.001464843750028],[19.142675781250034,-8.001464843750028],[19.34082031249997,-7.966601562500031],[19.369921875000045,-7.706542968749986],[19.371679687500063,-7.655078124999989],[19.47988281250008,-7.472167968750028],[19.48378906250008,-7.279492187500026],[19.527636718750017,-7.144433593749952],[19.87519531250004,-6.986328124999986],[19.99746093750008,-6.976464843750023],[20.190039062500063,-6.9462890625],[20.482226562500074,-6.915820312500017],[20.59003906250001,-6.919921874999957],[20.598730468750006,-6.935156249999949],[20.536914062500045,-7.121777343749955],[20.535839843749983,-7.182812499999955],[20.558398437500045,-7.244433593749989],[20.60781250000008,-7.277734375000023],[20.910937500000017,-7.281445312499983],[21.190332031250023,-7.284960937499989],[21.751074218750034,-7.305468749999989],[21.80605468750005,-7.32861328125],[21.905371093750034,-8.693359374999943],[21.813183593750068,-9.46875],[22.19775390625,-10.040625],[22.30703125000005,-10.691308593750023],[22.203515625000023,-10.829492187500009],[22.226171875,-11.121972656250009],[22.27880859375,-11.19414062499996],[22.314941406250057,-11.198632812499994],[22.39296875000005,-11.159472656250003],[22.486132812500045,-11.086718750000017],[22.56103515625003,-11.05585937500004],[22.814746093750017,-11.08027343750004],[23.076269531250006,-11.087890624999986],[23.463964843750034,-10.969335937499991],[23.83388671875008,-11.013671874999972],[23.96650390625001,-10.871777343750011],[23.98388671875,-11.725],[23.909375,-12.636132812500009],[23.886523437500045,-12.743261718749991],[23.882421875,-12.799023437499983],[23.968066406250045,-12.956933593749994],[23.962988281250006,-12.988476562500026],[23.843164062500023,-13.0009765625],[22.209570312500006,-13.0009765625],[21.97890625000008,-13.0009765625],[21.979101562500034,-13.798730468749994],[21.979296875000074,-14.11962890625],[21.979394531249994,-14.440527343750006],[21.97978515624999,-15.955566406250014],[22.193945312500006,-16.628125],[23.380664062500017,-17.640625],[22.32421875,-17.8375],[20.74550781250008,-18.019726562499983],[20.194335937500057,-17.86367187499999],[18.95527343750004,-17.80351562499999],[18.39638671875005,-17.3994140625],[16.14843750000003,-17.39023437499999],[14.017480468750023,-17.40888671874997],[13.475976562500023,-17.04003906249997],[13.179492187500017,-16.971679687499986],[12.548144531250017,-17.212695312499974],[12.35927734375008,-17.205859375],[12.318457031250006,-17.21337890625003],[12.213378906250028,-17.209960937500043],[12.013964843750074,-17.168554687500034],[11.902539062500011,-17.226562499999957],[11.743066406250023,-17.24921875000004],[11.780078125000017,-16.87128906249997],[11.818945312500034,-16.704101562500014],[11.750878906250023,-15.831933593749966],[12.016113281250057,-15.513671874999957],[12.55048828125004,-13.437792968750003],[12.983203124999989,-12.775683593750017],[13.4169921875,-12.52041015624998],[13.597949218750017,-12.286132812500028],[13.785351562499983,-11.81279296874996],[13.833593750000063,-10.9296875],[13.33222656250004,-9.998925781250009],[12.99853515625,-9.048046875],[13.358984375,-8.687207031250026],[13.378515625000063,-8.369726562500006],[12.82343750000004,-6.954785156249955],[12.283300781250063,-6.12431640624996],[13.184375,-5.85625],[13.346484375000017,-5.863378906250006],[13.978515625,-5.857226562500003],[16.315234375000074,-5.865625],[16.431445312500045,-5.90019531249996],[16.53710937499997,-5.9658203125],[16.697265625,-6.164257812500026],[16.74296874999999,-6.618457031250003],[16.813085937500063,-6.772558593749963],[16.919433593750057,-6.93398437499998],[16.98476562500005,-7.257421874999977],[17.57958984375,-8.099023437500009]]],[[[12.50146484375,-4.5875],[12.848144531250028,-4.428906249999983],[12.881054687500068,-4.445117187499989],[12.971386718750068,-4.551757812499957],[13.048046875000068,-4.619238281250034],[13.072753906250028,-4.634765625],[13.057324218750011,-4.651074218750026],[12.947460937500011,-4.695312499999986],[12.829687499999977,-4.73662109374996],[12.451464843750017,-5.071484374999969],[12.453222656250034,-5.090625],[12.52236328125008,-5.148925781250028],[12.484570312500011,-5.71875],[12.213671875000074,-5.758691406249994],[12.177148437499994,-5.324804687499977],[12.018359375000074,-5.004296874999966],[12.50146484375,-4.5875]]]]},"properties":{"name":"Angola","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[20.06396484375,42.54726562499999],[20.485449218750006,42.223388671875],[20.566210937500017,41.873681640624994],[20.48896484375001,41.272607421874994],[20.709277343750017,40.928369140624994],[20.964257812500023,40.849902343749996],[20.95576171875001,40.775292968749994],[21.030859375,40.622460937499994],[20.881640625000017,40.467919921874994],[20.65742187500001,40.1173828125],[20.4560546875,40.065576171874994],[20.408007812500017,40.049462890624994],[20.383691406250023,40.0171875],[20.338476562500006,39.991064453125],[20.311132812500006,39.979443359375],[20.311328125000017,39.95078125],[20.381640625000017,39.841796875],[20.382421875,39.802636718749994],[20.206835937500017,39.653515625],[20.13105468750001,39.66162109375],[20.05976562500001,39.699121093749994],[20.022558593750006,39.710693359375],[20.001269531250017,39.709423828125],[19.851855468750017,40.0435546875],[19.322265625,40.407080078125],[19.45917968750001,40.40537109375],[19.3375,40.663818359375],[19.57568359375,41.640429687499996],[19.577539062500023,41.7875],[19.342382812500006,41.869091796875],[19.280664062500023,42.17255859375],[19.65449218750001,42.628564453124994],[19.78828125000001,42.476171875],[20.06396484375,42.54726562499999]]]},"properties":{"name":"Albania","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[19.66230468750001,60.187158203124994],[19.53652343750005,60.14497070312501],[19.551367187500063,60.24384765625001],[19.66230468750001,60.187158203124994]]],[[[19.989550781250074,60.351171875],[20.258886718750063,60.26127929687499],[19.799804687500057,60.08173828125001],[19.68691406250005,60.267626953125045],[19.84765625000003,60.22055664062506],[19.823046875000074,60.390185546875045],[19.989550781250074,60.351171875]]]]},"properties":{"name":"Aland","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[1.7060546875,42.503320312499994],[1.534082031250023,42.441699218749996],[1.448828125,42.437451171875],[1.428125,42.46132812499999],[1.414843750000017,42.548388671874996],[1.428320312500006,42.5958984375],[1.501367187500023,42.642724609374994],[1.568164062500017,42.635009765625],[1.709863281250023,42.604443359375],[1.739453125000011,42.575927734375],[1.740234375,42.55673828125],[1.713964843750006,42.525634765625],[1.7060546875,42.503320312499994]]]},"properties":{"name":"Andorra","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[53.927832031250006,24.177197265624983],[53.63447265625004,24.169775390624977],[53.83378906250002,24.258935546875023],[53.927832031250006,24.177197265624983]]],[[[53.3322265625001,24.258593750000045],[53.19091796874997,24.290917968749966],[53.412402343750074,24.411035156250023],[53.3322265625001,24.258593750000045]]],[[[56.29785156250003,25.650683593750045],[56.38798828125002,24.97919921875004],[56.06386718750005,24.73876953125],[56.00058593750006,24.953222656249977],[55.795703125000074,24.868115234374955],[55.76083984375006,24.24267578125],[55.92861328125005,24.215136718750074],[55.98515625000002,24.063378906249966],[55.4684570312501,23.94111328125001],[55.53164062499999,23.81904296875001],[55.1999023437501,23.034765625000034],[55.185839843750074,22.7041015625],[55.104296875000074,22.621484375000023],[52.55507812500005,22.932812499999955],[51.592578125000074,24.07885742187503],[51.56835937500003,24.286181640625074],[51.76757812500003,24.25439453125],[51.84316406250005,24.010888671875023],[52.118554687499994,23.97109375],[52.64824218750002,24.154638671875006],[53.80175781249997,24.069482421874966],[54.14794921875003,24.17119140624999],[54.39707031250006,24.278173828125034],[54.74677734375004,24.810449218750023],[55.94121093750002,25.793994140625017],[56.08046875,26.06264648437505],[56.16748046875003,26.047460937499977],[56.144628906250006,25.690527343750006],[56.29785156250003,25.650683593750045]]]]},"properties":{"name":"United Arab Emirates","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-64.54916992187498,-54.71621093749998],[-63.81542968749997,-54.725097656250014],[-64.637353515625,-54.90253906250001],[-64.75732421875,-54.82656249999999],[-64.54916992187498,-54.71621093749998]]],[[[-68.65322265624994,-54.85361328124999],[-68.62993164062499,-52.65263671875004],[-68.24013671875,-53.08183593749999],[-68.43115234375,-53.0552734375],[-68.48852539062497,-53.260937499999976],[-68.16113281249997,-53.30644531250001],[-68.00849609374995,-53.5640625],[-67.29423828125002,-54.049804687500014],[-66.23564453124999,-54.53349609374997],[-65.17900390624993,-54.678125],[-65.47114257812495,-54.91464843749999],[-66.5111328125,-55.032128906249945],[-67.127099609375,-54.90380859375001],[-68.65322265624994,-54.85361328124999]]],[[[-61.084716796875,-23.65644531250001],[-60.83984375000003,-23.85810546874997],[-59.89248046874994,-24.093554687499974],[-59.18725585937497,-24.56230468749999],[-57.82167968749994,-25.136425781249983],[-57.56313476562494,-25.473730468749963],[-57.943115234375,-26.05292968750001],[-58.18149414062498,-26.30742187499999],[-58.222070312499994,-26.65],[-58.618603515624955,-27.13212890624996],[-58.64174804687494,-27.196093750000017],[-58.60483398437498,-27.314355468750037],[-58.16826171874993,-27.27343749999997],[-56.437158203124966,-27.553808593749977],[-56.16406250000003,-27.321484374999983],[-55.95146484374996,-27.325683593749957],[-55.789990234374926,-27.416406249999966],[-55.71464843749996,-27.41484375],[-55.632910156250006,-27.35712890624997],[-55.59379882812502,-27.288085937500014],[-55.597265625,-27.207617187499963],[-55.56489257812498,-27.15],[-55.496728515624966,-27.11533203124999],[-55.45063476562498,-27.068359375000014],[-55.426660156249994,-27.00927734374997],[-55.13593750000001,-26.931152343749957],[-54.934472656249994,-26.70253906250001],[-54.677734375,-26.308789062499997],[-54.631933593750006,-26.005761718749994],[-54.615869140624994,-25.576074218750023],[-54.44394531249998,-25.625],[-54.15458984374999,-25.523046874999963],[-53.89116210937499,-25.66884765625001],[-53.668554687500006,-26.288183593749977],[-53.83818359375002,-27.121093750000014],[-54.32700195312495,-27.423535156249997],[-54.82910156250003,-27.55058593750003],[-55.10151367187501,-27.866796874999963],[-55.72548828125002,-28.20410156250003],[-55.68725585937497,-28.38164062499996],[-55.890527343749994,-28.370019531249994],[-56.938623046874994,-29.594824218750034],[-57.22465820312499,-29.782128906249994],[-57.40522460937501,-30.03388671875004],[-57.563867187499994,-30.139941406249974],[-57.60888671875003,-30.187792968750045],[-57.65087890624997,-30.295019531250034],[-57.71269531249996,-30.38447265624997],[-57.83120117187502,-30.495214843749963],[-57.87250976562501,-30.591015625000026],[-57.81059570312499,-30.85859375000001],[-57.88632812499998,-30.937402343749994],[-57.86840820312497,-31.104394531249994],[-57.89335937499999,-31.195312499999957],[-58.03339843750001,-31.416601562500006],[-58.053857421874994,-31.494921874999974],[-58.009667968749966,-31.534375],[-57.98798828124998,-31.576171875],[-58.00698242187494,-31.684960937499966],[-58.04233398437495,-31.769238281249997],[-58.16748046874997,-31.87265625],[-58.18901367187499,-31.924218750000037],[-58.16040039062503,-31.986523437500026],[-58.156347656250006,-32.0515625],[-58.17700195312494,-32.11904296875002],[-58.16479492187494,-32.18486328125002],[-58.119726562500006,-32.24892578125002],[-58.12304687499997,-32.321875],[-58.201171875,-32.471679687500014],[-58.219970703125,-32.563964843749986],[-58.17099609374998,-32.95927734374996],[-58.424462890624994,-33.11152343749998],[-58.54721679687498,-33.66347656249998],[-58.392480468749966,-34.192968750000034],[-58.52548828124998,-34.29619140625002],[-58.28334960937494,-34.68349609375005],[-57.54785156250003,-35.018945312499994],[-57.170654296875,-35.3625],[-57.35390624999994,-35.72031249999998],[-57.33544921875,-36.026757812499966],[-57.07617187499994,-36.296777343749994],[-56.74946289062501,-36.346484375],[-56.67202148437494,-36.85126953124998],[-57.546972656250034,-38.085644531250026],[-58.17919921874994,-38.435839843750045],[-59.82832031250001,-38.83818359375003],[-61.112207031249994,-38.99296875000003],[-61.84790039062497,-38.961816406249994],[-62.33476562499993,-38.80009765625],[-62.29506835937502,-39.24326171874996],[-62.053662109374955,-39.373828125],[-62.179345703124994,-39.38046875000002],[-62.076806640624966,-39.46152343750002],[-62.131542968749926,-39.82539062499998],[-62.28691406249996,-39.89531250000002],[-62.40185546875003,-40.19658203125002],[-62.24633789062494,-40.674609374999974],[-62.39501953124997,-40.89082031249997],[-62.95903320312493,-41.10966796875006],[-63.621777343749955,-41.15976562499996],[-64.86948242187503,-40.735839843750014],[-65.13339843749998,-40.88066406250003],[-64.98637695312496,-42.102050781249986],[-64.53774414062494,-42.25458984374998],[-64.57099609374998,-42.416015625],[-64.42041015625003,-42.43378906249998],[-64.10087890624993,-42.395117187500006],[-64.06118164062494,-42.266113281250014],[-64.228515625,-42.21826171874996],[-63.795556640624994,-42.113867187500006],[-63.6298828125,-42.28271484375003],[-63.61733398437502,-42.695800781249986],[-64.03476562499998,-42.88125],[-64.48784179687499,-42.51347656250006],[-64.97070312499997,-42.66630859375002],[-65.02690429687496,-42.75888671874996],[-64.31914062499999,-42.968945312500026],[-64.83994140624998,-43.18886718749998],[-65.25234374999997,-43.571875],[-65.26552734375,-44.2796875],[-65.64760742187502,-44.661425781250045],[-65.63876953125,-45.0078125],[-66.19013671874995,-44.96474609375002],[-66.94140625,-45.25732421875003],[-67.59956054687495,-46.05253906250003],[-67.5064453125,-46.44277343749995],[-66.77685546874994,-47.005859375],[-65.99853515625,-47.09375],[-65.73808593749999,-47.34492187499998],[-65.81430664062495,-47.63818359374996],[-66.22524414062502,-47.826757812500006],[-65.93422851562497,-47.826757812500006],[-65.81005859374997,-47.941113281250026],[-67.46630859375,-48.95175781250004],[-67.68486328125002,-49.2466796875],[-67.82597656249999,-49.91962890625005],[-68.2572265625,-50.104589843749984],[-68.66757812500003,-49.75253906250003],[-68.66162109374997,-49.93574218750005],[-68.97958984375,-50.003027343749984],[-68.59794921874996,-50.00947265624997],[-68.421875,-50.15791015625001],[-69.04477539062495,-50.49912109374998],[-69.35859374999993,-51.028125],[-69.20102539062498,-50.99365234375001],[-69.03530273437497,-51.48896484375002],[-69.46542968750003,-51.58447265625003],[-68.96533203125003,-51.67714843749999],[-68.443359375,-52.35664062500004],[-69.96025390624993,-52.00820312500002],[-71.91865234374995,-51.98955078125004],[-72.40766601562501,-51.54082031250002],[-72.34023437499997,-50.68183593749999],[-72.50981445312496,-50.607519531250034],[-73.15292968749998,-50.73828125000003],[-73.50126953124996,-50.125292968750024],[-73.55419921875,-49.463867187500014],[-73.46157226562497,-49.31386718750001],[-73.13525390625,-49.30068359374999],[-73.03364257812501,-49.014355468750004],[-72.65126953125,-48.84160156249998],[-72.582861328125,-48.47539062499999],[-72.35473632812497,-48.36582031250005],[-72.32832031250001,-48.11005859374998],[-72.517919921875,-47.87636718749998],[-72.34594726562497,-47.49267578124997],[-71.90498046875001,-47.201660156250014],[-71.94023437499999,-46.83125],[-71.69965820312501,-46.6513671875],[-71.87568359374998,-46.160546875],[-71.63154296874998,-45.95371093749998],[-71.74619140624998,-45.57890625],[-71.34931640624995,-45.33193359374995],[-71.5962890625,-44.97919921875004],[-72.04169921874998,-44.90419921875004],[-72.06372070312503,-44.771875],[-71.26113281250002,-44.763085937499966],[-71.15971679687496,-44.56025390625004],[-71.21259765624998,-44.44121093750003],[-71.82001953124993,-44.38310546875],[-71.68007812500002,-43.92958984374998],[-71.90498046875001,-43.34755859374998],[-71.750634765625,-43.237304687499986],[-72.14643554687498,-42.990039062499974],[-72.10820312499993,-42.25185546874995],[-71.75,-42.04677734375001],[-71.91127929687497,-41.650390624999986],[-71.93212890624994,-40.69169921874999],[-71.70898437499997,-40.381738281249994],[-71.81831054687493,-40.17666015624995],[-71.65976562499998,-40.02080078125],[-71.71992187499995,-39.63525390624997],[-71.53945312499997,-39.60244140624995],[-71.40156249999995,-38.93505859374996],[-70.858642578125,-38.60449218750003],[-71.16757812499998,-37.76230468749996],[-71.19218750000002,-36.84365234375004],[-71.05551757812498,-36.52373046874996],[-70.40478515625,-36.06171874999998],[-70.41572265625001,-35.52304687500002],[-70.55517578125,-35.246875],[-70.39316406250003,-35.146875],[-70.05205078124999,-34.30078124999997],[-69.85244140625,-34.224316406250026],[-69.81962890624999,-33.28378906249999],[-70.08486328125002,-33.20175781249998],[-70.02197265625,-32.88457031250002],[-70.36376953125,-32.08349609374997],[-70.25439453125,-31.957714843750026],[-70.585205078125,-31.569433593749963],[-70.51958007812493,-31.1484375],[-70.30908203124994,-31.02265625000004],[-70.15322265625,-30.360937499999963],[-69.95634765624996,-30.35820312500003],[-69.84428710937493,-30.175],[-69.95996093749997,-30.078320312500026],[-70.02680664062501,-29.324023437500017],[-69.82788085937497,-29.10322265624997],[-69.65693359374995,-28.413574218749986],[-69.17441406249998,-27.924707031250037],[-68.84633789062494,-27.153710937499994],[-68.59208984375002,-27.140039062499966],[-68.31865234374999,-26.973242187500006],[-68.59160156249999,-26.47041015624997],[-68.41450195312498,-26.153710937500023],[-68.59208984375002,-25.420019531250034],[-68.38422851562495,-25.091894531249977],[-68.56201171875,-24.74736328125003],[-68.25029296875002,-24.391992187500023],[-67.35620117187503,-24.033789062499963],[-67.00878906249994,-23.00136718750005],[-67.19487304687493,-22.821679687500037],[-66.99111328125,-22.509863281250006],[-66.71171874999999,-22.216308593749986],[-66.36518554687501,-22.113769531249957],[-66.32246093750001,-22.053125],[-66.28212890624997,-21.94746093750001],[-66.24760742187496,-21.83046875],[-66.22016601562495,-21.802539062499974],[-66.174658203125,-21.805664062499986],[-66.09858398437495,-21.83505859375002],[-66.05859375,-21.87949218750002],[-65.86015624999999,-22.019726562499983],[-65.77104492187493,-22.099609375000014],[-65.68618164062497,-22.11025390625005],[-65.51879882812497,-22.094531250000045],[-64.99262695312498,-22.109667968750017],[-64.60551757812499,-22.228808593750045],[-64.52363281250001,-22.37158203125],[-64.47773437499998,-22.485351562499986],[-64.44550781249998,-22.585351562500023],[-64.37397460937498,-22.761035156250017],[-64.32529296875,-22.82763671875],[-64.30791015624993,-22.7953125],[-64.26640625000002,-22.60332031249996],[-63.97612304687502,-22.072558593750003],[-63.92167968749993,-22.028613281250017],[-62.843359375,-21.997265625000026],[-62.62597656250003,-22.29042968749998],[-62.54155273437496,-22.349609374999957],[-62.37250976562498,-22.439160156249997],[-62.21416015624996,-22.612402343750034],[-61.798535156249955,-23.18203125],[-61.084716796875,-23.65644531250001]]]]},"properties":{"name":"Argentina","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[46.490625,38.90668945312498],[46.1144531250001,38.877783203125034],[45.977441406249994,39.24389648437503],[45.76630859375004,39.37846679687499],[45.78447265625002,39.54560546875001],[45.456835937500074,39.494482421875006],[45.15283203125003,39.58266601562502],[45.03164062500005,39.76513671874997],[44.76826171875004,39.70351562500005],[44.28925781250004,40.040380859375006],[43.66621093750004,40.12636718750002],[43.56933593750003,40.48237304687498],[43.72265624999997,40.71953124999999],[43.43945312500003,41.10712890625001],[44.077246093750006,41.182519531249994],[44.81132812500002,41.259375],[45.001367187499994,41.29096679687498],[45.188574218750006,41.14741210937504],[45.07050781250004,41.075585937499966],[45.5875,40.846923828125],[45.37890624999997,40.67358398437506],[45.45439453125002,40.532373046874966],[45.96464843750002,40.233789062499966],[45.8859375000001,40.024853515624955],[45.57978515625004,39.9775390625],[46.202050781249994,39.59448242187503],[46.48144531249997,39.55517578125003],[46.36523437500003,39.402490234374994],[46.584765625000074,39.22368164062499],[46.400292968749994,39.1921875],[46.490625,38.90668945312498]]]},"properties":{"name":"Armenia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-170.72626953125,-14.351171875],[-170.8205078125,-14.312109375],[-170.568115234375,-14.266796875000011],[-170.72626953125,-14.351171875]]]},"properties":{"name":"American Samoa","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[69.2824218750001,-49.05888671875002],[69.16718750000004,-48.88291015624996],[69.36875,-48.89042968749998],[69.2824218750001,-49.05888671875002]]],[[[69.18486328125002,-49.10957031250004],[69.59277343749997,-48.97099609375005],[69.64404296875003,-49.11738281250003],[69.40507812500002,-49.18173828125],[69.5423828125,-49.25566406250005],[70.32021484375005,-49.05859374999996],[70.55546875000007,-49.201464843750024],[70.38613281250005,-49.433984374999966],[70.16582031250002,-49.34296874999998],[69.75996093750004,-49.430175781249986],[69.98642578125006,-49.58164062500003],[70.2477539062501,-49.53066406250003],[70.12431640625002,-49.70439453124999],[69.153125,-49.5296875],[68.99296875000007,-49.704980468750016],[68.81474609375002,-49.69960937499999],[68.88339843750006,-49.16494140624995],[68.76953125000003,-49.06591796875003],[69.00244140624997,-48.661230468750006],[69.13613281250005,-48.86103515625003],[69.05214843750005,-49.08193359375001],[69.18486328125002,-49.10957031250004]]],[[[51.83457031250006,-46.43994140625],[51.65927734375006,-46.37363281249999],[51.7418945312501,-46.32685546874997],[51.83457031250006,-46.43994140625]]]]},"properties":{"name":"Fr. S. Antarctic Lands","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[-61.71606445312503,17.037011718749994],[-61.85966796874996,17.013330078124966],[-61.887109374999966,17.09814453125],[-61.81728515624994,17.168945312500057],[-61.71606445312503,17.037011718749994]]]},"properties":{"name":"Antigua and Barb.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[147.35605468750006,-43.396972656250014],[147.30888671875007,-43.50078125000002],[147.10498046875003,-43.43115234374996],[147.28388671875004,-43.278906250000034],[147.35605468750006,-43.396972656250014]]],[[[145.04296875000003,-40.78671875],[145.28300781250002,-40.76992187500002],[146.31748046875006,-41.16347656250001],[146.72343750000002,-41.07802734375001],[146.84814453124997,-41.16806640624996],[146.98984375000006,-40.99238281249997],[147.45478515625004,-41.00166015624998],[147.62167968750012,-40.844726562499986],[147.87294921875005,-40.87255859374997],[147.96875,-40.779589843750045],[148.215234375,-40.85488281250002],[148.34257812500007,-42.21533203124997],[148.21367187500002,-41.97001953125],[147.92441406250006,-42.5724609375],[147.94541015625006,-43.18183593749997],[147.7858398437501,-43.22001953125002],[147.69892578125004,-43.12255859374997],[147.64794921874997,-43.02060546874999],[147.8,-42.928125],[147.57382812500006,-42.84570312499997],[147.4523437500001,-43.03339843750001],[147.29794921875006,-42.790917968749994],[147.24501953125005,-43.21591796874999],[146.99697265625005,-43.15634765625002],[147.07734375000004,-43.27587890625003],[146.87392578125,-43.6125],[146.54853515625004,-43.50888671874999],[146.04316406250004,-43.547167968749974],[145.99443359375007,-43.37607421875002],[146.20800781249997,-43.31621093749999],[145.8732421875001,-43.29238281250002],[145.48759765625002,-42.92666015625004],[145.19882812500006,-42.23085937500004],[145.46826171874997,-42.492871093750026],[145.51660156249997,-42.3544921875],[145.33105468750003,-42.14707031250002],[145.23486328124997,-42.19697265624997],[145.23818359375,-42.01962890624999],[144.76611328125003,-41.39003906249998],[144.64609375000006,-40.980859375],[144.71855468750002,-40.67226562500002],[145.04296875000003,-40.78671875]]],[[[148.23691406250006,-40.515136718749986],[148.18779296875007,-40.592578125000045],[148.11728515625012,-40.52148437499996],[148.23691406250006,-40.515136718749986]]],[[[144.784375,-40.506738281249966],[144.74804687499997,-40.589453125000034],[144.7833984375001,-40.434863281249974],[144.784375,-40.506738281249966]]],[[[148.32626953125006,-40.30693359375003],[148.40400390625004,-40.486523437500026],[148.02011718750012,-40.40419921874995],[148.32626953125006,-40.30693359375003]]],[[[148.000390625,-39.75761718750003],[148.29736328125003,-39.985742187499966],[148.31357421875012,-40.173535156250026],[148.10566406250004,-40.26210937499995],[147.76718750000012,-39.87031249999998],[148.000390625,-39.75761718750003]]],[[[143.92792968750004,-40.116113281249966],[143.83857421875004,-39.90410156250003],[144.00078125000007,-39.580175781250034],[144.14101562500005,-39.953808593750026],[143.92792968750004,-40.116113281249966]]],[[[145.31445312500003,-38.49082031249996],[145.35507812500012,-38.55703124999995],[145.12841796875003,-38.52763671875],[145.31445312500003,-38.49082031249996]]],[[[137.59648437500007,-35.73867187499998],[137.92890625000004,-35.72607421875],[138.12343750000005,-35.85234375],[137.67089843749997,-35.897949218750014],[137.44843750000004,-36.07480468749999],[137.20957031250012,-35.982421875],[136.7550781250001,-36.03310546875002],[136.540625,-35.89013671875003],[136.63867187499997,-35.74882812500002],[137.33408203125006,-35.59248046875004],[137.58496093749997,-35.620214843750006],[137.59648437500007,-35.73867187499998]]],[[[153.53876953125004,-27.436425781250037],[153.42656250000002,-27.70644531249998],[153.43544921875,-27.40537109375002],[153.53876953125004,-27.436425781250037]]],[[[113.18300781250005,-26.053125],[112.96425781250005,-25.78310546875001],[112.94707031250002,-25.531542968750017],[113.18300781250005,-26.053125]]],[[[153.07744140625002,-25.75078125],[152.97666015625012,-25.551367187499963],[153.03808593750003,-25.193164062500003],[153.22753906249997,-25.00576171875001],[153.14375,-24.814843750000023],[153.25693359375012,-24.72890625],[153.35019531250012,-25.063085937499963],[153.07744140625002,-25.75078125]]],[[[151.14658203125006,-23.49082031250002],[151.24013671875,-23.529687500000037],[151.23828124999997,-23.77578125],[151.03330078125006,-23.530175781250037],[151.14658203125006,-23.49082031250002]]],[[[115.44619140625005,-20.78779296875001],[115.31806640625004,-20.850585937500014],[115.43457031249997,-20.66796875000003],[115.44619140625005,-20.78779296875001]]],[[[149.04375,-20.29150390624997],[148.93886718750005,-20.283691406249986],[148.98105468750012,-20.153515625000026],[149.04375,-20.29150390624997]]],[[[146.27832031249997,-18.23125],[146.29882812499997,-18.48476562500005],[146.09882812500004,-18.251757812500003],[146.27832031249997,-18.23125]]],[[[139.45917968750004,-17.11455078124996],[139.49277343750006,-16.990429687499983],[139.57089843750006,-17.09443359375004],[139.45917968750004,-17.11455078124996]]],[[[139.50781250000003,-16.57304687499996],[139.1595703125,-16.74169921875003],[139.29296875000003,-16.467285156249986],[139.58789062499997,-16.39521484374997],[139.69775390624997,-16.514941406250017],[139.50781250000003,-16.57304687499996]]],[[[137.09365234375005,-15.778125],[136.94267578125002,-15.711718749999989],[137.00957031250007,-15.594824218749977],[137.09365234375005,-15.778125]]],[[[124.59726562500006,-15.40195312500002],[124.52421875000002,-15.421484375],[124.51933593750002,-15.26748046874998],[124.59726562500006,-15.40195312500002]]],[[[125.19882812500006,-14.57949218749998],[125.0912109375,-14.59169921874998],[125.15996093750002,-14.456054687499972],[125.19882812500006,-14.57949218749998]]],[[[136.71464843750002,-13.803906249999983],[136.89082031250004,-13.786621093750014],[136.74531250000004,-14.072656250000023],[136.95078125000006,-14.184277343750026],[136.89433593750002,-14.293066406249977],[136.33544921875003,-14.211816406250037],[136.42470703125,-13.864843749999963],[136.6556640625,-13.675878906250006],[136.71464843750002,-13.803906249999983]]],[[[136.23740234375006,-13.824511718750003],[136.12265625000012,-13.816601562499983],[136.21542968750012,-13.664746093750054],[136.23740234375006,-13.824511718750003]]],[[[136.33867187500007,-11.602343749999989],[136.18027343750006,-11.676757812499957],[136.47929687500002,-11.465917968749991],[136.33867187500007,-11.602343749999989]]],[[[130.45927734375007,-11.679296875000034],[130.60625,-11.816601562500026],[130.04326171875007,-11.787304687500011],[130.19755859375007,-11.658203125],[130.15283203124997,-11.477539062499972],[130.29492187499997,-11.33681640624998],[130.45927734375007,-11.679296875000034]]],[[[130.6188476562501,-11.376074218749991],[131.02304687500006,-11.334375],[131.26826171875004,-11.18984375],[131.53857421874997,-11.436914062500037],[130.95097656250007,-11.926464843750026],[130.51191406250004,-11.617871093749955],[130.38457031250002,-11.1921875],[130.6188476562501,-11.376074218749991]]],[[[136.59853515625,-11.378906249999943],[136.52656250000004,-11.438867187499994],[136.78027343749997,-11.0125],[136.59853515625,-11.378906249999943]]],[[[132.59335937500006,-11.302832031249991],[132.48378906250005,-11.037304687499983],[132.57880859375004,-10.968847656249977],[132.59335937500006,-11.302832031249991]]],[[[143.17890625000004,-11.954492187499966],[143.11025390625,-12.303515625000017],[143.40156250000004,-12.639941406249989],[143.5866210937501,-13.443652343750031],[143.54843750000012,-13.74101562499996],[143.75634765625003,-14.348828124999969],[143.96181640625005,-14.462890625000028],[144.473046875,-14.231835937500023],[144.64804687500006,-14.492480468750017],[145.28769531250006,-14.943164062499989],[145.42607421875002,-16.406152343749966],[145.75478515625,-16.879492187500034],[145.91210937499997,-16.9125],[146.12587890625005,-17.63525390625],[146.03222656249997,-18.272851562500037],[146.3332031250001,-18.55371093749997],[146.38339843750006,-18.97705078124997],[147.13876953125006,-19.39316406250002],[147.41855468750012,-19.378125],[147.7423828125001,-19.770117187499977],[148.759375,-20.28955078125003],[148.88476562499997,-20.480859375],[148.72998046874997,-20.4677734375],[148.68369140625012,-20.58017578124999],[149.20488281250007,-21.125097656249977],[149.45410156249997,-21.57871093750002],[149.70390625000002,-22.440527343750006],[149.82246093750004,-22.389843749999983],[149.97441406250007,-22.55068359374998],[149.94189453125003,-22.30810546875003],[150.07617187500003,-22.16445312499998],[150.54130859375002,-22.55908203125],[150.56855468750004,-22.38398437500004],[150.67246093750012,-22.418164062499983],[150.84316406250005,-23.4580078125],[151.15380859375003,-23.784082031249994],[151.83164062500006,-24.12294921875001],[152.12988281250003,-24.59755859374998],[152.45634765625007,-24.802441406249983],[152.65429687499997,-25.201953125000017],[152.91347656250005,-25.432128906250014],[152.98496093750012,-25.816210937500003],[153.16494140625,-25.964160156250045],[153.11679687500006,-27.194433593750034],[153.57568359375003,-28.24052734374999],[153.6168945312501,-28.673046875],[153.03056640625002,-30.563378906249994],[152.94394531250012,-31.43486328124999],[152.5592773437501,-32.045703125],[152.4704101562501,-32.439062500000034],[152.13652343750002,-32.678125],[152.1642578125001,-32.75742187499996],[151.812890625,-32.90107421875001],[151.29208984375012,-33.580957031249966],[151.28027343750003,-33.92666015625005],[151.12480468750007,-34.00527343749998],[151.23154296875006,-34.0296875],[150.8712890625001,-34.49912109374996],[150.80458984375,-35.01289062500001],[150.19531249999997,-35.83359374999996],[149.93271484375012,-37.528515625000026],[149.480859375,-37.77119140625],[147.87675781250002,-37.93417968749998],[146.8568359375,-38.663476562499966],[146.21748046875004,-38.72744140625004],[146.33662109375004,-38.89423828125],[146.46660156250007,-38.84033203125003],[146.40000000000012,-39.14550781250003],[146.1583984375001,-38.86572265624996],[145.93535156250002,-38.90175781250002],[145.79082031250007,-38.66699218749997],[145.39726562500002,-38.53535156249998],[145.54218750000004,-38.39384765625002],[145.4757812500001,-38.24375],[145.29277343750002,-38.237597656249974],[144.95957031250012,-38.500781250000045],[144.71777343749997,-38.34033203125004],[144.91142578125007,-38.34404296874999],[145.11992187500007,-38.091308593750014],[144.89130859375004,-37.899804687499994],[144.39550781250003,-38.13691406249998],[144.6652343750001,-38.20996093750003],[143.53896484375005,-38.82089843749998],[142.45585937500002,-38.38632812499999],[141.725,-38.27138671875002],[141.5939453125001,-38.38779296875002],[141.42421875,-38.36347656250004],[141.0109375000001,-38.07695312500003],[140.39042968750007,-37.89667968749998],[139.78427734375012,-37.24580078124998],[139.85732421875,-36.662109375],[139.72900390625003,-36.37138671875002],[138.9689453125001,-35.58076171874997],[139.17802734375007,-35.52304687500002],[139.289453125,-35.61132812499997],[139.28251953125002,-35.375390624999966],[138.521875,-35.6423828125],[138.184375,-35.612695312499994],[138.5111328125,-35.02441406249996],[138.48994140625004,-34.76357421875002],[138.0892578125,-34.16982421875002],[137.69169921875002,-35.14296875000004],[136.88359375000007,-35.23974609375004],[137.01425781250012,-34.91582031250003],[137.39101562500005,-34.91328124999997],[137.49384765625004,-34.16113281250003],[137.9318359375001,-33.57910156250003],[137.85234375000007,-33.20078124999996],[137.99257812500005,-33.094238281250014],[137.78320312500003,-32.578125],[137.79091796875,-32.82324218749996],[137.44228515625,-33.1935546875],[137.23730468750003,-33.62949218749999],[136.43066406249997,-34.02998046875004],[135.891015625,-34.660937499999974],[135.96972656249997,-34.98183593749998],[135.7923828125,-34.863281249999986],[135.64755859375006,-34.93964843750001],[135.12304687499997,-34.58574218750003],[135.21679687499997,-34.48730468749996],[135.45,-34.58105468749996],[135.21894531250004,-33.959765625000045],[134.88876953125012,-33.62636718749998],[134.79101562499997,-33.32832031250001],[134.60771484375002,-33.19013671875001],[134.30126953124997,-33.16503906249996],[134.17353515625004,-32.979101562500006],[134.10039062500007,-32.748632812500034],[134.22714843750006,-32.73056640624999],[134.23417968750007,-32.54853515625004],[133.66533203125007,-32.207226562500054],[133.21210937500004,-32.18378906249998],[132.75742187500012,-31.95625],[132.21464843750002,-32.00712890624996],[131.14365234375006,-31.49570312500005],[130.78300781250002,-31.604003906249986],[129.1876953125001,-31.659960937500017],[127.31982421874997,-32.2640625],[125.91718750000004,-32.296972656250034],[124.75878906250003,-32.882714843749994],[124.24375,-33.01523437499999],[123.50683593749997,-33.916210937500054],[122.15097656250006,-33.99179687499999],[122.06113281250006,-33.874414062499966],[121.40507812500007,-33.826757812500034],[119.85410156250012,-33.97470703124998],[119.45058593750005,-34.368261718750034],[118.89531250000007,-34.47988281250004],[118.13554687500002,-34.98662109374999],[117.58193359375005,-35.09775390624998],[116.51718750000012,-34.98789062499998],[115.98671875000005,-34.795019531250034],[115.56503906250012,-34.42578125000003],[115.00878906250003,-34.25585937499997],[114.9938476562501,-33.51533203125],[115.3587890625,-33.63994140624999],[115.68300781250005,-33.19287109375003],[115.6984375000001,-31.694531250000054],[115.07792968750007,-30.560449218750023],[114.85683593750005,-29.14296875],[114.16513671875012,-28.08066406250002],[114.028125,-27.34726562499999],[113.18476562500004,-26.182226562499963],[113.32324218749997,-26.243847656249997],[113.35605468750012,-26.080468750000023],[113.58164062500006,-26.558105468749986],[113.73369140625002,-26.59511718749998],[113.83642578125003,-26.50058593749999],[113.85283203125007,-26.33212890625005],[113.39531250000002,-25.71328125],[113.4513671875001,-25.599121093750014],[113.7130859375001,-25.83076171875004],[113.72373046875006,-26.129785156250037],[113.85390625,-26.01445312499999],[113.99199218750007,-26.32148437500001],[114.09033203124997,-26.393652343749963],[114.21572265625,-26.289453124999966],[114.2142578125,-25.851562500000014],[113.41767578125004,-24.435644531250034],[113.48984375000012,-23.869628906250014],[113.7570312500001,-23.418164062500054],[113.79511718750004,-22.91455078125003],[113.68281250000004,-22.637792968749963],[114.02285156250005,-21.881445312499977],[114.12392578125005,-21.828613281249957],[114.14160156250003,-22.483105468749983],[114.37773437500007,-22.341503906249997],[114.70927734375002,-21.82343749999997],[115.45615234375012,-21.49169921874997],[116.0109375000001,-21.030371093749963],[116.7067382812501,-20.653808593749986],[117.40625,-20.72119140625003],[118.19921875000003,-20.37519531249997],[118.75146484374997,-20.261914062499983],[119.10449218749997,-19.995312500000026],[119.58593750000003,-20.03828125],[120.99794921875,-19.604394531249966],[121.33769531250002,-19.31992187500002],[121.83378906250002,-18.477050781249986],[122.34541015625004,-18.11191406250002],[122.14746093749997,-17.54902343750001],[122.2609375000001,-17.135742187500014],[122.72041015625004,-16.78769531249999],[122.97070312499997,-16.436816406250003],[123.56308593750006,-17.520898437499966],[123.59355468750007,-17.03037109375005],[123.83105468750003,-17.120800781249997],[123.8744140625,-16.918652343750026],[123.4904296875001,-16.49072265624997],[123.62597656249997,-16.416308593750003],[123.60703125000006,-16.224023437499994],[123.72890625,-16.192480468749963],[123.85917968750007,-16.38232421875],[124.04443359374997,-16.264941406249974],[124.30039062500006,-16.388281249999977],[124.77197265624997,-16.40263671874996],[124.40488281250006,-16.298925781249977],[124.41640625,-16.133496093750026],[124.5768554687501,-16.11367187499998],[124.64853515625012,-15.870214843750034],[124.50429687500005,-15.972460937499989],[124.38164062500002,-15.758203125000037],[124.43955078125012,-15.493554687500037],[124.56162109375012,-15.496289062499969],[124.69257812500004,-15.273632812499997],[125.06298828125003,-15.44228515624998],[125.0729492187501,-15.306738281249991],[124.90917968750003,-15.310058593749957],[124.83906250000004,-15.160742187500006],[125.03818359375012,-15.004101562499969],[125.35566406250004,-15.119824218750011],[125.17871093749997,-14.714746093749994],[125.57978515625004,-14.483203124999989],[125.62773437500002,-14.256640625000017],[125.70458984374997,-14.29140625],[125.66162109375003,-14.529492187500011],[125.81953125000004,-14.469140624999966],[125.890625,-14.61796875],[126.0207031250001,-14.49453125],[126.0539062500001,-13.977246093750026],[126.1842773437501,-14.00205078125002],[126.25849609375004,-14.163574218749972],[126.403125,-14.018945312499994],[126.5697265625,-14.160937499999974],[126.7806640625,-13.955175781249977],[126.77558593750004,-13.788476562500037],[126.90322265625,-13.744140624999972],[127.45761718750006,-14.031445312499969],[128.18046875000007,-14.711621093749983],[128.06943359375012,-15.329296874999969],[128.15546875000004,-15.225585937499972],[128.25468750000002,-15.298535156250011],[128.175,-15.043164062500026],[128.57578125000006,-14.774511718750006],[129.05820312500012,-14.884375],[129.21582031249997,-15.160253906249991],[129.26757812500003,-14.871484375000051],[129.63476562499997,-15.139746093749991],[129.637109375,-14.850976562500037],[129.84873046875012,-14.828906249999989],[129.60468750000004,-14.647070312499977],[129.69794921875004,-14.557421875000017],[129.37871093750002,-14.39248046874998],[129.70986328125,-13.979980468749972],[129.83886718749997,-13.572949218749997],[130.25976562500003,-13.30224609375],[130.1349609375001,-13.145507812499957],[130.1681640625001,-12.957421875],[130.39990234374997,-12.68789062499999],[130.61748046875007,-12.646875],[130.62265625000006,-12.43105468749998],[130.8673828125001,-12.557812499999955],[130.87382812500007,-12.367187500000028],[131.29160156250006,-12.067871093749972],[131.43828125000002,-12.27695312500002],[132.06406250000006,-12.28076171875],[132.25322265625007,-12.186035156249972],[132.41103515625,-12.295117187499997],[132.51054687500002,-12.134863281250034],[132.71279296875,-12.1234375],[132.63046875000012,-12.035156249999972],[132.67421875000005,-11.649023437499991],[132.47519531250006,-11.491503906249974],[132.07285156250006,-11.474707031250006],[131.82246093750004,-11.302441406249997],[131.96152343750006,-11.180859375000011],[132.15546875000004,-11.311132812499991],[132.33398437499997,-11.223535156249994],[132.6828125000001,-11.505566406249997],[132.96103515625012,-11.407324218749963],[133.18525390625004,-11.705664062499991],[133.90419921875,-11.832031249999972],[134.4173828125,-12.052734375],[134.73027343750002,-11.984375],[135.02968750000005,-12.19375],[135.2179687500001,-12.221679687499957],[135.92246093750012,-11.825781250000034],[135.70439453125007,-12.209863281250037],[136.00849609375004,-12.19140625],[136.08183593750007,-12.422460937500006],[136.26064453125,-12.433789062499997],[136.32851562500005,-12.305566406249994],[136.24990234375,-12.173046875],[136.44335937499997,-11.951464843749974],[136.7194335937501,-12.226464843749952],[136.89746093749997,-12.243554687499966],[136.94746093750004,-12.34990234374996],[136.53701171875,-12.784277343749991],[136.59433593750012,-13.003808593750051],[136.46103515625006,-13.225195312500034],[136.29414062500004,-13.137988281250031],[135.92734375000012,-13.304296874999977],[135.95449218750005,-13.934863281250017],[135.40517578125005,-14.758203124999966],[135.4533203125001,-14.923144531250003],[136.20537109375002,-15.403417968749963],[136.29140625000005,-15.570117187500003],[136.70488281250007,-15.685253906250011],[136.78466796874997,-15.89423828125004],[137.00214843750004,-15.878320312499994],[137.70371093750006,-16.233007812499963],[138.24501953125005,-16.718359374999977],[139.00986328125006,-16.899316406249994],[139.2484375,-17.328613281249957],[140.03583984375004,-17.702636718749957],[140.51113281250005,-17.62451171875003],[140.83046875,-17.414453125000037],[141.29140625,-16.46347656250002],[141.62548828124997,-15.056640625000014],[141.52294921875003,-14.470117187499994],[141.59433593750006,-14.152832031250014],[141.47255859375,-13.797558593750011],[141.64541015625,-13.259082031250003],[141.61357421875002,-12.943457031250006],[141.92978515625006,-12.73984375],[141.67773437500003,-12.491406250000011],[141.68857421875012,-12.351074218750028],[141.87050781250005,-11.9755859375],[141.96113281250004,-12.054296874999963],[142.168359375,-10.946582031249974],[142.45644531250005,-10.707324218749989],[142.60507812500012,-10.748242187499983],[142.55273437500003,-10.874414062500023],[142.7796875,-11.115332031249977],[142.87255859374997,-11.821386718750034],[143.17890625000004,-11.954492187499966]]],[[[142.2748046875,-10.704785156250011],[142.19140624999997,-10.762011718750031],[142.1310546875001,-10.640625],[142.19794921875004,-10.59199218750004],[142.2748046875,-10.704785156250011]]]]},"properties":{"name":"Australia","childNum":30}},{"geometry":{"type":"Polygon","coordinates":[[[16.953125,48.598828125],[16.86542968750001,48.3869140625],[17.147363281250023,48.00595703125],[17.06660156250001,47.707568359374996],[16.421289062500023,47.674462890624994],[16.676562500000017,47.536035156249994],[16.44287109375,47.39951171875],[16.453417968750017,47.006787109375],[16.093066406250017,46.86328125],[15.957617187500006,46.677636718749994],[14.893261718750011,46.605908203125],[14.5498046875,46.399707031249996],[13.7,46.520263671875],[13.490039062500017,46.555566406249994],[13.3515625,46.557910156249996],[13.16875,46.57265625],[12.479199218750011,46.672509765624994],[12.38828125,46.70263671875],[12.330078125,46.759814453124996],[12.267968750000023,46.835888671875],[12.154101562500017,46.93525390625],[12.130761718750023,46.98476562499999],[12.16552734375,47.028173828125],[12.201269531250006,47.060888671875],[12.197167968750023,47.075],[12.16943359375,47.08212890625],[11.775683593750017,46.986083984375],[11.527539062500011,46.997412109375],[11.433203125,46.983056640624994],[11.244433593750017,46.97568359375],[11.133886718750006,46.936181640624994],[11.0634765625,46.859130859375],[11.025097656250011,46.79697265625],[10.993261718750006,46.777001953124994],[10.92734375,46.769482421875],[10.828906250000017,46.775244140625],[10.759765625,46.793310546875],[10.689257812500017,46.84638671875],[10.579785156250011,46.8537109375],[10.479394531250023,46.855126953124994],[10.452832031250011,46.86494140625],[10.45458984375,46.8994140625],[10.414941406250023,46.964404296874996],[10.349414062500017,46.98476562499999],[10.133496093750011,46.851513671875],[9.580273437500011,47.057373046875],[9.527539062500011,47.270751953125],[9.625878906250023,47.467041015625],[9.524023437500006,47.52421875],[9.748925781250023,47.575537109375],[9.839160156250017,47.552294921874996],[9.971582031250023,47.505322265625],[10.034082031250023,47.473583984375],[10.059863281250017,47.449072265625],[10.066308593750023,47.393359375],[10.200292968750006,47.363427734374994],[10.183007812500023,47.27880859375],[10.369140625,47.366064453125],[10.40390625,47.4169921875],[10.439453125,47.5515625],[10.482812500000023,47.541796875],[10.65869140625,47.547216796875],[10.741601562500023,47.52412109375],[10.873046875,47.52021484375],[11.0419921875,47.393115234374996],[12.185644531250006,47.61953125],[12.203808593750011,47.646728515625],[12.196875,47.70908203125],[12.209277343750017,47.71826171875],[12.268359375000017,47.702734375],[12.353540736607165,47.70264787946429],[12.492553013392856,47.68551897321428],[12.685839843750017,47.669335937499994],[12.771386718750023,47.639404296875],[12.796191406250017,47.60703125],[12.781152343750023,47.5904296875],[12.7828125,47.56416015625],[12.809375,47.5421875],[12.87890625,47.5064453125],[12.968066406250017,47.47568359375],[13.014355468750011,47.478076171874996],[13.031542968750017,47.5080078125],[13.047949218750006,47.579150390624996],[13.054101562500023,47.655126953125],[12.897656250000011,47.721875],[12.953515625000023,47.890625],[12.760351562500006,48.106982421874996],[13.215234375000023,48.301904296874994],[13.322851562500006,48.33125],[13.409375,48.394140625],[13.459863281250023,48.56455078125],[13.4716796875,48.571826171874996],[13.486621093750017,48.581835937499996],[13.636623883928596,48.580904017857144],[13.785351562500011,48.587451171874996],[13.798828125,48.6216796875],[13.802929687500011,48.747509765625],[13.814746093750017,48.766943359375],[14.049121093750017,48.602490234375],[14.691308593750023,48.59921875],[15.066796875000023,48.997851562499996],[16.057226562500006,48.754785156249994],[16.543554687500006,48.796240234375],[16.953125,48.598828125]]]},"properties":{"name":"Austria","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[46.1144531250001,38.877783203125034],[45.4796875000001,39.00625],[44.81718750000002,39.65043945312496],[44.76826171875004,39.70351562500005],[45.03164062500005,39.76513671874997],[45.15283203125003,39.58266601562502],[45.456835937500074,39.494482421875006],[45.78447265625002,39.54560546875001],[45.76630859375004,39.37846679687499],[45.977441406249994,39.24389648437503],[46.1144531250001,38.877783203125034]]],[[[48.572851562500006,41.84448242187503],[49.45673828125004,40.79985351562502],[49.77597656250006,40.583984375],[50.18251953125005,40.50478515625002],[50.3659179687501,40.279492187499955],[49.91884765625005,40.31640625000003],[49.55117187499999,40.19414062499999],[49.3244140625001,39.60834960937501],[49.36279296875003,39.349560546874955],[49.16533203125002,39.03027343750003],[49.013476562500074,39.13398437500001],[48.85449218750003,38.83881835937501],[48.86875,38.43549804687498],[48.59267578125005,38.41108398437498],[47.99648437499999,38.85375976562503],[48.292089843750006,39.01884765624999],[48.10439453125005,39.241113281249994],[48.322167968749994,39.39907226562502],[47.995898437500074,39.683935546875034],[46.490625,38.90668945312498],[46.400292968749994,39.1921875],[46.584765625000074,39.22368164062499],[46.36523437500003,39.402490234374994],[46.48144531249997,39.55517578125003],[46.202050781249994,39.59448242187503],[45.57978515625004,39.9775390625],[45.8859375000001,40.024853515624955],[45.96464843750002,40.233789062499966],[45.45439453125002,40.532373046874966],[45.37890624999997,40.67358398437506],[45.5875,40.846923828125],[45.07050781250004,41.075585937499966],[45.188574218750006,41.14741210937504],[45.001367187499994,41.29096679687498],[45.2171875,41.423193359375006],[45.28095703125004,41.449560546875034],[46.086523437500006,41.183837890625],[46.43095703125002,41.077050781249994],[46.534375,41.08857421875004],[46.62636718750005,41.15966796875006],[46.66240234375002,41.24550781250002],[46.67255859375004,41.28681640625001],[46.61894531250002,41.34375],[46.30546875000002,41.507714843749994],[46.18427734375004,41.70214843749997],[46.42988281250004,41.890966796875006],[46.74931640625002,41.812597656250006],[47.31767578125002,41.28242187500001],[47.79101562499997,41.19926757812502],[48.572851562500006,41.84448242187503]]]]},"properties":{"name":"Azerbaijan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[30.553613281250023,-2.400097656250011],[30.53369140625,-2.42626953125],[30.441992187500006,-2.613476562500011],[30.424218750000023,-2.6416015625],[30.47333984375001,-2.6943359375],[30.42402343750001,-2.824023437500003],[30.433496093750023,-2.87451171875],[30.515039062500023,-2.917578125],[30.604296875000017,-2.935253906250011],[30.70947265625,-2.977246093750011],[30.7802734375,-2.98486328125],[30.811132812500006,-3.116406250000011],[30.79023437500001,-3.274609375000011],[30.4,-3.65390625],[29.947265625,-4.307324218750011],[29.7177734375,-4.455859375],[29.403222656250023,-4.449316406250006],[29.211816406250023,-3.833789062500003],[29.224414062500017,-3.053515625],[29.01435546875001,-2.72021484375],[29.10205078125,-2.595703125],[29.390234375,-2.80859375],[29.698046875000017,-2.794726562500003],[29.8681640625,-2.71640625],[29.93017578125,-2.339550781250011],[30.117285156250006,-2.416601562500006],[30.408496093750017,-2.31298828125],[30.553613281250023,-2.400097656250011]]]},"properties":{"name":"Burundi","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[5.693554687500011,50.774755859375006],[5.993945312500017,50.75043945312504],[6.340917968750006,50.451757812500034],[6.116503906250045,50.120996093749966],[6.08906250000004,50.15458984374996],[6.054785156249977,50.154296875],[5.976269531250068,50.167187499999955],[5.866894531250068,50.08281250000002],[5.817382812500028,50.01269531250003],[5.7880859375,49.96123046875002],[5.744042968749994,49.91962890624998],[5.789746093749983,49.53828125000001],[5.50732421875,49.51088867187502],[4.867578125000051,49.78813476562502],[4.818652343750045,50.153173828125034],[4.545019531250063,49.96025390624999],[4.149316406250023,49.971582031249994],[4.174609375000017,50.24648437500005],[3.689355468750023,50.30605468750002],[3.595410156250068,50.47734374999999],[3.27333984375008,50.53154296875002],[3.10683593750008,50.779443359374994],[2.759375,50.750634765624994],[2.52490234375,51.097119140624955],[3.35009765625,51.37768554687503],[3.43251953125008,51.24575195312505],[3.902050781250011,51.20766601562502],[4.226171875000034,51.38647460937503],[5.03095703125004,51.46909179687498],[5.214160156250045,51.278955078124966],[5.796484375000034,51.153076171875],[5.693554687500011,50.774755859375006]]]},"properties":{"name":"Belgium","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[3.595410156250011,11.6962890625],[3.553906250000011,11.631884765624989],[3.490527343750017,11.49921875],[3.48779296875,11.395410156249994],[3.638867187500011,11.176855468749991],[3.65625,11.154589843749989],[3.6953125,11.1203125],[3.71640625,11.07958984375],[3.7568359375,10.76875],[3.83447265625,10.607421875],[3.771777343750017,10.417626953124994],[3.646582031250006,10.408984374999989],[3.60205078125,10.004541015624994],[3.3251953125,9.778466796874994],[3.044921875,9.083837890624991],[2.774804687500023,9.048535156249997],[2.703125,8.371826171875],[2.68603515625,7.873730468749997],[2.719335937500006,7.616259765624989],[2.7509765625,7.541894531249994],[2.78515625,7.476855468749989],[2.783984375000017,7.443408203124989],[2.765820312500011,7.422509765624994],[2.75048828125,7.395068359374989],[2.756738281250023,7.067919921874989],[2.721386718750011,6.980273437499989],[2.731738281250017,6.852832031249989],[2.7529296875,6.771630859374994],[2.774609375000011,6.711718749999989],[2.753710937500017,6.661767578124994],[2.735644531250017,6.595703125],[2.706445312500023,6.369238281249991],[1.62265625,6.216796875],[1.777929687500006,6.294628906249997],[1.530957031250011,6.992431640625],[1.624707031250011,6.997314453125],[1.600195312500006,9.050048828125],[1.3857421875,9.361669921874991],[1.330078125,9.996972656249994],[0.763378906250011,10.386669921874997],[0.900488281250006,10.993261718749991],[1.4267578125,11.447119140624991],[1.980371093750023,11.418408203124997],[2.38916015625,11.897070312499991],[2.366015625000017,12.221923828125],[2.805273437500006,12.383837890624989],[3.595410156250011,11.6962890625]]]},"properties":{"name":"Benin","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[0.217480468750011,14.911474609374991],[0.163867187500017,14.497216796874994],[0.382519531250011,14.245800781249997],[0.42919921875,13.972119140624997],[0.6181640625,13.703417968750003],[1.201171875,13.357519531249991],[0.988476562500011,13.36484375],[0.9873046875,13.041894531249994],[1.56494140625,12.635400390624994],[2.104589843750006,12.701269531249991],[2.226269531250011,12.466064453125],[2.072949218750011,12.309375],[2.38916015625,11.897070312499991],[1.980371093750023,11.418408203124997],[1.4267578125,11.447119140624991],[0.900488281250006,10.993261718749991],[0.49267578125,10.954980468749994],[-0.068603515625,11.115625],[-0.299462890624994,11.166894531249994],[-0.627148437499983,10.927392578124994],[-1.04248046875,11.010058593749989],[-2.829931640624977,10.998388671874991],[-2.914892578124977,10.592333984374989],[-2.791162109374994,10.432421874999989],[-2.780517578125,9.745849609375],[-2.765966796874977,9.658056640624991],[-2.706201171874994,9.533935546875],[-2.695849609374989,9.481347656249994],[-2.7171875,9.457128906249991],[-2.7666015625,9.424707031249994],[-2.816748046874977,9.425830078124989],[-2.875146484374994,9.500927734374997],[-2.90087890625,9.534619140624997],[-2.948144531249994,9.610742187499994],[-2.98828125,9.687353515624991],[-3.042626953124994,9.720898437499997],[-3.095800781249977,9.752099609374994],[-3.160693359374989,9.849169921874989],[-3.223535156249994,9.895458984374997],[-3.289697265624994,9.882226562499994],[-3.581152343749977,9.92431640625],[-3.790625,9.9171875],[-4.18115234375,9.78173828125],[-4.267187499999977,9.743261718749991],[-4.332226562499983,9.645703125],[-4.406201171874983,9.647998046874989],[-4.526611328125,9.723486328124991],[-4.625830078124977,9.713574218749997],[-4.721777343749977,9.756542968749997],[-5.262304687499977,10.319677734374991],[-5.523535156249977,10.426025390625],[-5.490478515625,11.042382812499994],[-5.250244140625,11.375781249999989],[-5.288134765624989,11.827929687499989],[-4.699316406249977,12.076171875],[-4.4287109375,12.337597656249997],[-4.480615234374994,12.672216796874991],[-4.227099609374989,12.793701171875],[-4.328710937499977,13.119042968749994],[-4.151025390624994,13.306201171875003],[-3.947314453124989,13.402197265624991],[-3.527636718749989,13.182714843749991],[-3.3017578125,13.28076171875],[-3.248632812499977,13.658349609374994],[-2.950830078124994,13.6484375],[-2.873925781249994,13.950732421875003],[-2.586718749999989,14.227587890625003],[-2.113232421874983,14.16845703125],[-1.97304687499999,14.45654296875],[-1.049560546875,14.81953125],[-0.760449218749983,15.047753906249994],[-0.235888671874989,15.059423828124991],[0.217480468750011,14.911474609374991]]]},"properties":{"name":"Burkina Faso","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[91.94921875000003,21.50805664062503],[91.85947265625012,21.532958984375057],[91.90771484374997,21.722949218750017],[91.94921875000003,21.50805664062503]]],[[[91.87382812500002,21.832128906249977],[91.8375976562501,21.750244140625],[91.85068359375012,21.927050781250045],[91.87382812500002,21.832128906249977]]],[[[91.15078125000005,22.175195312499966],[91.04472656250002,22.10517578125001],[91.0794921875,22.519726562499983],[91.15078125000005,22.175195312499966]]],[[[91.55673828125006,22.38222656250005],[91.41132812500004,22.475683593750006],[91.45605468749997,22.61650390624999],[91.55673828125006,22.38222656250005]]],[[[90.77763671875007,22.089306640624983],[90.51503906250005,22.06513671875001],[90.68046875000007,22.327490234375006],[90.50292968749997,22.835351562499994],[90.59648437500002,22.863525390625057],[90.86816406250003,22.48486328125],[90.77763671875007,22.089306640624983]]],[[[88.94072265625002,26.24536132812497],[88.97041015625004,26.250878906250023],[88.95195312500002,26.412109375],[89.01865234375012,26.410253906249977],[89.28925781250004,26.03759765625],[89.54990234375006,26.005273437499994],[89.57275390625003,26.13232421875003],[89.67089843750003,26.21381835937504],[89.8229492187501,25.94140625000003],[89.82490234375004,25.56015625],[89.80087890625012,25.33613281250001],[89.81406250000006,25.305371093749955],[89.86630859375012,25.293164062499955],[90.11962890625003,25.21997070312497],[90.61308593750002,25.16772460937497],[92.04970703125005,25.16948242187499],[92.46835937500006,24.94414062499999],[92.38496093750004,24.848779296875023],[92.25126953125007,24.895068359375045],[92.22832031250002,24.88134765625],[92.22666015625012,24.77099609374997],[92.11748046875002,24.493945312500017],[92.06416015625004,24.374365234375006],[91.84619140624997,24.17529296875003],[91.72656250000003,24.20507812499997],[91.35019531250012,24.06049804687501],[91.16044921875007,23.66064453125],[91.359375,23.06835937500003],[91.43623046875004,23.19990234375001],[91.55351562500002,22.991552734375006],[91.61953125,22.97968750000001],[91.75097656250003,23.053515625000017],[91.75419921875007,23.287304687499955],[91.79003906249997,23.361035156249983],[91.937890625,23.504687500000017],[91.92949218750007,23.598242187499977],[91.92958984375,23.68598632812501],[91.97851562500003,23.691992187499977],[92.04404296875006,23.677783203125017],[92.24609375000003,23.683593750000057],[92.33378906250002,23.242382812499955],[92.36162109375002,22.929003906250074],[92.46445312500006,22.734423828125045],[92.49140625000004,22.685400390625006],[92.5612304687501,22.04804687500001],[92.57490234375004,21.978076171875045],[92.58281250000002,21.940332031249994],[92.5934570312501,21.46733398437499],[92.63164062500002,21.306201171875045],[92.33056640624997,21.439794921874977],[92.17958984375005,21.293115234375023],[92.32412109375,20.791845703125063],[92.0560546875,21.1748046875],[91.86337890625012,22.350488281249966],[91.7970703125001,22.297460937500006],[91.48007812500006,22.884814453125045],[91.2162109375,22.642236328124994],[90.94560546875002,22.597021484375034],[90.65625,23.025488281250006],[90.60400390624997,23.59135742187499],[90.55566406249997,23.42153320312505],[90.26914062500012,23.455859375000017],[90.59091796875012,23.266406250000045],[90.43505859374997,22.751904296874955],[90.61611328125,22.362158203125034],[90.23056640625006,21.82978515625004],[90.07119140625005,21.887255859375017],[90.20957031250006,22.156591796875006],[89.95419921875006,22.022851562500023],[89.91806640625012,22.11616210937501],[89.98515625000002,22.466406250000063],[89.81191406250005,21.983496093750006],[89.56855468750004,21.767431640625034],[89.48320312500007,22.275537109374994],[89.50058593750006,21.914355468750045],[89.35371093750004,21.72109375],[89.09394531250004,21.872753906249983],[89.05,22.274609374999983],[88.92070312500002,22.632031249999955],[88.89970703125002,22.843505859375057],[88.85058593749997,23.040527343750057],[88.928125,23.186621093750063],[88.72441406250002,23.254980468750034],[88.69765625,23.493017578125034],[88.63574218749997,23.55],[88.56738281249997,23.674414062500034],[88.69980468750006,24.002539062500006],[88.71376953125,24.069628906250017],[88.72656250000003,24.186230468749955],[88.7335937500001,24.23090820312501],[88.72353515625,24.27490234375],[88.64228515625004,24.325976562500017],[88.49853515625003,24.34663085937504],[88.3375,24.45385742187503],[88.225,24.460644531249983],[88.14550781250003,24.485791015624955],[88.07910156249997,24.549902343750063],[88.02343750000003,24.62783203125005],[88.03027343749997,24.66445312500005],[88.0451171875001,24.713037109374994],[88.1498046875,24.914648437500034],[88.1888671875,24.92060546875001],[88.27949218750004,24.881933593750034],[88.31337890625005,24.8818359375],[88.37294921875,24.961523437499977],[88.45625,25.18842773437504],[88.57382812500006,25.18789062499999],[88.92978515625012,25.222998046875063],[88.94414062500002,25.290771484375],[88.85478515625002,25.333544921875017],[88.76914062500006,25.490478515625],[88.50244140624997,25.537011718749994],[88.14746093749997,25.811425781250023],[88.1066406250001,25.841113281250045],[88.15078125000005,26.08715820312497],[88.33398437499997,26.257519531249955],[88.44042968749997,26.369482421875034],[88.38623046875003,26.471533203125034],[88.35146484375005,26.482568359374966],[88.36992187500002,26.564111328124994],[88.51826171875004,26.517773437499955],[88.68281250000004,26.291699218749983],[88.94072265625002,26.24536132812497]]]]},"properties":{"name":"Bangladesh","childNum":6}},{"geometry":{"type":"Polygon","coordinates":[[[28.585351562500023,43.742236328124996],[28.465429687500006,43.389306640624994],[28.133691406250023,43.39560546875],[27.92890625000001,43.1861328125],[27.88886718750001,42.74970703125],[27.484765625000023,42.468066406249996],[28.014453125000017,41.969042968749996],[27.47480468750001,41.946875],[27.294921875,42.079541015625],[27.24433593750001,42.09326171875],[27.01171875,42.058642578124996],[26.96875,42.02685546875],[26.884863281250006,41.991845703124994],[26.615332031250006,41.964892578124996],[26.549707031250023,41.896728515625],[26.51142578125001,41.8263671875],[26.3603515625,41.8015625],[26.327246093750006,41.772802734375],[26.31796875,41.744677734374996],[26.320898437500006,41.716552734375],[26.200585937500023,41.743798828124994],[26.107421875,41.72568359375],[26.085546875,41.704150390624996],[26.066015625,41.673242187499994],[26.1435546875,41.521533203124996],[26.155175781250023,41.434863281249996],[26.135351562500006,41.3857421875],[26.06640625,41.35068359375],[25.92333984375,41.311914062499994],[25.784960937500017,41.330419921875],[25.52705078125001,41.2998046875],[25.381933593750006,41.26435546875],[25.25117187500001,41.243554687499994],[24.773730468750017,41.356103515624994],[24.595996093750017,41.442724609375],[24.5693359375,41.4673828125],[24.51826171875001,41.552539062499996],[24.487890625,41.555224609374996],[24.056054687500023,41.527246093749994],[24.03291015625001,41.469091796875],[24.011328125,41.46005859375],[23.635156250000023,41.386767578124996],[23.53583984375001,41.386035156249996],[23.433398437500017,41.398730468749996],[23.3720703125,41.3896484375],[23.23984375,41.3849609375],[23.15595703125001,41.322070312499996],[22.916015625,41.336279296875],[23.00361328125001,41.73984375],[22.836816406250023,41.993603515625],[22.344042968750017,42.31396484375],[22.42207031250001,42.328857421875],[22.445703125000023,42.359130859375],[22.523535156250006,42.440966796874996],[22.53242187500001,42.481201171875],[22.524218750000017,42.50390625],[22.43623046875001,42.6291015625],[22.466796875,42.84248046875],[22.799902343750006,42.985742187499994],[22.976855468750017,43.18798828125],[22.85957031250001,43.25234375],[22.819726562500023,43.300732421875],[22.767578125,43.354150390624994],[22.554589843750023,43.454492187499994],[22.36962890625,43.781298828124996],[22.36542968750001,43.862109375],[22.399023437500006,43.96953125],[22.420800781250023,44.007421875],[22.452529688228115,44.0510441391688],[22.547921095934313,44.113823956634434],[22.688564844478098,44.254306249271906],[23.02851562500001,44.077978515625],[22.868261718750006,43.947900390624994],[22.919042968750006,43.83447265625],[25.4970703125,43.670800781249994],[26.2158203125,44.007275390625],[27.0869140625,44.167382812499994],[27.425390625,44.0205078125],[27.88427734375,43.987353515624996],[28.221972656250017,43.772851562499994],[28.585351562500023,43.742236328124996]]]},"properties":{"name":"Bulgaria","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[50.60722656250002,25.883105468750003],[50.57490234375001,25.806787109374994],[50.465917968750006,25.965527343749997],[50.46992187500001,26.228955078124997],[50.5859375,26.24072265625],[50.60722656250002,25.883105468750003]]]},"properties":{"name":"Bahrain","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-73.02685546874994,21.19238281250003],[-73.16455078125003,20.979150390625023],[-73.68115234375003,20.9755859375],[-73.68037109374995,21.103320312500017],[-73.52309570312497,21.190820312499966],[-73.23535156249997,21.15449218750004],[-73.05849609375,21.313378906249994],[-73.02685546874994,21.19238281250003]]],[[[-73.041015625,22.429052734375006],[-72.74726562500001,22.32739257812497],[-73.16191406250002,22.380712890625006],[-73.041015625,22.429052734375006]]],[[[-74.20673828124998,22.213769531250023],[-74.27690429687499,22.183691406250006],[-73.906396484375,22.527441406250063],[-73.95419921874995,22.71552734375001],[-73.84995117187503,22.731054687500063],[-73.83652343749998,22.538427734374977],[-74.20673828124998,22.213769531250023]]],[[[-74.05751953124997,22.723486328125034],[-74.27460937499995,22.71166992187503],[-74.30703125,22.83959960937497],[-74.05751953124997,22.723486328125034]]],[[[-74.84047851562494,22.894335937500017],[-75.22333984374995,23.165332031250074],[-75.13056640624998,23.267919921875006],[-75.31596679687502,23.668359374999966],[-74.84047851562494,22.894335937500017]]],[[[-75.66455078124997,23.45014648437501],[-76.03710937500003,23.60278320312503],[-76.01044921875001,23.671386718750057],[-75.66455078124997,23.45014648437501]]],[[[-74.42944335937497,24.068066406249955],[-74.55092773437502,23.96894531250001],[-74.52690429687502,24.105078125000034],[-74.42944335937497,24.068066406249955]]],[[[-77.65771484374994,24.249462890624955],[-77.75527343750002,24.163476562500023],[-77.61538085937494,24.216357421875045],[-77.5615234375,24.136816406250006],[-77.57373046875,23.739160156249994],[-77.77128906249999,23.752539062499977],[-77.99990234374994,24.219824218750063],[-77.65771484374994,24.249462890624955]]],[[[-75.30839843749999,24.2],[-75.50322265624996,24.139062500000023],[-75.40893554687503,24.265771484374994],[-75.72666015625,24.68935546875005],[-75.30839843749999,24.2]]],[[[-77.34755859375,25.013867187499983],[-77.56191406249997,25.030029296875],[-77.27558593750001,25.055761718750006],[-77.34755859375,25.013867187499983]]],[[[-77.74384765625001,24.70742187499999],[-77.74521484375,24.463476562500034],[-78.04492187499997,24.287451171875063],[-78.14580078125002,24.493457031250017],[-78.36650390624993,24.544189453125057],[-78.435302734375,24.627587890624994],[-78.24272460937493,24.65380859375],[-78.21137695312495,25.191259765624977],[-77.97529296874998,25.084814453125063],[-77.74384765625001,24.70742187499999]]],[[[-76.64882812499994,25.487402343750006],[-76.34379882812496,25.33203124999997],[-76.12661132812497,25.14052734375005],[-76.16953125,24.6494140625],[-76.319970703125,24.81767578124999],[-76.21376953124994,24.822460937499983],[-76.160400390625,25.119335937499983],[-76.36928710937502,25.312597656250006],[-76.62070312499998,25.43164062500003],[-76.78066406249997,25.426855468750006],[-76.71083984374997,25.564892578124983],[-76.64882812499994,25.487402343750006]]],[[[-78.49287109375001,26.729052734375017],[-77.92246093749998,26.69111328125001],[-78.74365234374994,26.50068359375004],[-78.98564453124996,26.689501953125045],[-78.79804687500001,26.58242187499999],[-78.59711914062493,26.797949218750006],[-78.49287109375001,26.729052734375017]]],[[[-77.22563476562496,25.904199218750023],[-77.40317382812498,26.02470703124996],[-77.24677734374998,26.156347656250034],[-77.238623046875,26.561132812500006],[-77.510595703125,26.845996093750045],[-77.94375,26.90356445312503],[-77.53388671874995,26.903417968750006],[-77.06635742187501,26.530175781249994],[-77.03828124999998,26.333447265624983],[-77.16728515624996,26.240332031250006],[-77.22563476562496,25.904199218750023]]]]},"properties":{"name":"Bahamas","childNum":14}},{"geometry":{"type":"Polygon","coordinates":[[[19.007128906250045,44.86918945312502],[19.348632812500057,44.88090820312502],[19.118457031250074,44.359960937500006],[19.583789062500017,44.04345703125003],[19.245019531249994,43.96503906250004],[19.495117187500057,43.642871093750045],[19.19433593749997,43.533300781250006],[19.164355468750017,43.53544921874999],[19.11279296874997,43.52773437500002],[19.080078125000057,43.51772460937502],[19.0283203125,43.53251953125002],[18.97421875,43.54233398437498],[18.95068359375,43.52666015624999],[19.036718750000034,43.35732421875002],[19.026660156250017,43.292431640624955],[18.97871093750001,43.28540039062503],[18.934667968750006,43.339453125000034],[18.85107421875003,43.34633789062502],[18.749218750000068,43.283544921875006],[18.67421875000008,43.230810546875006],[18.623632812500063,43.027685546875034],[18.488476562500068,43.01215820312498],[18.44384765625003,42.96845703125004],[18.46601562500001,42.777246093749994],[18.54589843750003,42.64160156249997],[18.436328125000017,42.559716796874994],[17.667578125000063,42.897119140624994],[17.585156250000068,42.93837890625005],[17.650488281250063,43.006591796875],[17.27382812500005,43.44575195312501],[16.300097656250017,44.12451171875],[16.10341796875008,44.52099609375006],[15.736621093750045,44.76582031250001],[15.788085937500057,45.17895507812497],[16.028320312500057,45.18959960937502],[16.29335937500005,45.00883789062496],[16.53066406250008,45.21669921875002],[16.918652343749983,45.27656249999998],[17.812792968750074,45.078125],[18.66259765625,45.07744140624999],[18.83642578125,44.883251953124955],[19.007128906250045,44.86918945312502]]]},"properties":{"name":"Bosnia and Herz.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.14794921875,56.142919921875],[28.284277343750006,56.055908203125],[29.375,55.938720703125],[29.353417968750023,55.784375],[29.412988281250023,55.724853515625],[29.482226562500017,55.6845703125],[29.63007812500001,55.751171875],[29.6845703125,55.7697265625],[29.744140625,55.77041015625],[29.82392578125001,55.7951171875],[29.881640625000017,55.832324218749996],[29.93701171875,55.845263671874996],[30.04267578125001,55.83642578125],[30.23359375000001,55.84521484375],[30.625585937500006,55.666259765625],[30.906835937500006,55.57001953125],[30.90058593750001,55.397412109375],[30.82099609375001,55.3302734375],[30.810546875,55.306982421875],[30.814453125,55.2787109375],[30.87744140625,55.2234375],[30.958886718750023,55.13759765625],[30.97773437500001,55.08779296875],[30.97773437500001,55.05048828125],[30.829882812500017,54.914990234375],[30.804492187500017,54.8609375],[30.791015625,54.806005859375],[30.798828125,54.783251953124996],[30.984179687500017,54.6958984375],[31.12128906250001,54.648486328124996],[31.152148437500017,54.625341796875],[31.074804687500006,54.491796875],[31.18476562500001,54.452978515625],[31.299121093750017,54.29169921875],[31.403613281250017,54.195947265625],[31.62841796875,54.111181640625],[31.7919921875,54.055908203125],[31.825976562500017,54.030712890625],[31.837792968750023,54.00078125],[31.825292968750006,53.935009765625],[31.783007812500017,53.85498046875],[31.754199218750017,53.81044921875],[31.82080078125,53.791943359375],[31.9921875,53.796875],[32.20039062500001,53.78125],[32.45097656250002,53.6533203125],[32.70429687500001,53.336328125],[32.64443359375002,53.32890625],[32.57802734375002,53.31240234375],[32.469335937500006,53.2703125],[32.14199218750002,53.091162109375],[31.849707031250006,53.106201171875],[31.668261718750017,53.200927734375],[31.417871093750023,53.196044921875],[31.38837890625001,53.184814453125],[31.364550781250017,53.138964843749996],[31.30292968750001,53.060888671875],[31.2587890625,53.01669921875],[31.29511718750001,52.989794921874996],[31.35302734375,52.933447265625],[31.442773437500023,52.86181640625],[31.53515625,52.7982421875],[31.564843750000023,52.759228515625],[31.585546875,52.532470703125],[31.57734375000001,52.312304687499996],[31.6015625,52.284814453125],[31.64990234375,52.26220703125],[31.690625,52.220654296875],[31.758593750000017,52.125830078125],[31.76337890625001,52.10107421875],[31.57373046875,52.10810546875],[31.345996093750017,52.10537109375],[31.21796875000001,52.050244140625],[30.98066406250001,52.046191406249996],[30.845703125,51.953076171875],[30.755273437500023,51.895166015625],[30.667285156250017,51.814111328125],[30.583886718750023,51.68896484375],[30.533007812500017,51.596337890624994],[30.56074218750001,51.531494140625],[30.602343750000017,51.471240234374996],[30.611718750000023,51.40634765625],[30.63251953125001,51.355419921875],[30.449511718750017,51.274316406249994],[30.160742187500006,51.477880859375],[29.346484375000017,51.382568359375],[29.10205078125,51.6275390625],[29.06074218750001,51.625439453125],[29.013085937500023,51.598925781249996],[28.97773437500001,51.57177734375],[28.927539062500017,51.562158203124994],[28.849511718750023,51.540185546874994],[28.73125,51.433398437499996],[28.690234375000017,51.438867187499994],[28.647753906250017,51.45654296875],[28.599023437500023,51.542626953124994],[28.532031250000017,51.562451171875],[27.85859375000001,51.5923828125],[27.7,51.477978515625],[27.689746093750017,51.572412109374994],[27.296289062500023,51.597412109375],[27.270117187500006,51.613574218749996],[27.141992187500023,51.75205078125],[27.074121093750023,51.76083984375],[26.95283203125001,51.75400390625],[26.7734375,51.770703125],[25.785742187500006,51.923828125],[24.361914062500006,51.867529296875],[24.280078125000017,51.774707031249996],[24.126855468750023,51.6646484375],[23.978320312500017,51.59130859375],[23.951171875,51.58505859375],[23.8642578125,51.623974609375],[23.79169921875001,51.637109375],[23.706835937500017,51.64130859375],[23.61376953125,51.525390625],[23.605273437500017,51.517919921875],[23.652441406250006,52.040380859375],[23.175097656250017,52.28662109375],[23.915429687500023,52.770263671875],[23.484667968750017,53.939794921875],[23.55908203125,53.91982421875],[23.733691406250017,53.912255859375],[24.191308593750023,53.950439453125],[24.236621093750017,53.919970703124996],[24.31796875,53.89296875],[24.620703125,53.979833984375],[24.768164062500006,53.974658203124996],[24.78925781250001,53.9982421875],[24.82568359375,54.118994140625],[24.869531250000023,54.145166015625],[25.04609375000001,54.133056640625],[25.111425781250006,54.154931640625],[25.179492187500017,54.2142578125],[25.46113281250001,54.292773437499996],[25.505664062500017,54.264941406249996],[25.52734375,54.215136718749996],[25.497363281250017,54.175244140625],[25.573046875000017,54.139892578125],[25.765234375,54.17978515625],[25.702539062500023,54.29296875],[25.61689453125001,54.310107421874996],[25.557519531250023,54.310693359375],[25.54736328125,54.331835937499996],[25.56757812500001,54.37705078125],[25.62031250000001,54.460400390625],[25.68515625,54.535791015625],[25.72480468750001,54.564257812499996],[25.73164062500001,54.590380859374996],[25.722460937500017,54.71787109375],[25.859277343750023,54.919287109375],[25.964453125,54.94716796875],[26.09296875000001,54.9623046875],[26.175195312500023,55.003271484375],[26.250781250000017,55.12451171875],[26.291796875000017,55.139599609375],[26.601171875,55.130175781249996],[26.6484375,55.20419921875],[26.775683593750017,55.273095703125],[26.760156250000023,55.293359375],[26.68125,55.306445312499996],[26.49531250000001,55.318017578125],[26.457617187500006,55.34248046875],[26.469531250000017,55.371923828125],[26.51923828125001,55.44814453125],[26.56660156250001,55.546484375],[26.5908203125,55.62265625],[26.593554687500017,55.667529296874996],[27.052539062500017,55.83056640625],[27.576757812500006,55.798779296875],[28.14794921875,56.142919921875]]]},"properties":{"name":"Belarus","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.8529296875,17.4228515625],[-87.92998046874996,17.283007812500017],[-87.826416015625,17.546289062499994],[-87.8529296875,17.4228515625]]],[[[-88.89404296875,15.890625],[-89.2328125,15.888671875],[-89.16147460937503,17.81484375],[-89.13354492187503,17.970800781249977],[-88.80634765624998,17.965527343749983],[-88.52299804687499,18.445898437500063],[-88.29565429687494,18.47241210937503],[-88.34926757812494,18.358837890624983],[-88.1302734375,18.350732421875023],[-88.08525390624999,18.226123046875045],[-88.27172851562494,17.60986328125],[-88.203466796875,17.5166015625],[-88.31342773437501,16.632763671874983],[-88.89404296875,15.890625]]]]},"properties":{"name":"Belize","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-64.73027343749999,32.29345703125],[-64.86284179687499,32.273876953125],[-64.66831054687499,32.38193359375],[-64.73027343749999,32.29345703125]]]},"properties":{"name":"Bermuda","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-58.15976562499999,-20.164648437500006],[-58.18017578125,-19.81787109375],[-59.09052734375,-19.286230468750006],[-60.00737304687499,-19.29755859375001],[-61.7568359375,-19.6453125],[-62.276318359375,-20.5625],[-62.27666015624999,-21.066015625],[-62.65097656249999,-22.233691406250003],[-62.84335937499999,-21.99726562500001],[-63.92167968749999,-22.028613281250003],[-63.97612304687499,-22.072558593750003],[-64.26640624999999,-22.603320312500003],[-64.30791015624999,-22.7953125],[-64.32529296874999,-22.82763671875],[-64.373974609375,-22.761035156250003],[-64.4455078125,-22.58535156250001],[-64.477734375,-22.4853515625],[-64.5236328125,-22.37158203125],[-64.60551757812499,-22.228808593750003],[-64.992626953125,-22.109667968750003],[-65.518798828125,-22.09453125],[-65.686181640625,-22.11025390625001],[-65.77104492187499,-22.099609375],[-65.86015624999999,-22.01972656250001],[-66.05859375,-21.879492187500006],[-66.098583984375,-21.835058593750006],[-66.17465820312499,-21.8056640625],[-66.220166015625,-21.802539062500003],[-66.24760742187499,-21.83046875],[-66.28212890625,-21.94746093750001],[-66.3224609375,-22.053125],[-66.365185546875,-22.11376953125],[-66.71171874999999,-22.21630859375],[-66.99111328125,-22.509863281250006],[-67.19487304687499,-22.82167968750001],[-67.362255859375,-22.85517578125001],[-67.57993164062499,-22.891699218750006],[-67.79443359375,-22.879492187500006],[-67.87944335937499,-22.82294921875001],[-67.88173828125,-22.49335937500001],[-68.18642578125,-21.61855468750001],[-68.197021484375,-21.30029296875],[-68.558251953125,-20.901953125],[-68.484326171875,-20.62841796875],[-68.74516601562499,-20.45859375],[-68.75932617187499,-20.115527343750003],[-68.560693359375,-19.967089843750003],[-68.559375,-19.90234375],[-68.578271484375,-19.856542968750006],[-68.69619140625,-19.74072265625],[-68.69829101562499,-19.72109375],[-68.57529296874999,-19.56015625],[-68.462890625,-19.43281250000001],[-68.470166015625,-19.409960937500003],[-68.49199218749999,-19.381933593750006],[-68.85795898437499,-19.093359375],[-68.96831054687499,-18.96796875000001],[-68.97885742187499,-18.81298828125],[-69.026806640625,-18.65625],[-69.09228515625,-18.28242187500001],[-69.145458984375,-18.14404296875],[-69.0939453125,-18.05048828125001],[-69.28232421874999,-17.96484375],[-69.31337890625,-17.943164062500003],[-69.5109375,-17.50605468750001],[-69.51108398437499,-17.5048828125],[-69.510986328125,-17.46035156250001],[-69.521923828125,-17.388964843750003],[-69.645703125,-17.24853515625],[-69.62485351562499,-17.2001953125],[-69.020703125,-16.6421875],[-69.03291015625,-16.47597656250001],[-68.8427734375,-16.337890625],[-69.21757812499999,-16.14912109375001],[-69.4208984375,-15.640625],[-69.17246093749999,-15.236621093750003],[-69.37470703125,-14.962988281250006],[-69.35947265624999,-14.7953125],[-68.87089843749999,-14.169726562500003],[-69.07412109375,-13.682812500000011],[-68.97861328124999,-12.880078125000011],[-68.68525390625,-12.501953125],[-69.57861328125,-10.951757812500006],[-69.228515625,-10.955664062500006],[-68.84833984375,-11.011132812500009],[-68.678369140625,-11.11279296875],[-68.39799804687499,-11.01875],[-68.0716796875,-10.703125],[-67.99169921875,-10.674414062500006],[-67.83500976562499,-10.662792968750011],[-67.72177734374999,-10.68310546875],[-67.416943359375,-10.389843750000011],[-66.575341796875,-9.89990234375],[-65.396142578125,-9.71240234375],[-65.298583984375,-10.146777343750003],[-65.31308593749999,-10.253027343750006],[-65.395458984375,-10.392285156250011],[-65.4369140625,-10.449023437500003],[-65.44711914062499,-10.507421875],[-65.33403320312499,-10.892773437500011],[-65.32377929687499,-11.024804687500009],[-65.389892578125,-11.246289062500011],[-65.1857421875,-11.74951171875],[-64.783447265625,-12.059375],[-64.42050781249999,-12.439746093750003],[-63.68857421874999,-12.47802734375],[-63.3466796875,-12.680078125],[-63.06748046874999,-12.669140625000011],[-62.76547851562499,-12.997265625000011],[-62.11801757812499,-13.159765625],[-62.09477539062499,-13.241992187500003],[-61.944726562499994,-13.40625],[-61.87412109374999,-13.470410156250011],[-61.789941406249994,-13.525585937500011],[-61.57568359375,-13.524804687500009],[-61.51157226562499,-13.541210937500011],[-61.41606445312499,-13.526562500000011],[-61.129150390625,-13.49853515625],[-61.07700195312499,-13.48974609375],[-60.506591796875,-13.78984375],[-60.372705078124994,-14.41875],[-60.273339843749994,-15.088769531250009],[-60.402001953124994,-15.0927734375],[-60.583203125,-15.098339843750011],[-60.53046875,-15.143164062500006],[-60.38046875,-15.318261718750009],[-60.242333984374994,-15.479589843750006],[-60.20664062499999,-15.901953125],[-60.18720703125,-16.132128906250003],[-60.17558593749999,-16.269335937500003],[-58.53793945312499,-16.328222656250006],[-58.49658203125,-16.32666015625],[-58.42368164062499,-16.307910156250003],[-58.37539062499999,-16.28359375],[-58.345605468749994,-16.284375],[-58.35039062499999,-16.490820312500006],[-58.470605468749994,-16.650195312500003],[-58.478125,-16.70068359375],[-58.45981445312499,-16.910742187500006],[-58.417382812499994,-17.08056640625],[-58.39599609375,-17.23427734375001],[-58.34775390624999,-17.28212890625001],[-57.99091796875,-17.51289062500001],[-57.905029296875,-17.532324218750006],[-57.832470703125,-17.512109375],[-57.78886718749999,-17.573046875],[-57.780175781249994,-17.67177734375001],[-57.66166992187499,-17.947363281250006],[-57.58647460937499,-18.12226562500001],[-57.49565429687499,-18.214648437500003],[-57.57402343749999,-18.279296875],[-57.725,-18.733203125],[-57.783105468749994,-18.91425781250001],[-57.716796875,-19.044042968750006],[-58.131494140624994,-19.74453125],[-57.860742187499994,-19.979589843750006],[-57.887597656249994,-20.02041015625001],[-57.96015625,-20.04072265625001],[-58.021142578124994,-20.05517578125],[-58.09375,-20.15107421875001],[-58.15976562499999,-20.164648437500006]]]},"properties":{"name":"Bolivia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-48.48588867187493,-27.76699218749998],[-48.554589843749994,-27.81220703125004],[-48.542187499999955,-27.57480468749999],[-48.41489257812495,-27.399609375],[-48.48588867187493,-27.76699218749998]]],[[[-48.584423828124955,-26.401562499999983],[-48.665771484375,-26.289648437500006],[-48.53974609374998,-26.170312500000023],[-48.584423828124955,-26.401562499999983]]],[[[-45.26025390624997,-23.889160156249986],[-45.451416015625,-23.895605468749977],[-45.30234375,-23.727539062500014],[-45.26025390624997,-23.889160156249986]]],[[[-44.12929687499994,-23.14189453124999],[-44.36015624999999,-23.17207031250001],[-44.24287109374998,-23.074121093750037],[-44.12929687499994,-23.14189453124999]]],[[[-38.90356445312497,-13.473437499999974],[-38.97758789062496,-13.523535156249963],[-39.02216796874998,-13.445605468749989],[-38.907128906249994,-13.401074218749983],[-38.90356445312497,-13.473437499999974]]],[[[-38.743847656249955,-13.097070312500037],[-38.668115234374966,-12.880175781249989],[-38.601171875,-12.99257812499998],[-38.743847656249955,-13.097070312500037]]],[[[-44.49931640625002,-2.939648437499983],[-44.597753906250006,-3.037597656249943],[-44.4814453125,-2.717578125000031],[-44.49931640625002,-2.939648437499983]]],[[[-44.88310546874996,-1.317871093749986],[-45.020849609375034,-1.372363281249974],[-44.978662109374966,-1.267285156249983],[-44.88310546874996,-1.317871093749986]]],[[[-51.83251953124997,-1.433789062499969],[-51.938378906249966,-1.452636718749986],[-51.680029296875006,-1.086132812500026],[-51.546044921874966,-0.649609375],[-51.25400390624998,-0.54140625],[-51.16074218749998,-0.666699218750011],[-51.27631835937498,-1.02177734374996],[-51.83251953124997,-1.433789062499969]]],[[[-49.62866210937497,-0.229199218749969],[-49.11699218749999,-0.163574218750014],[-48.39267578124995,-0.29736328125],[-48.83359375,-1.390039062500023],[-49.038476562499994,-1.5140625],[-49.17270507812498,-1.41259765625],[-49.233984375000034,-1.59951171874998],[-49.50664062499999,-1.511621093750023],[-49.587890625,-1.712402343749972],[-49.805126953124955,-1.790234375000026],[-50.06572265625002,-1.703808593749997],[-50.50761718749999,-1.787988281250009],[-50.759765625,-1.240234374999972],[-50.72949218749997,-1.126757812499946],[-50.57695312499999,-1.103125],[-50.709619140624994,-1.07773437499999],[-50.796093749999955,-0.90625],[-50.6455078125,-0.27285156249998],[-50.24824218749998,-0.11640625],[-49.62866210937497,-0.229199218749969]]],[[[-50.65288085937499,-0.131640624999989],[-50.926367187500034,-0.327343749999983],[-51.03808593749994,-0.225878906250003],[-50.84218750000002,-0.050195312500009],[-50.65288085937499,-0.131640624999989]]],[[[-49.44389648437499,-0.112402343749977],[-49.83007812499997,-0.093896484375023],[-49.50346679687496,0.083691406250011],[-49.37231445312497,0.001074218749963],[-49.44389648437499,-0.112402343749977]]],[[[-49.73823242187498,0.26816406250002],[-49.917089843750006,-0.023193359375014],[-50.339453125,0.043359375000051],[-50.27265624999998,0.231738281249974],[-49.73823242187498,0.26816406250002]]],[[[-50.42612304687498,0.139257812500048],[-50.44394531249998,-0.007666015624949],[-50.623925781249966,0.054394531249983],[-50.372753906249955,0.590869140625031],[-50.33227539062497,0.259033203125028],[-50.42612304687498,0.139257812500048]]],[[[-50.152929687500006,0.393017578125054],[-50.26132812499998,0.359179687500003],[-50.281689453124955,0.51650390624998],[-50.05883789062503,0.638037109374963],[-50.152929687500006,0.393017578125054]]],[[[-50.29897460937502,1.93852539062496],[-50.45610351562496,1.910498046875034],[-50.49101562499996,2.128613281249969],[-50.34199218749998,2.14174804687498],[-50.29897460937502,1.93852539062496]]],[[[-59.69970703125,4.353515625],[-59.73857421874993,4.226757812500026],[-59.62021484374998,4.023144531250026],[-59.557763671874966,3.960009765625031],[-59.551123046875034,3.933544921874969],[-59.854394531249994,3.5875],[-59.99433593749998,2.689990234375031],[-59.88964843749997,2.362939453125009],[-59.75522460937495,2.27412109375004],[-59.74350585937498,2.12163085937496],[-59.75175781249996,1.962402343750028],[-59.75620117187498,1.900634765624972],[-59.666601562500006,1.746289062499969],[-59.53569335937499,1.7],[-59.23120117187494,1.376025390625031],[-58.82177734374994,1.201220703125031],[-58.787207031250006,1.208496093750014],[-58.73032226562498,1.247509765625054],[-58.68461914062499,1.28105468749996],[-58.511865234374966,1.284667968749986],[-58.506054687499926,1.438671875000011],[-58.39580078124993,1.481738281249989],[-58.38037109375,1.530224609375011],[-58.34067382812498,1.587548828125051],[-58.03466796875,1.520263671875014],[-57.9828125,1.648437500000014],[-57.87343750000002,1.667285156250045],[-57.79565429687497,1.7],[-57.59443359375001,1.704101562499986],[-57.54575195312495,1.726074218750028],[-57.31748046874998,1.963476562499991],[-57.27558593749998,1.959228515625014],[-57.189599609374966,1.981591796875037],[-57.11889648437494,2.013964843749974],[-57.09267578125002,2.005810546874997],[-57.03759765625,1.936474609374997],[-56.96953124999999,1.91640625],[-56.48281249999994,1.942138671874986],[-56.019921874999966,1.842236328124983],[-55.96333007812498,1.85708007812498],[-55.929638671874955,1.8875],[-55.92163085937503,1.976660156250006],[-55.91533203124999,2.039550781250028],[-55.96196289062496,2.09511718749998],[-56.02006835937499,2.15815429687504],[-56.073632812499994,2.236767578124969],[-56.13769531249997,2.259033203124986],[-56.12939453124997,2.299511718749969],[-56.08779296875002,2.341308593750043],[-56.045117187499955,2.364404296875037],[-56.02036132812498,2.392773437500054],[-55.993505859375006,2.497509765624983],[-55.9755859375,2.515966796875006],[-55.957470703124955,2.52045898437504],[-55.730566406250006,2.406152343750023],[-55.385351562500006,2.440625],[-55.34399414062503,2.488769531249972],[-55.28603515625002,2.49965820312498],[-55.18769531249998,2.547509765625037],[-55.114111328125006,2.539208984375037],[-55.07031249999994,2.548339843750028],[-55.005810546874955,2.592968749999983],[-54.97866210937502,2.597656250000043],[-54.968408203124966,2.548339843750028],[-54.92656249999999,2.497363281250045],[-54.876074218750006,2.450390624999969],[-54.72221679687499,2.441650390624972],[-54.69741210937502,2.359814453124997],[-54.66186523437497,2.327539062499994],[-54.61625976562499,2.326757812500006],[-54.59194335937502,2.313769531250031],[-54.55048828125001,2.293066406249991],[-54.51508789062498,2.245458984374963],[-54.43310546875,2.207519531250057],[-54.13007812499998,2.121044921875026],[-53.76777343749998,2.354833984375048],[-52.90346679687502,2.211523437499977],[-52.58300781250003,2.528906249999977],[-52.327880859375,3.18173828125002],[-51.65253906249998,4.061279296874972],[-51.54707031250001,4.31088867187502],[-51.219921874999955,4.093603515624991],[-50.71440429687502,2.134033203125],[-50.458886718749994,1.829589843749972],[-49.957128906250006,1.65986328125004],[-49.898876953124955,1.16298828124998],[-50.29443359374997,0.835742187500003],[-50.755078124999955,0.222558593749966],[-51.28291015625001,-0.085205078125028],[-51.98081054687498,-1.367968749999974],[-52.22924804687497,-1.3625],[-52.664160156250034,-1.551757812500028],[-51.94755859374996,-1.586718749999946],[-50.89492187500002,-0.937597656249963],[-50.690039062500006,-1.761718749999986],[-50.40322265625002,-2.015527343750009],[-49.999218749999955,-1.831835937499974],[-49.71953125000002,-1.926367187499963],[-49.31367187500001,-1.731738281250003],[-49.63652343749996,-2.656933593750026],[-49.45751953125,-2.504589843749983],[-49.21103515624998,-1.916503906249986],[-48.99130859374998,-1.829785156249997],[-48.71000976562496,-1.487695312500023],[-48.46293945312499,-1.613964843749997],[-48.349804687499926,-1.482128906249955],[-48.46806640624996,-1.393847656250003],[-48.44980468749998,-1.145507812499943],[-48.11508789062498,-0.7375],[-47.557324218749955,-0.669921874999957],[-47.418652343749955,-0.765917968749974],[-47.39809570312502,-0.626660156250026],[-45.45859374999995,-1.35625],[-45.32915039062496,-1.71728515625],[-45.07636718749998,-1.466406249999949],[-44.72114257812498,-1.733496093750006],[-44.778515624999955,-1.798828125],[-44.651269531249966,-1.745800781250026],[-44.537792968749955,-2.052734374999943],[-44.75634765624997,-2.265527343749952],[-44.66240234375002,-2.373242187499955],[-44.435449218749966,-2.168066406249991],[-44.38183593749997,-2.365527343749989],[-44.52011718749998,-2.40546875000004],[-44.589013671874994,-2.573437499999983],[-44.72304687500002,-3.204785156249997],[-44.43754882812496,-2.944433593749977],[-44.228613281250006,-2.471289062499949],[-44.105566406250006,-2.493457031250031],[-44.19267578124999,-2.809570312499943],[-43.93291015624999,-2.583496093749986],[-43.45512695312499,-2.502050781250006],[-43.38007812499998,-2.376074218750006],[-42.93671874999998,-2.465039062500011],[-42.24960937499998,-2.7919921875],[-41.876171874999926,-2.746582031249986],[-41.479931640624955,-2.916503906249972],[-40.474560546874926,-2.795605468750026],[-39.96469726562498,-2.861523437499955],[-38.475781249999955,-3.717480468749997],[-38.04882812500003,-4.216406250000034],[-37.626318359375006,-4.592089843750003],[-37.30146484375001,-4.713085937499969],[-37.174658203125006,-4.912402343749974],[-36.590722656249966,-5.097558593749952],[-35.549414062500006,-5.129394531249957],[-35.39257812499994,-5.250878906250009],[-34.833886718749994,-7.024414062500014],[-34.83466796874998,-7.97148437499996],[-35.34086914062499,-9.230664062499983],[-35.76396484374993,-9.702539062500023],[-35.890820312499926,-9.687011718749957],[-35.88544921875001,-9.84765625],[-36.39833984374994,-10.484082031249983],[-36.768310546875,-10.671679687500017],[-37.18281249999998,-11.06845703125002],[-37.35600585937502,-11.403906249999977],[-37.35922851562495,-11.252539062499963],[-37.68872070312503,-12.1],[-38.019238281249955,-12.591308593750028],[-38.401757812499994,-12.966210937500023],[-38.69096679687502,-12.623925781250009],[-38.85175781250001,-12.790136718750034],[-38.76372070312502,-12.9072265625],[-38.835302734375034,-13.147167968750026],[-39.030908203124994,-13.365136718750023],[-39.08935546875,-13.588183593749989],[-38.988623046875006,-13.61503906249996],[-39.04814453124996,-14.043945312500028],[-38.94233398437498,-14.030664062499994],[-39.05957031249997,-14.654785156249957],[-38.88061523437503,-15.864257812499972],[-39.20288085937503,-17.178125],[-39.154003906249926,-17.70390625000003],[-39.650781249999966,-18.252343750000037],[-39.78330078124998,-19.571777343749986],[-40.001367187499994,-19.74199218750003],[-40.39594726562501,-20.56943359375002],[-40.78925781250001,-20.90605468750003],[-40.954541015624926,-21.237890624999963],[-41.04726562499999,-21.505664062499974],[-41.00029296875002,-21.99902343750003],[-41.70551757812498,-22.30966796874999],[-41.980419921874955,-22.580664062499963],[-42.042382812499966,-22.947070312500003],[-42.95830078124996,-22.96708984374999],[-43.154296875,-22.725195312500006],[-43.22416992187502,-22.991210937500014],[-43.898828124999966,-23.10146484375001],[-43.97382812499998,-23.057324218749983],[-43.675976562499955,-23.00947265625001],[-43.86616210937498,-22.910546875000023],[-44.63725585937496,-23.05546875],[-44.67382812499994,-23.206640625000034],[-44.56967773437495,-23.27402343749999],[-45.32539062499998,-23.59970703124999],[-45.464306640624955,-23.802539062500017],[-45.97207031250002,-23.795507812500006],[-46.86728515624998,-24.236328125000014],[-47.989160156249994,-25.03574218749999],[-47.92939453124998,-25.16826171874999],[-48.20273437499998,-25.41650390625003],[-48.18593749999994,-25.309863281249974],[-48.402490234374994,-25.27207031249999],[-48.47612304687499,-25.44296875],[-48.73173828124993,-25.36875],[-48.6921875,-25.49150390625003],[-48.40117187500002,-25.59736328125001],[-48.665771484375,-25.844335937499963],[-48.576318359374994,-25.935449218749966],[-48.61943359374996,-26.17939453125001],[-48.74829101562503,-26.26865234374999],[-48.55415039062498,-27.195996093749997],[-48.62080078124998,-28.075585937499966],[-48.799658203125006,-28.575292968749977],[-49.27128906249999,-28.87119140625005],[-49.745996093749966,-29.363183593749994],[-50.299511718749955,-30.42578125000003],[-50.92138671874997,-31.25839843750002],[-52.039208984374994,-32.11484374999996],[-52.063232421875,-31.830371093750017],[-51.68066406249994,-31.774609375000026],[-51.272167968749955,-31.476953125000037],[-51.16142578124996,-31.11884765625001],[-50.980078125000034,-31.09423828124997],[-50.94082031249994,-30.903710937499966],[-50.68930664062495,-30.70419921874999],[-50.71630859374994,-30.425976562499983],[-50.58193359375002,-30.438867187500037],[-50.56352539062499,-30.25361328125004],[-51.02495117187493,-30.36865234375003],[-51.29804687499998,-30.03486328124997],[-51.15727539062499,-30.364257812500014],[-51.283056640625034,-30.751562499999963],[-51.35908203124998,-30.674511718749983],[-51.506298828124955,-31.104492187500014],[-51.97246093749999,-31.383789062499986],[-52.19355468749998,-31.885546874999974],[-52.12739257812501,-32.1677734375],[-52.652246093749994,-33.137792968750006],[-53.37060546874997,-33.74218750000003],[-53.39755859374995,-33.737304687500014],[-53.46357421875001,-33.70986328125002],[-53.531347656250034,-33.65546875000004],[-53.531347656250034,-33.1708984375],[-53.511865234374966,-33.10869140625003],[-53.482861328124926,-33.068554687500026],[-53.39521484375001,-33.01035156249998],[-53.31010742187499,-32.927050781249974],[-53.21406249999998,-32.82109375],[-53.12558593749998,-32.73671875],[-53.15727539062496,-32.680078125],[-53.601708984374994,-32.40302734374997],[-53.76171875,-32.05683593749997],[-53.920605468749926,-31.95234375],[-54.220556640625034,-31.855175781249997],[-54.58764648437503,-31.48515625000003],[-55.036035156249994,-31.27900390625004],[-55.091162109375034,-31.31396484374997],[-55.173535156249926,-31.279589843749974],[-55.557324218749955,-30.8759765625],[-55.60302734375003,-30.85078125000001],[-55.62714843749998,-30.858105468749997],[-55.650488281250034,-30.89208984375],[-55.66523437500001,-30.92490234375002],[-55.807763671874994,-31.036718749999977],[-55.87368164062502,-31.069628906250017],[-55.95200195312498,-31.08085937499999],[-56.0046875,-31.079199218750006],[-56.01845703125002,-30.991894531249983],[-55.998974609374955,-30.837207031250003],[-56.4072265625,-30.44746093750001],[-56.83271484374998,-30.107226562499974],[-57.120507812499994,-30.144433593749994],[-57.21445312499995,-30.283398437499983],[-57.55229492187496,-30.261230468749986],[-57.60888671875003,-30.187792968750045],[-57.563867187499994,-30.139941406249974],[-57.40522460937501,-30.03388671875004],[-57.22465820312499,-29.782128906249994],[-56.938623046874994,-29.594824218750034],[-55.890527343749994,-28.370019531249994],[-55.68725585937497,-28.38164062499996],[-55.72548828125002,-28.20410156250003],[-55.10151367187501,-27.866796874999963],[-54.82910156250003,-27.55058593750003],[-54.32700195312495,-27.423535156249997],[-53.83818359375002,-27.121093750000014],[-53.668554687500006,-26.288183593749977],[-53.89116210937499,-25.66884765625001],[-54.15458984374999,-25.523046874999963],[-54.44394531249998,-25.625],[-54.615869140624994,-25.576074218750023],[-54.61054687499998,-25.432714843750034],[-54.47314453124997,-25.22021484375],[-54.43623046875001,-25.12128906250001],[-54.281005859375,-24.30605468750001],[-54.31826171874994,-24.128125],[-54.26689453124996,-24.06582031250001],[-54.241796875,-24.047265624999966],[-54.44023437500002,-23.90175781249998],[-54.62548828125,-23.8125],[-54.98266601562494,-23.974511718749966],[-55.081884765625006,-23.997656249999977],[-55.1943359375,-24.017480468750023],[-55.28691406249993,-24.00429687499999],[-55.366308593750034,-23.99101562499996],[-55.41591796875002,-23.95136718749997],[-55.4423828125,-23.86533203125002],[-55.4423828125,-23.792578125000034],[-55.458886718749966,-23.686718750000054],[-55.51845703124994,-23.627246093750017],[-55.53828124999998,-23.580957031249994],[-55.61767578125,-22.67148437499999],[-55.74663085937499,-22.51269531249997],[-55.753271484375006,-22.410156250000043],[-55.84916992187499,-22.307617187500014],[-55.991406249999926,-22.28115234375005],[-56.18984374999994,-22.28115234375005],[-56.246044921874926,-22.26464843749997],[-56.39487304687498,-22.092675781250023],[-56.44780273437502,-22.07617187500003],[-56.77519531249999,-22.261328125],[-57.955908203125034,-22.109179687500003],[-57.94267578124999,-21.79833984375],[-57.830224609374994,-20.99794921875001],[-57.91513671874998,-20.690332031249966],[-57.97905273437493,-20.65732421874999],[-58.00224609374996,-20.465429687499977],[-58.02539062499997,-20.41582031249999],[-58.05844726562495,-20.38613281249998],[-58.091503906249926,-20.33320312500004],[-58.124609375000034,-20.293457031250014],[-58.13779296874995,-20.237304687500043],[-58.15976562499998,-20.164648437499977],[-58.09375,-20.15107421874997],[-58.021142578124994,-20.05517578124997],[-57.96015625000001,-20.04072265625004],[-57.887597656249966,-20.020410156249994],[-57.860742187499994,-19.97958984375002],[-58.029931640624994,-19.83271484375004],[-58.131494140624994,-19.74453125],[-57.71679687499997,-19.044042968750034],[-57.73085937499999,-18.91718750000004],[-57.783105468749994,-18.91425781249997],[-57.725,-18.73320312500003],[-57.57402343749993,-18.279296875000014],[-57.49565429687496,-18.21464843749999],[-57.58647460937499,-18.122265625],[-57.66166992187493,-17.94736328124999],[-57.78017578125002,-17.67177734374998],[-57.78886718750002,-17.573046875000017],[-57.83247070312501,-17.512109375000037],[-57.90502929687497,-17.53232421874999],[-57.990917968749955,-17.512890625000026],[-58.20556640625,-17.363085937499974],[-58.347753906250006,-17.282128906249994],[-58.39599609374997,-17.234277343750023],[-58.417382812499994,-17.08056640624997],[-58.459814453125006,-16.910742187500006],[-58.478125,-16.70068359375003],[-58.470605468749994,-16.650195312500045],[-58.35039062500002,-16.49082031249999],[-58.34560546875002,-16.284375],[-58.375390624999966,-16.283593749999966],[-58.423681640625034,-16.30791015625003],[-58.49658203124994,-16.32666015625003],[-58.537939453125034,-16.32822265624999],[-60.17558593749996,-16.26933593749999],[-60.187207031249955,-16.132128906250017],[-60.206640625,-15.90195312500002],[-60.242333984374994,-15.479589843750034],[-60.38046874999998,-15.318261718750023],[-60.53046874999998,-15.143164062499977],[-60.58320312499998,-15.098339843749983],[-60.273339843749994,-15.088769531249994],[-60.372705078124994,-14.41875],[-60.506591796875,-13.78984375],[-61.077001953125034,-13.489746093750014],[-61.129150390625,-13.498535156250028],[-61.41606445312502,-13.526562499999969],[-61.511572265625006,-13.541210937500011],[-61.789941406249966,-13.525585937500026],[-61.87412109374998,-13.470410156249983],[-61.944726562499966,-13.40625],[-62.09477539062499,-13.241992187499989],[-62.118017578125006,-13.15976562500002],[-62.765478515625034,-12.99726562500004],[-63.01518554687502,-12.80556640624998],[-63.067480468750006,-12.669140624999983],[-63.34667968749994,-12.68007812499999],[-63.68857421874998,-12.478027343749957],[-64.42050781249995,-12.439746093749974],[-64.783447265625,-12.059375],[-65.18574218749998,-11.749511718749957],[-65.389892578125,-11.246289062500011],[-65.33403320312499,-10.892773437500026],[-65.44711914062503,-10.507421875000034],[-65.4369140625,-10.449023437499946],[-65.39545898437498,-10.392285156250026],[-65.31308593749998,-10.253027343749991],[-65.29858398437497,-10.146777343750017],[-65.39614257812494,-9.712402343749986],[-66.57534179687502,-9.899902343749986],[-67.41694335937495,-10.389843749999969],[-67.72177734374998,-10.683105468749943],[-67.83500976562496,-10.662792968749983],[-67.99169921875,-10.674414062499949],[-68.07167968749994,-10.703125],[-68.39799804687499,-11.01875],[-68.678369140625,-11.11279296875],[-68.84833984374998,-11.01113281249998],[-69.228515625,-10.955664062499963],[-69.46254882812497,-10.948144531250023],[-69.57861328125,-10.951757812499963],[-69.67402343749998,-10.9541015625],[-69.83979492187501,-10.93339843749996],[-69.96035156249997,-10.92988281250004],[-70.06630859374997,-10.982421875],[-70.22006835937503,-11.04765625],[-70.29038085937498,-11.064257812499974],[-70.34199218750001,-11.066699218750017],[-70.39228515624995,-11.058593749999972],[-70.45087890624998,-11.024804687500009],[-70.53325195312496,-10.946875],[-70.59653320312498,-10.976855468750017],[-70.642333984375,-11.010253906249986],[-70.59916992187499,-9.620507812500009],[-70.54111328124998,-9.4375],[-70.60791015625,-9.463671875000031],[-70.63691406249995,-9.478222656249969],[-71.041748046875,-9.81875],[-71.11528320312499,-9.852441406250009],[-71.33940429687499,-9.988574218750031],[-72.18159179687495,-10.003710937500003],[-72.37905273437497,-9.51015625],[-73.20942382812493,-9.411425781249946],[-73.08984375,-9.26572265625002],[-72.970361328125,-9.120117187500028],[-72.97402343750002,-8.9931640625],[-73.07050781249995,-8.8828125],[-73.203125,-8.719335937499991],[-73.30244140624995,-8.654003906250011],[-73.36040039062496,-8.479296875000031],[-73.39814453125001,-8.458984374999986],[-73.54912109374993,-8.34580078125002],[-73.73203125,-7.875390625],[-73.72041015624993,-7.782519531250017],[-73.76689453124999,-7.753515624999963],[-73.82207031249996,-7.738964843750026],[-73.89462890624998,-7.654785156250014],[-73.946875,-7.611230468750023],[-73.98173828124996,-7.58505859375002],[-74.00205078125003,-7.556054687499966],[-73.98173828124996,-7.535742187500006],[-73.95849609374994,-7.506640625000031],[-73.96430664062498,-7.378906250000028],[-73.74946289062498,-7.335351562500037],[-73.72041015624993,-7.309277343749969],[-73.758203125,-7.172753906249952],[-73.79301757812499,-7.135058593750003],[-73.75810546874999,-6.90576171875],[-73.137353515625,-6.4658203125],[-73.23554687500001,-6.098437500000017],[-73.209375,-6.028710937500023],[-73.16289062499996,-5.933398437499974],[-72.97988281249997,-5.634863281249991],[-72.88706054687498,-5.122753906250026],[-72.83193359374994,-5.09375],[-72.69873046874997,-5.067187499999989],[-72.60834960937495,-5.009570312499974],[-72.46899414062497,-4.901269531250023],[-72.35283203124993,-4.786035156249994],[-72.25678710937501,-4.74892578124998],[-71.8447265625,-4.504394531249986],[-70.97368164062499,-4.350488281249994],[-70.86601562499999,-4.229589843749963],[-70.79951171874995,-4.173339843749957],[-70.72158203124997,-4.15888671875004],[-70.53066406249997,-4.167578125000034],[-70.40463867187498,-4.150097656250026],[-70.34365234375,-4.193652343750017],[-70.31689453124994,-4.246972656250037],[-70.23916015625002,-4.30117187499998],[-70.12880859375,-4.286621093749943],[-70.05332031249998,-4.333105468750006],[-70.00395507812496,-4.327246093749963],[-69.97202148437503,-4.30117187499998],[-69.96591796875003,-4.2359375],[-69.94819335937498,-4.200585937500009],[-69.66904296875003,-2.667675781249997],[-69.40024414062498,-1.194921874999977],[-69.63398437500001,-0.50927734375],[-70.07050781249993,-0.13886718750004],[-70.05390624999993,0.578613281250028],[-69.47211914062498,0.72993164062504],[-69.15332031249994,0.65878906250002],[-69.31181640624999,1.050488281249969],[-69.85214843750003,1.05952148437504],[-69.84858398437493,1.708740234375043],[-68.17656249999999,1.719824218749991],[-68.25595703125,1.845507812500017],[-68.19379882812495,1.987011718749983],[-67.93623046874998,1.748486328124969],[-67.40043945312499,2.116699218750028],[-67.11923828124998,1.703613281249986],[-67.082275390625,1.185400390625006],[-66.87602539062499,1.223046875000037],[-66.34711914062498,0.7671875],[-66.06005859375003,0.78535156250004],[-65.68144531249999,0.983447265624989],[-65.52299804687493,0.843408203124966],[-65.55605468750002,0.687988281250014],[-65.47338867187497,0.691259765624977],[-65.10375976562497,1.108105468749983],[-64.20502929687493,1.52949218750004],[-64.00849609374995,1.931591796874969],[-63.43251953124994,2.155566406250045],[-63.389257812500006,2.411914062500045],[-64.04658203124998,2.502392578124997],[-64.22109375000002,3.587402343749972],[-64.66899414062496,4.01181640625002],[-64.788671875,4.276025390625023],[-64.57636718750001,4.139892578125],[-64.19248046874995,4.126855468750009],[-64.02148437500003,3.929101562500051],[-63.33867187500002,3.943896484375045],[-62.85698242187502,3.593457031249969],[-62.71210937499998,4.01791992187502],[-62.41064453124994,4.156738281249972],[-62.153125,4.098388671874986],[-61.82084960937496,4.197021484375],[-61.28007812500002,4.516894531249974],[-61.00283203125002,4.535253906249991],[-60.603857421875006,4.94936523437498],[-60.671972656250034,5.164355468749989],[-60.71196289062499,5.191552734375023],[-60.742138671874926,5.202050781250037],[-60.6513671875,5.221142578125011],[-60.45952148437499,5.188085937500034],[-60.40878906249998,5.21015625],[-60.33520507812497,5.199316406250006],[-60.241650390624926,5.257958984374966],[-60.14204101562498,5.238818359374974],[-59.990673828124955,5.082861328124991],[-60.14863281249998,4.533251953125031],[-59.69970703125,4.353515625]]]]},"properties":{"name":"Brazil","childNum":17}},{"geometry":{"type":"Polygon","coordinates":[[[-59.493310546874994,13.081982421874997],[-59.611328125,13.102099609374989],[-59.6466796875,13.303125],[-59.427636718749994,13.152783203124997],[-59.493310546874994,13.081982421874997]]]},"properties":{"name":"Barbados","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[115.02675781250005,4.899707031249989],[115.1400390625,4.899755859374991],[115.290625,4.352587890624989],[115.10703125000006,4.390429687499974],[115.02675781250005,4.899707031249989]]],[[[115.02675781250005,4.899707031249989],[114.74667968750006,4.718066406250017],[114.84023437500005,4.393212890625009],[114.65410156250007,4.037646484375045],[114.0638671875,4.592675781249966],[114.42441406250006,4.660400390625],[114.99541015625002,5.022363281250023],[115.02675781250005,4.899707031249989]]]]},"properties":{"name":"Brunei","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[91.63193359375003,27.759960937499997],[91.5947265625,27.557666015624996],[91.74306640625002,27.442529296874994],[91.85126953125001,27.438623046874994],[91.95097656249999,27.458300781249996],[91.99082031250003,27.4501953125],[92.044921875,27.364697265624997],[92.08339843750002,27.290625],[92.03115234375002,27.214306640624997],[92.00253906250003,27.147363281249994],[91.99228515625003,27.099902343749996],[91.99863281250003,27.079296875],[92.03085937500003,27.040820312499996],[92.06816406249999,26.9751953125],[92.07343750000001,26.91484375],[92.04970703125002,26.874853515625],[91.99833984374999,26.85498046875],[91.84208984374999,26.852978515624997],[91.67158203125001,26.802001953125],[91.517578125,26.807324218749997],[91.45585937499999,26.866894531249997],[91.4267578125,26.867089843749994],[91.28652343750002,26.789941406249994],[90.73964843750002,26.771679687499997],[90.34589843750001,26.890332031249997],[90.2060546875,26.847509765625],[90.12294921875002,26.754589843749997],[89.94316406249999,26.723925781249996],[89.76386718750001,26.7015625],[89.60996093750003,26.719433593749997],[89.58613281250001,26.778955078124994],[89.33212890625003,26.8486328125],[89.14824218749999,26.816162109375],[89.04091796875002,26.865039062499996],[88.85761718750001,26.961474609374996],[88.73876953125,27.175585937499996],[88.76035156250003,27.218115234375],[88.88164062499999,27.2974609375],[88.89140624999999,27.316064453124994],[88.94755859374999,27.464013671874994],[89.48066406250001,28.059960937499994],[89.53691406249999,28.107421875],[89.65273437500002,28.15830078125],[89.74980468749999,28.188183593749997],[89.81689453125,28.256298828124997],[89.89785156250002,28.294140625],[89.98105468750003,28.311181640624994],[90.34824218750003,28.243945312499996],[90.36298828125001,28.216503906249997],[90.33310546875003,28.093994140625],[90.35273437500001,28.080224609374994],[90.47734374999999,28.070849609374996],[90.63007812500001,28.078564453124997],[90.71572265625002,28.071728515624997],[91.02080078124999,27.970068359375],[91.07773437500003,27.974462890625],[91.22587890624999,28.071240234374997],[91.27304687500003,28.078369140625],[91.30683593750001,28.064013671874996],[91.36757812500002,28.021630859374994],[91.64189453124999,27.923242187499994],[91.63193359375003,27.759960937499997]]]},"properties":{"name":"Bhutan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[25.2587890625,-17.793554687500006],[25.242285156250006,-17.969042968750003],[25.939355468750023,-18.93867187500001],[26.168066406250006,-19.53828125000001],[27.17822265625,-20.10097656250001],[27.28076171875,-20.47871093750001],[27.679296875,-20.503027343750006],[27.66943359375,-21.064257812500003],[28.014062500000023,-21.55419921875],[29.02558593750001,-21.796875],[29.042382812500023,-22.018359375],[29.237207031250023,-22.07949218750001],[29.315234375000017,-22.15771484375],[29.36484375,-22.193945312500006],[29.1298828125,-22.21328125],[29.013476562500017,-22.278417968750006],[28.94580078125,-22.395117187500006],[28.83984375,-22.480859375],[28.21015625000001,-22.693652343750003],[27.812597656250006,-23.108007812500006],[27.7685546875,-23.14892578125],[27.085546875,-23.577929687500003],[26.835058593750006,-24.240820312500006],[26.617773437500006,-24.3955078125],[26.451757812500006,-24.58271484375001],[26.39716796875001,-24.613574218750003],[26.130859375,-24.671484375],[26.031835937500006,-24.702441406250003],[25.912109375,-24.74746093750001],[25.518164062500006,-25.66279296875001],[25.21337890625,-25.75625],[24.33056640625,-25.74287109375001],[24.19296875,-25.632910156250006],[23.969531250000017,-25.626074218750006],[23.89375,-25.600878906250003],[23.389257812500006,-25.29140625],[23.148730468750017,-25.288671875],[22.878808593750023,-25.45791015625001],[22.59765625,-26.13271484375001],[22.548632812500017,-26.17841796875001],[22.47089843750001,-26.219042968750003],[22.217578125000017,-26.38886718750001],[22.090917968750006,-26.580175781250006],[22.01093750000001,-26.635839843750006],[21.78828125000001,-26.710058593750006],[21.738085937500017,-26.80683593750001],[21.694726562500023,-26.840917968750006],[20.73984375,-26.84882812500001],[20.641406250000017,-26.7421875],[20.79316406250001,-25.915625],[20.4306640625,-25.147070312500006],[19.98046875,-24.77675781250001],[19.977343750000017,-22.00019531250001],[20.9794921875,-21.9619140625],[20.97412109375,-18.31884765625],[23.219335937500006,-17.99970703125001],[23.599707031250006,-18.4599609375],[24.243945312500017,-18.0234375],[24.530566406250017,-18.052734375],[24.909082031250023,-17.821386718750006],[25.2587890625,-17.793554687500006]]]},"properties":{"name":"Botswana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[22.86005859375001,10.919677734375],[23.646289062500017,9.822900390624994],[23.62265625,9.340625],[23.46826171875,9.11474609375],[23.53730468750001,8.815820312499994],[24.147363281250023,8.665625],[24.291406250000023,8.29140625],[24.853320312500017,8.137548828124991],[25.20039062500001,7.807910156249989],[25.18134765625001,7.557226562499991],[25.27890625,7.427490234375],[26.36181640625,6.635302734374989],[26.30859375,6.455322265625],[26.514257812500006,6.069238281249994],[27.143945312500023,5.722949218749989],[27.4033203125,5.109179687499989],[27.071875,5.199755859374989],[26.822070312500017,5.062402343749994],[25.52509765625001,5.31210937499999],[25.065234375000017,4.967431640624994],[24.31982421875,4.994140625],[23.41718750000001,4.663134765624989],[22.864550781250017,4.723876953125],[22.422167968750017,4.134960937499997],[20.55810546875,4.462695312499989],[20.226367187500017,4.829638671874989],[19.806542968750023,5.089306640624997],[19.5009765625,5.127490234374989],[19.06855468750001,4.891406249999989],[18.594140625000023,4.346240234374989],[18.6103515625,3.478417968749994],[18.474414062500017,3.622998046874997],[18.160937500000017,3.499804687499989],[17.491601562500023,3.687304687499989],[16.610742187500023,3.50537109375],[16.468554687500017,2.831738281249997],[16.183398437500017,2.270068359374989],[16.0634765625,2.90859375],[15.128710937500017,3.826904296875],[15.063574218750006,4.284863281249997],[14.73125,4.602392578124991],[14.56298828125,5.279931640624994],[14.616894531250011,5.865136718749994],[14.43115234375,6.038720703124994],[14.7392578125,6.27978515625],[15.206738281250011,7.206152343749991],[15.480078125,7.523779296874991],[15.957617187500006,7.507568359375],[16.37890625,7.683544921874997],[16.545312500000023,7.865478515625],[16.784765625,7.550976562499997],[17.6494140625,7.98359375],[18.56416015625001,8.0458984375],[19.108691406250017,8.656152343749994],[18.886035156250017,8.836035156249991],[18.95625,8.938867187499994],[20.342089843750017,9.127099609374994],[20.773242187500017,9.405664062499994],[21.682714843750006,10.289843749999989],[21.771484375,10.642822265625],[22.49384765625001,10.996240234374994],[22.86005859375001,10.919677734375]]]},"properties":{"name":"Central African Rep.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.78759765624997,43.939599609374994],[-60.11748046874996,43.95336914062506],[-59.727148437500006,44.002832031249994],[-59.78759765624997,43.939599609374994]]],[[[-66.7625,44.68178710937502],[-66.8970703125,44.62890625],[-66.80214843749994,44.80537109374998],[-66.7625,44.68178710937502]]],[[[-60.961572265624966,45.48994140625001],[-61.081738281249926,45.55781249999998],[-60.91245117187498,45.56728515625005],[-60.961572265624966,45.48994140625001]]],[[[-73.69531249999997,45.58549804687502],[-73.85771484375002,45.573583984375006],[-73.57236328124998,45.69448242187502],[-73.69531249999997,45.58549804687502]]],[[[-73.56650390625003,45.469091796875034],[-73.960546875,45.44140624999997],[-73.68745117187498,45.561425781249994],[-73.47607421874997,45.704736328124994],[-73.56650390625003,45.469091796875034]]],[[[-61.10517578124998,45.94472656250002],[-60.86523437499997,45.983496093750006],[-61.05903320312501,45.70336914062497],[-60.73789062499995,45.75141601562498],[-60.46059570312494,45.96870117187501],[-60.733300781249994,45.956591796875045],[-60.297949218750034,46.31123046874998],[-60.22646484374994,46.19555664062506],[-59.86503906249993,46.159521484375006],[-59.8421875,45.941552734374994],[-60.67294921874995,45.59082031250006],[-61.28369140624994,45.573876953124966],[-61.44980468749995,45.71621093750002],[-61.40864257812501,46.17036132812498],[-60.87016601562499,46.796777343749966],[-60.40820312500003,47.00351562499998],[-60.332910156249966,46.737011718749955],[-60.49453125000002,46.270263671875],[-61.10517578124998,45.94472656250002]]],[[[-63.811279296875,46.46870117187501],[-63.68144531249993,46.561914062499994],[-63.12939453125,46.422216796875034],[-62.02373046874999,46.42158203125001],[-62.52607421875001,46.20288085937503],[-62.531347656250034,45.977294921875],[-63.02207031249998,46.06660156249998],[-62.89453125000003,46.12358398437496],[-63.056347656249955,46.22392578124996],[-62.97846679687498,46.31635742187498],[-63.21347656249998,46.15986328124998],[-63.641015624999966,46.23046874999997],[-63.758642578125034,46.397607421874994],[-64.11083984375003,46.425439453124994],[-64.13603515624999,46.59970703125006],[-64.388037109375,46.640869140625],[-63.99355468750002,47.06157226562502],[-64.08789062499997,46.77543945312499],[-63.811279296875,46.46870117187501]]],[[[-61.91411132812496,47.284521484375034],[-61.77255859374998,47.25981445312499],[-62.00830078124994,47.23427734375002],[-61.924707031249966,47.425146484375006],[-61.3955078125,47.63764648437504],[-61.91411132812496,47.284521484375034]]],[[[-54.227148437500034,47.44135742187501],[-54.32597656250002,47.408105468749994],[-54.12817382812494,47.646826171875034],[-54.227148437500034,47.44135742187501]]],[[[-74.70888671874997,45.0038574218751],[-73.55810546875,45.425097656250045],[-73.1595703125,46.01005859375002],[-72.10927734374997,46.55122070312504],[-71.26118164062495,46.75625],[-70.51948242187501,47.032519531250045],[-69.47104492187503,47.96728515625006],[-68.23818359374994,48.62641601562504],[-66.17817382812493,49.21313476562503],[-64.83632812499994,49.191748046875006],[-64.2162109375,48.873632812500034],[-64.51372070312493,48.84111328124999],[-64.24609374999994,48.69111328124998],[-64.34882812500001,48.423193359375034],[-65.259423828125,48.02124023437503],[-65.92670898437495,48.188867187499994],[-66.70439453125002,48.0224609375],[-66.35961914062494,48.06064453125006],[-65.84941406250002,47.91103515625005],[-65.60722656249996,47.67001953125006],[-65.00166015624995,47.84682617187502],[-64.70322265625,47.72485351562503],[-64.91220703125003,47.36865234375003],[-65.31889648437502,47.101220703124994],[-64.831396484375,47.06079101562503],[-64.88251953124993,46.822851562500034],[-64.54150390625,46.240332031250034],[-63.91591796875002,46.165820312500045],[-63.831933593749966,46.107177734375],[-64.05639648437503,46.021337890625006],[-63.70288085937494,45.858007812500034],[-62.70068359374997,45.740576171875006],[-62.750097656250006,45.64824218750002],[-62.483056640624966,45.62182617187506],[-61.955517578124955,45.86816406249997],[-61.776513671874994,45.655615234375006],[-61.49228515624998,45.68701171875],[-61.350488281249966,45.57368164062501],[-61.28198242187494,45.441064453124994],[-61.46098632812502,45.36669921875003],[-61.03154296875002,45.29174804687506],[-63.306298828124994,44.64257812500003],[-63.60400390624997,44.68320312500006],[-63.60976562499999,44.47998046875006],[-63.999707031249926,44.64492187499999],[-64.10087890624993,44.487451171874966],[-64.1669921875,44.58666992187503],[-64.28608398437493,44.55034179687499],[-64.27568359374993,44.33408203124998],[-65.48168945312497,43.51806640625],[-65.73813476562498,43.56074218750001],[-65.88691406250001,43.79521484374999],[-66.125732421875,43.813818359375034],[-66.19306640624995,44.143847656250045],[-65.86801757812498,44.56879882812501],[-66.14638671875002,44.43593750000005],[-66.090625,44.50493164062499],[-64.44814453125,45.33745117187502],[-64.13549804687497,45.023046875],[-64.09316406249997,45.21708984375002],[-63.368017578125034,45.36479492187502],[-64.87314453124998,45.35458984375006],[-64.31464843749998,45.83569335937503],[-64.48222656250002,45.80634765624998],[-64.63271484375002,45.94663085937506],[-64.77851562499998,45.63842773437497],[-65.88447265624995,45.22290039062506],[-66.10976562500002,45.316601562499955],[-66.02656249999995,45.417578125],[-66.43984374999994,45.09589843750001],[-66.87246093749997,45.067285156249966],[-67.12485351562498,45.16943359375],[-67.366943359375,45.17377929687498],[-67.43266601562496,45.603125],[-67.80224609374994,45.7275390625],[-67.806787109375,47.08281249999999],[-68.23549804687502,47.34594726562503],[-68.93720703124998,47.21123046875002],[-69.0501953125,47.426611328125034],[-69.24287109374998,47.46298828124998],[-70.00771484375002,46.70893554687501],[-70.296240234375,45.90610351562506],[-70.86503906249999,45.27070312500001],[-71.327294921875,45.29008789062496],[-71.51752929687495,45.00756835937497],[-74.663232421875,45.00390625000003],[-74.70888671874997,45.0038574218751]]],[[[-126.09208984374995,49.35400390625003],[-126.06401367187499,49.26362304687501],[-126.22963867187498,49.29565429687506],[-126.09208984374995,49.35400390625003]]],[[[-54.55439453125001,49.5888671875],[-54.786523437499966,49.496142578125045],[-54.86357421875002,49.576074218749966],[-54.55439453125001,49.5888671875]]],[[[-54.093701171874955,49.74443359374999],[-53.98066406250001,49.66196289062498],[-54.28613281249997,49.595361328124994],[-54.27763671875002,49.71147460937502],[-54.093701171874955,49.74443359374999]]],[[[-126.64121093749999,49.605810546875006],[-126.93857421874999,49.71845703125004],[-126.92583007812497,49.837744140625006],[-126.73813476562502,49.84365234375005],[-126.64121093749999,49.605810546875006]]],[[[-61.801123046875034,49.093896484374966],[-63.04150390624994,49.224951171875034],[-64.485205078125,49.88696289062497],[-64.13144531249995,49.94165039062503],[-62.858544921874966,49.70546875000005],[-61.817138671875,49.28354492187498],[-61.69614257812495,49.139013671875006],[-61.801123046875034,49.093896484374966]]],[[[-125.18413085937497,50.09711914062498],[-125.301171875,50.4140625],[-125.07402343750002,50.22065429687501],[-125.18413085937497,50.09711914062498]]],[[[-127.19731445312495,50.640380859375],[-125.48208007812501,50.316796874999966],[-124.83061523437499,49.53007812500002],[-123.99580078125,49.22402343750002],[-123.49702148437498,48.58208007812499],[-123.38989257812501,48.67021484374999],[-123.31064453125003,48.41103515625002],[-123.57314453124995,48.32280273437499],[-123.91694335937501,48.386572265625034],[-125.12070312500002,48.76079101562496],[-124.84965820312496,49.02827148437501],[-124.81264648437497,49.212646484375],[-124.92734374999998,49.01420898437499],[-125.489453125,48.933789062499955],[-125.82851562499998,49.09184570312499],[-125.64423828125001,49.18579101562506],[-125.95166015625001,49.24804687500003],[-125.93540039062499,49.401464843750006],[-126.51914062499999,49.396777343750045],[-126.54189453125001,49.590478515624966],[-126.13408203124997,49.672314453124955],[-126.52524414062499,49.71958007812498],[-126.90332031250001,49.94414062499999],[-127.114306640625,49.879736328125034],[-127.24980468749999,50.13798828124996],[-127.34941406249995,50.05195312500001],[-127.46713867187503,50.163427734375006],[-127.86391601562495,50.12773437500002],[-127.90585937499998,50.44521484375002],[-127.48652343749998,50.404638671875034],[-127.46591796874996,50.58310546875006],[-128.05834960937494,50.498486328124955],[-128.34604492187503,50.744238281250006],[-127.91806640624998,50.86054687500001],[-127.19731445312495,50.640380859375]]],[[[-55.45874023437494,51.53652343750005],[-55.58339843749994,51.38857421875002],[-56.031103515625034,51.328369140625],[-55.8,51.033300781250034],[-56.732324218749966,50.007714843749994],[-56.822167968749966,49.613476562499955],[-56.179394531249955,50.114990234375],[-56.161279296874994,49.94013671874998],[-55.50292968749997,49.98315429687503],[-56.14018554687496,49.61914062500006],[-55.869824218749955,49.67016601562506],[-56.08730468750002,49.45195312499999],[-55.375927734374955,49.48974609374997],[-55.34384765624998,49.37290039062506],[-55.22954101562496,49.508154296875006],[-55.35317382812502,49.07944335937506],[-54.50219726562503,49.52734375],[-54.44824218749997,49.329443359375006],[-53.957714843749955,49.44184570312498],[-53.61943359374996,49.321630859375006],[-53.57343750000001,49.141210937500034],[-54.16127929687494,48.787695312500034],[-53.852880859375006,48.81132812499996],[-53.966015624999955,48.70668945312505],[-53.70634765624999,48.65551757812503],[-54.11445312499998,48.393603515625045],[-53.027587890625,48.634716796874955],[-53.1357421875,48.40185546875003],[-53.60976562500002,48.20771484375001],[-53.56943359374998,48.088085937499955],[-53.869580078124926,48.019677734374966],[-53.63823242187496,48.01464843750003],[-53.863671874999966,47.787011718749994],[-53.67236328125,47.64824218749999],[-53.28271484375,47.99785156249996],[-52.86601562499993,48.11298828124998],[-53.16982421875002,47.51210937500005],[-52.945019531249955,47.55283203124998],[-52.782421874999955,47.769433593749966],[-52.653662109375034,47.549414062500006],[-53.11484375,46.65581054687502],[-53.32304687499996,46.71835937499998],[-53.589794921874955,46.638867187499955],[-53.59736328124998,47.14599609374997],[-54.00957031249993,46.839599609375],[-54.173730468749994,46.88037109375003],[-53.84951171875002,47.440332031249994],[-53.98901367187503,47.756201171875034],[-54.191845703124955,47.85981445312501],[-54.488134765625006,47.40385742187502],[-54.47392578124996,47.54707031249998],[-54.856640624999955,47.385009765625],[-55.31572265624993,46.905712890624955],[-55.78852539062498,46.86723632812502],[-55.91923828124996,47.01689453124996],[-55.49150390624996,47.16064453125003],[-54.78461914062501,47.664746093749955],[-55.366308593750034,47.66108398437501],[-55.57612304687498,47.46523437499999],[-56.12724609374999,47.50283203125002],[-55.867089843749994,47.592333984375045],[-55.85791015625,47.81918945312498],[-56.774121093749955,47.56499023437499],[-58.33686523437501,47.73085937500002],[-59.11694335937494,47.57070312499999],[-59.32065429687498,47.736914062500006],[-59.272070312500034,47.99555664062504],[-58.330224609374994,48.52211914062502],[-59.16767578124998,48.558496093749966],[-58.84179687500003,48.74643554687498],[-58.906445312499955,48.65019531249999],[-58.716455078124994,48.59804687500002],[-58.403662109375034,49.08432617187498],[-57.99052734374996,48.987939453124966],[-58.09892578124993,49.07744140624999],[-57.98007812499998,49.229638671874994],[-58.19091796875003,49.25874023437498],[-58.21337890625,49.38666992187501],[-58.01582031249998,49.54248046874997],[-57.79130859374999,49.48999023437503],[-57.92617187499999,49.700830078124994],[-57.4326171875,50.50581054687504],[-57.179589843749966,50.614843750000034],[-57.29799804687502,50.69873046874997],[-57.03593750000002,51.01083984374998],[-56.68242187500002,51.332763671875],[-56.025585937499955,51.56835937500006],[-55.6904296875,51.471337890624994],[-55.666406249999966,51.57890624999999],[-55.45874023437494,51.53652343750005]]],[[[-127.92465820312498,51.47387695312497],[-128.14877929687498,51.62670898437503],[-128.03173828125006,51.708398437499966],[-127.92465820312498,51.47387695312497]]],[[[-79.38427734374997,51.951953125000045],[-79.64375,52.01005859374996],[-79.27128906249996,52.086816406249966],[-79.38427734374997,51.951953125000045]]],[[[-128.36875,52.40087890625],[-128.43979492187503,52.696386718750006],[-128.24726562499998,52.784375],[-128.36875,52.40087890625]]],[[[-80.73168945312494,52.74726562499998],[-82.03925781249998,53.04990234374998],[-81.84731445312494,53.18627929687497],[-81.135595703125,53.20581054687503],[-80.73168945312494,52.74726562499998]]],[[[-131.7537109375,53.195556640625],[-131.63466796874997,52.92216796874999],[-131.97177734374998,52.87983398437498],[-131.45522460937502,52.70170898437502],[-131.59057617187494,52.578222656250006],[-131.25971679687495,52.415917968749966],[-131.31992187499998,52.30307617187498],[-131.142626953125,52.291113281250034],[-131.221533203125,52.15361328124999],[-132.16508789062493,52.783300781250034],[-132.14375,52.99931640624999],[-132.54677734374997,53.1375],[-131.7537109375,53.195556640625]]],[[[-128.55244140624998,52.93974609375002],[-128.50991210937502,52.51860351562502],[-128.678955078125,52.289648437500006],[-128.74633789062494,52.763378906249955],[-128.89980468749997,52.67382812500003],[-129.175927734375,52.964941406250006],[-129.033251953125,53.27993164062505],[-128.63266601562498,53.1125],[-128.55244140624998,52.93974609375002]]],[[[-129.167724609375,53.11787109374998],[-129.32387695312502,53.142138671875045],[-129.23818359374997,53.33007812500006],[-129.167724609375,53.11787109374998]]],[[[-129.84858398437498,53.167919921874955],[-130.51757812500003,53.54423828124999],[-130.45200195312498,53.63115234375002],[-129.94472656250002,53.436376953125034],[-129.75483398437498,53.244775390624994],[-129.84858398437498,53.167919921874955]]],[[[-130.236279296875,53.95854492187502],[-130.38422851562504,53.84394531250001],[-130.703173828125,53.892236328124994],[-130.44799804687497,54.08901367187502],[-130.236279296875,53.95854492187502]]],[[[-132.65551757812503,54.12749023437496],[-132.30336914062497,54.098876953125],[-132.16611328124998,53.95522460937505],[-132.53466796875,53.651708984375034],[-132.18696289062504,53.68481445312503],[-132.134423828125,54.03427734374998],[-131.66762695312502,54.14135742187503],[-131.957421875,53.308691406250034],[-132.34726562500003,53.18920898437503],[-132.747509765625,53.310498046874955],[-132.425,53.33696289062502],[-132.84501953125,53.507714843749994],[-133.07949218749997,53.837011718750034],[-133.04838867187493,54.15893554687497],[-132.65551757812503,54.12749023437496]]],[[[-130.92714843749997,54.47905273437499],[-130.90683593750003,54.63178710937504],[-130.75800781249998,54.61376953125],[-130.92714843749997,54.47905273437499]]],[[[-130.57534179687497,54.769677734374966],[-130.2140625,55.02587890625003],[-130.34941406249996,54.814550781250034],[-130.57534179687497,54.769677734374966]]],[[[-79.97758789062499,56.20703125000006],[-80.057470703125,56.28735351562497],[-79.57973632812502,56.466357421875045],[-79.97758789062499,56.20703125000006]]],[[[-78.93559570312496,56.26606445312498],[-79.17548828124998,55.88505859374999],[-79.18212890625,56.21215820312503],[-79.4951171875,55.87475585937503],[-79.76474609374995,55.80678710937505],[-79.54472656249999,56.12836914062501],[-79.9875,55.89213867187502],[-79.45888671875,56.53974609374998],[-79.53632812499995,56.180078124999966],[-79.27241210937493,56.600439453125006],[-78.93559570312496,56.26606445312498]]],[[[-61.743603515624955,57.55458984375005],[-61.6375,57.41606445312499],[-62.01123046875003,57.54848632812505],[-61.743603515624955,57.55458984375005]]],[[[-79.71650390624998,57.515527343749994],[-79.80844726562498,57.44243164062502],[-79.74257812499997,57.60795898437499],[-79.71650390624998,57.515527343749994]]],[[[-69.16005859375,59.04023437500001],[-69.35283203125002,58.96074218749999],[-69.30322265625003,59.144873046875006],[-69.16005859375,59.04023437500001]]],[[[-64.40703125,60.367089843749966],[-64.44194335937496,60.2978515625],[-64.73793945312497,60.37563476562502],[-64.83642578124997,60.50102539062499],[-64.40703125,60.367089843749966]]],[[[-68.23378906250002,60.24091796875001],[-68.36787109374998,60.314746093750045],[-68.08759765624998,60.58784179687501],[-67.81884765624994,60.449511718750074],[-68.23378906250002,60.24091796875001]]],[[[-78.531640625,60.72856445312499],[-78.66889648437498,60.716894531250006],[-78.24169921875,60.818652343750045],[-78.531640625,60.72856445312499]]],[[[-64.83261718749998,61.366064453125006],[-65.43212890625,61.649511718750034],[-64.78964843750003,61.662207031250034],[-64.83261718749998,61.366064453125006]]],[[[-65.03056640624999,61.879052734374966],[-64.89658203124995,61.73330078125005],[-65.23535156249997,61.89770507812506],[-65.03056640624999,61.879052734374966]]],[[[-79.54531250000002,62.41171875000006],[-79.28647460937495,62.247656250000034],[-79.32392578124995,62.02607421875001],[-79.81611328124995,61.59462890625002],[-80.26518554687496,61.818212890625006],[-80.26005859374996,62.10903320312502],[-79.9267578125,62.39287109375002],[-79.54531250000002,62.41171875000006]]],[[[-64.82382812499998,62.558740234374994],[-64.46503906249998,62.535937500000045],[-64.47832031250002,62.417871093749966],[-64.901220703125,62.421044921874994],[-64.82382812499998,62.558740234374994]]],[[[-70.33706054687497,62.548730468749994],[-70.76606445312498,62.596875],[-71.22011718750002,62.873925781249966],[-70.44262695312497,62.73378906250002],[-70.33706054687497,62.548730468749994]]],[[[-82.00048828124997,62.95419921874998],[-82.02583007812498,62.73007812499998],[-82.56826171875002,62.403222656249994],[-83.01582031249998,62.20991210937498],[-83.69887695312497,62.16025390624998],[-83.91049804687498,62.45415039062499],[-83.37641601562498,62.904931640624994],[-82.00048828124997,62.95419921874998]]],[[[-77.87670898437497,63.470556640625034],[-77.53271484374997,63.233642578125],[-77.94243164062496,63.11440429687502],[-78.536767578125,63.423730468749994],[-77.87670898437497,63.470556640625034]]],[[[-76.67758789062503,63.393945312499966],[-77.36474609374994,63.588330078124955],[-77.13369140624997,63.68203125000002],[-76.65244140624998,63.503564453124994],[-76.67758789062503,63.393945312499966]]],[[[-84.91962890624995,65.26108398437503],[-84.50112304687497,65.45844726562501],[-84.08486328125,65.21782226562502],[-82.05,64.64428710937506],[-81.67612304687498,64.21264648437503],[-81.88710937499997,64.01640625000002],[-80.82895507812495,64.08994140625],[-80.30205078124999,63.76220703125003],[-81.04638671875003,63.461572265624966],[-82.378125,63.706787109375],[-82.46708984375002,63.92695312500001],[-83.30395507812497,64.14379882812506],[-84.63291015625,63.30922851562502],[-85.39262695312496,63.119677734375045],[-85.76894531249997,63.70034179687502],[-87.15190429687499,63.58564453125001],[-86.93203124999997,63.90166015625002],[-86.252099609375,64.13686523437497],[-86.37426757812503,64.56582031249997],[-86.074609375,65.533837890625],[-85.55468750000003,65.91865234374995],[-85.17622070312501,65.746875],[-85.23994140624993,65.51030273437499],[-84.91962890624995,65.26108398437503]]],[[[-84.67475585937498,65.575],[-85.096337890625,65.756201171875],[-85.14960937500001,66.01538085937506],[-84.75737304687496,65.85893554687505],[-84.67475585937498,65.575]]],[[[-83.72597656249997,65.796728515625],[-83.23374023437495,65.71503906249995],[-83.332421875,65.63105468749998],[-84.11826171874995,65.77177734375007],[-84.40717773437501,66.13100585937497],[-83.78696289062495,65.96577148437498],[-83.72597656249997,65.796728515625]]],[[[-108.09272460937501,67.00517578124999],[-107.80551757812493,66.99858398437507],[-107.94394531249999,66.8578125],[-108.09272460937501,67.00517578124999]]],[[[-62.681542968749966,67.05629882812502],[-62.87163085937499,67.06259765625006],[-62.41679687499996,67.18847656250003],[-62.681542968749966,67.05629882812502]]],[[[-107.89985351562497,67.40180664062495],[-107.95024414062503,67.31821289062498],[-108.15224609374997,67.429443359375],[-108.04897460937498,67.664892578125],[-107.89985351562497,67.40180664062495]]],[[[-73.621728515625,67.783837890625],[-74.573388671875,67.82866210937507],[-74.70654296875003,68.06708984374995],[-73.49375,68.00063476562502],[-73.40717773437498,67.79306640625],[-73.621728515625,67.783837890625]]],[[[-86.59555664062498,67.7359375],[-86.89252929687498,67.836572265625],[-86.95981445312503,68.10024414062497],[-86.70209960937501,68.30561523437498],[-86.42114257812497,68.18344726562503],[-86.59555664062498,67.7359375]]],[[[-75.67587890624998,68.32250976562506],[-75.078125,68.17314453124999],[-75.20195312499996,67.45917968750001],[-75.78007812499996,67.28354492187503],[-76.94418945312498,67.25029296875002],[-77.30439453125001,67.68510742187505],[-77.12587890624997,67.94707031250002],[-76.59580078124998,68.27895507812497],[-75.67587890624998,68.32250976562506]]],[[[-78.98271484374999,68.19282226562501],[-79.17475585937493,68.26445312500002],[-78.95258789062495,68.35302734375006],[-78.98271484374999,68.19282226562501]]],[[[-104.54067382812497,68.405908203125],[-105.05136718749999,68.55903320312501],[-104.60200195312503,68.56152343749997],[-104.54067382812497,68.405908203125]]],[[[-74.880859375,68.34868164062505],[-75.40024414062503,68.52548828125],[-75.28740234374996,68.68774414062503],[-74.98364257812497,68.64760742187502],[-74.880859375,68.34868164062505]]],[[[-101.84589843749994,68.58632812499997],[-102.30815429687497,68.681982421875],[-102.01337890624995,68.82539062500001],[-101.73295898437495,68.75341796875],[-101.84589843749994,68.58632812499997]]],[[[-100.21723632812497,68.80668945312502],[-100.59653320312496,68.76640625000007],[-100.56547851562495,69.02680664062501],[-100.21723632812497,68.80668945312502]]],[[[-99.99467773437502,69.01352539062503],[-100.19570312500002,68.991455078125],[-100.153125,69.12949218750003],[-99.99467773437502,69.01352539062503]]],[[[-79.21064453124995,68.845458984375],[-79.24267578125,69.04926757812495],[-78.33256835937496,69.38603515624999],[-78.77919921875,68.95048828124999],[-79.21064453124995,68.845458984375]]],[[[-90.1998046875,69.419091796875],[-90.33027343749993,69.252197265625],[-90.49204101562503,69.369873046875],[-90.1998046875,69.419091796875]]],[[[-76.99536132812503,69.14375],[-77.37939453125,69.2740234375],[-77.18754882812502,69.440087890625],[-76.66884765625002,69.36616210937504],[-76.99536132812503,69.14375]]],[[[-101.171728515625,69.39707031250003],[-101.31289062499998,69.57607421875],[-101.00063476562497,69.4619140625],[-101.171728515625,69.39707031250003]]],[[[-95.51367187499997,69.57363281250002],[-95.43745117187498,69.37846679687505],[-95.73012695312502,69.34755859374997],[-95.80620117187499,69.56049804687501],[-95.89345703125,69.35175781250004],[-95.87583007812495,69.60600585937505],[-95.51367187499997,69.57363281250002]]],[[[-67.91469726562494,69.54096679687504],[-68.22138671874998,69.61674804687502],[-67.908837890625,69.68183593749995],[-67.91469726562494,69.54096679687504]]],[[[-78.02910156249993,69.71489257812502],[-78.03999023437495,69.6083984375],[-78.84819335937502,69.4828125],[-78.02910156249993,69.71489257812502]]],[[[-79.43066406250003,69.78779296874995],[-79.55283203124995,69.63085937500006],[-80.04750976562502,69.63432617187505],[-79.97783203124993,69.50966796874997],[-80.794775390625,69.68925781250005],[-80.42421875000002,69.797607421875],[-79.43066406250003,69.78779296874995]]],[[[-97.439453125,69.64267578125006],[-96.29995117187494,69.34438476562505],[-95.7513671875,68.89765624999998],[-95.26777343749998,68.82607421874997],[-96.40156249999995,68.47070312500003],[-97.47202148437498,68.543701171875],[-98.320556640625,68.84272460937498],[-98.70380859374993,68.80278320312502],[-98.90449218749995,68.93242187500005],[-99.25400390625002,68.86318359374997],[-99.49467773437493,68.95957031249998],[-99.455712890625,69.13120117187503],[-98.45595703124997,69.33466796875001],[-98.54599609375,69.57290039062497],[-98.04135742187498,69.456640625],[-98.20048828124996,69.79697265625006],[-97.79072265624998,69.86162109374999],[-97.439453125,69.64267578125006]]],[[[-86.91303710937501,70.11323242187501],[-86.55766601562499,69.99531249999995],[-87.3232421875,70.08012695312502],[-86.91303710937501,70.11323242187501]]],[[[-74.70888671874997,45.0038574218751],[-74.76245117187494,44.99907226562502],[-74.99614257812496,44.970117187499966],[-75.40126953124997,44.77226562499999],[-75.81933593749997,44.468017578125],[-76.18579101562503,44.24223632812502],[-76.819970703125,43.62880859375011],[-77.59653320312492,43.62861328125007],[-78.45825195312497,43.63149414062511],[-78.72041015624993,43.62495117187501],[-78.84555664062492,43.58334960937506],[-79.171875,43.466552734375085],[-79.0830566406249,43.33139648437509],[-79.05922851562494,43.27807617187506],[-79.066064453125,43.10610351562502],[-79.02617187499996,43.01733398437506],[-78.98076171874993,42.98061523437502],[-78.91508789062496,42.90913085937504],[-79.17373046875,42.74853515625],[-80.24755859374991,42.366015625000045],[-81.02822265624997,42.247167968750006],[-81.50732421874997,42.10346679687504],[-81.97416992187496,41.88872070312499],[-82.43906249999989,41.6748535156251],[-82.69003906249995,41.675195312499994],[-83.141943359375,41.97587890624996],[-83.10952148437497,42.25068359375001],[-82.54531249999997,42.62470703124998],[-82.19038085937495,43.47407226562501],[-82.137841796875,43.570898437500034],[-82.48505859374993,45.08374023437503],[-82.55107421874987,45.3473632812501],[-82.91933593749994,45.51796875000002],[-83.59267578125,45.81713867187506],[-83.46948242187503,45.99467773437499],[-83.61596679687503,46.116845703124994],[-83.97778320312494,46.08491210937507],[-84.12319335937497,46.50292968749997],[-84.44047851562496,46.49814453125006],[-84.66577148437503,46.54326171875002],[-84.87597656249994,46.89990234375003],[-85.07006835937497,46.97993164062498],[-85.65224609375,47.21997070312503],[-86.67216796874996,47.636425781249955],[-87.20800781249997,47.848486328125006],[-87.74389648437497,48.06054687500003],[-88.37817382812497,48.30307617187506],[-89.45566406249992,47.99624023437508],[-90.79731445312495,48.13105468750001],[-91.04345703124991,48.19370117187498],[-91.38720703124997,48.05854492187498],[-92.00517578125002,48.301855468750006],[-92.3484375,48.276611328125],[-92.41459960937493,48.276611328125],[-92.50058593749995,48.43535156250002],[-92.83671875,48.567773437499994],[-93.25795898437497,48.62885742187501],[-93.37788085937498,48.61655273437498],[-93.70771484374995,48.525439453125074],[-93.85161132812496,48.607275390625034],[-94.6208984374999,48.7426269531251],[-94.71279296874997,48.863427734374994],[-94.80346679687497,49.0029296875],[-94.86040039062493,49.258593750000045],[-94.85434570312495,49.304589843749994],[-95.15527343749997,49.3696777343751],[-95.16206054687493,48.991748046875045],[-95.39790039062493,48.99316406249997],[-96.25068359374993,48.99316406249997],[-96.67705078124993,48.99316406249997],[-97.52983398437493,48.99316406249997],[-98.80898437499995,48.99316406249997],[-104.77832031249997,48.993115234375125],[-110.7476562499999,48.993066406250136],[-116.71704101562493,48.993066406250136],[-118.84892578124993,48.993066406250136],[-119.27534179687494,48.993066406250136],[-119.70170898437495,48.99301757812495],[-120.98085937499995,48.99301757812495],[-122.78876953124994,48.99301757812495],[-122.82670898437495,49.028417968750034],[-122.9241699218749,49.07465820312504],[-122.96269531249993,49.07460937500005],[-123.06328125,48.97773437500001],[-123.22944335937493,49.260498046875085],[-122.87910156249995,49.39892578125003],[-123.27675781249997,49.34394531250001],[-123.1875,49.680322265624994],[-123.53056640624989,49.39731445312506],[-124.02861328125002,49.602880859375006],[-123.99262695312497,49.736181640625006],[-123.81718749999993,49.58657226562508],[-123.58247070312498,49.68125],[-123.87441406250005,49.736816406250114],[-123.82543945312493,50.14423828124998],[-123.94589843749995,50.18393554687509],[-123.9849121093749,49.87558593749998],[-124.28125,49.77211914062502],[-124.78237304687492,50.02011718749992],[-125.05668945312495,50.418652343750125],[-124.8598632812499,50.872412109375006],[-125.05878906249993,50.51386718749998],[-125.4763183593749,50.49716796874995],[-125.53935546874996,50.64902343749998],[-125.64130859374994,50.46621093750005],[-126.09433593749995,50.497607421875045],[-126.44746093750004,50.58774414062492],[-125.90410156250002,50.704931640625006],[-126.51435546875,50.679394531250125],[-126.37460937499995,50.83735351562498],[-126.5217773437499,50.86606445312498],[-126.51733398437497,51.0568359375001],[-126.63178710937494,50.915136718750006],[-127.057568359375,50.86752929687509],[-127.70810546875,51.15117187499996],[-127.41967773437496,51.608056640625136],[-126.69145507812502,51.70341796875002],[-127.33872070312489,51.70737304687495],[-127.66870117187497,51.47758789062502],[-127.85053710937498,51.67319335937509],[-127.79536132812493,52.19101562500006],[-127.43793945312504,52.356152343750125],[-127.24223632812496,52.39511718750009],[-126.71396484374989,52.060693359374994],[-127.19399414062498,52.45766601562502],[-126.95136718749994,52.7510253906251],[-127.01933593750002,52.8424804687501],[-127.06621093749989,52.65268554687498],[-127.79189453124994,52.28935546875002],[-128.10224609374993,51.78842773437495],[-128.3576171875,52.1588867187501],[-128.0375,52.318164062500045],[-127.94023437499996,52.545166015625085],[-128.27153320312493,52.3629882812501],[-128.05327148437487,52.91069335937496],[-128.3650390624999,52.82578125000006],[-128.52470703125002,53.1406738281251],[-129.08090820312492,53.36728515625006],[-129.1715820312499,53.53359375000002],[-128.8545898437499,53.70454101562504],[-128.90561523437492,53.559326171875114],[-128.5421386718749,53.420654296875114],[-128.13271484375002,53.417773437500045],[-127.92783203125,53.274707031250045],[-128.2072265624999,53.483203125000074],[-128.67553710937494,53.55458984375005],[-128.76367187500003,53.746875],[-128.5321289062499,53.85810546875007],[-128.959375,53.84145507812505],[-129.2578613281249,53.417968750000085],[-129.56372070312506,53.251464843750114],[-130.33525390625002,53.723925781250074],[-130.04331054687495,54.13354492187503],[-129.62602539062493,54.23027343750002],[-130.08422851562503,54.18139648437503],[-130.4302734375,54.42099609374998],[-129.56064453124995,55.46254882812508],[-129.79516601562503,55.559570312500114],[-130.04848632812494,55.05727539062511],[-130.01406249999997,55.950537109375006],[-130.09785156249995,56.10927734375002],[-130.41313476562487,56.12250976562507],[-130.47709960937496,56.230566406250034],[-130.649072265625,56.26367187500003],[-131.471875,56.55673828125006],[-131.82426757812496,56.58999023437508],[-131.86616210937495,56.792822265625006],[-132.1042968749999,56.85678710937509],[-132.062890625,56.95336914062503],[-132.33798828124992,57.07944335937498],[-132.27939453124998,57.14536132812506],[-132.23217773437494,57.198535156250074],[-132.30166015625005,57.2763183593751],[-132.44248046874986,57.40673828125003],[-132.55048828124995,57.499902343749994],[-133.00141601562495,57.948974609375],[-133.27529296875,58.22285156250004],[-133.54638671874997,58.50346679687499],[-134.21850585937503,58.849902343750045],[-134.32963867187505,58.93969726562506],[-134.39306640625,59.009179687499994],[-134.67724609374997,59.19926757812499],[-134.94375,59.28828125000001],[-135.05102539062491,59.57866210937502],[-135.36787109374998,59.743310546874994],[-135.70258789062504,59.72875976562506],[-136.3218261718749,59.604833984375034],[-136.27797851562494,59.48032226562506],[-136.46635742187493,59.459082031250006],[-136.57875976562494,59.15224609375002],[-136.81328125000002,59.15004882812511],[-137.12622070312491,59.04096679687507],[-137.2775390624999,58.988183593749994],[-137.43857421874995,58.903125],[-137.52089843749994,58.91538085937506],[-137.59331054687493,59.22626953124998],[-138.317626953125,59.611132812500074],[-138.86875,59.94575195312501],[-139.18515624999986,60.083593750000034],[-139.13696289062494,60.17270507812506],[-139.07924804687497,60.279443359375136],[-139.07924804687497,60.3437011718751],[-139.23476562499997,60.339746093749994],[-139.67631835937505,60.32832031249998],[-139.97329101562497,60.183154296875074],[-140.45283203125004,60.29970703125002],[-140.5254394531249,60.21835937499995],[-140.76274414062505,60.25913085937509],[-141.00214843750004,60.300244140625125],[-141.00214843750004,60.884667968749994],[-141.00214843750004,61.761279296875045],[-141.00214843750004,63.22226562499998],[-141.00214843750004,64.09887695312506],[-141.00214843750004,65.55991210937498],[-141.00214843750004,66.43652343750006],[-141.00214843750004,67.89755859374998],[-141.00214843750004,68.77416992187506],[-141.00214843750004,69.65078125000011],[-139.18154296874997,69.51552734375008],[-137.25996093749998,68.96411132812503],[-136.12236328124993,68.88222656250002],[-135.258837890625,68.68432617187503],[-135.93901367187487,68.9741699218751],[-135.575537109375,69.02695312500003],[-135.91020507812487,69.11147460937502],[-135.6914550781249,69.31118164062502],[-135.29282226562486,69.30786132812506],[-135.1408203124999,69.46782226562496],[-134.45683593749993,69.47763671875],[-134.40893554687494,69.68178710937502],[-133.87978515624997,69.50771484375011],[-134.17431640624991,69.25283203125005],[-133.16313476562496,69.43388671874999],[-132.91533203125002,69.62963867187506],[-132.40390625,69.65874023437496],[-132.48847656249993,69.73808593749996],[-132.16342773437498,69.70498046875014],[-131.13637695312497,69.90688476562505],[-130.66547851562495,70.12705078124998],[-129.944970703125,70.09091796875006],[-129.675634765625,70.19296875000009],[-129.64829101562495,69.9977539062501],[-130.83208007812487,69.65146484375006],[-131.9377929687499,69.5347167968751],[-132.8174804687499,69.20576171875004],[-133.41831054687492,68.84428710937493],[-133.138037109375,68.74658203125011],[-133.33666992187497,68.83525390625005],[-132.57763671874997,68.84780273437514],[-132.71894531249998,69.07919921875],[-131.78837890625002,69.43198242187495],[-131.32470703124997,69.36118164062509],[-131.06342773437504,69.45068359375003],[-130.97065429687495,69.20908203125],[-130.1176269531249,69.720068359375],[-128.89892578124994,69.96616210937506],[-129.15791015624995,69.80009765624999],[-129.05434570312502,69.70107421875005],[-128.85302734375003,69.7510253906251],[-127.68378906249994,70.26035156249995],[-128.17011718749998,70.41845703125],[-127.99101562499992,70.57382812500003],[-127.22597656249992,70.29614257812497],[-126.25043945312495,69.54526367187492],[-125.52495117187495,69.35156250000009],[-125.171875,69.42797851562503],[-125.35693359374991,69.62597656250003],[-124.767919921875,69.99003906249996],[-124.99038085937494,70.02661132812511],[-124.55502929687488,70.15122070312509],[-124.40693359374991,69.76743164062506],[-124.12460937499995,69.6899902343751],[-124.33808593749991,69.36484374999995],[-123.5284179687499,69.38935546874995],[-123.02578125,69.81000976562504],[-122.07006835937499,69.81616210937506],[-120.96245117187502,69.66040039062511],[-120.13999023437488,69.38056640625013],[-117.22695312499998,68.913427734375],[-116.05947265625,68.83701171875006],[-116.2434082031249,68.9740722656251],[-115.44228515624994,68.94091796875009],[-114.62016601562496,68.74609375],[-113.96440429687495,68.39907226562502],[-114.09594726562491,68.26679687500007],[-114.76528320312494,68.27021484375004],[-115.12705078124992,68.13203124999995],[-115.43447265624994,67.90234375000006],[-115.13320312499994,67.819189453125],[-112.50302734374993,67.6819335937501],[-110.9900390624999,67.79082031250007],[-110.07392578124995,67.99291992187506],[-109.63037109374991,67.73271484374996],[-109.03803710937504,67.69116210937503],[-108.85200195312497,67.42197265625009],[-108.61333007812493,67.59804687500008],[-107.98872070312495,67.2563964843751],[-107.99130859374995,67.09516601562513],[-108.49604492187493,67.09228515625006],[-107.25947265624998,66.39853515624995],[-107.71035156250001,66.74003906250007],[-107.7250976562499,66.98413085937506],[-107.15649414062497,66.88173828124997],[-107.9583984375,67.81860351562506],[-107.79829101562498,68.03691406249996],[-106.42426757812491,68.20058593750008],[-105.7501953125,68.59228515625011],[-106.45805664062496,68.51645507812495],[-106.60849609374988,68.35737304687504],[-107.61933593749994,68.3310546875],[-107.73417968749989,68.17373046875011],[-108.3228027343749,68.15410156250002],[-108.71811523437488,68.29746093750009],[-108.31347656249996,68.61079101562498],[-106.16445312499992,68.91987304687507],[-105.68559570312489,68.82817382812505],[-105.3774414062499,68.413818359375],[-104.65317382812488,68.23007812500003],[-104.48681640624991,68.06318359374998],[-103.47412109374993,68.11503906250005],[-102.32036132812489,67.73564453125005],[-101.55498046874992,67.69316406250007],[-100.21293945312489,67.83857421875004],[-98.92045898437502,67.72578124999998],[-98.41210937499991,67.80717773437505],[-98.63154296875004,68.0725585937501],[-97.45493164062486,67.61699218750002],[-97.20654296874989,67.85507812500003],[-97.73911132812495,67.97817382812505],[-98.19252929687494,67.92299804687502],[-98.65048828124989,68.36352539062506],[-98.21855468750002,68.31743164062507],[-97.7942382812499,68.38759765625],[-97.9250976562499,68.523681640625],[-97.41035156249993,68.49653320312498],[-96.97670898437497,68.25541992187505],[-96.43066406249991,68.3105957031251],[-96.72207031250005,68.03876953124998],[-95.9703125,68.24912109375],[-96.36914062499991,67.50976562500003],[-96.14145507812489,67.27182617187503],[-95.71992187499998,67.31679687500014],[-95.77768554687495,67.18461914062505],[-95.41591796875005,67.15556640624999],[-95.41889648437504,67.01323242187493],[-96.42255859374995,67.05175781249997],[-95.7875488281249,66.616796875],[-96.03686523437489,66.9375],[-95.39965820312503,66.94946289062509],[-95.25874023437493,67.26254882812492],[-95.65048828124986,67.73745117187505],[-95.46069335937503,68.02138671875],[-94.74443359374993,68.07089843749995],[-93.44892578124998,68.61889648437503],[-93.85244140624994,69.00034179687495],[-94.06489257812495,68.78476562500006],[-94.600439453125,68.80322265625011],[-94.08364257812497,69.12309570312507],[-94.254736328125,69.31376953125002],[-93.61948242187492,69.41699218750009],[-93.74853515624991,69.2261230468751],[-93.5322753906249,69.48090820312495],[-94.2708007812499,69.45512695312505],[-94.63383789062496,69.64965820312506],[-94.82250976562494,69.577783203125],[-95.96494140624989,69.80278320312499],[-96.5513671875,70.21030273437506],[-96.29770507812492,70.51137695312511],[-95.87861328124998,70.54897460937514],[-95.88632812499986,70.69428710937507],[-96.25800781249993,70.64228515625013],[-96.54892578124995,70.80874023437511],[-96.44658203124996,71.23989257812502],[-96.06201171874997,71.41386718749993],[-95.5642578124999,71.33676757812503],[-95.40625,71.49165039062498],[-95.87231445312494,71.57314453125005],[-94.73486328124994,71.98295898437507],[-94.30834960937491,71.76489257812506],[-93.74628906249998,71.742822265625],[-92.94868164062493,71.26210937500011],[-92.98144531249994,70.8522460937501],[-91.56406249999995,70.1782714843751],[-92.32050781250004,70.2353515625],[-92.51186523437494,70.10385742187503],[-91.976708984375,70.03867187500009],[-92.88779296874989,69.66821289062511],[-92.31166992187494,69.67290039062499],[-91.91196289062495,69.53125],[-91.20180664062494,69.64477539062494],[-91.43994140624997,69.52568359375002],[-90.4155761718749,69.45698242187507],[-90.89228515625004,69.26728515624995],[-91.23720703125005,69.28554687500014],[-90.47900390624994,68.88115234374999],[-90.57363281250005,68.47470703124998],[-90.20478515625004,68.25747070312511],[-89.27954101562491,69.25546875000003],[-88.22353515625,68.91503906249997],[-87.81357421874986,68.34570312499997],[-87.89267578125,68.24814453125],[-88.34697265624993,68.28828125000001],[-88.313818359375,67.95034179687508],[-87.359375,67.17724609374997],[-86.56079101562491,67.48212890625007],[-85.64316406249992,68.69970703124997],[-84.86757812499994,68.77333984375005],[-85.10664062499995,68.84404296875007],[-84.86220703125,69.07397460937503],[-85.38676757812493,69.23188476562504],[-85.50737304687487,69.84526367187493],[-82.61835937499993,69.69106445312514],[-82.39023437499989,69.60087890625007],[-82.75483398437493,69.49438476562506],[-82.30986328124996,69.41000976562509],[-82.22753906249997,69.24887695312495],[-81.37783203125005,69.18564453125003],[-81.95791015624991,68.88364257812498],[-81.38090820312496,68.85004882812504],[-81.28154296874987,68.65722656250003],[-81.91484374999993,68.4587890625001],[-82.55268554687504,68.44648437500007],[-82.22241210937489,68.145263671875],[-82.0125,68.19389648437496],[-81.97646484374997,67.86201171875001],[-81.2943359375,67.497412109375],[-81.46757812499996,67.0698730468751],[-83.40644531249998,66.37124023437508],[-84.53847656249994,66.97280273437505],[-84.84575195312502,67.02871093750008],[-85.11372070312498,66.90693359375013],[-84.73774414062504,66.93359375000006],[-84.223046875,66.68247070312506],[-83.86904296875,66.2135742187501],[-84.29306640624995,66.29179687500005],[-84.628076171875,66.20771484374998],[-85.603857421875,66.56826171875005],[-86.708154296875,66.52304687500009],[-86.68510742187502,66.36040039062499],[-85.95874023437491,66.11904296875002],[-87.45288085937503,65.33896484375009],[-87.96997070312503,65.34892578124999],[-89.7494140625,65.93603515625006],[-89.88969726562487,65.86855468749997],[-91.42724609374994,65.94790039062497],[-91.04111328124989,65.82983398437509],[-90.98344726562496,65.91923828124999],[-89.92407226562497,65.78027343750011],[-88.97402343749994,65.34829101562502],[-87.02753906249995,65.19809570312498],[-88.10561523437497,64.18330078125001],[-88.81772460937489,63.99223632812499],[-89.20063476562493,64.11376953125006],[-89.13154296874998,63.96850585937494],[-89.61582031249995,64.030615234375],[-89.8113281249999,64.18056640625],[-90.04165039062494,64.14086914062509],[-89.85571289062497,63.9569824218751],[-90.16816406250004,63.978759765625085],[-90.15473632812498,63.68964843749998],[-90.81191406249991,63.580908203125034],[-91.98222656249996,63.82241210937502],[-92.33842773437496,63.787646484375045],[-93.69633789062493,64.14716796875013],[-93.55981445312491,63.865283203125074],[-93.27021484374998,63.840869140625074],[-93.37851562499992,63.94848632812497],[-92.15688476562491,63.691699218750045],[-92.46508789062491,63.55507812500011],[-91.84184570312496,63.69755859374999],[-90.97006835937489,63.442773437500136],[-90.69858398437492,63.06386718750005],[-91.44897460937503,62.804052734375034],[-92.3612792968749,62.81938476562496],[-91.93583984374993,62.59238281250009],[-92.55141601562491,62.546728515625034],[-92.76596679687492,62.34995117187509],[-92.52797851562494,62.16840820312504],[-93.20537109374993,62.364941406250125],[-92.90551757812503,62.21513671874996],[-93.3330566406249,61.93291015625002],[-93.58178710937494,61.94204101562511],[-93.31201171874997,61.76728515625004],[-93.91274414062497,61.48144531250006],[-94.509375,60.60454101562493],[-94.76171874999991,60.498242187500125],[-94.78828124999998,59.26787109374993],[-94.95732421874996,59.068847656250085],[-94.28706054687493,58.716015625000125],[-94.33222656249998,58.297363281250114],[-94.12319335937494,58.73671875000008],[-93.1787597656249,58.72563476562496],[-92.43281249999993,57.3203125],[-92.7981445312499,56.921972656250034],[-90.89746093750003,57.25693359375006],[-88.94848632812489,56.85131835937503],[-88.07509765624997,56.46728515624994],[-87.48242187499991,56.021289062500045],[-85.55932617187491,55.54018554687508],[-85.21801757812491,55.348974609375034],[-85.3652832031249,55.07929687499998],[-85.06093749999997,55.285644531250085],[-83.91059570312493,55.314648437499955],[-82.39326171874998,55.067822265625125],[-82.219384765625,54.8134765625],[-82.42416992187486,54.2445800781251],[-82.14145507812492,53.81762695312497],[-82.29155273437496,53.03071289062507],[-81.5994140624999,52.432617187500085],[-81.82788085937489,52.22421875000009],[-81.46621093749994,52.204492187500136],[-80.588037109375,51.667236328125114],[-80.4433105468749,51.38857421875002],[-80.85122070312497,51.125],[-80.47832031249993,51.30732421874998],[-80.10356445312487,51.282861328125136],[-79.34790039062494,50.76264648437504],[-79.737451171875,51.186279296875],[-79.33867187500002,51.62817382812497],[-79.04052734375003,51.46376953125005],[-78.90317382812495,51.200292968750034],[-78.73134765624994,51.497460937499994],[-78.98164062499993,51.774560546875136],[-78.44809570312495,52.26137695312502],[-78.74414062499994,52.65537109374998],[-79.10034179687497,53.65664062500005],[-78.99604492187493,54.00249023437499],[-79.241796875,54.098876953125085],[-79.14672851562491,54.16923828125002],[-79.71235351562495,54.6718261718751],[-77.77529296874994,55.291259765625],[-76.60405273437496,56.19956054687495],[-76.52558593749998,56.8917968750001],[-76.80981445312497,57.65795898437506],[-77.15678710937496,58.018896484375034],[-78.51508789062493,58.68237304687503],[-77.76069335937498,59.38002929687505],[-77.72617187499995,59.67587890624992],[-77.34907226562495,59.57895507812509],[-77.48530273437493,59.684570312500114],[-77.28920898437494,60.0220214843751],[-77.58588867187498,60.088183593750074],[-77.45288085937497,60.1458007812501],[-77.6814453124999,60.427099609375034],[-77.503564453125,60.54272460937497],[-77.7908203124999,60.63984375000004],[-77.58955078124993,60.808593750000114],[-78.18134765624995,60.81914062499996],[-77.51435546874998,61.55629882812505],[-78.02138671874997,61.8320800781251],[-78.13339843749986,62.28227539062496],[-77.372412109375,62.572509765625114],[-75.81689453124991,62.31586914062507],[-75.7898437499999,62.17958984375002],[-75.3412109375,62.312109375],[-74.63256835937497,62.115673828125125],[-74.6458007812499,62.21113281250004],[-73.70507812499991,62.47314453124994],[-72.68696289062498,62.12456054687499],[-72.771630859375,61.840429687500006],[-72.50556640624998,61.922656250000074],[-72.22612304687487,61.83159179687499],[-72.04003906249991,61.68027343750006],[-72.21586914062502,61.58725585937495],[-71.86611328125,61.68852539062499],[-71.63828124999995,61.6171875],[-71.85439453124991,61.43979492187492],[-71.42270507812489,61.158935546875085],[-70.27929687499991,61.06865234374999],[-69.99243164062491,60.8564941406251],[-69.50332031249994,61.04042968750011],[-69.40473632812493,60.84677734375009],[-69.75947265624998,60.440234375000045],[-69.67373046874994,60.07587890625007],[-70.65483398437496,60.02622070312506],[-69.73393554687493,59.918017578125045],[-69.68188476562489,59.34174804687507],[-69.3440429687499,59.303076171875006],[-69.53164062499994,58.86923828125009],[-69.64838867187493,58.82080078125],[-69.78417968749994,58.95571289062511],[-70.15434570312496,58.76059570312498],[-69.78989257812486,58.689306640625034],[-69.27109374999986,58.88393554687505],[-68.69819335937495,58.904541015625],[-68.38115234374993,58.74350585937506],[-68.22939453124994,58.48457031250007],[-68.35654296874989,58.163232421875136],[-69.04082031249996,57.902490234375136],[-68.41357421874997,58.0517578125],[-68.02104492187493,58.48530273437504],[-67.88828124999989,58.29575195312495],[-68.06386718750005,58.13896484374999],[-67.75595703124992,58.4045898437501],[-67.6782714843749,57.99111328125008],[-67.5696289062499,58.21347656250006],[-66.72216796874991,58.49101562499996],[-66.36240234374989,58.791162109374994],[-66.0023925781249,58.43120117187502],[-66.04306640624995,58.82065429687495],[-65.72099609374996,59.02377929687495],[-65.38354492187494,59.06020507812508],[-65.7,59.21333007812501],[-65.4117187499999,59.31499023437496],[-65.47509765624994,59.47031249999998],[-65.03823242187494,59.38789062500007],[-65.40742187499993,59.53935546875002],[-65.4333984374999,59.776513671874994],[-65.02817382812495,59.77070312500007],[-65.17172851562489,59.90800781249996],[-64.81733398437498,60.3310546875],[-64.49941406250005,60.26826171875001],[-64.41958007812494,60.17138671874997],[-64.76845703124997,60.01210937500005],[-64.28349609374993,60.06406249999998],[-64.22631835937491,59.741210937500085],[-64.05605468750005,59.82255859374996],[-63.7501953124999,59.51259765625005],[-63.945458984374994,59.380175781250074],[-63.775878906249915,59.277148437500045],[-63.539892578124864,59.332861328125034],[-63.41513671874995,59.194384765625074],[-63.97114257812498,59.053808593750034],[-63.24843749999991,59.068310546874955],[-63.28212890624994,58.86738281250007],[-63.05029296874997,58.87817382812494],[-62.87387695312489,58.67246093749998],[-63.537060546874926,58.329931640625006],[-63.209960937499886,58.46694335937502],[-62.593847656249864,58.47402343750005],[-62.81206054687502,58.20039062500007],[-63.26152343749993,58.014697265625074],[-62.486230468749966,58.15405273437506],[-62.30566406249997,57.97226562499995],[-61.95864257812505,57.91176757812508],[-61.9679687499999,57.61191406250009],[-62.495556640624926,57.489208984375125],[-61.92114257812497,57.42080078125005],[-61.977441406249966,57.24794921875002],[-61.33374023437494,57.01059570312498],[-61.37163085937502,56.68081054687511],[-62.497265624999926,56.80170898437504],[-61.73774414062498,56.52602539062502],[-61.940429687499886,56.423583984375114],[-61.42529296874994,56.360644531250074],[-61.713085937499955,56.230957031250114],[-61.364697265624926,56.2160156250001],[-61.30112304687495,56.04716796874999],[-61.4495117187499,55.99570312499998],[-61.08935546874997,55.86635742187511],[-60.74326171874989,55.94145507812493],[-60.56210937499995,55.727001953125125],[-60.341015624999926,55.78466796874997],[-60.40830078124995,55.649560546874994],[-60.19238281249994,55.4809082031251],[-60.617138671874955,55.060205078124994],[-59.75878906249997,55.3095703125],[-59.68906249999989,55.19633789062502],[-59.43789062500005,55.175927734375136],[-59.837792968749994,54.813964843750114],[-59.25957031249996,55.19995117187506],[-58.99711914062496,55.149462890625074],[-58.780175781249994,54.838378906250114],[-58.39814453124998,54.77412109374998],[-57.96245117187493,54.875732421875085],[-57.40449218750004,54.59086914062496],[-57.69926757812496,54.38657226562506],[-58.435205078124966,54.228125],[-58.63320312499999,54.04956054687497],[-59.8230468749999,53.83442382812504],[-60.14492187499994,53.59614257812498],[-60.395410156249994,53.653320312500085],[-60.1002929687499,53.48696289062511],[-60.329492187499966,53.26611328125006],[-58.652050781249926,53.97788085937495],[-57.935986328124955,54.09116210937492],[-58.31748046874989,54.11445312500007],[-58.192089843749926,54.228173828125136],[-57.4160644531249,54.162744140625136],[-57.134960937499926,53.79184570312506],[-57.524072265624966,53.61142578125006],[-57.331738281249955,53.469091796875034],[-56.84086914062496,53.73945312500004],[-56.46499023437505,53.76503906250011],[-55.96611328125002,53.4711425781251],[-55.79794921874995,53.211962890625045],[-55.80283203124989,52.64316406249998],[-56.324902343749926,52.54453124999998],[-55.74648437499994,52.4745605468751],[-55.7771484374999,52.3642578125],[-56.01171874999997,52.394482421875125],[-55.695214843749994,52.13779296875006],[-56.97597656250005,51.45766601562505],[-58.510351562500006,51.295068359375136],[-59.88632812499992,50.316406250000085],[-61.72485351562503,50.10405273437499],[-61.91953124999989,50.2328613281251],[-62.71542968749995,50.30166015625008],[-66.49550781249991,50.2118652343751],[-66.94116210937503,49.993701171875045],[-67.37202148437495,49.348437500000045],[-68.28193359374998,49.197167968750136],[-69.67387695312496,48.19916992187504],[-71.01826171874993,48.455615234375045],[-69.86552734374993,48.17226562500005],[-69.775,48.09809570312504],[-69.9944335937499,47.73989257812508],[-70.70585937499996,47.13979492187505],[-71.26777343749995,46.79594726562499],[-71.87958984374998,46.68681640624996],[-72.98100585937493,46.209716796875085],[-73.4766113281249,45.738232421874955],[-74.03784179687494,45.501855468750136],[-74.31508789062494,45.531054687500045],[-73.97382812499995,45.345117187499994],[-74.70888671874997,45.0038574218751]]],[[[-96.78232421874998,72.93662109375],[-97.0927734375,72.99692382812503],[-96.86240234374995,73.18881835937506],[-96.78232421874998,72.93662109375]]],[[[-114.52153320312502,72.592919921875],[-113.57807617187501,72.65209960937506],[-113.2923828125,72.94980468750003],[-112.75361328125001,72.98603515624995],[-111.26972656249994,72.71372070312498],[-111.895166015625,72.35610351562497],[-111.67509765625002,72.30014648437503],[-110.20512695312495,72.66127929687497],[-110.66083984374998,73.00820312500002],[-110.00844726562494,72.983642578125],[-108.75498046875002,72.55107421874999],[-108.18823242187501,71.72377929687502],[-107.812841796875,71.62617187500004],[-107.30600585937496,71.89467773437502],[-108.23740234374999,73.14990234375003],[-108.029052734375,73.34873046875003],[-106.48212890624998,73.19619140624997],[-105.41513671874995,72.788330078125],[-104.38593749999997,71.57695312500005],[-104.51479492187502,71.06425781250005],[-103.58457031249995,70.63085937500003],[-103.07719726562497,70.50883789062505],[-103.04956054687503,70.65507812499999],[-101.67631835937495,70.27827148437495],[-101.56240234375001,70.135009765625],[-101.04267578125,70.11079101562504],[-100.98237304687497,69.67988281250001],[-101.483837890625,69.85019531250006],[-101.64765624999997,69.69853515625007],[-102.18212890624997,69.845947265625],[-102.59589843749997,69.71791992187502],[-102.62109374999996,69.55151367187506],[-103.464892578125,69.64448242187498],[-103.04892578124999,69.47177734375006],[-103.12021484374995,69.20458984374997],[-102.44677734374997,69.476318359375],[-102.04594726562493,69.46484374999997],[-101.85712890625001,69.02397460937505],[-102.89506835937499,68.8236328125],[-104.57143554687501,68.87211914062502],[-105.105859375,68.92041015625],[-105.019580078125,69.08125],[-106.27016601562497,69.19458007812497],[-106.65908203124997,69.439599609375],[-107.43989257812497,69.00214843749995],[-108.36499023437497,68.93476562499998],[-109.47211914062501,68.67670898437498],[-113.12773437500002,68.49414062500003],[-113.61684570312501,68.8384765625],[-113.69414062499995,69.19501953124998],[-115.61811523437495,69.28295898437506],[-116.51347656249993,69.42460937500005],[-117.19541015624995,70.05405273437503],[-114.59233398437497,70.31245117187498],[-112.63789062499997,70.225244140625],[-111.63256835937497,70.30883789062497],[-113.75727539062503,70.69072265625005],[-115.99091796874997,70.586279296875],[-117.58706054687498,70.62954101562502],[-118.2640625,70.888330078125],[-118.26909179687493,71.03471679687505],[-115.30341796874997,71.49370117187505],[-117.93564453125003,71.39208984375003],[-118.22646484374995,71.46708984375005],[-117.742333984375,71.65932617187502],[-118.58300781250003,71.64902343749998],[-118.98769531249997,71.7642578125],[-118.94462890624997,71.98554687499995],[-118.21347656249998,72.26289062499998],[-118.481298828125,72.42768554687498],[-118.13310546874995,72.63281250000003],[-114.63823242187499,73.37265625000003],[-114.20639648437495,73.29780273437495],[-114.05170898437497,73.07099609375004],[-114.52153320312502,72.592919921875]]],[[[-105.28891601562499,72.919921875],[-106.92153320312497,73.479833984375],[-106.61396484375001,73.69560546875002],[-105.31796874999995,73.76713867187502],[-104.5875,73.57807617187495],[-104.62172851562495,73.3111328125],[-105.28891601562499,72.919921875]]],[[[-79.53730468749998,73.65449218749998],[-78.2865234375,73.66582031250007],[-77.20654296874997,73.49956054687505],[-76.18339843749999,72.84306640625005],[-77.83593750000003,72.89682617187498],[-79.3193359375,72.75771484375],[-79.820703125,72.82631835937502],[-80.18330078124995,73.22465820312499],[-80.77641601562502,73.33417968750001],[-80.84887695312503,73.72124023437499],[-79.53730468749998,73.65449218749998]]],[[[-86.58935546874997,71.01079101562507],[-85.64384765624999,71.15244140624998],[-85.09487304687497,71.15195312500006],[-84.82373046874997,71.02861328125005],[-84.69941406249995,71.63144531250003],[-85.33906249999998,71.69726562500003],[-85.91162109375,71.98652343749998],[-85.321875,72.23315429687506],[-84.28374023437499,72.04448242187499],[-84.84199218749995,72.30815429687505],[-84.62304687500003,72.37656250000003],[-85.34111328124993,72.42153320312497],[-85.64990234374997,72.72216796875003],[-85.26210937500002,72.95400390625],[-84.25664062499999,72.79672851562503],[-85.454736328125,73.10546875000003],[-84.41606445312496,73.45649414062495],[-83.781884765625,73.41689453125],[-83.72983398437495,73.57587890624995],[-81.946142578125,73.72983398437506],[-81.40615234374997,73.634521484375],[-80.27724609375,72.77016601562502],[-81.229345703125,72.31171874999998],[-80.61147460937497,72.450830078125],[-80.925146484375,71.90766601562501],[-80.18193359374996,72.20878906250007],[-79.884375,72.17719726562501],[-80.10893554687499,72.33217773437497],[-79.83129882812503,72.44628906250003],[-79.000244140625,72.27202148437507],[-79.00781250000003,72.04291992187501],[-78.58510742187497,71.880615234375],[-78.86274414062495,72.100830078125],[-78.69926757812496,72.35141601562498],[-77.51650390624997,72.17778320312505],[-78.48427734374994,72.47060546875002],[-77.75322265624996,72.72475585937502],[-75.70429687499998,72.57153320312497],[-75.05268554687493,72.22636718749999],[-75.92280273437501,71.71723632812501],[-74.90317382812503,72.10048828125002],[-74.20932617187498,71.978662109375],[-74.31572265624999,71.84267578125],[-75.20478515625001,71.70913085937497],[-74.70078125,71.67558593750005],[-74.99619140624998,71.21811523437503],[-74.48808593750002,71.64838867187501],[-73.8140625,71.77143554687495],[-74.197265625,71.404150390625],[-73.71284179687498,71.58759765624998],[-73.18061523437501,71.282861328125],[-73.27822265625,71.53798828125],[-72.901953125,71.67778320312507],[-71.64067382812499,71.51625976562502],[-71.22939453124997,71.33876953125],[-71.49501953124997,71.10512695312502],[-71.93793945312498,71.09428710937502],[-72.63271484374994,70.83076171874998],[-71.74252929687495,71.046875],[-71.370849609375,70.97514648437499],[-70.82607421874994,71.10874023437503],[-70.67265625,71.05219726562498],[-70.76171874999997,70.79223632812503],[-71.89018554687502,70.43154296875002],[-71.27587890625,70.50029296874999],[-71.42944335937503,70.12778320312503],[-70.97978515624999,70.5810546875],[-69.94980468750003,70.84501953125005],[-68.49575195312502,70.61025390625],[-68.363525390625,70.48125],[-70.05771484375,70.042626953125],[-68.77822265625,70.20356445312501],[-69.00830078124997,69.97895507812501],[-68.74404296874997,69.94140625],[-68.05908203124997,70.317236328125],[-67.36367187499994,70.03442382812503],[-67.22163085937495,69.73071289062506],[-68.02041015625,69.77006835937499],[-69.25078124999999,69.51191406249998],[-68.51303710937498,69.57729492187497],[-67.236962890625,69.460107421875],[-66.71674804687495,69.31186523437498],[-66.70742187500002,69.16821289062503],[-68.40629882812499,69.23222656250002],[-69.040625,69.09799804687503],[-68.41552734375,69.17207031250001],[-67.8326171875,69.06596679687499],[-67.88320312500002,68.78398437499999],[-69.31909179687497,68.85698242187505],[-68.21040039062495,68.702978515625],[-67.9384765625,68.524169921875],[-66.74272460937502,68.45776367187497],[-67.032958984375,68.32607421874997],[-66.923095703125,68.06572265625005],[-66.72900390624997,68.12900390625006],[-66.66269531249995,68.03442382812497],[-66.63095703124998,68.21064453124998],[-66.21240234374997,68.280419921875],[-66.44394531249998,67.83383789062506],[-65.94238281250003,68.07094726562505],[-65.86435546875003,67.92285156249997],[-65.50908203124996,67.96826171875],[-65.40126953125002,67.67485351562499],[-65.41533203124996,67.87924804687498],[-64.92231445312495,68.03164062500002],[-65.02109375,67.78754882812495],[-64.63779296875,67.84023437500002],[-63.850195312500034,67.56606445312502],[-64.00795898437502,67.34731445312497],[-64.69995117187494,67.35053710937501],[-63.83623046874993,67.26411132812498],[-63.59160156250002,67.3775390625],[-63.040136718750034,67.235009765625],[-63.70156249999994,66.82236328125003],[-62.962304687499966,66.94926757812505],[-62.37973632812495,66.90537109375],[-62.12358398437499,67.046728515625],[-61.35341796874994,66.689208984375],[-61.52783203124994,66.55810546875003],[-62.12333984374993,66.64306640625003],[-61.57080078125,66.37290039062506],[-61.95634765624993,66.30932617187497],[-62.553125,66.40683593750003],[-62.53359374999994,66.22700195312498],[-61.99160156250002,66.03530273437502],[-62.624121093750006,66.01625976562505],[-62.381982421874966,65.83330078124999],[-62.65888671874998,65.63994140625002],[-63.16894531249997,65.65732421875],[-63.45874023437494,65.85302734375],[-63.42089843749997,65.70859374999998],[-63.651074218749955,65.66098632812506],[-63.33745117187493,65.61674804687502],[-63.36337890624998,65.22973632812503],[-63.606591796874966,64.92807617187503],[-64.345703125,65.17241210937499],[-64.26967773437497,65.40078124999997],[-64.55507812500002,65.1166015625],[-65.401611328125,65.764013671875],[-64.44536132812496,66.31713867187497],[-65.0044921875,66.07773437500003],[-65.82573242187499,65.996923828125],[-65.65634765625003,66.204736328125],[-66.06372070312497,66.13271484374997],[-66.986328125,66.62749023437505],[-67.07685546874995,66.52548828125006],[-67.30732421874993,66.5697265625],[-67.22539062499993,66.31025390624998],[-67.88339843749995,66.46743164062502],[-67.18320312499995,66.03442382812503],[-67.350439453125,65.92973632812502],[-67.82802734374997,65.96518554687503],[-68.45991210937498,66.249267578125],[-68.74892578125,66.200048828125],[-68.21718750000002,66.078857421875],[-68.18671874999993,65.87099609375002],[-67.86645507812497,65.773681640625],[-67.936767578125,65.56489257812501],[-67.56962890624999,65.64355468749997],[-67.11796874999999,65.44038085937495],[-67.3365234375,65.34658203125005],[-66.69741210937502,64.81518554687506],[-66.63549804687503,65.00034179687503],[-66.21464843749999,64.72241210937497],[-65.93852539062496,64.88574218750003],[-65.2748046875,64.63154296875004],[-65.52934570312499,64.50478515624997],[-65.074609375,64.43666992187502],[-65.21298828125003,64.30327148437502],[-65.580322265625,64.29384765624997],[-65.16987304687495,64.02817382812503],[-64.67846679687503,64.027978515625],[-64.79814453124999,63.91596679687498],[-64.4109375,63.70634765625002],[-64.66464843749995,63.24536132812497],[-65.19184570312498,63.764257812500006],[-65.06894531249998,63.26347656250002],[-64.67236328125003,62.921972656250006],[-65.16279296875001,62.93261718750003],[-65.10849609374998,62.62646484375],[-66.22402343749994,63.10717773437497],[-66.228662109375,62.99096679687503],[-66.41445312500002,63.027197265625034],[-66.65498046874998,63.264746093750006],[-66.69746093749993,63.069531249999955],[-67.89326171874993,63.733740234375006],[-67.72255859374997,63.422753906249966],[-68.49375,63.725488281249994],[-68.91108398437498,63.703222656250006],[-68.141259765625,63.17231445312501],[-67.67597656249998,63.093554687500045],[-67.73696289062497,63.00957031249999],[-65.98017578125001,62.20888671875002],[-66.12387695312498,61.89306640625],[-68.53588867187503,62.25561523437506],[-69.12558593749998,62.423974609374966],[-69.604736328125,62.76772460937502],[-70.23613281250002,62.76337890625001],[-70.801416015625,62.91049804687506],[-71.10576171874999,63.00224609375002],[-70.94604492187497,63.12070312499998],[-71.34726562499998,63.066113281249955],[-71.99223632812493,63.41616210937505],[-71.380859375,63.580322265625],[-72.29013671874995,63.72797851562498],[-72.17426757812498,63.893408203125006],[-72.49843749999994,63.82348632812497],[-73.45454101562495,64.39926757812503],[-73.27128906250002,64.58251953125],[-73.91035156249998,64.578125],[-74.064794921875,64.42465820312498],[-74.13046874999998,64.6078125],[-74.46123046874996,64.64467773437505],[-74.68139648437497,64.8306640625],[-74.91943359374997,64.76552734374997],[-74.69472656250002,64.49658203124997],[-75.71503906249995,64.52436523437495],[-75.76669921875,64.39194335937498],[-76.85615234374998,64.23764648437498],[-77.76049804687503,64.36015624999999],[-78.04521484374993,64.499267578125],[-78.09560546875,64.93925781250002],[-77.36088867187496,65.19653320312503],[-77.32670898437493,65.453125],[-75.82832031249993,65.22705078125003],[-75.45209960937495,64.84160156250002],[-75.35712890624995,65.00874023437495],[-75.79868164062503,65.297509765625],[-75.16630859374999,65.28393554687497],[-74.13847656250002,65.50346679687502],[-73.55078125000003,65.48525390625005],[-74.41640624999997,66.16708984375003],[-73.03325195312502,66.72817382812505],[-72.78881835937494,67.030615234375],[-72.22001953124999,67.25429687500002],[-73.28447265624993,68.35698242187505],[-73.82050781249998,68.36293945312502],[-73.82211914062495,68.68598632812501],[-74.11796875000002,68.70092773437506],[-73.9892578125,68.54863281250002],[-74.2701171875,68.54121093750001],[-74.89296875,68.80815429687505],[-74.71669921874997,69.04550781249998],[-76.58505859375,68.69873046875003],[-76.55722656250003,69.00947265625001],[-75.9537109375,69.03081054687502],[-75.64775390625002,69.212548828125],[-76.46494140624995,69.46943359375001],[-76.23408203125001,69.66210937500003],[-76.742333984375,69.57290039062497],[-77.08994140625,69.63510742187503],[-76.85859374999995,69.775390625],[-77.591650390625,69.84560546875002],[-77.77402343750003,70.23852539062503],[-78.28281250000003,70.229150390625],[-79.06640624999997,70.60356445312507],[-79.40522460937498,70.40073242187503],[-78.86284179687499,70.24189453125001],[-78.88964843750003,69.97749023437495],[-79.51542968749996,69.88759765625005],[-81.65195312500003,70.09462890625002],[-80.92172851562503,69.73090820312501],[-81.56469726562503,69.94272460937498],[-82.29384765624997,69.83691406250003],[-83.14995117187493,70.00908203125002],[-83.85908203124998,69.96274414062498],[-85.43237304687497,70.11137695312507],[-85.780029296875,70.03666992187505],[-86.32202148437503,70.14541015625],[-86.396875,70.46533203124997],[-87.838134765625,70.24658203125],[-88.78271484374997,70.49448242187503],[-89.45590820312498,71.06171874999995],[-87.84492187499995,70.94438476562505],[-87.14008789062498,71.01162109374997],[-89.80537109374993,71.46230468750005],[-89.86152343750001,72.41191406250005],[-88.70517578124998,73.40327148437495],[-87.71977539062496,73.72290039062497],[-85.95078124999998,73.85014648437505],[-84.94677734375,73.72163085937498],[-86.00053710937499,73.31254882812505],[-86.65629882812502,72.72402343750005],[-86.21845703124998,71.89912109375004],[-85.02338867187495,71.35322265625001],[-86.58935546874997,71.01079101562507]]],[[[-100.00190429687497,73.9458984375],[-99.15795898437499,73.73159179687497],[-97.66997070312499,73.88774414062499],[-97.1705078125,73.82485351562497],[-97.001708984375,73.66650390625003],[-97.62587890624997,73.50229492187498],[-97.27250976562502,73.38681640624998],[-98.42177734375002,72.94101562500003],[-97.63632812499998,73.02763671874999],[-97.128125,72.62758789062502],[-96.59208984374996,72.71025390624999],[-96.44560546874996,72.55244140624998],[-96.80146484374998,72.32241210937502],[-96.61342773437494,71.83383789062506],[-97.58227539062497,71.62968750000005],[-98.18134765624998,71.66245117187503],[-98.32270507812501,71.85234375000002],[-98.19863281249994,71.44086914062501],[-98.66289062499993,71.302099609375],[-99.22363281249996,71.387109375],[-100.594482421875,72.15234375000003],[-101.20854492187495,72.31699218749998],[-101.72392578124996,72.31489257812501],[-102.70874023437496,72.76450195312503],[-102.20400390624998,73.077294921875],[-101.27319335937497,72.7216796875],[-100.48476562500002,72.77294921874997],[-100.395703125,72.97700195312498],[-100.128125,72.90668945312495],[-100.53637695312497,73.19785156250003],[-99.82514648437503,73.2138671875],[-100.36611328125001,73.359033203125],[-100.88935546875003,73.27534179687501],[-101.52319335937501,73.48637695312502],[-100.97578124999995,73.59975585937502],[-100.5216796875,73.44931640625],[-100.96298828125002,73.79140625],[-99.99111328125,73.79516601562503],[-100.00190429687497,73.9458984375]]],[[[-98.270361328125,73.86850585937498],[-98.97392578124997,73.81206054687502],[-99.4169921875,73.89541015625002],[-97.69824218749997,74.10869140625005],[-98.270361328125,73.86850585937498]]],[[[-93.17084960937498,74.16098632812506],[-92.22270507812502,73.97236328124998],[-90.62744140625,73.95170898437505],[-90.38139648437496,73.82475585937502],[-92.11791992187497,72.75380859375],[-94.21132812499997,72.75693359375],[-93.77055664062496,72.66821289062506],[-93.55517578124994,72.42114257812497],[-94.03754882812498,72.02875976562498],[-95.00786132812496,72.01279296875],[-95.60214843749998,72.88447265624995],[-95.63291015625003,73.69545898437497],[-94.697607421875,73.66357421874997],[-95.134130859375,73.88125],[-94.97353515625,74.04140625000002],[-93.17084960937498,74.16098632812506]]],[[[-119.73632812499997,74.11264648437498],[-119.20595703125002,74.19799804687503],[-119.11796874999995,74.01552734375],[-118.54399414062499,74.24462890625003],[-117.51484375000001,74.23173828124999],[-115.51069335937501,73.61875],[-115.446875,73.43886718750002],[-118.96157226562497,72.68413085937499],[-119.51284179687501,72.30268554687501],[-120.17988281250001,72.21264648437506],[-120.61933593750001,71.50576171875002],[-121.47216796875003,71.38901367187503],[-121.74936523437502,71.44477539062501],[-123.09565429687503,71.09379882812502],[-124.00776367187494,71.67744140624998],[-125.29667968749999,71.973046875],[-125.84531250000002,71.978662109375],[-123.79726562499997,73.76816406250003],[-124.69624023437497,74.34819335937499],[-121.50415039062497,74.54511718749998],[-119.56264648437494,74.23281250000002],[-119.73632812499997,74.11264648437498]]],[[[-97.35551757812496,74.52631835937495],[-97.75,74.51054687500005],[-97.41650390624994,74.62656250000003],[-97.35551757812496,74.52631835937495]]],[[[-95.306640625,74.50541992187505],[-95.850732421875,74.58247070312504],[-95.51020507812498,74.63676757812499],[-95.306640625,74.50541992187505]]],[[[-104.11992187499995,75.03632812500004],[-104.88740234374998,75.14775390624999],[-104.34619140624996,75.42993164062503],[-103.64350585937497,75.18657226562499],[-104.11992187499995,75.03632812500004]]],[[[-93.54257812499995,75.0279296875],[-93.57309570312495,74.66884765625005],[-94.53452148437498,74.63671874999997],[-96.59960937499997,75.03178710937499],[-95.95463867187493,75.44379882812501],[-94.878173828125,75.63002929687502],[-93.90908203125002,75.42250976562502],[-93.54257812499995,75.0279296875]]],[[[-96.07856445312495,75.510107421875],[-96.91513671875003,75.37968749999999],[-96.98281249999997,75.50981445312505],[-96.367822265625,75.65463867187506],[-96.07856445312495,75.510107421875]]],[[[-94.52656249999995,75.74931640624999],[-94.901220703125,75.93076171875],[-94.53789062499996,75.99643554687506],[-94.52656249999995,75.74931640624999]]],[[[-118.328125,75.57968749999998],[-118.81713867187503,75.52211914062497],[-119.39458007812499,75.617333984375],[-117.63369140624998,76.11508789062498],[-118.328125,75.57968749999998]]],[[[-79.0630859375,75.92587890624998],[-79.63876953124995,75.84291992187505],[-79.00932617187499,76.14589843750005],[-79.0630859375,75.92587890624998]]],[[[-102.22734374999995,76.014892578125],[-102.00800781250003,75.93940429687498],[-102.57958984375003,75.78022460937498],[-103.31474609374996,75.76420898437499],[-103.04150390624999,75.91884765624997],[-103.98525390624997,75.93310546875003],[-103.80078124999994,76.03701171874997],[-104.24248046874996,76.04697265625006],[-104.35063476562497,76.18232421875001],[-102.72802734374999,76.30703125],[-102.22734374999995,76.014892578125]]],[[[-104.02285156249998,76.58310546875003],[-103.05131835937495,76.44985351562497],[-103.31137695312499,76.34755859375],[-104.35751953124995,76.33461914062502],[-104.58569335937499,76.60649414062499],[-104.07451171875003,76.66611328124998],[-104.02285156249998,76.58310546875003]]],[[[-97.70092773437497,76.46650390624998],[-97.89052734374997,75.7603515625],[-97.40751953124999,75.67250976562497],[-97.33603515624998,75.41982421875],[-97.65332031249997,75.50776367187498],[-97.87822265624996,75.41611328125003],[-97.67431640624997,75.127294921875],[-98.04531249999997,75.20083007812497],[-98.12094726562503,75.03271484375],[-100.234375,75.00771484374997],[-100.48349609374995,75.18842773437501],[-100.14570312499995,75.24614257812505],[-100.71191406250003,75.40634765625],[-99.19458007812499,75.698388671875],[-102.58740234375001,75.51367187500003],[-102.79750976562501,75.59965820312505],[-102.14472656249998,75.87504882812502],[-100.97280273437498,75.79843750000003],[-101.414990234375,75.84584960937502],[-101.87211914062496,76.08310546875003],[-101.52895507812495,76.21728515625003],[-102.1046875,76.33120117187505],[-101.41518554687495,76.42490234375003],[-99.86547851562499,75.92421875],[-100.11284179687502,76.11723632812507],[-99.54106445312497,76.14628906250005],[-100.41420898437495,76.242529296875],[-99.97773437500003,76.31245117187495],[-100.82973632812497,76.52387695312495],[-99.8140625,76.6322265625],[-98.89033203125,76.46557617187497],[-98.71083984374994,76.69384765625003],[-97.70092773437497,76.46650390624998]]],[[[-101.22612304687497,76.57934570312497],[-101.61308593749995,76.60458984375006],[-100.26914062499998,76.73413085937497],[-101.22612304687497,76.57934570312497]]],[[[-108.29238281250001,76.05712890625],[-107.72348632812502,75.99541015625002],[-108.020703125,75.80478515625],[-107.21621093749997,75.89155273437501],[-106.91352539062503,75.67963867187501],[-106.67700195312499,76.02373046875002],[-105.63266601562493,75.94536132812505],[-105.51948242187497,75.63237304687505],[-106.09262695312495,75.08945312500003],[-107.15341796874996,74.9271484375],[-108.47475585937495,74.94721679687501],[-108.83129882812501,75.06489257812498],[-112.51933593749997,74.41684570312503],[-113.67158203124997,74.45302734375005],[-114.31269531250003,74.71508789062506],[-112.835986328125,74.9755859375],[-111.67109375,75.01943359374997],[-111.09345703125001,75.25629882812498],[-113.71176757812499,75.06860351562503],[-113.85332031249996,75.259375],[-113.46708984374996,75.41611328125003],[-114.01650390624998,75.43427734375001],[-114.16845703124994,75.23950195312503],[-114.51381835937497,75.27548828125],[-114.45175781250002,75.08789062499997],[-115.02011718749999,74.97617187500003],[-115.41318359374995,75.11499023437497],[-115.72885742187496,74.968115234375],[-116.47607421874996,75.17177734375],[-117.56523437499997,75.23334960937504],[-117.25761718750002,75.45952148437502],[-116.07714843749996,75.49296874999999],[-115.14184570312501,75.67851562500005],[-116.42563476562498,75.58535156249997],[-117.16362304687496,75.64487304687503],[-116.80214843749995,75.77158203124998],[-114.99150390625002,75.896337890625],[-116.66455078124999,75.95756835937505],[-116.20986328125,76.19443359374998],[-114.77861328124999,76.17260742187497],[-115.82216796874997,76.27001953125003],[-114.99848632812503,76.4974609375],[-114.19394531249999,76.45146484375005],[-113.82348632812501,76.20683593750002],[-112.69760742187496,76.20170898437505],[-111.05268554687495,75.54853515625001],[-108.94716796875,75.54179687499999],[-108.94477539062495,75.69897460937503],[-109.8705078125,75.929052734375],[-109.48681640624999,76.14467773437497],[-110.31445312500001,76.369384765625],[-109.09824218749996,76.811865234375],[-108.46699218749997,76.73759765625007],[-108.29238281250001,76.05712890625]]],[[[-89.72646484374994,76.50742187499998],[-90.55625,76.73457031249998],[-90.13632812499995,76.83696289062505],[-89.69541015625,76.74116210937498],[-89.72646484374994,76.50742187499998]]],[[[-113.56069335937494,76.74326171874998],[-114.83525390624999,76.79467773437497],[-113.89165039062495,76.89487304687503],[-113.56069335937494,76.74326171874998]]],[[[-94.29497070312493,76.91245117187498],[-93.23002929687496,76.77026367187497],[-93.53457031250002,76.44770507812498],[-92.99536132812494,76.62041015624999],[-91.305029296875,76.68076171875003],[-90.54262695312494,76.495751953125],[-91.41508789062496,76.45585937500005],[-89.28452148437498,76.30161132812506],[-89.40659179687498,76.18916015624998],[-91.40732421874998,76.22006835937506],[-89.27758789062497,75.79506835937497],[-89.64604492187499,75.5650390625],[-88.91669921874998,75.45395507812503],[-88.64497070312495,75.65844726562503],[-88.201318359375,75.51201171875005],[-87.72973632812503,75.57563476562495],[-87.53911132812502,75.48486328125003],[-87.25693359374998,75.61772460937499],[-85.95146484374993,75.39501953125],[-85.97299804687498,75.5287109375],[-83.931982421875,75.81894531250003],[-83.23710937499993,75.75083007812503],[-82.153662109375,75.83105468750003],[-80.32197265624998,75.62910156250001],[-79.50908203125002,75.25981445312499],[-80.38198242187494,75.03417968750003],[-79.40141601562502,74.91762695312502],[-79.944482421875,74.83364257812505],[-80.34775390624998,74.90297851562505],[-80.26274414062499,74.58447265625],[-81.94018554687494,74.47270507812505],[-82.73579101562495,74.53027343749997],[-83.5220703125,74.90146484375],[-83.53188476562494,74.58569335937497],[-84.42553710937503,74.50810546875007],[-85.06142578125,74.60693359375003],[-85.133447265625,74.517431640625],[-85.44233398437495,74.6005859375],[-85.80800781249994,74.49897460937498],[-88.42304687499995,74.49414062499997],[-88.53496093749993,74.83173828125001],[-89.55869140624995,74.55473632812507],[-90.55327148437499,74.61274414062498],[-90.88022460937498,74.8177734375],[-91.13457031250002,74.64985351562498],[-91.54912109375002,74.65556640624999],[-92.3892578125,75.263330078125],[-92.18510742187499,75.84653320312498],[-93.09174804687495,76.35400390624997],[-95.27387695312498,76.26440429687503],[-96.03969726562494,76.48671875000002],[-95.65097656249998,76.58466796874998],[-96.88071289062495,76.73833007812505],[-96.40156249999995,76.79721679687503],[-96.75830078124997,76.97177734374998],[-95.84951171875002,77.06621093750005],[-94.29497070312493,76.91245117187498]]],[[[-115.55126953125001,77.36328125],[-116.32919921874996,77.137060546875],[-115.81005859374999,76.939111328125],[-116.25273437500002,76.90141601562505],[-115.94628906250003,76.71127929687503],[-116.99921874999995,76.531591796875],[-117.23359375000001,76.28154296875005],[-117.99296874999999,76.40581054687505],[-117.88081054687497,76.80507812500005],[-118.79140624999994,76.51298828125005],[-119.080712890625,76.12407226562505],[-119.58037109375,76.32651367187498],[-119.52612304687496,75.99721679687505],[-119.91289062499997,75.85883789062501],[-120.40888671874995,75.82563476562498],[-120.84838867187496,76.18266601562499],[-121.21347656249999,75.98369140625005],[-122.53305664062498,75.95092773437503],[-122.59272460937497,76.16206054687495],[-122.90278320312498,76.13471679687498],[-122.51938476562503,76.353173828125],[-121.56113281250003,76.453466796875],[-119.09018554687496,77.30507812500002],[-116.84355468749995,77.33955078124995],[-117.03974609374995,77.46513671875005],[-116.51132812500003,77.54760742187497],[-115.55126953125001,77.36328125]]],[[[-89.83325195312503,77.26762695312505],[-90.22827148437503,77.21245117187499],[-90.99321289062499,77.32949218750002],[-91.01904296875003,77.64389648437503],[-89.83896484375003,77.49140624999998],[-89.83325195312503,77.26762695312505]]],[[[-104.55815429687497,77.14174804687497],[-105.21508789062496,77.18208007812501],[-106.03559570312495,77.73984375000006],[-105.58789062499997,77.73598632812497],[-104.54223632812501,77.33774414062503],[-104.55815429687497,77.14174804687497]]],[[[-95.484375,77.79199218750003],[-93.30097656249995,77.73979492187505],[-93.54394531249997,77.466650390625],[-95.98706054687497,77.484130859375],[-96.19458007812497,77.70053710937503],[-95.484375,77.79199218750003]]],[[[-101.6935546875,77.69658203125005],[-102.37783203124995,77.728125],[-102.44770507812498,77.88061523437506],[-101.19321289062493,77.82978515624998],[-101.00205078124998,77.73510742187497],[-101.6935546875,77.69658203125005]]],[[[-113.83247070312497,77.75463867187506],[-114.28720703124998,77.72148437500005],[-114.98041992187498,77.91542968750002],[-114.33037109374997,78.07753906250002],[-113.83247070312497,77.75463867187506]]],[[[-110.45805664062496,78.10322265625001],[-109.62226562499995,78.07475585937499],[-110.865625,77.834130859375],[-110.15273437500002,77.76293945312506],[-110.19848632812501,77.52451171874998],[-112.37265625000002,77.36411132812498],[-113.16435546875002,77.5302734375],[-113.21518554687498,77.90351562500001],[-110.45805664062496,78.10322265625001]]],[[[-109.81596679687499,78.65039062500003],[-109.48447265624995,78.31640625],[-111.16918945312499,78.38627929687505],[-111.51748046874997,78.27470703125005],[-112.13125,78.366064453125],[-113.22304687499998,78.29790039062505],[-112.85585937499997,78.46684570312502],[-110.877587890625,78.73505859375004],[-109.81596679687499,78.65039062500003]]],[[[-96.20449218749994,78.53129882812499],[-94.91538085937495,78.39052734375002],[-95.32924804687497,78.22504882812495],[-94.93427734374998,78.07563476562498],[-96.98964843749994,77.80600585937503],[-97.65815429687498,78.090625],[-96.944677734375,78.15185546874997],[-98.04951171874995,78.325927734375],[-98.33261718749998,78.77353515625006],[-97.38232421875,78.78291015625001],[-96.20449218749994,78.53129882812499]]],[[[-103.42602539062499,79.315625],[-102.57617187499996,78.87939453125003],[-101.70366210937502,79.07890625000002],[-101.128125,78.80166015625002],[-100.43549804687503,78.8203125],[-99.60942382812495,78.58305664062507],[-99.16640625000002,77.85693359375003],[-100.27465820312503,77.83271484374995],[-101.07412109375001,78.19384765625],[-102.60698242187502,78.24892578125002],[-102.73134765624995,78.37104492187495],[-103.94658203124999,78.26000976562497],[-104.76357421874998,78.35166015625],[-104.90961914062498,78.55263671875],[-103.57050781250003,78.53984375000005],[-104.02084960937502,78.63491210937497],[-103.37158203125,78.73632812500003],[-104.18500976562498,78.78129882812505],[-104.15195312499999,78.989892578125],[-104.89550781249996,78.80815429687502],[-104.74677734375003,79.02709960937503],[-105.53564453124999,79.03251953125007],[-105.51455078124995,79.24248046875002],[-105.38769531249994,79.32358398437503],[-103.42602539062499,79.315625]]],[[[-98.79160156249995,79.98110351562505],[-98.94521484375,79.72407226562498],[-100.05683593749997,79.89824218750005],[-100.05327148437496,80.093359375],[-99.15322265625001,80.12421874999998],[-98.79160156249995,79.98110351562505]]],[[[-91.88554687499999,81.13286132812505],[-90.64301757812498,80.59370117187498],[-89.23559570312494,80.51064453125002],[-88.85732421874997,80.16621093750001],[-88.19990234374998,80.11147460937497],[-88.5248046875,80.41801757812507],[-87.675,80.37211914062505],[-87.92231445312501,80.09770507812499],[-86.97719726562502,79.89423828125001],[-87.29516601562494,79.58017578124998],[-86.33696289062496,79.63496093749995],[-86.00703124999998,79.47944335937498],[-85.6478515625,79.61142578125006],[-85.04213867187497,79.2845703125],[-86.95717773437502,78.97490234375005],[-87.61738281249995,78.67631835937505],[-88.04018554687494,78.99531250000004],[-87.98286132812498,78.53706054687501],[-88.74160156250002,78.58403320312499],[-88.82241210937497,78.18588867187498],[-90.037109375,78.60683593750002],[-89.52568359374999,78.15961914062495],[-90.29721679687495,78.32802734374997],[-90.614404296875,78.14985351562501],[-92.35126953125001,78.312890625],[-92.8482421875,78.46010742187497],[-91.86689453124998,78.54267578125001],[-93.26660156249997,78.60830078124997],[-93.63442382812502,78.75092773437498],[-93.15986328124998,78.77563476562503],[-94.11459960937498,78.92890625000001],[-92.54721679687495,79.28261718750002],[-91.29990234375003,79.372705078125],[-92.82192382812497,79.44990234375001],[-93.93315429687496,79.29072265624998],[-94.11030273437498,79.40156250000001],[-95.10317382812502,79.289892578125],[-95.66289062500002,79.52734374999997],[-94.40185546874997,79.736328125],[-95.73935546874995,79.66015625000003],[-96.58906249999995,79.91665039062497],[-96.77324218749999,80.13579101562502],[-94.64589843749994,80.04873046874997],[-94.26259765625002,80.19487304687499],[-95.40507812499996,80.13500976562506],[-96.39409179687493,80.31503906250003],[-95.549072265625,80.36660156249997],[-95.92695312499998,80.72065429687498],[-93.92792968749995,80.55917968750003],[-95.51474609375003,80.83813476562503],[-94.98051757812499,81.04965820312503],[-93.28671874999998,81.10029296874998],[-94.22011718749997,81.33076171875004],[-93.03466796874997,81.3462890625],[-91.88554687499999,81.13286132812505]]],[[[-69.4888671875,83.01679687499998],[-66.42255859374998,82.92685546875003],[-68.46933593749995,82.65336914062502],[-65.29902343749995,82.79960937500005],[-64.98388671874997,82.90229492187501],[-64.50400390625,82.77841796874998],[-63.641015624999966,82.81259765625003],[-63.246777343749926,82.4501953125],[-62.47519531249995,82.51958007812502],[-61.392480468749994,82.44189453125],[-61.61538085937502,82.18442382812503],[-64.43579101562497,81.74262695312501],[-66.62573242187497,81.61640624999995],[-68.68852539062493,81.29331054687503],[-64.78007812499993,81.49287109375001],[-69.55068359375,80.38325195312498],[-70.71259765625001,80.53959960937505],[-70.264892578125,80.23359374999998],[-72.05595703124996,80.12324218749995],[-70.56840820312493,80.09370117187498],[-71.387841796875,79.76176757812505],[-72.43652343750003,79.69438476562499],[-74.39448242187495,79.87407226562499],[-73.47246093749996,79.7564453125],[-73.36152343750001,79.50400390625],[-75.50341796875,79.41416015625],[-76.898828125,79.5123046875],[-75.60273437499998,79.23955078125005],[-74.48120117187503,79.22949218750006],[-74.64091796874996,79.03554687499997],[-78.58164062499998,79.075],[-77.88276367187498,78.9423828125],[-76.255859375,79.00683593749997],[-74.486328125,78.75009765624998],[-74.87861328124998,78.54482421875],[-76.41611328124995,78.51152343750005],[-75.19345703125,78.327734375],[-75.86596679687497,78.00981445312499],[-78.01259765624997,77.94604492187506],[-78.07617187500003,77.51904296875],[-78.70849609374997,77.34213867187503],[-80.57304687499996,77.31479492187506],[-81.65908203124997,77.52543945312499],[-81.3013671875,77.34404296875007],[-82.056787109375,77.29653320312497],[-81.75634765624997,77.20400390625005],[-79.49726562500001,77.19609375000005],[-78.97919921874998,76.89287109374999],[-78.28886718750002,76.97797851562501],[-77.98330078124994,76.75498046875006],[-78.284326171875,76.57124023437501],[-80.79970703124997,76.173583984375],[-80.97451171874994,76.470068359375],[-81.71738281250003,76.494970703125],[-82.52983398437499,76.723291015625],[-82.23315429687494,76.46582031250003],[-83.88569335937501,76.453125],[-84.22377929687497,76.67534179687499],[-84.27534179687498,76.35654296875006],[-85.141259765625,76.30458984375005],[-86.45371093750003,76.58486328125002],[-86.68022460937499,76.37661132812497],[-87.35419921874998,76.44804687500005],[-87.48979492187499,76.58583984374997],[-87.49755859374997,76.38627929687499],[-88.39599609374997,76.40527343750003],[-88.49584960937497,76.77285156249997],[-88.54580078125002,76.42089843750003],[-89.36962890624997,76.474462890625],[-89.49975585937503,76.82680664062502],[-88.39814453124995,77.10395507812501],[-86.81225585937497,77.18491210937498],[-87.68144531249996,77.43637695312503],[-88.01699218750002,77.78471679687505],[-86.75507812499998,77.86372070312498],[-85.58847656249998,77.46113281250004],[-84.73867187499997,77.36103515624998],[-83.72128906249998,77.41420898437497],[-82.7103515625,77.84951171875002],[-82.5953125,77.99213867187504],[-83.77939453125,77.53261718750002],[-85.28935546874996,77.55903320312498],[-85.54755859374998,77.92768554687495],[-84.61542968749998,78.19570312500002],[-84.22270507812499,78.176025390625],[-84.91035156249993,78.23969726562501],[-84.78320312499997,78.52758789062506],[-85.5859375,78.10957031249998],[-86.21777343750003,78.08120117187497],[-85.92006835937494,78.34287109374998],[-86.91323242187494,78.126806640625],[-87.5517578125,78.17661132812503],[-86.80791015624999,78.77436523437495],[-85.00375976562495,78.912255859375],[-83.27143554687501,78.77031250000002],[-81.75009765624995,78.97578124999995],[-82.43876953125002,78.903662109375],[-84.41201171875002,78.99658203125003],[-84.38359375000002,79.1185546875],[-83.57587890624995,79.05366210937501],[-86.42075195312498,79.84521484374997],[-86.49853515625003,80.25825195312501],[-83.72363281250003,80.22895507812501],[-81.68837890625,79.685791015625],[-80.47592773437498,79.60625],[-80.12446289062495,79.66948242187507],[-81.01015625000002,79.693115234375],[-82.98701171874995,80.32260742187498],[-76.86298828124995,80.86479492187505],[-78.71621093749994,80.95166015624997],[-76.88510742187503,81.43027343750006],[-81.00703125000001,80.6548828125],[-82.88432617187502,80.57753906249997],[-82.22236328124998,80.77231445312503],[-84.41782226562495,80.52675781250002],[-86.250341796875,80.56577148437506],[-86.60307617187499,80.66401367187498],[-85.63930664062494,80.92460937500007],[-83.288818359375,81.14794921875],[-85.780859375,81.03505859375],[-87.32988281250002,80.669775390625],[-88.00366210937497,80.675390625],[-89.16689453125,80.94130859375],[-86.47675781249993,81.03574218750006],[-84.94121093750002,81.28623046875],[-87.27509765624995,81.080810546875],[-89.623046875,81.032470703125],[-89.94731445312499,81.17265625000005],[-89.20869140624998,81.25009765625003],[-89.67368164062503,81.32861328125003],[-87.59702148437498,81.52583007812498],[-88.47905273437502,81.56464843749998],[-90.41630859374996,81.40537109375003],[-89.82167968749997,81.63486328124998],[-91.29238281250002,81.57124023437498],[-91.64755859374998,81.68383789062503],[-88.06318359375001,82.09648437500007],[-87.01821289062502,81.95874023437497],[-86.62680664062495,82.05102539062503],[-85.04482421874997,81.9828125],[-86.615625,82.21855468750007],[-84.89682617187503,82.44941406250001],[-82.63369140625002,82.07729492187497],[-82.53691406250002,82.24726562499995],[-79.465625,81.85112304687499],[-82.44755859374993,82.39501953125003],[-81.68115234375003,82.51865234375],[-82.11684570312497,82.62866210937503],[-80.8625,82.57153320312503],[-81.01015625000002,82.77905273437503],[-78.748779296875,82.67939453124998],[-80.15493164062497,82.91113281250003],[-77.61806640624997,82.89584960937503],[-76.009375,82.53515625],[-75.565625,82.60854492187502],[-77.12490234374994,83.00854492187497],[-74.41416015624995,83.01313476562501],[-72.65869140625,82.72163085937495],[-73.44189453124994,82.90483398437499],[-72.811669921875,83.08120117187502],[-71.98320312499996,83.10141601562498],[-70.94038085937495,82.90224609375],[-71.08481445312498,83.08266601562497],[-69.96992187499995,83.11611328125005],[-69.4888671875,83.01679687499998]]]]},"properties":{"name":"Canada","childNum":110}},{"geometry":{"type":"Polygon","coordinates":[[[9.527658197470123,47.27026989773668],[9.46249431093294,47.19858962254578],[9.46249431093294,47.09010747968864],[9.409458596647225,47.02019676540292],[9.579979133936737,47.05856388629306],[9.580273437500011,47.057373046875],[10.133496093750011,46.851513671875],[10.349414062500017,46.98476562499999],[10.414941406250023,46.964404296874996],[10.45458984375,46.8994140625],[10.452832031250011,46.86494140625],[10.406054687500017,46.73486328125],[10.39794921875,46.6650390625],[10.4306640625,46.550048828125],[10.195507812500011,46.62109375],[10.1375,46.61435546875],[10.087011718750006,46.599902343749996],[10.061230468750011,46.546777343749994],[10.038281250000011,46.483203125],[10.045605468750011,46.447900390624994],[10.081933593750023,46.420751953125],[10.109667968750017,46.362841796874996],[10.128320312500023,46.238232421875],[10.08056640625,46.227978515625],[10.041015625,46.238085937499996],[9.939257812500017,46.36181640625],[9.884472656250011,46.3677734375],[9.787792968750011,46.346044921875],[9.639453125000017,46.2958984375],[9.57958984375,46.29609375],[9.528710937500023,46.306201171874996],[9.427636718750023,46.482324218749994],[9.399316406250023,46.4806640625],[9.304394531250011,46.495556640625],[9.203417968750017,46.21923828125],[9.11874162946429,46.014892578125],[8.97551618303573,45.81677455357143],[8.74961495535715,46.02246372767857],[8.818554687500011,46.0771484375],[8.458398437500023,46.245898437499996],[8.370703125,46.445117187499996],[8.298535156250011,46.40341796875],[8.23193359375,46.341210937499994],[8.08154296875,46.256005859374994],[7.9931640625,46.015917968749996],[7.327929687500017,45.912353515625],[7.129003906250006,45.880419921874996],[7.055761718750006,45.90380859375],[7.02109375,45.92578125],[6.953710937500006,46.017138671874996],[6.897265625000017,46.0517578125],[6.772070312500006,46.16513671875],[6.758105468750017,46.415771484375],[6.578222656250006,46.437353515625],[6.428906250000011,46.430517578125],[6.321875,46.393701171874994],[6.234667968750017,46.3326171875],[6.199414062500011,46.19306640625],[6.086621093750011,46.147021484374996],[6.006640625000017,46.142333984375],[5.971484375000017,46.151220703125],[5.970019531250017,46.214697265625],[6.0361328125,46.238085937499996],[6.095898437500011,46.27939453125],[6.129687500000017,46.5669921875],[6.41015625,46.755419921874996],[6.429003906250017,46.832275390625],[6.45625,46.94833984375],[6.624804687500017,47.004345703125],[6.666894531250023,47.026513671874994],[6.688085937500006,47.058251953124994],[6.820703125000023,47.16318359375],[6.952050781250023,47.2671875],[6.978515625,47.302050781249996],[7.000585937500006,47.322509765625],[7.000585937500006,47.339453125],[6.900390625,47.39423828125],[6.968359375,47.45322265625],[7.136035156250017,47.48984375],[7.343164062500023,47.43310546875],[7.615625,47.592724609375],[8.454003906250023,47.59619140625],[8.559472656250023,47.6240234375],[8.570507812500011,47.63779296875],[8.567089843750011,47.651904296874996],[8.55234375,47.659130859375],[8.451757812500006,47.651806640625],[8.413281250000011,47.6626953125],[8.403417968750006,47.687792968749996],[8.435742187500011,47.731347656249994],[8.572656250000023,47.775634765625],[9.524023437500006,47.52421875],[9.625878906250023,47.467041015625],[9.527539062500011,47.270751953125],[9.527658197470123,47.27026989773668]]]},"properties":{"name":"Switzerland","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.28886718749999,-55.776855468749964],[-67.55996093749997,-55.72480468750002],[-67.39736328124997,-55.58515625],[-67.28886718749999,-55.776855468749964]]],[[[-67.07993164062498,-55.15380859374996],[-67.33969726562495,-55.292578124999984],[-67.4947265625,-55.177441406249976],[-68.07001953124995,-55.22109374999999],[-68.30136718750003,-54.98066406250003],[-67.245263671875,-54.977636718750034],[-67.07993164062498,-55.15380859374996]]],[[[-69.70297851562503,-54.91904296875],[-68.90078125000002,-55.01777343750004],[-68.45800781249997,-54.95966796875002],[-68.61328124999997,-55.155566406250045],[-68.28266601562495,-55.25517578125],[-68.04833984375,-55.6431640625],[-68.86704101562498,-55.45019531250003],[-68.89008789062498,-55.2412109375],[-69.19262695312497,-55.171875],[-69.35922851562498,-55.300683593749945],[-69.18085937499995,-55.47480468749998],[-69.41181640624995,-55.44423828124997],[-69.97978515625002,-55.14746093749999],[-69.88442382812494,-54.88203125000001],[-69.70297851562503,-54.91904296875]]],[[[-70.9916015625,-54.86796874999999],[-70.80483398437497,-54.96767578124996],[-70.41752929687493,-54.908886718749976],[-70.29785156249997,-55.11376953124997],[-70.47558593749994,-55.17705078124998],[-71.43720703125001,-54.88925781249997],[-70.9916015625,-54.86796874999999]]],[[[-71.390478515625,-54.03281250000002],[-71.02192382812495,-54.111816406250036],[-71.14326171874998,-54.374023437499986],[-71.473291015625,-54.23115234375001],[-71.94853515624999,-54.300878906250006],[-72.21044921874997,-54.04775390624995],[-71.996484375,-53.884863281249984],[-71.390478515625,-54.03281250000002]]],[[[-72.92324218749997,-53.481640625],[-72.88222656249997,-53.578320312499976],[-72.48227539062503,-53.58808593750001],[-72.20541992187503,-53.80742187500002],[-72.408544921875,-54.00380859374997],[-72.87099609375,-54.12656250000002],[-72.76376953125,-53.86484375],[-73.03945312499994,-53.83281250000004],[-73.08076171875001,-53.99804687499995],[-73.21064453125001,-53.98583984374995],[-73.31435546875,-53.72919921874998],[-73.845458984375,-53.54580078125001],[-73.44707031249993,-53.41005859374998],[-72.92324218749997,-53.481640625]]],[[[-74.38574218749994,-52.92236328125001],[-73.65400390624998,-53.06982421875003],[-73.13520507812498,-53.35390625],[-73.56728515625,-53.3068359375],[-73.86694335937494,-53.096875],[-74.27021484374995,-53.08154296875002],[-74.71201171874998,-52.74873046874998],[-74.38574218749994,-52.92236328125001]]],[[[-68.62993164062499,-52.65263671875004],[-68.65322265624994,-54.85361328124999],[-69.48627929687493,-54.85888671875],[-69.72343750000002,-54.71210937500003],[-70.49716796875,-54.80957031249999],[-71.83154296874997,-54.62617187500002],[-71.92773437500003,-54.52871093749997],[-71.80014648437498,-54.433984374999945],[-71.07993164062498,-54.444238281249994],[-70.79726562500002,-54.32724609374996],[-70.70112304687498,-54.48544921875004],[-70.31098632812498,-54.52851562500002],[-70.86308593749993,-54.11044921875003],[-70.86772460937499,-53.88417968750002],[-70.53129882812502,-53.627343750000016],[-70.37973632812495,-53.98671874999995],[-70.62983398437493,-54.005566406249976],[-70.53530273437494,-54.136132812500016],[-70.16899414062502,-54.37929687499999],[-69.74184570312494,-54.30585937500005],[-69.25317382812494,-54.557421875000045],[-69.04433593749997,-54.40673828124999],[-69.98813476562503,-54.10908203125001],[-70.15112304687503,-53.88808593750002],[-70.09111328124996,-53.72177734374998],[-69.35595703125003,-53.41630859375001],[-69.63701171874999,-53.33408203125004],[-70.32929687499998,-53.37763671875003],[-70.44335937499994,-53.085546875000034],[-70.130615234375,-52.942773437499994],[-70.38012695312494,-52.75195312500002],[-69.93544921874997,-52.82109374999998],[-69.41406249999997,-52.48623046874997],[-69.16704101562499,-52.66757812499997],[-68.78979492187497,-52.576757812500034],[-68.62993164062499,-52.65263671875004]]],[[[-74.82294921874993,-51.63017578125001],[-74.53681640624998,-51.96513671875004],[-74.69448242187497,-52.27919921874999],[-74.85180664062494,-52.27070312500003],[-75.10537109375,-51.78886718750001],[-74.82294921874993,-51.63017578125001]]],[[[-74.55864257812499,-51.27705078125001],[-74.62036132812497,-51.395703125000026],[-75.04736328125,-51.39833984375003],[-75.28911132812496,-51.625390625000016],[-75.15366210937498,-51.278808593750014],[-74.73666992187503,-51.20761718749999],[-74.55864257812499,-51.27705078125001]]],[[[-75.302001953125,-50.67998046875005],[-75.411376953125,-50.76435546875001],[-75.42763671875002,-50.48056640625002],[-75.11533203124998,-50.510449218749976],[-75.302001953125,-50.67998046875005]]],[[[-75.05478515625,-50.29609375],[-75.44912109374997,-50.34335937500004],[-75.32666015624997,-50.01181640625],[-74.8759765625,-50.10996093750001],[-75.05478515625,-50.29609375]]],[[[-75.106689453125,-48.83652343750001],[-75.38994140624999,-49.15917968750002],[-75.64116210937499,-49.195410156250034],[-75.48764648437498,-49.082421875000016],[-75.58310546874998,-48.85888671874995],[-75.106689453125,-48.83652343750001]]],[[[-74.47617187499998,-49.14785156250002],[-74.59472656249997,-50.00664062500001],[-74.76298828124996,-50.01142578125001],[-74.88041992187502,-49.72587890625001],[-74.72382812499998,-49.42382812500003],[-74.960107421875,-49.533007812499974],[-75.06601562499998,-49.85234375000002],[-75.54980468749994,-49.79130859375002],[-75.30585937499998,-49.49404296875003],[-75.46748046874995,-49.35888671875003],[-75.08603515624998,-49.27021484375],[-75.21015624999995,-49.14804687499998],[-74.94921875,-48.960156249999976],[-74.89624023437503,-48.73320312500002],[-74.54609374999993,-48.76689453125004],[-74.47617187499998,-49.14785156250002]]],[[[-75.51025390624997,-48.76347656250005],[-75.65092773437496,-48.58632812500002],[-75.57148437499993,-48.095898437500026],[-75.39140625000002,-48.01972656249997],[-75.15849609374999,-48.62265624999996],[-75.51025390624997,-48.76347656250005]]],[[[-74.56728515625,-48.591992187500026],[-74.92304687499998,-48.62646484375003],[-75.21289062499997,-48.141699218750034],[-75.19829101562502,-47.974609375000014],[-74.895654296875,-47.839355468749986],[-74.56728515625,-48.591992187500026]]],[[[-75.11220703124997,-47.8376953125],[-75.26103515625002,-47.76386718749998],[-74.92646484374998,-47.72314453125003],[-75.11220703124997,-47.8376953125]]],[[[-74.31289062500002,-45.69150390625002],[-74.46552734374995,-45.757226562499994],[-74.68984375,-45.66259765625],[-74.310546875,-45.17265625000002],[-74.31289062500002,-45.69150390625002]]],[[[-73.63217773437498,-44.82148437499997],[-73.81845703125,-44.65214843750002],[-73.72392578124993,-44.544238281249974],[-73.63217773437498,-44.82148437499997]]],[[[-72.98613281249999,-44.780078124999974],[-73.22846679687498,-44.85996093749999],[-73.39707031249998,-44.77431640624995],[-73.44506835937497,-44.641015624999966],[-73.20771484374993,-44.33496093749997],[-72.7763671875,-44.50859374999999],[-72.98613281249999,-44.780078124999974]]],[[[-73.73535156249997,-44.39453125000003],[-74.00205078125003,-44.59091796874998],[-73.728173828125,-45.195898437500034],[-74.016259765625,-45.344921875000026],[-74.61777343749998,-44.64794921874996],[-74.50180664062498,-44.47353515624995],[-74.09721679687496,-44.38935546875004],[-73.99492187499999,-44.140234375],[-73.70322265624998,-44.27412109375001],[-73.73535156249997,-44.39453125000003]]],[[[-73.81064453125003,-43.827246093750006],[-73.95566406249998,-43.921972656250034],[-74.14296874999997,-43.872167968750006],[-73.81064453125003,-43.827246093750006]]],[[[-73.77338867187498,-43.3458984375],[-74.114404296875,-43.35791015624996],[-74.387353515625,-43.231640625],[-74.03666992187496,-41.79550781249998],[-73.52783203124997,-41.89628906249999],[-73.42290039062499,-42.192871093750014],[-73.47080078124998,-42.46630859375004],[-73.78925781249993,-42.58574218750003],[-73.43632812499996,-42.9365234375],[-73.74965820312494,-43.15908203124995],[-73.77338867187498,-43.3458984375]]],[[[-78.80415039062501,-33.646484374999986],[-78.98945312499993,-33.66171874999998],[-78.87744140625003,-33.57519531250003],[-78.80415039062501,-33.646484374999986]]],[[[-109.27998046874994,-27.14042968749996],[-109.434130859375,-27.171289062500023],[-109.39047851562499,-27.068359375000014],[-109.27998046874994,-27.14042968749996]]],[[[-67.19487304687493,-22.821679687500037],[-67.00878906249994,-23.00136718750005],[-67.35620117187503,-24.033789062499963],[-68.25029296875002,-24.391992187500023],[-68.56201171875,-24.74736328125003],[-68.38422851562495,-25.091894531249977],[-68.59208984375002,-25.420019531250034],[-68.41450195312498,-26.153710937500023],[-68.59160156249999,-26.47041015624997],[-68.31865234374999,-26.973242187500006],[-68.59208984375002,-27.140039062499966],[-68.84633789062494,-27.153710937499994],[-69.17441406249998,-27.924707031250037],[-69.65693359374995,-28.413574218749986],[-69.82788085937497,-29.10322265624997],[-70.02680664062501,-29.324023437500017],[-69.95996093749997,-30.078320312500026],[-69.84428710937493,-30.175],[-69.95634765624996,-30.35820312500003],[-70.15322265625,-30.360937499999963],[-70.30908203124994,-31.02265625000004],[-70.51958007812493,-31.1484375],[-70.585205078125,-31.569433593749963],[-70.25439453125,-31.957714843750026],[-70.36376953125,-32.08349609374997],[-70.02197265625,-32.88457031250002],[-70.08486328125002,-33.20175781249998],[-69.81962890624999,-33.28378906249999],[-69.85244140625,-34.224316406250026],[-70.05205078124999,-34.30078124999997],[-70.39316406250003,-35.146875],[-70.55517578125,-35.246875],[-70.41572265625001,-35.52304687500002],[-70.40478515625,-36.06171874999998],[-71.05551757812498,-36.52373046874996],[-71.19218750000002,-36.84365234375004],[-71.16757812499998,-37.76230468749996],[-70.858642578125,-38.60449218750003],[-71.40156249999995,-38.93505859374996],[-71.53945312499997,-39.60244140624995],[-71.71992187499995,-39.63525390624997],[-71.65976562499998,-40.02080078125],[-71.81831054687493,-40.17666015624995],[-71.70898437499997,-40.381738281249994],[-71.93212890624994,-40.69169921874999],[-71.91127929687497,-41.650390624999986],[-71.75,-42.04677734375001],[-72.10820312499993,-42.25185546874995],[-72.14643554687498,-42.990039062499974],[-71.750634765625,-43.237304687499986],[-71.90498046875001,-43.34755859374998],[-71.68007812500002,-43.92958984374998],[-71.82001953124993,-44.38310546875],[-71.21259765624998,-44.44121093750003],[-71.15971679687496,-44.56025390625004],[-71.26113281250002,-44.763085937499966],[-72.06372070312503,-44.771875],[-72.04169921874998,-44.90419921875004],[-71.5962890625,-44.97919921875004],[-71.34931640624995,-45.33193359374995],[-71.74619140624998,-45.57890625],[-71.63154296874998,-45.95371093749998],[-71.87568359374998,-46.160546875],[-71.69965820312501,-46.6513671875],[-71.94023437499999,-46.83125],[-71.90498046875001,-47.201660156250014],[-72.34594726562497,-47.49267578124997],[-72.517919921875,-47.87636718749998],[-72.32832031250001,-48.11005859374998],[-72.35473632812497,-48.36582031250005],[-72.582861328125,-48.47539062499999],[-72.65126953125,-48.84160156249998],[-73.03364257812501,-49.014355468750004],[-73.13525390625,-49.30068359374999],[-73.46157226562497,-49.31386718750001],[-73.55419921875,-49.463867187500014],[-73.50126953124996,-50.125292968750024],[-73.15292968749998,-50.73828125000003],[-72.50981445312496,-50.607519531250034],[-72.34023437499997,-50.68183593749999],[-72.40766601562501,-51.54082031250002],[-71.91865234374995,-51.98955078125004],[-69.96025390624993,-52.00820312500002],[-68.443359375,-52.35664062500004],[-69.24101562499996,-52.20546874999997],[-69.62031249999995,-52.46474609374995],[-70.79511718749995,-52.76875],[-70.99584960937497,-53.77929687499997],[-71.29775390625002,-53.88339843750004],[-72.1744140625,-53.632324218749964],[-72.41289062500002,-53.35019531250004],[-71.94169921874993,-53.23408203125001],[-71.89169921874998,-53.523535156250006],[-71.79145507812498,-53.48457031249997],[-71.74052734374999,-53.232617187499976],[-71.28896484375002,-53.03369140624995],[-71.22714843750003,-52.810644531249984],[-71.38774414062496,-52.76425781250004],[-72.27802734374998,-53.13232421874997],[-72.54892578125,-53.4607421875],[-73.05273437499997,-53.24345703125005],[-72.72768554687502,-52.7623046875],[-72.453466796875,-52.814453124999964],[-72.11757812499997,-52.65],[-71.51127929687502,-52.60537109375],[-72.22568359374998,-52.52099609374995],[-72.43769531250001,-52.62578124999998],[-72.71210937499995,-52.53554687499999],[-73.12246093749997,-53.073925781249976],[-73.64521484374998,-52.83701171875003],[-73.2408203125,-52.707128906250034],[-73.12392578125,-52.487988281249976],[-73.24414062499997,-52.62402343749998],[-73.58569335937503,-52.68574218750003],[-74.01445312499999,-52.63935546875],[-74.26494140624993,-52.1048828125],[-73.83447265625,-52.23398437500001],[-73.68432617187494,-52.07773437499998],[-73.26044921874993,-52.157812500000034],[-72.79501953124998,-51.94951171875005],[-72.57084960937496,-52.200097656249945],[-72.67705078125002,-52.38466796874998],[-72.52333984374997,-52.255468750000034],[-72.62460937499998,-51.94648437499997],[-72.48964843750002,-51.76367187500003],[-72.76123046875,-51.57324218749996],[-73.16875,-51.45390624999998],[-72.60004882812495,-51.79912109374997],[-73.51816406250003,-52.04101562499996],[-73.75263671874993,-51.795507812500034],[-74.19667968749997,-51.68056640624997],[-73.92978515624995,-51.61787109374999],[-73.93950195312499,-51.26630859375005],[-74.81474609374996,-51.06289062499999],[-75.09467773437495,-50.68125],[-74.68574218749995,-50.662011718749945],[-74.77587890625003,-50.46992187499998],[-74.64448242187498,-50.360937499999984],[-74.365576171875,-50.487890625],[-74.13940429687503,-50.81777343749997],[-73.80654296875,-50.93837890625003],[-73.654443359375,-50.49267578125],[-73.97802734375003,-50.827050781249994],[-74.18559570312493,-50.485351562500014],[-73.95034179687497,-50.510546875],[-74.62958984374998,-50.19404296875],[-74.333740234375,-49.97460937499997],[-73.95859374999998,-49.994726562499984],[-74.32392578124995,-49.783398437500004],[-74.29082031249996,-49.604101562499984],[-73.83637695312493,-49.609375],[-74.09443359374993,-49.42968749999998],[-73.93496093749994,-49.02089843750001],[-74.2212890625,-49.500585937500034],[-74.36655273437503,-49.40048828124998],[-74.34101562499998,-48.59570312499998],[-74.00908203124996,-48.475],[-74.47441406249999,-48.46396484374996],[-74.58466796874998,-47.999023437500014],[-73.39106445312498,-48.14589843750001],[-73.60991210937499,-47.993945312500045],[-73.71586914062499,-47.65546875000001],[-73.94086914062498,-47.92939453125004],[-74.22705078124994,-47.96894531250001],[-74.654931640625,-47.702246093750034],[-74.5337890625,-47.567675781249974],[-74.24296874999999,-47.67929687499998],[-74.13408203125002,-47.590820312499986],[-74.48266601562497,-47.43046875],[-74.15839843749998,-47.18251953125002],[-74.31357421874998,-46.78818359374998],[-74.45419921875003,-46.76679687499997],[-74.51225585937496,-46.88515625000002],[-75.00595703125,-46.74111328124998],[-74.98417968750002,-46.51210937499995],[-75.54033203124999,-46.69873046874996],[-75.43037109374995,-46.93457031249996],[-75.70639648437498,-46.70527343749997],[-74.924462890625,-46.159667968750014],[-75.06669921874993,-45.874902343749994],[-74.15786132812497,-45.7671875],[-74.122705078125,-45.49619140625002],[-73.95717773437494,-45.40439453124998],[-73.825,-45.446875],[-74.01992187500002,-46.055859375],[-74.39296875,-46.21738281250005],[-73.96757812500002,-46.15410156250003],[-73.87871093749993,-45.846875],[-73.73525390624994,-45.81171875],[-73.70815429687502,-46.070312500000014],[-73.94863281249997,-46.533105468749966],[-73.845361328125,-46.56601562500002],[-73.59184570312493,-45.89912109375004],[-73.73076171874999,-45.47998046875],[-73.26621093749995,-45.346191406250014],[-72.933837890625,-45.45234374999997],[-73.44497070312497,-45.23818359374995],[-73.36245117187502,-44.97822265625001],[-72.73896484375001,-44.73417968750003],[-72.680078125,-44.59394531249997],[-72.66386718749999,-44.43642578124995],[-73.26508789062498,-44.16865234375001],[-73.22446289062498,-43.89794921875003],[-73.06879882812495,-43.86201171874998],[-72.99658203125,-43.63154296875001],[-73.07597656250002,-43.323632812499994],[-72.75800781249998,-43.039453125],[-72.84804687500002,-42.66914062499997],[-72.77392578125003,-42.505175781250045],[-72.63183593750003,-42.509667968749994],[-72.77324218749996,-42.257714843749994],[-72.63105468749995,-42.199804687500006],[-72.412353515625,-42.388183593750014],[-72.49941406249997,-41.98085937499999],[-72.82407226562503,-41.90878906249996],[-72.36040039062499,-41.64912109375],[-72.31826171875,-41.49902343749997],[-72.54238281250002,-41.690625],[-72.95283203124995,-41.51474609374998],[-73.24179687499995,-41.78085937500002],[-73.62402343750003,-41.77363281249997],[-73.73515625000002,-41.74248046875002],[-73.62392578125,-41.581347656250045],[-73.81074218749995,-41.51748046875001],[-73.96586914062493,-41.118261718750034],[-73.67099609375,-39.96318359374999],[-73.41040039062503,-39.78916015624998],[-73.22646484375002,-39.22441406250003],[-73.52021484375001,-38.509375],[-73.46479492187498,-38.04033203125003],[-73.66181640624998,-37.69853515625003],[-73.66240234375002,-37.341015625000026],[-73.60166015624998,-37.18847656250003],[-73.21596679687502,-37.16689453124998],[-73.11806640624997,-36.68837890625002],[-72.58735351562493,-35.759667968749994],[-72.62392578125002,-35.5857421875],[-72.22377929687494,-35.096191406250014],[-72.00283203124997,-34.16533203125],[-71.66435546875002,-33.65263671875],[-71.74296875,-33.09511718750001],[-71.45224609374998,-32.65957031250001],[-71.70893554687495,-30.62802734375002],[-71.66948242187499,-30.33037109374996],[-71.40039062499997,-30.142968749999966],[-71.31572265624996,-29.649707031250017],[-71.51923828124993,-28.926464843750026],[-71.30673828124998,-28.672460937499963],[-71.08652343749998,-27.814453124999957],[-70.92578125,-27.588671874999974],[-70.64658203124998,-26.329394531250017],[-70.71372070312498,-25.78417968749997],[-70.44536132812502,-25.17265624999999],[-70.57412109374994,-24.644335937500003],[-70.39233398437494,-23.565917968749957],[-70.59335937499995,-23.255468750000034],[-70.56318359374995,-23.057031250000023],[-70.33168945312494,-22.848632812500014],[-70.08002929687501,-21.356835937500037],[-70.19702148437494,-20.725390625],[-70.15742187499995,-19.70585937500003],[-70.41826171874999,-18.345605468750023],[-69.92636718749998,-18.206054687500014],[-69.80258789062498,-17.990234375000014],[-69.85209960937493,-17.70380859375001],[-69.68476562499995,-17.649804687500023],[-69.58642578125,-17.57324218749997],[-69.51093749999998,-17.50605468749997],[-69.31337890624997,-17.943164062500017],[-69.28232421875003,-17.96484375],[-69.09394531249993,-18.05048828125004],[-69.14545898437495,-18.14404296875],[-69.09228515624994,-18.28242187500004],[-69.02680664062493,-18.65625],[-68.97885742187503,-18.81298828125003],[-68.96831054687502,-18.967968749999983],[-68.85795898437499,-19.09335937500005],[-68.62055664062495,-19.29667968749999],[-68.54785156249997,-19.341113281249974],[-68.49199218749996,-19.381933593750034],[-68.47016601562495,-19.409960937499974],[-68.46289062499997,-19.43281250000001],[-68.57529296874998,-19.56015625000002],[-68.69829101562499,-19.721093750000037],[-68.69619140625,-19.74072265625003],[-68.57827148437494,-19.856542968750006],[-68.559375,-19.902343750000014],[-68.56069335937502,-19.96708984374996],[-68.75932617187499,-20.115527343750003],[-68.74516601562493,-20.45859375],[-68.48432617187498,-20.628417968749957],[-68.55825195312497,-20.90195312499999],[-68.197021484375,-21.30029296874997],[-68.18642578124997,-21.618554687499966],[-67.88173828124997,-22.493359375000026],[-67.87944335937496,-22.822949218750026],[-67.57993164062495,-22.89169921874999],[-67.36225585937493,-22.85517578125001],[-67.19487304687493,-22.821679687500037]]]]},"properties":{"name":"Chile","childNum":26}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[110.88876953125006,19.99194335937497],[111.01367187500003,19.65546875000001],[110.64091796875002,19.291210937499955],[110.45126953125012,18.747949218750023],[110.06738281249997,18.447558593750045],[109.51933593750007,18.21826171875003],[108.7015625,18.535253906250034],[108.66552734375003,19.304101562499994],[109.27666015625002,19.761132812500023],[109.17744140625004,19.768457031250023],[109.26347656250007,19.882666015625006],[110.1715820312501,20.053710937500057],[110.58818359375002,19.976367187500017],[110.6517578125,20.137744140625017],[110.88876953125006,19.99194335937497]]],[[[110.38515625000005,21.093164062499966],[110.52158203125006,21.083105468750063],[110.50390625000003,20.96772460937501],[110.28095703125004,21.001171874999983],[110.38515625000005,21.093164062499966]]],[[[112.64375,21.63964843750003],[112.525,21.62304687500003],[112.64765625000004,21.710253906250017],[112.64375,21.63964843750003]]],[[[112.79023437500004,21.601855468750045],[112.78203125000007,21.772265625000045],[112.86259765625002,21.75263671875004],[112.79023437500004,21.601855468750045]]],[[[118.1830078125,24.496289062499983],[118.0905273437501,24.446142578125063],[118.10380859375002,24.552343750000034],[118.1830078125,24.496289062499983]]],[[[119.82089843750006,25.45698242187504],[119.70029296875012,25.432714843750063],[119.72255859375005,25.638818359375023],[119.83837890625003,25.591064453125],[119.82089843750006,25.45698242187504]]],[[[121.2513671875,28.086425781250057],[121.13154296875004,28.062597656250006],[121.20546875,28.204394531250017],[121.2513671875,28.086425781250057]]],[[[122.29589843750003,29.96342773437499],[122.02402343750012,30.01333007812505],[121.96943359375004,30.143115234375017],[122.28447265625007,30.068017578124994],[122.29589843750003,29.96342773437499]]],[[[121.86269531250005,31.492285156249977],[121.519921875,31.549609375000017],[121.2111328125001,31.80537109375001],[121.86269531250005,31.492285156249977]]],[[[130.52695312500012,42.535400390625],[130.24667968750012,42.744824218749955],[130.24033203125006,42.891796874999955],[129.89824218750002,42.998144531250034],[129.69785156250012,42.448144531249994],[129.3136718750001,42.41357421874997],[128.92343750000006,42.038232421874966],[128.04521484375007,41.9875],[128.28925781250004,41.60742187500006],[128.14941406249997,41.38774414062496],[127.17968750000003,41.531347656250006],[126.95478515625004,41.76948242187501],[126.74306640625,41.724853515625],[125.98906250000002,40.904638671875034],[124.8893554687501,40.459814453125006],[124.36210937500002,40.004052734374994],[124.10576171875002,39.84101562499998],[123.65087890625003,39.881591796875],[122.8400390625001,39.600830078125],[121.98232421875,39.05317382812498],[121.67724609374997,39.00341796875006],[121.64990234375003,38.865087890625034],[121.16357421874997,38.73164062500001],[121.10673828125002,38.920800781249994],[121.6798828125001,39.10869140625002],[121.62763671875004,39.22016601562498],[121.81845703125006,39.38652343750002],[121.27548828125006,39.38476562500003],[121.26748046875,39.544677734375],[121.51757812499997,39.638964843750045],[121.51738281250002,39.84482421875006],[121.8009765625001,39.950537109375006],[122.27500000000012,40.541845703125034],[121.83486328125005,40.97426757812502],[121.72929687500002,40.84614257812504],[121.1745117187501,40.901269531249994],[120.47910156250006,40.23095703125003],[119.39111328125003,39.75249023437499],[118.976953125,39.182568359374955],[118.29785156249997,39.067089843749955],[118.04091796875,39.22675781249998],[117.86572265625003,39.191259765625034],[117.61669921875003,38.852880859375034],[117.5578125000001,38.625146484374994],[117.76669921875012,38.311669921874994],[118.01494140625007,38.18339843749996],[118.94003906250006,38.04277343750002],[119.08916015625007,37.70073242187496],[118.95263671875003,37.33115234374998],[119.28740234375002,37.138281250000034],[119.76054687500007,37.15507812499999],[120.31152343750003,37.62270507812505],[120.2572265625,37.67900390624996],[120.75,37.83393554687501],[121.64023437500012,37.46035156250002],[122.05664062500003,37.528906250000034],[122.66699218750003,37.40283203125003],[122.4466796875,37.06811523437503],[122.51972656250004,36.94682617187502],[122.34091796875012,36.83222656250004],[121.93271484375006,36.95947265625003],[121.05380859375006,36.61137695312499],[120.81083984375007,36.6328125],[120.89580078125007,36.44414062500002],[120.71152343750006,36.41328125000004],[120.6378906250001,36.129931640625045],[120.39306640625003,36.053857421874994],[120.32773437500006,36.228173828124994],[120.18330078125004,36.20244140624999],[120.094140625,36.11889648437503],[120.28476562500006,35.98442382812499],[119.42968749999997,35.301416015624994],[119.16533203125002,34.84882812499998],[119.20097656250002,34.748437499999966],[120.26669921875006,34.274023437500034],[120.87109374999997,33.016503906249994],[120.8532226562501,32.66137695312503],[121.34169921875005,32.42504882812503],[121.40390625000006,32.20625],[121.85634765625,31.816455078125045],[121.86630859375006,31.703564453124955],[121.68085937500004,31.71215820312503],[121.351953125,31.85878906250005],[120.97353515625,31.86938476562497],[120.52011718750006,32.10585937500002],[120.03593750000002,31.93627929687503],[120.7155273437501,31.983740234375006],[120.7877929687501,31.81977539062501],[121.66064453124997,31.319726562499994],[121.87792968750003,30.91699218750003],[121.41894531249997,30.789794921875057],[120.8214843750001,30.354638671875023],[120.44980468750006,30.38784179687505],[120.19462890625002,30.241308593750034],[120.49453125,30.303076171875006],[120.63339843750006,30.133154296875034],[121.25800781250004,30.30410156250005],[121.67792968750004,29.979101562500006],[122.08291015625005,29.870361328125057],[121.50625,29.484570312499955],[121.94121093750002,29.605908203124983],[121.91777343750007,29.13500976562497],[121.71748046875004,29.25634765625],[121.48710937500007,29.193164062500017],[121.67968749999997,28.953125],[121.54003906250003,28.931884765625],[121.6625,28.851416015625034],[121.47519531250006,28.64140625],[121.60996093750006,28.29213867187505],[121.27226562500002,28.222119140624983],[121.14570312500004,28.32666015624997],[120.95859375000006,28.037011718750023],[120.74765625000006,28.00996093750001],[120.83300781249997,27.891455078125034],[120.58750000000012,27.580761718749983],[120.60751953125012,27.41240234374996],[120.2787109375,27.097070312500023],[120.08671875000007,26.67158203125004],[119.88222656250005,26.610449218750006],[119.82421874999997,26.84638671875001],[119.71044921874997,26.728662109375023],[119.58818359375002,26.784960937500045],[119.8810546875001,26.33417968750004],[119.46308593750004,26.05468750000003],[119.13945312500007,26.12177734375001],[119.33203124999997,25.94873046875003],[119.61875000000012,26.003564453124994],[119.53945312500005,25.59125976562504],[119.6224609375,25.391162109375017],[119.180078125,25.449804687499977],[119.285546875,25.232226562500074],[118.97753906249997,25.209277343750017],[118.90908203125005,24.92890625000001],[118.63691406250004,24.835546874999977],[118.65703125000002,24.621435546874977],[118.0871093750001,24.627001953125045],[118.00595703125006,24.48198242187499],[117.84267578125005,24.47431640625004],[118.0560546875,24.24609374999997],[117.62822265625002,23.836718750000074],[117.46640625000012,23.84057617187497],[117.36767578124997,23.58862304687497],[117.29082031250007,23.71435546875],[117.08251953124997,23.578759765625023],[116.91064453124997,23.646679687499983],[116.86093750000006,23.453076171874983],[116.62939453124997,23.353857421875034],[116.69882812500006,23.277783203124983],[116.53828125000004,23.17968749999997],[116.47070312499997,22.945898437500034],[116.25185546875005,22.981347656249994],[115.85214843750006,22.801562500000045],[115.64042968750002,22.853417968750023],[115.49833984375002,22.718847656250063],[115.19580078125003,22.81728515625005],[114.85380859375007,22.616796875000063],[114.65166015625002,22.755273437500023],[114.55419921874997,22.52890625],[114.26601562500005,22.540966796874983],[114.01542968750007,22.51191406250001],[113.61962890624997,22.861425781249977],[113.6205078125,23.12749023437499],[113.51972656250004,23.102099609375074],[113.33105468749997,22.912011718749966],[113.55302734375002,22.594042968750045],[113.54912109375002,22.225195312500034],[113.14902343750012,22.075],[113.08876953125,22.207958984374983],[112.95390625000007,21.907324218750034],[112.80859374999997,21.944628906250074],[112.58632812500005,21.77685546875],[112.35966796875007,21.97802734375003],[112.30498046875002,21.74169921875003],[111.94394531250012,21.84965820312499],[111.60273437500004,21.55908203125003],[111.01689453125007,21.51171874999997],[110.56718750000002,21.21406250000001],[110.41093750000007,21.33813476562497],[110.15400390625004,20.944628906250017],[110.36542968750004,20.837597656249955],[110.31308593750012,20.67167968749999],[110.51152343750007,20.51826171875001],[110.34472656249997,20.29482421875005],[109.88251953125004,20.364062500000045],[109.96835937500006,20.448144531250023],[109.66259765625003,20.91689453125005],[109.68125000000012,21.13164062499999],[109.93076171875012,21.480566406250034],[109.6869140625,21.52460937500004],[109.56640624999997,21.690576171874994],[109.54404296875012,21.537939453125006],[109.14863281250004,21.425537109375],[109.1017578125001,21.59047851562505],[108.77167968750004,21.63046875],[108.59375,21.901025390624994],[108.47988281250005,21.904638671875006],[108.50214843750004,21.633447265624994],[108.32480468750006,21.693505859374994],[108.24628906250004,21.55839843749999],[107.97265624999997,21.507958984375023],[107.75927734374997,21.655029296875057],[107.35117187500012,21.60888671874997],[106.97099609375002,21.923925781250034],[106.66357421875003,21.97890625000005],[106.55039062500006,22.501367187499994],[106.78027343749997,22.778906250000034],[106.54179687500007,22.908349609375023],[106.2790039062501,22.857470703125045],[106.14843749999997,22.970068359375006],[105.8429687500001,22.922802734374955],[105.27539062500003,23.34521484375003],[104.86474609375003,23.136376953125023],[104.68730468750002,22.822216796874983],[104.37177734375004,22.704052734374983],[104.14306640624997,22.800146484375006],[103.94150390625006,22.540087890625045],[103.62021484375006,22.782031250000045],[103.49296875000007,22.587988281250034],[103.32666015625003,22.769775390625057],[102.98193359374997,22.4482421875],[102.47089843750004,22.75092773437501],[102.40644531250004,22.70800781249997],[102.2370117187501,22.466015624999983],[102.1759765625001,22.414648437500006],[102.12744140624997,22.379199218750045],[101.84179687500003,22.38847656249999],[101.75996093750004,22.490332031250034],[101.73876953124997,22.495263671874994],[101.70751953125003,22.486572265625],[101.67148437500006,22.462304687500023],[101.64619140625004,22.405419921874966],[101.61992187500002,22.32744140624999],[101.56787109374997,22.27636718749997],[101.52451171875006,22.25366210937497],[101.7365234375001,21.826513671874977],[101.74394531250007,21.77797851562505],[101.74726562500004,21.605761718750045],[101.72294921875007,21.31494140625003],[101.80058593750007,21.212597656249983],[101.78349609375007,21.204150390625017],[101.728125,21.156396484374994],[101.7047851562501,21.15014648437503],[101.54238281250005,21.23427734375005],[101.2814453125001,21.184130859375045],[101.24785156250007,21.197314453125045],[101.22441406250002,21.223730468750034],[101.21181640625,21.278222656250023],[101.2199218750001,21.34243164062505],[101.17539062500006,21.407519531250074],[101.19667968750005,21.522070312500063],[101.1388671875001,21.567480468749977],[101.07978515625004,21.75585937499997],[100.60458984375012,21.471777343750006],[100.14765625000004,21.480517578125017],[99.94072265625007,21.75874023437504],[99.9176757812501,22.02802734375001],[99.19296875000006,22.12597656249997],[99.50712890625002,22.959130859374994],[99.41806640625006,23.069238281250023],[98.86376953125003,23.191259765625034],[98.8322265625001,23.624365234374977],[98.67675781250003,23.905078125000045],[98.83505859375006,24.121191406250034],[98.2125,24.110644531250017],[97.56455078125012,23.911035156250023],[97.7082031250001,24.228759765625],[97.53144531250004,24.49169921875003],[97.58330078125002,24.77480468750005],[97.73789062500006,24.869873046875057],[97.8195312500001,25.251855468749994],[98.01074218749997,25.292529296875017],[98.14287109375007,25.571093750000017],[98.33378906250007,25.586767578125006],[98.65625,25.86357421874999],[98.56406250000006,26.072412109374994],[98.68554687499997,26.189355468750023],[98.7384765625001,26.785742187500006],[98.65117187500007,27.572460937499983],[98.4525390625,27.6572265625],[98.29882812499997,27.550097656250045],[98.06162109375012,28.185888671874977],[97.59921875000006,28.51704101562504],[97.53789062500002,28.510205078124983],[97.43144531250002,28.353906250000023],[97.35644531249997,28.254492187500006],[97.32158929493812,28.217097107438057],[97.3027336276825,28.08710519614969],[97.34382779482424,27.982305259167095],[97.04929369561631,27.76000444316393],[96.96494598325154,27.699301564540924],[96.19423412199573,28.04146177926422],[95.73730002295082,28.117613231051525],[95.11298892962586,27.748338353239472],[94.07167814294401,27.588707868507477],[93.61247595136224,27.323800298697016],[93.30681393470121,26.786120363519142],[92.74319481218781,26.833531317384058],[92.04974640832253,26.874866505386724],[92.07342257335648,26.915311275859864],[92.06813426293174,26.9752569185349],[92.02985139563152,27.03987087331446],[91.99856592104459,27.079255842602592],[91.99177981607339,27.100605151743654],[92.0025114452454,27.147290053160265],[92.03101585307499,27.214271359861193],[92.08387457645458,27.29090135496722],[92.04520857607581,27.364442429033787],[91.99069061380867,27.450181624174498],[91.95099838734396,27.45828799115413],[91.85276579410389,27.438593286730903],[91.74366351462741,27.442853010105477],[91.59505352446729,27.557262710287986],[91.63193359375012,27.759960937499983],[91.64189453125002,27.923242187500023],[91.36259958579089,28.02438066407592],[91.27304687500012,28.078369140625],[91.22587890625007,28.071240234374983],[91.07773437500012,27.974462890624977],[91.02080078125002,27.970068359374977],[90.71572265625,28.071728515624983],[90.63007812500004,28.078564453124955],[90.47734375000007,28.07084960937499],[90.3527343750001,28.080224609375023],[90.33310546875012,28.093994140625],[90.36298828125004,28.21650390625001],[90.34824218750006,28.24394531249999],[90.22080078125006,28.27773437500005],[90.10449218749997,28.302050781250017],[89.98105468750006,28.311181640625023],[89.8978515625,28.29414062500001],[89.81689453125003,28.25629882812501],[89.74980468750002,28.18818359375001],[89.65273437500005,28.158300781250034],[89.53691406250007,28.10742187499997],[89.4806640625001,28.059960937499994],[88.89140625000002,27.316064453124966],[88.83251953125003,27.36284179687499],[88.7648437500001,27.429882812499983],[88.74902343749997,27.521875],[88.82988281250002,27.76738281249999],[88.84882812500004,27.86865234375],[88.80371093750003,28.006933593750034],[88.57792968750002,28.093359375000034],[88.42597656250004,28.01166992187501],[88.27519531250007,27.968847656250006],[88.14111328125003,27.94892578125001],[88.10898437500006,27.933007812499966],[88.10976562500005,27.870605468750057],[87.8607421875,27.886083984375006],[87.62255859374997,27.81518554687503],[87.29072265625004,27.821923828124994],[87.14140625000002,27.838330078124955],[87.02011718750006,27.928662109374983],[86.9337890625001,27.96845703125001],[86.84238281250012,27.99916992187505],[86.750390625,28.022070312500006],[86.71962890625005,28.070654296875034],[86.69052734375006,28.09492187500001],[86.61445312500004,28.10302734374997],[86.55449218750007,28.08520507812497],[86.51689453125007,27.963525390624966],[86.40869140625003,27.928662109374983],[86.32861328124997,27.95952148437496],[86.2179687500001,28.022070312500006],[86.13701171875002,28.114355468750063],[86.07871093750006,28.08359375],[86.0641601562501,27.934716796874966],[85.99453125000005,27.910400390625],[85.95410156249997,27.92822265624997],[85.92167968750002,27.989697265624983],[85.84023437500005,28.135351562499977],[85.75947265625004,28.220654296874955],[85.67832031250012,28.277441406249977],[85.41064453125003,28.27602539062505],[85.21210937500004,28.292626953124966],[85.1224609375,28.315966796875017],[85.08857421875004,28.37226562500001],[85.121484375,28.484277343750023],[85.16015624999997,28.571875],[85.15908203125,28.592236328124983],[85.1263671875,28.602636718750063],[85.06914062500007,28.60966796874999],[84.85507812500006,28.553613281250023],[84.796875,28.560205078125023],[84.2287109375001,28.911767578124966],[84.17558593750002,29.036376953125057],[84.12783203125005,29.15629882812496],[84.10136718750002,29.21997070312497],[84.02197265624997,29.25385742187504],[83.93593750000005,29.27949218750001],[83.58349609375003,29.18359375000003],[83.15546875000004,29.612646484375034],[82.22070312500003,30.063867187500023],[82.04335937500005,30.326757812500034],[81.8548828125,30.362402343750006],[81.64189453125007,30.3875],[81.4171875000001,30.33759765625001],[81.25507812500004,30.09331054687499],[81.17714843750005,30.039892578125034],[80.98544921875006,30.23710937499999],[80.87353515625003,30.290576171875045],[80.19121093750002,30.56840820312496],[80.20712890625006,30.683740234375023],[79.92451171875004,30.888769531250034],[79.66425781250004,30.96523437499999],[79.38847656250007,31.064208984375],[79.10712890625004,31.402636718750017],[78.74355468750005,31.323779296875017],[78.7550781250001,31.55029296875],[78.69345703125006,31.740380859374994],[78.72558593750003,31.983789062500023],[78.49589843750002,32.21577148437504],[78.4552734375001,32.30034179687502],[78.41748046874997,32.466699218749994],[78.38964843749997,32.51987304687498],[78.73671875,32.55839843750002],[78.75351562500012,32.49926757812506],[78.91894531249997,32.35820312500002],[79.16992187500003,32.497216796874994],[79.14550781250003,33.00146484375006],[79.10283203125007,33.05253906249996],[79.13515625000005,33.17192382812496],[79.1125,33.22626953125001],[78.94843750000004,33.346533203125006],[78.86503906250002,33.43110351562501],[78.78378906250006,33.80878906250004],[78.72666015625006,34.013378906249955],[78.97060546875,34.22822265625004],[78.93642578125,34.35195312500002],[78.86484375000006,34.39033203125001],[78.32695312500007,34.60639648437498],[78.15849609375002,34.94648437499998],[78.07578125000006,35.13491210937502],[78.0426757812501,35.47978515625002],[77.79941406250006,35.49589843750002],[77.44648437500004,35.47558593750006],[77.29482421875005,35.508154296875034],[77.09003906250004,35.55205078124999],[76.87890625000003,35.61328125000003],[76.76689453125002,35.661718750000034],[76.72753906250003,35.67866210937504],[76.63183593749997,35.729394531249966],[76.56347656249997,35.77299804687499],[76.55126953124997,35.887060546875034],[76.50205078125006,35.87822265625002],[76.38574218750003,35.837158203125],[76.25166015625004,35.8109375],[76.17783203125012,35.810546875],[76.14785156250005,35.82900390625002],[76.07089843750006,35.983007812500034],[75.91230468750004,36.048974609374994],[75.97441406250007,36.38242187500006],[75.9518554687501,36.458105468750034],[75.9330078125,36.52158203124998],[75.840234375,36.64970703124999],[75.7721679687501,36.694921875000034],[75.6671875000001,36.741992187500045],[75.57373046874997,36.75932617187502],[75.46025390625002,36.725048828124955],[75.42421875000005,36.73823242187498],[75.37685546875,36.88369140625005],[75.34667968749997,36.913476562499966],[75.05390625000004,36.98715820312498],[74.94912109375,36.96835937500006],[74.88925781250006,36.95244140625002],[74.69218750000007,37.035742187500006],[74.60058593749997,37.03666992187502],[74.54140625,37.02216796875001],[74.52646484375006,37.03066406250005],[74.49794921875,37.057226562500034],[74.37617187500004,37.13735351562502],[74.37216796875006,37.15771484375],[74.558984375,37.23662109374999],[74.66894531250003,37.266699218750006],[74.72666015625006,37.29072265625001],[74.7389648437501,37.28564453125003],[74.76738281250002,37.249169921874966],[74.840234375,37.22504882812504],[74.89130859375004,37.231640624999955],[75.11875,37.38569335937498],[74.8942382812501,37.60141601562498],[74.81230468750002,38.46030273437498],[74.27744140625,38.659765625000034],[74.02558593750004,38.53984375000002],[73.80166015625,38.60688476562501],[73.69609375000007,38.85429687499996],[73.8052734375,38.968652343749994],[73.60732421875,39.229199218749955],[73.63632812500006,39.396679687499955],[73.63164062500007,39.44887695312502],[73.82294921875004,39.48896484375004],[73.90712890625,39.578515624999966],[73.9146484375,39.60649414062499],[73.88251953125004,39.71455078124998],[73.83974609375005,39.76284179687505],[73.8353515625,39.800146484375006],[73.85625,39.828662109375045],[73.88457031250002,39.87792968750006],[73.93876953125002,39.97880859374999],[73.99160156250005,40.04311523437502],[74.83046875,40.32851562499999],[74.80126953124997,40.428515625000045],[74.83515625000004,40.482617187499955],[74.865625,40.493505859375034],[75.0044921875,40.44951171874996],[75.11132812499997,40.4541015625],[75.24101562500002,40.48027343750002],[75.52080078125002,40.627539062500006],[75.55556640625,40.625195312499955],[75.6771484375,40.305810546874994],[75.87197265625,40.30322265625],[76.25830078124997,40.43076171875006],[76.3185546875001,40.352246093749955],[76.39638671875005,40.389794921874966],[76.4801757812501,40.44951171874996],[76.57792968750002,40.577880859375],[76.62216796875006,40.66235351562497],[76.6398437500001,40.74223632812499],[76.66113281249997,40.77963867187498],[76.70839843750005,40.818115234375],[76.82402343750002,40.982324218749966],[76.90771484374997,41.02416992187497],[76.98662109375002,41.039160156250006],[77.58173828125004,40.99277343750006],[77.71933593750012,41.024316406249994],[77.81523437500002,41.05561523437498],[77.9564453125,41.05068359375005],[78.1234375,41.07563476562498],[78.34628906250012,41.28144531249998],[78.36240234375012,41.37163085937496],[78.44287109374997,41.41752929687499],[78.742578125,41.56005859375],[79.29355468750006,41.78281249999998],[79.76611328124997,41.89887695312501],[79.84042968750012,41.99575195312502],[79.90966796875003,42.014990234375034],[80.21621093750005,42.03242187500004],[80.23515625000007,42.04345703124997],[80.24619140625012,42.05981445312503],[80.209375,42.190039062500006],[80.20224609375012,42.73447265624998],[80.53896484375005,42.873486328124955],[80.39023437500006,43.043115234374966],[80.78574218750006,43.16157226562504],[80.35527343750002,44.09726562500006],[80.48154296875006,44.71464843749999],[79.871875,44.88378906249997],[80.05917968750012,45.006445312500006],[81.69199218750012,45.34936523437497],[81.94492187500006,45.16083984375001],[82.26660156249997,45.21909179687498],[82.52148437500003,45.12548828125],[82.61162109375007,45.424267578124955],[82.31523437500002,45.59492187499998],[83.02949218750004,47.18593750000002],[84.016015625,46.97050781250002],[84.66660156250006,46.97236328125004],[84.78613281249997,46.83071289062505],[85.484765625,47.06352539062496],[85.65664062500005,47.254638671875],[85.52597656250006,47.915625],[85.7494140625,48.38505859374999],[86.54941406250012,48.52861328125002],[86.8083007812501,49.04970703125002],[87.32285156250012,49.085791015625006],[87.41669921875004,49.07661132812501],[87.5158203125001,49.122412109375006],[87.7625,49.16582031249996],[87.81425781250002,49.162304687499955],[87.87216796875012,49.000146484374966],[87.74316406250003,48.88164062499999],[87.83183593750007,48.79165039062505],[88.02792968750006,48.735595703125],[88.06005859375003,48.707177734374966],[87.9796875000001,48.55512695312498],[88.30996093750005,48.47207031250002],[88.41396484375,48.403417968750006],[88.51708984374997,48.384472656249955],[88.56679687500005,48.31743164062496],[88.57597656250007,48.220166015624955],[88.68183593750004,48.170556640624994],[88.83828125000005,48.101708984374994],[88.91777343750007,48.089013671874966],[89.04765625000007,48.002539062500034],[89.47919921875004,48.02905273437503],[89.5609375,48.00395507812496],[89.778125,47.82700195312498],[89.83134765625002,47.82329101562502],[89.91044921875007,47.844335937500034],[89.95869140625004,47.88632812499998],[90.02792968750012,47.877685546875],[90.1032226562501,47.74541015624996],[90.19101562500012,47.70209960937501],[90.31328125000007,47.67617187499999],[90.33066406250006,47.655175781249966],[90.42519531250005,47.50410156250001],[90.49619140625012,47.28515625],[90.64335937500007,47.10029296874998],[90.71552734375004,47.00385742187498],[90.7990234375001,46.98515624999999],[90.86992187500002,46.95449218750005],[90.91054687500005,46.88325195312501],[90.9857421875,46.7490234375],[90.9115234375,46.270654296874994],[90.94755859375002,46.17729492187499],[90.99677734375004,46.10498046875],[91.00175781250007,46.03579101562502],[90.6618164062501,45.525244140625006],[90.87724609375002,45.19609375000002],[91.05,45.217431640624994],[91.584375,45.07651367187498],[92.42382812499997,45.008935546874994],[92.57890625000002,45.01098632812506],[92.78789062500007,45.035742187500034],[93.51621093750012,44.944482421874994],[94.71201171875012,44.35083007812503],[95.35029296875004,44.27807617187503],[95.32558593750005,44.03935546874999],[95.52558593750004,43.953955078125006],[95.85957031250004,43.27597656249998],[96.38544921875004,42.72036132812502],[97.20566406250012,42.78979492187506],[99.46787109375012,42.568212890625034],[99.98378906250005,42.67734375000006],[100.08632812500005,42.67075195312506],[100.51904296875003,42.61679687499998],[101.09199218750004,42.55131835937496],[101.49531250000004,42.53876953124998],[101.57910156249997,42.52353515624998],[101.65996093750002,42.50004882812499],[101.97294921875002,42.21586914062502],[102.15664062500005,42.158105468749966],[102.57519531249997,42.09208984375002],[103.07285156250006,42.00595703125006],[103.7111328125001,41.75131835937506],[103.99726562500004,41.796972656250034],[104.30517578124997,41.84614257812501],[104.49824218750004,41.87700195312499],[104.49824218750004,41.65869140625],[104.86035156250003,41.64375],[104.98203125000012,41.59550781250002],[105.05058593750002,41.61591796875001],[105.1154296875001,41.66328124999998],[105.19707031250002,41.738037109375],[105.31435546875005,41.77089843750005],[105.86757812500005,41.993994140625034],[106.77001953125003,42.28872070312502],[108.17119140625002,42.44731445312502],[108.68730468750002,42.416113281250034],[109.33984374999997,42.43837890625005],[109.44316406250002,42.455957031249994],[110.40039062499997,42.77368164062497],[111.00722656250005,43.34140624999998],[111.878125,43.68017578125],[111.93173828125012,43.81494140625],[111.40224609375005,44.367285156250006],[111.89804687500006,45.064062500000034],[112.03261718750005,45.08164062500006],[112.11289062500006,45.06293945312498],[112.41132812500004,45.05820312499998],[112.49931640625002,45.01093750000004],[112.59677734375006,44.917675781249955],[112.7067382812501,44.883447265624994],[113.04941406250006,44.81035156250002],[113.3009765625001,44.79165039062502],[113.50791015625006,44.76235351562502],[113.58701171875006,44.745703125],[113.65263671875002,44.76347656249999],[113.87705078125012,44.89619140625001],[114.03027343749997,44.942578124999955],[114.08027343750004,44.97114257812501],[114.41914062500004,45.20258789062501],[114.56015625000012,45.38999023437498],[114.73876953124997,45.41962890624998],[114.91923828125007,45.378271484375006],[115.16259765624997,45.390234375000034],[115.6810546875,45.45825195312503],[116.19765625,45.739355468750006],[116.240625,45.795996093750006],[116.22910156250012,45.84575195312502],[116.21298828125012,45.88691406249998],[116.56259765625012,46.28979492187497],[116.85908203125004,46.387939453125],[117.3333984375,46.36201171875004],[117.35693359375003,46.391308593749955],[117.35634765625,46.436669921874966],[117.39218750000012,46.53759765625003],[117.40556640625007,46.57089843750006],[117.43808593750012,46.58623046874999],[117.546875,46.58828125000005],[117.74121093749997,46.51816406250006],[118.07128906249997,46.666601562500006],[118.15683593750006,46.678564453125034],[118.30869140625012,46.71704101562497],[118.40439453125006,46.70317382812499],[118.58046875,46.69189453125],[118.64873046875002,46.70166015625006],[118.72294921875007,46.69189453125],[118.8439453125001,46.76020507812498],[118.95712890625006,46.73486328124997],[119.16210937499997,46.638671875],[119.33183593750002,46.61381835937499],[119.47402343750005,46.626660156249955],[119.62021484375006,46.60395507812504],[119.70664062500006,46.60600585937502],[119.74746093750005,46.62719726562497],[119.86718750000003,46.67216796874999],[119.89785156250005,46.857812499999966],[119.71113281250004,47.15],[119.08193359375,47.654150390625034],[119.01757812500003,47.68535156249999],[118.88027343750005,47.72509765625],[118.75996093750004,47.75761718749996],[118.69052734375012,47.822265625],[118.56777343750005,47.94326171875005],[118.49843750000005,47.98398437499998],[117.76835937500002,47.98789062499998],[117.3507812500001,47.65219726562498],[117.28593750000002,47.666357421875034],[117.06972656250005,47.80639648437506],[116.95166015624997,47.836572265624966],[116.90117187500007,47.85307617187496],[116.76054687500002,47.869775390624994],[116.65195312500012,47.86450195312497],[116.51347656250007,47.839550781249955],[116.37822265625002,47.84404296874999],[116.31718750000002,47.85986328125],[116.2311523437501,47.85820312500002],[116.07480468750012,47.78955078125],[115.99384765625004,47.71132812500005],[115.89824218750002,47.68691406250005],[115.6164062500001,47.874804687500045],[115.52509765625004,48.13085937499997],[115.63945312500007,48.18623046874998],[115.785546875,48.24824218750001],[115.7965820312501,48.346337890624994],[115.7916992187501,48.455712890624994],[115.8205078125001,48.57724609375006],[116.6833007812501,49.82377929687499],[117.8734375,49.51347656250002],[118.4515625,49.84448242187503],[119.25986328125012,50.06640625000003],[119.34628906250012,50.278955078124994],[119.16367187500006,50.40600585937503],[120.06689453125003,51.60068359375006],[120.74980468750007,52.096533203125006],[120.65615234375,52.56665039062503],[120.0675781250001,52.632910156250034],[120.09453125000007,52.787207031250034],[120.98544921875012,53.28457031250002],[123.6078125,53.546533203124994],[124.81230468750002,53.133837890625045],[125.075,53.20366210937496],[125.64902343750012,53.042285156250045],[126.34169921875,52.36201171875001],[126.92480468749997,51.10014648437496],[127.30703125000005,50.70795898437501],[127.33720703125007,50.35014648437502],[127.590234375,50.20898437500003],[127.55078124999997,49.801806640625045],[127.99960937500006,49.56860351562506],[128.70400390625,49.60014648437499],[129.0651367187501,49.374658203124966],[129.49814453125012,49.38881835937502],[130.1959960937501,48.89165039062499],[130.553125,48.861181640625006],[130.5521484375,48.602490234374955],[130.80429687500012,48.34150390624998],[130.7326171875001,48.01923828124998],[130.96191406249997,47.70932617187498],[132.47626953125004,47.714990234374994],[132.7072265625001,47.94726562500006],[133.14404296875003,48.10566406249998],[133.46835937500006,48.09716796875003],[134.29335937500005,48.37343750000002],[134.66523437500004,48.25390625],[134.56601562500006,48.02250976562502],[134.75234375,47.71542968749998],[134.1676757812501,47.30219726562501],[133.86132812500003,46.24775390625004],[133.43642578125,45.60468750000004],[133.18603515625003,45.49482421875004],[133.1134765625001,45.130712890625006],[132.93603515624997,45.029931640624994],[131.85185546875002,45.32685546875001],[131.44687500000012,44.984033203124966],[130.9816406250001,44.844335937500034],[131.2552734375,44.07158203124999],[131.25732421875003,43.378076171874994],[131.06855468750004,42.90224609375005],[130.42480468749997,42.72705078124997],[130.52695312500012,42.535400390625]]],[[[113.9977539062501,22.210498046875045],[113.83886718749997,22.24169921875003],[114.04394531250003,22.33339843750005],[113.9977539062501,22.210498046875045]]],[[[114.01542968750007,22.51191406250001],[114.26601562500005,22.540966796874983],[114.26796875,22.295556640624966],[113.93730468750002,22.364990234375],[114.01542968750007,22.51191406250001]]],[],[[[118.4074218750001,24.522119140624994],[118.43271484375006,24.414355468750074],[118.29511718750004,24.436328125000017],[118.4074218750001,24.522119140624994]]],[[[121.00878906249997,22.62036132812497],[120.83984375000003,21.925],[120.2328125,22.71791992187505],[120.0724609375001,23.149755859375006],[120.13212890625007,23.652929687500034],[121.040625,25.032812500000034],[121.59365234375,25.275341796874983],[121.92900390625002,24.973730468749977],[121.39746093750003,23.172509765625023],[121.00878906249997,22.62036132812497]]]]},"properties":{"name":"China","childNum":15}},{"geometry":{"type":"Polygon","coordinates":[[[-5.262304687499977,10.319677734374991],[-4.72177734374992,9.756542968750026],[-4.625830078125006,9.713574218749969],[-4.526611328124943,9.723486328125034],[-4.406201171874926,9.647998046875031],[-4.332226562499955,9.645703125],[-4.18115234375,9.78173828125],[-3.790625,9.917187499999983],[-3.581152343749977,9.924316406250014],[-3.289697265625023,9.882226562500051],[-3.223535156249937,9.895458984374997],[-3.160693359374932,9.849169921874974],[-3.095800781249949,9.752099609375009],[-3.042626953124937,9.72089843750004],[-2.988281249999972,9.687353515624963],[-2.900878906249943,9.534619140625026],[-2.875146484374937,9.500927734374997],[-2.816748046874949,9.425830078124974],[-2.766601562499943,9.424707031250009],[-2.7171875,9.457128906250048],[-2.695849609374989,9.481347656250009],[-2.686132812499977,9.43173828125002],[-2.705761718749983,9.351367187499989],[-2.74692382812492,9.04511718750004],[-2.689892578124955,9.02509765625004],[-2.649218750000017,8.956591796875031],[-2.600390625000017,8.800439453125023],[-2.505859375000028,8.208740234375],[-2.538281249999955,8.171630859374986],[-2.61171875,8.147558593749963],[-2.619970703125006,8.12109375],[-2.600976562499937,8.082226562499983],[-2.613378906249977,8.046679687500017],[-2.668847656249994,8.022216796875014],[-2.789746093749955,7.931933593750003],[-2.959082031249977,7.454541015624997],[-3.227148437499977,6.749121093749991],[-2.998291015624972,5.711328125000051],[-2.793652343749955,5.600097656250028],[-2.754980468749977,5.432519531249994],[-2.815673828125,5.153027343749997],[-3.168701171874972,5.203027343749966],[-3.199951171874943,5.3544921875],[-3.347558593749994,5.13066406249996],[-4.120166015625017,5.309716796875023],[-4.60888671875,5.235888671875003],[-4.037207031249977,5.23012695312498],[-4.899707031249932,5.138330078125023],[-5.282373046874994,5.210253906250017],[-5.36752929687492,5.15078125],[-5.061816406249989,5.13066406249996],[-5.913769531249926,5.0109375],[-7.544970703124989,4.351318359375],[-7.574658203124983,4.572314453124989],[-7.585058593749977,4.916748046875],[-7.39990234375,5.550585937499989],[-7.454394531249989,5.841308593749972],[-7.636132812499994,5.90771484375],[-7.730371093749994,5.919042968749991],[-7.800927734374994,6.038916015624991],[-7.833251953125,6.076367187499983],[-7.855517578125017,6.150146484375],[-7.888623046875011,6.234863281250028],[-7.981591796874937,6.2861328125],[-8.287109375,6.31904296875004],[-8.587890625,6.490527343749989],[-8.324511718749989,6.920019531249991],[-8.408740234374989,7.411816406249997],[-8.429980468749989,7.601855468749989],[-8.351757812499926,7.590576171875],[-8.231884765624955,7.556738281250034],[-8.205957031249994,7.590234375000023],[-8.115429687499926,7.760742187500028],[-8.126855468749937,7.867724609374974],[-8.00986328124992,8.078515625000023],[-8.048583984375,8.169726562500045],[-8.140625,8.181445312500031],[-8.217138671874949,8.219677734375011],[-8.256103515625,8.253710937500017],[-8.244140624999943,8.407910156249983],[-8.236962890624994,8.455664062500034],[-7.953125,8.477734375],[-7.823583984374977,8.467675781249994],[-7.738964843749983,8.375244140624986],[-7.696093749999932,8.375585937499977],[-7.71958007812492,8.643017578125011],[-7.950976562499989,8.786816406249997],[-7.938183593749983,8.97978515624996],[-7.902099609375,9.017089843750014],[-7.777978515624937,9.080859375000031],[-7.799804687499943,9.115039062499989],[-7.839404296875017,9.151611328124972],[-7.918066406249949,9.188525390625031],[-7.896191406249955,9.415869140624991],[-8.136962890624972,9.49570312499999],[-8.155175781249937,9.973193359375017],[-7.990625,10.1625],[-7.661132812500028,10.427441406250011],[-7.385058593749989,10.340136718749989],[-7.01708984375,10.143261718750026],[-6.950341796874994,10.342333984374989],[-6.693261718750023,10.34946289062502],[-6.669335937499937,10.39218750000002],[-6.69199218749992,10.512011718750017],[-6.686132812499977,10.578027343750051],[-6.676367187499949,10.633789062500043],[-6.654150390624949,10.65644531250004],[-6.482617187499983,10.561230468749997],[-6.250244140625,10.717919921875037],[-6.190673828124943,10.400292968749994],[-6.192626953124972,10.369433593750003],[-6.241308593749949,10.279199218750009],[-6.238378906249977,10.26162109374998],[-6.117187499999972,10.201904296874986],[-6.034570312499937,10.194824218750057],[-5.907568359375006,10.307226562500034],[-5.896191406249983,10.354736328125028],[-5.843847656249977,10.389550781250023],[-5.694287109374983,10.433203125000034],[-5.556591796874983,10.439941406249986],[-5.382275390625011,10.314013671875003],[-5.262304687499977,10.319677734374991]]]},"properties":{"name":"Côte d'Ivoire","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[15.480078125,7.523779296874991],[15.206738281250011,7.206152343749991],[14.7392578125,6.27978515625],[14.43115234375,6.038720703124994],[14.616894531250011,5.865136718749994],[14.56298828125,5.279931640624994],[14.73125,4.602392578124991],[15.063574218750006,4.284863281249997],[15.128710937500017,3.826904296875],[16.0634765625,2.90859375],[16.183398437500017,2.270068359374989],[16.059375,1.676220703124997],[15.741601562500023,1.914990234374997],[14.902441406250006,2.012304687499991],[14.578906250000017,2.199121093749994],[13.293554687500006,2.161572265624997],[13.2203125,2.256445312499991],[11.558984375000023,2.302197265624997],[11.348437500000017,2.299707031249994],[11.328710937500006,2.167431640624997],[11.096582031250023,2.16748046875],[10.790917968750023,2.16757812499999],[9.979882812500023,2.167773437499989],[9.8701171875,2.21328125],[9.8369140625,2.242382812499997],[9.830371093750017,2.275488281249991],[9.826171875,2.297802734374997],[9.80078125,2.304443359375],[9.82177734375,2.539257812499997],[9.948437500000011,3.079052734374997],[9.672070312500011,3.53759765625],[9.765722656250006,3.623828124999989],[9.642382812500017,3.611767578124997],[9.55615234375,3.798046875],[9.739648437500023,3.852929687499994],[9.639941406250017,3.96533203125],[9.688867187500023,4.056396484375],[9.483691406250017,4.066113281249997],[9.42529296875,3.922314453124997],[9.000097656250006,4.091601562499989],[8.918261718750017,4.553759765624989],[8.660351562500011,4.670996093749991],[8.65625,4.516357421875],[8.53955078125,4.571875],[8.715625,5.046875],[8.997167968750006,5.917724609375],[9.490234375,6.418652343749997],[9.779882812500006,6.76015625],[9.820703125000023,6.783935546875],[9.874218750000011,6.803271484374989],[10.038867187500017,6.92138671875],[10.1435546875,6.996435546874991],[10.167773437500017,6.959179687499997],[10.185546875,6.912792968749997],[10.205468750000023,6.8916015625],[10.293066406250006,6.876757812499989],[10.413183593750006,6.877734374999989],[10.60625,7.063085937499991],[10.954199218750006,6.7765625],[11.032519531250017,6.697900390624994],[11.1064453125,6.457714843749997],[11.1533203125,6.437939453124997],[11.2373046875,6.450537109374991],[11.401757812500023,6.533935546875],[11.551660156250023,6.697265625],[11.580078125,6.888867187499997],[11.657519531250017,6.9515625],[11.861425781250006,7.11640625],[11.767382812500017,7.272265624999989],[11.809179687500006,7.345068359374991],[12.016015625000023,7.589746093749994],[12.2333984375,8.282324218749991],[12.403515625000011,8.595556640624991],[12.582714843750011,8.624121093749991],[12.651562500000011,8.667773437499989],[12.7822265625,8.81787109375],[12.806542968750023,8.886621093749994],[12.875683593750011,9.303515624999989],[12.929492187500017,9.42626953125],[13.19873046875,9.563769531249989],[13.269921875000023,10.036181640624989],[13.41455078125,10.171435546874989],[13.535351562500011,10.60507812499999],[13.699902343750011,10.873144531249991],[13.89208984375,11.140087890624997],[13.9814453125,11.211865234374997],[14.056738281250006,11.245019531249994],[14.143261718750011,11.24853515625],[14.202343750000011,11.268164062499991],[14.559765625000011,11.492285156249991],[14.619726562500006,12.150976562499991],[14.518945312500023,12.298242187499994],[14.272851562500023,12.356494140624989],[14.184863281250017,12.447216796874997],[14.06396484375,13.07851562499999],[14.244824218750011,13.07734375],[14.461718750000017,13.021777343749989],[14.847070312500023,12.502099609374994],[15.08125,11.845507812499989],[15.029882812500006,11.11367187499999],[15.132226562500023,10.648486328124989],[15.276074218750011,10.357373046874997],[15.654882812500006,10.0078125],[14.243261718750006,9.979736328125],[13.977246093750011,9.691552734374994],[14.332324218750017,9.20351562499999],[15.1162109375,8.557324218749997],[15.5498046875,7.787890624999989],[15.480078125,7.523779296874991]]]},"properties":{"name":"Cameroon","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[27.4033203125,5.109179687499989],[27.7880859375,4.644677734374994],[28.19208984375001,4.350244140624994],[28.427539062500017,4.324169921874997],[28.72705078125,4.504980468749991],[29.224902343750017,4.391894531249989],[29.469628906250023,4.61181640625],[29.676855468750006,4.5869140625],[30.194921875,3.98193359375],[30.50830078125,3.835693359375],[30.586718750000017,3.62421875],[30.757226562500023,3.62421875],[30.83857421875001,3.49072265625],[30.90644531250001,3.408935546875],[30.754003906250006,3.041796874999989],[30.8466796875,2.847021484374991],[30.728613281250006,2.455371093749989],[31.176367187500006,2.270068359374989],[31.252734375000017,2.044580078124994],[29.94287109375,0.819238281249994],[29.934472656250023,0.4990234375],[29.717675781250023,0.098339843749997],[29.576953125000017,-1.387890625000011],[29.196582031250017,-1.719921875000011],[29.13154296875001,-2.195117187500003],[28.876367187500023,-2.400292968750009],[28.893945312500023,-2.635058593750003],[29.01435546875001,-2.72021484375],[29.224414062500017,-3.053515625],[29.211816406250023,-3.833789062500003],[29.403222656250023,-4.449316406250006],[29.404199218750023,-4.496679687500006],[29.32568359375,-4.835644531250011],[29.32343750000001,-4.898828125],[29.3427734375,-4.983105468750011],[29.542382812500023,-5.499804687500003],[29.594140625000023,-5.65078125],[29.60703125,-5.72265625],[29.59638671875001,-5.775976562500006],[29.490820312500006,-5.965429687500006],[29.480078125,-6.025],[29.50625,-6.172070312500011],[29.540820312500017,-6.313867187500009],[29.590625,-6.394433593750009],[29.70966796875001,-6.616894531250011],[29.798144531250017,-6.69189453125],[29.961816406250023,-6.803125],[30.10625,-6.9150390625],[30.212695312500017,-7.037890625],[30.31318359375001,-7.203710937500006],[30.40673828125,-7.460644531250011],[30.75117187500001,-8.193652343750003],[28.89814453125001,-8.485449218750006],[28.869531250000023,-8.785839843750011],[28.400683593750017,-9.224804687500011],[28.60419921875001,-9.678808593750006],[28.6455078125,-10.550195312500009],[28.383398437500006,-11.566699218750003],[28.482519531250006,-11.812109375],[29.064355468750023,-12.348828125000011],[29.48554687500001,-12.41845703125],[29.508203125000023,-12.228222656250011],[29.79511718750001,-12.155468750000011],[29.775195312500017,-13.438085937500006],[29.55419921875,-13.248925781250009],[29.20185546875001,-13.398339843750009],[29.014257812500006,-13.368847656250011],[28.730078125,-12.925488281250011],[28.550878906250006,-12.836132812500011],[28.412890625000017,-12.51806640625],[27.573828125,-12.22705078125],[27.1591796875,-11.579199218750006],[26.824023437500017,-11.965234375],[26.025976562500006,-11.89013671875],[25.349414062500017,-11.623046875],[25.28876953125001,-11.21240234375],[24.3779296875,-11.417089843750006],[24.36572265625,-11.1298828125],[23.96650390625001,-10.871777343750011],[23.901171875000017,-10.983203125],[23.833886718750023,-11.013671875],[23.463964843750006,-10.969335937500006],[23.076269531250006,-11.087890625],[22.814746093750017,-11.080273437500011],[22.56103515625,-11.055859375000011],[22.486132812500017,-11.08671875],[22.392968750000023,-11.159472656250003],[22.31494140625,-11.198632812500009],[22.27880859375,-11.194140625],[22.226171875,-11.121972656250009],[22.203515625000023,-10.829492187500009],[22.307031250000023,-10.691308593750009],[22.19775390625,-10.040625],[21.81318359375001,-9.46875],[21.905371093750006,-8.693359375],[21.806054687500023,-7.32861328125],[21.751074218750006,-7.30546875],[21.190332031250023,-7.284960937500003],[20.910937500000017,-7.281445312500011],[20.607812500000023,-7.277734375],[20.558398437500017,-7.244433593750003],[20.53583984375001,-7.182812500000011],[20.536914062500017,-7.121777343750011],[20.598730468750006,-6.93515625],[20.59003906250001,-6.919921875],[20.482226562500017,-6.915820312500003],[20.190039062500006,-6.9462890625],[19.997460937500023,-6.976464843750009],[19.87519531250001,-6.986328125],[19.527636718750017,-7.144433593750009],[19.483789062500023,-7.279492187500011],[19.479882812500023,-7.47216796875],[19.371679687500006,-7.655078125],[19.369921875000017,-7.70654296875],[19.3408203125,-7.966601562500003],[19.142675781250006,-8.00146484375],[18.944433593750006,-8.00146484375],[18.56269531250001,-7.9359375],[18.0087890625,-8.107617187500011],[17.643359375000017,-8.090722656250009],[17.57958984375,-8.099023437500009],[16.984765625000023,-7.257421875],[16.91943359375,-6.933984375],[16.813085937500006,-6.772558593750006],[16.742968750000017,-6.618457031250003],[16.697265625,-6.164257812500011],[16.537109375,-5.9658203125],[16.431445312500017,-5.900195312500003],[16.315234375000017,-5.865625],[13.978515625,-5.857226562500003],[13.346484375000017,-5.863378906250006],[13.184375,-5.85625],[12.452929687500017,-6.00048828125],[12.213671875000017,-5.758691406250009],[12.484570312500011,-5.71875],[12.451464843750017,-5.071484375000011],[12.502734375000017,-5.036914062500003],[12.573535156250017,-4.99658203125],[12.59619140625,-4.978417968750009],[12.8296875,-4.736621093750003],[12.947460937500011,-4.6953125],[13.057324218750011,-4.651074218750011],[13.07275390625,-4.634765625],[13.08740234375,-4.601953125],[13.136621093750023,-4.604296875],[13.414941406250023,-4.83740234375],[13.659570312500023,-4.721484375],[13.717089843750017,-4.454492187500009],[13.94091796875,-4.484667968750003],[14.358300781250023,-4.299414062500006],[14.449804687500006,-4.449511718750003],[14.365429687500011,-4.585546875],[14.410742187500006,-4.83125],[14.707910156250023,-4.881738281250009],[15.990039062500017,-3.766210937500006],[16.217382812500006,-3.0302734375],[16.21533203125,-2.177832031250006],[16.54072265625001,-1.840136718750003],[16.8798828125,-1.225878906250003],[17.752832031250023,-0.549023437500011],[18.072167968750023,2.01328125],[18.49091796875001,2.924414062499991],[18.6103515625,3.478417968749994],[18.594140625000023,4.346240234374989],[19.06855468750001,4.891406249999989],[19.5009765625,5.127490234374989],[19.806542968750023,5.089306640624997],[20.226367187500017,4.829638671874989],[20.55810546875,4.462695312499989],[22.422167968750017,4.134960937499997],[22.864550781250017,4.723876953125],[23.41718750000001,4.663134765624989],[24.31982421875,4.994140625],[25.065234375000017,4.967431640624994],[25.52509765625001,5.31210937499999],[26.822070312500017,5.062402343749994],[27.071875,5.199755859374989],[27.4033203125,5.109179687499989]]]},"properties":{"name":"Dem. Rep. Congo","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[18.6103515625,3.478417968749994],[18.49091796875001,2.924414062499991],[18.072167968750023,2.01328125],[17.752832031250023,-0.549023437500011],[16.8798828125,-1.225878906250003],[16.54072265625001,-1.840136718750003],[16.21533203125,-2.177832031250006],[16.217382812500006,-3.0302734375],[15.990039062500017,-3.766210937500006],[14.707910156250023,-4.881738281250009],[14.410742187500006,-4.83125],[14.365429687500011,-4.585546875],[14.449804687500006,-4.449511718750003],[14.358300781250023,-4.299414062500006],[13.94091796875,-4.484667968750003],[13.717089843750017,-4.454492187500009],[13.659570312500023,-4.721484375],[13.414941406250023,-4.83740234375],[13.136621093750023,-4.604296875],[13.08740234375,-4.601953125],[13.07275390625,-4.634765625],[13.048046875000011,-4.619238281250006],[12.971386718750011,-4.5517578125],[12.881054687500011,-4.445117187500003],[12.84814453125,-4.428906250000011],[12.50146484375,-4.5875],[12.018359375000017,-5.004296875],[11.777539062500011,-4.565820312500009],[11.130175781250017,-3.916308593750003],[11.234472656250006,-3.690820312500009],[11.504296875000023,-3.5203125],[11.685742187500011,-3.68203125],[11.8798828125,-3.665917968750009],[11.934179687500006,-3.318554687500011],[11.715429687500006,-3.176953125000011],[11.760156250000023,-2.983105468750011],[11.537792968750011,-2.83671875],[11.60546875,-2.342578125],[12.064453125,-2.41259765625],[12.446386718750006,-2.329980468750009],[12.43212890625,-1.928906250000011],[12.590429687500006,-1.826855468750011],[12.793554687500006,-1.931835937500011],[12.991992187500017,-2.313378906250009],[13.464941406250006,-2.395410156250009],[13.733789062500023,-2.138476562500003],[13.886914062500011,-2.465429687500006],[13.993847656250011,-2.490625],[14.199804687500006,-2.354199218750011],[14.162890625000017,-2.217578125],[14.383984375000011,-1.890039062500009],[14.47412109375,-0.573437500000011],[13.860058593750011,-0.203320312500011],[13.949609375000023,0.353808593749989],[14.32421875,0.62421875],[14.429882812500011,0.901464843749991],[14.180859375000011,1.370214843749991],[13.851367187500017,1.41875],[13.21630859375,1.2484375],[13.172167968750017,1.78857421875],[13.293554687500006,2.161572265624997],[14.578906250000017,2.199121093749994],[14.902441406250006,2.012304687499991],[15.741601562500023,1.914990234374997],[16.059375,1.676220703124997],[16.183398437500017,2.270068359374989],[16.468554687500017,2.831738281249997],[16.610742187500023,3.50537109375],[17.491601562500023,3.687304687499989],[18.160937500000017,3.499804687499989],[18.474414062500017,3.622998046874997],[18.6103515625,3.478417968749994]]]},"properties":{"name":"Congo","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-71.31972656249997,11.861914062500048],[-71.95810546875,11.66640625],[-72.24848632812501,11.196435546875009],[-72.690087890625,10.835839843749994],[-72.86933593750001,10.49125976562496],[-73.00654296874998,9.789160156250006],[-73.36621093749997,9.194140625000017],[-73.05839843749999,9.259570312500031],[-72.79638671874997,9.10898437499999],[-72.66542968749994,8.62758789062498],[-72.39033203124995,8.287060546874969],[-72.47197265624996,7.524267578124991],[-72.20771484374995,7.37026367187498],[-72.00664062499993,7.032617187500023],[-71.12861328124993,6.98671875],[-70.73715820312503,7.090039062499997],[-70.12919921874999,6.95361328125],[-69.42714843749997,6.123974609374997],[-68.47177734375,6.156542968749974],[-67.85917968749999,6.289892578124963],[-67.48198242187499,6.18027343750002],[-67.47387695312503,5.929980468750003],[-67.82490234374995,5.270458984375026],[-67.85527343750002,4.506884765624989],[-67.66162109375,3.864257812499986],[-67.3111328125,3.41586914062502],[-67.85908203124998,2.793603515624994],[-67.61870117187496,2.793603515624994],[-67.21083984375,2.390136718750043],[-66.87602539062499,1.223046875000037],[-67.082275390625,1.185400390625006],[-67.11923828124998,1.703613281249986],[-67.40043945312499,2.116699218750028],[-67.93623046874998,1.748486328124969],[-68.19379882812495,1.987011718749983],[-68.25595703125,1.845507812500017],[-68.17656249999999,1.719824218749991],[-69.84858398437493,1.708740234375043],[-69.85214843750003,1.05952148437504],[-69.31181640624999,1.050488281249969],[-69.15332031249994,0.65878906250002],[-69.47211914062498,0.72993164062504],[-70.05390624999993,0.578613281250028],[-70.07050781249993,-0.13886718750004],[-69.63398437500001,-0.50927734375],[-69.40024414062498,-1.194921874999977],[-69.66904296875003,-2.667675781249997],[-69.94819335937498,-4.200585937500009],[-69.96591796875003,-4.2359375],[-70.16752929687499,-4.050195312500009],[-70.24028320312496,-3.882714843749994],[-70.2984375,-3.844238281249972],[-70.33950195312502,-3.814355468750009],[-70.73510742187497,-3.781542968749989],[-70.09584960937494,-2.658203125000014],[-70.16474609374995,-2.639843750000011],[-70.24443359375002,-2.606542968749977],[-70.29462890624995,-2.552539062499989],[-70.57587890624995,-2.418261718749989],[-70.64799804687499,-2.405761718750014],[-70.70537109374996,-2.341992187499983],[-70.91455078125003,-2.218554687499974],[-70.96855468750002,-2.206835937499989],[-71.02729492187498,-2.225781250000026],[-71.11337890625003,-2.245410156250031],[-71.19638671874998,-2.313085937499963],[-71.39697265625,-2.334082031249977],[-71.55947265624997,-2.224218749999977],[-71.75253906249995,-2.15273437499998],[-71.80273437499997,-2.166308593749989],[-71.86728515624998,-2.227734374999983],[-71.932470703125,-2.288671874999963],[-71.98427734375,-2.326562499999952],[-72.21845703125001,-2.400488281250006],[-72.94111328124998,-2.394042968750028],[-72.9896484375,-2.33974609374998],[-73.15449218749993,-2.278222656249966],[-73.19697265624995,-1.830273437500011],[-73.49628906249993,-1.69306640625004],[-73.66430664062497,-1.248828124999946],[-73.86318359374997,-1.19667968749998],[-73.92695312500001,-1.125195312499983],[-73.98681640625003,-1.098144531249986],[-74.05439453124995,-1.028613281250031],[-74.18076171875,-0.997753906249955],[-74.24638671874999,-0.970605468750023],[-74.28388671874998,-0.927832031250006],[-74.33442382812498,-0.85087890624996],[-74.41787109375,-0.580664062499977],[-74.46518554687498,-0.517675781250034],[-74.51386718749993,-0.470117187500023],[-74.555078125,-0.429882812499997],[-74.61635742187494,-0.370019531249966],[-74.691650390625,-0.335253906249989],[-74.75537109375003,-0.298632812499989],[-74.78046874999998,-0.24453125],[-74.80175781249997,-0.200097656249994],[-75.13837890624998,-0.050488281249969],[-75.28447265624999,-0.10654296875002],[-75.77666015624999,0.08925781249998],[-76.27060546874998,0.439404296874997],[-76.49462890624997,0.23544921875002],[-77.396337890625,0.393896484374963],[-77.46767578124997,0.636523437500017],[-77.702880859375,0.837841796874997],[-78.1806640625,0.968554687499974],[-78.85966796874996,1.455371093750031],[-79.02543945312499,1.623681640625037],[-78.79296874999994,1.848730468749963],[-78.576904296875,1.773779296874977],[-78.59169921875,2.356640624999969],[-78.41689453125,2.483496093749963],[-78.06665039062494,2.509130859375034],[-77.81357421875,2.716357421874974],[-77.076806640625,3.913281250000026],[-77.26352539062503,3.893212890625023],[-77.27802734374995,4.058496093750023],[-77.35820312499996,3.944726562500037],[-77.40874023437496,4.24775390625004],[-77.52070312499993,4.212792968750023],[-77.35351562499997,4.398291015624977],[-77.28632812499995,4.72172851562496],[-77.373291015625,5.323974609375],[-77.53442382812497,5.537109374999986],[-77.24926757812497,5.780175781250037],[-77.46943359374995,6.176757812500014],[-77.368798828125,6.575585937499994],[-77.90117187499999,7.229345703125048],[-77.76191406249995,7.698828125000034],[-77.53828124999995,7.56625976562502],[-77.19599609374995,7.972460937500003],[-77.47851562499994,8.498437500000037],[-77.37421874999993,8.65830078125002],[-76.85185546875002,8.09047851562498],[-76.924658203125,7.973193359374974],[-76.78657226562493,7.931591796875026],[-76.7720703125,8.310546875000043],[-76.92045898437496,8.573730468750014],[-76.27685546875,8.989111328124991],[-76.02724609374997,9.365771484374989],[-75.63935546874998,9.450439453125014],[-75.680029296875,9.729785156249989],[-75.53857421874997,10.205175781250034],[-75.708349609375,10.143408203124963],[-75.44599609374995,10.610888671874989],[-74.84458007812498,11.109716796875006],[-74.330224609375,10.996679687499991],[-74.51625976562497,10.8625],[-74.40087890625,10.76523437499999],[-74.14291992187503,11.320849609375031],[-73.31337890624997,11.295751953124991],[-72.275,11.88925781250002],[-72.13574218749994,12.188574218749977],[-71.71455078124993,12.41997070312496],[-71.26210937499997,12.335302734375034],[-71.13730468750003,12.04633789062504],[-71.31972656249997,11.861914062500048]]]},"properties":{"name":"Colombia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[43.788671875,-12.307031250000023],[43.85898437500006,-12.368261718749977],[43.66367187500006,-12.342871093749949],[43.63134765624997,-12.247070312499972],[43.788671875,-12.307031250000023]]],[[[44.476367187500074,-12.08154296875],[44.504980468750006,-12.356542968749991],[44.220117187499994,-12.171386718750014],[44.476367187500074,-12.08154296875]]],[[[43.46582031249997,-11.901269531249966],[43.226660156250006,-11.75185546874998],[43.2990234375001,-11.374511718750028],[43.39296875000005,-11.408593749999952],[43.46582031249997,-11.901269531249966]]]]},"properties":{"name":"Comoros","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-24.308251953124966,14.856298828124991],[-24.44052734374992,14.834814453124963],[-24.496875,14.980273437500017],[-24.329492187499937,15.019482421875011],[-24.308251953124966,14.856298828124991]]],[[[-23.18212890624997,15.136767578125017],[-23.210253906250017,15.32353515625006],[-23.119335937499955,15.26840820312502],[-23.18212890624997,15.136767578125017]]],[[[-23.444238281249994,15.00795898437498],[-23.5046875,14.916113281250006],[-23.70537109374999,14.96132812499998],[-23.74809570312499,15.328515625],[-23.444238281249994,15.00795898437498]]],[[[-22.917724609375,16.237255859374955],[-22.69262695312497,16.169042968750006],[-22.710107421874994,16.043359374999966],[-22.95927734374996,16.045117187499983],[-22.917724609375,16.237255859374955]]],[[[-24.08769531249999,16.62250976562501],[-24.03271484374997,16.57202148437503],[-24.243066406250023,16.599414062500017],[-24.32236328124992,16.49311523437504],[-24.398095703124966,16.61840820312497],[-24.08769531249999,16.62250976562501]]],[[[-22.888330078124966,16.659082031249994],[-22.980615234374937,16.700878906249983],[-22.93291015624999,16.84101562500004],[-22.888330078124966,16.659082031249994]]],[[[-24.88706054687495,16.81811523437497],[-25.09306640624999,16.83251953125],[-24.936474609374983,16.92211914062503],[-24.88706054687495,16.81811523437497]]],[[[-25.169824218749994,16.94648437500001],[-25.308300781249955,16.93583984374999],[-25.337109374999955,17.091015624999983],[-25.03466796875,17.176464843749983],[-24.979687499999983,17.09472656250003],[-25.169824218749994,16.94648437500001]]]]},"properties":{"name":"Cape Verde","childNum":8}},{"geometry":{"type":"Polygon","coordinates":[[[-83.6419921875,10.917236328125],[-83.346826171875,10.315380859374997],[-82.77841796874999,9.66953125],[-82.56357421874999,9.57666015625],[-82.56923828125,9.55820312499999],[-82.58652343749999,9.538818359375],[-82.64409179687499,9.505859375],[-82.801025390625,9.591796875],[-82.843994140625,9.57080078125],[-82.86015624999999,9.511474609375],[-82.88896484374999,9.481005859374989],[-82.925048828125,9.469042968749989],[-82.93984375,9.449169921874997],[-82.94033203125,9.060107421874989],[-82.88134765625,9.055859375],[-82.78305664062499,8.990283203124989],[-82.741162109375,8.951708984374989],[-82.72783203124999,8.916064453124989],[-82.91704101562499,8.740332031249991],[-82.855712890625,8.635302734374989],[-82.84477539062499,8.489355468749991],[-82.86162109374999,8.45351562499999],[-83.02734375,8.337744140624991],[-82.879345703125,8.070654296874991],[-83.12333984374999,8.353076171874989],[-83.16240234374999,8.588183593749989],[-83.4697265625,8.706835937499989],[-83.29150390625,8.406005859375],[-83.54375,8.445849609374989],[-83.73408203125,8.614453125],[-83.613720703125,8.804052734374991],[-83.73691406249999,9.150292968749994],[-84.58159179687499,9.568359375],[-84.71494140624999,9.8994140625],[-85.23564453124999,10.242089843749994],[-85.2365234375,10.107373046874997],[-84.88642578125,9.820947265624994],[-85.07705078125,9.60195312499999],[-85.31455078124999,9.8109375],[-85.62485351562499,9.902441406249991],[-85.84965820312499,10.292041015624989],[-85.667236328125,10.745019531249994],[-85.90800781249999,10.897558593749991],[-85.7443359375,11.06210937499999],[-85.5841796875,11.189453125],[-84.9091796875,10.9453125],[-84.6341796875,11.045605468749997],[-83.91928710937499,10.7353515625],[-83.71293945312499,10.785888671875],[-83.6419921875,10.917236328125]]]},"properties":{"name":"Costa Rica","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-82.56176757812503,21.571679687500023],[-82.959619140625,21.441308593750023],[-83.18378906250001,21.59345703125004],[-82.97358398437498,21.592285156250057],[-83.08251953124997,21.791406250000023],[-82.99121093750003,21.942724609375034],[-82.71455078124998,21.890283203125023],[-82.56176757812503,21.571679687500023]]],[[[-77.66899414062493,21.951953125000045],[-77.91855468749998,22.088085937499983],[-77.63369140624994,22.054003906250074],[-77.66899414062493,21.951953125000045]]],[[[-77.87939453125,22.127539062500034],[-78.04165039062502,22.201269531250034],[-77.99921874999998,22.298730468749994],[-77.87939453125,22.127539062500034]]],[[[-81.83745117187499,23.163037109374955],[-81.26235351562497,23.156835937500034],[-81.14462890624998,23.054931640625057],[-80.65014648437494,23.10307617187499],[-80.36489257812502,22.943408203125074],[-79.82026367187498,22.887011718750045],[-79.27568359374999,22.407617187499994],[-78.68647460937493,22.366845703125023],[-77.63681640624995,21.79736328125],[-77.49711914062502,21.78833007812503],[-77.58315429687497,21.889257812499977],[-77.49726562499995,21.871630859375045],[-77.14414062499995,21.643603515625017],[-77.36616210937498,21.612646484375034],[-77.25288085937498,21.483496093750006],[-77.0986328125,21.589013671875023],[-76.86743164062497,21.330419921875006],[-75.72294921874996,21.111035156249983],[-75.59580078125,20.99467773437499],[-75.72456054687493,20.71455078125004],[-74.882568359375,20.65063476562497],[-74.51313476562495,20.384570312500045],[-74.16748046874997,20.292187499999955],[-74.15371093750002,20.168554687500006],[-75.11640624999995,19.901416015625017],[-75.151611328125,20.008349609375045],[-75.29047851562495,19.893115234375017],[-76.15844726562497,19.98974609374997],[-77.715087890625,19.85546874999997],[-77.10380859374999,20.407519531250017],[-77.22958984374995,20.64375],[-78.11635742187497,20.761865234374994],[-78.49077148437493,21.05371093750003],[-78.72768554687497,21.592724609374955],[-79.35742187500003,21.58515625000001],[-80.23134765625,21.872167968750063],[-80.48544921874998,22.1234375],[-81.03564453124997,22.073583984375063],[-81.18549804687495,22.26796875000005],[-81.284375,22.109423828125074],[-81.84941406249993,22.21367187499999],[-82.077734375,22.3876953125],[-81.71035156250002,22.496679687500006],[-81.83881835937498,22.672460937500034],[-82.73803710937497,22.689257812500074],[-83.37963867187503,22.222998046875034],[-83.90073242187495,22.17011718750001],[-84.03095703124993,21.94311523437503],[-84.502587890625,21.776171875000045],[-84.50136718750002,21.930273437499977],[-84.88720703125003,21.856982421875074],[-84.32636718749998,22.074316406250034],[-84.36127929687498,22.37890625],[-84.04492187500003,22.666015625000057],[-83.25781249999997,22.967578125000017],[-81.83745117187499,23.163037109374955]]]]},"properties":{"name":"Cuba","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[-68.75107421874999,12.059765625],[-68.9951171875,12.141845703125],[-69.15888671875,12.380273437499994],[-68.75107421874999,12.059765625]]]},"properties":{"name":"Curaçao","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.36953124999997,19.34887695312497],[-81.10712890624995,19.305175781250057],[-81.40478515624994,19.278417968750006],[-81.36953124999997,19.34887695312497]]],[[[-79.823388671875,19.711914062500057],[-79.90620117187501,19.702539062499994],[-79.74228515625,19.757128906250017],[-79.823388671875,19.711914062500057]]]]},"properties":{"name":"Cayman Is.","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[34.004492187500006,35.065234375],[33.47578125000001,35.000341796875],[33.3837890625,35.1626953125],[32.91953125,35.087841796875],[32.71269531250002,35.171044921874994],[32.8798828125,35.180566406249994],[32.94160156250001,35.390429687499996],[33.60761718750001,35.354150390624994],[34.55605468750002,35.662060546875],[33.941992187500006,35.292041015624996],[34.004492187500006,35.065234375]]]},"properties":{"name":"N. Cyprus","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[32.71269531250002,35.171044921874994],[32.91953125,35.087841796875],[33.3837890625,35.1626953125],[33.47578125000001,35.000341796875],[34.004492187500006,35.065234375],[34.05019531250002,34.98837890625],[33.69941406250001,34.969873046874994],[33.007910156250006,34.569580078125],[32.44902343750002,34.729443359375],[32.31718750000002,34.9533203125],[32.30097656250001,35.082958984375],[32.71269531250002,35.171044921874994]]]},"properties":{"name":"Cyprus","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[14.809375,50.858984375],[14.895800781250017,50.861376953124996],[14.98291015625,50.886572265625],[14.99375,51.01435546875],[16.007226562500023,50.611621093749996],[16.2822265625,50.655615234375],[16.419726562500017,50.573632812499994],[16.210351562500023,50.423730468749994],[16.63916015625,50.1021484375],[16.989648437500023,50.2369140625],[16.88007812500001,50.427050781249996],[17.41523437500001,50.254785156249994],[17.702246093750006,50.307177734374996],[17.627050781250006,50.11640625],[17.874804687500017,49.972265625],[18.0283203125,50.03525390625],[18.562402343750023,49.879345703125],[18.83222656250001,49.510791015624996],[18.160937500000017,49.257373046874996],[18.0859375,49.06513671875],[17.75849609375001,48.888134765625],[17.135644531250023,48.841064453125],[16.953125,48.598828125],[16.543554687500006,48.796240234375],[16.057226562500006,48.754785156249994],[15.066796875000023,48.997851562499996],[14.691308593750023,48.59921875],[14.049121093750017,48.602490234375],[13.814746093750017,48.766943359375],[13.769921875000023,48.815966796874996],[13.684960937500023,48.876708984375],[13.547656250000017,48.95966796875],[13.440722656250017,48.95556640625],[13.401171875000017,48.977587890624996],[12.916699218750011,49.33046875],[12.68115234375,49.414501953125],[12.390527343750023,49.739648437499994],[12.5125,49.87744140625],[12.09921875,50.310986328125],[12.134863281250006,50.3109375],[12.1748046875,50.288378906249996],[12.231152343750011,50.244873046875],[12.27734375,50.181445312499996],[12.3056640625,50.205712890624994],[12.549023437500011,50.393408203125],[13.016406250000017,50.490380859374994],[13.18115234375,50.510498046875],[14.369042968750023,50.898730468749996],[14.319726562500023,51.03779296875],[14.545703125000017,50.993945312499996],[14.559667968750006,50.954931640625],[14.59521484375,50.918603515624994],[14.623828125000017,50.91474609375],[14.613574218750017,50.85556640625],[14.658203125,50.8326171875],[14.723339843750011,50.814697265625],[14.766503906250023,50.818310546875],[14.797460937500006,50.842333984374996],[14.809375,50.858984375]]]},"properties":{"name":"Czech Rep.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[14.1982421875,53.919042968750034],[13.92578125,53.879052734374966],[13.827734375,54.12724609374999],[14.1982421875,53.919042968750034]]],[[[13.709179687500011,54.382714843749994],[13.707324218750074,54.281152343749994],[13.190039062500034,54.32563476562501],[13.336816406249994,54.697119140625006],[13.65761718750008,54.55957031249997],[13.709179687500011,54.382714843749994]]],[[[9.739746093750028,54.82553710937498],[10.022167968750011,54.673925781250006],[9.86865234375,54.47246093749999],[10.731542968750006,54.31625976562506],[11.013378906250068,54.37915039062497],[11.008593750000074,54.18115234374997],[10.810742187500068,54.075146484374955],[10.917773437500045,53.99531250000004],[11.39960937500004,53.94462890625002],[12.111328125,54.168310546875006],[12.57539062500004,54.467382812500006],[13.028613281250017,54.411035156249994],[13.448046875000017,54.14086914062503],[13.724218750000063,54.153222656249966],[13.865527343750074,53.85336914062498],[14.258886718750006,53.729638671874994],[14.298730468750051,53.55644531249999],[14.41455078125,53.28349609374996],[14.412304687500011,53.216748046874955],[14.410937500000074,53.19902343749999],[14.368554687500051,53.105566406250034],[14.293164062500068,53.026757812499966],[14.138867187500068,52.93286132812503],[14.128613281250011,52.87822265625002],[14.253710937500017,52.78251953124996],[14.514062500000023,52.645605468750034],[14.619433593750017,52.52851562499998],[14.569726562499994,52.431103515624955],[14.554589843750023,52.35966796874996],[14.573925781250068,52.31416015625001],[14.615625,52.277636718750045],[14.679882812500068,52.25],[14.752539062500034,52.08183593750002],[14.601660156250034,51.832373046875006],[14.738671875000051,51.62714843750004],[14.7109375,51.54492187499997],[14.724707031250063,51.523876953124955],[14.90595703125004,51.463330078124955],[14.935546875000028,51.435351562500045],[14.9638671875,51.095117187499994],[14.917480468750057,51.00874023437498],[14.814257812499989,50.871630859375045],[14.809375,50.858984375000034],[14.797460937500034,50.84233398437502],[14.766503906250051,50.81831054687501],[14.72333984375004,50.81469726562497],[14.658203125,50.832617187500006],[14.613574218750045,50.85556640625006],[14.623828125000017,50.91474609375004],[14.595214843750057,50.91860351562502],[14.559667968750006,50.954931640625034],[14.545703124999989,50.99394531249999],[14.319726562500051,51.037792968749955],[14.36904296875008,50.89873046874996],[13.18115234375,50.510498046875],[13.016406250000017,50.490380859374994],[12.549023437500011,50.393408203125034],[12.3056640625,50.205712890624994],[12.27734375,50.18144531250002],[12.231152343749983,50.24487304687497],[12.174804687500057,50.28837890624996],[12.134863281250006,50.31093750000002],[12.099218750000034,50.31098632812504],[12.089843749999972,50.30175781250003],[12.089746093750051,50.2685546875],[12.294598214285761,50.13608119419641],[12.5125,49.87744140625],[12.390527343750051,49.739648437499994],[12.68115234375,49.41450195312501],[12.91669921875004,49.33046875000002],[13.401171875000074,48.97758789062499],[13.440722656250045,48.95556640625003],[13.547656250000074,48.95966796874998],[13.684960937500051,48.87670898437506],[13.769921875000051,48.81596679687502],[13.814746093750017,48.76694335937498],[13.802929687500011,48.74750976562501],[13.798828124999972,48.62167968750006],[13.785351562499983,48.58745117187502],[13.486621093750074,48.58183593750002],[13.471679687500028,48.57182617187502],[13.459863281250023,48.564550781250034],[13.409375,48.39414062500006],[13.322851562500006,48.33125],[13.215234375000023,48.301904296874994],[12.760351562500063,48.10698242187499],[12.95351562500008,47.890625],[12.897656250000068,47.721875],[13.054101562500051,47.655126953125034],[13.047949218750034,47.57915039062502],[13.031542968750074,47.50800781250001],[13.01435546875004,47.478076171875045],[12.968066406250017,47.475683593750006],[12.878906250000057,47.506445312500034],[12.809375,47.542187499999955],[12.782812500000034,47.56416015624998],[12.781152343750051,47.590429687500006],[12.796191406249989,47.60703125],[12.771386718750023,47.63940429687503],[12.685839843750074,47.66933593750002],[12.209277343750074,47.71826171875003],[12.196875,47.709082031250034],[12.203808593750011,47.64672851562503],[12.185644531250063,47.61953125],[11.041992187500028,47.39311523437496],[10.98085937499999,47.39814453125001],[10.893945312500051,47.470458984375],[10.870605468750028,47.500781250000045],[10.873046874999972,47.52021484375001],[10.741601562500023,47.52412109375001],[10.65869140625,47.547216796875006],[10.482812500000051,47.54179687499996],[10.439453125000028,47.55156249999999],[10.403906250000063,47.41699218750003],[10.369140625,47.366064453125034],[10.18300781250008,47.27880859375003],[10.200292968750063,47.36342773437505],[10.066308593750023,47.39335937500002],[10.064575892857171,47.42369419642856],[10.059863281250045,47.44907226562498],[10.034082031250023,47.47358398437501],[9.971582031249994,47.50532226562498],[9.839160156250017,47.55229492187496],[9.748925781250023,47.575537109375006],[9.524023437500034,47.52421875000002],[8.572656250000023,47.775634765625],[8.435742187500011,47.73134765625002],[8.403417968750006,47.687792968750045],[8.413281250000068,47.66269531249998],[8.451757812500006,47.65180664062498],[8.552343750000063,47.65913085937498],[8.56708984375004,47.65190429687502],[8.57050781250004,47.63779296874998],[8.55947265625008,47.62402343750003],[8.477636718750034,47.61269531250002],[8.454003906249994,47.59619140625003],[7.615625,47.59272460937504],[7.616601562500023,48.15678710937502],[8.134863281250006,48.97358398437498],[7.450585937500051,49.152197265625034],[6.735449218750006,49.16059570312498],[6.344335937500006,49.45273437499998],[6.4873046875,49.798486328124994],[6.204882812500017,49.915136718750034],[6.13818359375,49.97431640625001],[6.10976562500008,50.034375],[6.116503906250045,50.120996093749966],[6.340917968750006,50.451757812500034],[5.993945312500017,50.75043945312504],[6.048437500000034,50.90488281250006],[5.857519531250034,51.030126953125006],[6.129980468750034,51.14741210937501],[6.198828125000034,51.45],[5.948730468750057,51.80268554687501],[6.800390625,51.96738281249998],[6.724511718749994,52.080224609374966],[7.035156250000057,52.38022460937498],[6.748828125000074,52.464013671874994],[6.710742187500045,52.61787109374998],[7.033007812500045,52.65136718749997],[7.197265625000028,53.28227539062499],[7.074316406250034,53.477636718750006],[7.285253906250034,53.68134765625001],[8.00927734375,53.69072265624999],[8.108496093750063,53.46767578125002],[8.245214843750006,53.44531249999997],[8.333886718750051,53.606201171875],[8.495214843750063,53.39423828124998],[8.618945312500045,53.875],[9.20556640625,53.85595703124997],[9.783984375000074,53.554638671874955],[9.31201171875,53.859130859375],[8.92041015625,53.96533203125006],[8.906640625000023,54.26079101562502],[8.625781250000017,54.35395507812501],[8.951855468750011,54.46757812499996],[8.670312500000023,54.903417968750034],[9.739746093750028,54.82553710937498]]],[[[8.307714843750034,54.786962890625034],[8.451464843750017,55.05537109374998],[8.3798828125,54.89985351562501],[8.629589843750068,54.891748046874966],[8.307714843750034,54.786962890625034]]]]},"properties":{"name":"Germany","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[43.24599609375002,11.499804687499989],[42.92275390625002,10.999316406249989],[42.557714843750006,11.080761718749997],[41.79824218750002,10.98046875],[41.79267578125001,11.68603515625],[42.378515625,12.46640625],[42.40859375000002,12.494384765625],[42.45,12.521337890624991],[42.47939453125002,12.513623046874997],[42.703710937500006,12.380322265624997],[42.76748046875002,12.4228515625],[42.825292968750006,12.5693359375],[42.86591796875001,12.622802734375],[42.88330078125,12.621289062499997],[43.00566406250002,12.662304687499997],[43.11669921875,12.70859375],[43.353515625,12.367041015624991],[43.38027343750002,12.091259765624997],[42.64003906250002,11.560107421874989],[42.52177734375002,11.572167968749994],[42.58378906250002,11.496777343749997],[43.04277343750002,11.588476562499991],[43.24599609375002,11.499804687499989]]]},"properties":{"name":"Djibouti","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-61.281689453125,15.2490234375],[-61.37539062499999,15.227294921875],[-61.45810546874999,15.633105468750003],[-61.277246093749994,15.526708984374991],[-61.281689453125,15.2490234375]]]},"properties":{"name":"Dominica","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[11.361425781250006,54.891650390625045],[11.739550781250017,54.80742187500002],[11.765917968750074,54.67944335937506],[11.457421875000023,54.628857421874955],[11.035546875000051,54.77309570312505],[11.058593750000028,54.940576171874966],[11.361425781250006,54.891650390625045]]],[[[12.549218750000051,54.96577148437504],[12.11884765625004,54.91440429687506],[12.274023437500034,55.064111328124994],[12.549218750000051,54.96577148437504]]],[[[10.061230468750068,54.88637695312502],[9.80625,54.90600585937503],[9.78125,55.06904296875001],[10.061230468750068,54.88637695312502]]],[[[10.734082031250011,54.750732421875],[10.621679687500006,54.851416015625006],[10.95107421875008,55.15620117187501],[10.734082031250011,54.750732421875]]],[[[15.087695312500017,55.021875],[14.684179687500063,55.10224609375004],[14.765332031250068,55.296728515625034],[15.132617187500017,55.14453125000003],[15.087695312500017,55.021875]]],[[[10.645117187500006,55.60981445312498],[10.785253906250034,55.13339843749998],[10.44277343750008,55.04877929687498],[9.988769531250028,55.163183593750006],[9.860644531250045,55.515478515625034],[10.645117187500006,55.60981445312498]]],[[[12.665722656250068,55.596533203125006],[12.550878906250034,55.55625],[12.59921875,55.68022460937502],[12.665722656250068,55.596533203125006]]],[[[12.56875,55.785058593749966],[12.215039062500011,55.46650390624998],[12.413085937500028,55.28618164062502],[12.089941406250006,55.18813476562505],[12.050390625000034,54.81533203125002],[11.8623046875,54.77260742187502],[11.653808593750057,55.186914062499966],[11.286328125000068,55.20444335937498],[10.978906250000051,55.721533203125006],[11.322265625000028,55.752539062500006],[11.627734375000074,55.95688476562498],[11.819726562500023,55.69765625000002],[11.86640625000004,55.968164062499966],[12.218945312499983,56.11865234374997],[12.578710937500006,56.06406250000006],[12.56875,55.785058593749966]]],[[[11.052148437500051,57.25253906250006],[10.873828125000045,57.26225585937499],[11.174511718750011,57.322900390624994],[11.052148437500051,57.25253906250006]]],[[[9.739746093750028,54.82553710937498],[8.670312500000023,54.903417968750034],[8.61591796875004,55.41821289062503],[8.132128906250074,55.59980468749998],[8.16396484375008,56.60688476562498],[8.671679687500045,56.49565429687496],[8.88808593750008,56.73505859374998],[9.06708984375004,56.79384765625005],[9.196386718750006,56.70166015625],[9.2548828125,57.01171875000003],[8.992773437499977,57.01611328125003],[8.771972656250028,56.72529296875004],[8.468359375,56.66455078125],[8.284082031250023,56.85234374999999],[8.618554687500051,57.11127929687498],[9.43359375,57.17431640625003],[9.96230468750008,57.580957031249994],[10.609960937500034,57.73691406249998],[10.282714843750057,56.620507812499994],[10.926171875000051,56.44326171875002],[10.753417968750028,56.24199218749999],[10.31875,56.212890625],[10.18300781250008,55.86518554687504],[9.903710937500023,55.84282226562502],[10.02363281250004,55.76142578125004],[9.591113281250017,55.49321289062502],[9.670996093750063,55.26640624999999],[9.453710937500006,55.03955078125006],[9.732324218750023,54.96801757812506],[9.739746093750028,54.82553710937498]]]]},"properties":{"name":"Denmark","childNum":10,"cp":[10.2768332,56.1773879]}},{"geometry":{"type":"Polygon","coordinates":[[[-71.647216796875,19.195947265624994],[-71.746484375,19.285839843749997],[-71.71147460937499,19.486572265625],[-71.75742187499999,19.688183593749997],[-71.779248046875,19.718164062499994],[-71.6673828125,19.8486328125],[-70.95415039062499,19.913964843749994],[-70.19384765625,19.63803710937499],[-69.95683593749999,19.671875],[-69.739404296875,19.29921875],[-69.23247070312499,19.27182617187499],[-69.60595703125,19.206494140624997],[-69.62363281249999,19.117822265624994],[-68.684765625,18.90478515625],[-68.33916015624999,18.611523437499997],[-68.68740234375,18.21494140624999],[-68.9349609375,18.408007812500003],[-69.27451171874999,18.43984375],[-69.770654296875,18.443554687499997],[-70.479931640625,18.21728515625],[-70.644677734375,18.336230468750003],[-71.02783203125,18.273193359375],[-71.43896484375,17.63559570312499],[-71.63173828125,17.773632812499997],[-71.768310546875,18.03916015624999],[-71.76376953124999,18.20395507812499],[-71.737255859375,18.270800781250003],[-71.7619140625,18.34130859375],[-71.87255859375,18.416210937499997],[-71.940380859375,18.512597656249994],[-72.000390625,18.597900390625],[-71.98686523437499,18.6103515625],[-71.86650390624999,18.614160156249994],[-71.74321289062499,18.73291015625],[-71.72705078125,18.80322265625],[-71.733642578125,18.856396484374997],[-71.80712890625,18.987011718749997],[-71.647216796875,19.195947265624994]]]},"properties":{"name":"Dominican Rep.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[8.207617187500006,36.518945312499994],[8.348730468750006,36.36796875],[8.318066406250011,35.654931640624994],[8.31640625,35.403125],[8.35986328125,35.299609375],[8.394238281250011,35.203857421875],[8.312109375,35.084619140624994],[8.27685546875,34.9794921875],[8.24560546875,34.73408203125],[7.513867187500011,34.080517578125],[7.534375,33.717919921874994],[7.877246093750017,33.172119140625],[8.1125,33.055322265624994],[8.333398437500023,32.543603515624994],[9.044042968750006,32.07236328125],[9.160253906250006,31.621337890625],[9.224023437500023,31.373681640624994],[9.51875,30.229394531249994],[9.310253906250011,30.115234375],[9.805273437500006,29.176953125],[9.916015625,27.785693359374996],[9.74755859375,27.330859375],[9.883203125000023,26.630810546874997],[9.491406250000011,26.333740234375],[9.4482421875,26.067138671875],[10.000683593750011,25.332080078125003],[10.255859375,24.591015625],[10.395898437500023,24.485595703125],[10.686132812500006,24.55136718749999],[11.507617187500017,24.314355468749994],[11.967871093750006,23.517871093750003],[7.481738281250017,20.873095703125003],[5.836621093750011,19.479150390624994],[4.227636718750006,19.142773437499997],[3.3564453125,18.986621093750003],[3.119726562500006,19.103173828124994],[3.255859375,19.4109375],[3.130273437500023,19.85019531249999],[1.685449218750023,20.378369140624997],[1.610644531250017,20.555566406249994],[1.165722656250011,20.817431640625003],[1.1455078125,21.102246093749997],[-1.947900390624994,23.124804687500003],[-4.822607421874977,24.99560546875],[-8.683349609375,27.2859375],[-8.683349609375,27.656445312499997],[-8.683349609375,27.900390625],[-8.659912109375,28.718603515625],[-7.485742187499994,29.392236328124994],[-7.427685546874983,29.425],[-7.142431640624977,29.619580078124997],[-6.855566406249977,29.601611328124996],[-6.755126953125,29.583837890625],[-6.635351562499977,29.568798828124997],[-6.597753906249977,29.578955078125],[-6.520556640624989,29.659863281249997],[-6.479736328125,29.820361328124996],[-6.00429687499999,29.83125],[-5.448779296874989,29.956933593749994],[-5.293652343749983,30.058642578124996],[-5.180126953124983,30.166162109374994],[-4.96826171875,30.465380859374996],[-4.778515624999983,30.552392578124994],[-4.529150390624977,30.625537109374996],[-4.322851562499977,30.698876953124994],[-4.148779296874977,30.8095703125],[-3.626904296874983,31.000927734374997],[-3.833398437499994,31.197802734374996],[-3.837109374999983,31.512353515624994],[-3.768164062499977,31.68955078125],[-3.700244140624989,31.700097656249994],[-3.604589843749977,31.686767578125],[-3.439794921874977,31.704541015624997],[-3.017382812499989,31.834277343749996],[-2.988232421874983,31.87421875],[-2.930859374999983,32.042529296874996],[-2.863427734374994,32.07470703125],[-1.275341796874983,32.089013671874994],[-1.16259765625,32.399169921875],[-1.111035156249983,32.552294921874996],[-1.188232421875,32.60849609375],[-1.29638671875,32.675683593749994],[-1.352148437499977,32.703369140625],[-1.45,32.784814453124994],[-1.510009765625,32.87763671875],[-1.550732421874983,33.073583984375],[-1.67919921875,33.318652343749996],[-1.795605468749983,34.751904296875],[-2.131787109374983,34.970849609374994],[-2.190771484374977,35.02978515625],[-2.219628906249994,35.10419921875],[-1.673632812499989,35.18310546875],[-0.426123046874977,35.8615234375],[-0.048242187499994,35.8328125],[0.312207031250011,36.162353515625],[0.9716796875,36.4439453125],[2.593359375,36.60068359375],[2.972851562500011,36.784472656249996],[3.779003906250011,36.89619140625],[4.758105468750017,36.896337890625],[5.29541015625,36.648242187499996],[6.486523437500011,37.085742187499996],[6.927539062500017,36.91943359375],[7.238476562500011,36.968505859375],[7.204296875000011,37.0923828125],[7.910449218750017,36.856347656249994],[8.576562500000023,36.93720703125],[8.601269531250011,36.833935546875],[8.207617187500006,36.518945312499994]]]},"properties":{"name":"Algeria","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-80.131591796875,-2.973144531249957],[-80.27294921875003,-2.995898437499974],[-80.22368164062502,-2.753125],[-80.08076171874995,-2.668847656249966],[-79.90903320312495,-2.725585937499972],[-80.131591796875,-2.973144531249957]]],[[[-90.42392578125,-1.339941406250034],[-90.51953124999994,-1.299121093749974],[-90.47719726562494,-1.22099609374996],[-90.42392578125,-1.339941406250034]]],[[[-89.41889648437498,-0.911035156249966],[-89.60859374999998,-0.888574218750009],[-89.28784179687503,-0.689843750000023],[-89.41889648437498,-0.911035156249966]]],[[[-90.33486328125,-0.771582031249977],[-90.54213867187502,-0.676464843749955],[-90.53168945312493,-0.581445312499966],[-90.26938476562498,-0.48466796874996],[-90.19272460937498,-0.658789062500006],[-90.33486328125,-0.771582031249977]]],[[[-91.42597656249995,-0.460839843749994],[-91.61074218749994,-0.44394531250002],[-91.64667968749998,-0.284472656249946],[-91.46015625000001,-0.255664062500031],[-91.42597656249995,-0.460839843749994]]],[[[-90.57392578124993,-0.333984375],[-90.8677734375,-0.271386718750037],[-90.78037109374998,-0.160449218749989],[-90.57392578124993,-0.333984375]]],[[[-91.27216796874998,0.025146484374986],[-90.799658203125,-0.752050781249991],[-90.90551757812497,-0.94052734375002],[-91.13105468750001,-1.019628906249977],[-91.41904296874998,-0.996679687500006],[-91.49541015624999,-0.860937499999977],[-91.120947265625,-0.559082031250028],[-91.36918945312493,-0.287207031249977],[-91.42885742187502,-0.023388671874955],[-91.59682617187497,0.002099609374994],[-91.36137695312496,0.125830078124977],[-91.27216796874998,0.025146484374986]]],[[[-78.90922851562502,1.252783203124977],[-78.99169921875003,1.293212890625043],[-78.89980468749997,1.359765625],[-78.90922851562502,1.252783203124977]]],[[[-75.28447265624999,-0.10654296875002],[-75.62626953124999,-0.122851562499974],[-75.63203125000001,-0.157617187500037],[-75.56059570312502,-0.200097656249994],[-75.49106445312498,-0.24833984374996],[-75.42470703124997,-0.408886718749983],[-75.259375,-0.59013671874996],[-75.24960937499998,-0.951855468750026],[-75.34819335937499,-0.966796874999957],[-75.38012695312503,-0.94023437499996],[-75.40805664062503,-0.92431640625],[-75.42041015624997,-0.962207031250003],[-75.570556640625,-1.53125],[-76.08979492187501,-2.133105468749974],[-76.6791015625,-2.562597656249991],[-77.860595703125,-2.981640625000011],[-78.240380859375,-3.472558593750009],[-78.345361328125,-3.397363281249966],[-78.64799804687499,-4.248144531250006],[-78.68603515625003,-4.562402343749994],[-78.86152343749998,-4.665039062499943],[-78.90761718749997,-4.714453124999977],[-78.92578125,-4.770703124999983],[-78.91420898437497,-4.818652343749974],[-78.919189453125,-4.858398437499986],[-78.97539062499999,-4.873242187499997],[-78.99526367187497,-4.908007812499974],[-79.03330078124998,-4.96914062499999],[-79.07626953125003,-4.990625],[-79.18666992187497,-4.958203124999983],[-79.26811523437493,-4.957617187499949],[-79.33095703124997,-4.92783203125002],[-79.39941406249997,-4.840039062499983],[-79.45576171874998,-4.766210937499949],[-79.50190429687495,-4.670605468750011],[-79.51616210937493,-4.539160156249963],[-79.57768554687496,-4.50058593750002],[-79.638525390625,-4.454882812500031],[-79.71098632812502,-4.467578124999946],[-79.79726562500002,-4.47636718749996],[-79.8451171875,-4.445898437499977],[-79.962890625,-4.390332031250026],[-80.06352539062499,-4.327539062500023],[-80.13955078125002,-4.296093750000011],[-80.19746093750001,-4.311035156249943],[-80.293359375,-4.416796875],[-80.38349609374998,-4.46367187499996],[-80.424169921875,-4.461425781250028],[-80.47856445312499,-4.430078125000037],[-80.48847656249995,-4.393652343749991],[-80.44384765625003,-4.335839843750023],[-80.35288085937495,-4.208496093750014],[-80.453759765625,-4.205175781249963],[-80.48847656249995,-4.165527343749972],[-80.49345703124999,-4.119140625000014],[-80.510009765625,-4.06953125000004],[-80.49013671874994,-4.010058593750003],[-80.43720703125001,-3.978613281249991],[-80.30327148437499,-4.005078124999969],[-80.26689453124993,-3.948828124999963],[-80.23051757812499,-3.924023437499969],[-80.19414062499996,-3.905859375],[-80.24375,-3.576757812500006],[-80.32465820312498,-3.387890625],[-79.96333007812501,-3.15771484375],[-79.72988281249997,-2.579101562499972],[-79.842138671875,-2.0673828125],[-79.92558593749996,-2.548535156249969],[-80.03017578124994,-2.556738281249949],[-80.00664062499993,-2.353808593750003],[-80.28471679687502,-2.706738281249955],[-80.93217773437493,-2.269140624999977],[-80.76059570312498,-1.934570312500028],[-80.90239257812499,-1.078906249999974],[-80.55390624999998,-0.847949218749989],[-80.45546875,-0.585449218749986],[-80.282373046875,-0.620507812500023],[-80.48227539062503,-0.368261718749963],[-80.046142578125,0.155371093750048],[-80.08828124999997,0.78476562500002],[-78.89965820312503,1.20625],[-78.85966796874996,1.455371093750031],[-78.1806640625,0.968554687499974],[-77.702880859375,0.837841796874997],[-77.46767578124997,0.636523437500017],[-77.396337890625,0.393896484374963],[-76.49462890624997,0.23544921875002],[-76.27060546874998,0.439404296874997],[-75.77666015624999,0.08925781249998],[-75.28447265624999,-0.10654296875002]]]]},"properties":{"name":"Ecuador","childNum":9}},{"geometry":{"type":"Polygon","coordinates":[[[34.24531250000001,31.208300781249996],[34.904296875,29.47734375],[34.736425781250006,29.27060546875],[34.39970703125002,28.01601562499999],[34.22011718750002,27.764306640624994],[33.76025390625,28.04765625],[33.24775390625001,28.567724609375],[32.56572265625002,29.973974609375],[32.35976562500002,29.630664062499996],[32.89824218750002,28.565234375],[33.54707031250001,27.898144531249997],[33.5498046875,27.607373046874997],[33.84931640625001,27.184912109375],[33.959082031250006,26.6490234375],[35.19414062500002,24.475146484375003],[35.78388671875001,23.937792968750003],[35.54082031250002,23.920654296875],[35.50439453125,23.779296875],[35.697851562500006,22.946191406249994],[36.22968750000001,22.628808593749994],[36.87138671875002,21.996728515624994],[31.434472656250023,21.995849609375],[31.486132812500017,22.14780273437499],[31.400292968750023,22.202441406250003],[31.260644531250023,22.00229492187499],[31.092675781250023,21.994873046875],[28.036425781250017,21.995361328125],[24.980273437500017,21.995849609375],[24.980273437500017,25.5888671875],[24.980273437500017,29.181884765625],[24.703222656250006,30.201074218749994],[24.96142578125,30.678515625],[24.85273437500001,31.334814453125],[25.150488281250006,31.654980468749997],[25.382226562500023,31.51279296875],[25.89326171875001,31.620898437499996],[27.248046875,31.377880859374997],[27.5400390625,31.212695312499996],[28.51484375000001,31.050439453124994],[29.072070312500017,30.830273437499997],[29.929785156250006,31.227490234374997],[30.22265625,31.2583984375],[30.395117187500006,31.4576171875],[30.92353515625001,31.566845703124997],[30.56298828125,31.4169921875],[31.001757812500017,31.462792968749994],[31.082910156250023,31.603320312499996],[31.5244140625,31.458251953125],[31.888964843750017,31.54140625],[32.13603515625002,31.341064453125],[31.8921875,31.482470703124996],[31.77109375,31.292578125],[32.10175781250001,31.092822265624996],[32.281835937500006,31.200878906249997],[32.21621093750002,31.29375],[32.60332031250002,31.06875],[33.66650390625,31.130419921874996],[34.19814453125002,31.322607421875],[34.24531250000001,31.208300781249996]]]},"properties":{"name":"Egypt","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[40.141210937500006,15.696142578125034],[40.399023437500006,15.579882812500045],[39.975195312500006,15.612451171875023],[39.94746093750004,15.696142578125034],[40.07050781250004,15.676611328125034],[39.93994140625003,15.744531250000023],[39.9567382812501,15.889404296875057],[40.141210937500006,15.696142578125034]]],[[[40.07646484375002,16.082421875000023],[40.11005859375004,15.985742187500051],[39.99609375000003,16.04267578125001],[40.07646484375002,16.082421875000023]]],[[[40.938574218750006,13.983105468749997],[40.82011718750002,14.111669921874991],[40.22148437500002,14.431152343749972],[39.531835937500006,14.53671875],[39.198046875000074,14.479394531250037],[39.1354492187501,14.581884765625034],[39.07421874999997,14.628222656249974],[39.02382812499999,14.628222656249974],[38.99570312500006,14.586865234374983],[38.81201171875003,14.482324218750009],[38.50439453124997,14.42441406250002],[38.43144531250002,14.428613281249994],[38.221484375000074,14.649658203124986],[38.002539062500006,14.737109375000045],[37.94345703125006,14.810546875],[37.884179687499994,14.852294921874972],[37.82031250000003,14.708496093749986],[37.70839843750005,14.45722656250004],[37.64843750000003,14.32255859375006],[37.571191406249994,14.149072265624966],[37.546777343749994,14.143847656249974],[37.507226562499994,14.156396484375037],[37.257226562499994,14.453759765625051],[37.024511718750006,14.271972656250057],[36.81191406250005,14.315039062500034],[36.67910156250005,14.307568359375026],[36.542382812499994,14.25820312499999],[36.52431640625005,14.256835937499986],[36.492285156250006,14.544335937500023],[36.470800781250006,14.736474609375009],[36.448144531249994,14.940087890625009],[36.42675781249997,15.132080078125043],[36.566015625,15.362109375],[36.9137695312501,16.296191406250045],[36.887792968750006,16.624658203124994],[36.9787109375001,16.800585937500045],[36.9757812500001,16.866552734375006],[36.99521484375006,17.020556640625017],[37.00898437500004,17.058886718750017],[37.06152343749997,17.061279296875057],[37.16953125000006,17.04140625],[37.41103515625005,17.061718749999955],[37.452929687500074,17.108691406250017],[37.51015625,17.28813476562499],[37.54746093750006,17.32412109375005],[37.78242187500004,17.458007812500057],[38.253515625,17.584765625000017],[38.26728515625004,17.616699218750057],[38.28984375000002,17.637011718750017],[38.34736328125004,17.68359375],[38.37373046875004,17.717333984375045],[38.42246093750006,17.823925781249983],[38.60947265625006,18.00507812500004],[39.03447265625002,17.085546875000034],[39.298925781250006,15.921093750000011],[39.78554687499999,15.124853515624991],[39.86376953124997,15.470312500000034],[40.20410156250003,15.014111328124983],[41.17646484375004,14.620312500000054],[41.65820312499997,13.983056640624994],[42.24511718749997,13.587646484374986],[42.39931640625005,13.212597656249969],[42.522851562499994,13.221484375],[42.796191406250074,12.864257812500057],[42.96953125000002,12.808349609375028],[42.99902343750003,12.899511718750048],[43.08291015625005,12.824609374999966],[43.11669921874997,12.708593749999963],[43.00566406250002,12.66230468750004],[42.88330078124997,12.621289062500026],[42.86591796875004,12.622802734374986],[42.82529296875006,12.569335937500014],[42.767480468749994,12.422851562500014],[42.70371093750006,12.380322265625054],[42.479394531249994,12.513623046875026],[42.45,12.521337890625006],[42.40859375,12.494384765625014],[42.37851562500006,12.46640625],[42.28994140625005,12.570214843750009],[42.225,12.661962890624963],[42.13427734374997,12.771435546874969],[41.95214843749997,12.88232421875],[41.85957031250004,13.025878906250028],[41.76503906250005,13.183935546874991],[41.362890625,13.499804687500031],[40.938574218750006,13.983105468749997]]]]},"properties":{"name":"Eritrea","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.887939453125,27.809570312500057],[-17.984765625000023,27.646386718750023],[-18.160546874999937,27.76147460937503],[-17.887939453125,27.809570312500057]]],[[[-15.400585937499955,28.147363281250023],[-15.436767578124972,27.810693359375023],[-15.71030273437492,27.784082031250023],[-15.809472656249966,27.994482421874977],[-15.682763671874994,28.15405273437497],[-15.400585937499955,28.147363281250023]]],[[[-17.184667968749977,28.02197265624997],[-17.324902343749955,28.11767578125003],[-17.25859375,28.203173828125045],[-17.103759765624943,28.111132812500017],[-17.184667968749977,28.02197265624997]]],[[[-16.33447265624997,28.37993164062499],[-16.41821289062497,28.15141601562496],[-16.65800781249999,28.007177734374977],[-16.905322265625017,28.33959960937503],[-16.12363281249992,28.57597656249996],[-16.33447265624997,28.37993164062499]]],[[[-14.196777343749943,28.169287109375063],[-14.332617187500006,28.056005859374977],[-14.49179687499992,28.100927734374977],[-14.231982421875017,28.21582031250003],[-14.003369140624983,28.706689453125023],[-13.85722656249996,28.73803710937503],[-13.928027343749989,28.25346679687499],[-14.196777343749943,28.169287109375063]]],[[[-17.83427734374999,28.49321289062496],[-18.00078124999999,28.758251953124955],[-17.928808593749977,28.844580078125063],[-17.7265625,28.724462890625006],[-17.83427734374999,28.49321289062496]]],[[[-13.715966796874966,28.911230468750034],[-13.85991210937496,28.869091796874983],[-13.823632812499966,29.013330078124966],[-13.463574218749955,29.237207031250023],[-13.477929687499966,29.00659179687503],[-13.715966796874966,28.911230468750034]]],[[[1.593945312500068,38.672070312499955],[1.40576171875,38.670996093750006],[1.436328125000017,38.768212890624994],[1.593945312500068,38.672070312499955]]],[[[1.445214843750051,38.91870117187503],[1.223339843750068,38.90385742187502],[1.3486328125,39.080810546875],[1.564453125,39.12104492187504],[1.623632812499977,39.03881835937497],[1.445214843750051,38.91870117187503]]],[[[3.145312500000017,39.79008789062499],[3.461816406250023,39.69775390625003],[3.072851562500006,39.30126953124997],[2.799804687500057,39.38505859374999],[2.700585937500023,39.54213867187502],[2.49951171875,39.47788085937498],[2.37001953125008,39.57207031249999],[3.15869140625,39.97050781249999],[3.145312500000017,39.79008789062499]]],[[[4.293652343750011,39.84184570312499],[3.8671875,39.958740234375],[3.853417968750051,40.06303710937502],[4.22578125000004,40.032373046874966],[4.293652343750011,39.84184570312499]]],[[[-1.794042968749949,43.407324218750006],[-1.410693359374932,43.240087890625034],[-1.460839843749937,43.05175781250006],[-1.300048828124943,43.10097656250002],[-0.586425781249943,42.798974609374966],[0.631640625000045,42.689599609374994],[0.696875,42.84511718750005],[1.428320312499977,42.59589843749998],[1.414843750000074,42.54838867187499],[1.448828124999977,42.43745117187504],[1.534082031250051,42.44169921875002],[1.7060546875,42.50332031250005],[1.859765625000051,42.457080078125045],[1.927929687500068,42.42631835937499],[2.032714843750028,42.353515625],[3.21142578125,42.43115234375],[3.248046875,41.94423828125002],[3.0048828125,41.76743164062506],[2.082617187500063,41.287402343750045],[1.032910156250068,41.06206054687496],[0.714648437500074,40.822851562500006],[0.891113281250057,40.72236328125004],[0.59609375000008,40.614501953125],[-0.327001953124949,39.519873046875006],[-0.204931640624949,39.062597656250034],[0.20156250000008,38.75917968750002],[-0.520800781249989,38.317285156249966],[-0.814648437500011,37.76992187500002],[-0.721582031249966,37.63105468749998],[-1.327539062499937,37.561132812500034],[-1.640966796874949,37.38696289062497],[-2.111523437499983,36.77666015624999],[-4.366845703124994,36.71811523437506],[-4.67412109374996,36.506445312500006],[-5.171484374999949,36.423779296874955],[-5.3609375,36.134912109374994],[-5.62548828125,36.02592773437499],[-6.040673828124937,36.18842773437498],[-6.38413085937492,36.63701171874996],[-6.216796875000028,36.91357421875],[-6.396191406249983,36.831640625],[-6.863769531250028,37.27890625],[-7.406152343749937,37.17944335937497],[-7.44394531249992,37.72827148437497],[-6.957568359374932,38.18789062499999],[-7.106396484374983,38.181005859375006],[-7.343017578124943,38.45742187500002],[-6.997949218749994,39.05644531250002],[-7.53569335937496,39.66157226562501],[-7.117675781249972,39.681689453125045],[-6.975390624999932,39.79838867187502],[-6.896093749999949,40.02182617187506],[-7.032617187499966,40.16791992187498],[-6.8101562499999,40.343115234375034],[-6.928466796874972,41.009130859375006],[-6.2125,41.53203125],[-6.542187499999955,41.672509765624994],[-6.61826171874992,41.9423828125],[-7.147119140625023,41.98115234374998],[-7.40361328124996,41.833691406249955],[-8.152490234374937,41.81196289062498],[-8.266064453124983,42.13740234375001],[-8.777148437500017,41.941064453124994],[-8.887207031249943,42.105273437500045],[-8.690917968749943,42.274169921875],[-8.815820312499966,42.285253906250034],[-8.730029296874989,42.411718750000034],[-8.8115234375,42.64033203124998],[-9.033105468750023,42.593847656250006],[-8.927197265624926,42.79858398437497],[-9.235205078124977,42.97690429687498],[-9.178076171874977,43.17402343749998],[-8.248925781249937,43.43940429687498],[-8.256738281249937,43.57988281249999],[-8.004687499999932,43.69438476562496],[-7.503613281249983,43.73994140625001],[-7.060986328124955,43.55395507812503],[-5.846679687499943,43.645068359375045],[-4.52304687499992,43.41572265625004],[-3.604638671874966,43.51948242187504],[-3.045605468749926,43.37158203125],[-2.875048828125017,43.454443359375006],[-2.337109374999926,43.32802734375002],[-1.794042968749949,43.407324218750006]]]]},"properties":{"name":"Spain","childNum":12,"cp":[-2.9366964,40.3438963]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[22.61738281250004,58.62124023437502],[23.323242187500057,58.45083007812502],[22.730273437500045,58.23066406250001],[22.371679687499977,58.217138671875006],[21.996875,57.93134765624998],[22.187695312500068,58.15434570312502],[21.88212890624999,58.262353515624994],[21.862304687500057,58.497167968750034],[22.61738281250004,58.62124023437502]]],[[[23.343554687500017,58.550341796875045],[23.10908203125004,58.65922851562502],[23.332812500000045,58.648583984374994],[23.343554687500017,58.550341796875045]]],[[[22.923730468750023,58.826904296875],[22.54218750000001,58.68999023437499],[22.411035156250023,58.863378906250034],[22.05625,58.94360351562506],[22.6494140625,59.08710937499998],[22.90986328125004,58.99121093749997],[22.923730468750023,58.826904296875]]],[[[28.0125,59.484277343749966],[28.15107421875004,59.374414062499966],[27.434179687500006,58.787255859374994],[27.502441406250057,58.221337890624994],[27.778515625000068,57.87070312500006],[27.542089843750063,57.799414062500006],[27.4,57.66679687499999],[27.35195312500005,57.528125],[26.96601562500001,57.60913085937506],[26.532617187499994,57.53100585937503],[26.29804687500001,57.60107421875],[25.66015625,57.920166015625],[25.27265625000001,58.009375],[25.11103515625004,58.06342773437498],[24.45888671875005,57.907861328124994],[24.3625,57.86616210937501],[24.322558593750074,57.87060546875003],[24.529101562500045,58.35424804687497],[24.114843750000034,58.26611328125006],[23.767578125000057,58.36083984374997],[23.50927734375003,58.65854492187498],[23.680761718750063,58.787158203125074],[23.43203125,58.920654296875],[23.494433593750017,59.19565429687498],[24.083398437500023,59.29189453125005],[24.38037109375003,59.47265625],[25.44375,59.52114257812502],[25.50927734374997,59.63901367187506],[26.974707031250006,59.450634765624955],[28.0125,59.484277343749966]]]]},"properties":{"name":"Estonia","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[38.43144531250002,14.428613281249994],[38.50439453125,14.424414062499991],[38.81201171875,14.482324218749994],[38.995703125,14.586865234374997],[39.02382812500002,14.628222656250003],[39.07421875,14.628222656250003],[39.13544921875001,14.581884765624991],[39.19804687500002,14.479394531249994],[39.531835937500006,14.53671875],[40.22148437500002,14.43115234375],[40.82011718750002,14.111669921874991],[40.938574218750006,13.983105468749997],[41.362890625,13.499804687500003],[41.76503906250002,13.183935546874991],[41.85957031250001,13.02587890625],[41.9521484375,12.88232421875],[42.13427734375,12.771435546874997],[42.225,12.661962890624991],[42.28994140625002,12.570214843749994],[42.378515625,12.46640625],[41.79267578125001,11.68603515625],[41.79824218750002,10.98046875],[42.557714843750006,11.080761718749997],[42.92275390625002,10.999316406249989],[42.65644531250001,10.6],[42.84160156250002,10.203076171874997],[43.181640625,9.879980468749991],[43.482519531250006,9.379492187499991],[43.98378906250002,9.008837890624989],[46.97822265625001,7.9970703125],[47.97822265625001,7.9970703125],[44.940527343750006,4.912011718749994],[43.988867187500006,4.950537109374991],[43.58349609375,4.85498046875],[43.12568359375001,4.644482421874997],[42.85664062500001,4.32421875],[42.02412109375001,4.137939453125],[41.91533203125002,4.031298828124989],[41.88398437500001,3.977734375],[41.73769531250002,3.979052734374989],[41.48193359375,3.96328125],[41.37246093750002,3.946191406249994],[41.22089843750001,3.943554687499997],[41.02080078125002,4.057470703124991],[40.765234375,4.27304687499999],[39.84218750000002,3.851464843749994],[39.79033203125002,3.754248046874991],[39.65751953125002,3.577832031249997],[39.49443359375002,3.456103515624989],[38.608007812500006,3.60009765625],[38.45156250000002,3.604833984374991],[38.22529296875001,3.618994140624991],[38.08613281250001,3.64882812499999],[37.15458984375002,4.254541015624994],[36.90556640625002,4.411474609374991],[36.02197265625,4.468115234374991],[35.76308593750002,4.808007812499994],[35.75615234375002,4.950488281249989],[35.779296875,5.105566406249991],[35.80029296875,5.156933593749997],[35.74501953125002,5.343994140625],[35.325292968750006,5.364892578124994],[35.2646484375,5.412060546874997],[35.26386718750001,5.457910156249994],[35.26835937500002,5.492285156249991],[34.98359375000001,5.858300781249994],[34.71064453125001,6.660302734374994],[34.06425781250002,7.225732421874994],[33.902441406250006,7.509521484375],[32.99892578125002,7.899511718749991],[33.28105468750002,8.437255859375],[33.95332031250001,8.443505859374994],[34.07275390625,8.545263671874991],[34.078125,9.461523437499991],[34.31123046875001,10.190869140624997],[34.34394531250001,10.658642578124997],[34.571875,10.880175781249989],[34.77128906250002,10.746191406249991],[34.93144531250002,10.864794921874989],[35.1123046875,11.816552734374994],[35.67021484375002,12.623730468749997],[36.12519531250001,12.75703125],[36.52431640625002,14.2568359375],[36.54238281250002,14.25820312499999],[36.67910156250002,14.307568359374997],[36.81191406250002,14.315039062499991],[37.024511718750006,14.27197265625],[37.25722656250002,14.453759765624994],[37.50722656250002,14.156396484374994],[37.54677734375002,14.143847656250003],[37.57119140625002,14.149072265624994],[37.6484375,14.322558593750003],[37.70839843750002,14.457226562499997],[37.8203125,14.70849609375],[37.88417968750002,14.852294921875],[37.943457031250006,14.810546875],[38.002539062500006,14.737109375],[38.22148437500002,14.649658203125],[38.43144531250002,14.428613281249994]]]},"properties":{"name":"Ethiopia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[22.17509765624999,60.370751953124994],[22.41552734375003,60.30336914062505],[22.36054687500004,60.165576171875045],[22.07714843750003,60.286328124999955],[22.17509765624999,60.370751953124994]]],[[[21.450878906250068,60.529589843750045],[21.3,60.47978515625002],[21.224707031250006,60.62060546875003],[21.450878906250068,60.529589843750045]]],[[[21.2177734375,63.241308593750034],[21.415625,63.19736328125006],[21.25341796875,63.152001953124966],[21.08388671875008,63.277539062499955],[21.2177734375,63.241308593750034]]],[[[24.848242187500034,64.99101562499999],[24.576562500000023,65.04287109375],[24.970605468750023,65.05532226562502],[24.848242187500034,64.99101562499999]]],[[[28.96582031250003,69.02197265625],[28.414062500000057,68.90415039062506],[28.77285156250005,68.84003906249995],[28.470703125000057,68.48837890625],[28.685156250000034,68.189794921875],[29.343847656250006,68.06186523437506],[29.988085937500017,67.66826171874999],[29.066210937500045,66.89174804687497],[30.102734375000097,65.72626953125004],[29.715917968750063,65.62456054687502],[29.608007812500006,65.248681640625],[29.826953125000017,65.14506835937502],[29.60419921875004,64.968408203125],[30.072851562500063,64.76503906250005],[30.04189453125005,64.44335937499997],[30.513769531250006,64.2],[30.50390625000003,64.02060546875],[29.991503906250074,63.73515625000002],[31.180859375000097,63.208300781250074],[31.533984375000017,62.885400390624994],[31.18671875000004,62.48139648437504],[29.69013671875004,61.54609375000001],[27.797656250000074,60.53613281250003],[26.53466796874997,60.412890625000074],[26.56933593750003,60.62456054687502],[26.377734375000074,60.42407226562503],[25.955957031250023,60.474218750000034],[26.03583984375004,60.34150390625001],[25.75800781250004,60.26752929687504],[25.65644531250004,60.33320312499998],[24.44560546874999,60.021289062500045],[23.46357421875004,59.986230468749994],[23.021289062500074,59.81601562500006],[23.19843750000001,60.02182617187498],[22.911718750000063,60.20971679687497],[22.749804687500017,60.057275390624994],[22.462695312500045,60.029199218749966],[22.5849609375,60.380566406249955],[21.436035156250057,60.596386718749955],[21.605957031250057,61.59155273437503],[21.255957031250063,61.98964843750005],[21.143847656250045,62.73999023437506],[21.650976562500063,63.039306640625],[21.545117187499983,63.204296874999955],[22.31972656250005,63.310449218749994],[22.532324218750034,63.647851562499994],[23.598925781250074,64.04091796874997],[24.557910156250045,64.801025390625],[25.288183593750063,64.8603515625],[25.34785156250004,65.47924804687497],[24.674902343750006,65.67070312499999],[24.628027343750034,65.85917968750002],[24.15546875000004,65.80527343750006],[23.700292968750034,66.25263671874998],[23.988574218750045,66.81054687500003],[23.64150390625005,67.12939453124997],[23.733593750000068,67.42290039062499],[23.454882812500045,67.46025390625007],[23.63886718750004,67.95439453125002],[22.854101562500034,68.36733398437502],[21.99746093750005,68.52060546874998],[20.622167968750006,69.036865234375],[21.065722656250017,69.04174804687503],[21.06611328125001,69.21411132812497],[21.59375,69.273583984375],[22.410937500000074,68.719873046875],[23.324023437500017,68.64897460937502],[23.85400390625,68.80590820312503],[24.94140625000003,68.59326171875006],[25.748339843750017,68.99013671875],[26.07246093750004,69.69155273437497],[26.525390625000057,69.91503906250003],[27.127539062500063,69.90649414062497],[27.747851562500045,70.06484375],[29.14160156250003,69.67143554687505],[29.33339843750005,69.47299804687503],[28.846289062500006,69.17690429687502],[28.96582031250003,69.02197265625]]]]},"properties":{"name":"Finland","childNum":5}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[178.48789062500018,-18.97412109375],[177.95869140624998,-19.121582031250014],[178.33427734375013,-18.93447265625001],[178.48789062500018,-18.97412109375]]],[[[179.34931640625015,-18.10234375000003],[179.25351562500018,-18.030566406249974],[179.30644531250013,-17.944042968750026],[179.34931640625015,-18.10234375000003]]],[[[178.28017578124994,-17.37197265625001],[178.59160156249996,-17.651464843750006],[178.66767578125004,-18.080859375],[177.95546875000005,-18.264062500000023],[177.32138671875,-18.077539062500037],[177.26396484375007,-17.86347656250004],[177.5044921875,-17.539550781250043],[177.81796875000012,-17.38847656249999],[178.28017578124994,-17.37197265625001]]],[[[180,-16.96308593750001],[179.89697265625003,-16.96406250000004],[180,-16.785742187500034],[180,-16.96308593750001]]],[[[-179.97490234374996,-16.92480468750003],[-180,-16.96298828124999],[-180,-16.907812500000034],[-180,-16.82431640624999],[-180,-16.78554687499999],[-179.86098632812502,-16.68828124999999],[-179.97490234374996,-16.92480468750003]]],[[[-179.92944335937503,-16.502832031250037],[-179.999951171875,-16.540039062499986],[-179.900927734375,-16.431542968749994],[-179.92944335937503,-16.502832031250037]]],[[[179.99921875000004,-16.168554687499977],[179.56416015625004,-16.636914062499997],[179.56816406249996,-16.747460937499966],[179.93037109375004,-16.51943359375005],[179.9279296875001,-16.74443359374996],[179.41933593750005,-16.80654296875001],[179.20234375000004,-16.71269531249999],[179.00683593750003,-16.90019531249999],[178.70664062500018,-16.97617187500002],[178.4974609375,-16.78789062500003],[178.58359375000012,-16.621875],[178.80507812499994,-16.631445312500034],[179.55175781250003,-16.249902343750023],[180,-16.15292968749999],[179.99921875000004,-16.168554687499977]]]]},"properties":{"name":"Fiji","childNum":7}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.01875,-51.7857421875],[-60.87597656250003,-51.79423828125004],[-60.94755859374996,-51.94628906250002],[-61.14501953125003,-51.83945312500001],[-61.01875,-51.7857421875]]],[[[-60.28623046874995,-51.461914062500014],[-59.38759765625002,-51.35996093750003],[-59.26806640625,-51.42753906250003],[-59.92138671874997,-51.969531250000045],[-60.246337890625,-51.98642578125003],[-60.35346679687498,-52.13994140625004],[-60.686376953125034,-52.18837890624996],[-60.96142578125003,-52.05732421874999],[-60.23847656249998,-51.771972656250036],[-60.58251953125,-51.71269531250004],[-60.24516601562493,-51.638867187500004],[-60.56845703124998,-51.357812499999945],[-60.28623046874995,-51.461914062500014]]],[[[-60.11171875000002,-51.39589843749998],[-60.275341796874955,-51.28056640625002],[-60.06982421875,-51.307910156249996],[-60.11171875000002,-51.39589843749998]]],[[[-58.85019531249995,-51.26992187499998],[-58.42583007812502,-51.32421875000003],[-58.508935546874994,-51.48359375],[-58.271582031250034,-51.57470703124999],[-58.25922851562501,-51.417089843750034],[-57.976513671874955,-51.384375],[-57.80849609375002,-51.51796875],[-57.96044921874997,-51.58320312500003],[-57.79179687499999,-51.63613281249998],[-58.68349609375002,-51.93623046875001],[-58.65278320312498,-52.09921875],[-59.19584960937496,-52.01767578125],[-59.06801757812502,-52.17304687500003],[-59.341503906249955,-52.19599609375],[-59.395654296874966,-52.308007812499994],[-59.64873046875002,-52.134375],[-59.57080078124994,-51.92539062500003],[-59.05952148437498,-51.685449218749994],[-59.09663085937498,-51.49140624999998],[-58.85019531249995,-51.26992187499998]]]]},"properties":{"name":"Falkland Is.","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[55.79736328125003,-21.33935546875003],[55.36269531250005,-21.27363281250004],[55.23281250000005,-21.05839843749999],[55.311328125000074,-20.90410156249999],[55.661914062500074,-20.90625],[55.8390625000001,-21.13857421874998],[55.79736328125003,-21.33935546875003]]],[[[45.180273437500006,-12.97675781250004],[45.069433593750006,-12.895605468750034],[45.09238281250006,-12.653027343749997],[45.22314453124997,-12.752148437500026],[45.180273437500006,-12.97675781250004]]],[[[-51.65253906249998,4.061279296874972],[-52.327880859375,3.18173828125002],[-52.58300781250003,2.528906249999977],[-52.90346679687502,2.211523437499977],[-53.76777343749998,2.354833984375048],[-54.13007812499998,2.121044921875026],[-54.43310546875,2.207519531250057],[-54.51508789062498,2.245458984374963],[-54.55048828125001,2.293066406249991],[-54.59194335937502,2.313769531250031],[-54.61625976562499,2.326757812500006],[-54.60473632812497,2.335791015624991],[-54.56840820312502,2.342578125000031],[-54.53593749999999,2.343310546875003],[-54.48554687500001,2.416113281250006],[-54.402001953124966,2.46152343750002],[-54.25673828125002,2.713720703124977],[-54.19550781249998,2.817871093750057],[-54.17070312499999,2.993603515624969],[-54.203125,3.138183593750028],[-54.18803710937499,3.178759765625031],[-54.063183593749955,3.353320312499989],[-54.00957031249993,3.448535156250017],[-54.03422851562499,3.62939453125],[-54.350732421874994,4.054101562500023],[-54.47968749999998,4.836523437499991],[-53.91992187499997,5.768994140624983],[-52.899316406249966,5.425048828124986],[-52.29052734375003,4.942187500000031],[-52.324609374999966,4.770898437500037],[-52.21997070312494,4.862792968750014],[-52.05810546875003,4.717382812499963],[-52.00292968749997,4.352294921875014],[-51.82753906250002,4.635693359375026],[-51.65253906249998,4.061279296874972]]],[[[-60.826269531250006,14.494482421874991],[-61.063720703125,14.467089843750017],[-61.01132812499998,14.601904296875034],[-61.21333007812501,14.848583984375011],[-60.927148437499966,14.755175781249989],[-60.826269531250006,14.494482421874991]]],[[[-61.23046875000003,15.889941406250074],[-61.310742187499955,15.894677734374966],[-61.25,16.006298828124983],[-61.23046875000003,15.889941406250074]]],[[[-61.58955078125001,16.006933593750006],[-61.759423828124966,16.062060546875045],[-61.74804687499997,16.355273437500017],[-61.55234374999998,16.270898437499966],[-61.58955078125001,16.006933593750006]]],[[[-61.3271484375,16.230419921874983],[-61.522167968749955,16.22802734375003],[-61.47119140624994,16.506640625000045],[-61.17260742187497,16.25610351562497],[-61.3271484375,16.230419921874983]]],[[[9.480371093750023,42.80541992187503],[9.550683593750051,42.12973632812506],[9.186132812500034,41.38491210937502],[8.80751953125008,41.58837890625],[8.886816406249977,41.70068359375003],[8.621875,41.93071289062502],[8.700976562500045,42.09560546875002],[8.565625,42.35771484374996],[8.81484375000008,42.60791015625003],[9.313378906250023,42.71318359374999],[9.363183593750051,43.01738281249996],[9.480371093750023,42.80541992187503]]],[[[-1.17832031249992,45.904052734375],[-1.213574218750011,45.81660156250004],[-1.388671874999972,46.05039062500006],[-1.17832031249992,45.904052734375]]],[[[5.789746093749983,49.53828125000001],[5.823437500000011,49.50507812499998],[5.9013671875,49.48974609374997],[5.928906250000011,49.47753906249997],[5.959472656250028,49.45463867187502],[6.01142578125004,49.44545898437502],[6.074121093750023,49.45463867187502],[6.119921875000017,49.485205078125034],[6.181054687500051,49.498925781249966],[6.344335937500006,49.45273437499998],[6.735449218750006,49.16059570312498],[7.450585937500051,49.152197265625034],[8.134863281250006,48.97358398437498],[7.616601562500023,48.15678710937502],[7.615625,47.59272460937504],[7.343164062499994,47.43310546875003],[7.136035156249989,47.489843750000034],[6.968359375000034,47.453222656250034],[6.900390625000028,47.39423828125001],[7.000585937500034,47.339453125000034],[7.000585937500034,47.32250976562506],[6.978515625000057,47.30205078124996],[6.95205078125008,47.26718750000006],[6.820703125000051,47.163183593750006],[6.688085937500034,47.05825195312505],[6.66689453125008,47.026513671874966],[6.624804687500017,47.00434570312498],[6.45625,46.948339843750034],[6.438646763392874,46.774418247767855],[6.129687500000045,46.56699218750006],[6.118111049107182,46.447459542410726],[6.095898437500011,46.279394531250006],[5.970019531250045,46.214697265625034],[5.971484375000074,46.151220703125006],[6.006640625000045,46.14233398437506],[6.086621093750068,46.14702148437502],[6.19941406250004,46.19306640624998],[6.234667968750045,46.332617187500006],[6.321875,46.39370117187502],[6.428906250000011,46.43051757812506],[6.578222656250034,46.437353515625034],[6.758105468750017,46.41577148437497],[6.772070312500006,46.16513671874998],[6.897265625000017,46.05175781249997],[6.953710937500063,46.017138671875045],[7.00390625,45.95883789062506],[7.021093750000034,45.92578124999997],[6.790917968750023,45.740869140624966],[7.146386718750051,45.381738281249994],[7.07832031250004,45.23994140624998],[6.634765625000028,45.06816406249996],[6.99267578125,44.82729492187502],[6.900195312499989,44.33574218749996],[7.318554687500068,44.13798828125002],[7.637207031250057,44.16484375],[7.4931640625,43.767138671875045],[6.570214843750023,43.199072265625034],[6.115917968750011,43.07236328124998],[5.406542968750074,43.228515625],[5.05976562500004,43.44453125000004],[4.712109375000011,43.373291015625],[3.910839843750011,43.563085937500034],[3.258886718750063,43.193212890625006],[3.051757812500057,42.915136718750006],[3.21142578125,42.43115234375],[2.032714843750028,42.353515625],[1.927929687500068,42.42631835937499],[1.859765625000051,42.457080078125045],[1.7060546875,42.50332031250005],[1.709863281250051,42.604443359374955],[1.568164062500045,42.63500976562506],[1.501367187500023,42.64272460937502],[1.428320312499977,42.59589843749998],[0.696875,42.84511718750005],[0.631640625000045,42.689599609374994],[-0.586425781249943,42.798974609374966],[-1.300048828124943,43.10097656250002],[-1.460839843749937,43.05175781250006],[-1.410693359374932,43.240087890625034],[-1.794042968749949,43.407324218750006],[-1.484863281249943,43.56376953124999],[-1.245507812499937,44.55986328124999],[-1.07695312499996,44.68984375],[-1.152880859374989,44.764013671875006],[-1.245214843749977,44.66669921874998],[-1.081005859374983,45.532421874999955],[-0.548486328124966,45.00058593750006],[-0.790771484375028,45.46801757812497],[-1.195996093749983,45.714453125],[-1.03173828125,45.741064453125006],[-1.14628906249996,46.311376953125034],[-1.786523437499937,46.51484375000001],[-2.059375,46.81030273437497],[-2.01889648437492,47.03764648437502],[-2.197070312499989,47.16293945312506],[-2.027587890625028,47.27358398437502],[-1.742529296874949,47.21596679687502],[-1.97539062499996,47.31069335937505],[-2.503125,47.31206054687496],[-2.427685546874983,47.47089843749998],[-2.770312499999989,47.513867187499955],[-2.787207031249949,47.62553710937496],[-4.312109374999949,47.82290039062502],[-4.678808593749949,48.03950195312501],[-4.32944335937492,48.169970703125045],[-4.577148437499943,48.2900390625],[-4.241406249999926,48.30366210937501],[-4.719384765624966,48.363134765625034],[-4.7625,48.45024414062502],[-4.531201171874983,48.61997070312506],[-3.231445312499972,48.84082031250003],[-2.692333984374983,48.53681640624998],[-2.446191406249937,48.64829101562506],[-2.00371093749996,48.58208007812499],[-1.905712890624955,48.69711914062506],[-1.376464843749972,48.65258789062503],[-1.565478515624932,48.805517578125034],[-1.583105468749977,49.20239257812506],[-1.856445312499972,49.68378906249998],[-1.258642578124949,49.68017578125006],[-1.138525390624977,49.38789062500001],[-0.163476562499937,49.296777343749994],[0.41689453125008,49.448388671874994],[0.129394531250028,49.508447265624966],[0.186718749999983,49.703027343749994],[1.245507812500051,49.99824218750001],[1.5927734375,50.25219726562506],[1.672265625000023,50.885009765625],[2.52490234375,51.097119140624955],[2.759375,50.750634765624994],[3.10683593750008,50.779443359374994],[3.27333984375008,50.53154296875002],[3.595410156250068,50.47734374999999],[3.689355468750023,50.30605468750002],[4.174609375000017,50.24648437500005],[4.149316406250023,49.971582031249994],[4.545019531250063,49.96025390624999],[4.818652343750045,50.153173828125034],[4.867578125000051,49.78813476562502],[5.50732421875,49.51088867187502],[5.789746093749983,49.53828125000001]]]]},"properties":{"name":"France","childNum":10,"cp":[2.8719426,46.8222422]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-7.186865234374949,62.139306640624966],[-7.116796874999977,62.046826171874955],[-7.379101562499926,62.07480468749998],[-7.186865234374949,62.139306640624966]]],[[[-6.631054687499955,62.22788085937498],[-6.655810546874932,62.09360351562498],[-6.840527343749983,62.119287109374994],[-6.725195312499949,61.95146484374999],[-7.17216796874996,62.28559570312501],[-6.631054687499955,62.22788085937498]]],[[[-6.406054687499932,62.258642578125034],[-6.544140624999926,62.20561523437499],[-6.554589843749994,62.35566406250001],[-6.406054687499932,62.258642578125034]]]]},"properties":{"name":"Faeroe Is.","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[158.31484375,6.813671875],[158.18339843750002,6.801269531250057],[158.13476562499997,6.944824218749986],[158.29462890625004,6.951074218750023],[158.31484375,6.813671875]]],[[[138.14267578125006,9.50068359375004],[138.06708984375004,9.419042968750006],[138.18583984375007,9.593310546874989],[138.14267578125006,9.50068359375004]]]]},"properties":{"name":"Micronesia","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[13.293554687500006,2.161572265624997],[13.172167968750017,1.78857421875],[13.21630859375,1.2484375],[13.851367187500017,1.41875],[14.180859375000011,1.370214843749991],[14.429882812500011,0.901464843749991],[14.32421875,0.62421875],[13.949609375000023,0.353808593749989],[13.860058593750011,-0.203320312500011],[14.47412109375,-0.573437500000011],[14.383984375000011,-1.890039062500009],[14.162890625000017,-2.217578125],[14.199804687500006,-2.354199218750011],[13.993847656250011,-2.490625],[13.886914062500011,-2.465429687500006],[13.733789062500023,-2.138476562500003],[13.464941406250006,-2.395410156250009],[12.991992187500017,-2.313378906250009],[12.793554687500006,-1.931835937500011],[12.590429687500006,-1.826855468750011],[12.43212890625,-1.928906250000011],[12.446386718750006,-2.329980468750009],[12.064453125,-2.41259765625],[11.60546875,-2.342578125],[11.537792968750011,-2.83671875],[11.760156250000023,-2.983105468750011],[11.715429687500006,-3.176953125000011],[11.934179687500006,-3.318554687500011],[11.8798828125,-3.665917968750009],[11.685742187500011,-3.68203125],[11.504296875000023,-3.5203125],[11.234472656250006,-3.690820312500009],[11.130175781250017,-3.916308593750003],[10.34765625,-3.013085937500009],[9.722070312500023,-2.467578125],[10.06201171875,-2.549902343750006],[9.624609375,-2.367089843750009],[9.298925781250006,-1.903027343750011],[9.483203125000017,-1.894628906250006],[9.265625,-1.825097656250009],[9.036328125000011,-1.308886718750003],[9.31884765625,-1.632031250000011],[9.501074218750006,-1.55517578125],[9.295800781250023,-1.515234375],[9.3466796875,-1.325],[9.203808593750011,-1.382421875],[9.064648437500011,-1.29833984375],[8.703125,-0.591015625000011],[8.946386718750006,-0.688769531250003],[9.296679687500017,-0.351269531250011],[9.354882812500023,0.343603515624991],[9.468164062500023,0.15976562499999],[9.796777343750023,0.044238281249989],[10.00146484375,0.194970703124994],[9.546484375,0.295947265624989],[9.324804687500006,0.552099609374991],[9.495312500000011,0.664843749999989],[9.617968750000017,0.576513671874991],[9.5908203125,1.031982421875],[9.636132812500023,1.046679687499989],[9.676464843750011,1.07470703125],[9.70458984375,1.079980468749994],[9.760546875000017,1.07470703125],[9.788671875,1.025683593749989],[9.803906250000011,0.998730468749997],[9.90673828125,0.960107421874994],[11.335351562500023,0.999707031249997],[11.332324218750017,1.528369140624989],[11.328710937500006,2.167431640624997],[11.348437500000017,2.299707031249994],[11.558984375000023,2.302197265624997],[13.2203125,2.256445312499991],[13.293554687500006,2.161572265624997]]]},"properties":{"name":"Gabon","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-1.065576171874966,50.69023437500002],[-1.25146484375,50.58881835937498],[-1.563427734374955,50.666113281250006],[-1.31279296874996,50.77348632812502],[-1.065576171874966,50.69023437500002]]],[[[-4.196777343749972,53.321435546874966],[-4.04936523437496,53.30576171874998],[-4.373046875,53.13417968750002],[-4.56787109375,53.386474609375],[-4.315087890625023,53.41723632812503],[-4.196777343749972,53.321435546874966]]],[[[-6.218017578125,54.08872070312506],[-6.649804687499937,54.05864257812496],[-7.007714843749937,54.40668945312501],[-7.324511718750017,54.13344726562502],[-7.606542968750006,54.14384765625002],[-8.118261718749977,54.41425781250004],[-7.75439453125,54.59492187499998],[-7.910595703124955,54.698339843750006],[-7.55039062499992,54.767968749999966],[-7.218652343749937,55.09199218749998],[-6.475048828124955,55.24101562499999],[-6.035791015624994,55.14453125000003],[-5.71684570312496,54.817480468750034],[-5.878613281249955,54.64130859375001],[-5.582519531249943,54.66342773437498],[-5.470410156249926,54.500195312499955],[-5.671093749999955,54.54975585937501],[-5.60678710937492,54.272558593750034],[-6.019042968749972,54.05126953124997],[-6.218017578125,54.08872070312506]]],[[[-5.105419921875011,55.448828125000034],[-5.331494140624955,55.481054687500034],[-5.318115234375,55.709179687499955],[-5.105419921875011,55.448828125000034]]],[[[-6.128906249999972,55.93056640625002],[-6.055322265624994,55.69531249999997],[-6.305078124999966,55.60693359375],[-6.286425781249989,55.77250976562499],[-6.491357421874994,55.697314453125045],[-6.462841796874955,55.808251953124994],[-6.128906249999972,55.93056640625002]]],[[[-5.970068359374949,55.814550781250034],[-6.071972656250011,55.893115234375045],[-5.72514648437496,56.118554687499966],[-5.970068359374949,55.814550781250034]]],[[[-5.77788085937496,56.344335937500034],[-6.313427734374983,56.29365234375001],[-6.138867187499955,56.490625],[-6.286328124999983,56.61186523437502],[-6.102734374999955,56.645654296874966],[-5.760839843749949,56.49067382812501],[-5.77788085937496,56.344335937500034]]],[[[-7.249853515624977,57.115332031250006],[-7.410546874999937,57.38110351562506],[-7.26713867187496,57.37177734375001],[-7.249853515624977,57.115332031250006]]],[[[-6.144726562499983,57.50498046874998],[-6.135546874999989,57.31425781250002],[-5.672460937499977,57.252685546875],[-5.94907226562492,57.045166015625],[-6.034375,57.20122070312499],[-6.322705078124926,57.20249023437498],[-6.761132812499994,57.4423828125],[-6.305957031249989,57.67197265624998],[-6.144726562499983,57.50498046874998]]],[[[-7.205566406250028,57.682958984375006],[-7.182617187499972,57.53330078125006],[-7.514746093749949,57.60195312500002],[-7.205566406250028,57.682958984375006]]],[[[-6.198681640624983,58.36328125000003],[-6.554589843749994,58.092871093750006],[-6.425195312499937,58.02128906249999],[-6.983105468749983,57.75],[-7.083447265624926,57.81376953124999],[-6.856835937499937,57.92353515624998],[-7.085253906249932,58.18217773437499],[-6.726464843749937,58.189404296874955],[-6.776464843750006,58.30151367187497],[-6.237451171874966,58.50283203125005],[-6.198681640624983,58.36328125000003]]],[[[-3.109667968749932,58.515478515625034],[-3.212353515624983,58.32124023437501],[-3.99003906249996,57.95903320312502],[-4.035595703124926,57.85200195312498],[-3.857128906249983,57.81855468750001],[-4.134521484375,57.57773437500006],[-3.402783203124955,57.708251953125],[-2.074072265624977,57.70239257812506],[-1.780664062499994,57.474023437499966],[-2.592675781249937,56.56157226562499],[-3.309960937499966,56.36347656250004],[-2.885156249999937,56.397509765625045],[-2.674267578124955,56.25341796875],[-3.362255859374955,56.02763671875002],[-3.789062499999972,56.09521484375],[-3.048730468749937,55.951953125000045],[-2.599316406249955,56.02729492187501],[-2.14707031249992,55.90297851562502],[-1.655371093749949,55.57036132812502],[-1.232421874999943,54.703710937500034],[-0.084375,54.118066406249994],[-0.20556640625,54.021728515625],[0.115332031250006,53.609277343749994],[-0.270019531249972,53.73676757812504],[-0.659912109375,53.72402343750002],[-0.293701171875,53.69233398437504],[0.270996093750028,53.33549804687499],[0.355761718750045,53.15996093750002],[0.0458984375,52.90561523437498],[0.279785156250028,52.80869140625006],[0.55878906250004,52.96694335937505],[1.05556640625008,52.95898437500003],[1.656738281249972,52.753710937500045],[1.74658203125,52.46899414062503],[1.59140625,52.11977539062502],[1.232421875000057,51.97124023437496],[1.188476562500057,51.803369140624966],[0.752246093750017,51.729589843750034],[0.890917968750017,51.571435546874966],[0.42451171875004,51.465625],[1.414941406250023,51.36328125],[1.397558593750034,51.18203125000002],[0.960156250000011,50.92587890624998],[0.299707031249994,50.775976562500006],[-0.785253906249949,50.76542968749999],[-1.416455078124955,50.896875],[-1.334472656249943,50.82080078124997],[-1.516748046874937,50.747460937499966],[-2.031054687499932,50.72539062499999],[-2.035839843749926,50.603076171875045],[-2.999414062499937,50.71660156249999],[-3.40458984374996,50.63242187499998],[-3.679785156250006,50.239941406249955],[-4.194580078124972,50.39331054687503],[-4.727978515624926,50.29047851562504],[-5.11850585937492,50.038330078125],[-5.622119140624932,50.05068359375002],[-4.188183593749926,51.18852539062502],[-3.135986328124972,51.20502929687501],[-2.433056640624926,51.74072265625],[-3.293115234374994,51.390429687500045],[-3.890771484374994,51.591650390625006],[-4.234570312499955,51.56909179687503],[-4.091015624999926,51.65991210937506],[-4.38627929687496,51.74106445312506],[-4.902294921874926,51.626269531250045],[-5.168359374999937,51.74072265625],[-5.183349609374972,51.94965820312501],[-4.217724609374983,52.277441406250006],[-3.980322265624949,52.54174804687503],[-4.101464843750023,52.915478515624955],[-4.683056640624926,52.80615234374997],[-4.268554687499943,53.14453125],[-3.427734374999972,53.34067382812498],[-3.097558593749937,53.260302734375045],[-3.064746093749932,53.426855468750034],[-2.74951171875,53.310205078124994],[-3.064599609374994,53.512841796874966],[-2.84648437499996,54.135302734375045],[-3.165966796874955,54.12792968750006],[-3.56938476562496,54.46757812499996],[-3.464599609374943,54.77309570312505],[-3.036230468749977,54.95307617187501],[-3.550439453124937,54.94741210937502],[-3.957910156249994,54.780957031249955],[-4.818066406249983,54.84614257812501],[-4.911230468749949,54.68945312500006],[-5.032324218749949,54.76137695312505],[-5.172705078124949,54.98588867187496],[-4.676757812499972,55.50131835937498],[-4.871679687499977,55.87392578125005],[-4.58408203124992,55.93867187500001],[-4.844091796874949,56.05117187499999],[-4.80029296875,56.158349609374994],[-5.228222656249983,55.886328125],[-5.084326171874977,56.197460937499955],[-5.41044921874996,55.995361328125],[-5.55644531249996,55.389599609374955],[-5.730664062499926,55.33413085937502],[-5.504492187499949,55.80239257812502],[-5.609570312499955,56.055273437500034],[-5.188378906249937,56.75805664062503],[-5.652441406249977,56.531982421875],[-6.133691406249966,56.706689453124966],[-5.730615234374994,56.853076171875045],[-5.86142578124992,56.902685546875006],[-5.561914062499994,57.23271484375002],[-5.794921874999972,57.37880859375002],[-5.581787109374972,57.546777343749966],[-5.744921874999989,57.668310546875034],[-5.608349609374955,57.88134765625],[-5.157226562499972,57.88134765625],[-5.413183593750006,58.06972656250002],[-5.338281250000023,58.23872070312498],[-5.008300781250028,58.262646484374955],[-5.016748046874966,58.566552734374966],[-4.433251953124937,58.51284179687505],[-3.25913085937492,58.65],[-3.053076171874949,58.63481445312502],[-3.109667968749932,58.515478515625034]]],[[[-3.057421874999932,59.02963867187498],[-2.793017578124989,58.906933593749955],[-3.331640624999949,58.97124023437499],[-3.31035156249996,59.13081054687498],[-3.057421874999932,59.02963867187498]]],[[[-1.30810546875,60.5375],[-1.052441406249955,60.44448242187502],[-1.299462890624994,59.87866210937503],[-1.290917968749937,60.153466796874966],[-1.663769531249983,60.282519531250074],[-1.374609374999949,60.33291015625002],[-1.571777343749972,60.494433593750074],[-1.363964843750011,60.60957031249998],[-1.30810546875,60.5375]]]]},"properties":{"name":"United Kingdom","childNum":14,"cp":[-2.5830348,54.4598409]}},{"geometry":{"type":"Polygon","coordinates":[[[46.30546875000002,41.507714843749994],[46.61894531250002,41.34375],[46.67255859375001,41.28681640625],[46.66240234375002,41.245507812499994],[46.62636718750002,41.15966796875],[46.534375,41.08857421875],[46.43095703125002,41.077050781249994],[46.086523437500006,41.183837890625],[45.28095703125001,41.449560546875],[45.21718750000002,41.423193359375],[45.00136718750002,41.290966796875],[44.97587890625002,41.277490234374994],[44.81132812500002,41.259375],[44.077246093750006,41.182519531249994],[43.43339843750002,41.155517578125],[43.20546875000002,41.199169921875],[43.15283203125,41.23642578125],[43.14101562500002,41.26484375],[43.17128906250002,41.287939453125],[43.149023437500006,41.30712890625],[43.05712890625,41.352832031249996],[42.90673828125,41.466845703124996],[42.82167968750002,41.4923828125],[42.78789062500002,41.563720703125],[42.75410156250001,41.57890625],[42.68242187500002,41.585742187499996],[42.60683593750002,41.57880859375],[42.590429687500006,41.57070312499999],[42.5673828125,41.55927734375],[42.46640625,41.43984375],[41.92578125,41.495654296874996],[41.82353515625002,41.432373046875],[41.779394531250006,41.44052734375],[41.701757812500006,41.471582031249994],[41.57656250000002,41.497314453125],[41.51005859375002,41.517480468749994],[41.701757812500006,41.705419921875],[41.76298828125002,41.970019531249996],[41.48876953125,42.659326171874994],[40.83662109375001,43.0634765625],[40.46210937500001,43.145703125],[39.97832031250002,43.419824218749994],[40.02373046875002,43.48486328125],[40.084570312500006,43.553125],[40.648046875,43.53388671875],[40.941992187500006,43.41806640625],[41.083105468750006,43.374462890625],[41.35820312500002,43.333398437499994],[41.46074218750002,43.276318359375],[41.58056640625,43.21923828125],[42.76064453125002,43.169580078124994],[42.99160156250002,43.09150390625],[43.00019531250001,43.049658203125],[43.08916015625002,42.9890625],[43.55781250000001,42.844482421875],[43.623046875,42.80771484375],[43.78261718750002,42.747021484375],[43.79873046875002,42.727783203125],[43.79541015625,42.702978515625],[43.74990234375002,42.657519531249996],[43.738378906250006,42.616992187499996],[43.759863281250006,42.59384765625],[43.82597656250002,42.571533203125],[43.95742187500002,42.566552734374994],[44.00468750000002,42.595605468749994],[44.10273437500001,42.616357421874994],[44.32949218750002,42.70351562499999],[44.505859375,42.7486328125],[44.77109375,42.616796875],[44.85048828125002,42.746826171875],[44.87099609375002,42.756396484374996],[44.943359375,42.730273437499996],[45.07158203125002,42.694140625],[45.160253906250006,42.675],[45.34375,42.52978515625],[45.56289062500002,42.5357421875],[45.70527343750001,42.498095703124996],[45.7275390625,42.475048828125],[45.63427734375,42.234716796875],[45.63857421875002,42.205078125],[46.21269531250002,41.989892578124994],[46.42988281250001,41.890966796875],[46.18427734375001,41.7021484375],[46.30546875000002,41.507714843749994]]]},"properties":{"name":"Georgia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-0.068603515625,11.115625],[0.009423828125023,11.02099609375],[-0.08632812499999,10.673046875],[0.380859375,10.291845703124991],[0.264550781250023,9.644726562499997],[0.342578125000017,9.604150390624994],[0.2333984375,9.463525390624994],[0.525683593750017,9.398486328124989],[0.48876953125,8.851464843749994],[0.37255859375,8.75927734375],[0.686328125000017,8.354882812499994],[0.5,7.546875],[0.634765625,7.353662109374994],[0.525585937500011,6.850927734374991],[0.736914062500006,6.452587890624997],[1.187207031250011,6.089404296874989],[0.94970703125,5.810253906249997],[0.259667968750023,5.75732421875],[-2.001855468749994,4.762451171875],[-3.114013671875,5.088671874999989],[-2.815673828125,5.153027343749997],[-2.754980468749977,5.432519531249994],[-2.793652343749983,5.60009765625],[-2.998291015625,5.71132812499999],[-3.227148437499977,6.749121093749991],[-2.959082031249977,7.454541015624997],[-2.789746093749983,7.931933593749989],[-2.668847656249994,8.022216796875],[-2.613378906249977,8.046679687499989],[-2.600976562499994,8.082226562499997],[-2.619970703124977,8.12109375],[-2.61171875,8.147558593749991],[-2.538281249999983,8.171630859375],[-2.505859375,8.208740234375],[-2.600390624999989,8.800439453124994],[-2.649218749999989,8.956591796874989],[-2.689892578124983,9.025097656249997],[-2.746923828124977,9.045117187499997],[-2.705761718749983,9.351367187499989],[-2.695849609374989,9.481347656249994],[-2.706201171874994,9.533935546875],[-2.765966796874977,9.658056640624991],[-2.780517578125,9.745849609375],[-2.791162109374994,10.432421874999989],[-2.914892578124977,10.592333984374989],[-2.829931640624977,10.998388671874991],[-1.04248046875,11.010058593749989],[-0.627148437499983,10.927392578124994],[-0.299462890624994,11.166894531249994],[-0.068603515625,11.115625]]]},"properties":{"name":"Ghana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-11.389404296875,12.404394531249991],[-11.502197265625,12.198632812499994],[-11.30517578125,12.015429687499989],[-10.933203124999977,12.205175781249991],[-10.709228515625,11.898730468749989],[-10.274853515624983,12.212646484375],[-9.754003906249977,12.029931640624994],[-9.358105468749983,12.255419921874989],[-9.395361328124977,12.464648437499989],[-9.043066406249977,12.40234375],[-8.818310546874983,11.922509765624994],[-8.822021484375,11.673242187499994],[-8.398535156249977,11.366552734374991],[-8.666699218749983,11.009472656249997],[-8.33740234375,10.990625],[-8.266650390624989,10.485986328124994],[-8.007275390624983,10.321875],[-7.990625,10.1625],[-8.155175781249994,9.973193359374989],[-8.136962890625,9.49570312499999],[-7.896191406249983,9.415869140624991],[-7.918066406249977,9.188525390624989],[-7.839404296874989,9.151611328125],[-7.7998046875,9.115039062499989],[-7.777978515624994,9.080859374999989],[-7.902099609375,9.01708984375],[-7.938183593749983,8.979785156249989],[-7.950976562499989,8.786816406249997],[-7.719580078124977,8.643017578124997],[-7.696093749999989,8.375585937499991],[-7.823583984374977,8.467675781249994],[-7.953125,8.477734375],[-8.236962890624994,8.455664062499991],[-8.244140625,8.407910156249997],[-8.256103515625,8.253710937499989],[-8.217138671874977,8.219677734374997],[-8.140625,8.181445312499989],[-8.048583984375,8.169726562499989],[-8.009863281249977,8.07851562499999],[-8.126855468749994,7.867724609374989],[-8.115429687499983,7.7607421875],[-8.205957031249994,7.59023437499999],[-8.231884765624983,7.556738281249991],[-8.429980468749989,7.601855468749989],[-8.486425781249977,7.558496093749994],[-8.659765624999977,7.688378906249994],[-8.8896484375,7.2626953125],[-9.11757812499999,7.215917968749991],[-9.463818359374983,7.415869140624991],[-9.369140625,7.703808593749997],[-9.518261718749983,8.34609375],[-9.781982421875,8.537695312499991],[-10.064355468749994,8.429882812499997],[-10.147412109374983,8.519726562499997],[-10.233056640624994,8.488818359374989],[-10.283203125,8.485156249999989],[-10.360058593749983,8.495507812499994],[-10.394433593749994,8.48095703125],[-10.496435546874977,8.362109374999989],[-10.557714843749977,8.315673828125],[-10.686962890624983,8.321679687499994],[-10.712109374999983,8.335253906249989],[-10.677343749999977,8.400585937499997],[-10.500537109374989,8.687548828124989],[-10.615966796875,9.059179687499991],[-10.726855468749989,9.081689453124994],[-10.747021484374983,9.095263671874989],[-10.749951171874983,9.122363281249989],[-10.687646484374994,9.261132812499994],[-10.682714843749977,9.289355468749989],[-10.758593749999989,9.385351562499991],[-11.047460937499977,9.786328125],[-11.180859374999983,9.925341796874989],[-11.205664062499977,9.977734375],[-11.273632812499983,9.996533203124997],[-11.911083984374983,9.993017578124991],[-12.142333984375,9.87539062499999],[-12.427978515625,9.898144531249997],[-12.557861328125,9.704980468749994],[-12.755859375,9.373583984374989],[-12.958789062499989,9.263330078124994],[-13.077294921874994,9.069628906249989],[-13.292675781249983,9.04921875],[-13.436279296875,9.4203125],[-13.691357421874983,9.535791015624994],[-13.689794921874977,9.927783203124989],[-13.820117187499989,9.88720703125],[-14.045019531249977,10.141259765624994],[-14.426904296874994,10.248339843749989],[-14.609570312499983,10.549853515624989],[-14.593505859375,10.766699218749991],[-14.677343749999977,10.68896484375],[-14.775927734374989,10.931640625],[-14.88671875,10.968066406249989],[-14.975,10.803417968749997],[-15.051220703124983,10.834570312499991],[-15.043017578124989,10.940136718749997],[-14.9990234375,10.9921875],[-14.944433593749977,11.072167968749994],[-14.779296875,11.405517578125],[-14.720263671874989,11.48193359375],[-14.682958984374977,11.508496093749997],[-14.604785156249989,11.511621093749994],[-14.452441406249989,11.556201171874989],[-14.327832031249983,11.629785156249994],[-14.265576171874983,11.659912109375],[-14.122314453125,11.65195312499999],[-13.953222656249977,11.664599609374989],[-13.732763671874977,11.736035156249997],[-13.730664062499983,11.959863281249994],[-13.737988281249983,12.009667968749994],[-13.816308593749994,12.054492187499989],[-13.948876953124994,12.178173828124997],[-13.8875,12.246875],[-13.759765625,12.262353515624994],[-13.673535156249983,12.478515625],[-13.732617187499983,12.592822265624989],[-13.729248046875,12.673925781249991],[-13.082910156249994,12.633544921875],[-13.061279296875,12.489990234375],[-12.930712890624989,12.532275390624989],[-12.399072265624994,12.340087890625],[-11.389404296875,12.404394531249991]]]},"properties":{"name":"Guinea","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-16.763330078124994,13.064160156249997],[-16.824804687499977,13.341064453125],[-16.669335937499994,13.475],[-16.41337890624999,13.269726562499997],[-15.427490234375,13.46835937499999],[-16.135449218749983,13.4482421875],[-16.351806640625,13.34335937499999],[-16.56230468749999,13.587304687499994],[-15.509667968749994,13.586230468750003],[-15.426855468749977,13.727001953124997],[-15.108349609374983,13.81210937499999],[-14.405468749999983,13.503710937500003],[-13.977392578124977,13.54345703125],[-13.826708984374989,13.4078125],[-14.246777343749983,13.23583984375],[-15.151123046875,13.556494140624991],[-15.286230468749977,13.39599609375],[-15.814404296874983,13.325146484374997],[-15.834277343749989,13.156445312499997],[-16.648779296874977,13.154150390624991],[-16.763330078124994,13.064160156249997]]]},"properties":{"name":"Gambia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-15.895898437499966,11.082470703124969],[-15.963964843749977,11.05898437499998],[-15.937695312499955,11.192773437499966],[-15.895898437499966,11.082470703124969]]],[[[-16.11450195312503,11.059423828124977],[-16.236425781249977,11.113427734374966],[-16.06733398437501,11.197216796874983],[-16.11450195312503,11.059423828124977]]],[[[-15.901806640624926,11.4658203125],[-16.02319335937497,11.477148437499991],[-15.964550781249926,11.59829101562498],[-15.901806640624926,11.4658203125]]],[[[-15.986425781249949,11.882031249999969],[-16.038330078124943,11.759716796875011],[-16.15244140624992,11.876806640624963],[-15.986425781249949,11.882031249999969]]],[[[-13.759765625,12.262353515624994],[-13.8875,12.246875],[-13.948876953124966,12.178173828124997],[-13.737988281250011,12.009667968750037],[-13.730664062499926,11.959863281250009],[-13.73276367187492,11.736035156249983],[-13.953222656249977,11.664599609374989],[-14.265576171874926,11.659912109375014],[-14.327832031250011,11.629785156250009],[-14.452441406249989,11.556201171875017],[-14.604785156249932,11.511621093749994],[-14.682958984374949,11.508496093749983],[-14.720263671875017,11.481933593749986],[-14.779296874999972,11.405517578125057],[-14.944433593749949,11.072167968749994],[-14.999023437499972,10.992187500000043],[-15.04301757812496,10.940136718750011],[-15.09375,11.011035156249974],[-15.054589843749994,11.141943359375006],[-15.222119140624926,11.030908203125037],[-15.216699218749994,11.15625],[-15.39311523437496,11.217236328124983],[-15.354687499999955,11.396337890624963],[-15.479492187499972,11.410302734374966],[-15.072656249999937,11.597802734374966],[-15.230371093750023,11.686767578124972],[-15.412988281249994,11.615234374999972],[-15.501904296875011,11.723779296874966],[-15.467187499999937,11.842822265624974],[-15.078271484374937,11.968994140625014],[-15.941748046875006,11.786621093749986],[-15.92021484374996,11.93779296874996],[-16.138427734375,11.917285156250045],[-16.32807617187501,12.051611328124963],[-16.244580078124955,12.237109375],[-16.43681640624996,12.204150390625045],[-16.711816406249937,12.354833984375006],[-16.656933593749955,12.364355468749991],[-16.52133789062495,12.348632812499986],[-16.41630859374996,12.367675781250057],[-16.24150390624996,12.443310546875011],[-16.144189453124937,12.457421875000037],[-15.839550781249955,12.437890624999966],[-15.57480468749992,12.490380859375009],[-15.19609375,12.679931640624986],[-14.3492187499999,12.67641601562498],[-14.064843749999966,12.675292968750014],[-13.729248046875,12.673925781250006],[-13.732617187499983,12.592822265625003],[-13.673535156249926,12.478515624999986],[-13.759765625,12.262353515624994]]]]},"properties":{"name":"Guinea-Bissau","childNum":5}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[11.332324218750017,1.528369140624989],[11.335351562500023,0.999707031250011],[9.906738281250028,0.960107421875037],[9.80390625000004,0.998730468749997],[9.788671875000034,1.025683593749974],[9.760546874999989,1.074707031250014],[9.704589843750057,1.079980468750023],[9.676464843750011,1.074707031250014],[9.636132812500051,1.046679687499989],[9.590820312500057,1.031982421875014],[9.599414062500045,1.054443359374972],[9.509863281250006,1.114794921875017],[9.385937500000068,1.13925781250002],[9.807031250000051,1.927490234375028],[9.77968750000008,2.068212890625006],[9.800781250000028,2.304443359375],[9.826171875000057,2.297802734374969],[9.8369140625,2.242382812500054],[9.870117187500028,2.21328125],[9.979882812499994,2.167773437500045],[10.790917968750023,2.167578125],[11.096582031250051,2.167480468749986],[11.328710937500006,2.167431640624969],[11.332324218750017,1.528369140624989]]],[[[8.735742187500023,3.758300781249972],[8.910058593750023,3.758203125000051],[8.946093750000074,3.627539062499977],[8.704003906250051,3.223632812500028],[8.474902343749989,3.264648437500043],[8.464648437500045,3.450585937499994],[8.735742187500023,3.758300781249972]]]]},"properties":{"name":"Eq. Guinea","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[23.852246093749983,35.53544921874999],[24.166015625000057,35.59521484375],[24.108984374999977,35.49580078124998],[24.35400390625,35.359472656250034],[25.73017578125004,35.34858398437501],[25.791308593750074,35.122851562500045],[26.32021484375008,35.315136718749955],[26.165625,35.018603515625045],[24.79980468750003,34.93447265625002],[24.70888671875008,35.08906250000001],[24.463671875000045,35.160351562499955],[23.59277343749997,35.257226562499966],[23.56982421875,35.534765625000034],[23.67265624999999,35.51391601562506],[23.736914062500034,35.65551757812503],[23.852246093749983,35.53544921874999]]],[[[27.17607421874999,35.46528320312498],[27.070703125000023,35.59775390624998],[27.22314453125,35.820458984374966],[27.17607421874999,35.46528320312498]]],[[[23.053808593750034,36.18979492187498],[22.91083984375004,36.220996093750045],[22.950488281250045,36.38393554687502],[23.053808593750034,36.18979492187498]]],[[[27.84277343750003,35.929296875000034],[27.71552734375004,35.95732421874996],[27.71630859375003,36.17158203125001],[28.23183593750005,36.43364257812502],[28.087792968750023,36.06533203125002],[27.84277343750003,35.929296875000034]]],[[[25.48242187500003,36.39262695312502],[25.37050781250005,36.35893554687499],[25.408984375000074,36.473730468750006],[25.48242187500003,36.39262695312502]]],[[[26.46064453125001,36.58540039062501],[26.270019531250057,36.54692382812499],[26.370019531250023,36.63857421875002],[26.46064453125001,36.58540039062501]]],[[[26.94960937500005,36.72709960937502],[27.214941406250006,36.89863281249998],[27.352148437499977,36.86889648437506],[26.94960937500005,36.72709960937502]]],[[[25.859375,36.79042968750005],[25.74316406250003,36.78974609374998],[26.06445312500003,36.90273437500002],[25.859375,36.79042968750005]]],[[[27.01972656250004,36.95903320312502],[26.91992187500003,36.94521484375005],[26.88867187499997,37.087255859375034],[27.01972656250004,36.95903320312502]]],[[[25.278906250000034,37.06840820312502],[25.105468750000057,37.034960937500045],[25.235058593750068,37.148535156250006],[25.278906250000034,37.06840820312502]]],[[[25.54589843749997,36.96757812499999],[25.45673828125001,36.9296875],[25.361914062500063,37.07041015624998],[25.52529296875005,37.19638671875006],[25.54589843749997,36.96757812499999]]],[[[24.523535156250063,37.125097656250006],[24.42480468750003,37.131982421874994],[24.48378906250005,37.21020507812503],[24.523535156250063,37.125097656250006]]],[[[25.402734375000023,37.419140624999955],[25.312695312500068,37.48930664062496],[25.462988281250063,37.47109375],[25.402734375000023,37.419140624999955]]],[[[26.029296875000057,37.529394531250034],[26.086328125000023,37.63491210937505],[26.351367187500017,37.67431640625],[26.029296875000057,37.529394531250034]]],[[[25.255859375000057,37.59960937500006],[25.156347656250034,37.54506835937505],[24.99648437500005,37.676904296874994],[25.255859375000057,37.59960937500006]]],[[[24.35595703125003,37.57685546875004],[24.28896484375005,37.52827148437498],[24.37910156250004,37.682714843750006],[24.35595703125003,37.57685546875004]]],[[[26.82441406250004,37.81142578125005],[27.05507812500005,37.70927734375002],[26.84492187500004,37.64472656250001],[26.58105468750003,37.723730468750034],[26.82441406250004,37.81142578125005]]],[[[20.888476562500074,37.805371093749955],[20.993945312500074,37.70800781250003],[20.81855468750004,37.66474609375001],[20.61953125000008,37.855029296875045],[20.691503906250006,37.929541015625034],[20.888476562500074,37.805371093749955]]],[[[24.991699218750057,37.75961914062506],[24.962207031250074,37.69238281250003],[24.7001953125,37.961669921875],[24.956347656250045,37.90478515625006],[24.991699218750057,37.75961914062506]]],[[[20.61230468750003,38.38334960937502],[20.761328125,38.07055664062497],[20.523535156250063,38.106640624999955],[20.4521484375,38.23417968750002],[20.35253906250003,38.179882812499955],[20.563183593750068,38.474951171875034],[20.61230468750003,38.38334960937502]]],[[[26.094042968750017,38.21806640625002],[25.891894531250045,38.243310546874994],[25.991406250000068,38.353515625],[25.846093750000023,38.57402343749996],[26.16035156250001,38.54072265625001],[26.094042968750017,38.21806640625002]]],[[[20.68671875000001,38.60869140625002],[20.5546875,38.58256835937502],[20.69414062499999,38.84423828125003],[20.68671875000001,38.60869140625002]]],[[[24.67470703125005,38.80922851562502],[24.54101562499997,38.788671875],[24.485644531250074,38.980273437500045],[24.67470703125005,38.80922851562502]]],[[[23.41542968750008,38.958642578124994],[23.525,38.8134765625],[24.127539062500034,38.648486328125045],[24.27578125000005,38.22001953124996],[24.58837890625003,38.12397460937504],[24.53652343750005,37.97973632812506],[24.212011718750006,38.11752929687506],[24.040136718750006,38.389990234375034],[23.65078125000008,38.44306640625001],[23.25214843750004,38.80122070312498],[22.870312500000068,38.870507812499966],[23.258203125000023,39.03134765625006],[23.41542968750008,38.958642578124994]]],[[[26.41015625000003,39.329443359375034],[26.59560546875005,39.04882812499997],[26.488671875000023,39.074804687500034],[26.46875,38.97280273437502],[26.10791015625,39.08105468749997],[26.273144531249983,39.19755859374999],[26.072363281250034,39.095605468749994],[25.84414062500008,39.20004882812506],[26.16542968750008,39.37353515625006],[26.41015625000003,39.329443359375034]]],[[[20.077929687500045,39.432714843750034],[19.883984375000068,39.461523437500034],[19.646484375,39.76708984375003],[19.926074218750017,39.773730468750045],[19.8466796875,39.66811523437502],[20.077929687500045,39.432714843750034]]],[[[25.43769531250004,39.98330078125002],[25.357031250000063,39.80810546875003],[25.24941406250005,39.89414062500006],[25.06220703125004,39.852392578125006],[25.05800781250005,39.999658203124966],[25.43769531250004,39.98330078125002]]],[[[24.774218750000074,40.615185546874955],[24.515527343750023,40.64702148437496],[24.623339843750045,40.79291992187501],[24.774218750000074,40.615185546874955]]],[[[26.03896484375008,40.726757812499955],[25.10449218750003,40.994726562500006],[24.792968750000057,40.857519531250034],[24.47705078125,40.94775390625003],[24.082324218750074,40.72407226562504],[23.762792968750063,40.74780273437497],[23.866796875000034,40.41855468750006],[24.21279296875008,40.32778320312502],[24.343359375000034,40.14770507812503],[23.913183593750063,40.35878906250005],[23.72792968750008,40.329736328124994],[23.96748046875001,40.11455078125002],[23.947070312500045,39.96557617187506],[23.66455078125003,40.22382812499998],[23.42626953125,40.26396484374999],[23.62734375,39.92407226562503],[22.896484375000057,40.39990234374997],[22.92226562500008,40.59086914062499],[22.629492187500034,40.49555664062501],[22.59218750000005,40.03691406250002],[23.327734374999977,39.174902343750006],[23.15468750000008,39.10146484375005],[23.16171875,39.25776367187501],[22.92138671874997,39.30634765625004],[22.886035156250074,39.16997070312496],[23.066699218750017,39.03793945312498],[22.569140625000074,38.86748046874999],[23.25292968750003,38.66123046875006],[23.68398437500008,38.35244140625002],[23.96699218750001,38.275],[24.024511718750006,38.139794921874966],[24.01972656250001,37.67773437499997],[23.50175781249999,38.03486328124998],[23.03632812500004,37.87836914062501],[23.48925781250003,37.440185546875],[23.16152343750005,37.333837890625006],[22.725390625000017,37.542138671874966],[23.16015625000003,36.448095703125034],[22.717187500000023,36.79394531250006],[22.42773437500003,36.47578124999998],[22.08046875000008,37.028955078124966],[21.95556640625003,36.990087890625034],[21.892382812500045,36.73730468749997],[21.58291015625005,37.080957031249994],[21.678906250000068,37.38720703125003],[21.124707031250068,37.89160156250003],[21.40371093750005,38.19667968750002],[21.658398437500068,38.17509765624996],[21.82470703125003,38.328125],[22.846386718750068,37.96757812499996],[23.18349609375008,38.133691406249966],[22.421679687500045,38.43852539062499],[22.319921875,38.35683593750005],[21.96533203124997,38.412451171875006],[21.47255859375005,38.321386718750006],[21.3310546875,38.48730468749997],[21.303320312500034,38.373925781249966],[21.113183593750023,38.38466796875002],[20.768554687500057,38.874414062499966],[21.111621093750045,38.89628906249999],[21.11835937500001,39.029980468749955],[20.71337890625,39.03515625000003],[20.300781250000057,39.32709960937501],[20.19140625,39.545800781249966],[20.099414062500074,39.641259765624966],[20.001269531250074,39.70942382812501],[20.022558593750063,39.710693359375],[20.059765624999983,39.69912109375002],[20.13105468750004,39.66162109375003],[20.206835937500017,39.65351562499998],[20.382421875,39.802636718749994],[20.381640625000017,39.84179687500006],[20.311328125000074,39.95078125000006],[20.311132812500034,39.97944335937504],[20.338476562500006,39.991064453125006],[20.38369140625008,40.0171875],[20.408007812500074,40.049462890624994],[20.4560546875,40.065576171874994],[20.657421875000068,40.11738281249998],[20.881640625000017,40.467919921874994],[21.030859375000034,40.62246093750002],[20.95576171875001,40.775292968749994],[20.96425781250005,40.84990234374999],[21.575781250000034,40.86894531249996],[21.627539062500006,40.896337890625034],[21.77949218750004,40.95043945312506],[21.99335937500001,41.13095703125006],[22.18447265625005,41.15864257812501],[22.49355468750005,41.118505859375006],[22.603613281249977,41.14018554687499],[22.724804687500068,41.17851562499999],[22.78388671875004,41.33198242187498],[23.155957031250068,41.32207031249999],[23.239843750000034,41.38496093750001],[23.372070312500057,41.3896484375],[23.433398437500017,41.39873046874999],[23.53583984375001,41.38603515624999],[23.63515625000008,41.386767578125045],[24.011328124999977,41.460058593750034],[24.03291015625004,41.469091796875034],[24.05605468750005,41.527246093749966],[24.38671875,41.523535156250006],[24.487890625,41.55522460937499],[24.518261718750068,41.55253906249996],[24.773730468750045,41.356103515624994],[24.99355468750008,41.36499023437503],[25.133398437500063,41.31577148437506],[25.251171875000068,41.243554687499994],[25.923339843750057,41.311914062499966],[26.066406250000057,41.35068359375006],[26.135351562499977,41.3857421875],[26.155175781250023,41.43486328124999],[26.143554687500057,41.52153320312496],[26.085546875000063,41.704150390625045],[26.10742187499997,41.72568359374998],[26.20058593750005,41.74379882812502],[26.320898437500034,41.716552734375],[26.581347656250074,41.60126953125004],[26.62490234375008,41.401757812499994],[26.330664062499977,41.23876953125],[26.331054687500057,40.954492187499994],[26.03896484375008,40.726757812499955]]]]},"properties":{"name":"Greece","childNum":29}},{"geometry":{"type":"Polygon","coordinates":[[[-61.71552734375,12.012646484374997],[-61.714990234374994,12.18515625],[-61.60703125,12.223291015624994],[-61.71552734375,12.012646484374997]]]},"properties":{"name":"Grenada","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-46.266699218750006,60.781396484374994],[-46.381542968749955,60.66030273437502],[-46.7880859375,60.758398437500034],[-46.205224609374994,60.943505859374994],[-46.266699218750006,60.781396484374994]]],[[[-37.03125,65.53198242187497],[-37.23842773437494,65.60986328125003],[-37.047509765624966,65.722265625],[-37.03125,65.53198242187497]]],[[[-51.01367187499994,69.55249023437497],[-51.202050781249966,69.525],[-51.33886718749994,69.73203125000006],[-51.094580078125006,69.92416992187503],[-50.67900390624999,69.84853515625],[-51.01367187499994,69.55249023437497]]],[[[-52.73115234375001,69.94472656250005],[-52.0453125,69.8072265625],[-51.90019531249999,69.60478515625007],[-53.57841796874996,69.25664062500002],[-54.18271484374995,69.40351562500001],[-53.65830078124998,69.46513671875005],[-53.825,69.54033203124999],[-54.91914062499998,69.71362304687503],[-54.78789062499996,69.94985351562502],[-54.322607421875034,69.94189453125],[-54.83076171875001,70.13295898437502],[-54.37163085937499,70.31728515625],[-53.296728515625034,70.20537109375002],[-52.73115234375001,69.94472656250005]]],[[[-51.67514648437498,70.855224609375],[-52.11938476562497,70.87065429687502],[-52.10673828124999,70.96801757812497],[-51.67514648437498,70.855224609375]]],[[[-25.43232421875001,70.92133789062495],[-25.402246093749994,70.65268554687503],[-26.217871093749977,70.45405273437498],[-26.604687499999926,70.55336914062497],[-28.03525390624995,70.48681640625],[-27.61723632812496,70.91376953125001],[-26.621777343749955,70.87563476562497],[-25.81889648437499,71.04365234375001],[-25.43232421875001,70.92133789062495]]],[[[-53.53520507812493,71.04082031250005],[-53.9578125,71.12773437499999],[-53.58447265625003,71.29707031249995],[-53.53520507812493,71.04082031250005]]],[[[-55.01689453124999,72.79111328125003],[-55.56660156249998,72.56435546875002],[-56.214794921874955,72.71918945312495],[-55.01689453124999,72.79111328125003]]],[[[-18.000537109374932,75.40732421875003],[-17.391992187499937,75.03691406250007],[-18.670800781249966,75.00166015624998],[-18.856054687499977,75.31914062500002],[-18.000537109374932,75.40732421875003]]],[[[-18.58261718749995,76.042333984375],[-19.085351562499966,76.43037109375001],[-18.882470703124937,76.70380859375001],[-18.58261718749995,76.042333984375]]],[[[-71.667333984375,77.32529296874998],[-72.48955078124999,77.43164062499997],[-71.43344726562495,77.394384765625],[-71.667333984375,77.32529296874998]]],[[[-17.6125,79.82587890624995],[-18.662011718749966,79.72001953125005],[-19.13828125,79.85234375000002],[-17.98291015625,80.05517578125003],[-17.471386718749955,80.02871093749997],[-17.6125,79.82587890624995]]],[[[-44.86455078124999,82.08364257812502],[-46.75190429687501,82.34819335937502],[-47.27226562499996,82.65693359375001],[-46.399169921875,82.692138671875],[-44.91748046875003,82.48051757812505],[-44.86455078124999,82.08364257812502]]],[[[-29.952880859375,83.56484374999997],[-25.795068359374994,83.26098632812497],[-31.99267578125,83.0853515625],[-32.03271484374997,82.98344726562502],[-25.12338867187495,83.15961914062501],[-24.47031249999995,82.87739257812498],[-21.582519531249943,82.6341796875],[-23.118066406249966,82.32470703125003],[-29.57939453124996,82.16118164062502],[-29.887402343749983,82.05483398437502],[-29.543847656249994,81.93994140624997],[-27.839501953124966,82.04887695312505],[-25.148828124999966,82.001123046875],[-24.293066406249977,81.70097656250005],[-23.103710937499983,82.01181640625003],[-21.337988281249977,82.068701171875],[-21.230517578125017,81.60136718749999],[-23.11772460937499,80.77817382812498],[-19.62993164062499,81.63989257812503],[-17.456054687499943,81.397705078125],[-16.12070312499995,81.776611328125],[-14.241992187500017,81.81386718750005],[-12.434423828125006,81.68251953125002],[-11.430664062499972,81.45683593750005],[-13.126220703124972,81.08779296875],[-14.452343749999955,80.99311523437498],[-14.503564453124994,80.76328125000006],[-16.76059570312492,80.573388671875],[-15.937255859374972,80.42763671874997],[-16.48876953124997,80.25195312499997],[-18.070947265624994,80.17207031249995],[-19.429199218749943,80.25771484375],[-20.150146484375,80.01123046874997],[-18.99199218749996,79.17836914062502],[-21.133740234374926,78.65864257812501],[-21.729589843749977,77.70854492187499],[-20.862597656249932,77.91186523437503],[-19.490429687499983,77.71889648437497],[-19.46752929687503,77.56582031250005],[-20.162060546874926,77.68984375],[-20.680810546875023,77.61899414062503],[-20.23193359374997,77.36840820312497],[-19.30029296874997,77.22236328124995],[-18.442626953124943,77.259375],[-18.51030273437496,76.77817382812498],[-20.48671875,76.92080078125],[-21.614697265624926,76.68789062499997],[-22.18525390625001,76.79409179687502],[-22.609326171874983,76.70429687500004],[-21.877343749999966,76.57348632812503],[-21.488232421874926,76.271875],[-20.10361328124992,76.21909179687503],[-19.508984374999926,75.75751953124995],[-19.52636718750003,75.18022460937505],[-20.484960937500006,75.31425781249999],[-21.649316406249966,75.02343749999997],[-22.232861328124926,75.11972656249998],[-21.69511718749999,74.96445312500003],[-20.985791015624983,75.07436523437497],[-20.86157226562497,74.63593750000001],[-20.41708984374995,74.9751953125],[-19.98491210937499,74.9751953125],[-19.287011718750023,74.54638671875006],[-19.36914062499997,74.28403320312498],[-20.256445312499977,74.2828125],[-20.653125,74.13735351562502],[-21.954931640624977,74.24428710937497],[-21.942919921874932,74.56572265624999],[-22.32158203124999,74.30253906250002],[-22.134814453124932,73.99047851562503],[-20.36728515624992,73.8482421875],[-20.509667968749966,73.49287109375001],[-22.346875,73.26923828125001],[-23.23320312499999,73.39770507812497],[-24.157714843749943,73.76445312499999],[-24.67724609375,73.602197265625],[-25.521289062500017,73.85161132812499],[-24.79125976562497,73.51127929687502],[-26.062304687500017,73.25302734375],[-27.270410156250023,73.43627929687503],[-26.541845703125006,73.24897460937495],[-27.561621093750006,73.13847656250002],[-27.348046875000023,73.06782226562501],[-25.057031250000023,73.396484375],[-24.132666015625006,73.409375],[-22.036328124999955,72.91845703125006],[-22.29321289062497,72.11953125],[-24.06904296875001,72.49873046874998],[-24.629980468749977,73.03764648437499],[-26.657617187499966,72.71582031249997],[-24.81333007812492,72.90151367187497],[-24.65,72.58251953125],[-25.117871093749983,72.34697265625005],[-24.66684570312492,72.437353515625],[-21.959667968749955,71.74467773437502],[-22.479638671874937,71.38344726562497],[-22.417578125,71.24868164062505],[-22.29902343750001,71.43232421874998],[-21.75224609374999,71.47832031250002],[-21.522656249999926,70.52622070312503],[-22.38413085937492,70.46240234375],[-22.437011718749943,70.860009765625],[-22.690673828124943,70.43730468750002],[-23.327832031249983,70.45097656250007],[-23.97138671875001,70.64946289062499],[-24.562207031249926,71.22353515624997],[-25.885156249999966,71.571923828125],[-27.08720703124999,71.6265625],[-27.107031250000034,71.53266601562498],[-25.842724609374955,71.48017578124995],[-25.74223632812499,71.18359375],[-26.717919921874994,70.95048828125005],[-28.39843749999997,70.99291992187497],[-27.99218749999997,70.89521484374998],[-28.06987304687499,70.69902343750005],[-29.07207031249999,70.444970703125],[-26.621777343749955,70.46337890625],[-26.576806640625023,70.35708007812502],[-27.560839843749932,70.12446289062498],[-27.384179687500023,69.9916015625],[-27.027734374999966,70.20122070312499],[-25.529882812499977,70.35317382812502],[-23.66733398437495,70.139306640625],[-22.28447265624996,70.12583007812498],[-22.287060546874955,70.03339843749998],[-23.03364257812501,69.90083007812498],[-23.04956054687497,69.79272460937497],[-23.86572265624997,69.73671875000002],[-23.739404296874994,69.58862304687497],[-24.296679687500017,69.58554687500006],[-24.295556640624966,69.439306640625],[-25.188574218750006,69.26054687500002],[-25.092431640624937,69.16518554687502],[-25.697998046874943,68.889892578125],[-26.48291015624997,68.67592773437502],[-29.24951171874997,68.29877929687501],[-29.86850585937495,68.31157226562505],[-30.318115234375,68.19331054687501],[-30.72001953124999,68.25117187499998],[-30.610742187499994,68.11791992187503],[-30.97856445312499,68.06132812500005],[-32.32744140624999,68.43730468749999],[-32.16455078125,67.99111328125002],[-33.15698242187497,67.62670898437506],[-34.1982421875,66.65507812499999],[-35.18857421874995,66.25029296875002],[-35.86723632812502,66.44140624999997],[-35.630078124999926,66.13994140625002],[-36.37919921874996,65.830810546875],[-36.52724609375002,66.00771484375],[-36.665185546874966,65.79008789062507],[-37.06279296874996,65.87143554687503],[-37.410058593749994,65.65634765625],[-37.954785156249955,65.63359375000007],[-37.278710937499994,66.30439453124995],[-38.156640624999966,66.38559570312498],[-37.75234375000002,66.26152343750002],[-38.13994140625002,65.90351562499998],[-38.52036132812498,66.00966796875002],[-38.20336914062497,65.71171874999999],[-40.17353515624998,65.55615234375],[-39.57792968749996,65.34077148437501],[-39.937255859375,65.14160156250003],[-40.253125,65.04887695312505],[-41.08442382812501,65.10083007812497],[-40.966015624999955,64.86884765624995],[-40.655468749999926,64.91533203125002],[-40.18222656249998,64.47993164062495],[-40.78173828125,64.22177734375003],[-41.581005859374926,64.29833984375],[-41.03056640624996,64.12104492187504],[-40.61777343749998,64.13173828125],[-40.550390625000034,63.72524414062505],[-40.77519531249999,63.53364257812501],[-41.04873046875002,63.51381835937505],[-41.387890624999926,63.06186523437498],[-41.84448242187497,63.07026367187501],[-42.174511718749955,63.20878906249999],[-41.63447265624998,62.972460937500074],[-41.90898437499996,62.73710937499999],[-42.94165039062503,62.72021484375003],[-42.15297851562502,62.568457031250006],[-42.32148437499998,62.15273437500005],[-42.110205078125006,61.857226562500074],[-42.58530273437498,61.71748046875001],[-42.34736328125001,61.61743164062497],[-42.717041015625,60.767480468749994],[-43.04409179687502,60.523681640625],[-43.92270507812495,60.59536132812502],[-43.21298828124998,60.390673828125074],[-43.122900390625006,60.06123046875001],[-43.32011718749993,59.928125],[-43.95502929687498,60.025488281250006],[-43.65791015625001,59.85864257812503],[-43.90654296874996,59.815478515625045],[-44.11699218750002,59.83193359375002],[-44.06547851562499,59.92480468750003],[-44.412939453125006,59.922607421875],[-44.22436523437494,60.273535156250006],[-44.61328124999997,60.01665039062499],[-45.37924804687495,60.20292968750002],[-45.367773437500006,60.37294921875002],[-44.97470703124995,60.457226562499955],[-44.756738281249966,60.66459960937502],[-45.38051757812494,60.444921875],[-46.04663085937503,60.61572265625],[-46.141943359375006,60.776513671874994],[-45.87021484374998,61.21831054687502],[-46.87446289062501,60.81640625000003],[-48.180810546874966,60.76923828125001],[-47.77031249999999,60.99775390625001],[-48.386425781249926,61.004736328125034],[-48.42817382812501,61.18740234375002],[-48.92207031249998,61.27744140624998],[-49.28906249999997,61.58994140625006],[-49.380273437499994,61.89018554687502],[-48.82871093749998,62.0796875],[-49.62377929687494,61.99858398437499],[-49.553466796875,62.23271484374999],[-50.319238281249966,62.473193359375045],[-50.298730468749966,62.72197265625002],[-49.793115234374994,63.04462890625004],[-50.39008789062501,62.82202148437497],[-51.46884765624995,63.64228515625001],[-51.547509765624994,64.00610351562497],[-50.260693359374955,64.21425781250002],[-50.48662109374996,64.20888671875],[-50.43706054687499,64.31284179687503],[-51.58491210937498,64.10317382812502],[-51.70786132812498,64.205078125],[-51.403759765624926,64.46318359375002],[-50.49208984375002,64.69316406250005],[-50.00898437500001,64.44726562499997],[-50.12163085937493,64.703759765625],[-50.51699218750002,64.76650390625],[-50.96064453124998,65.20112304687498],[-50.721582031249966,64.79760742187503],[-51.22060546875002,64.62846679687502],[-51.25537109375,64.75810546875005],[-51.92260742187503,64.21875],[-52.259033203125,65.154931640625],[-52.537695312500034,65.32880859374998],[-51.61914062500003,65.71318359375002],[-51.091894531250006,65.77578125],[-51.7234375,65.723486328125],[-52.55126953125003,65.46137695312498],[-52.760937499999926,65.59082031249997],[-53.198974609375,65.59404296875002],[-53.106347656249966,65.97714843749998],[-53.39204101562498,66.04833984375],[-51.225,66.88154296875001],[-53.035791015624966,66.20141601562503],[-53.538769531249955,66.13935546874998],[-53.41875,66.64853515624998],[-53.038281249999955,66.82680664062497],[-52.38686523437502,66.88115234375005],[-53.44360351562503,66.924658203125],[-53.88442382812502,67.13554687499999],[-53.79858398437494,67.41816406250001],[-52.666455078124955,67.74970703124995],[-50.613476562499955,67.5279296875],[-51.171044921874966,67.693603515625],[-50.96884765624998,67.80664062500003],[-51.765234375000034,67.73784179687505],[-52.34482421874998,67.83691406249997],[-53.735205078125006,67.54902343750004],[-53.151562499999926,68.20776367187503],[-51.779980468749926,68.05673828124998],[-51.456494140624926,68.116064453125],[-51.21015625000001,68.419921875],[-52.19853515624993,68.22080078125],[-53.38315429687495,68.29736328124997],[-53.03945312500002,68.61088867187499],[-52.60458984374998,68.70874023437503],[-51.62314453124995,68.53481445312505],[-50.945703124999966,68.68266601562505],[-50.807714843750006,68.81699218749998],[-51.24941406250002,68.73994140625001],[-51.084863281249994,69.12827148437498],[-50.29736328124994,69.17060546874998],[-51.07695312499996,69.20947265625],[-50.291699218749955,70.01445312500005],[-52.254638671875,70.05893554687503],[-53.02304687499995,70.30190429687497],[-54.01445312499996,70.42167968750005],[-54.53076171875,70.69926757812502],[-54.16582031249999,70.82011718750005],[-52.801953124999955,70.7505859375],[-50.87236328124993,70.36489257812502],[-50.66328124999998,70.417578125],[-51.32285156249998,70.58876953124997],[-51.25659179687497,70.85268554687502],[-51.77431640625002,71.01044921875001],[-51.018945312499966,71.001318359375],[-51.37666015625001,71.11904296875],[-53.007568359375,71.17998046874999],[-52.89184570312497,71.457666015625],[-51.76992187500002,71.67172851562498],[-53.44008789062502,71.57900390625002],[-53.14453125000003,71.80742187500002],[-53.65214843749996,72.36264648437506],[-53.92773437499997,72.31879882812501],[-53.47758789062502,71.84995117187506],[-54.01992187500002,71.657861328125],[-53.96298828124995,71.45898437499997],[-54.6890625,71.36723632812505],[-55.59404296874999,71.55351562500005],[-55.315576171874994,72.11069335937498],[-54.84013671874996,72.35610351562497],[-55.581445312499994,72.178857421875],[-55.63583984374998,72.300439453125],[-55.29570312499996,72.35439453124997],[-55.60170898437494,72.453466796875],[-54.924951171874994,72.57197265624998],[-54.737939453124994,72.87250976562501],[-55.07309570312498,73.01513671875003],[-55.28891601562498,72.93320312500003],[-55.66855468749998,73.00791015624998],[-55.288281249999955,73.32709960937498],[-56.10405273437496,73.55815429687499],[-55.83828125,73.75971679687501],[-56.22539062499999,74.12910156249995],[-57.23056640624995,74.12529296875007],[-56.70634765625002,74.21918945312501],[-56.717675781249994,74.42924804687499],[-56.25546874999998,74.52680664062498],[-58.56552734374998,75.35273437500001],[-58.249658203124994,75.50668945312503],[-58.51621093749995,75.68906250000006],[-61.18823242187494,76.157861328125],[-63.29130859374996,76.35205078125003],[-63.84306640624999,76.21713867187498],[-64.307275390625,76.31650390624998],[-65.36992187499993,76.13056640625004],[-65.87573242187494,76.23833007812505],[-66.46577148437498,76.13916015625],[-66.99257812500002,76.21293945312502],[-66.67480468750003,75.977392578125],[-68.14873046875002,76.06704101562497],[-69.48408203125001,76.39916992187503],[-68.1142578125,76.65063476562503],[-69.67382812499994,76.73588867187507],[-69.69423828125002,76.98945312500004],[-70.613134765625,76.82182617187499],[-71.14145507812498,77.02866210937503],[-70.86284179687496,77.175439453125],[-68.97832031250002,77.19531250000006],[-68.13554687499999,77.37958984375001],[-66.38945312499999,77.28027343750003],[-66.69121093749999,77.68120117187502],[-67.68808593749995,77.523779296875],[-68.62153320312498,77.60185546875002],[-69.35136718749999,77.467138671875],[-70.53540039062497,77.699560546875],[-70.11445312500001,77.84135742187505],[-71.27163085937494,77.81313476562497],[-72.81806640624995,78.1943359375],[-72.47250976562498,78.48203125],[-71.65131835937493,78.62314453124998],[-68.99345703124999,78.857421875],[-68.37705078124998,79.037841796875],[-65.82553710937503,79.17373046874997],[-64.79228515624993,80.00063476562502],[-64.17915039062498,80.09926757812497],[-66.84365234374997,80.07622070312507],[-67.05063476562503,80.384521484375],[-64.51552734374997,81],[-63.72197265624993,81.05732421875001],[-63.028662109375006,80.88955078125002],[-62.90336914062496,81.21835937500003],[-61.43598632812498,81.13359375000002],[-60.842871093750034,81.85537109374997],[-59.28193359374998,81.88403320312503],[-56.615136718749994,81.362890625],[-59.26181640624998,82.00664062500005],[-54.54887695312496,82.35063476562505],[-53.671337890624955,82.16406249999997],[-53.55566406250003,81.65327148437501],[-53.022558593750034,82.32172851562504],[-50.894433593749994,81.89521484375001],[-49.54106445312496,81.91806640625003],[-50.93554687500003,82.38281250000003],[-50.03710937499994,82.472412109375],[-44.7294921875,81.77983398437505],[-44.23886718749998,82.3681640625],[-45.55654296875002,82.74702148437498],[-41.87646484375,82.680322265625],[-41.36962890625003,82.75],[-46.136816406250006,82.85883789062504],[-46.169042968750006,83.06386718749997],[-45.41459960937496,83.01767578124998],[-43.00927734375003,83.26459960937501],[-41.300146484375006,83.10078125000004],[-40.35683593750002,83.332177734375],[-38.15625,82.9986328125],[-38.74956054687496,83.37084960937497],[-37.72333984374998,83.49775390624998],[-29.952880859375,83.56484374999997]]]]},"properties":{"name":"Greenland","childNum":14}},{"geometry":{"type":"Polygon","coordinates":[[[-89.2328125,15.888671875],[-88.89404296875,15.890625],[-88.60336914062499,15.76416015625],[-88.5939453125,15.950292968749991],[-88.22832031249999,15.72900390625],[-88.271435546875,15.694873046875003],[-88.36455078124999,15.616015625],[-88.68447265625,15.360498046874994],[-88.96098632812499,15.152441406249991],[-89.142578125,15.072314453125003],[-89.22236328125,14.866064453124991],[-89.16220703124999,14.669238281250003],[-89.17177734375,14.606884765624997],[-89.28671875,14.529980468749997],[-89.36259765624999,14.416015625],[-89.5736328125,14.390087890624997],[-89.54716796874999,14.241259765625003],[-90.04814453124999,13.904052734375],[-90.09521484375,13.736523437499997],[-90.60693359375,13.929003906250003],[-91.37734375,13.990185546874997],[-92.23515624999999,14.54541015625],[-92.15854492187499,14.963574218749997],[-92.14423828125,15.001953125],[-92.09873046874999,15.026757812499994],[-92.07480468749999,15.07421875],[-92.187158203125,15.320898437499991],[-92.08212890624999,15.495556640624997],[-91.9572265625,15.703222656249991],[-91.736572265625,16.07016601562499],[-91.433984375,16.070458984374994],[-90.97958984374999,16.07080078125],[-90.70322265624999,16.071044921875],[-90.52197265625,16.071191406249994],[-90.44716796875,16.072705078124997],[-90.45986328125,16.162353515625],[-90.450146484375,16.261376953124994],[-90.4169921875,16.351318359375],[-90.4169921875,16.39101562499999],[-90.47109375,16.43955078124999],[-90.57578125,16.467822265625003],[-90.63408203124999,16.5107421875],[-90.634375,16.565136718749997],[-90.65996093749999,16.630908203125003],[-90.710693359375,16.70810546874999],[-90.975830078125,16.867822265624994],[-91.409619140625,17.255859375],[-91.1955078125,17.254101562499997],[-90.99296874999999,17.25244140625],[-90.98916015625,17.81640625],[-89.16147460937499,17.81484375],[-89.2328125,15.888671875]]]},"properties":{"name":"Guatemala","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[144.74179687500003,13.25927734375],[144.64931640625002,13.4287109375],[144.87539062500002,13.614648437499994],[144.94082031250002,13.5703125],[144.74179687500003,13.25927734375]]]},"properties":{"name":"Guam","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-57.194775390625,5.5484375],[-57.3185546875,5.335351562499994],[-57.20981445312499,5.195410156249991],[-57.331005859375,5.020166015624994],[-57.711083984374994,4.991064453124991],[-57.91704101562499,4.820410156249991],[-57.84599609374999,4.668164062499997],[-58.05429687499999,4.101660156249991],[-57.646728515625,3.39453125],[-57.303662109375,3.377099609374994],[-57.19736328124999,2.853271484375],[-56.704345703125,2.036474609374991],[-56.4828125,1.942138671875],[-56.96953124999999,1.91640625],[-57.03759765625,1.936474609374997],[-57.092675781249994,2.005810546874997],[-57.118896484375,2.013964843749989],[-57.31748046874999,1.963476562499991],[-57.41269531249999,1.908935546875],[-57.500439453125,1.77382812499999],[-57.54575195312499,1.72607421875],[-57.59443359375,1.7041015625],[-57.795654296875,1.7],[-57.8734375,1.667285156249989],[-57.9828125,1.6484375],[-58.03466796875,1.520263671875],[-58.34067382812499,1.587548828124994],[-58.38037109375,1.530224609374997],[-58.39580078124999,1.481738281249989],[-58.5060546875,1.438671875],[-58.511865234374994,1.28466796875],[-58.68461914062499,1.281054687499989],[-58.73032226562499,1.247509765624997],[-58.78720703124999,1.20849609375],[-58.82177734375,1.201220703124989],[-59.231201171875,1.376025390624989],[-59.53569335937499,1.7],[-59.66660156249999,1.746289062499997],[-59.66850585937499,1.842333984374989],[-59.74072265625,1.874169921874994],[-59.75620117187499,1.900634765625],[-59.75522460937499,2.274121093749997],[-59.8896484375,2.362939453124994],[-59.9943359375,2.689990234374989],[-59.854394531249994,3.5875],[-59.55112304687499,3.933544921874997],[-59.557763671874994,3.960009765624989],[-59.62021484374999,4.023144531249997],[-59.73857421874999,4.226757812499997],[-59.69970703125,4.353515625],[-60.1486328125,4.533251953124989],[-59.990673828125,5.082861328124991],[-60.142041015625,5.238818359374989],[-60.241650390625,5.257958984374994],[-60.335205078125,5.199316406249991],[-60.45952148437499,5.188085937499991],[-60.6513671875,5.221142578124997],[-60.742138671875,5.202050781249994],[-61.37680664062499,5.906982421875],[-61.3908203125,5.938769531249989],[-61.303125,6.049511718749997],[-61.22495117187499,6.129199218749989],[-61.15947265624999,6.174414062499991],[-61.12871093749999,6.214306640624997],[-61.152294921875,6.385107421874991],[-61.151025390624994,6.446533203125],[-61.181591796875,6.513378906249997],[-61.20361328125,6.58837890625],[-61.14560546874999,6.69453125],[-60.717919921874994,6.768310546875],[-60.35209960937499,7.002880859374997],[-60.32207031249999,7.092041015625],[-60.32548828124999,7.133984375],[-60.34506835937499,7.15],[-60.46494140624999,7.166552734374989],[-60.523193359375,7.143701171874994],[-60.583203125,7.156201171874997],[-60.63330078125,7.211083984374994],[-60.718652343749994,7.535937499999989],[-60.513623046875,7.813183593749997],[-60.032421875,8.053564453124991],[-59.99072265625,8.162011718749994],[-59.96484375,8.191601562499997],[-59.849072265625,8.248681640624994],[-59.83164062499999,8.305957031249989],[-60.017529296875,8.54931640625],[-59.20024414062499,8.07460937499999],[-58.51108398437499,7.39804687499999],[-58.48056640624999,7.038134765624989],[-58.67294921874999,6.390771484374994],[-58.414990234375,6.85117187499999],[-57.982568359374994,6.785888671875],[-57.54013671874999,6.33154296875],[-57.2275390625,6.178417968749997],[-57.194775390625,5.5484375]]]},"properties":{"name":"Guyana","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[73.70742187500002,-53.13710937499999],[73.46513671875002,-53.184179687500006],[73.25117187500001,-52.97578125000001],[73.83779296875002,-53.11279296875],[73.70742187500002,-53.13710937499999]]]},"properties":{"name":"Heard I. and McDonald Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-83.635498046875,14.876416015624997],[-84.53764648437496,14.633398437499963],[-84.64594726562498,14.661083984375011],[-84.86044921874998,14.809765625000011],[-84.98515624999999,14.752441406249972],[-85.059375,14.582958984374997],[-85.20834960937498,14.311816406250003],[-85.73393554687496,13.85869140625006],[-85.75341796875,13.852050781250028],[-85.78671874999995,13.844433593749997],[-85.98378906249997,13.965673828125006],[-86.04038085937503,14.050146484374977],[-86.33173828124995,13.770068359375031],[-86.37695312500003,13.755664062500031],[-86.61025390624997,13.774853515625026],[-86.73364257812494,13.763476562500017],[-86.75898437499995,13.746142578125045],[-86.77060546875003,13.698730468749972],[-86.763525390625,13.635253906250014],[-86.72958984375,13.4072265625],[-86.710693359375,13.31337890624998],[-86.72929687499996,13.284375],[-86.79213867187497,13.279785156249972],[-86.87353515624994,13.266503906250023],[-86.918212890625,13.223583984374983],[-87.00932617187499,13.007812499999986],[-87.0591796875,12.991455078125028],[-87.337255859375,12.979248046875028],[-87.48911132812503,13.352929687500051],[-87.814208984375,13.399169921875057],[-87.781884765625,13.521386718749994],[-87.71533203125003,13.812695312500011],[-87.73144531250003,13.841064453125014],[-87.80224609374997,13.889990234375034],[-87.89199218749997,13.894970703124983],[-87.99101562499996,13.879638671874972],[-88.15102539062497,13.987353515624974],[-88.44912109374994,13.850976562499994],[-88.48266601562503,13.854248046875043],[-88.49765624999998,13.904541015624986],[-88.50434570312501,13.964208984374963],[-88.51254882812498,13.97895507812504],[-89.12050781249994,14.370214843749991],[-89.36259765624996,14.416015625],[-89.17177734375,14.606884765624983],[-89.16220703125,14.669238281249989],[-89.22236328125001,14.86606445312502],[-89.142578125,15.072314453125031],[-88.96098632812496,15.15244140625002],[-88.68447265625002,15.360498046875037],[-88.36455078124996,15.616015625000045],[-88.27143554687498,15.694873046875045],[-88.22832031249999,15.729003906249972],[-88.131103515625,15.701025390625034],[-87.87495117187495,15.879345703124955],[-86.35664062499998,15.783203125],[-85.93627929687497,15.953417968750045],[-85.98564453124999,16.02416992187497],[-85.48369140624996,15.899511718749977],[-84.97373046874998,15.989892578124994],[-84.55966796875,15.802001953125],[-84.26142578124998,15.822607421875034],[-83.765283203125,15.405468750000054],[-83.972802734375,15.519628906250034],[-84.11132812499997,15.492431640625],[-84.09506835937503,15.400927734375017],[-83.92744140624998,15.394042968750028],[-83.76044921874998,15.220361328124994],[-83.49794921874997,15.222119140624997],[-83.64638671875,15.368408203125043],[-83.36918945312493,15.239990234375],[-83.29086914062498,15.078906250000045],[-83.2255859375,15.042285156250045],[-83.15751953124999,14.993066406249966],[-83.41503906249994,15.008056640625],[-83.5365234375,14.977001953124983],[-83.635498046875,14.876416015624997]]]},"properties":{"name":"Honduras","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[17.60781250000005,42.76904296875],[17.744238281250063,42.70034179687505],[17.34414062500008,42.790380859375006],[17.60781250000005,42.76904296875]]],[[[16.650683593750017,42.99658203125],[17.188281250000045,42.917041015625045],[16.850683593750006,42.8955078125],[16.650683593750017,42.99658203125]]],[[[17.667578125000063,42.897119140624994],[18.436328125000017,42.559716796874994],[18.517480468750023,42.43291015624999],[17.823828125,42.79741210937502],[17.045410156250057,43.014892578125],[17.667578125000063,42.897119140624994]]],[[[16.785253906250006,43.270654296874966],[16.490332031250034,43.28618164062502],[16.44892578125004,43.38706054687506],[16.89130859375001,43.314648437499955],[16.785253906250006,43.270654296874966]]],[[[15.371386718750074,43.973828124999955],[15.437207031250068,43.899511718750006],[15.270019531250028,44.01074218750003],[15.371386718750074,43.973828124999955]]],[[[14.488085937500074,44.66005859375005],[14.31240234375008,44.90039062499997],[14.33125,45.16499023437498],[14.488085937500074,44.66005859375005]]],[[[14.810253906250068,44.97705078124997],[14.45039062500004,45.079199218750006],[14.571093750000017,45.224755859374994],[14.810253906250068,44.97705078124997]]],[[[18.905371093750006,45.931738281250034],[18.839062499999983,45.83574218750002],[19.064257812500045,45.51499023437506],[19.004687500000074,45.39951171875006],[19.4,45.2125],[19.062890625000023,45.13720703125],[19.007128906250045,44.86918945312502],[18.83642578125,44.883251953124955],[18.66259765625,45.07744140624999],[17.812792968750074,45.078125],[16.918652343749983,45.27656249999998],[16.53066406250008,45.21669921875002],[16.29335937500005,45.00883789062496],[16.028320312500057,45.18959960937502],[15.788085937500057,45.17895507812497],[15.736621093750045,44.76582031250001],[16.10341796875008,44.52099609375006],[16.300097656250017,44.12451171875],[17.27382812500005,43.44575195312501],[17.650488281250063,43.006591796875],[17.585156250000068,42.93837890625005],[16.903125,43.392431640625006],[16.393945312500023,43.54335937500002],[15.985546875000068,43.519775390625],[15.185839843750017,44.17211914062503],[15.122949218749994,44.256787109374955],[15.470996093750045,44.27197265625003],[14.981347656250023,44.60292968750005],[14.854589843750034,45.08100585937501],[14.550488281249983,45.297705078125006],[14.31269531250004,45.33779296875002],[13.86074218750008,44.83740234375003],[13.517187500000063,45.481787109375034],[13.878710937500017,45.428369140624994],[14.369921875000074,45.48144531250006],[14.427343750000034,45.50576171875002],[14.56884765625,45.65722656249997],[14.591796875000057,45.65126953125002],[14.649511718750006,45.57148437500001],[14.793066406250034,45.47822265625001],[14.95458984375,45.499902343749994],[15.110449218750034,45.450781250000034],[15.242089843750023,45.44140624999997],[15.339453125000063,45.46704101562506],[15.326660156250028,45.502294921875034],[15.291210937500011,45.541552734375045],[15.283593750000051,45.5796875],[15.35371093750004,45.659912109375],[15.27705078125004,45.73261718749998],[15.652148437500074,45.86215820312498],[15.675585937500045,45.98369140624996],[15.666210937500011,46.04848632812502],[15.596875,46.10922851562506],[15.592578125000017,46.139990234375006],[15.608984374999977,46.171923828125045],[16.1064453125,46.382226562499994],[16.32119140625005,46.53461914062504],[16.42763671875005,46.5244140625],[16.516210937499977,46.499902343749966],[16.569921875,46.48500976562505],[16.748046875000057,46.41640625000002],[16.87148437500008,46.33930664062504],[17.310644531250006,45.99614257812502],[17.80712890625,45.79042968750002],[18.358300781250023,45.75302734375006],[18.533593750000023,45.79614257812503],[18.56464843750004,45.81328124999999],[18.666015625,45.90747070312497],[18.905371093750006,45.931738281250034]]]]},"properties":{"name":"Croatia","childNum":8}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-72.80458984374997,18.777685546875063],[-72.82221679687501,18.707128906249977],[-73.07797851562498,18.790917968749994],[-73.27641601562499,18.95405273437501],[-72.80458984374997,18.777685546875063]]],[[[-71.647216796875,19.195947265624994],[-71.80712890624997,18.987011718749983],[-71.733642578125,18.85639648437501],[-71.72705078125,18.80322265625003],[-71.74321289062502,18.73291015625],[-71.86650390624999,18.61416015625005],[-71.98686523437499,18.61035156249997],[-72.000390625,18.59790039062503],[-71.94038085937493,18.51259765625005],[-71.87255859374997,18.416210937499955],[-71.76191406249998,18.34130859374997],[-71.73725585937495,18.27080078124999],[-71.76831054687497,18.039160156250063],[-71.85292968749997,18.119140625],[-71.94609375,18.186083984375045],[-72.05986328124993,18.228564453125017],[-72.87666015624998,18.151757812499994],[-73.38515625000002,18.251171874999983],[-73.747314453125,18.190234375000017],[-73.88496093749998,18.041894531249994],[-74.478125,18.45],[-74.3875,18.624707031249983],[-74.22773437499998,18.662695312499977],[-72.78935546874996,18.434814453125],[-72.37607421874998,18.57446289062503],[-72.34765624999994,18.674951171874994],[-72.81108398437496,19.071582031250074],[-72.70322265625,19.441064453125023],[-73.43837890624994,19.722119140624983],[-73.21777343750003,19.88369140625005],[-72.63701171875002,19.90087890625],[-72.21982421875003,19.744628906250057],[-71.834716796875,19.696728515624983],[-71.77924804687498,19.718164062499994],[-71.75742187499998,19.68818359375001],[-71.71147460937493,19.486572265625057],[-71.74648437499997,19.28583984375001],[-71.647216796875,19.195947265624994]]]]},"properties":{"name":"Haiti","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[22.1318359375,48.405322265624996],[22.253710937500017,48.407373046874994],[22.582421875000023,48.134033203125],[22.769140625,48.109619140625],[22.87666015625001,47.947265625],[21.99970703125001,47.505029296874994],[21.121679687500006,46.282421875],[20.76025390625,46.246240234374994],[20.613671875000023,46.13349609375],[20.508105468750017,46.166943359375],[20.28095703125001,46.1330078125],[20.241796875,46.10859375],[20.21015625000001,46.126025390624996],[20.161425781250017,46.141894531249996],[19.93408203125,46.161474609375],[19.84443359375001,46.145898437499994],[19.61347656250001,46.169189453125],[19.421289062500023,46.064453125],[18.666015625,45.907470703125],[18.56464843750001,45.81328125],[18.533593750000023,45.796142578125],[18.358300781250023,45.75302734375],[17.80712890625,45.790429687499994],[17.310644531250006,45.996142578124996],[16.871484375000023,46.339306640625],[16.748046875,46.41640625],[16.569921875,46.485009765624994],[16.516210937500006,46.499902343749994],[16.283593750000023,46.857275390625],[16.093066406250017,46.86328125],[16.453417968750017,47.006787109375],[16.44287109375,47.39951171875],[16.676562500000017,47.536035156249994],[16.421289062500023,47.674462890624994],[17.06660156250001,47.707568359374996],[17.147363281250023,48.00595703125],[17.76191406250001,47.770166015624994],[18.72421875,47.787158203124996],[18.791894531250023,48.000292968749996],[19.625390625000023,48.223095703125],[19.95039062500001,48.146630859374994],[20.333789062500017,48.295556640624994],[20.490039062500017,48.526904296874996],[21.45136718750001,48.55224609375],[21.766992187500023,48.3380859375],[22.1318359375,48.405322265624996]]]},"properties":{"name":"Hungary","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[122.9489257812501,-10.90927734375002],[122.82617187500003,-10.899121093749983],[122.84570312500003,-10.761816406249991],[123.37109375000003,-10.474902343749989],[123.41816406250004,-10.651269531250037],[122.9489257812501,-10.90927734375002]]],[[[121.8830078125001,-10.590332031249957],[121.70468750000006,-10.5556640625],[121.99833984375002,-10.446972656249983],[121.8830078125001,-10.590332031249957]]],[[[123.41621093750004,-10.302636718749966],[123.3255859375,-10.264160156249943],[123.45878906250002,-10.13994140624996],[123.41621093750004,-10.302636718749966]]],[[[120.0125,-9.374707031250026],[120.78447265625002,-9.95703125],[120.83261718750006,-10.0375],[120.69804687500002,-10.206640624999949],[120.4391601562501,-10.294042968749991],[120.14482421875002,-10.200097656249952],[119.60107421874997,-9.773535156250006],[119.08544921875003,-9.706933593750023],[118.95878906250002,-9.519335937500003],[119.29589843749997,-9.3671875],[119.9420898437501,-9.301464843750026],[120.0125,-9.374707031250026]]],[[[125.06816406250002,-9.511914062499997],[124.42753906250002,-10.14863281250004],[123.7472656250001,-10.347167968749986],[123.60478515625002,-10.270117187500006],[123.71640625000012,-10.078613281249986],[123.5892578125,-9.966796875000028],[123.709375,-9.61484375],[124.0363281250001,-9.341601562500031],[124.28232421875012,-9.427929687500026],[124.44443359375012,-9.190332031250023],[124.92226562500005,-8.942480468749977],[124.93681640625007,-9.053417968750026],[125.14902343750012,-9.042578125000034],[125.10048828125,-9.189843750000023],[124.96015625000004,-9.213769531250009],[125.06816406250002,-9.511914062499997]]],[[[115.60996093750012,-8.769824218749974],[115.48046875000003,-8.715429687500006],[115.56142578125,-8.669921874999972],[115.60996093750012,-8.769824218749974]]],[[[122.97734375000002,-8.54521484374996],[122.88779296875006,-8.587304687500009],[123.01054687500002,-8.448339843750034],[123.153125,-8.475781250000026],[122.97734375000002,-8.54521484374996]]],[[[119.46406250000004,-8.741015624999974],[119.38554687500002,-8.736035156250026],[119.4464843750001,-8.429199218749957],[119.55722656250012,-8.518847656250003],[119.46406250000004,-8.741015624999974]]],[[[123.31748046875012,-8.354785156249974],[123.02500000000012,-8.395507812500014],[123.21708984375002,-8.235449218750006],[123.33603515625006,-8.269042968750014],[123.31748046875012,-8.354785156249974]]],[[[116.64082031250004,-8.613867187500006],[116.51425781250012,-8.820996093750011],[116.58652343750012,-8.886132812499966],[116.23935546875006,-8.912109375000014],[115.85732421875005,-8.787890625000017],[116.07646484375002,-8.744921874999974],[116.06113281250006,-8.437402343750023],[116.4015625000001,-8.204199218750034],[116.7189453125001,-8.336035156249977],[116.64082031250004,-8.613867187500006]]],[[[124.28662109375003,-8.32949218749998],[124.14667968750004,-8.531445312499997],[123.92773437500003,-8.448925781249969],[124.23955078125002,-8.20341796874996],[124.28662109375003,-8.32949218749998]]],[[[123.92480468750003,-8.2724609375],[123.55302734375007,-8.566796875],[123.23007812500006,-8.530664062500023],[123.47587890625007,-8.322265625000014],[123.39121093750012,-8.280468750000026],[123.77597656250006,-8.190429687499986],[123.92480468750003,-8.2724609375]]],[[[138.89511718750006,-8.388671874999957],[138.56337890625,-8.30908203125],[138.79619140625007,-8.173632812500017],[138.89511718750006,-8.388671874999957]]],[[[117.55634765625004,-8.367285156249949],[117.49052734375007,-8.183398437499974],[117.66503906249997,-8.148242187500003],[117.55634765625004,-8.367285156249949]]],[[[124.5755859375,-8.140820312499997],[125.05029296874997,-8.179589843749994],[125.13173828125,-8.326464843749989],[124.38066406250002,-8.41513671875002],[124.43066406249997,-8.18320312500002],[124.5755859375,-8.140820312499997]]],[[[127.8234375000001,-8.098828124999969],[128.11923828125012,-8.17070312499996],[128.02353515625006,-8.255371093749972],[127.82089843750012,-8.190234375000031],[127.8234375000001,-8.098828124999969]]],[[[122.7829101562501,-8.61171875],[121.65136718749997,-8.898730468749946],[121.41464843750006,-8.81484375],[121.32832031250004,-8.916894531250009],[121.03525390625012,-8.935449218749966],[120.55048828125004,-8.80185546875002],[119.909375,-8.857617187500011],[119.80791015625002,-8.697656250000023],[119.87480468750007,-8.419824218749994],[120.61025390625005,-8.24042968750004],[121.44453125000004,-8.57783203125004],[121.96650390625004,-8.455175781250006],[122.32324218749997,-8.628320312500023],[122.85048828125,-8.304394531250011],[122.91914062500004,-8.221875],[122.75859375000002,-8.185937499999952],[122.91699218749997,-8.105566406250006],[123.00595703125006,-8.329101562499986],[122.7829101562501,-8.61171875]]],[[[130.86220703125,-8.31875],[130.77519531250002,-8.34990234374996],[131.02011718750012,-8.091308593749943],[131.17636718750006,-8.130761718749994],[130.86220703125,-8.31875]]],[[[118.24238281250004,-8.317773437499994],[118.61191406250006,-8.28066406249998],[118.71386718749997,-8.41494140624998],[118.926171875,-8.297656249999974],[119.12968750000002,-8.668164062499969],[118.74589843750002,-8.735449218749991],[118.83261718750012,-8.833398437499966],[118.47861328125012,-8.856445312499957],[118.37890625000003,-8.674609375000031],[118.18994140624997,-8.840527343749997],[117.06132812500002,-9.099023437499994],[116.78847656250005,-9.006347656250028],[116.83505859375012,-8.532421875000026],[117.16484375000007,-8.367187500000014],[117.56708984375004,-8.426367187499991],[117.80605468750005,-8.711132812500011],[117.96953125000002,-8.728027343749986],[118.23486328124997,-8.591894531249963],[117.81484375000005,-8.342089843749974],[117.7552734375,-8.149511718749991],[118.11748046875007,-8.12226562500004],[118.24238281250004,-8.317773437499994]]],[[[115.44785156250012,-8.155175781249994],[115.70429687500004,-8.40712890624998],[115.14492187500005,-8.849023437500037],[115.05507812500005,-8.573046874999946],[114.61318359375,-8.37832031249998],[114.46757812500007,-8.166308593749946],[114.93847656249997,-8.18710937500002],[115.15400390625004,-8.065722656249974],[115.44785156250012,-8.155175781249994]]],[[[129.83886718749997,-7.954589843749986],[129.71347656250012,-8.04072265625004],[129.60898437500006,-7.803417968750011],[129.81298828124997,-7.819726562499952],[129.83886718749997,-7.954589843749986]]],[[[126.80097656250004,-7.667871093750009],[126.4720703125,-7.950390625000011],[126.04003906250003,-7.885839843750006],[125.79824218750005,-7.984570312499969],[125.97529296875004,-7.663378906249989],[126.21367187500002,-7.706738281250026],[126.60957031250004,-7.571777343749972],[126.80097656250004,-7.667871093750009]]],[[[127.41943359375003,-7.623046875000028],[127.37070312500012,-7.512792968749949],[127.47519531250012,-7.531054687500031],[127.41943359375003,-7.623046875000028]]],[[[138.53535156250004,-8.273632812499969],[138.2962890625,-8.405175781250037],[137.65039062499997,-8.386132812499966],[138.08183593750002,-7.566210937500003],[138.29550781250012,-7.4384765625],[138.76982421875002,-7.390429687499974],[138.98906250000002,-7.696093749999989],[138.53535156250004,-8.273632812499969]]],[[[131.3255859375,-7.999511718749986],[131.11376953125003,-7.997363281249989],[131.13779296875012,-7.684863281250017],[131.64345703125,-7.11279296875],[131.73613281250007,-7.197070312500017],[131.64384765625002,-7.266894531249946],[131.62441406250005,-7.626171874999955],[131.3255859375,-7.999511718749986]]],[[[131.98203125000006,-7.202050781249966],[131.75078125000002,-7.116796875],[131.92226562500005,-7.104492187499986],[131.98203125000006,-7.202050781249966]]],[[[128.6701171875001,-7.183300781249969],[128.52978515625003,-7.134570312499989],[128.62773437500007,-7.06875],[128.6701171875001,-7.183300781249969]]],[[[120.77441406250003,-7.118945312500003],[120.64082031250004,-7.115820312499991],[120.63339843750006,-7.018261718750011],[120.77441406250003,-7.118945312500003]]],[[[113.84453125000007,-7.105371093749994],[113.12695312499997,-7.224121093750028],[112.72587890625007,-7.072753906250014],[112.86806640625,-6.899902343749972],[113.06738281250003,-6.879980468749991],[113.97470703125012,-6.873046875],[114.0736328125,-6.960156249999983],[113.84453125000007,-7.105371093749994]]],[[[115.37705078125006,-6.97080078125002],[115.22031250000012,-6.952539062500037],[115.24052734375007,-6.861230468749994],[115.54609375000004,-6.938671874999955],[115.37705078125006,-6.97080078125002]]],[[[105.25283203125005,-6.640429687499946],[105.12138671875007,-6.614941406249997],[105.26054687500002,-6.523925781250014],[105.25283203125005,-6.640429687499946]]],[[[134.53681640625004,-6.442285156249994],[134.32275390624997,-6.84873046875002],[134.09082031249997,-6.833789062500003],[134.10703125000006,-6.471582031250009],[134.19462890625007,-6.459765625],[134.11464843750005,-6.190820312500009],[134.53681640625004,-6.442285156249994]]],[[[107.37392578125005,-6.007617187499989],[107.66679687500002,-6.215820312499957],[108.33017578125012,-6.286035156249966],[108.67783203125006,-6.790527343749972],[110.42626953124997,-6.947265625000028],[110.83476562500002,-6.424218749999952],[110.97226562500012,-6.435644531249977],[111.18154296875005,-6.686718749999969],[111.54033203125002,-6.648242187500031],[112.0873046875,-6.89335937499996],[112.53925781250004,-6.926464843749955],[112.64873046875007,-7.221289062499977],[112.7943359375,-7.304492187499974],[112.79453125000012,-7.55244140625004],[113.01357421875005,-7.657714843749986],[113.49765625000006,-7.723828124999955],[114.07070312500005,-7.633007812500011],[114.40927734375012,-7.79248046875],[114.38691406250004,-8.405175781250037],[114.58378906250002,-8.769628906250034],[113.25332031250005,-8.286718749999963],[112.67880859375006,-8.409179687499957],[111.50996093750004,-8.30507812499998],[110.60722656250002,-8.149414062499972],[109.28164062500005,-7.704882812500003],[108.74121093749997,-7.667089843750034],[108.45175781250006,-7.79697265625002],[107.91748046875003,-7.724121093750014],[107.28496093750007,-7.471679687500014],[106.45527343750004,-7.368652343749986],[106.51972656250004,-7.053710937499943],[106.19824218749997,-6.927832031249977],[105.25546875000012,-6.835253906250031],[105.37089843750002,-6.664355468750031],[105.48369140625007,-6.781542968750017],[105.65507812500002,-6.469531249999946],[105.78691406250002,-6.456933593749966],[105.86826171875006,-6.11640625000004],[106.075,-5.914160156249963],[106.82519531249997,-6.098242187499977],[107.0462890625,-5.90419921874998],[107.37392578125005,-6.007617187499989]]],[[[120.52832031249997,-6.2984375],[120.48730468749997,-6.464843749999972],[120.47734375000007,-5.775292968750009],[120.52832031249997,-6.2984375]]],[[[112.7194335937501,-5.81103515625],[112.58603515625006,-5.803613281249994],[112.69003906250006,-5.726171875000034],[112.7194335937501,-5.81103515625]]],[[[132.80712890625003,-5.850781250000011],[132.68144531250002,-5.91259765625],[132.63017578125002,-5.60703125],[132.80712890625003,-5.850781250000011]]],[[[134.74697265625,-5.707031249999957],[134.71416015625007,-6.29511718750004],[134.44111328125004,-6.334863281249966],[134.15488281250006,-6.06289062499998],[134.3019531250001,-6.009765624999986],[134.34306640625002,-5.833007812499943],[134.20537109375002,-5.707226562499997],[134.34130859375003,-5.712890624999986],[134.57080078124997,-5.42734375],[134.74697265625,-5.707031249999957]]],[[[132.92626953124997,-5.902050781249983],[132.84501953125002,-5.987988281249997],[133.13847656250002,-5.317871093749986],[133.11962890625003,-5.575976562499989],[132.92626953124997,-5.902050781249983]]],[[[102.36718750000003,-5.478710937499983],[102.1107421875,-5.32255859374996],[102.3717773437501,-5.366406250000011],[102.36718750000003,-5.478710937499983]]],[[[123.62675781250007,-5.271582031249963],[123.58261718750006,-5.36738281250004],[123.54277343750002,-5.271093749999963],[123.62675781250007,-5.271582031249963]]],[[[122.04296874999997,-5.437988281250028],[121.80849609375,-5.256152343750017],[121.91367187500012,-5.072265624999957],[122.04101562500003,-5.158789062499991],[122.04296874999997,-5.437988281250028]]],[[[122.64511718750012,-5.26943359374998],[122.5638671875,-5.3875],[122.28310546875,-5.319531249999969],[122.39628906250002,-5.069824218749986],[122.36894531250007,-4.767187499999977],[122.70195312500002,-4.61865234375],[122.75986328125012,-4.933886718750003],[122.61406250000007,-5.138671874999986],[122.64511718750012,-5.26943359374998]]],[[[123.17978515625006,-4.551171875000023],[123.195703125,-4.82265625],[123.05517578124997,-4.748242187500026],[122.97167968750003,-5.138476562500031],[123.18730468750007,-5.333007812499957],[122.96875,-5.405761718749943],[122.81210937500012,-5.671289062499952],[122.64501953124997,-5.663378906250031],[122.58642578124997,-5.488867187500006],[122.76650390625005,-5.210156249999983],[122.85332031250007,-4.618359375000026],[123.074609375,-4.38691406250004],[123.17978515625006,-4.551171875000023]]],[[[133.57080078124997,-4.245898437500003],[133.621875,-4.299316406249957],[133.32089843750006,-4.111035156249969],[133.57080078124997,-4.245898437500003]]],[[[123.2423828125001,-4.112988281250011],[123.07617187499997,-4.227148437499991],[122.96904296875002,-4.029980468749969],[123.21191406250003,-3.997558593750028],[123.2423828125001,-4.112988281250011]]],[[[128.56259765625012,-3.58544921875],[128.39160156250003,-3.637890625000026],[128.45156250000005,-3.514746093749991],[128.56259765625012,-3.58544921875]]],[[[128.2755859375001,-3.67460937499996],[127.97802734374997,-3.770996093749972],[127.925,-3.69931640625002],[128.32910156249997,-3.51591796874996],[128.2755859375001,-3.67460937499996]]],[[[116.42412109375007,-3.464453124999963],[116.38779296875012,-3.636718749999972],[116.3265625,-3.539062499999972],[116.42412109375007,-3.464453124999963]]],[[[116.30332031250006,-3.868164062499957],[116.05878906250004,-4.006933593749991],[116.06357421875006,-3.457910156249952],[116.26972656250004,-3.251074218750006],[116.30332031250006,-3.868164062499957]]],[[[126.86113281250007,-3.087890624999986],[127.22734375000007,-3.391015625],[127.22958984375006,-3.633007812500011],[126.68632812500007,-3.823632812500037],[126.21455078125004,-3.605175781250026],[126.05654296875,-3.420996093749991],[126.08828125,-3.105468750000014],[126.86113281250007,-3.087890624999986]]],[[[106.88642578125004,-3.005273437500023],[106.7428710937501,-2.932812500000011],[106.91064453124997,-2.93398437499998],[106.88642578125004,-3.005273437500023]]],[[[129.75468750000007,-2.865820312500034],[130.3791015625001,-2.989355468749977],[130.56992187500006,-3.130859375000028],[130.85996093750006,-3.570312500000028],[130.805078125,-3.85771484374996],[129.844140625,-3.327148437499957],[129.51171875000003,-3.32851562499998],[129.46767578125005,-3.453222656249977],[128.8625,-3.234960937500006],[128.51660156249997,-3.449121093750037],[128.13203125000004,-3.157421875000026],[127.90234374999997,-3.496289062499955],[127.87792968749997,-3.222070312499966],[128.19853515625002,-2.865917968749969],[128.99111328125,-2.82851562499998],[129.17441406250006,-2.933496093749966],[129.48417968750002,-2.785742187499977],[129.75468750000007,-2.865820312500034]]],[[[100.42509765625007,-3.182910156249974],[100.46513671875007,-3.32851562499998],[100.20429687500004,-2.98681640625],[100.19853515625002,-2.785546875000023],[100.45458984375003,-3.001953124999972],[100.42509765625007,-3.182910156249974]]],[[[108.2072265625001,-2.997656249999977],[108.05527343750006,-3.22685546874996],[107.85820312500002,-3.086328125000023],[107.61445312500004,-3.209375],[107.56347656250003,-2.920117187499997],[107.66630859375002,-2.566308593750037],[107.83779296875005,-2.530273437499972],[108.21513671875002,-2.696972656250011],[108.29062500000012,-2.829980468750023],[108.2072265625001,-2.997656249999977]]],[[[100.20410156249997,-2.741015625000017],[100.01494140625007,-2.819726562499966],[99.98789062500006,-2.525390624999957],[100.20410156249997,-2.741015625000017]]],[[[99.84306640625007,-2.343066406250031],[99.60703125000012,-2.257519531250011],[99.57216796875005,-2.025781249999966],[99.84306640625007,-2.343066406250031]]],[[[126.055078125,-2.451269531249963],[125.86289062500006,-2.077148437499943],[125.92275390625,-1.974804687499969],[126.055078125,-2.451269531249963]]],[[[126.02421875000007,-1.789746093750011],[126.33173828125004,-1.822851562500006],[125.47919921875004,-1.940039062499991],[125.38720703124997,-1.843066406249946],[126.02421875000007,-1.789746093750011]]],[[[130.35332031250007,-1.690527343749963],[130.41884765625,-1.971289062499963],[130.24804687500003,-2.047753906249994],[129.7376953125,-1.866894531250011],[130.35332031250007,-1.690527343749963]]],[[[124.96953125000007,-1.70546875],[125.18789062500005,-1.712890624999986],[125.31406250000006,-1.877148437499969],[124.41777343750002,-2.005175781250031],[124.32968750000012,-1.858886718749972],[124.41757812500006,-1.659277343749991],[124.96953125000007,-1.70546875]]],[[[135.47421875000006,-1.591796875000014],[136.89257812500003,-1.799707031249994],[136.22812500000012,-1.893652343749949],[135.47421875000006,-1.591796875000014]]],[[[108.953125,-1.61962890625],[108.83789062499997,-1.661621093750028],[108.80371093750003,-1.567773437499994],[108.953125,-1.61962890625]]],[[[106.04570312500002,-1.669433593750014],[106.36591796875004,-2.464843749999972],[106.81845703125006,-2.573339843749963],[106.6120117187501,-2.895507812499957],[106.66718750000004,-3.071777343749986],[105.99873046875004,-2.824902343749955],[105.7858398437501,-2.18134765625004],[105.13339843750012,-2.042578125],[105.45957031250006,-1.574707031249986],[105.58544921875003,-1.526757812499994],[105.7008789062501,-1.731054687499963],[105.7204101562501,-1.533886718750026],[105.91005859375,-1.504980468749991],[106.04570312500002,-1.669433593750014]]],[[[123.59755859375,-1.704296875000011],[123.48251953125006,-1.681445312499974],[123.52851562500004,-1.502832031250009],[123.59755859375,-1.704296875000011]]],[[[128.1530273437501,-1.66054687499998],[127.56162109375012,-1.728515624999972],[127.39501953125003,-1.589843749999972],[127.64667968750004,-1.332421875],[128.1530273437501,-1.66054687499998]]],[[[123.2123046875,-1.171289062499966],[123.23779296874997,-1.389355468749983],[123.43476562500004,-1.236816406249986],[123.54726562500005,-1.337402343749957],[123.51191406250004,-1.447363281249977],[123.27490234374997,-1.437207031249955],[123.17294921875006,-1.616015624999974],[123.15039062500003,-1.304492187500003],[122.89042968750007,-1.58720703124996],[122.81083984375002,-1.432128906249986],[122.90800781250002,-1.182226562499963],[123.2123046875,-1.171289062499966]]],[[[109.71025390625007,-1.1806640625],[109.46367187500002,-1.277539062500026],[109.4759765625,-0.9853515625],[109.74335937500004,-1.039355468749989],[109.71025390625007,-1.1806640625]]],[[[134.96533203124997,-1.116015624999974],[134.86171875,-1.114160156249952],[134.82792968750002,-0.978808593750003],[134.99628906250004,-1.03408203124998],[134.96533203124997,-1.116015624999974]]],[[[99.16386718750007,-1.777929687500006],[98.82773437500006,-1.609960937499977],[98.60175781250004,-1.197851562499949],[98.67607421875007,-0.970507812500003],[98.93261718750003,-0.954003906250009],[99.2672851562501,-1.62773437499996],[99.16386718750007,-1.777929687500006]]],[[[131.00185546875005,-1.315527343750034],[130.78232421875006,-1.255468749999963],[130.67294921875006,-0.959765625000031],[131.03300781250007,-0.917578124999963],[131.00185546875005,-1.315527343750034]]],[[[135.38300781250004,-0.6513671875],[135.89355468749997,-0.725781249999969],[136.37529296875007,-1.094042968750031],[136.1647460937501,-1.214746093750023],[135.91503906250003,-1.178417968749997],[135.74707031249997,-0.823046874999974],[135.64570312500004,-0.881933593749991],[135.38300781250004,-0.6513671875]]],[[[127.30039062500012,-0.780957031250026],[127.1564453125001,-0.760937500000026],[127.20908203125006,-0.619335937499955],[127.30039062500012,-0.780957031250026]]],[[[130.6266601562501,-0.528710937499966],[130.46542968750006,-0.486523437499983],[130.6159179687501,-0.417285156250003],[130.6266601562501,-0.528710937499966]]],[[[121.86435546875012,-0.406835937500006],[121.88125,-0.502636718749983],[121.65527343749997,-0.526171874999989],[121.86435546875012,-0.406835937500006]]],[[[140.97343750000007,-2.609765625],[140.97353515625,-2.803417968750026],[140.975,-6.346093750000023],[140.86230468749997,-6.740039062499989],[140.97519531250006,-6.90537109375002],[140.97617187500012,-9.11875],[140.00292968749997,-8.19550781250004],[140.11699218750002,-7.923730468750009],[139.93476562500004,-8.101171875],[139.38564453125,-8.189062499999963],[139.24882812500002,-7.982421874999972],[138.890625,-8.237792968749943],[139.08798828125012,-7.587207031250017],[138.74794921875,-7.25146484375],[139.17685546875006,-7.1904296875],[138.84570312500003,-7.13632812499999],[138.60136718750007,-6.936523437499972],[138.86455078125007,-6.858398437499943],[138.43867187500004,-6.343359375],[138.2962890625,-5.94902343749996],[138.37460937500006,-5.84365234374998],[138.19960937500005,-5.80703125],[138.33964843750007,-5.675683593749966],[138.08710937500004,-5.70917968750004],[138.06083984375002,-5.46523437499998],[137.27978515624997,-4.945410156249949],[136.61884765625004,-4.81875],[135.97968750000004,-4.530859374999963],[135.19560546875007,-4.450683593749972],[134.67968749999997,-4.079101562499943],[134.70654296875003,-3.954785156250026],[134.88652343750007,-3.938476562499986],[134.26621093750012,-3.945800781249972],[134.14707031250006,-3.79677734374998],[133.97382812500004,-3.817968750000034],[133.67832031250006,-3.4794921875],[133.8415039062501,-3.054785156249991],[133.70039062500004,-3.0875],[133.653125,-3.364355468749991],[133.51816406250012,-3.411914062500003],[133.40087890625003,-3.899023437500034],[133.24873046875004,-4.062304687499989],[132.91445312500005,-4.05693359374996],[132.75390625000003,-3.703613281250014],[132.86972656250006,-3.550976562499997],[132.75136718750005,-3.294628906249997],[131.97119140624997,-2.788574218750014],[132.2306640625001,-2.680371093749997],[132.725,-2.789062500000028],[133.19101562500006,-2.43779296874996],[133.70009765625005,-2.624609375],[133.75332031250005,-2.450683593750014],[133.90488281250012,-2.390917968750003],[133.79101562500003,-2.293652343749997],[133.92158203125004,-2.102050781249957],[132.96279296875005,-2.272558593749963],[132.30761718749997,-2.24228515625002],[132.02343749999997,-1.99033203125002],[131.93037109375004,-1.559667968750034],[131.29375,-1.393457031250009],[130.99589843750007,-1.42470703124998],[131.1908203125,-1.165820312500003],[131.2572265625,-0.855468750000014],[131.80429687500006,-0.703808593750026],[132.39375,-0.355468750000028],[132.85644531250003,-0.417382812500023],[133.47265624999997,-0.726171874999963],[133.97451171875,-0.744335937500026],[134.11152343750004,-0.84677734375002],[134.07197265625004,-1.001855468749994],[134.25957031250007,-1.362988281250026],[134.105859375,-1.720996093749946],[134.19482421875003,-2.309082031249943],[134.45996093749997,-2.83232421874996],[134.48330078125,-2.583007812499972],[134.62744140624997,-2.536718749999963],[134.70214843749997,-2.933593749999986],[134.84335937500006,-2.909179687499986],[134.88681640625006,-3.209863281249966],[135.25156250000012,-3.368554687499966],[135.48662109375002,-3.34511718749998],[135.85917968750002,-2.99531250000004],[136.38994140625002,-2.273339843750037],[137.07207031250002,-2.105078124999949],[137.1710937500001,-2.025488281249991],[137.1234375,-1.840917968749963],[137.80625000000012,-1.483203125],[139.78955078125003,-2.34824218750002],[140.62255859374997,-2.44580078125],[140.74746093750005,-2.607128906249997],[140.97343750000007,-2.609765625]]],[[[104.47421875000012,-0.334667968749955],[104.59013671875002,-0.466601562500017],[104.36318359375,-0.658593749999966],[104.25712890625002,-0.463281249999966],[104.47421875000012,-0.334667968749955]]],[[[127.56699218750006,-0.318945312499949],[127.68242187500002,-0.46835937500002],[127.60498046874997,-0.610156249999946],[127.88017578125002,-0.808691406249991],[127.7611328125,-0.883691406249994],[127.62382812500002,-0.76601562499999],[127.46269531250002,-0.80595703124996],[127.46865234375,-0.64296875],[127.3,-0.500292968749946],[127.32509765625,-0.335839843750023],[127.45517578125012,-0.406347656249991],[127.56699218750006,-0.318945312499949]]],[[[127.24990234375005,-0.4953125],[127.11914062500003,-0.520507812499986],[127.12646484375003,-0.278613281250003],[127.29003906250003,-0.284375],[127.24990234375005,-0.4953125]]],[[[103.73652343750004,-0.347949218750003],[103.461328125,-0.357617187500011],[103.54892578125006,-0.227539062499986],[103.73652343750004,-0.347949218750003]]],[[[130.81328125000007,-0.004101562500026],[131.27685546875003,-0.149804687499952],[131.33974609375005,-0.290332031249989],[131.00537109374997,-0.360742187500037],[130.62216796875006,-0.0859375],[130.89921875000002,-0.344433593749997],[130.7501953125001,-0.44384765625],[130.6886718750001,-0.296582031250011],[130.55078124999997,-0.366406250000026],[130.23662109375002,-0.209667968749983],[130.3625,-0.072851562500006],[130.81328125000007,-0.004101562500026]]],[[[98.45927734375007,-0.530468749999969],[98.30966796875012,-0.531835937499977],[98.4271484375,-0.226464843750037],[98.3229492187501,-0.000781249999974],[98.54414062500004,-0.257617187499989],[98.45927734375007,-0.530468749999969]]],[[[104.77861328125007,-0.175976562499955],[105.00537109374997,-0.282812499999963],[104.44707031250002,-0.189160156249983],[104.54267578125004,0.01772460937498],[104.77861328125007,-0.175976562499955]]],[[[103.28447265625002,0.541943359375011],[103.13955078125,0.549072265625043],[103.18740234375,0.699755859375017],[103.28447265625002,0.541943359375011]]],[[[103.0275390625001,0.746630859374974],[102.4904296875001,0.856640625],[102.50664062500002,1.088769531250037],[103.00244140624997,0.859277343750009],[103.0275390625001,0.746630859374974]]],[[[103.42392578125012,1.048339843749972],[103.31542968750003,1.071289062500028],[103.37998046875006,1.133642578125034],[103.42392578125012,1.048339843749972]]],[[[103.16640625000005,0.870166015625003],[102.7018554687501,1.0537109375],[102.72558593749997,1.158837890625023],[102.99941406250005,1.067773437500023],[103.16640625000005,0.870166015625003]]],[[[104.02480468750005,1.180566406250009],[104.13984375000004,1.165576171874974],[104.06611328125004,0.989550781249989],[103.93222656250012,1.071386718749963],[104.02480468750005,1.180566406250009]]],[[[104.58535156250005,1.21611328124996],[104.66289062500002,1.04951171875004],[104.57519531250003,0.831933593750037],[104.43925781250002,1.050439453125051],[104.25195312499997,1.014892578125],[104.36181640624997,1.18149414062502],[104.58535156250005,1.21611328124996]]],[[[102.4271484375,0.990136718750023],[102.27958984375002,1.075683593750043],[102.25634765625003,1.397070312499963],[102.44287109374997,1.234228515625006],[102.4271484375,0.990136718750023]]],[[[97.48154296875006,1.465087890624972],[97.93193359375002,0.973925781250003],[97.82041015625012,0.564453124999986],[97.683984375,0.596093750000037],[97.60390625000005,0.83388671874998],[97.40537109375012,0.946972656250026],[97.07919921875006,1.425488281249983],[97.35595703124997,1.539746093749997],[97.48154296875006,1.465087890624972]]],[[[102.49189453125004,1.459179687500011],[102.49941406250005,1.330908203124991],[102.02402343750012,1.607958984375031],[102.49189453125004,1.459179687500011]]],[[[124.88886718750004,0.995312500000011],[124.42753906250002,0.470605468750051],[123.75380859375,0.305517578124991],[123.26542968750007,0.326611328125026],[122.996875,0.493505859375006],[121.01298828125002,0.441699218750017],[120.57900390625,0.5283203125],[120.19228515625,0.268505859374997],[120.01328125000012,-0.196191406249994],[120.062890625,-0.555566406250023],[120.240625,-0.868261718749949],[120.51757812499997,-1.039453125],[120.66738281250005,-1.370117187499972],[121.14853515625012,-1.33945312500002],[121.5755859375,-0.828515625000023],[121.96962890625005,-0.933300781249969],[122.27998046875004,-0.757031250000026],[122.88876953125006,-0.755175781250003],[122.8294921875,-0.658886718750026],[123.17148437500012,-0.57070312499999],[123.37968750000002,-0.648535156249949],[123.43417968750006,-0.778222656249994],[123.37792968749997,-1.004101562500011],[122.90283203125003,-0.900976562499963],[122.25068359375004,-1.555273437500034],[121.8585937500001,-1.69326171874998],[121.65097656250006,-1.895410156249952],[121.35546874999997,-1.878222656250003],[122.29169921875004,-2.907617187500023],[122.39902343750006,-3.200878906249997],[122.25292968749997,-3.620410156250017],[122.68964843750004,-4.084472656249972],[122.84794921875002,-4.064550781250006],[122.8722656250001,-4.391992187500009],[122.71972656250003,-4.340722656249952],[122.11425781250003,-4.540234375000011],[122.03808593749997,-4.832421875000023],[121.58867187500007,-4.759570312500017],[121.48652343750004,-4.581054687499972],[121.61806640625,-4.092675781249952],[120.89179687500004,-3.520605468750034],[121.05429687500012,-3.167089843749949],[121.0521484375,-2.751660156249955],[120.87939453124997,-2.64560546875002],[120.65361328125002,-2.667578124999977],[120.26103515625007,-2.949316406249991],[120.43662109375012,-3.70732421874996],[120.42011718750004,-4.617382812500011],[120.27929687499997,-5.146093749999977],[120.4303710937501,-5.591015625000026],[119.9515625,-5.577636718749972],[119.71728515625003,-5.693359375000014],[119.55742187500007,-5.611035156250026],[119.36035156249997,-5.314160156250026],[119.59404296875007,-4.523144531249997],[119.62363281250006,-4.034375],[119.46748046875004,-3.512988281249989],[118.99462890624997,-3.537597656250028],[118.86767578124997,-3.39804687500002],[118.78330078125006,-2.720800781249977],[119.09218750000005,-2.482910156250014],[119.32187500000012,-1.929687500000014],[119.308984375,-1.408203125],[119.508203125,-0.906738281249972],[119.71132812500005,-0.680761718750034],[119.84433593750006,-0.861914062499991],[119.721875,-0.088476562499991],[119.865625,0.040087890625003],[119.80927734375004,0.238671875000051],[119.9132812500001,0.445068359375],[120.26953125000003,0.970800781249991],[120.60253906249997,0.854394531249994],[120.86796875000007,1.25283203124998],[121.0817382812501,1.327636718750028],[121.40410156250002,1.243603515624969],[121.59179687499997,1.067968749999977],[122.43662109375006,1.018066406250028],[122.83828125,0.845703125],[123.06650390625006,0.941796875000037],[123.93076171875006,0.850439453124977],[124.53369140624997,1.230468750000043],[124.94707031250002,1.672167968749974],[125.11093750000012,1.685693359374966],[125.2337890625,1.502294921875006],[124.88886718750004,0.995312500000011]]],[[[101.70810546875006,2.078417968750045],[101.71943359375004,1.789160156250006],[101.50078125000002,1.733203124999974],[101.40966796875003,2.021679687500026],[101.70810546875006,2.078417968750045]]],[[[127.73271484375007,0.848144531250043],[127.8810546875001,0.832128906249977],[127.96728515624997,1.042578125000048],[128.16074218750006,1.1578125],[128.22246093750002,1.400634765624986],[128.68837890625,1.572558593750017],[128.70263671874997,1.106396484374997],[128.29882812500003,0.87680664062502],[128.26064453125,0.733789062500023],[128.61123046875,0.549951171875051],[128.89960937500004,0.216259765625011],[127.9831054687501,0.471875],[127.88740234375004,0.298339843750043],[127.97783203125002,-0.24833984374996],[128.4254882812501,-0.892675781249949],[128.04638671875003,-0.706054687499943],[127.69160156250004,-0.241894531249983],[127.70869140625004,0.288085937499986],[127.53710937500003,0.610888671875031],[127.60800781250006,0.848242187499977],[127.42851562500002,1.139990234374991],[127.63173828125,1.843701171875011],[128.03642578125002,2.199023437500017],[127.88681640625012,1.83295898437504],[128.0109375000001,1.701220703125031],[128.01171874999997,1.331738281249983],[127.65283203124997,1.013867187499969],[127.73271484375007,0.848144531250043]]],[[[97.3341796875001,2.075634765625011],[97.10830078125,2.216894531250006],[97.29140625,2.200830078125023],[97.3341796875001,2.075634765625011]]],[[[128.45390625000002,2.051757812500028],[128.29589843749997,2.034716796875017],[128.2179687500001,2.297460937499991],[128.60214843750012,2.59760742187504],[128.68847656250003,2.473681640625017],[128.62324218750004,2.224414062500031],[128.45390625000002,2.051757812500028]]],[[[96.46367187500002,2.360009765625037],[95.80859374999997,2.655615234375034],[95.7171875,2.825976562500017],[95.89580078125007,2.8890625],[96.41728515625007,2.515185546875031],[96.46367187500002,2.360009765625037]]],[[[108.8875,2.905419921875037],[108.7865234375,2.885644531250009],[108.88574218750003,2.998974609374997],[108.8875,2.905419921875037]]],[[[105.76035156250006,2.863037109375014],[105.69218750000002,3.0625],[105.83671875000007,2.97651367187504],[105.76035156250006,2.863037109375014]]],[[[106.28525390625006,3.15712890624998],[106.28369140624997,3.088232421874977],[106.20097656250002,3.204882812500031],[106.28525390625006,3.15712890624998]]],[[[117.65839843750004,3.280517578124986],[117.54785156250003,3.43198242187502],[117.68085937500004,3.407519531250017],[117.65839843750004,3.280517578124986]]],[[[125.65810546875,3.436035156250043],[125.51152343750007,3.461132812500011],[125.46884765625006,3.73325195312502],[125.65810546875,3.436035156250043]]],[[[117.88476562499997,4.186132812500006],[117.92285156250003,4.054296874999977],[117.73681640624997,4.004003906250034],[117.64902343750012,4.168994140624974],[117.88476562499997,4.186132812500006]]],[[[108.31601562500006,3.689648437500026],[108.10039062500002,3.70454101562504],[108.24326171875006,3.810351562500017],[108.00234375,3.982861328124983],[108.24833984375002,4.21713867187502],[108.39287109375007,3.986181640625034],[108.31601562500006,3.689648437500026]]],[[[117.5744140625001,4.17060546875004],[117.46533203124997,4.076074218749966],[117.77724609375005,3.689257812500031],[117.05595703125007,3.622656249999963],[117.34628906250006,3.426611328124991],[117.35244140625,3.19375],[117.61064453125002,3.064355468749994],[117.56914062500002,2.92929687500002],[117.69765625,2.887304687499991],[117.6388671875001,2.825292968749963],[118.0666015625001,2.317822265624969],[117.7892578125001,2.026855468750014],[118.98496093750006,0.982128906249983],[118.53476562500006,0.813525390625017],[118.19609375000002,0.874365234374977],[117.91162109374997,1.098681640625017],[117.96425781250005,0.889550781250051],[117.74511718749997,0.72963867187498],[117.52216796875004,0.235888671875017],[117.46289062500003,-0.323730468749957],[117.5625,-0.770898437500009],[116.91396484375,-1.223632812499972],[116.73984375000006,-1.044238281250017],[116.75341796874997,-1.327343749999955],[116.27548828125006,-1.784863281249997],[116.42431640625003,-1.784863281249997],[116.45195312500002,-1.923144531250017],[116.31396484374997,-2.139843750000011],[116.56542968749997,-2.299707031249994],[116.52929687499997,-2.51054687499996],[116.31679687500005,-2.55185546875002],[116.33066406250012,-2.902148437499974],[116.16630859375002,-2.934570312500014],[116.2572265625,-3.126367187500009],[115.95615234375012,-3.595019531250003],[114.6935546875001,-4.169726562500017],[114.5255859375001,-3.376660156250011],[114.44599609375004,-3.481835937500037],[114.34433593750012,-3.444433593749963],[114.34433593750012,-3.23515625],[114.23632812500003,-3.36113281249996],[114.0822265625001,-3.27890625],[113.70507812499997,-3.45527343750004],[113.6100585937501,-3.195703125],[113.34316406250005,-3.246484374999966],[113.03398437500002,-2.933496093749966],[112.97148437500002,-3.187109375000034],[112.75800781250004,-3.322167968750009],[112.60029296875004,-3.400488281249977],[112.28496093750002,-3.32099609375004],[111.85810546875004,-3.551855468750006],[111.82304687500007,-3.057226562499949],[111.69472656250005,-2.88945312499996],[110.93007812500005,-3.071093750000017],[110.82968750000012,-2.9951171875],[110.89931640625,-2.908593749999952],[110.703125,-3.020898437500009],[110.57402343750007,-2.89140625],[110.25605468750004,-2.966113281249946],[110.09658203125,-2.001367187499966],[109.95986328125,-1.862792968749972],[109.98330078125,-1.274804687499994],[109.78740234375007,-1.011328124999963],[109.25878906250003,-0.807421874999989],[109.37275390625004,-0.638183593749972],[109.12109375000003,-0.39091796874996],[109.2575195312501,0.031152343750051],[108.94453125000004,0.355664062499997],[108.91679687500007,0.912646484375045],[108.95859375000006,1.134619140624963],[109.1315429687501,1.253857421875011],[109.01025390624997,1.239648437500051],[109.07587890625004,1.495898437500031],[109.37851562500006,1.922705078125034],[109.62890625000003,2.027539062499983],[109.53896484375,1.89619140625004],[109.65400390625004,1.614892578125023],[110.50576171875005,0.861962890625023],[111.10136718750002,1.050537109374986],[111.80898437500005,1.011669921874969],[112.078515625,1.143359374999974],[112.1857421875001,1.4390625],[112.47617187500006,1.559082031250028],[112.94296875000006,1.566992187500034],[113.00654296875004,1.433886718750003],[113.6222656250001,1.2359375],[113.90234375000003,1.434277343749997],[114.5125,1.452001953124963],[114.83056640625003,1.980029296874989],[114.78642578125002,2.250488281250014],[115.1791015625,2.523193359374972],[115.08076171875004,2.63422851562504],[115.117578125,2.89487304687502],[115.24697265625005,3.025927734374989],[115.45439453125002,3.034326171875009],[115.67880859375006,4.193017578124994],[115.86074218750005,4.348046875000037],[116.51474609375006,4.370800781249969],[117.10058593750003,4.337060546875023],[117.5744140625001,4.17060546875004]]],[[[126.81660156250004,4.033496093750003],[126.70449218750005,4.070996093749997],[126.81357421875006,4.258496093750011],[126.72207031250005,4.344189453124969],[126.75732421874997,4.547900390624989],[126.9210937500001,4.291015624999972],[126.81660156250004,4.033496093750003]]],[[[96.49257812500005,5.229345703124991],[97.54716796875002,5.205859375],[98.2484375,4.41455078125],[98.3073242187501,4.09287109375002],[99.73232421875005,3.183056640625026],[100.523828125,2.18916015625004],[100.88789062500004,1.948242187499986],[100.82822265625012,2.242578125],[101.04619140625002,2.257470703125023],[101.47666015625006,1.693066406250054],[102.019921875,1.442138671875],[102.38994140625007,0.84199218750004],[103.03183593750006,0.57890625],[103.0075195312501,0.415332031249974],[102.55,0.216455078124966],[103.33896484375012,0.513720703125045],[103.67265625000007,0.288916015624977],[103.78671875000012,0.046972656249991],[103.42851562500007,-0.19179687499998],[103.40517578125005,-0.36220703124998],[103.5091796875,-0.465527343749969],[103.43857421875006,-0.575585937500009],[103.72109375,-0.886718749999986],[104.36054687500004,-1.038378906249974],[104.51591796875002,-1.81943359375002],[104.84521484375003,-2.092968749999969],[104.65078125000005,-2.595214843749972],[104.97080078125012,-2.370898437500017],[105.39697265624997,-2.380175781249946],[106.0443359375,-3.10625],[105.84375,-3.61367187499998],[105.93046875000007,-3.833007812499986],[105.83144531250005,-4.16289062499996],[105.88720703124997,-5.009570312499974],[105.74833984375007,-5.818261718749966],[105.34941406250007,-5.549511718750011],[105.08134765625002,-5.74550781249998],[104.63955078125005,-5.520410156250037],[104.68398437500005,-5.89267578125002],[104.60156249999997,-5.90458984374996],[103.8314453125,-5.079589843750028],[102.53769531250006,-4.152148437499989],[102.12753906250006,-3.599218749999963],[101.57861328124997,-3.166992187500014],[100.88955078125,-2.248535156249957],[100.85527343750002,-1.934179687499949],[100.30820312500006,-0.82666015625],[99.66982421875005,0.045068359375037],[99.15917968749997,0.351757812499997],[98.59531250000006,1.864599609375006],[97.70078125000006,2.358544921875009],[97.59082031249997,2.846582031250037],[97.3913085937501,2.975292968749969],[96.9689453125001,3.575146484374969],[96.44472656250005,3.81630859374998],[95.57861328125003,4.661962890625048],[95.20664062500006,5.284033203125034],[95.22783203125002,5.564794921875034],[95.62890625000003,5.609082031249997],[96.13330078125003,5.294287109374991],[96.49257812500005,5.229345703124991]]]]},"properties":{"name":"Indonesia","childNum":107}},{"geometry":{"type":"Polygon","coordinates":[[[-4.412060546874983,54.185351562499996],[-4.785351562499983,54.073046875],[-4.424707031249994,54.407177734375],[-4.412060546874983,54.185351562499996]]]},"properties":{"name":"Isle of Man","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[75.32221348233018,32.28516356678968],[75.62496871116024,32.28516356678968],[75.73585997688717,32.78417426256088],[76.32728006076415,32.87658365066666],[76.62299010270264,33.32014871357439],[77.06655516561037,33.301666835953235],[77.71342088235082,32.6917648744551],[78.10154031239509,32.87658365066666],[78.49194250885338,32.53122786149202],[78.38964843749997,32.51987304687498],[78.41748046874997,32.466699218749994],[78.4552734375001,32.30034179687502],[78.49589843750002,32.21577148437504],[78.72558593750009,31.983789062500023],[78.71972656250009,31.887646484374983],[78.69345703125006,31.740380859374994],[78.7550781250001,31.55029296875],[78.74355468750005,31.323779296875017],[79.10712890625004,31.402636718750102],[79.38847656250013,31.064208984375085],[79.66425781250004,30.96523437499999],[79.92451171875004,30.888769531250034],[80.20712890625006,30.683740234375023],[80.19121093750002,30.56840820312496],[80.87353515625003,30.290576171875045],[80.98544921875006,30.23710937499999],[81.01025390625014,30.164501953125097],[80.96611328125002,30.180029296875063],[80.90761718750005,30.171923828125017],[80.84814453125009,30.139746093750034],[80.81992187500012,30.119335937499955],[80.68408203125014,29.994335937500068],[80.54902343750015,29.899804687499994],[80.40185546875003,29.730273437500102],[80.31689453125014,29.572070312500017],[80.25488281250009,29.423339843750114],[80.25595703125006,29.318017578125136],[80.23300781250006,29.194628906250045],[80.16953125000012,29.124316406250102],[80.13046875000006,29.100390625000045],[80.08457031249995,28.994189453125074],[80.05166015625,28.870312500000068],[80.07070312500005,28.830175781250063],[80.22656250000003,28.723339843750125],[80.32480468750012,28.66640625000008],[80.41855468749995,28.61201171875001],[80.47910156250012,28.604882812499994],[80.49580078125015,28.635791015625074],[80.51787109375002,28.665185546875023],[80.58701171875006,28.64960937500004],[81.16894531250014,28.335009765625074],[81.85263671875018,27.867089843750136],[81.89687500000011,27.87446289062504],[81.94521484375005,27.89926757812495],[81.98769531250016,27.91376953125004],[82.03701171875,27.90058593750004],[82.11191406250006,27.86494140625004],[82.28769531250018,27.756542968749983],[82.45136718750004,27.671826171874955],[82.62988281249997,27.687060546875045],[82.67734375000006,27.67343749999995],[82.71083984375005,27.596679687500114],[82.73339843750003,27.518994140625097],[83.28974609375004,27.370996093750136],[83.36943359375002,27.410253906249977],[83.38398437500004,27.444824218750085],[83.44716796875011,27.46533203125],[83.55166015625011,27.456347656249932],[83.74697265625011,27.395947265625068],[83.8288085937501,27.377832031250108],[84.09101562499993,27.491357421875136],[84.22978515625007,27.427832031250006],[84.48085937500005,27.348193359375102],[84.61015625000002,27.298681640624977],[84.64072265625012,27.249853515624977],[84.65478515625014,27.20366210937499],[84.65380859375009,27.09169921875008],[84.68535156250013,27.041015625000057],[85.19179687500011,26.766552734375097],[85.29296875000009,26.741015625000045],[85.56845703125012,26.839843750000114],[85.64843749999997,26.829003906250023],[85.69990234375004,26.781640624999966],[85.73730468750003,26.639746093750034],[85.79453125000006,26.60415039062505],[86.00732421875009,26.64936523437504],[86.70136718750015,26.435058593750057],[87.01640625000002,26.555419921875085],[87.2874023437499,26.360302734375125],[87.41357421875014,26.42294921875009],[87.84921875000006,26.43691406250008],[87.99511718750014,26.38237304687499],[88.02695312500023,26.395019531250085],[88.05488281250004,26.43002929687492],[88.11152343750004,26.58642578125],[88.1615234375,26.724804687500125],[88.15722656250009,26.807324218750068],[88.1110351562501,26.928466796875057],[87.99316406250009,27.086083984374994],[87.984375,27.133935546874994],[88.14697265625014,27.749218750000097],[88.15029296875011,27.843310546875074],[88.10976562500005,27.87060546874997],[88.10898437499995,27.93300781250005],[88.14111328125003,27.948925781250097],[88.27519531250013,27.96884765625009],[88.42597656250015,28.011669921875097],[88.57792968750002,28.093359375000034],[88.80371093750003,28.006933593750034],[88.74902343749997,27.521875000000136],[88.7648437500001,27.429882812500068],[88.83251953125003,27.362841796875074],[88.89140625000002,27.316064453125136],[88.88164062500007,27.29746093750009],[88.76035156250006,27.21811523437509],[88.73876953125009,27.175585937499932],[88.85761718750015,26.961474609375017],[89.14824218750002,26.816162109375085],[89.33212890625018,26.848632812500114],[89.58613281250004,26.778955078125136],[89.60996093750012,26.719433593750097],[89.71093750000009,26.713916015625045],[89.76386718750004,26.7015625],[89.94316406250013,26.723925781249932],[90.12294921875011,26.754589843749983],[90.20605468749997,26.847509765625063],[90.34589843750004,26.890332031250097],[90.73964843750005,26.771679687500068],[91.2865234375,26.78994140625008],[91.42675781249997,26.867089843749966],[91.45585937500013,26.866894531250125],[91.51757812500009,26.807324218750068],[91.67158203124993,26.80200195312503],[91.84208984375013,26.852978515625125],[91.94375,26.860839843750114],[91.99833984375013,26.85498046875],[92.04970703125016,26.87485351562495],[92.73155507489682,26.833697862861648],[93.30975376159499,26.784950522650554],[93.61047043679247,27.32239435188504],[94.06979001484449,27.589407158584788],[95.10800937321915,27.749636881153737],[95.74000740838363,28.116850432722256],[96.19577594042592,28.04291597700983],[96.96279296875,27.698291015625017],[96.88359375000013,27.514843750000125],[96.90195312500012,27.43959960937508],[97.10371093749993,27.163330078125114],[97.10205078125003,27.115429687500125],[96.95341796875013,27.13330078125003],[96.79785156249997,27.29619140624999],[96.19082031250005,27.26127929687499],[95.20146484375007,26.641406250000017],[95.05976562500015,26.473974609375006],[95.06894531250006,26.191113281250097],[95.10839843750014,26.091406250000034],[95.12929687500011,26.070410156250034],[95.13242187500006,26.041259765624943],[94.99199218750002,25.77045898437504],[94.66777343750007,25.458886718749966],[94.55302734375013,25.215722656249994],[94.70371093750012,25.097851562499955],[94.49316406250003,24.637646484374983],[94.37724609375002,24.473730468750006],[94.29306640625012,24.321875],[94.07480468750006,23.8720703125],[93.68339843750007,24.00654296875004],[93.45214843750003,23.987402343750034],[93.32626953125006,24.064208984375057],[93.36601562500007,23.132519531249955],[93.34941406250007,23.08496093750003],[93.20390625000002,23.03701171875005],[93.07871093750018,22.718212890625097],[93.16201171875,22.360205078125006],[93.07060546875002,22.20942382812501],[92.96455078125015,22.003759765625034],[92.90947265625013,21.988916015625023],[92.85429687500002,22.010156250000108],[92.77138671875,22.104785156250017],[92.68896484375009,22.130957031250006],[92.63037109375014,22.011328124999977],[92.57490234374993,21.97807617187496],[92.5612304687501,22.04804687500001],[92.49140625000004,22.685400390625006],[92.46445312500006,22.734423828125045],[92.36162109375002,22.929003906250074],[92.33378906250002,23.242382812499955],[92.24609375000003,23.68359374999997],[92.04404296875006,23.677783203125017],[91.97851562500003,23.691992187500063],[91.92958984375011,23.685986328125097],[91.92949218750019,23.598242187499977],[91.93789062500011,23.504687500000102],[91.75419921875013,23.28730468750004],[91.75097656250003,23.053515625000017],[91.55351562500013,22.991552734375006],[91.43623046875004,23.19990234375001],[91.359375,23.06835937500003],[91.16044921875019,23.660644531250085],[91.35019531250012,24.06049804687501],[91.72656250000003,24.20507812499997],[91.84619140624997,24.175292968749943],[92.06416015625004,24.374365234375006],[92.11748046875002,24.493945312500017],[92.22666015625012,24.77099609374997],[92.22832031250002,24.881347656250085],[92.2512695312499,24.895068359375045],[92.38496093750004,24.848779296875023],[92.46835937500018,24.944140625000074],[92.04970703125016,25.16948242187499],[90.61308593750002,25.16772460937497],[90.11962890625003,25.21997070312497],[89.86630859375012,25.293164062499955],[89.81406250000006,25.305371093749955],[89.80087890625012,25.33613281250001],[89.82490234375004,25.56015625],[89.82294921875015,25.94140625000003],[89.67089843750009,26.213818359375125],[89.57275390625003,26.13232421875003],[89.54990234375006,26.00527343750008],[89.28925781250015,26.037597656250085],[89.01865234375012,26.410253906249977],[88.95195312500002,26.412109375],[88.97041015625004,26.250878906250023],[88.94072265625002,26.24536132812497],[88.68281250000004,26.291699218749983],[88.51826171875004,26.51777343750004],[88.36992187500002,26.56411132812508],[88.35146484375005,26.482568359374966],[88.38623046875003,26.471533203125034],[88.44042968749997,26.369482421875034],[88.33398437499997,26.257519531249955],[88.15078125000005,26.087158203125057],[88.1066406250001,25.841113281250045],[88.14746093749997,25.811425781250023],[88.50244140625009,25.53701171875008],[88.76914062500006,25.490478515625],[88.85478515625002,25.333544921875017],[88.94414062500002,25.290771484375],[88.92978515625012,25.222998046875063],[88.57382812500006,25.18789062499999],[88.45625,25.188427734375125],[88.37294921875016,24.961523437500063],[88.31337890625011,24.8818359375],[88.27949218750015,24.881933593750034],[88.18886718750016,24.920605468750097],[88.14980468750011,24.91464843749995],[88.04511718750015,24.71303710937508],[88.03027343750009,24.664453125000136],[88.02343750000003,24.627832031250136],[88.07910156250009,24.549902343750063],[88.14550781250003,24.485791015624955],[88.225,24.460644531249983],[88.3375,24.45385742187503],[88.49853515625003,24.34663085937504],[88.64228515625015,24.325976562500102],[88.72353515625011,24.27490234375],[88.7335937500001,24.230908203125097],[88.72656250000009,24.18623046875004],[88.71376953125016,24.069628906250102],[88.69980468750006,24.00253906249992],[88.56738281250009,23.674414062500034],[88.63574218749997,23.55],[88.69765625,23.493017578125034],[88.72441406250002,23.254980468750034],[88.89707031250018,23.21040039062501],[88.92812500000011,23.186621093749977],[88.89970703125002,22.843505859375057],[88.92070312500002,22.632031249999955],[89.05,22.274609374999983],[89.02792968750023,21.937207031249983],[88.94931640625018,21.937939453125125],[89.05166015625,21.654101562500045],[88.85751953125012,21.744677734375017],[88.74501953125011,21.584375],[88.74023437500003,22.005419921875017],[88.64160156250003,22.121972656250136],[88.58466796875015,21.659716796874932],[88.44599609375004,21.614257812500085],[88.28750000000016,21.758203125000108],[88.25371093750002,21.622314453124943],[88.0568359375001,21.694140625000017],[88.19628906249997,22.139550781249994],[87.94140625000003,22.374316406250045],[88.15927734375018,22.12172851562508],[87.82373046875003,21.727343750000045],[87.20068359375009,21.544873046874983],[86.95410156250014,21.365332031250006],[86.84228515625009,21.106347656249994],[86.97548828125005,20.70014648437501],[86.75039062500011,20.313232421875057],[86.37656250000006,20.006738281249966],[86.24521484375012,20.05302734374999],[86.27949218750021,19.919433593749943],[85.575,19.69291992187499],[85.496875,19.696923828125108],[85.50410156250004,19.887695312500057],[85.24863281250006,19.757666015625034],[85.18076171875018,19.59487304687508],[85.44160156249993,19.626562499999977],[84.77099609375009,19.125390625000023],[84.10410156250018,18.29267578125001],[82.35957031250004,17.09619140624997],[82.25878906250014,16.55986328124996],[81.76191406250015,16.32949218750008],[81.28613281249997,16.337060546875023],[80.97871093750004,15.758349609375074],[80.64658203125006,15.895019531250028],[80.29345703125014,15.710742187499989],[80.0534179687501,15.074023437499932],[80.17871093750003,14.478320312500074],[80.11171875000005,14.212207031250045],[80.30654296875016,13.485058593750054],[80.15625,13.713769531250108],[80.06210937500006,13.60625],[80.34238281250006,13.361328125000071],[80.22910156250018,12.690332031249966],[79.85849609375018,11.988769531250043],[79.69316406250007,11.312548828124946],[79.79902343750004,11.338671874999932],[79.84863281250009,11.196875],[79.83818359375002,10.322558593750045],[79.31455078125018,10.256689453124949],[78.93994140625009,9.565771484375063],[79.01992187500005,9.333349609374963],[79.41142578125002,9.192382812500014],[78.97958984375018,9.268554687500085],[78.42148437500006,9.105029296874989],[78.19248046874995,8.890869140625057],[78.06015625000006,8.384570312499932],[77.51757812500003,8.078320312500068],[77.06591796875003,8.315917968749986],[76.5534179687501,8.902783203124997],[76.32460937500016,9.452099609374997],[76.24238281250004,9.927099609374949],[76.37558593750006,9.539892578124935],[76.45878906250013,9.536230468750077],[76.34648437500002,9.922119140625],[76.19560546875002,10.086132812500026],[75.72382812500015,11.361767578125026],[74.94550781250004,12.56455078124992],[74.38222656250005,14.494726562500048],[73.94921875000014,15.074755859375088],[73.80078125000009,15.39697265625],[73.93193359375013,15.39697265625],[73.77177734375013,15.573046874999989],[73.83281250000013,15.659375],[73.67988281250015,15.708886718750136],[73.47607421875003,16.05424804687496],[72.87548828124997,18.642822265625114],[72.97207031250011,19.15332031250003],[72.8346679687501,18.975585937500057],[72.80302734375013,19.07929687500004],[72.81162109375,19.298925781250006],[72.98720703125,19.27744140625009],[72.78789062500013,19.362988281250097],[72.66777343750019,19.83095703125005],[72.89375,20.672753906250136],[72.81386718750011,21.117187500000085],[72.62382812500002,21.371972656250108],[72.73476562500016,21.470800781250006],[72.61328125000009,21.461816406250108],[73.1125,21.750439453125125],[72.54306640625,21.69658203124999],[72.70019531250003,21.971923828124943],[72.52226562500013,21.976220703125108],[72.55302734375007,22.159960937500074],[72.80917968749995,22.23330078125008],[72.18281250000015,22.26972656250004],[72.30644531250002,22.18920898437497],[72.27441406250009,22.089746093749966],[72.03720703125006,21.82304687499999],[72.2103515625,21.72822265625004],[72.25400390625006,21.531005859375],[72.01523437500012,21.155712890625097],[71.0246093750001,20.73886718750009],[70.71933593750006,20.740429687500068],[70.12734375,21.094677734375097],[68.96992187500021,22.29028320312497],[69.05166015625016,22.437304687500074],[69.27656250000004,22.285498046875063],[70.17724609375014,22.57275390624997],[70.48925781250009,23.08950195312508],[70.33945312500012,22.939746093749932],[69.66464843750006,22.759082031250074],[69.23593749999995,22.848535156250023],[68.64072265625006,23.189941406250114],[68.41748046875009,23.57148437500004],[68.7767578125,23.852099609375017],[68.23496093749995,23.596972656250074],[68.16503906250009,23.857324218749994],[68.28251953125013,23.927978515625],[68.38125000000016,23.950878906250068],[68.48867187500011,23.96723632812501],[68.5866210937501,23.966601562500074],[68.72412109375003,23.964697265625034],[68.72812500000012,24.265625],[68.73964843750016,24.291992187500085],[68.75898437499993,24.307226562500006],[68.78115234375011,24.313720703125085],[68.8,24.30908203125003],[68.82832031250004,24.26401367187509],[68.86347656250015,24.26650390625005],[68.90078125000011,24.29243164062501],[68.98457031250015,24.273095703124966],[69.05156250000013,24.28632812500001],[69.11953125000011,24.26865234374995],[69.23505859374993,24.268261718750068],[69.44345703124995,24.275390625000085],[69.55917968750006,24.273095703124966],[69.80517578125009,24.16523437500004],[70.0982421875,24.2875],[70.28906250000009,24.356298828125063],[70.54677734375,24.418310546875063],[70.56503906250006,24.385791015625017],[70.55585937500015,24.331103515625074],[70.57929687500015,24.279052734374943],[70.65947265625013,24.24609374999997],[70.71630859375009,24.237988281250097],[70.7672851562501,24.245410156250017],[70.80507812500011,24.26196289062503],[70.88623046875014,24.34375],[70.92812500000016,24.362353515625045],[70.98281250000011,24.361035156250125],[71.04404296875006,24.400097656250097],[71.04531250000005,24.42998046874996],[70.96982421875012,24.571875],[70.97636718750013,24.61875],[71.00234375000016,24.6539062499999],[71.04785156250003,24.687744140625085],[71.02070312500021,24.75766601562492],[70.95087890625015,24.89160156250003],[70.87773437500019,25.06298828124997],[70.65205078125004,25.422900390625102],[70.64843750000003,25.666943359375068],[70.5695312500001,25.705957031250023],[70.50585937500009,25.685302734375085],[70.44853515625013,25.681347656249983],[70.26464843750009,25.70654296874997],[70.10019531250006,25.91005859375005],[70.14921875000002,26.347558593749994],[70.11464843750016,26.548046874999983],[69.47001953125002,26.804443359375],[69.56796875,27.174609375000102],[69.89628906250007,27.473632812500085],[70.04980468750009,27.694726562500023],[70.14453125000003,27.849023437499994],[70.19394531250006,27.89487304687492],[70.24433593750004,27.934130859375102],[70.4037109375,28.025048828124994],[70.48857421875013,28.023144531250125],[70.62910156250015,27.937451171875068],[70.6916015625001,27.76899414062504],[70.79794921875012,27.709619140625023],[70.87490234375016,27.71445312499995],[71.18476562500004,27.831640625],[71.54296875000003,27.869873046875],[71.8703125000001,27.9625],[71.88886718750004,28.04746093749992],[71.94804687500002,28.177294921875102],[72.12851562500012,28.34633789062508],[72.29199218750003,28.69726562499997],[72.34189453125006,28.751904296875097],[72.90332031250003,29.02875976562501],[73.38164062500013,29.934375],[73.8091796875,30.093359375],[73.88652343750013,30.162011718750136],[73.93339843750002,30.222070312500108],[73.92460937500007,30.28164062499999],[73.88271484375,30.352148437499977],[73.89931640625,30.435351562500045],[74.00898437500004,30.519677734374994],[74.33935546875003,30.893554687499943],[74.38037109375003,30.89340820312509],[74.50976562500009,30.959667968750097],[74.63281250000014,31.034667968750114],[74.62578125000002,31.068750000000108],[74.61035156250009,31.112841796875045],[74.51767578125012,31.185595703124932],[74.53496093750007,31.261376953125108],[74.59394531249993,31.465380859375102],[74.58183593750013,31.523925781250114],[74.50996093750015,31.712939453125074],[74.52597656249995,31.765136718750057],[74.55556640625011,31.818554687500097],[74.63574218750003,31.889746093750034],[74.73945312500015,31.948828125],[75.07148437500015,32.08935546875003],[75.13876953125,32.10478515624999],[75.25410156250004,32.140332031250125],[75.33349609374997,32.279199218749994],[75.32221348233018,32.28516356678968]]]]},"properties":{"name":"India","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[72.49199218750002,-7.37744140625],[72.42910156250002,-7.435351562500003],[72.34970703125,-7.263378906250011],[72.447265625,-7.395703125000011],[72.44560546875002,-7.220410156250011],[72.49199218750002,-7.37744140625]]]},"properties":{"name":"Br. Indian Ocean Ter.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-9.948193359374926,53.91313476562499],[-10.265722656249949,53.977685546874994],[-9.99638671874996,54.00361328125004],[-9.948193359374926,53.91313476562499]]],[[[-6.218017578125,54.08872070312506],[-6.347607421874926,53.94130859375005],[-6.027392578124989,52.927099609375006],[-6.463183593749932,52.345361328124994],[-6.325,52.246679687500034],[-6.890234375,52.15922851562499],[-6.965771484374926,52.24951171875],[-8.057812499999926,51.82558593750005],[-8.4091796875,51.888769531250034],[-8.349121093749943,51.73930664062496],[-8.813427734374926,51.584912109374955],[-9.737304687499943,51.473730468750034],[-9.524902343750028,51.68110351562501],[-10.120751953124994,51.60068359375006],[-9.598828124999983,51.87441406250005],[-10.341064453124943,51.798925781250034],[-9.909667968749972,52.122949218749966],[-10.39023437499992,52.134912109374994],[-10.356689453125,52.20693359375002],[-9.772119140624937,52.250097656250034],[-9.90605468749996,52.403710937499966],[-9.632226562499937,52.54692382812502],[-8.783447265624943,52.679638671874955],[-8.990283203124989,52.755419921875045],[-9.175390624999949,52.634912109374994],[-9.916601562499977,52.56972656250005],[-9.46489257812496,52.82319335937498],[-9.299218749999966,53.09755859375002],[-8.930126953124983,53.207080078125045],[-9.51420898437496,53.23823242187498],[-10.091259765624926,53.41284179687503],[-10.116992187499932,53.548535156249955],[-9.720654296874926,53.6044921875],[-9.901611328124943,53.72719726562502],[-9.578222656249949,53.80541992187497],[-9.578857421875,53.879833984374955],[-9.9140625,53.863720703124955],[-9.856445312499972,54.095361328124994],[-10.092675781249966,54.15576171875003],[-10.056396484374943,54.25781250000006],[-8.545556640624994,54.24121093750003],[-8.623144531249977,54.346875],[-8.133447265624966,54.64082031250001],[-8.763916015624972,54.68120117187496],[-8.377294921874977,54.88945312500002],[-8.274609374999955,55.146289062500045],[-7.667089843749977,55.25649414062502],[-7.65874023437496,54.97094726562503],[-7.308789062500011,55.365820312500006],[-6.961669921874972,55.23789062500006],[-7.218652343749937,55.09199218749998],[-7.55039062499992,54.767968749999966],[-7.910595703124955,54.698339843750006],[-7.75439453125,54.59492187499998],[-8.118261718749977,54.41425781250004],[-7.606542968750006,54.14384765625002],[-7.324511718750017,54.13344726562502],[-7.007714843749937,54.40668945312501],[-6.649804687499937,54.05864257812496],[-6.218017578125,54.08872070312506]]]]},"properties":{"name":"Ireland","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[56.18798828125003,26.92114257812497],[55.95429687500004,26.70112304687501],[55.31152343749997,26.592626953125006],[55.76259765625005,26.81196289062504],[55.75761718750002,26.94765625000005],[56.279394531250006,26.952099609374983],[56.18798828125003,26.92114257812497]]],[[[46.1144531250001,38.877783203125034],[46.490625,38.90668945312498],[47.995898437500074,39.683935546875034],[48.322167968749994,39.39907226562502],[48.10439453125005,39.241113281249994],[48.292089843750006,39.01884765624999],[47.99648437499999,38.85375976562503],[48.59267578125005,38.41108398437498],[48.86875,38.43549804687498],[48.95996093750003,37.89013671875],[49.171191406250074,37.60058593749997],[50.13046875,37.407128906249994],[50.53320312499997,37.01367187500006],[51.11855468750005,36.742578124999966],[52.19013671875004,36.62172851562505],[53.76767578125006,36.93032226562502],[53.91542968750005,36.93032226562502],[53.67949218750002,36.853125],[53.970117187499994,36.818310546874955],[53.91416015625006,37.34355468750002],[54.6994140625001,37.47016601562498],[54.90009765625004,37.77792968750006],[55.38085937500003,38.051123046875034],[56.272070312500006,38.080419921875034],[56.440625,38.249414062499994],[57.1935546875001,38.216406250000034],[57.35371093750004,37.97333984374998],[58.261621093749994,37.665820312500045],[58.81542968750003,37.683496093749994],[59.30175781249997,37.51064453125005],[59.454980468749994,37.25283203125002],[60.06279296875002,36.962890625],[60.34130859375003,36.63764648437501],[61.11962890625003,36.64257812500003],[61.212011718750006,36.190527343750034],[61.15292968750006,35.97675781250001],[61.25214843750004,35.86762695312498],[61.26201171875002,35.61958007812498],[61.28183593750006,35.55341796875001],[61.2785156250001,35.513769531250006],[61.245507812499994,35.47407226562501],[61.18925781250002,35.31201171875003],[61.1,35.272314453125034],[61.08007812499997,34.85561523437505],[60.95117187499997,34.65385742187499],[60.91474609375004,34.63398437500001],[60.80234375000006,34.55463867187501],[60.73945312500004,34.544726562500045],[60.7262695312501,34.51826171874998],[60.736132812500074,34.491796875],[60.76259765625005,34.475244140624994],[60.88945312500002,34.31943359375006],[60.642675781250006,34.30717773437496],[60.48574218750005,34.09477539062502],[60.4859375,33.7119140625],[60.57382812500006,33.58833007812498],[60.91699218749997,33.505224609375006],[60.56054687499997,33.13784179687502],[60.5765625,32.99487304687503],[60.71044921874997,32.6],[60.82929687500004,32.24941406250005],[60.82724609375006,32.16796874999997],[60.789941406249994,31.98710937499999],[60.7875,31.87719726562497],[60.791601562500006,31.660595703124983],[60.82070312499999,31.495166015625045],[60.854101562500006,31.483251953125006],[61.110742187499994,31.45112304687504],[61.346484375000074,31.42163085937497],[61.66015625000003,31.382421874999977],[61.7550781250001,31.285302734374994],[61.814257812500074,31.072558593750017],[61.810839843750074,30.913281249999983],[61.78417968749997,30.831933593750023],[61.55947265625005,30.59936523437497],[61.33164062500006,30.36372070312501],[60.84335937500006,29.85869140624999],[61.03417968750003,29.663427734374977],[61.15214843750002,29.542724609375],[61.8898437500001,28.546533203124994],[62.7625,28.202050781249994],[62.782324218750006,27.800537109375],[62.75273437500002,27.265625],[63.16679687500002,27.25249023437499],[63.19609375000002,27.243945312500017],[63.25625,27.20791015625005],[63.30156250000002,27.151464843750006],[63.30517578124997,27.124560546875017],[63.242089843749994,27.07768554687499],[63.25039062499999,26.879248046875063],[63.24160156250005,26.86474609375003],[63.18613281250006,26.83759765625001],[63.168066406250006,26.66557617187496],[62.31230468750002,26.490869140624994],[62.23935546875006,26.357031249999977],[62.12597656249997,26.368994140625034],[61.842382812500006,26.225927734375006],[61.809960937499994,26.165283203125],[61.78076171874997,25.99584960937503],[61.75439453125003,25.843359375000063],[61.737695312499994,25.821093750000045],[61.66865234375004,25.76899414062501],[61.6618164062501,25.751269531250017],[61.67138671874997,25.69238281250003],[61.64013671875003,25.584619140624994],[61.61542968750004,25.28613281250003],[61.58789062499997,25.20234375000001],[61.533105468749994,25.195507812499955],[61.41220703125006,25.102099609375017],[60.66386718750002,25.28222656250003],[60.51054687500002,25.437060546875045],[60.40019531250002,25.311572265625074],[59.45605468749997,25.481494140625045],[59.0460937500001,25.417285156250017],[58.79785156249997,25.554589843750023],[57.334570312500006,25.791552734375074],[57.03603515625005,26.80068359375005],[56.728125,27.127685546875057],[56.118066406249994,27.14311523437499],[54.75927734375003,26.50507812500004],[54.24707031250003,26.696630859374977],[53.70576171875004,26.72558593750003],[52.69160156250004,27.323388671875023],[52.475878906250074,27.61650390624999],[52.03076171874997,27.824414062499955],[51.58906250000004,27.864208984374983],[51.27890625,28.13134765624997],[51.06201171874997,28.72612304687499],[50.86699218750002,28.870166015625017],[50.87578125000002,29.062695312499983],[50.67519531250005,29.146582031250034],[50.64960937500004,29.420068359374966],[50.16894531250003,29.921240234375034],[50.071582031250074,30.198535156250017],[49.55488281250004,30.028955078125023],[49.028125,30.333447265624983],[49.224511718749994,30.472314453125023],[49.00195312500003,30.506542968749983],[48.91914062500004,30.120898437500017],[48.54648437500006,29.962353515624955],[48.47851562499997,30.003808593749966],[48.43457031249997,30.03759765625],[48.33105468749997,30.28544921874996],[48.01494140625002,30.465625],[48.01064453125005,30.989794921875017],[47.679492187500074,31.00239257812501],[47.679492187500074,31.400585937499955],[47.75390624999997,31.601367187500017],[47.829980468749994,31.79443359375],[47.71455078125004,31.936425781249966],[47.5915039062501,32.087988281250034],[47.51191406250004,32.15083007812504],[47.3297851562501,32.45551757812501],[47.28515625000003,32.474023437499966],[47.121386718750074,32.46660156249996],[46.569921875,32.83393554687501],[46.37705078125006,32.92924804687499],[46.29824218750005,32.95024414062502],[46.11279296875003,32.957666015624994],[46.09306640625002,32.97587890624999],[46.08046875,33.028222656249994],[46.0807617187501,33.08652343750006],[46.14111328125003,33.174414062500034],[46.145898437499994,33.229638671874994],[46.01992187500005,33.41572265624998],[45.39707031250006,33.970849609374994],[45.542773437500074,34.21552734375004],[45.459375,34.470361328124994],[45.50078125000002,34.58159179687499],[45.6375,34.573828125],[45.678125,34.798437500000034],[45.92089843750003,35.02851562500001],[46.04179687500002,35.08017578125006],[46.13378906249997,35.127636718749955],[46.15468750000005,35.19672851562498],[46.112109375000074,35.32167968750005],[45.97109375000005,35.524169921875],[46.03740234375002,35.67314453124999],[46.180957031250074,35.71137695312504],[46.2625,35.74414062500006],[46.27343749999997,35.77324218750002],[46.16748046874997,35.820556640625],[45.77636718749997,35.82182617187499],[45.36162109375002,36.015332031249955],[45.241113281249994,36.35595703125],[45.20654296874997,36.397167968749955],[45.15527343749997,36.407373046874994],[45.11240234375006,36.409277343750034],[45.053125,36.47163085937501],[44.76513671875003,37.142431640625006],[44.79414062500004,37.290380859375034],[44.574023437500074,37.435400390625006],[44.589941406250006,37.710351562499966],[44.21132812499999,37.908056640625006],[44.4499023437501,38.33422851562506],[44.2985351562501,38.38627929687499],[44.27167968750004,38.83603515625006],[44.02324218750002,39.37744140625006],[44.3893554687501,39.422119140625],[44.58710937500004,39.76855468750006],[44.81718750000002,39.65043945312496],[45.4796875000001,39.00625],[46.1144531250001,38.877783203125034]]]]},"properties":{"name":"Iran","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[45.6375,34.573828125],[45.50078125000002,34.581591796874996],[45.459375,34.470361328124994],[45.54277343750002,34.21552734375],[45.397070312500006,33.970849609374994],[46.01992187500002,33.41572265625],[46.14589843750002,33.229638671874994],[46.14111328125,33.1744140625],[46.08076171875001,33.0865234375],[46.08046875000002,33.028222656249994],[46.09306640625002,32.975878906249996],[46.11279296875,32.957666015624994],[46.377050781250006,32.929248046874996],[46.569921875,32.833935546875],[47.12138671875002,32.466601562499996],[47.28515625,32.474023437499994],[47.32978515625001,32.455517578125],[47.51191406250001,32.150830078125],[47.59150390625001,32.08798828125],[47.71455078125001,31.936425781249994],[47.82998046875002,31.79443359375],[47.75390625,31.601367187499996],[47.67949218750002,31.400585937499997],[47.67949218750002,31.002392578124997],[48.01064453125002,30.989794921874996],[48.01494140625002,30.465625],[48.3310546875,30.285449218749996],[48.546484375,29.962353515624997],[48.454199218750006,29.9384765625],[48.354589843750006,29.956738281249997],[48.141699218750006,30.040917968749994],[47.982519531250006,30.011328125],[47.97871093750001,29.9828125],[47.64375,30.097314453124994],[47.14824218750002,30.0009765625],[46.905859375,29.5375],[46.76933593750002,29.347460937499996],[46.69375,29.259667968749994],[46.53144531250001,29.096240234374996],[46.3564453125,29.063671875],[44.71650390625001,29.193603515625],[43.77373046875002,29.84921875],[42.07441406250001,31.080371093749996],[40.47890625000002,31.893359375],[40.36933593750001,31.93896484375],[40.02783203125,31.995019531249994],[39.7041015625,32.042529296874996],[39.14541015625002,32.12451171875],[39.29277343750002,32.24384765625],[39.24746093750002,32.350976562499994],[39.04140625000002,32.3056640625],[38.773535156250006,33.372216796874994],[40.98701171875001,34.429052734375],[41.19472656250002,34.768994140625],[41.354101562500006,35.640429687499996],[41.295996093750006,36.383349609374996],[41.41679687500002,36.5146484375],[41.78857421875,36.59716796875],[42.358984375,37.10859375],[42.45585937500002,37.128710937499996],[42.63544921875001,37.249267578125],[42.74111328125002,37.3619140625],[42.77460937500001,37.371875],[42.869140625,37.334912109375],[42.936621093750006,37.324755859374996],[43.09248046875001,37.3673828125],[43.67578125,37.22724609375],[43.83642578125,37.223535156249994],[44.01318359375,37.313525390624996],[44.11445312500001,37.30185546875],[44.15625,37.282958984375],[44.19179687500002,37.249853515625],[44.20839843750002,37.20263671875],[44.20166015625,37.051806640624996],[44.281835937500006,36.97802734375],[44.32558593750002,37.0107421875],[44.401953125,37.058496093749994],[44.60595703125,37.176025390625],[44.66933593750002,37.173583984375],[44.73095703125,37.165283203125],[44.76513671875,37.142431640625],[45.053125,36.471630859375],[45.112402343750006,36.40927734375],[45.1552734375,36.407373046874994],[45.20654296875,36.39716796875],[45.24111328125002,36.35595703125],[45.36162109375002,36.01533203125],[45.7763671875,35.821826171874996],[46.16748046875,35.820556640625],[46.2734375,35.773242187499996],[46.2625,35.744140625],[46.18095703125002,35.711376953125],[46.03740234375002,35.673144531249996],[45.97109375000002,35.524169921875],[46.11210937500002,35.321679687499994],[46.15468750000002,35.196728515625],[46.1337890625,35.12763671875],[46.04179687500002,35.08017578125],[45.9208984375,35.028515625],[45.678125,34.7984375],[45.6375,34.573828125]]]},"properties":{"name":"Iraq","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-15.543115234374994,66.228515625],[-14.595849609374994,66.38154296875],[-15.117382812499983,66.125634765625],[-14.698193359374983,66.02021484375],[-14.827099609374983,65.7642578125],[-14.391845703125,65.78740234375],[-14.473388671875,65.575341796875],[-14.166943359374983,65.64228515625],[-13.617871093749983,65.5193359375],[-13.804785156249977,65.35478515625],[-13.599316406249983,65.0359375],[-14.04443359375,64.74189453125],[-14.385107421874977,64.74521484375],[-14.475390624999989,64.493994140625],[-14.927392578124994,64.319677734375],[-15.832910156249994,64.17666015625],[-16.640332031249983,63.865478515625],[-17.81572265624999,63.71298828125],[-17.946923828124994,63.5357421875],[-18.65361328124999,63.406689453125],[-20.198144531249994,63.555810546874994],[-20.494042968749994,63.687353515625],[-20.413964843749994,63.80517578125],[-20.65092773437499,63.73740234375],[-21.15239257812499,63.94453125],[-22.652197265624977,63.827734375],[-22.701171875,64.083203125],[-22.51005859374999,63.991455078125],[-22.187597656249977,64.039208984375],[-21.463330078124983,64.379150390625],[-22.053369140624994,64.313916015625],[-21.950341796874994,64.514990234375],[-21.590625,64.6263671875],[-22.10600585937499,64.533056640625],[-22.467041015625,64.794970703125],[-23.818994140624994,64.73916015625],[-24.02617187499999,64.863427734375],[-22.7880859375,65.046484375],[-21.89213867187499,65.048779296875],[-21.779980468749983,65.1876953125],[-22.50908203124999,65.19677734375],[-21.844384765624994,65.44736328125],[-22.902490234374994,65.58046875],[-23.89990234375,65.407568359375],[-24.475683593749977,65.5251953125],[-24.248925781249994,65.614990234375],[-23.85673828124999,65.53837890625],[-24.092626953124977,65.77646484375],[-23.615917968749983,65.67958984375],[-23.285351562499983,65.75],[-23.832617187499977,65.84921875],[-23.52495117187499,65.880029296875],[-23.77734375,66.017578125],[-23.434472656249994,66.02421875],[-23.452539062499994,66.181005859375],[-23.018994140624983,65.98212890625],[-22.659863281249983,66.025927734375],[-22.61601562499999,65.86748046875],[-22.44169921874999,65.90830078125],[-22.4453125,66.07001953125],[-22.947900390624994,66.212744140625],[-22.48442382812499,66.26630859375],[-23.116943359375,66.338720703125],[-22.9443359375,66.429443359375],[-22.426123046874977,66.430126953125],[-21.406884765624994,66.0255859375],[-21.374902343749994,65.74189453125],[-21.658447265625,65.723583984375],[-21.12968749999999,65.2666015625],[-20.804345703124994,65.63642578125],[-20.454833984375,65.571044921875],[-20.20751953125,66.10009765625],[-19.489697265624983,65.76806640625],[-19.382958984374994,66.07568359375],[-18.845898437499983,66.183935546875],[-18.141943359374977,65.73408203125],[-18.29716796874999,66.157421875],[-17.906982421875,66.143310546875],[-17.550439453124994,65.964404296875],[-17.153027343749983,66.20283203125],[-16.838037109374994,66.125244140625],[-16.485009765624994,66.195947265625],[-16.540673828124994,66.446728515625],[-16.24931640624999,66.522900390625],[-15.985400390624989,66.5146484375],[-15.543115234374994,66.228515625]]]},"properties":{"name":"Iceland","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[35.78730468750001,32.734912109374996],[35.572851562500006,32.640869140625],[35.56904296875001,32.619873046875],[35.55146484375001,32.3955078125],[35.484375,32.401660156249996],[35.40263671875002,32.450634765625],[35.38671875,32.493017578125],[35.303808593750006,32.512939453125],[35.19326171875002,32.534423828125],[35.065039062500006,32.46044921875],[35.01054687500002,32.338183593749996],[34.95595703125002,32.1609375],[34.98974609375,31.91328125],[34.97832031250002,31.86640625],[34.95380859375001,31.841259765624997],[34.96113281250001,31.82333984375],[34.983007812500006,31.81679687499999],[35.05322265625,31.837939453124996],[35.12714843750001,31.816748046875],[35.203710937500006,31.75],[34.95097656250002,31.602294921875],[34.88046875,31.3681640625],[35.45058593750002,31.479296875],[34.97343750000002,29.555029296875],[34.904296875,29.47734375],[34.24531250000001,31.208300781249996],[34.34833984375001,31.292919921874997],[34.350195312500006,31.362744140624997],[34.52558593750001,31.525634765625],[34.47734375000002,31.584863281249994],[34.483984375,31.59228515625],[34.67841796875001,31.895703125],[35.10859375000001,33.08369140625],[35.411230468750006,33.07568359375],[35.869140625,33.43173828125],[35.91347656250002,32.94960937499999],[35.78730468750001,32.734912109374996]]]},"properties":{"name":"Israel","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[15.576562500000051,38.220312500000034],[15.099511718750023,37.45859375],[15.295703125000017,37.05517578124997],[15.112597656250017,36.687841796875006],[14.501855468750023,36.798681640625034],[14.142968750000023,37.103662109374994],[13.90546875000004,37.10063476562502],[13.169921875000028,37.47929687499996],[12.640234375000034,37.594335937500034],[12.435546874999972,37.819775390624955],[12.734375,38.18305664062498],[12.902734375000023,38.03486328124998],[13.291113281250034,38.19145507812502],[13.788867187499989,37.981201171875],[15.11875,38.15273437500002],[15.498730468750011,38.290869140625006],[15.576562500000051,38.220312500000034]]],[[[8.478906250000023,39.067529296874966],[8.421484375000034,38.968652343749994],[8.366796875,39.115917968749955],[8.478906250000023,39.067529296874966]]],[[[8.28603515625008,41.03984375],[8.205664062500034,40.99746093750005],[8.320214843750023,41.121875],[8.28603515625008,41.03984375]]],[[[9.632031250000011,40.88203124999998],[9.805273437500063,40.499560546875045],[9.642968750000023,40.268408203125006],[9.5625,39.16601562500006],[9.056347656250068,39.23916015625002],[8.966601562500074,38.963720703125034],[8.648535156250034,38.92656250000002],[8.418164062500068,39.205712890624966],[8.547753906250023,39.83920898437506],[8.4078125,39.91723632812497],[8.471289062500063,40.29267578124998],[8.189941406250028,40.651611328125],[8.22421875,40.91333007812503],[8.571875,40.85019531250006],[9.228417968750023,41.257080078125],[9.615332031249977,41.01728515624998],[9.632031250000011,40.88203124999998]]],[[[10.395117187500034,42.85815429687503],[10.419335937499994,42.71318359374999],[10.13125,42.742041015625006],[10.395117187500034,42.85815429687503]]],[[[13.420996093750006,46.212304687499994],[13.63251953125004,46.17705078125002],[13.634960937499983,46.15776367187499],[13.61660156250008,46.133105468750045],[13.54804687500004,46.08911132812503],[13.486425781250034,46.03955078124997],[13.480273437500017,46.00922851562501],[13.487695312500023,45.987109375000045],[13.509179687500051,45.973779296874994],[13.6005859375,45.97978515624996],[13.663476562500023,45.7919921875],[13.831152343750006,45.680419921875],[13.719824218750063,45.58759765625001],[13.628320312500051,45.77094726562498],[13.206347656250074,45.771386718749966],[12.27431640625008,45.44604492187503],[12.225683593750034,45.24150390625002],[12.523437500000028,44.96796874999998],[12.248339843750045,44.72250976562498],[12.396289062500074,44.223876953125],[13.56416015625004,43.57128906250003],[14.010449218750011,42.68955078125006],[14.54072265625004,42.24428710937502],[15.16875,41.93403320312498],[16.164648437500034,41.89619140624998],[15.900488281250034,41.51206054687498],[17.954980468749994,40.65517578125002],[18.460644531249983,40.221044921875034],[18.34375,39.82138671874998],[18.077929687500017,39.93696289062498],[17.865039062500074,40.28017578125002],[17.395800781250045,40.34023437499999],[17.179980468750045,40.50278320312498],[16.92822265625,40.45805664062502],[16.521875,39.74755859375003],[17.114550781250017,39.38061523437497],[17.174609375000017,38.998095703125045],[16.61669921875003,38.800146484375034],[16.54560546875001,38.40908203125002],[16.05683593750001,37.941845703124955],[15.72451171875008,37.93911132812502],[15.645800781250017,38.034228515625045],[15.87890625,38.61391601562502],[16.19677734375,38.759228515624955],[16.20996093750003,38.94111328124998],[15.692773437499994,39.99018554687501],[14.95087890625004,40.23901367187497],[14.94765625000008,40.469335937500006],[14.765722656250063,40.66840820312498],[14.339941406250006,40.59882812500001],[14.460546875000063,40.72871093750001],[14.04433593750008,40.81225585937506],[13.733398437500057,41.23564453124999],[13.088671875000074,41.243847656249955],[12.630859374999972,41.469677734374955],[11.637304687500063,42.287548828124955],[11.141210937499977,42.38989257812503],[11.167773437500074,42.53515625000006],[10.708398437500023,42.93632812499999],[10.514843750000011,42.96752929687503],[10.188085937500063,43.947509765625],[8.76582031250004,44.42231445312501],[8.004980468750006,43.87675781249999],[7.4931640625,43.767138671875045],[7.637207031250057,44.16484375],[7.318554687500068,44.13798828125002],[6.900195312499989,44.33574218749996],[6.99267578125,44.82729492187502],[6.634765625000028,45.06816406249996],[7.07832031250004,45.23994140624998],[7.146386718750051,45.381738281249994],[6.790917968750023,45.740869140624966],[7.021093750000034,45.92578124999997],[7.055761718749977,45.90380859375003],[7.129003906249977,45.88041992187499],[7.327929687500017,45.912353515625],[7.9931640625,46.01591796874996],[8.081542968750057,46.25600585937502],[8.231933593750057,46.341210937499966],[8.29853515625004,46.403417968750034],[8.370703125,46.44511718750002],[8.458398437500023,46.24589843750002],[8.818554687500011,46.0771484375],[8.826757812500006,46.06103515625],[8.77802734375004,45.996191406250034],[8.953710937500034,45.83002929687501],[9.023730468750074,45.845703125],[9.203417968750017,46.21923828125],[9.304394531250068,46.49555664062498],[9.399316406250023,46.480664062499955],[9.427636718750023,46.48232421875002],[9.528710937500023,46.306201171875045],[9.57958984375,46.29609375000001],[9.639453125000017,46.29589843749997],[9.78779296875004,46.34604492187498],[9.884472656250011,46.36777343750006],[9.939257812500074,46.36181640625],[10.041015625000028,46.23808593750002],[10.08056640625,46.22797851562501],[10.128320312500051,46.238232421874955],[10.109667968750074,46.36284179687502],[10.081933593750023,46.420751953125006],[10.045605468750068,46.44790039062505],[10.038281250000011,46.483203125000045],[10.061230468750068,46.54677734375002],[10.087011718750063,46.59990234375002],[10.1375,46.614355468750034],[10.195507812500068,46.62109374999997],[10.4306640625,46.55004882812497],[10.409352678571473,46.6092047991071],[10.39794921875,46.66503906250006],[10.406054687500045,46.73486328124997],[10.452832031249983,46.86494140625001],[10.47939453125008,46.85512695312505],[10.579785156250011,46.85371093750001],[10.689257812500017,46.846386718749955],[10.759765625,46.79331054687498],[10.828906250000045,46.775244140625034],[10.927343750000034,46.76948242187501],[10.993261718750034,46.77700195312502],[11.02509765625004,46.796972656250006],[11.063476562500057,46.85913085937497],[11.133886718750006,46.93618164062505],[11.244433593750045,46.975683593750006],[11.433203125000063,46.983056640624994],[11.527539062500011,46.99741210937498],[11.775683593750017,46.986083984375],[12.169433593750028,47.082128906250006],[12.19716796875008,47.075],[12.201269531250034,47.060888671875034],[12.165527343750028,47.028173828125034],[12.130761718750051,46.98476562499999],[12.154101562500017,46.93525390625004],[12.267968750000023,46.83588867187504],[12.330078125,46.75981445312499],[12.388281250000034,46.70263671874997],[12.479199218749983,46.672509765624966],[13.16875,46.572656249999966],[13.3515625,46.55791015624999],[13.490039062500045,46.55556640625002],[13.7,46.52026367187503],[13.679687500000057,46.46289062499997],[13.63710937500008,46.44853515624999],[13.563281250000045,46.41508789062502],[13.399511718749977,46.31752929687502],[13.420996093750006,46.212304687499994]]]]},"properties":{"name":"Italy","childNum":6}},{"geometry":{"type":"Polygon","coordinates":[[[-77.261474609375,18.45742187499999],[-76.349853515625,18.15185546875],[-76.21079101562499,17.913525390624997],[-76.524609375,17.8662109375],[-76.85322265625,17.97373046874999],[-76.94414062499999,17.848779296874994],[-77.11948242187499,17.880078125],[-77.20498046875,17.71494140624999],[-77.36142578124999,17.833691406249997],[-77.76816406249999,17.877392578124997],[-78.04448242187499,18.173828125],[-78.339501953125,18.28720703124999],[-78.21669921875,18.44809570312499],[-77.8734375,18.522216796875],[-77.261474609375,18.45742187499999]]]},"properties":{"name":"Jamaica","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-2.018652343749977,49.23125],[-2.23583984375,49.1763671875],[-2.220507812499989,49.266357421875],[-2.018652343749977,49.23125]]]},"properties":{"name":"Jersey","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[39.14541015625002,32.12451171875],[38.9970703125,32.007470703124994],[38.96230468750002,31.994921875],[38.37548828125,31.847460937499996],[38.111425781250006,31.781152343749994],[37.49335937500001,31.625878906249994],[37.215625,31.556103515624997],[36.95859375,31.491503906249996],[37.980078125,30.5],[37.862890625,30.442626953125],[37.66972656250002,30.34814453125],[37.64990234375,30.330957031249994],[37.63359375000002,30.31328125],[37.55361328125002,30.144580078124996],[37.49072265625,30.01171875],[37.46923828125,29.995068359374997],[36.75527343750002,29.866015625],[36.70390625000002,29.831640625],[36.591796875,29.66611328125],[36.47607421875,29.4951171875],[36.2828125,29.355371093749994],[36.068457031250006,29.200537109375],[34.95078125,29.353515625],[34.97343750000002,29.555029296875],[35.45058593750002,31.479296875],[35.57207031250002,32.237890625],[35.55146484375001,32.3955078125],[35.56904296875001,32.619873046875],[35.572851562500006,32.640869140625],[35.78730468750001,32.734912109374996],[36.3720703125,32.3869140625],[36.818359375,32.317285156249994],[38.773535156250006,33.372216796874994],[39.04140625000002,32.3056640625],[39.24746093750002,32.350976562499994],[39.29277343750002,32.24384765625],[39.14541015625002,32.12451171875]]]},"properties":{"name":"Jordan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[123.88867187499997,24.280126953124977],[123.67978515625012,24.317773437500023],[123.77148437499997,24.41445312499999],[123.93486328125002,24.362011718749983],[123.88867187499997,24.280126953124977]]],[[[124.29316406250004,24.515917968750074],[124.13574218750003,24.347607421874983],[124.08476562500002,24.435839843750017],[124.30195312500004,24.58710937500001],[124.29316406250004,24.515917968750074]]],[[[125.44414062500002,24.7431640625],[125.26894531250005,24.732519531250063],[125.28359375,24.871923828125034],[125.44414062500002,24.7431640625]]],[[[128.25878906249997,26.65278320312501],[127.86708984375,26.442480468749977],[127.80361328125005,26.152539062499983],[127.653125,26.0947265625],[127.90722656250003,26.69360351562497],[128.09765624999997,26.66777343749996],[128.25488281249997,26.88188476562496],[128.25878906249997,26.65278320312501]]],[[[128.99814453125012,27.720800781250006],[128.90000000000012,27.727783203125],[128.9076171875,27.897998046875045],[128.99814453125012,27.720800781250006]]],[[[129.45253906250005,28.20898437499997],[129.3664062500001,28.127734375000045],[129.16464843750012,28.24975585937503],[129.68955078125012,28.517480468750023],[129.45253906250005,28.20898437499997]]],[[[130.6227539062501,30.262988281250017],[130.44560546875002,30.264697265625017],[130.38808593750005,30.38818359375003],[130.49716796875006,30.465527343749983],[130.64355468749997,30.388964843750017],[130.6227539062501,30.262988281250017]]],[[[130.95976562500007,30.39692382812504],[130.87031250000004,30.444238281249994],[131.06035156250007,30.828466796875006],[130.95976562500007,30.39692382812504]]],[[[130.38105468750004,32.42373046875002],[130.24169921874997,32.462792968749994],[130.46142578124997,32.515722656250034],[130.38105468750004,32.42373046875002]]],[[[130.08251953124997,32.22968750000001],[129.9601562500001,32.24375],[130.00976562499997,32.521630859374994],[130.16777343750002,32.54121093749998],[130.19951171875002,32.34057617187506],[130.08251953124997,32.22968750000001]]],[[[128.66533203125002,32.783886718749955],[128.89453124999997,32.65214843750002],[128.69296875000012,32.60473632812506],[128.66533203125002,32.783886718749955]]],[[[129.07695312500002,32.84028320312498],[128.99726562500004,32.95185546874998],[129.10976562500005,33.13256835937503],[129.18193359375002,32.99311523437504],[129.07695312500002,32.84028320312498]]],[[[129.49179687500006,33.22304687499999],[129.37041015625002,33.176025390625],[129.56992187500006,33.36103515625004],[129.49179687500006,33.22304687499999]]],[[[129.79570312500007,33.74882812499999],[129.67480468749997,33.73969726562498],[129.71728515624997,33.8583984375],[129.79570312500007,33.74882812499999]]],[[[131.17460937500007,33.602587890625045],[131.69628906250003,33.60283203124999],[131.53740234375007,33.274072265624994],[131.89658203125006,33.25458984375001],[131.8478515625001,33.118066406249994],[132.0021484375001,32.882373046875045],[131.6603515625001,32.465625],[131.33720703125007,31.4046875],[131.07080078124997,31.436865234374977],[131.09843750000002,31.256152343750017],[130.68574218750004,31.01513671875003],[130.77626953125,31.70629882812497],[130.65507812500002,31.71840820312505],[130.5560546875,31.563085937500034],[130.58876953125,31.178515625000017],[130.20068359374997,31.291894531250023],[130.14726562500002,31.40849609374996],[130.2941406250001,31.45068359375003],[130.3219726562501,31.601464843750023],[130.18789062500005,31.768847656250017],[130.19443359375012,32.090771484374955],[130.64052734375005,32.61923828124998],[130.49785156250002,32.65693359375001],[130.547265625,32.83159179687499],[130.2375,33.177636718749966],[130.12685546875005,33.10483398437506],[130.175,32.851318359375],[130.32646484375002,32.852636718750006],[130.34042968750012,32.70185546875004],[130.05410156250005,32.770800781250045],[129.76855468749997,32.57099609375001],[129.82675781250006,32.72534179687503],[129.67910156250005,33.059960937499966],[129.99169921875003,32.85156249999997],[129.58007812500003,33.23627929687501],[129.61015625000002,33.34365234375005],[129.844140625,33.32177734375003],[129.82568359374997,33.43701171875006],[130.36503906250007,33.634472656249955],[130.4837890625,33.834619140624966],[130.715625,33.92778320312502],[130.953125,33.87202148437504],[131.17460937500007,33.602587890625045]]],[[[132.266015625,33.945166015625006],[132.44492187500006,33.91318359374998],[132.20878906250007,33.87285156250002],[132.266015625,33.945166015625006]]],[[[129.27949218750004,34.123388671875006],[129.18642578125,34.14501953125006],[129.21484374999997,34.320654296875034],[129.3371093750001,34.284765625],[129.27949218750004,34.123388671875006]]],[[[134.35742187500003,34.25634765625],[134.6375,34.22661132812499],[134.73886718750012,33.82050781250001],[134.37705078125012,33.60839843749997],[134.18164062500003,33.24721679687502],[133.95869140625004,33.44833984375006],[133.63203125000004,33.51098632812503],[133.28593750000007,33.35996093749998],[132.97724609375004,32.84199218749998],[132.80429687500006,32.75200195312502],[132.6417968750001,32.76245117187503],[132.70898437500003,32.90249023437505],[132.49511718749997,32.91660156249998],[132.41279296875004,33.43046875],[132.0326171875,33.339990234374994],[132.64306640624997,33.68994140624997],[132.93515625000006,34.09531250000006],[133.19306640625004,33.93320312499998],[133.58203124999997,34.01713867187502],[133.60263671875006,34.24384765625001],[133.94833984375006,34.34804687500002],[134.35742187500003,34.25634765625]]],[[[134.35185546875002,34.48364257812503],[134.25185546875,34.42304687500004],[134.18212890625003,34.51923828124998],[134.35185546875002,34.48364257812503]]],[[[134.9328125000001,34.28813476562499],[134.82441406250004,34.202929687500045],[134.66787109375005,34.294140624999955],[135.00468750000002,34.54404296874998],[134.9328125000001,34.28813476562499]]],[[[129.38564453125,34.35366210937502],[129.26669921875012,34.37045898437506],[129.45107421875005,34.68657226562499],[129.38564453125,34.35366210937502]]],[[[133.37050781250005,36.203857421875],[133.23925781249997,36.178759765625045],[133.20615234375006,36.293408203124955],[133.29570312500002,36.34013671874996],[133.37050781250005,36.203857421875]]],[[[138.34404296875007,37.822119140625006],[138.22519531250006,37.82939453124996],[138.25,38.078466796875006],[138.50361328125004,38.31591796875006],[138.45361328124997,38.07568359375006],[138.57519531249997,38.065527343750034],[138.34404296875007,37.822119140625006]]],[[[141.22929687500007,41.37265625],[141.45546875000005,41.404736328124955],[141.43046875000002,40.72333984374998],[141.7970703125001,40.29116210937502],[141.97695312500005,39.428808593750034],[141.90078125,39.111328125],[141.5462890625,38.762841796874966],[141.4674804687501,38.404150390625006],[141.10839843750003,38.33793945312502],[140.9621093750001,38.148876953124955],[141.00166015625004,37.11464843750002],[140.57353515625007,36.23134765625002],[140.87402343749997,35.72495117187506],[140.457421875,35.51025390625],[140.35468750000004,35.18144531249999],[139.8439453125001,34.914892578125034],[139.82646484375002,35.29667968750002],[140.096875,35.58515624999998],[139.83476562500002,35.658056640625006],[139.65000000000012,35.40913085937501],[139.675,35.149267578125006],[139.47441406250002,35.298535156249955],[139.24941406250005,35.27802734375004],[139.08603515625006,34.83916015624999],[138.8375,34.619238281250034],[138.80273437499997,34.97480468749998],[138.90361328125002,35.02524414062506],[138.71962890625,35.12407226562502],[138.18906250000012,34.596337890624994],[137.543359375,34.66420898437505],[137.06171875000004,34.58281249999999],[137.27519531250002,34.77250976562499],[136.96328125000005,34.83491210937501],[136.87128906250004,34.733105468749955],[136.89707031250006,35.03554687500002],[136.80419921874997,35.05029296875],[136.53300781250007,34.678369140624994],[136.8802734375,34.43359375000006],[136.8537109375001,34.324072265625034],[136.32988281250007,34.17685546875006],[135.91621093750004,33.561718749999955],[135.69531250000003,33.48696289062502],[135.4528320312501,33.55336914062505],[135.12792968749997,34.006982421874994],[135.10009765624997,34.288378906250045],[135.41591796875,34.61748046875002],[134.74003906250007,34.765234375],[134.246875,34.71386718750003],[133.96826171874997,34.52729492187504],[133.14238281250002,34.30244140624998],[132.65654296875007,34.24609375000003],[132.31259765625006,34.32495117187503],[132.14648437499997,33.83876953125002],[131.74052734375007,34.05205078125002],[130.91884765625,33.97573242187502],[130.88925781250012,34.261816406250034],[131.00419921875007,34.39257812500003],[131.35439453125,34.41318359375006],[132.92294921875006,35.511279296875045],[133.98125,35.50722656250002],[135.17431640625003,35.74707031250003],[135.32695312500002,35.52553710937502],[135.68027343750006,35.503125],[135.903125,35.60688476562498],[136.09531250000006,35.767626953125045],[136.06748046875006,36.11684570312505],[136.69814453125005,36.742041015625034],[136.84345703125004,37.38212890624999],[137.32265625,37.52207031249998],[136.89990234375003,37.11767578125],[137.01669921875006,36.83720703124999],[137.24628906250004,36.753173828125],[137.5140625,36.95156250000002],[138.31992187500012,37.21840820312502],[138.88505859375007,37.84394531250001],[139.36386718750006,38.09902343750002],[139.80195312500004,38.881591796875],[140.06474609375002,39.624414062499994],[139.99472656250006,39.855078125],[139.74150390625002,39.92084960937498],[140.01113281250005,40.26035156250006],[139.92285156250003,40.59843750000002],[140.28125,40.84609375000002],[140.3444335937501,41.203320312499955],[140.62763671875004,41.195410156250034],[140.74863281250012,40.830322265625],[140.93603515625003,40.940771484375034],[141.1185546875,40.88227539062501],[141.24423828125006,41.20561523437499],[140.80058593750002,41.138818359374966],[140.80185546875012,41.253662109375],[140.9369140625,41.50556640624998],[141.22929687500007,41.37265625]]],[[[139.48125,42.08100585937498],[139.43134765625004,42.19956054687498],[139.55839843750002,42.235205078125034],[139.48125,42.08100585937498]]],[[[141.29541015625003,45.11933593750001],[141.14531250000002,45.153906250000034],[141.19375,45.24785156249999],[141.29541015625003,45.11933593750001]]],[[[141.07275390624997,45.33286132812498],[141.03398437500007,45.26933593750002],[140.97167968749997,45.465478515624994],[141.07275390624997,45.33286132812498]]],[[[143.82431640625012,44.11699218749999],[144.71523437500005,43.92797851562503],[145.36953125000005,44.32739257812506],[145.13964843750003,43.6625],[145.34082031249997,43.30253906249999],[145.83300781249997,43.38593750000001],[144.92138671874997,43.00092773437498],[143.96933593750006,42.88139648437499],[143.42949218750002,42.41889648437498],[143.2365234375001,42.000195312499955],[141.85136718750007,42.57905273437501],[141.40664062500005,42.54692382812496],[140.98613281250002,42.34213867187498],[140.70976562500002,42.555615234374955],[140.48046875000003,42.559375],[140.32666015625003,42.29335937499999],[141.15097656250012,41.80507812499999],[140.99951171874997,41.73740234375006],[140.65986328125004,41.815576171874994],[140.3849609375001,41.51928710937503],[140.08515625000004,41.43408203125],[139.99531250000004,41.57641601562503],[140.10839843749997,41.912939453125034],[139.83544921874997,42.278076171875],[139.86015625000002,42.58173828125004],[140.43222656250012,42.95410156250006],[140.39238281250002,43.303125],[141.13818359374997,43.17993164062506],[141.37412109375006,43.279638671875006],[141.7609375000001,44.482519531250034],[141.58300781250003,45.15595703125001],[141.66796874999997,45.401269531249966],[141.93769531250004,45.509521484375],[142.88476562499997,44.670117187499955],[143.82431640625012,44.11699218749999]]]]},"properties":{"name":"Japan","childNum":28}},{"geometry":{"type":"Polygon","coordinates":[[[77.04863281249999,35.109912109374996],[76.927734375,35.346630859375],[76.88222656250002,35.4357421875],[76.81279296874999,35.571826171874996],[76.76689453124999,35.66171875],[76.87890625,35.61328125],[77.09003906250001,35.552050781249996],[77.29482421875002,35.508154296875],[77.44648437500001,35.4755859375],[77.57255859374999,35.471826171874994],[77.72402343750002,35.48056640625],[77.79941406250003,35.495898437499996],[77.42343750000003,35.302587890625],[77.16855468750003,35.171533203124994],[77.04863281249999,35.109912109374996]]]},"properties":{"name":"Siachen Glacier","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[50.184472656249994,44.854638671874994],[49.99511718750003,44.93696289062498],[50.10986328124997,45.08193359375002],[50.038867187500074,44.949121093749966],[50.184472656249994,44.854638671874994]]],[[[87.32285156250012,49.085791015625006],[86.8083007812501,49.04970703125002],[86.54941406250012,48.52861328125002],[85.7494140625,48.38505859374999],[85.52597656250006,47.915625],[85.65664062500005,47.254638671875],[85.484765625,47.06352539062496],[84.78613281249997,46.83071289062505],[84.66660156250006,46.97236328125004],[84.016015625,46.97050781250002],[83.02949218750004,47.18593750000002],[82.31523437500002,45.59492187499998],[82.61162109375007,45.424267578124955],[82.52148437500003,45.12548828125],[82.26660156249997,45.21909179687498],[81.94492187500006,45.16083984375001],[81.69199218750012,45.34936523437497],[80.05917968750012,45.006445312500006],[79.871875,44.88378906249997],[80.48154296875006,44.71464843749999],[80.35527343750002,44.09726562500006],[80.78574218750006,43.16157226562504],[80.39023437500006,43.043115234374966],[80.53896484375005,42.873486328124955],[80.20224609375012,42.73447265624998],[80.209375,42.190039062500006],[80.07128906249997,42.302978515625],[79.92109375000004,42.41313476562496],[79.49013671875,42.45756835937496],[79.42822265624997,42.483496093750006],[79.20302734375005,42.66601562499997],[79.16484375000007,42.759033203125],[79.1266601562501,42.775732421875034],[76.98808593750007,42.97358398437501],[76.64648437500003,42.928808593750034],[76.50917968750005,42.91889648437498],[75.9322265625,42.92851562499999],[75.84033203125003,42.9375],[75.78955078124997,42.93291015624999],[75.68173828125,42.83046875],[75.04765625000007,42.904394531250034],[74.20908203125006,43.24038085937502],[73.88603515625002,43.132568359375],[73.55625,43.002783203125006],[73.45019531249997,42.703027343749966],[73.421875,42.59350585937503],[73.49296875000007,42.409033203125034],[73.41162109375003,42.41977539062498],[73.316015625,42.46699218750001],[73.2829101562501,42.50410156250004],[72.85507812500006,42.561132812500006],[72.75292968750003,42.63789062500001],[72.54316406250004,42.67773437500006],[72.27578125,42.757666015625006],[71.76054687500002,42.82148437500004],[71.5142578125,42.766943359375006],[71.42207031250004,42.78315429687504],[71.25664062500002,42.733544921874966],[70.89287109375007,42.339990234374994],[70.94677734374997,42.24868164062505],[69.15361328125002,41.42524414062498],[68.58408203125,40.876269531250045],[68.57265625,40.62265624999998],[68.29189453125,40.656103515625034],[68.04765625000007,40.80927734374998],[68.11308593750007,41.02861328124999],[67.9357421875001,41.19658203125002],[66.70966796875004,41.17915039062501],[66.49863281250006,41.99487304687503],[66.00957031250007,42.00488281250003],[66.1002929687501,42.99082031249998],[65.80302734375002,42.87695312500006],[65.49619140625,43.310546875],[64.9054687500001,43.714697265625006],[64.44316406250007,43.55117187499999],[63.20703125000003,43.62797851562502],[61.99023437500003,43.492138671874955],[61.007910156250006,44.39379882812497],[58.555273437500006,45.55537109375001],[55.97568359375006,44.99492187499996],[55.97744140625005,41.32221679687504],[55.434375,41.296289062499994],[54.85380859375002,41.965185546875006],[54.120996093749994,42.335205078125],[53.0558593750001,42.14775390624999],[52.4938476562501,41.780371093750034],[52.59658203125005,42.760156249999966],[51.898242187500074,42.86962890624997],[51.61601562500002,43.15844726562503],[51.29541015624997,43.17412109375002],[51.30175781249997,43.48237304687501],[50.8307617187501,44.192773437499966],[50.331152343750006,44.32548828125002],[50.25292968749997,44.461523437500006],[50.409472656250074,44.6240234375],[51.543554687500006,44.53100585937506],[51.009375,44.92182617187501],[51.4157226562501,45.35786132812501],[53.20039062500004,45.33198242187498],[52.77382812499999,45.57275390625],[53.13525390625003,46.19165039062497],[53.069433593750006,46.85605468750006],[52.48320312500002,46.99067382812504],[52.13828125,46.82861328124997],[51.178027343750074,47.110156250000045],[49.886328125,46.59565429687504],[49.347460937500074,46.51914062499998],[49.232226562500074,46.33715820312503],[48.54121093750004,46.60561523437502],[48.558398437500074,46.75712890624999],[48.959375,46.77460937499998],[48.16699218750003,47.70878906249996],[47.48193359374997,47.80390624999998],[47.292382812499994,47.74091796875004],[47.06464843750004,48.23247070312499],[46.660937500000074,48.41225585937502],[46.70263671875003,48.80556640625002],[47.031347656250006,49.150292968749994],[46.80205078125002,49.36708984375002],[46.889550781249994,49.69697265625001],[47.42919921874997,50.35795898437502],[47.7057617187501,50.37797851562502],[48.33496093750003,49.858251953125006],[48.7589843750001,49.92832031250006],[48.625097656250006,50.61269531250005],[49.32343750000004,50.851708984374966],[49.49804687500003,51.08359375000006],[50.246875,51.28950195312498],[50.79394531249997,51.729199218749955],[51.16347656250005,51.6474609375],[51.344531250000074,51.47534179687503],[52.21914062499999,51.709375],[52.57119140625005,51.481640624999955],[53.33808593750004,51.48237304687504],[54.139746093750006,51.04077148437503],[54.555273437500006,50.535791015624994],[54.64160156250003,51.011572265625034],[55.68623046875004,50.582861328125006],[56.49140625000004,51.01953124999997],[57.01171874999997,51.06518554687503],[57.44218750000002,50.88886718749998],[57.83886718750003,51.091650390625006],[58.359179687500074,51.063818359375034],[58.88369140625005,50.694433593750006],[59.4523437500001,50.62041015625002],[59.523046875,50.492871093749955],[59.812402343749994,50.58203125],[60.05859374999997,50.850292968749955],[60.42480468749997,50.67915039062498],[60.94228515625005,50.69550781250004],[61.38945312500002,50.86103515625001],[61.55468750000003,51.32460937500005],[60.464746093749994,51.651171875000045],[60.03027343749997,51.93325195312505],[60.99453125000005,52.33686523437504],[60.77441406249997,52.67578124999997],[61.047460937500006,52.97246093750002],[62.08271484375004,53.00541992187499],[61.65986328125004,53.22846679687504],[61.19921874999997,53.28715820312502],[61.22890625,53.445898437500006],[61.53496093750002,53.52329101562506],[60.97949218749997,53.62172851562505],[61.231054687500006,54.01948242187498],[61.92871093750003,53.94648437500004],[64.46123046875002,54.38417968750002],[65.08837890624997,54.340185546875034],[65.476953125,54.62329101562497],[68.15585937500006,54.97670898437505],[68.20625,55.16093750000002],[68.9772460937501,55.389599609374955],[70.18242187500002,55.162451171875034],[70.73808593750007,55.30517578125],[71.18554687500003,54.59931640624998],[71.09316406250005,54.21220703124999],[72.00449218750006,54.20566406249998],[72.18603515625003,54.32563476562501],[72.44677734375003,53.94184570312498],[72.62226562500004,54.13432617187502],[73.22988281250005,53.957812500000045],[73.71240234375003,54.04238281250002],[73.30566406250003,53.707226562499955],[73.40693359375004,53.44755859374999],[73.85898437500006,53.61972656249998],[74.35156250000003,53.487646484375006],[74.45195312500007,53.64726562500002],[75.22021484374997,53.89379882812506],[75.43720703125004,54.08964843749999],[76.8373046875,54.4423828125],[76.65458984375007,54.14526367187503],[76.42167968750007,54.151513671874966],[76.48476562500005,54.02255859374998],[77.85996093750006,53.269189453124994],[79.98623046875,50.774560546874966],[80.42363281250002,50.94628906249997],[80.44804687500002,51.18334960937503],[80.73525390625,51.29340820312498],[81.12724609375002,51.19106445312502],[81.0714843750001,50.96875],[81.38828125000006,50.95649414062501],[81.46591796875006,50.73984375],[82.49394531250007,50.72758789062499],[82.76083984375012,50.89335937500002],[83.35732421875005,50.99458007812504],[83.94511718750007,50.774658203125],[84.32324218749997,50.239160156249966],[84.9894531250001,50.061425781249994],[85.2326171875001,49.61582031249998],[86.1808593750001,49.49931640624996],[86.67548828125004,49.77729492187501],[86.62646484374997,49.56269531250001],[87.32285156250012,49.085791015625006]]]]},"properties":{"name":"Kazakhstan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[35.325292968750006,5.364892578124994],[35.745019531249994,5.343994140625],[35.80029296874997,5.156933593749983],[35.77929687499997,5.105566406250006],[35.756152343750074,4.950488281250031],[35.76308593750005,4.808007812500051],[36.02197265625003,4.468115234374991],[36.90556640625002,4.411474609374991],[37.15458984375002,4.254541015624994],[37.944921875,3.746728515625023],[38.0861328125001,3.648828124999966],[38.22529296875004,3.61899414062502],[38.45156250000005,3.604833984374977],[38.608007812500006,3.600097656249986],[39.49443359375002,3.45610351562496],[39.65751953125002,3.577832031249983],[39.79033203125002,3.754248046875034],[39.8421875,3.851464843750037],[40.765234375,4.273046875000034],[41.02080078125002,4.057470703124991],[41.22089843750004,3.943554687499969],[41.372460937499994,3.94619140624998],[41.48193359375003,3.96328125],[41.737695312499994,3.979052734375003],[41.88398437500004,3.977734375000011],[41.6134765625001,3.59047851562498],[41.34179687499997,3.20166015625],[40.964453125,2.814648437500026],[40.9787109375001,-0.870312500000011],[41.249804687500074,-1.220507812499946],[41.4269531250001,-1.449511718749974],[41.521875,-1.572265625000028],[41.53271484374997,-1.695312499999957],[41.26748046875005,-1.945019531250026],[40.889746093750006,-2.023535156250034],[40.89824218750002,-2.269921874999966],[40.64414062500006,-2.53945312499998],[40.22246093750002,-2.688378906250037],[40.1154296875001,-3.250585937499991],[39.8609375,-3.576757812500006],[39.49091796875004,-4.478417968750023],[39.221777343750006,-4.692382812500014],[37.608203125000074,-3.497070312500028],[37.643847656250074,-3.045410156250028],[33.90322265625005,-1.002050781250034],[33.94316406250002,0.173779296874969],[34.160937500000074,0.605175781250026],[34.4108398437501,0.867285156250034],[34.48173828125002,1.042138671875051],[34.79863281250002,1.24453125],[34.976464843749994,1.719628906250051],[34.97753906249997,1.861914062499991],[34.9640625000001,2.06240234374998],[34.8830078125001,2.417919921875026],[34.90576171875003,2.4796875],[34.44785156250006,3.163476562500037],[34.40722656249997,3.357519531250034],[34.39941406249997,3.412695312500006],[34.44179687499999,3.60625],[34.43769531250004,3.650585937499969],[34.392871093750074,3.691503906250048],[34.26708984375003,3.733154296875],[34.16503906250003,3.812988281250014],[34.18574218750004,3.869775390625037],[34.13203125000004,3.889160156249986],[33.97607421874997,4.220214843750028],[34.176855468750006,4.419091796875037],[34.38017578125002,4.620654296874974],[34.6398437500001,4.875488281250028],[34.878320312499994,5.109570312500026],[35.08447265624997,5.31186523437502],[35.268359375000074,5.492285156250006],[35.325292968750006,5.364892578124994]]]},"properties":{"name":"Kenya","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[72.63994140625002,39.385986328125],[72.22998046875,39.20751953125],[72.14736328125002,39.2607421875],[72.08417968750001,39.31064453125],[72.04277343750002,39.3521484375],[71.77861328125002,39.277978515624994],[71.73222656250002,39.422998046874994],[71.50332031250002,39.478808593749996],[71.51738281250002,39.553857421874994],[71.50302734375,39.582177734374994],[71.4703125,39.603662109374994],[70.79931640625,39.3947265625],[70.50117187500001,39.587353515625],[69.29765625000002,39.524804687499994],[69.2447265625,39.827099609375],[69.27880859375,39.917773437499996],[69.3072265625,39.968554687499996],[69.36542968750001,39.947070312499996],[69.43193359375002,39.909765625],[69.47626953125001,39.919726562499996],[69.47099609375002,39.990625],[69.46875,40.020751953125],[69.966796875,40.20224609375],[70.59921875,39.974511718749994],[70.990625,40.2548828125],[71.3046875,40.286914062499996],[71.69248046875,40.15234375],[72.13125,40.438623046874994],[72.3892578125,40.427392578124994],[72.40205078125001,40.578076171875],[72.6041015625,40.525439453124996],[73.13212890625002,40.82851562499999],[72.65830078125,40.869921875],[72.36406250000002,41.04345703125],[72.294921875,41.039941406249994],[72.21308593750001,41.0142578125],[72.18730468750002,41.025927734374996],[72.18095703125002,41.118457031249996],[72.16425781250001,41.173730468749994],[72.11542968750001,41.186572265624996],[72.05244140625001,41.16474609375],[71.95849609375,41.187060546874996],[71.87861328125001,41.19501953125],[71.8580078125,41.311376953125],[71.79248046875,41.413134765624996],[71.75771484375002,41.428027343749996],[71.70068359375,41.454003906249994],[71.66494140625002,41.5412109375],[71.6375,41.5341796875],[71.60224609375001,41.503271484375],[71.60625,41.367431640625],[71.54560546875001,41.308056640625],[71.5,41.307470703125],[71.4208984375,41.34189453125],[71.40839843750001,41.136035156249996],[71.39306640625,41.123388671875],[71.11074218750002,41.152636718749996],[70.86044921875,41.224902343749996],[70.734375,41.400537109374994],[70.18095703125002,41.571435546874994],[70.85664062500001,42.030810546874996],[71.0322265625,42.077783203124994],[71.228515625,42.162890625],[71.23232421875002,42.186279296875],[71.21269531250002,42.206445312499994],[71.12998046875,42.25],[71.03603515625002,42.28466796875],[70.97900390625,42.266552734375],[70.94677734375,42.248681640624994],[70.89287109375002,42.339990234374994],[71.25664062500002,42.733544921874994],[71.42207031250001,42.783154296875],[71.5142578125,42.766943359375],[71.76054687500002,42.821484375],[72.16181640625001,42.760693359375],[72.27578125000002,42.757666015625],[72.54316406250001,42.677734375],[72.7529296875,42.637890625],[72.855078125,42.5611328125],[73.28291015625001,42.5041015625],[73.316015625,42.4669921875],[73.41162109375,42.419775390625],[73.49296875000002,42.409033203125],[73.421875,42.593505859375],[73.4501953125,42.703027343749994],[73.55625,43.002783203125],[73.88603515625002,43.132568359375],[74.20908203125,43.240380859374994],[75.04765625000002,42.90439453125],[75.68173828125,42.83046875],[75.78955078125,42.932910156249996],[75.84033203125,42.9375],[75.9322265625,42.928515625],[76.50917968750002,42.918896484375],[76.646484375,42.92880859375],[76.98808593749999,42.973583984375],[79.12666015625001,42.775732421875],[79.20302734375002,42.666015625],[79.29550781250003,42.604833984375],[79.36777343750003,42.547216796875],[79.42822265625,42.48349609375],[79.92109375000001,42.413134765624996],[80.0712890625,42.302978515625],[80.209375,42.1900390625],[80.24619140625003,42.059814453125],[80.23515624999999,42.04345703125],[80.21621093750002,42.032421875],[79.90966796875,42.014990234375],[79.84042968750003,41.995751953124994],[79.76611328125,41.898876953125],[78.74257812500002,41.56005859375],[78.54316406250001,41.4595703125],[78.44287109375,41.417529296874996],[78.36240234375003,41.371630859374996],[78.34628906250003,41.2814453125],[78.12343750000002,41.075634765625],[77.95644531250002,41.050683593749994],[77.81523437499999,41.055615234375],[77.71933593750003,41.024316406249994],[77.58173828125001,40.9927734375],[76.98662109374999,41.03916015625],[76.90771484375,41.024169921875],[76.82402343749999,40.982324218749994],[76.70839843750002,40.818115234375],[76.6611328125,40.779638671875],[76.63984375000001,40.742236328124996],[76.62216796875003,40.662353515625],[76.57792968749999,40.577880859375],[76.48017578125001,40.449511718749996],[76.39638671875002,40.389794921874994],[76.31855468750001,40.35224609375],[76.25830078125,40.43076171875],[75.87197265625002,40.30322265625],[75.67714843750002,40.305810546874994],[75.55556640625002,40.6251953125],[75.52080078125002,40.6275390625],[75.24101562500002,40.480273437499996],[75.111328125,40.4541015625],[75.0044921875,40.449511718749996],[74.865625,40.493505859375],[74.80126953125,40.428515625],[74.83046875000002,40.32851562499999],[74.41191406250002,40.13720703125],[74.24267578125,40.092041015625],[74.08515625000001,40.07431640625],[73.99160156250002,40.043115234374994],[73.93876953125002,39.978808593749996],[73.88457031250002,39.8779296875],[73.85625,39.828662109374996],[73.83535156250002,39.800146484375],[73.83974609375002,39.762841796874994],[73.88251953125001,39.71455078125],[73.9146484375,39.606494140624996],[73.90712890625002,39.57851562499999],[73.87275390625001,39.53330078125],[73.82294921875001,39.48896484375],[73.71572265625002,39.462255859375],[73.63164062500002,39.448876953124994],[73.47041015625001,39.460595703124994],[73.38740234375001,39.442724609375],[73.33613281250001,39.412353515625],[73.2349609375,39.374560546874996],[73.10927734375002,39.3619140625],[72.63994140625002,39.385986328125]],[[70.66416015625,39.85546875],[70.56708984375001,39.866601562499994],[70.49775390625001,39.882421875],[70.48281250000002,39.882714843749994],[70.4892578125,39.863037109375],[70.5595703125,39.790917968749994],[70.61210937500002,39.786767578124994],[70.70166015625,39.82529296875],[70.66416015625,39.85546875]],[[71.20615234375,39.892578125],[71.22871093750001,40.048144531249996],[71.08037109375002,40.079882812499996],[71.02412109375001,40.149169921875],[71.00546875,40.152294921875],[70.96064453125001,40.08798828125],[71.04482421875002,39.992529296875],[71.04365234375001,39.976318359375],[71.01171875,39.8951171875],[71.06425781250002,39.884912109374994],[71.15625,39.883447265624994],[71.20615234375,39.892578125]]]},"properties":{"name":"Kyrgyzstan","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[104.42636718750006,10.411230468749991],[103.87050781250005,10.655126953125034],[103.58710937500004,10.552197265625026],[103.54042968750005,10.668701171875043],[103.721875,10.890136718750043],[103.5324218750001,11.146679687499997],[103.35361328125006,10.921582031250054],[103.15283203124997,10.913720703125051],[103.12548828124997,11.460644531250011],[102.9486328125,11.773486328124974],[102.93388671875002,11.706689453125037],[102.73662109375007,12.089794921875011],[102.75566406250002,12.42626953125],[102.49960937500012,12.669970703125003],[102.33632812500005,13.560302734375014],[102.546875,13.585693359375043],[102.90927734375006,14.136718750000028],[103.19941406250004,14.332617187499977],[104.77900390625004,14.427832031250006],[105.07412109375005,14.227441406250037],[105.12597656250003,14.280957031250011],[105.16914062500004,14.336083984374966],[105.1833007812501,14.346240234374989],[105.18554687500003,14.319091796874972],[105.20703125000003,14.259375],[105.24570312500006,14.200537109374977],[105.35019531250006,14.109570312500011],[105.53154296875007,14.156152343749994],[105.73974609375003,14.084960937500057],[105.83144531250005,13.976611328125003],[105.9044921875001,13.924511718750054],[106.06679687500005,13.921191406250003],[106.12470703125004,14.049121093750031],[106.09667968749997,14.127099609375023],[106.00410156250004,14.262890624999983],[105.97890625,14.343017578125043],[106.00839843750012,14.357177734375],[106.1652343750001,14.372363281249989],[106.19072265625007,14.388134765624997],[106.22539062500002,14.476220703125009],[106.26796875,14.466210937500009],[106.35498046875003,14.454785156249997],[106.44697265625004,14.515039062500009],[106.50146484375003,14.578222656250006],[106.53115234375005,14.549414062499991],[106.5636718750001,14.505078125000026],[106.59921875000006,14.479394531250037],[106.66542968750005,14.441308593749994],[106.73818359375005,14.387744140625017],[106.78349609375002,14.335107421875037],[106.81992187500006,14.314697265625057],[106.91318359375006,14.329394531250031],[106.93808593750006,14.327343750000054],[106.99218750000003,14.391015624999966],[107.03017578125,14.425683593750009],[107.06240234375,14.415771484375043],[107.109375,14.416699218750054],[107.29267578125004,14.592382812500048],[107.37988281250003,14.555322265625051],[107.41474609375004,14.56289062499999],[107.51943359375005,14.705078125],[107.3314453125,14.126611328125009],[107.60546874999997,13.437792968750017],[107.47539062500002,13.030371093749963],[107.50644531250006,12.364550781250031],[107.39335937500002,12.260498046874972],[107.21210937500004,12.30400390624996],[106.70009765625,11.979296874999974],[106.41386718750002,11.9484375],[106.39921875000007,11.687011718750028],[106.0060546875001,11.758007812500011],[105.85146484375005,11.635009765625],[105.85605468750006,11.294287109375048],[106.16093750000002,11.037109375000057],[106.16396484375005,10.794921875],[105.85332031250007,10.86357421874996],[105.75507812500004,10.989990234375043],[105.40576171875003,10.95161132812504],[105.3146484375001,10.845166015625026],[105.04570312500002,10.911376953125014],[105.04638671874997,10.701660156250014],[104.85058593749997,10.534472656249974],[104.42636718750006,10.411230468749991]]]},"properties":{"name":"Cambodia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-157.34213867187503,1.855566406250034],[-157.17578125,1.73984375],[-157.57895507812498,1.902050781249997],[-157.43583984374993,1.84726562500002],[-157.365185546875,1.94609375],[-157.44189453125003,2.025048828125009],[-157.321875,1.968554687500045],[-157.34213867187503,1.855566406250034]]],[[[-159.3390625,3.923535156249983],[-159.27475585937503,3.796582031250054],[-159.40903320312503,3.87324218750004],[-159.3390625,3.923535156249983]]]]},"properties":{"name":"Kiribati","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[126.32695312500002,33.2236328125],[126.16562500000012,33.31201171875],[126.33769531250002,33.46040039062501],[126.90117187500002,33.51513671874997],[126.87285156250002,33.34116210937498],[126.32695312500002,33.2236328125]]],[[[126.23369140625002,34.370507812499994],[126.12285156250002,34.443945312500034],[126.34384765625012,34.544921875],[126.23369140625002,34.370507812499994]]],[[[126.17197265625006,34.73115234375001],[126.00751953125004,34.86748046874999],[126.07841796875002,34.914843750000045],[126.17197265625006,34.73115234375001]]],[[[128.0658203125,34.80585937500004],[128.05468750000003,34.70805664062502],[127.87343750000005,34.73496093749998],[127.8322265625001,34.87451171875],[128.0658203125,34.80585937500004]]],[[[128.74101562500007,34.798535156249955],[128.64667968750004,34.73686523437502],[128.48925781250003,34.86528320312496],[128.66796875000003,35.0087890625],[128.74101562500007,34.798535156249955]]],[[[126.52070312500004,37.73681640625003],[126.516015625,37.60468750000001],[126.42333984375003,37.62363281250006],[126.41162109374997,37.82265625000002],[126.52070312500004,37.73681640625003]]],[[[128.37460937500012,38.6234375],[129.41826171875002,37.059033203124955],[129.40351562500004,36.052148437499994],[129.57285156250006,36.05053710937503],[129.4191406250001,35.49785156249996],[129.07675781250006,35.12270507812502],[128.5109375000001,35.10097656250002],[128.44394531250012,34.87036132812503],[128.03623046875006,35.02197265625],[127.71484374999997,34.95468749999998],[127.71542968750012,34.72104492187498],[127.40429687499997,34.823095703125006],[127.47910156250012,34.625244140625],[127.324609375,34.463281249999966],[127.17343750000006,34.54614257812497],[127.24707031249997,34.755126953125],[126.89746093749997,34.438867187499966],[126.75478515625005,34.511865234374994],[126.53144531250004,34.31425781249999],[126.26445312500002,34.67324218750002],[126.52451171875006,34.697900390624966],[126.59335937500012,34.824365234374994],[126.42070312500002,34.823388671874966],[126.29111328125012,35.154150390625034],[126.61406250000007,35.57099609375004],[126.4884765625001,35.647070312500006],[126.75302734375006,35.871972656249994],[126.5404296875,36.166162109374966],[126.4876953125,36.69379882812498],[126.18085937500004,36.69160156249998],[126.16054687500005,36.77192382812501],[126.48701171875004,37.00747070312502],[126.78447265625007,36.94843749999998],[126.87207031249997,36.82446289062506],[126.97685546875002,36.93940429687501],[126.74638671875002,37.19355468750001],[126.63388671875012,37.78183593750006],[127.09033203125003,38.28388671875001],[128.03896484375,38.30854492187498],[128.37460937500012,38.6234375]]]]},"properties":{"name":"Korea","childNum":7}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[48.27539062499997,29.624316406250017],[48.17968750000003,29.611425781250063],[48.081445312499994,29.798925781250063],[48.1847656250001,29.978857421875034],[48.348242187500006,29.78266601562504],[48.27539062499997,29.624316406250017]]],[[[48.442480468750006,28.542919921874983],[47.671289062499994,28.53315429687504],[47.433203125,28.989550781250017],[46.53144531250004,29.09624023437499],[46.69375,29.259667968749966],[46.76933593750002,29.347460937500017],[46.90585937500006,29.5375],[47.14824218750002,30.0009765625],[47.64375,30.097314453125023],[47.75390624999997,30.076611328124955],[47.97871093750004,29.98281250000005],[48.00566406250002,29.835791015625034],[48.143457031249994,29.57246093750001],[47.96962890625005,29.61669921874997],[47.72265624999997,29.393017578124955],[48.0514648437501,29.355371093750023],[48.442480468750006,28.542919921874983]]]]},"properties":{"name":"Kuwait","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[102.12744140625011,22.37919921874999],[102.58251953125006,21.904296875000057],[102.66201171875008,21.676025390625057],[102.73857421875005,21.677929687500125],[102.77109375000015,21.70966796875001],[102.79824218750014,21.797949218750034],[102.81591796875,21.807373046875],[102.94960937500008,21.681347656250068],[102.85117187500009,21.26591796874999],[102.8837890625,21.202587890625068],[103.1044921875,20.89165039062499],[103.21074218749999,20.840625],[103.46357421874995,20.779833984375102],[103.6350585937501,20.697070312500102],[104.10136718750005,20.945507812500125],[104.1953125,20.91396484375008],[104.349609375,20.82109374999999],[104.58320312500001,20.646679687499955],[104.53271484375,20.554882812500125],[104.47861328124998,20.529589843750102],[104.40781250000015,20.485742187500023],[104.36777343750015,20.441406250000057],[104.39218750000015,20.424755859375068],[104.49619140625003,20.41367187499992],[104.61884765624995,20.374511718750114],[104.65644531250001,20.328515624999966],[104.66191406250005,20.289013671875125],[104.67695312500007,20.224707031249977],[104.69873046875006,20.205322265625114],[104.84785156250007,20.202441406250045],[104.88867187500006,20.169091796875023],[104.92919921874994,20.082812500000045],[104.92792968750007,20.01811523437499],[104.81513671875001,19.90400390625001],[104.80175781250011,19.836132812500068],[104.74316406250006,19.754736328124977],[104.58789062500006,19.61875],[104.54628906250014,19.610546875000068],[104.25986328125003,19.685498046875068],[104.06279296875005,19.678417968750068],[104.03203124999999,19.67514648437492],[104.0134765625001,19.646484374999943],[104.05156250000005,19.564160156250068],[104.06289062500002,19.482568359375136],[104.02753906250013,19.420458984375102],[103.93203125000002,19.366064453125034],[103.89638671875002,19.339990234375023],[103.89160156249994,19.30498046874999],[105.146484375,18.650976562499977],[105.14541015625014,18.616796874999977],[105.08701171875015,18.49624023437508],[105.11455078125005,18.405273437500057],[105.45820312500007,18.154296875000057],[105.51855468750011,18.077441406250045],[105.58847656250015,17.983691406249932],[105.69140625,17.737841796874932],[106.00625,17.415283203124943],[106.26953125,17.216796875000057],[106.33339843750002,17.14370117187508],[106.42597656250007,17.00253906250009],[106.50224609374999,16.9541015625],[106.52597656250003,16.876611328125023],[106.53369140625,16.821044921875057],[106.54619140625005,16.650732421874977],[106.65644531250013,16.492626953125125],[106.73955078124999,16.452539062500136],[106.79160156250015,16.490332031249977],[106.83242187500008,16.526269531250023],[106.85107421875,16.515625],[106.89277343750013,16.396533203125102],[106.93066406250006,16.353125],[107.39638671875008,16.04301757812499],[107.39199218750008,15.951660156250057],[107.36064453125005,15.921728515624977],[107.18886718750008,15.838623046875114],[107.16591796875002,15.802490234375],[107.27939453125003,15.618701171875045],[107.33876953125002,15.560498046875125],[107.56425781249999,15.3916015625],[107.62167968750015,15.309863281250045],[107.653125,15.255224609375091],[107.63369140625008,15.18984375000008],[107.58964843749999,15.118457031250102],[107.55527343750009,15.057031250000023],[107.48037109375014,14.979882812500136],[107.5046875000001,14.91591796875008],[107.52451171875003,14.871826171874943],[107.51376953124998,14.817382812500057],[107.51943359375008,14.705078125000114],[107.46513671875005,14.664990234375125],[107.41474609375007,14.56289062500008],[107.37988281250006,14.555322265625136],[107.29267578125007,14.592382812500034],[107.109375,14.416699218749955],[107.06240234375008,14.415771484374943],[107.03017578125008,14.425683593750023],[106.99218749999994,14.39101562500008],[106.93808593750015,14.327343750000068],[106.91318359375003,14.329394531249932],[106.81992187500003,14.314697265624943],[106.7834960937501,14.335107421875023],[106.73818359375008,14.387744140625102],[106.66542968750002,14.441308593750023],[106.59921875000003,14.479394531250136],[106.56367187500007,14.505078125000011],[106.53115234375002,14.549414062499977],[106.50146484375,14.578222656250034],[106.22539062500005,14.476220703125023],[106.1907226562501,14.388134765625011],[106.16523437500007,14.372363281249989],[106.00839843750009,14.357177734375114],[105.97890625000014,14.343017578125057],[106.00410156250013,14.262890625000068],[106.09667968750011,14.127099609375136],[106.12470703124995,14.049121093750045],[106.06679687500008,13.921191406250102],[105.90449218750007,13.924511718750068],[105.83144531250008,13.976611328124989],[105.73974609375006,14.084960937500057],[105.5315429687501,14.156152343750023],[105.35019531250009,14.109570312500125],[105.24570312500015,14.200537109374977],[105.20703125000006,14.259375],[105.18554687499994,14.319091796875],[105.18330078125001,14.346240234374989],[105.24365234375006,14.367871093749955],[105.34218750000008,14.416699218749955],[105.42265624999993,14.471630859374955],[105.47558593750006,14.530126953124977],[105.49736328125005,14.590673828125034],[105.52304687500015,14.843310546874989],[105.54667968749999,14.932470703125034],[105.53339843750013,15.041601562500091],[105.49042968750007,15.127587890625023],[105.49042968750007,15.256591796875],[105.615625,15.488281249999943],[105.63886718750013,15.585937499999943],[105.64101562500002,15.656542968749932],[105.62207031250006,15.699951171875114],[105.39892578125011,15.829882812500102],[105.40625,15.987451171875023],[105.33066406250003,16.037890625000045],[105.1487304687501,16.09355468749999],[105.04716796874999,16.16025390625009],[104.81933593749994,16.466064453125057],[104.75058593750015,16.647558593750034],[104.74355468750014,16.884375],[104.75898437500013,17.0771484375],[104.81601562499998,17.30029296875],[104.73964843750008,17.461669921875],[104.428125,17.698974609375057],[104.32265625000002,17.815820312500023],[104.19619140625002,17.988378906250034],[104.04873046875002,18.216699218749966],[103.94960937500008,18.318994140625023],[103.89882812500002,18.295312500000023],[103.79228515624999,18.31650390625009],[103.62968750000005,18.382568359375057],[103.48798828124995,18.41816406250001],[103.36699218750005,18.42333984375],[103.28828124999995,18.408398437499955],[103.25175781249999,18.373486328125125],[103.24892578125014,18.338964843750034],[103.27958984374999,18.304980468750045],[103.26318359375,18.278466796875136],[103.19970703125006,18.25947265625001],[103.14853515625009,18.221728515624932],[103.09121093750014,18.13823242187499],[103.05136718750003,18.02851562500001],[102.80742187500005,17.945556640625],[102.71757812500005,17.892236328125136],[102.67519531250014,17.851757812500068],[102.68007812500008,17.824121093750136],[102.66064453125,17.8179687499999],[102.61679687500015,17.833349609375034],[102.59824218750009,17.926757812500057],[102.55253906249999,17.965087890625057],[102.4587890625001,17.984619140624943],[102.35185546874999,18.045947265625045],[102.14824218750005,18.203857421875057],[102.10146484375014,18.21064453125001],[102.03457031250002,18.169824218750023],[101.94746093750001,18.081494140624955],[101.87548828125011,18.046435546874932],[101.81865234375005,18.064648437500125],[101.77480468750002,18.033398437500125],[101.6875,17.889404296875114],[101.56367187500001,17.820507812500125],[101.55507812500002,17.812353515625034],[101.41367187500015,17.71875],[101.16748046875011,17.4990234375],[101.10517578125001,17.479541015625102],[100.9084960937501,17.583886718750023],[101.14394531250008,18.14262695312499],[101.1375,18.286865234375057],[101.0505859375001,18.407031250000045],[101.04697265625003,18.441992187500034],[101.28632812499995,18.977148437500034],[101.19755859374999,19.327929687500045],[101.22080078125015,19.486621093750045],[101.21191406250011,19.548339843750057],[100.51357421875008,19.553466796875],[100.39765625000013,19.756103515625057],[100.51953125000006,20.177929687500068],[100.31796875000003,20.385888671875136],[100.2180664062501,20.339599609375114],[100.13974609375015,20.245410156250102],[100.11494140625007,20.25766601562492],[100.12246093750002,20.316650390625057],[100.12968750000005,20.372216796875023],[100.1838867187501,20.589111328124943],[100.2493164062501,20.730273437499932],[100.32607421875008,20.795703124999932],[100.40742187499995,20.823242187500057],[100.56513671875013,20.82509765625008],[100.62294921875002,20.85957031250001],[100.61767578125,20.87924804687509],[100.54931640625011,20.884228515625068],[100.5222656250001,20.921923828125102],[100.53613281250006,20.992382812500068],[100.703125,21.25136718750008],[101.0803710937501,21.46865234375008],[101.13886718750013,21.567480468749977],[101.19667968750002,21.522070312499977],[101.17539062500009,21.407519531250102],[101.21992187500013,21.342431640625136],[101.21181640625008,21.278222656250023],[101.22441406249999,21.22373046874992],[101.24785156249993,21.197314453125045],[101.28144531250007,21.184130859375045],[101.44355468750001,21.230810546874977],[101.54238281250008,21.234277343750136],[101.70478515625013,21.150146484375057],[101.728125,21.15639648437508],[101.78349609374999,21.204150390625045],[101.8005859375001,21.212597656249955],[101.7229492187501,21.314941406250057],[101.74726562500007,21.60576171874999],[101.7439453125001,21.77797851562508],[101.73652343750001,21.826513671874977],[101.52451171874998,22.253662109375],[101.56787109375011,22.2763671875],[101.6199218750001,22.327441406250102],[101.67148437500009,22.462304687500023],[101.70751953125,22.486572265625],[101.73876953125011,22.495263671874966],[101.75996093750001,22.490332031250034],[101.841796875,22.388476562500102],[102.02441406250006,22.439208984375114],[102.09150390625007,22.412255859375136],[102.12744140625011,22.37919921874999]]]},"properties":{"name":"Lao PDR","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[35.869140625,33.43173828125],[35.411230468750006,33.07568359375],[35.10859375000001,33.08369140625],[35.64785156250002,34.2482421875],[35.97626953125001,34.629199218749996],[36.383886718750006,34.65791015625],[36.32988281250002,34.499609375],[36.50439453125,34.432373046875],[36.5849609375,34.221240234374996],[36.27783203125,33.92529296875],[36.36503906250002,33.83935546875],[35.98613281250002,33.75263671875],[36.03447265625002,33.58505859375],[35.869140625,33.43173828125]]]},"properties":{"name":"Lebanon","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-8.486425781249977,7.558496093749994],[-8.408740234374989,7.411816406249997],[-8.324511718749989,6.920019531249991],[-8.587890625,6.490527343749989],[-8.287109375,6.319042968749997],[-7.981591796874994,6.2861328125],[-7.888623046874983,6.23486328125],[-7.800927734374994,6.038916015624991],[-7.730371093749994,5.919042968749991],[-7.636132812499994,5.90771484375],[-7.454394531249989,5.84130859375],[-7.39990234375,5.550585937499989],[-7.585058593749977,4.916748046875],[-7.574658203124983,4.572314453124989],[-7.544970703124989,4.351318359375],[-8.259033203125,4.589990234374994],[-9.132177734374977,5.054638671874997],[-10.2763671875,6.07763671875],[-11.291601562499977,6.688232421875],[-11.507519531249983,6.906542968749989],[-11.267675781249977,7.232617187499997],[-10.878076171874994,7.538232421874994],[-10.6474609375,7.759375],[-10.570849609374989,8.071142578124991],[-10.516748046874994,8.125292968749989],[-10.359814453124983,8.187939453124997],[-10.283203125,8.485156249999989],[-10.233056640624994,8.488818359374989],[-10.147412109374983,8.519726562499997],[-10.064355468749994,8.429882812499997],[-9.781982421875,8.537695312499991],[-9.518261718749983,8.34609375],[-9.369140625,7.703808593749997],[-9.463818359374983,7.415869140624991],[-9.11757812499999,7.215917968749991],[-8.8896484375,7.2626953125],[-8.659765624999977,7.688378906249994],[-8.486425781249977,7.558496093749994]]]},"properties":{"name":"Liberia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[25.150488281250006,31.654980468749997],[24.85273437500001,31.334814453125],[24.96142578125,30.678515625],[24.703222656250006,30.201074218749994],[24.980273437500017,29.181884765625],[24.980273437500017,25.5888671875],[24.980273437500017,21.995849609375],[24.9794921875,20.002587890624994],[23.980273437500017,19.99594726562499],[23.980273437500017,19.496630859375003],[20.14765625000001,21.38925781249999],[15.984082031250011,23.445214843749994],[14.97900390625,22.99619140624999],[14.215527343750011,22.619677734375003],[13.48125,23.18017578125],[11.967871093750006,23.517871093750003],[11.507617187500017,24.314355468749994],[10.686132812500006,24.55136718749999],[10.395898437500023,24.485595703125],[10.255859375,24.591015625],[10.000683593750011,25.332080078125003],[9.4482421875,26.067138671875],[9.491406250000011,26.333740234375],[9.883203125000023,26.630810546874997],[9.74755859375,27.330859375],[9.916015625,27.785693359374996],[9.805273437500006,29.176953125],[9.310253906250011,30.115234375],[9.51875,30.229394531249994],[9.89501953125,30.3873046875],[9.932519531250023,30.425341796874996],[10.059765625000011,30.580078125],[10.21640625,30.783203125],[10.114941406250011,31.463769531249994],[10.274609375000011,31.684960937499994],[10.475781250000011,31.736035156249997],[10.60888671875,31.929541015625],[10.826367187500011,32.0806640625],[11.005175781250017,32.172705078125],[11.168261718750017,32.256738281249994],[11.358007812500006,32.34521484375],[11.504980468750006,32.413671875],[11.535937500000017,32.47333984375],[11.533789062500006,32.524951171874996],[11.453906250000017,32.642578125],[11.453906250000017,32.781689453125],[11.459179687500011,32.897363281249994],[11.467187500000023,32.965722656249994],[11.504589843750011,33.181933593749996],[11.657128906250023,33.118896484375],[11.8134765625,33.093701171875],[12.279882812500006,32.858544921874994],[12.753515625,32.801074218749996],[13.283496093750017,32.9146484375],[15.176562500000017,32.391162109374996],[15.705957031250023,31.426416015624994],[17.830468750000023,30.927587890625],[18.669824218750023,30.415673828124994],[19.12373046875001,30.26611328125],[19.713281250000023,30.48837890625],[20.11152343750001,30.963720703125],[19.926367187500006,31.817529296874994],[20.121484375000023,32.21875],[20.62109375,32.58017578125],[21.63593750000001,32.937304687499996],[22.187402343750023,32.918261718749996],[23.090625,32.61875],[23.10625,32.331445312499994],[23.28632812500001,32.213818359375],[24.129687500000017,32.009228515625],[24.878515625,31.984277343749994],[25.150488281250006,31.654980468749997]]]},"properties":{"name":"Libya","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-60.89521484375,13.821972656249997],[-60.951416015625,13.717578125],[-61.073144531249994,13.865576171874991],[-60.908105468749994,14.09335937499999],[-60.89521484375,13.821972656249997]]]},"properties":{"name":"Saint Lucia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[79.87480468750002,9.050732421875026],[79.90371093750005,8.975],[79.74765625000006,9.104589843749991],[79.87480468750002,9.050732421875026]]],[[[79.98232421875,9.812695312500011],[80.25283203125005,9.796337890625054],[80.71113281250004,9.366357421875023],[81.226953125,8.50551757812498],[81.37285156250002,8.431445312499989],[81.42216796875007,8.147851562500023],[81.87412109375012,7.288330078124986],[81.86142578125012,6.901269531249994],[81.63740234375004,6.425146484374991],[80.72412109375003,5.97905273437496],[80.26738281250007,6.009765625],[80.09531250000012,6.153173828125006],[79.859375,6.829296874999983],[79.71298828125012,8.18232421875004],[79.74980468750007,8.294238281250003],[79.78349609375007,8.018457031250051],[79.92890625000004,8.899218749999974],[80.09960937499997,9.209960937500043],[80.08632812500005,9.577832031250026],[80.42832031250006,9.480957031250014],[80.04580078125005,9.649902343749972],[79.98232421875,9.812695312500011]]]]},"properties":{"name":"Sri Lanka","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[28.646875,-30.1265625],[28.39208984375,-30.147558593750006],[28.128710937500017,-30.52509765625001],[28.05683593750001,-30.63105468750001],[27.753125,-30.6],[27.364062500000017,-30.27919921875001],[27.19355468750001,-29.94130859375001],[27.056933593750017,-29.625585937500006],[27.29453125,-29.519335937500003],[27.73554687500001,-28.940039062500006],[27.959863281250023,-28.873339843750003],[28.084375,-28.77998046875001],[28.23261718750001,-28.701269531250006],[28.471875,-28.615820312500006],[28.583398437500023,-28.594140625],[28.625781250000017,-28.58173828125001],[29.301367187500006,-29.08984375],[29.38671875,-29.31972656250001],[29.34882812500001,-29.441992187500006],[29.293554687500006,-29.56689453125],[29.1421875,-29.700976562500003],[29.098046875000023,-29.919042968750006],[28.646875,-30.1265625]]]},"properties":{"name":"Lesotho","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[20.957812500000074,55.27890625000006],[20.89980468750008,55.286669921875045],[21.11484375,55.61650390624999],[20.957812500000074,55.27890625000006]]],[[[25.573046875000017,54.139892578125],[25.497363281250045,54.17524414062501],[25.52734375000003,54.21513671874996],[25.505664062500045,54.26494140624999],[25.46113281250004,54.29277343749996],[25.179492187500017,54.214257812499966],[25.111425781250006,54.15493164062505],[25.04609375000004,54.13305664062503],[24.869531250000023,54.14516601562502],[24.82568359374997,54.118994140625006],[24.78925781250001,53.99824218750001],[24.768164062499977,53.97465820312499],[24.31796875,53.892968749999966],[24.236621093750045,53.91997070312496],[24.19130859375005,53.95043945312503],[23.559082031250057,53.91982421875002],[23.484667968750074,53.939794921875006],[23.453613281250057,54.14345703125002],[23.3701171875,54.20048828124999],[23.282324218750063,54.240332031250034],[23.17031250000008,54.28144531249998],[23.0875,54.299462890624994],[23.042187500000068,54.30419921875],[23.01552734375005,54.34833984375001],[22.976757812500068,54.36635742187505],[22.89394531250008,54.390527343749994],[22.82373046874997,54.39580078124999],[22.766210937499977,54.356787109375034],[22.679882812500068,54.493017578125006],[22.684472656250023,54.56293945312504],[22.82470703125,54.87128906249998],[22.56728515625005,55.05913085937496],[22.072363281250034,55.06367187499998],[21.235742187500023,55.26411132812498],[21.237890625000034,55.455029296874955],[21.06191406250005,55.81342773437498],[21.053808593750006,56.02294921875003],[21.04609375000004,56.07006835937503],[21.31464843750004,56.18813476562502],[21.65351562500004,56.314550781250006],[22.084570312500034,56.40673828125006],[22.875585937500063,56.39643554687501],[22.96826171875003,56.38041992187502],[23.042968750000057,56.324072265625006],[23.119824218749983,56.330664062500006],[23.195898437500034,56.36713867187498],[24.120703125000063,56.26425781249998],[24.90302734375001,56.398193359375],[25.069921875,56.20039062500004],[25.663183593750063,56.104833984375006],[26.593554687500074,55.66752929687502],[26.590820312500057,55.62265625],[26.56660156250001,55.546484375000034],[26.51923828125004,55.448144531249994],[26.469531250000045,55.371923828125006],[26.457617187500006,55.342480468749955],[26.49531250000004,55.31801757812502],[26.68125,55.30644531249999],[26.76015625000008,55.29335937499999],[26.775683593750045,55.27309570312502],[26.601171875000034,55.130175781250045],[26.291796875000074,55.13959960937501],[26.250781250000045,55.12451171875006],[26.175195312500023,55.003271484375034],[26.092968750000068,54.96230468750005],[25.964453124999977,54.947167968749966],[25.85927734375005,54.91928710937498],[25.722460937500074,54.71787109374998],[25.731640625000068,54.59038085937502],[25.72480468750001,54.564257812500045],[25.68515625,54.53579101562502],[25.62031250000004,54.46040039062501],[25.56757812500004,54.377050781250006],[25.54736328125,54.33183593750002],[25.55751953125005,54.310693359374994],[25.702539062499994,54.29296875],[25.765234374999977,54.179785156250034],[25.573046875000017,54.139892578125]]]]},"properties":{"name":"Lithuania","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[6.4873046875,49.798486328124994],[6.344335937500006,49.452734375],[6.181054687500023,49.498925781249994],[6.119921875000017,49.485205078125],[6.074121093750023,49.454638671874996],[6.011425781250011,49.445458984374994],[5.95947265625,49.454638671874996],[5.928906250000011,49.4775390625],[5.9013671875,49.48974609375],[5.823437500000011,49.505078125],[5.789746093750011,49.53828125],[5.776710379464286,49.639953962053575],[5.744042968750023,49.91962890625],[5.7880859375,49.961230468749996],[5.8173828125,50.0126953125],[5.866894531250011,50.0828125],[5.976269531250011,50.1671875],[6.089062500000011,50.154589843749996],[6.110058593750011,50.123779296875],[6.116503906250017,50.120996093749994],[6.109765625000023,50.034375],[6.13818359375,49.97431640625],[6.204882812500017,49.91513671875],[6.272327008928583,49.887234933035714],[6.4873046875,49.798486328124994]]]},"properties":{"name":"Luxembourg","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.14794921875,56.142919921875],[27.576757812500006,55.798779296875],[27.052539062500017,55.83056640625],[26.593554687500017,55.667529296874996],[25.663183593750006,56.104833984375],[25.069921875,56.200390625],[24.90302734375001,56.398193359375],[24.120703125,56.2642578125],[23.81269531250001,56.329248046875],[23.195898437500006,56.367138671875],[23.11982421875001,56.3306640625],[23.04296875,56.324072265625],[22.875585937500006,56.396435546875],[22.084570312500006,56.40673828125],[21.730566406250006,56.325976562499996],[21.65351562500001,56.31455078125],[21.31464843750001,56.188134765625],[21.04609375000001,56.070068359375],[21.0712890625,56.82373046875],[21.72871093750001,57.57099609375],[22.554589843750023,57.724267578125],[23.28730468750001,57.08974609375],[23.647753906250017,56.971044921875],[24.382617187500017,57.250048828124996],[24.322558593750017,57.87060546875],[24.3625,57.866162109375],[24.458886718750023,57.907861328125],[25.11103515625001,58.063427734375],[25.27265625000001,58.009375],[25.66015625,57.920166015625],[26.29804687500001,57.60107421875],[26.532617187500023,57.531005859375],[26.96601562500001,57.609130859375],[27.187109375,57.538330078125],[27.326562500000023,57.52548828125],[27.4697265625,57.5240234375],[27.538671875,57.42978515625],[27.796875,57.316943359374996],[27.82861328125,57.293310546875],[27.838281250000023,57.247705078125],[27.83027343750001,57.194482421875],[27.639453125000017,56.845654296875],[27.806054687500023,56.86708984375],[27.8486328125,56.85341796875],[27.89208984375,56.741064453125],[28.00751953125001,56.599853515625],[28.103125,56.545703125],[28.11083984375,56.510693359375],[28.169238281250017,56.386865234375],[28.191699218750017,56.315576171875],[28.202050781250023,56.260400390625],[28.14794921875,56.142919921875]]]},"properties":{"name":"Latvia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.2125,45.450439453125],[28.07470703125,45.598974609375],[28.23945312500001,46.6408203125],[28.07177734375,46.978417968749994],[27.614062500000017,47.34052734375],[26.980761718750017,48.155029296875],[26.618945312500017,48.25986328125],[26.640429687500017,48.294140625],[26.847070312500023,48.387158203125],[26.90058593750001,48.371923828125],[27.228515625,48.371435546875],[27.549218750000023,48.477734375],[28.34052734375001,48.144433593749994],[28.42304687500001,48.146875],[29.125390625000023,47.96455078125],[29.134863281250006,47.489697265625],[29.455664062500006,47.292626953124994],[29.57197265625001,46.964013671874994],[29.7197265625,46.88291015625],[29.877832031250023,46.82890625],[29.942480468750006,46.723779296874994],[29.93476562500001,46.625],[29.92431640625,46.538867187499996],[30.13105468750001,46.423095703125],[30.07568359375,46.377832031249994],[29.878027343750006,46.360205078125],[29.837890625,46.350537109375],[29.458789062500017,46.453759765624994],[29.30488281250001,46.466601562499996],[29.22382812500001,46.376953125],[29.20458984375,46.379345703125],[29.20078125,46.50498046875],[29.18623046875001,46.523974609374996],[29.146289062500017,46.526904296874996],[28.958398437500023,46.45849609375],[28.92744140625001,46.424121093749996],[28.930566406250023,46.362255859375],[28.94375,46.288427734375],[29.00625,46.17646484375],[28.971875,46.12763671875],[28.94775390625,46.049951171874994],[28.849511718750023,45.978662109374994],[28.73876953125,45.937158203124994],[28.729296875000017,45.852001953125],[28.667578125,45.793847656249994],[28.562304687500017,45.735791015625],[28.491601562500023,45.665771484375],[28.4990234375,45.517724609374994],[28.310351562500017,45.498583984374996],[28.26484375000001,45.48388671875],[28.2125,45.450439453125]]]},"properties":{"name":"Moldova","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[49.936425781249994,-16.90292968750002],[49.82402343750002,-17.08652343750002],[50.02304687500006,-16.6953125],[49.936425781249994,-16.90292968750002]]],[[[48.3421875,-13.363867187500034],[48.21191406250003,-13.385253906249957],[48.191210937500074,-13.259960937500011],[48.308886718750074,-13.198242187499957],[48.3421875,-13.363867187500034]]],[[[49.53828125000004,-12.432128906250014],[49.9375,-13.072265624999957],[50.23535156249997,-14.732031249999963],[50.482714843750074,-15.385644531249994],[50.20898437499997,-15.960449218750028],[50.02041015625005,-15.801757812500028],[49.89257812500003,-15.457714843750011],[49.664355468750074,-15.521582031249977],[49.83906250000004,-16.486523437499997],[49.76718750000006,-16.815136718749983],[49.44931640625006,-17.240625],[49.477832031250074,-17.89853515624999],[49.362890625,-18.336328125],[47.934472656249994,-22.393945312500023],[47.55800781250005,-23.874609374999963],[47.17734375,-24.787207031249977],[46.72851562499997,-25.14990234374997],[46.15869140624997,-25.230371093750023],[45.5080078125001,-25.56318359374997],[45.2057617187501,-25.57050781250004],[44.0353515625001,-24.995703125],[43.670019531250006,-24.30029296875],[43.722265625,-23.529687500000037],[43.2648437500001,-22.38359375],[43.29052734374997,-21.93251953124998],[43.50185546875005,-21.356445312499957],[43.800195312499994,-21.179199218749986],[44.40468750000005,-19.922070312500026],[44.44882812500006,-19.42871093749997],[44.23876953124997,-19.075195312499986],[44.23310546875004,-18.740625],[44.04003906249997,-18.288476562500023],[43.979394531249994,-17.3916015625],[44.42138671874997,-16.70263671874997],[44.476171875,-16.217285156249957],[44.90917968749997,-16.174511718750026],[45.2228515625001,-15.95048828124996],[45.3421875,-16.03671875000002],[45.598242187500006,-15.992578125],[45.70019531249997,-15.813769531249989],[46.157519531250074,-15.738281249999972],[46.3996093750001,-15.924609375000017],[46.331445312499994,-15.713671875000031],[46.47509765625003,-15.513476562500003],[46.942285156249994,-15.219042968749974],[47.09921875,-15.43417968750002],[47.092578125000074,-15.150097656249969],[47.35195312500005,-14.766113281249986],[47.46474609375005,-14.713281249999966],[47.47832031250002,-15.009375],[47.77402343750006,-14.63671875],[47.964160156250074,-14.672558593750026],[47.773339843749994,-14.369921875],[47.995507812499994,-13.960449218749986],[47.88359375000002,-13.807519531250009],[47.94101562500006,-13.662402343750017],[48.03984375000002,-13.596289062499963],[48.25527343750005,-13.719335937499977],[48.796484375,-13.267480468750023],[48.91943359375003,-12.839062499999969],[48.78632812500004,-12.470898437500011],[48.931738281250006,-12.4390625],[49.20703124999997,-12.079589843749957],[49.53828125000004,-12.432128906250014]]]]},"properties":{"name":"Madagascar","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-91.68369140624998,18.677343750000034],[-91.81611328124995,18.675878906250006],[-91.53671874999998,18.760009765625],[-91.68369140624998,18.677343750000034]]],[[[-86.93964843750001,20.303320312500006],[-86.97797851562498,20.489794921875074],[-86.76328124999995,20.579052734374955],[-86.93964843750001,20.303320312500006]]],[[[-106.50224609374999,21.61083984375003],[-106.60703124999993,21.561474609374983],[-106.63935546874995,21.697851562499977],[-106.50224609374999,21.61083984375003]]],[[[-110.56738281249994,25.003466796875017],[-110.5388671875,24.89155273437504],[-110.69926757812499,25.081445312499994],[-110.56738281249994,25.003466796875017]]],[[[-112.05727539062498,24.545703125000017],[-112.29677734375002,24.789648437500063],[-112.15942382812501,25.28564453125003],[-112.19501953124998,24.841064453125057],[-112.05727539062498,24.545703125000017]]],[[[-111.10029296874998,26.020605468750006],[-111.224658203125,25.83588867187504],[-111.18291015625002,26.040625],[-111.10029296874998,26.020605468750006]]],[[[-115.17060546875001,28.06938476562496],[-115.35292968750002,28.103955078124983],[-115.23354492187495,28.36835937500004],[-115.17060546875001,28.06938476562496]]],[[[-112.20307617187503,29.00532226562504],[-112.27841796875,28.769335937500017],[-112.51406249999997,28.847607421874955],[-112.42353515625,29.203662109375017],[-112.28505859374994,29.240429687499955],[-112.20307617187503,29.00532226562504]]],[[[-113.15561523437502,29.05224609375],[-113.49633789062497,29.30761718749997],[-113.58720703125002,29.57304687499996],[-113.20214843749999,29.301855468750034],[-113.15561523437502,29.05224609375]]],[[[-97.14624023437494,25.961474609375045],[-97.66767578124995,24.389990234374977],[-97.84248046874995,22.510302734375017],[-97.76328124999998,22.105859374999966],[-97.31450195312496,21.56420898437503],[-97.40917968749997,21.272558593750034],[-97.38344726562497,21.56669921874999],[-97.75380859375002,22.02666015624999],[-97.18632812499996,20.717041015625],[-96.45605468749994,19.869775390624966],[-96.28955078124994,19.34375],[-95.778125,18.805517578125034],[-95.92036132812495,18.81958007812497],[-95.62680664062503,18.690576171874994],[-95.71982421874998,18.768359375000017],[-95.18183593749995,18.700732421875017],[-94.79814453124996,18.51459960937501],[-94.45976562499993,18.166650390624994],[-93.55234375,18.430468750000017],[-92.88476562499997,18.468652343749966],[-92.44101562499998,18.67529296874997],[-91.97377929687502,18.715869140625074],[-91.91357421875,18.52851562500001],[-91.53398437499993,18.45654296875],[-91.27524414062498,18.62446289062501],[-91.34306640624996,18.900585937499955],[-91.43666992187502,18.889794921874966],[-90.73925781249994,19.352246093749955],[-90.69316406249996,19.729882812499966],[-90.49169921874997,19.94677734375003],[-90.353125,21.009423828124966],[-89.81977539062495,21.274609374999983],[-88.46669921874997,21.569384765625017],[-88.0068359375,21.604052734375045],[-87.25087890625,21.44697265625004],[-87.18828124999993,21.546435546875045],[-87.36850585937498,21.57373046875],[-87.034765625,21.592236328124955],[-86.824072265625,21.421679687500017],[-86.77177734374999,21.150537109375023],[-86.92622070312493,20.786474609375034],[-87.42138671875,20.23139648437501],[-87.44174804687498,19.861523437499983],[-87.68769531249998,19.63710937499999],[-87.6453125,19.55390625000001],[-87.42475585937498,19.583349609375063],[-87.65869140625003,19.352343750000074],[-87.65576171874997,19.25786132812499],[-87.50107421874998,19.287792968749983],[-87.76181640624998,18.446142578125006],[-87.88198242187497,18.27387695312501],[-88.05644531249996,18.524462890625074],[-88.03173828125,18.838916015625017],[-88.29565429687494,18.47241210937503],[-88.52299804687499,18.445898437500063],[-88.80634765624998,17.965527343749983],[-89.13354492187503,17.970800781249977],[-89.16147460937503,17.81484375],[-90.98916015624997,17.81640624999997],[-90.99296874999993,17.25244140625],[-91.19550781249998,17.254101562499983],[-91.40961914062501,17.255859375],[-90.975830078125,16.867822265624994],[-90.710693359375,16.708105468750034],[-90.65996093749996,16.630908203125045],[-90.634375,16.565136718749955],[-90.63408203125002,16.51074218749997],[-90.57578124999995,16.467822265625017],[-90.47109374999994,16.439550781250034],[-90.41699218750003,16.391015625000023],[-90.41699218750003,16.351318359375],[-90.45014648437493,16.261376953124994],[-90.45986328124997,16.16235351562497],[-90.44716796874994,16.07270507812501],[-90.52197265625,16.07119140625005],[-90.70322265624998,16.07104492187503],[-90.97958984374998,16.07080078124997],[-91.433984375,16.070458984374994],[-91.736572265625,16.070166015625006],[-91.95722656250001,15.703222656250034],[-92.08212890624998,15.495556640625011],[-92.18715820312497,15.320898437499963],[-92.07480468749998,15.074218749999972],[-92.09873046874998,15.026757812499994],[-92.14423828125001,15.001953125],[-92.158544921875,14.963574218749997],[-92.23515625,14.545410156249986],[-93.91606445312493,16.053564453125006],[-94.374169921875,16.284765625000034],[-94.426416015625,16.22626953125001],[-94.00126953124996,16.018945312499966],[-94.66152343750002,16.20190429687503],[-94.58710937499995,16.315820312499966],[-94.79082031249999,16.28715820312499],[-94.85869140624996,16.41972656249999],[-95.02084960937503,16.277636718750017],[-94.79941406249995,16.20966796875001],[-95.134375,16.17695312500001],[-96.21357421874993,15.693066406250011],[-96.80795898437495,15.726416015624977],[-97.18466796874998,15.909277343750006],[-97.75478515624994,15.966845703125017],[-98.52031249999993,16.30483398437505],[-98.76220703125,16.534765624999977],[-99.69067382812499,16.719628906249994],[-100.847802734375,17.20048828124999],[-101.91870117187494,17.959765625000045],[-102.69956054687495,18.062841796875006],[-103.44160156249995,18.32539062500001],[-103.91245117187496,18.828466796875006],[-104.9384765625,19.309375],[-105.482080078125,19.97607421875003],[-105.66943359374997,20.385595703124977],[-105.26015625,20.579052734374955],[-105.32705078124994,20.752978515625045],[-105.51083984374999,20.808740234375023],[-105.23706054687499,21.119189453125045],[-105.20869140624998,21.490820312499977],[-105.43144531249997,21.618261718750006],[-105.64912109375001,21.988085937500045],[-105.64550781249999,22.32690429687497],[-105.79179687500003,22.627490234375017],[-106.93549804687497,23.88125],[-107.76494140625002,24.47192382812497],[-107.52724609375001,24.36005859375001],[-107.51191406249998,24.489160156250023],[-107.95117187499994,24.614892578124966],[-108.28076171874994,25.08154296875],[-108.05146484374995,25.067041015624994],[-108.69638671874998,25.382910156250034],[-108.78725585937502,25.53803710937501],[-109.02880859375003,25.48046875000003],[-108.886572265625,25.733447265625045],[-109.19648437499998,25.59252929687503],[-109.38496093750001,25.727148437500006],[-109.42563476562495,26.032568359375063],[-109.19970703125003,26.30522460937499],[-109.11669921874999,26.25273437499996],[-109.27626953125,26.533886718749955],[-109.48286132812498,26.710351562500023],[-109.75478515624995,26.702929687500017],[-109.94399414062495,27.079345703125057],[-110.37729492187495,27.233300781249966],[-110.59267578124995,27.544335937500023],[-110.52988281249995,27.864208984374983],[-111.12138671875002,27.966992187499983],[-112.16176757812495,29.018896484375034],[-113.05766601562496,30.651025390625023],[-113.04672851562495,31.17924804687499],[-113.62348632812494,31.34589843750001],[-113.75942382812501,31.557763671874994],[-113.94775390625001,31.62934570312501],[-114.14931640624995,31.507373046875045],[-114.93359374999994,31.900732421874977],[-114.78989257812498,31.647119140624994],[-114.88188476562499,31.156396484375023],[-114.55048828124997,30.02226562499999],[-113.75546875,29.367480468750017],[-113.49970703124995,28.92670898437501],[-113.20556640624997,28.798779296874955],[-113.09365234375001,28.511767578125017],[-112.870849609375,28.42421875000005],[-112.73403320312501,27.825976562500017],[-112.32919921874996,27.52343750000003],[-111.86264648437495,26.678515625000017],[-111.6994140625,26.58095703125005],[-111.79526367187499,26.8796875],[-111.56967773437495,26.707617187500006],[-111.29160156249996,25.78979492187497],[-110.68676757812501,24.867675781250057],[-110.65932617187502,24.34145507812505],[-110.36743164062497,24.100488281249994],[-110.30375976562497,24.339453125],[-110.02280273437502,24.17460937499999],[-109.6765625,23.66157226562501],[-109.42084960937495,23.480126953124994],[-109.49570312500002,23.159814453125023],[-110.00625,22.894042968750057],[-110.3626953125,23.60493164062501],[-111.68291015625002,24.555810546875023],[-111.80249023437494,24.542529296875074],[-112.07255859374999,24.84003906250001],[-112.06987304687497,25.572851562500006],[-112.37724609374997,26.21391601562496],[-113.02075195312499,26.58325195312497],[-113.15581054687496,26.94624023437504],[-113.27226562499997,26.79096679687501],[-113.59853515625001,26.721289062500034],[-113.84096679687502,26.966503906249983],[-114.44526367187503,27.218164062499994],[-114.53989257812495,27.431103515624955],[-114.99350585937499,27.736035156249983],[-115.03647460937495,27.84184570312496],[-114.57001953124995,27.78393554687497],[-114.30058593749995,27.87299804687501],[-114.30224609375003,27.775732421875006],[-114.0693359375,27.67568359375005],[-114.15839843750003,27.919677734375],[-114.26586914062499,27.934472656249994],[-114.04848632812502,28.42617187499999],[-114.93730468749999,29.35161132812496],[-115.67382812500003,29.756396484375017],[-116.06215820312501,30.80415039062504],[-116.29628906250001,30.97050781249999],[-116.33344726562494,31.202783203124994],[-116.66215820312495,31.56489257812504],[-116.72207031249998,31.734570312499955],[-116.62080078124995,31.85107421874997],[-116.84799804687496,31.997363281250045],[-117.12827148437495,32.533349609374994],[-114.72475585937495,32.71533203125003],[-114.83593749999994,32.50830078125003],[-111.0419921875,31.32421875000003],[-108.21445312499993,31.329443359375034],[-108.21181640625002,31.779345703125017],[-106.44541015624996,31.768408203125006],[-106.14804687499995,31.450927734375],[-104.97880859374996,30.645947265624955],[-104.50400390624995,29.677685546874955],[-104.110595703125,29.386132812499994],[-103.16831054687498,28.998193359374994],[-102.8919921875,29.216406250000034],[-102.61494140624994,29.75234375],[-102.26894531249998,29.871191406250034],[-101.44038085937503,29.77685546875],[-100.75458984375001,29.182519531249994],[-100.29604492187495,28.32768554687499],[-99.50532226562497,27.54833984375003],[-99.45654296874999,27.05668945312496],[-99.10776367187498,26.446923828124994],[-97.37563476562497,25.871826171875],[-97.14624023437494,25.961474609375045]]]]},"properties":{"name":"Mexico","childNum":10}},{"geometry":{"type":"Polygon","coordinates":[[[22.344042968750017,42.31396484375],[22.836816406250023,41.993603515625],[23.00361328125001,41.73984375],[22.916015625,41.336279296875],[22.78388671875001,41.331982421875],[22.72480468750001,41.178515625],[22.603613281250006,41.140185546874996],[22.493554687500023,41.118505859375],[22.184472656250023,41.158642578125],[21.99335937500001,41.13095703125],[21.77949218750001,40.950439453125],[21.627539062500006,40.896337890625],[21.57578125,40.868945312499996],[20.964257812500023,40.849902343749996],[20.709277343750017,40.928369140624994],[20.48896484375001,41.272607421874994],[20.566210937500017,41.873681640624994],[20.725,41.87353515625],[20.778125,42.071044921875],[21.05976562500001,42.171289062499994],[21.28662109375,42.100390625],[21.389550781250023,42.21982421875],[21.560839843750017,42.24765625],[21.5625,42.247509765625],[21.81464843750001,42.303125],[22.344042968750017,42.31396484375]]]},"properties":{"name":"Macedonia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[4.227636718750006,19.142773437499997],[4.234667968750017,16.996386718750003],[4.121289062500011,16.357714843750003],[3.842968750000011,15.701708984375003],[3.5205078125,15.483105468749997],[3.504296875000023,15.356347656249994],[3.06015625,15.427197265624997],[3.001074218750006,15.340966796874994],[1.300195312500023,15.272265625],[0.947460937500011,14.982128906249997],[0.217480468750011,14.911474609374991],[-0.235888671874989,15.059423828124991],[-0.760449218749983,15.047753906249994],[-1.049560546875,14.81953125],[-1.97304687499999,14.45654296875],[-2.113232421874983,14.16845703125],[-2.586718749999989,14.227587890625003],[-2.873925781249994,13.950732421875003],[-2.950830078124994,13.6484375],[-3.248632812499977,13.658349609374994],[-3.3017578125,13.28076171875],[-3.527636718749989,13.182714843749991],[-3.947314453124989,13.402197265624991],[-4.151025390624994,13.306201171875003],[-4.328710937499977,13.119042968749994],[-4.227099609374989,12.793701171875],[-4.480615234374994,12.672216796874991],[-4.4287109375,12.337597656249997],[-4.699316406249977,12.076171875],[-5.288134765624989,11.827929687499989],[-5.250244140625,11.375781249999989],[-5.490478515625,11.042382812499994],[-5.523535156249977,10.426025390625],[-5.556591796874983,10.43994140625],[-5.694287109374983,10.43320312499999],[-5.843847656249977,10.389550781249994],[-5.896191406249983,10.354736328125],[-5.907568359374977,10.307226562499991],[-6.034570312499994,10.19482421875],[-6.1171875,10.201904296875],[-6.238378906249977,10.261621093749994],[-6.241308593749977,10.279199218749994],[-6.192626953125,10.369433593749989],[-6.190673828125,10.400292968749994],[-6.250244140625,10.717919921874994],[-6.482617187499983,10.561230468749997],[-6.564599609374994,10.58642578125],[-6.654150390624977,10.656445312499997],[-6.676367187499977,10.6337890625],[-6.686132812499977,10.578027343749994],[-6.691992187499977,10.512011718749989],[-6.669335937499994,10.3921875],[-6.693261718749994,10.349462890624991],[-6.950341796874994,10.342333984374989],[-7.01708984375,10.143261718749997],[-7.385058593749989,10.340136718749989],[-7.6611328125,10.427441406249997],[-7.990625,10.1625],[-8.007275390624983,10.321875],[-8.266650390624989,10.485986328124994],[-8.33740234375,10.990625],[-8.666699218749983,11.009472656249997],[-8.398535156249977,11.366552734374991],[-8.822021484375,11.673242187499994],[-8.818310546874983,11.922509765624994],[-9.043066406249977,12.40234375],[-9.395361328124977,12.464648437499989],[-9.358105468749983,12.255419921874989],[-9.754003906249977,12.029931640624994],[-10.274853515624983,12.212646484375],[-10.709228515625,11.898730468749989],[-10.933203124999977,12.205175781249991],[-11.30517578125,12.015429687499989],[-11.502197265625,12.198632812499994],[-11.389404296875,12.404394531249991],[-11.390380859375,12.941992187499991],[-11.634960937499983,13.369873046875],[-11.831689453124994,13.315820312499994],[-12.05419921875,13.633056640625],[-11.960888671874983,13.875292968750003],[-12.019189453124994,14.206494140624997],[-12.228417968749994,14.45859375],[-12.280615234374977,14.809033203124997],[-12.104687499999983,14.745361328125],[-12.08154296875,14.766357421875],[-12.021582031249977,14.804931640625],[-11.76015625,15.425537109375],[-11.675878906249977,15.512060546874991],[-11.502685546875,15.636816406249991],[-11.455224609374994,15.62539062499999],[-10.9482421875,15.151123046875],[-10.696582031249989,15.42265625],[-9.94140625,15.373779296875],[-9.446923828124994,15.458203125],[-9.447705078124983,15.574853515624994],[-9.426562499999989,15.623046875],[-9.3505859375,15.677392578124994],[-9.33544921875,15.525683593750003],[-9.293701171875,15.502832031249994],[-5.5125,15.496289062499997],[-5.359912109374989,16.282861328124994],[-5.509619140624977,16.442041015624994],[-5.628662109375,16.568652343750003],[-5.65625,16.8095703125],[-5.684765624999983,17.058251953124994],[-5.713183593749989,17.306884765625],[-5.74169921875,17.555566406249994],[-5.827099609374983,18.3015625],[-6.026416015624989,20.0421875],[-6.396582031249977,23.274804687499994],[-6.482031249999977,24.020800781250003],[-6.538964843749994,24.51816406249999],[-6.5673828125,24.766796875],[-6.594091796874977,24.99462890625],[-6.287207031249977,24.994824218749997],[-5.959814453124977,24.99497070312499],[-5.640771484374994,24.995166015625003],[-4.822607421874977,24.99560546875],[-1.947900390624994,23.124804687500003],[1.1455078125,21.102246093749997],[1.165722656250011,20.817431640625003],[1.610644531250017,20.555566406249994],[1.685449218750023,20.378369140624997],[3.130273437500023,19.85019531249999],[3.255859375,19.4109375],[3.119726562500006,19.103173828124994],[3.3564453125,18.986621093750003],[4.227636718750006,19.142773437499997]]]},"properties":{"name":"Mali","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[14.566210937499989,35.85273437499998],[14.436425781250023,35.82167968750005],[14.351269531250011,35.978417968749994],[14.566210937499989,35.85273437499998]]]},"properties":{"name":"Malta","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[98.18261718749997,9.933447265625006],[98.11806640625,9.877880859375054],[98.2916992187501,10.051318359375031],[98.18261718749997,9.933447265625006]]],[[[98.20976562500002,10.952734375],[98.27148437499997,10.73989257812498],[98.08046875000005,10.886621093750037],[98.20976562500002,10.952734375]]],[[[98.55380859375012,11.744873046875],[98.52841796875012,11.538671875],[98.43476562500004,11.567089843750026],[98.37646484374997,11.79150390625],[98.55380859375012,11.744873046875]]],[[[98.516015625,11.905029296875028],[98.46621093750005,12.08427734374996],[98.60957031250004,11.956640624999977],[98.516015625,11.905029296875028]]],[[[98.06611328125004,12.389794921875023],[98.00234375000005,12.279003906250011],[97.93867187500004,12.34609375],[98.06611328125004,12.389794921875023]]],[[[98.41396484375005,12.597949218749974],[98.45947265625003,12.473730468749991],[98.3138671875,12.335986328124989],[98.31210937500006,12.678173828124983],[98.41396484375005,12.597949218749974]]],[[[98.31542968749997,13.099072265625026],[98.30917968750012,12.934716796875023],[98.26533203125004,13.202246093749991],[98.31542968749997,13.099072265625026]]],[[[94.80488281250004,15.8193359375],[94.73349609375006,15.823046875000045],[94.82802734375005,15.933007812499966],[94.80488281250004,15.8193359375]]],[[[94.47675781250004,15.945947265625023],[94.41191406250007,15.848388671875057],[94.3878906250001,15.994140624999972],[94.60126953125004,16.205517578124983],[94.47675781250004,15.945947265625023]]],[[[97.575,16.253222656250017],[97.48037109375,16.305712890625045],[97.54199218749997,16.505078124999983],[97.575,16.253222656250017]]],[[[93.6908203125,18.68427734375004],[93.4875,18.867529296875063],[93.74472656250006,18.865527343750017],[93.6908203125,18.68427734375004]]],[[[93.71484374999997,19.558251953124994],[93.94570312500005,19.428613281249966],[93.90195312500012,19.33203125],[93.75585937500003,19.325683593750057],[93.64404296874997,19.49506835937501],[93.71484374999997,19.558251953124994]]],[[[93.49179687500012,19.892578125],[93.51328125000006,19.754785156249994],[93.41289062500002,19.950341796875023],[93.49179687500012,19.892578125]]],[[[93.01015625000005,19.923925781249977],[93.02324218750007,19.82885742187497],[92.91464843750006,20.086474609375045],[93.01015625000005,19.923925781249977]]],[[[101.1388671875001,21.567480468749977],[101.08037109375007,21.468652343749994],[100.703125,21.251367187499966],[100.613671875,21.059326171875],[100.56660156250004,21.038183593750063],[100.53613281250003,20.992382812499955],[100.52226562500007,20.92192382812499],[100.54931640624997,20.884228515624955],[100.61767578125003,20.879248046875006],[100.62294921875005,20.859570312499983],[100.5651367187501,20.825097656249994],[100.4074218750001,20.823242187500057],[100.32607421875005,20.795703125000045],[100.24931640625002,20.730273437500045],[100.18388671875002,20.589111328125057],[100.12968750000002,20.372216796874994],[100.12246093750005,20.316650390625057],[100.0036132812501,20.37958984375001],[99.9542968750001,20.415429687500023],[99.8903320312501,20.424414062499977],[99.72011718750005,20.32543945312497],[99.45888671875005,20.363037109375],[99.48593750000006,20.14985351562501],[99.07421875000003,20.09936523437503],[98.9166992187501,19.77290039062504],[98.37128906250004,19.68916015625004],[98.01503906250005,19.74951171874997],[97.816796875,19.459960937500057],[97.74589843750002,18.58818359374999],[97.37392578125,18.51796875],[97.63222656250005,18.290332031250074],[97.7064453125,17.79711914062503],[98.4388671875,16.975683593750034],[98.66074218750006,16.330419921875006],[98.83544921875003,16.417578125],[98.88828125000006,16.351904296875034],[98.81796875000012,16.180810546874994],[98.59238281250006,16.05068359375005],[98.55693359375007,15.367675781249986],[98.19101562500012,15.204101562499972],[98.20214843749997,14.97592773437502],[98.57001953125004,14.359912109375031],[99.13681640625006,13.716699218749994],[99.12392578125,13.030761718750043],[99.40507812500002,12.547900390625003],[99.61474609374997,11.781201171875026],[99.1901367187501,11.105273437499989],[98.7572265625,10.660937499999974],[98.70253906250005,10.19038085937504],[98.56259765625006,10.034960937499989],[98.46494140625006,10.675830078124989],[98.67558593750007,10.986914062500034],[98.74140625000004,11.591699218749966],[98.87597656250003,11.719726562500028],[98.63632812500006,11.738378906250006],[98.69628906250003,12.225244140624994],[98.6002929687501,12.2453125],[98.67871093749997,12.348486328124963],[98.57597656250002,13.161914062500031],[98.20039062500004,13.980175781250026],[98.14951171875012,13.647607421875037],[98.11064453125007,13.712890625000014],[98.10019531250006,14.161523437500023],[97.90976562500012,14.652685546874991],[98.01875,14.652587890625057],[97.81230468750007,14.858935546874989],[97.7103515625,15.875537109375074],[97.58427734375007,16.019580078125017],[97.72597656250005,16.56855468750004],[97.37587890625005,16.52294921874997],[97.20019531249997,17.095410156249983],[96.85146484375005,17.401025390624994],[96.90859375000005,17.03095703125001],[96.76542968750002,16.710351562499966],[96.43115234374997,16.504931640625045],[96.18906250000012,16.768310546875057],[96.32431640625006,16.444433593750063],[95.76328125000006,16.169042968750006],[95.38955078125005,15.722753906250034],[95.30146484375004,15.756152343749989],[95.34677734375012,16.09760742187501],[95.17695312500004,15.825683593750028],[94.9425781250001,15.818261718750023],[94.89316406250006,16.182812499999955],[94.66152343750005,15.904394531250006],[94.70332031250004,16.511914062499955],[94.4416015625001,16.094384765624966],[94.22382812500004,16.016455078125006],[94.58896484375006,17.5693359375],[94.17070312500007,18.73242187499997],[94.24570312500006,18.741162109374983],[94.07001953125004,18.893408203125006],[94.04492187500003,19.287402343750074],[93.92919921874997,18.89965820312503],[93.70546875000005,19.026904296875017],[93.49306640625005,19.369482421875006],[93.82490234375004,19.238476562499955],[93.99814453125006,19.440869140624983],[93.61171875000005,19.776074218749983],[93.70703125000003,19.912158203125074],[93.25,20.070117187500017],[93.12949218750012,19.858007812500063],[93.00195312499997,20.074853515624994],[93.06679687500005,20.377636718749955],[92.82832031250004,20.177587890625063],[92.89111328124997,20.34033203125],[92.73564453125007,20.56269531250001],[92.72285156250004,20.29560546875004],[92.32412109375,20.791845703125063],[92.17958984375005,21.293115234375023],[92.33056640624997,21.439794921874977],[92.63164062500002,21.306201171875045],[92.5934570312501,21.46733398437499],[92.58281250000002,21.940332031249994],[92.57490234375004,21.978076171875045],[92.68896484374997,22.130957031250006],[92.72099609375002,22.132421875000063],[92.77138671875,22.104785156250017],[92.9645507812501,22.003759765625034],[93.07060546875002,22.20942382812501],[93.16201171875,22.360205078125006],[93.07871093750006,22.71821289062501],[93.20390625000002,23.03701171875005],[93.34941406250007,23.08496093750003],[93.36601562500007,23.132519531249955],[93.32626953125006,24.064208984375057],[93.45214843750003,23.987402343750034],[93.68339843750007,24.00654296875004],[94.07480468750006,23.8720703125],[94.29306640625012,24.321875],[94.37724609375002,24.473730468750006],[94.49316406250003,24.637646484374983],[94.70371093750012,25.097851562499955],[94.55302734375007,25.215722656249994],[94.66777343750007,25.458886718749966],[94.99199218750002,25.77045898437504],[95.01523437500006,25.912939453125006],[95.0929687500001,25.98730468749997],[95.13242187500006,26.041259765625057],[95.12929687500005,26.070410156250034],[95.10839843749997,26.091406250000034],[95.06894531250006,26.19111328125001],[95.0597656250001,26.473974609375006],[95.20146484375007,26.641406250000017],[96.19082031250005,27.26127929687499],[96.79785156249997,27.29619140624999],[96.95341796875002,27.13330078125003],[97.10205078125003,27.11542968750004],[97.10371093750004,27.16333007812503],[96.90195312500012,27.439599609374994],[96.88359375000002,27.514843749999955],[96.96279296875,27.698291015625017],[97.04970703125005,27.760009765625],[97.34355468750002,27.982324218749994],[97.30273437499997,28.08598632812496],[97.3224609375001,28.21796875000004],[97.35644531249997,28.254492187500006],[97.43144531250002,28.353906250000023],[97.53789062500002,28.510205078124983],[97.59921875000006,28.51704101562504],[98.06162109375012,28.185888671874977],[98.29882812499997,27.550097656250045],[98.4525390625,27.6572265625],[98.65117187500007,27.572460937499983],[98.7384765625001,26.785742187500006],[98.68554687499997,26.189355468750023],[98.56406250000006,26.072412109374994],[98.65625,25.86357421874999],[98.33378906250007,25.586767578125006],[98.14287109375007,25.571093750000017],[98.01074218749997,25.292529296875017],[97.8195312500001,25.251855468749994],[97.73789062500006,24.869873046875057],[97.58330078125002,24.77480468750005],[97.53144531250004,24.49169921875003],[97.7082031250001,24.228759765625],[97.56455078125012,23.911035156250023],[98.2125,24.110644531250017],[98.83505859375006,24.121191406250034],[98.67675781250003,23.905078125000045],[98.8322265625001,23.624365234374977],[98.86376953125003,23.191259765625034],[99.41806640625006,23.069238281250023],[99.50712890625002,22.959130859374994],[99.19296875000006,22.12597656249997],[99.9176757812501,22.02802734375001],[99.94072265625007,21.75874023437504],[100.14765625000004,21.480517578125017],[100.60458984375012,21.471777343750006],[101.07978515625004,21.75585937499997],[101.1388671875001,21.567480468749977]]]]},"properties":{"name":"Myanmar","childNum":15}},{"geometry":{"type":"Polygon","coordinates":[[[19.21875,43.449951171875],[19.670996093750006,43.163964843749994],[20.344335937500006,42.827929687499996],[20.054296875,42.760058593749996],[20.06396484375,42.54726562499999],[19.78828125000001,42.476171875],[19.65449218750001,42.628564453124994],[19.280664062500023,42.17255859375],[19.342382812500006,41.869091796875],[18.436328125000017,42.559716796874994],[18.5458984375,42.6416015625],[18.46601562500001,42.777246093749994],[18.44384765625,42.96845703125],[18.46015625000001,42.997900390625],[18.48847656250001,43.012158203125],[18.623632812500006,43.027685546875],[18.621875,43.124609375],[18.674218750000023,43.230810546875],[18.74921875000001,43.283544921875],[18.85107421875,43.346337890624994],[18.934667968750006,43.339453125],[18.97871093750001,43.285400390625],[19.026660156250017,43.292431640625],[19.03671875,43.357324218749994],[18.940234375000017,43.496728515624994],[18.95068359375,43.526660156249996],[18.97421875,43.542333984375],[19.0283203125,43.532519531249996],[19.080078125,43.517724609374994],[19.11279296875,43.52773437499999],[19.164355468750017,43.535449218749996],[19.1943359375,43.53330078125],[19.21875,43.449951171875]]]},"properties":{"name":"Montenegro","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[111.878125,43.68017578125],[111.00722656250002,43.34140625],[110.400390625,42.773681640625],[109.44316406249999,42.455957031249994],[109.33984375,42.438378906249994],[108.68730468749999,42.41611328125],[108.17119140624999,42.447314453124996],[106.77001953125,42.288720703124994],[105.86757812500002,41.993994140625],[105.31435546875002,41.770898437499994],[105.19707031249999,41.738037109375],[105.11542968750001,41.66328125],[105.05058593749999,41.61591796875],[104.98203125000003,41.595507812499996],[104.49824218750001,41.65869140625],[104.49824218750001,41.877001953124996],[104.30517578125,41.846142578125],[103.99726562500001,41.79697265625],[103.71113281250001,41.751318359375],[103.07285156250003,42.00595703125],[102.5751953125,42.092089843749996],[102.15664062500002,42.158105468749994],[101.97294921874999,42.215869140624996],[101.65996093749999,42.500048828124996],[101.5791015625,42.52353515625],[101.49531250000001,42.53876953125],[101.09199218750001,42.551318359374996],[100.51904296875,42.616796875],[100.08632812500002,42.670751953125],[99.98378906250002,42.67734375],[99.46787109375003,42.568212890625],[97.20566406250003,42.789794921875],[96.38544921875001,42.720361328124994],[95.85957031250001,43.2759765625],[95.52558593750001,43.953955078125],[95.32558593750002,44.039355468749996],[95.35029296875001,44.278076171875],[94.71201171875003,44.350830078125],[93.51621093750003,44.944482421874994],[92.78789062499999,45.0357421875],[92.57890624999999,45.010986328125],[92.423828125,45.008935546874994],[92.17265624999999,45.03525390625],[92.02978515625,45.068505859374994],[91.584375,45.076513671875],[91.05,45.217431640624994],[90.87724609374999,45.19609375],[90.66181640625001,45.525244140625],[91.00175781249999,46.035791015624994],[90.99677734375001,46.10498046875],[90.94755859374999,46.177294921874996],[90.91152343750002,46.270654296874994],[90.98574218750002,46.7490234375],[90.91054687500002,46.883251953125],[90.86992187499999,46.954492187499994],[90.79902343750001,46.98515625],[90.71552734375001,47.003857421875],[90.49619140625003,47.28515625],[90.42519531250002,47.5041015625],[90.34746093749999,47.596972656249996],[90.33066406250003,47.655175781249994],[90.31328124999999,47.67617187499999],[90.19101562500003,47.702099609375],[90.10322265625001,47.745410156249996],[90.02792968750003,47.877685546875],[89.95869140625001,47.886328125],[89.91044921874999,47.8443359375],[89.83134765624999,47.823291015624996],[89.778125,47.827001953125],[89.56093750000002,48.003955078124996],[89.47919921875001,48.029052734375],[89.04765624999999,48.0025390625],[88.97109375000002,48.049951171874994],[88.91777343749999,48.089013671874994],[88.83828125000002,48.101708984374994],[88.68183593750001,48.170556640624994],[88.57597656249999,48.220166015625],[88.56679687500002,48.317431640624996],[88.51708984375,48.38447265625],[88.41396484375002,48.40341796875],[88.30996093750002,48.472070312499994],[87.97968750000001,48.555126953125],[88.06005859375,48.707177734374994],[87.83183593749999,48.791650390624994],[87.7431640625,48.881640625],[87.87216796875003,49.000146484374994],[87.81630859375002,49.0802734375],[87.8251953125,49.11630859375],[87.81425781249999,49.1623046875],[87.93476562500001,49.16455078125],[87.98808593749999,49.186914062499994],[88.02851562500001,49.219775390624996],[88.11572265625,49.256298828125],[88.19257812500001,49.451708984374996],[88.63320312500002,49.486132812499996],[88.83164062500003,49.4484375],[88.86386718750003,49.527636718749996],[88.90019531249999,49.539697265624994],[88.94541015625003,49.507666015625],[88.97060546875002,49.483740234375],[89.00839843750003,49.472802734374994],[89.10947265625003,49.501367187499994],[89.17998046874999,49.5322265625],[89.20292968749999,49.595703125],[89.24394531249999,49.62705078125],[89.39560546875003,49.6115234375],[89.475,49.66054687499999],[89.57919921875003,49.69970703125],[89.65410156249999,49.71748046875],[89.64384765624999,49.90302734375],[90.0537109375,50.09375],[90.65507812499999,50.22236328125],[90.71435546875,50.259423828124994],[90.7607421875,50.305957031249996],[91.02158203125003,50.415478515625],[91.23378906250002,50.452392578125],[91.30058593749999,50.46337890625],[91.3408203125,50.470068359375],[91.4150390625,50.468017578125],[91.44648437500001,50.52216796875],[91.80429687500003,50.693603515625],[92.10400390625,50.6919921875],[92.1923828125,50.700585937499994],[92.35478515624999,50.864160156249994],[92.42636718750003,50.803076171875],[92.62666015625001,50.68828125],[92.68134765625001,50.683203125],[92.73867187500002,50.7109375],[92.779296875,50.778662109375],[92.8564453125,50.789111328124996],[92.94130859375002,50.778222656249994],[93.103125,50.60390625],[94.25107421875003,50.556396484375],[94.35468750000001,50.221826171874994],[94.61474609375,50.023730468749996],[94.67548828125001,50.028076171875],[94.71806640624999,50.043261718749996],[94.93027343750003,50.04375],[95.11142578125003,49.935449218749994],[95.52265625000001,49.91123046875],[96.06552734375003,49.99873046875],[96.31503906250003,49.901123046875],[96.98574218750002,49.8828125],[97.20859375000003,49.730810546875],[97.35976562500002,49.741455078125],[97.58935546875,49.911474609375],[98.00390625,50.0142578125],[98.25029296874999,50.30244140625],[98.27949218750001,50.533251953124996],[98.14501953125,50.5685546875],[98.07890624999999,50.603808593749996],[98.02978515625,50.64462890625],[97.82529296875003,50.985253906249994],[98.103125,51.483544921874994],[98.64052734375002,51.801171875],[98.89316406250003,52.11728515625],[99.92167968749999,51.755517578125],[100.03457031250002,51.737109375],[100.23037109375002,51.729833984375],[100.46894531250001,51.72607421875],[100.53623046875003,51.7134765625],[101.38125,51.45263671875],[101.57089843750003,51.4671875],[101.82119140625002,51.421044921874994],[102.11152343750001,51.353466796875],[102.15566406250002,51.313769531249996],[102.16005859375002,51.26083984375],[102.14238281249999,51.216064453125],[102.15195312500003,51.10751953125],[102.19453125000001,51.050683593749994],[102.21503906250001,50.829443359375],[102.31660156250001,50.71845703125],[102.28837890624999,50.585107421874994],[103.30439453125001,50.20029296875],[103.63291015625003,50.138574218749994],[103.72324218750003,50.153857421874996],[103.80263671875002,50.176074218749996],[104.07871093750003,50.154248046875],[105.38359374999999,50.47373046875],[106.21787109375003,50.304589843749994],[106.36845703124999,50.317578125],[106.57441406250001,50.32880859375],[106.71113281250001,50.31259765625],[106.94130859375002,50.196679687499994],[107.04023437500001,50.086474609374996],[107.14306640625,50.033007812499996],[107.23330078125002,49.989404296874994],[107.34707031250002,49.986669921875],[107.63095703125003,49.98310546875],[107.91660156250003,49.947802734374996],[107.96542968750003,49.653515625],[108.40693359375001,49.396386718749994],[108.5224609375,49.34150390625],[108.61367187500002,49.322802734374996],[109.23671875000002,49.334912109375],[109.45371093750003,49.296337890625],[109.52871093750002,49.269873046875],[110.19990234375001,49.17041015625],[110.42783203125003,49.219970703125],[110.70976562499999,49.14296875],[110.82792968749999,49.166162109374994],[111.20419921875003,49.304296875],[111.33662109375001,49.35585937499999],[111.42929687500003,49.342626953125],[112.07968750000003,49.42421875],[112.49492187499999,49.53232421875],[112.69736328125003,49.507275390625],[112.80644531249999,49.523583984374994],[112.91484374999999,49.569238281249994],[113.05556640625002,49.616259765624996],[113.09208984374999,49.692529296874994],[113.16416015625003,49.797167968749996],[113.31904296875001,49.874316406249996],[113.44550781250001,49.9416015625],[113.57421875,50.00703125],[114.29707031250001,50.2744140625],[114.7431640625,50.233691406249996],[115.00332031250002,50.138574218749994],[115.27451171875003,49.948876953124994],[115.36503906249999,49.911767578124994],[115.42919921875,49.896484375],[115.58798828125003,49.886035156249996],[115.7177734375,49.880615234375],[115.79521484374999,49.905908203124994],[115.92597656250001,49.9521484375],[116.13457031249999,50.010791015624996],[116.216796875,50.00927734375],[116.35117187500003,49.978076171874996],[116.55117187500002,49.9203125],[116.68330078125001,49.823779296874996],[115.82050781250001,48.57724609375],[115.79169921875001,48.455712890624994],[115.79658203125001,48.346337890624994],[115.78554687500002,48.2482421875],[115.63945312499999,48.18623046875],[115.52509765625001,48.130859375],[115.61640625000001,47.874804687499996],[115.89824218749999,47.686914062499994],[115.99384765625001,47.71132812499999],[116.07480468750003,47.78955078125],[116.23115234375001,47.858203125],[116.31718749999999,47.85986328125],[116.37822265624999,47.844042968749996],[116.51347656249999,47.83955078125],[116.65195312500003,47.864501953125],[116.76054687499999,47.869775390624994],[116.90117187499999,47.853076171874996],[116.95166015625,47.836572265624994],[117.06972656250002,47.806396484375],[117.28593749999999,47.666357421875],[117.35078125000001,47.652197265625],[117.76835937499999,47.987890625],[118.49843750000002,47.983984375],[118.56777343750002,47.943261718749994],[118.69052734375003,47.822265625],[118.75996093750001,47.757617187499996],[118.88027343750002,47.72509765625],[119.017578125,47.685351562499996],[119.08193359375002,47.654150390625],[119.71113281250001,47.15],[119.89785156250002,46.8578125],[119.8671875,46.672167968749996],[119.74746093750002,46.627197265625],[119.70664062500003,46.606005859374996],[119.62021484375003,46.603955078125],[119.47402343750002,46.62666015625],[119.33183593749999,46.613818359374996],[119.162109375,46.638671875],[118.95712890625003,46.73486328125],[118.84394531250001,46.760205078125],[118.79033203124999,46.7470703125],[118.72294921874999,46.69189453125],[118.64873046874999,46.70166015625],[118.58046875000002,46.69189453125],[118.40439453125003,46.703173828124996],[118.30869140625003,46.717041015625],[118.15683593750003,46.678564453125],[118.0712890625,46.6666015625],[117.7412109375,46.5181640625],[117.546875,46.58828125],[117.43808593750003,46.586230468749996],[117.40556640624999,46.5708984375],[117.39218750000003,46.53759765625],[117.35634765625002,46.436669921874994],[117.35693359375,46.39130859375],[117.33339843750002,46.36201171875],[116.85908203125001,46.387939453125],[116.56259765625003,46.289794921875],[116.21298828125003,45.8869140625],[116.22910156250003,45.845751953124996],[116.240625,45.79599609375],[116.19765625000002,45.73935546875],[115.68105468750002,45.458251953125],[115.16259765625,45.390234375],[114.91923828124999,45.378271484375],[114.73876953125,45.41962890625],[114.56015625000003,45.389990234375],[114.41914062500001,45.202587890625],[114.16738281250002,45.049853515624996],[114.08027343750001,44.971142578125],[113.87705078125003,44.89619140625],[113.65263671874999,44.763476562499996],[113.58701171875003,44.745703125],[113.04941406250003,44.810351562499996],[112.70673828125001,44.883447265624994],[112.59677734375003,44.91767578125],[112.49931640624999,45.0109375],[112.41132812500001,45.058203125],[112.11289062500003,45.062939453125],[112.03261718750002,45.081640625],[111.89804687500003,45.0640625],[111.40224609375002,44.36728515625],[111.93173828125003,43.81494140625],[111.878125,43.68017578125]]]},"properties":{"name":"Mongolia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[145.75195312499997,15.133154296874991],[145.71318359375007,15.215283203125026],[145.821875,15.265380859375014],[145.75195312499997,15.133154296874991]]]},"properties":{"name":"N. Mariana Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[32.112890625,-26.839453125],[32.10595703125,-26.52001953125],[32.04140625000002,-26.28125],[32.060546875,-26.018359375],[31.9482421875,-25.957617187500006],[31.98583984375,-24.46064453125001],[31.799609375000017,-23.8921875],[31.54560546875001,-23.48232421875001],[31.287890625000017,-22.40205078125001],[31.429492187500017,-22.298828125],[32.429785156250006,-21.29707031250001],[32.353613281250006,-21.136523437500003],[32.49238281250001,-20.659765625],[32.992773437500006,-19.98486328125],[32.77763671875002,-19.388769531250006],[32.84980468750001,-19.10439453125001],[32.69970703125,-18.94091796875],[32.99306640625002,-18.35957031250001],[32.87626953125002,-16.88359375],[32.94804687500002,-16.71230468750001],[31.939843750000023,-16.428808593750006],[31.236230468750023,-16.02363281250001],[30.437792968750017,-15.995312500000011],[30.39609375,-15.64306640625],[30.231835937500023,-14.990332031250006],[33.201757812500006,-14.013378906250011],[33.63642578125001,-14.568164062500003],[34.375,-14.4248046875],[34.50527343750002,-14.59814453125],[34.54082031250002,-15.297265625],[34.24609375,-15.829394531250003],[34.528125,-16.319140625],[34.93339843750002,-16.760351562500006],[35.11210937500002,-16.898535156250006],[35.06464843750001,-17.07861328125],[35.124609375,-17.127246093750003],[35.20136718750001,-17.13105468750001],[35.272558593750006,-17.118457031250003],[35.29042968750002,-17.096972656250003],[35.28115234375002,-16.80781250000001],[35.22978515625002,-16.639257812500006],[35.178320312500006,-16.573339843750006],[35.16718750000001,-16.56025390625001],[35.242773437500006,-16.375390625],[35.358496093750006,-16.160546875],[35.59931640625001,-16.12587890625001],[35.70888671875002,-16.095800781250006],[35.75527343750002,-16.05830078125001],[35.79121093750001,-15.958691406250011],[35.89277343750001,-14.891796875000011],[35.86669921875,-14.86376953125],[35.84716796875,-14.6708984375],[35.6904296875,-14.465527343750011],[35.48847656250001,-14.201074218750009],[35.37578125000002,-14.058691406250006],[35.24746093750002,-13.896875],[35.01386718750001,-13.643457031250009],[34.61152343750001,-13.437890625],[34.54570312500002,-13.21630859375],[34.542578125,-13.108691406250003],[34.35781250000002,-12.164746093750011],[34.60625,-11.690039062500006],[34.65957031250002,-11.588671875],[34.82656250000002,-11.57568359375],[34.95947265625,-11.578125],[35.1826171875,-11.574804687500006],[35.41826171875002,-11.583203125000011],[35.50439453125,-11.604785156250003],[35.56435546875002,-11.60234375],[35.630957031250006,-11.58203125],[35.78544921875002,-11.452929687500003],[35.91132812500001,-11.4546875],[36.08222656250001,-11.537304687500011],[36.17548828125001,-11.609277343750009],[36.19130859375002,-11.670703125],[36.3056640625,-11.706347656250003],[36.97890625000002,-11.566992187500006],[37.37285156250002,-11.71044921875],[37.54169921875001,-11.675097656250003],[37.72480468750001,-11.580664062500006],[37.92021484375002,-11.294726562500003],[38.491796875,-11.413281250000011],[38.9875,-11.167285156250003],[39.81708984375001,-10.912402343750003],[39.98867187500002,-10.82080078125],[40.46357421875001,-10.46435546875],[40.61171875000002,-10.661523437500009],[40.48662109375002,-10.76513671875],[40.59716796875,-10.830664062500006],[40.40283203125,-11.33203125],[40.53154296875002,-12.004589843750011],[40.48710937500002,-12.4921875],[40.58085937500002,-12.635546875],[40.43681640625002,-12.983105468750011],[40.56875,-12.984667968750003],[40.595703125,-14.122851562500003],[40.715625,-14.214453125],[40.64609375,-14.538671875],[40.775,-14.421289062500009],[40.84453125000002,-14.718652343750009],[40.617773437500006,-15.115527343750003],[40.650976562500006,-15.260937500000011],[39.98359375000001,-16.22548828125001],[39.79091796875002,-16.29453125],[39.84462890625002,-16.435644531250006],[39.084375,-16.97285156250001],[38.14492187500002,-17.242773437500006],[37.24453125000002,-17.73994140625001],[36.93935546875002,-17.993457031250003],[36.40371093750002,-18.76972656250001],[36.26289062500001,-18.71962890625001],[36.23564453125002,-18.861328125],[35.85371093750001,-18.99335937500001],[34.947851562500006,-19.81269531250001],[34.6494140625,-19.70136718750001],[34.75576171875002,-19.82197265625001],[34.705078125,-20.473046875],[34.98232421875002,-20.80625],[35.267675781250006,-21.650976562500006],[35.31572265625002,-22.396875],[35.38300781250001,-22.45458984375],[35.45634765625002,-22.11591796875001],[35.53007812500002,-22.248144531250006],[35.57539062500001,-22.96308593750001],[35.37041015625002,-23.79824218750001],[35.5419921875,-23.82441406250001],[35.48964843750002,-24.065527343750006],[34.99208984375002,-24.65058593750001],[32.96113281250001,-25.49042968750001],[32.590429687500006,-26.00410156250001],[32.84882812500001,-26.26806640625],[32.95488281250002,-26.08359375],[32.93359375,-26.25234375],[32.88916015625,-26.83046875],[32.88613281250002,-26.84931640625001],[32.353515625,-26.861621093750003],[32.19960937500002,-26.83349609375],[32.112890625,-26.839453125]]]},"properties":{"name":"Mozambique","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-16.37333984374999,19.706445312499994],[-16.437548828124932,19.609277343749994],[-16.477001953124983,19.710351562499994],[-16.343652343749994,19.86621093750003],[-16.37333984374999,19.706445312499994]]],[[[-5.359912109374989,16.282861328124994],[-5.5125,15.496289062499983],[-9.293701171875,15.502832031249994],[-9.350585937499943,15.677392578125023],[-9.38535156249992,15.667626953124994],[-9.4265625,15.623046875000057],[-9.447705078124926,15.574853515624994],[-9.446923828124937,15.458203124999955],[-9.941406249999972,15.373779296874986],[-10.696582031249989,15.42265625],[-10.9482421875,15.151123046875014],[-11.455224609374994,15.62539062499999],[-11.760156249999937,15.425537109375057],[-11.828759765624966,15.244873046875014],[-11.872851562499989,14.995166015625031],[-12.02158203124992,14.804931640625],[-12.081542968749972,14.766357421875057],[-12.104687499999955,14.745361328125043],[-12.40869140625,14.889013671874991],[-12.735253906249994,15.13125],[-13.105273437499989,15.57177734375],[-13.40966796875,16.059179687500006],[-13.756640624999989,16.172509765624994],[-13.868457031249932,16.14814453125001],[-14.300097656249932,16.58027343750001],[-14.990625,16.676904296874994],[-15.768212890624994,16.485107421875],[-16.23901367187497,16.53129882812499],[-16.44101562499992,16.20454101562504],[-16.480078124999977,16.097216796875017],[-16.50205078124992,15.917333984375063],[-16.53525390624995,15.838378906250057],[-16.53574218749995,16.28681640625001],[-16.463623046875,16.60151367187501],[-16.030322265625017,17.88793945312497],[-16.213085937499926,19.003320312500023],[-16.51445312499996,19.361962890624994],[-16.305273437499977,19.51264648437504],[-16.44487304687499,19.47314453124997],[-16.21044921875003,20.227929687500023],[-16.42978515624995,20.652343750000057],[-16.622509765624955,20.634179687499994],[-16.87607421874992,21.086132812499955],[-16.998242187499926,21.039697265625023],[-17.048046874999955,20.80615234375003],[-17.06396484375,20.89882812499999],[-16.96455078125001,21.329248046875023],[-15.231201171875,21.331298828125],[-14.084667968749926,21.33271484375001],[-13.626025390624932,21.33325195312503],[-13.396728515624943,21.333544921875017],[-13.167431640624926,21.333789062500074],[-13.016210937499949,21.33393554687501],[-13.025097656249983,21.46679687499997],[-13.032226562500028,21.572070312500017],[-13.041748046875,21.71381835937504],[-13.051220703124983,21.854785156250074],[-13.094335937499977,22.49599609375005],[-13.153271484374983,22.820507812499983],[-13.031494140624943,23.000244140625],[-12.895996093749972,23.08955078125001],[-12.739599609375006,23.192724609375063],[-12.62041015624996,23.271337890625006],[-12.559375,23.290820312500045],[-12.372900390624977,23.318017578124994],[-12.023437499999943,23.467578125000017],[-12.016308593749983,23.97021484375],[-12.016308593749983,24.378662109375],[-12.016308593749983,24.923242187499994],[-12.016308593749983,25.059375],[-12.016308593749983,25.331689453124994],[-12.016308593749983,25.740136718749994],[-12.016308593749983,25.995410156250017],[-10.376123046874966,25.995458984375034],[-9.444531249999983,25.99550781250005],[-9.071923828124937,25.99550781250005],[-8.885644531249994,25.99550781250005],[-8.682226562499949,25.99550781250005],[-8.68212890625,26.109472656250006],[-8.68212890625,26.273193359375057],[-8.682324218749955,26.49770507812505],[-8.682617187500028,26.723144531250057],[-8.682861328124972,26.92133789062501],[-8.683349609375,27.285937500000045],[-4.822607421874949,24.99560546875],[-5.640771484374994,24.99516601562499],[-5.959814453124977,24.994970703125063],[-6.287207031249977,24.99482421875001],[-6.594091796874977,24.99462890624997],[-6.396582031249977,23.274804687499994],[-6.02641601562496,20.04218750000001],[-5.827099609374955,18.301562500000045],[-5.741699218749943,17.555566406250023],[-5.713183593750017,17.306884765625],[-5.684765624999983,17.058251953124966],[-5.628662109375028,16.568652343750045],[-5.50961914062492,16.442041015625023],[-5.359912109374989,16.282861328124994]]]]},"properties":{"name":"Mauritania","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-62.1484375,16.74033203124999],[-62.221630859375,16.699511718750003],[-62.191357421875,16.804394531249997],[-62.1484375,16.74033203124999]]]},"properties":{"name":"Montserrat","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[57.65126953125002,-20.48486328125],[57.31767578125002,-20.42763671875001],[57.416015625,-20.18378906250001],[57.65654296875002,-19.98994140625001],[57.7919921875,-20.21259765625001],[57.65126953125002,-20.48486328125]]]},"properties":{"name":"Mauritius","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[34.95947265625003,-11.578125],[34.82656250000005,-11.575683593749972],[34.65957031250005,-11.58867187499996],[34.61855468750005,-11.620214843749991],[34.60625,-11.690039062500006],[34.3578125,-12.164746093749997],[34.542578125,-13.108691406250003],[34.54570312500002,-13.21630859375],[34.6115234375001,-13.437890625000023],[35.0138671875001,-13.64345703124998],[35.247460937499994,-13.896875],[35.37578125000002,-14.05869140625002],[35.48847656250004,-14.20107421874998],[35.69042968749997,-14.465527343750026],[35.84716796875003,-14.670898437500043],[35.8927734375001,-14.891796875000011],[35.7912109375001,-15.958691406250026],[35.75527343750005,-16.058300781249983],[35.708886718749994,-16.095800781249977],[35.5993164062501,-16.12587890624998],[35.35849609375006,-16.160546875000023],[35.242773437500006,-16.375390625],[35.16718750000004,-16.56025390625001],[35.178320312500006,-16.57333984375002],[35.22978515625002,-16.639257812500034],[35.281152343749994,-16.8078125],[35.29042968750005,-17.096972656250017],[35.27255859375006,-17.11845703124996],[35.2013671875001,-17.13105468750004],[35.124609375,-17.127246093749974],[35.06464843750004,-17.078613281250014],[35.11210937500002,-16.898535156250006],[34.93339843750002,-16.760351562500006],[34.528125,-16.319140625],[34.24609374999997,-15.829394531249974],[34.54082031250002,-15.297265625],[34.50527343750005,-14.598144531249957],[34.375,-14.4248046875],[33.63642578125004,-14.568164062499974],[33.148046875,-13.94091796875],[32.98125,-14.009375],[32.797460937500006,-13.6884765625],[32.67041015624997,-13.590429687500006],[32.96757812500002,-13.225],[32.97519531250006,-12.701367187499983],[33.51230468750006,-12.347753906249977],[33.340136718750074,-12.308300781250011],[33.25234375000005,-12.112597656250031],[33.3039062500001,-11.69082031249998],[33.23271484375002,-11.417675781250026],[33.26835937500002,-11.403906249999977],[33.379785156249994,-11.15791015625004],[33.29277343750002,-10.85234375],[33.661523437499994,-10.553125],[33.55371093749997,-10.391308593750011],[33.53759765624997,-10.351562499999986],[33.52890625,-10.234667968749974],[33.31152343750003,-10.037988281249966],[33.3371093750001,-9.954003906249994],[33.350976562499994,-9.862207031250037],[33.25,-9.759570312500003],[33.148046875,-9.603515625],[32.99599609375005,-9.622851562499946],[32.91992187500003,-9.407421875000026],[33.88886718750004,-9.670117187499983],[33.99560546875003,-9.495410156250003],[34.32089843750006,-9.731542968749977],[34.56992187500006,-10.241113281249966],[34.66708984375006,-10.792480468750028],[34.60791015624997,-11.08046875],[34.77382812500005,-11.341699218750009],[34.890625,-11.3935546875],[34.93701171874997,-11.463476562500034],[34.95947265625003,-11.578125]]]},"properties":{"name":"Malawi","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[111.38925781250006,2.415332031250031],[111.31152343749997,2.437597656250034],[111.33349609374997,2.768310546875],[111.38925781250006,2.415332031250031]]],[[[104.22158203125,2.731738281250003],[104.1291015625001,2.767236328125037],[104.18476562500004,2.871728515625009],[104.22158203125,2.731738281250003]]],[[[117.88476562499997,4.186132812500006],[117.64902343750012,4.168994140624974],[117.70800781249997,4.262402343749997],[117.88476562499997,4.186132812500006]]],[[[100.28896484375005,5.294726562499989],[100.19101562500006,5.28286132812498],[100.2455078125,5.467773437499986],[100.33886718749997,5.410058593750037],[100.28896484375005,5.294726562499989]]],[[[99.848046875,6.465722656249994],[99.9186523437501,6.358593750000011],[99.74375,6.263281249999963],[99.64628906250002,6.418359375000023],[99.848046875,6.465722656249994]]],[[[102.10107421874997,6.242236328125031],[102.34013671875002,6.172021484375023],[102.534375,5.862548828125028],[103.09707031250005,5.408447265624986],[103.41582031250007,4.85029296875004],[103.43945312499997,2.93310546875],[103.8122070312501,2.58046875],[104.21855468750002,1.722851562499997],[104.25009765625012,1.388574218750009],[104.11494140625004,1.412255859375037],[103.98144531250003,1.623632812500034],[103.99150390625002,1.454785156249997],[103.6945312500001,1.449658203125026],[103.48027343750007,1.329492187499966],[103.35683593750005,1.546142578125057],[102.72714843750012,1.855566406250034],[101.29550781250012,2.885205078125011],[101.29990234375012,3.253271484375034],[100.71542968750006,3.966210937499966],[100.79550781250012,4.023388671874983],[100.61455078125002,4.3734375],[100.34326171874997,5.984179687500031],[100.11914062499997,6.441992187500048],[100.26142578125004,6.682714843749963],[100.3454101562501,6.549902343750006],[100.75449218750012,6.460058593749991],[100.87392578125,6.24541015624996],[101.05351562500002,6.242578125],[100.98164062500004,5.771044921875045],[101.1139648437501,5.636767578125045],[101.5560546875,5.907763671875003],[101.67841796875004,5.778808593750028],[101.87363281250012,5.825292968749991],[102.10107421874997,6.242236328125031]]],[[[117.5744140625001,4.17060546875004],[117.10058593750003,4.337060546875023],[116.51474609375006,4.370800781249969],[115.86074218750005,4.348046875000037],[115.67880859375006,4.193017578124994],[115.45439453125002,3.034326171875009],[115.24697265625005,3.025927734374989],[115.117578125,2.89487304687502],[115.08076171875004,2.63422851562504],[115.1791015625,2.523193359374972],[114.78642578125002,2.250488281250014],[114.83056640625003,1.980029296874989],[114.5125,1.452001953124963],[113.90234375000003,1.434277343749997],[113.6222656250001,1.2359375],[113.00654296875004,1.433886718750003],[112.94296875000006,1.566992187500034],[112.47617187500006,1.559082031250028],[112.1857421875001,1.4390625],[112.078515625,1.143359374999974],[111.80898437500005,1.011669921874969],[111.10136718750002,1.050537109374986],[110.50576171875005,0.861962890625023],[109.65400390625004,1.614892578125023],[109.53896484375,1.89619140625004],[109.62890625000003,2.027539062499983],[109.86484375000012,1.764453125000031],[110.34921875000012,1.719726562499972],[111.22324218750012,1.395849609374991],[111.0287109375,1.557812500000026],[111.26816406250012,2.13974609375002],[111.20859375000012,2.379638671875043],[111.44384765625003,2.381542968749983],[111.5125,2.743017578124991],[112.98789062500006,3.161914062499974],[113.92392578125006,4.243212890625003],[114.0638671875,4.592675781249966],[114.65410156250007,4.037646484375045],[114.84023437500005,4.393212890625009],[114.74667968750006,4.718066406250017],[115.02675781250005,4.899707031249989],[115.10703125000006,4.390429687499974],[115.290625,4.352587890624989],[115.1400390625,4.899755859374991],[115.37490234375,4.932763671874966],[115.55449218750007,5.093554687500045],[115.41904296875012,5.413183593749963],[115.60390625,5.603417968749994],[115.74082031250012,5.533007812500045],[115.8771484375001,5.613525390625014],[116.74980468750007,6.977099609374989],[116.8498046875001,6.826708984374989],[116.78808593749997,6.606103515624994],[117.12851562500012,6.968896484375009],[117.2298828125,6.939990234374974],[117.29404296875006,6.676904296875023],[117.60966796875002,6.512646484375054],[117.69375,6.35],[117.64453124999997,6.001855468749994],[117.5011718750001,5.884667968750009],[118.00380859375,6.053320312499991],[118.11582031250006,5.8625],[117.93476562500004,5.7875],[117.97363281249997,5.70625],[118.35312500000012,5.80605468749998],[118.59482421875006,5.592089843750003],[119.22343750000007,5.412646484375031],[119.2663085937501,5.308105468750057],[119.21962890625,5.159814453125037],[118.9125,5.02290039062504],[118.26054687500007,4.988867187500034],[118.18535156250002,4.828515625000051],[118.5625,4.502148437499997],[118.54833984375003,4.379248046875006],[118.008203125,4.250244140625014],[117.6964843750001,4.342822265625045],[117.5744140625001,4.17060546875004]]],[[[117.14160156250003,7.168212890625028],[117.08066406250006,7.115283203124989],[117.06425781250007,7.26069335937504],[117.2640625,7.351660156250006],[117.26679687500004,7.220800781249991],[117.14160156250003,7.168212890625028]]]]},"properties":{"name":"Malaysia","childNum":8}},{"geometry":{"type":"Polygon","coordinates":[[[23.380664062500017,-17.640625],[24.27490234375,-17.481054687500006],[24.73291015625,-17.51777343750001],[25.001757812500017,-17.56855468750001],[25.2587890625,-17.793554687500006],[24.909082031250023,-17.821386718750006],[24.530566406250017,-18.052734375],[24.243945312500017,-18.0234375],[23.599707031250006,-18.4599609375],[23.219335937500006,-17.99970703125001],[20.97412109375,-18.31884765625],[20.9794921875,-21.9619140625],[19.977343750000017,-22.00019531250001],[19.98046875,-24.77675781250001],[19.98046875,-28.310351562500003],[19.98046875,-28.451269531250006],[19.539843750000017,-28.574609375],[19.31269531250001,-28.73330078125001],[19.24580078125001,-28.901660156250003],[19.16171875,-28.938769531250003],[18.310839843750017,-28.88623046875],[17.44794921875001,-28.69814453125001],[17.34785156250001,-28.50117187500001],[17.358691406250017,-28.26943359375001],[17.1884765625,-28.13251953125001],[17.05625,-28.031054687500003],[16.93330078125001,-28.069628906250003],[16.875292968750017,-28.1279296875],[16.841210937500023,-28.21894531250001],[16.81015625,-28.26455078125001],[16.7875,-28.39472656250001],[16.755761718750023,-28.4521484375],[16.62617187500001,-28.487890625],[16.487109375000017,-28.572851562500006],[16.447558593750017,-28.617578125],[15.719042968750017,-27.9658203125],[15.341503906250011,-27.386523437500003],[15.139062500000023,-26.50800781250001],[14.9677734375,-26.31806640625001],[14.837109375000011,-25.033203125],[14.5015625,-24.201953125],[14.462792968750023,-22.44912109375001],[13.450585937500023,-20.91669921875001],[13.168359375000023,-20.184667968750006],[12.458203125000011,-18.9267578125],[11.77587890625,-18.001757812500003],[11.733496093750006,-17.7509765625],[11.743066406250023,-17.24921875000001],[11.902539062500011,-17.2265625],[12.013964843750017,-17.168554687500006],[12.21337890625,-17.2099609375],[12.318457031250006,-17.21337890625],[12.359277343750023,-17.205859375],[12.548144531250017,-17.212695312500003],[13.179492187500017,-16.9716796875],[13.475976562500023,-17.0400390625],[14.017480468750023,-17.40888671875001],[16.1484375,-17.390234375],[18.396386718750023,-17.3994140625],[18.95527343750001,-17.803515625],[20.1943359375,-17.863671875],[20.745507812500023,-18.01972656250001],[22.32421875,-17.8375],[23.380664062500017,-17.640625]]]},"properties":{"name":"Namibia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[167.54443359375003,-22.62324218750001],[167.44375,-22.63916015624997],[167.44345703125006,-22.541406250000037],[167.54443359375003,-22.62324218750001]]],[[[168.01093750000004,-21.429980468750017],[168.1390625,-21.44521484375001],[168.12070312500012,-21.615820312500034],[167.96679687500003,-21.641601562499957],[167.81542968749997,-21.392675781249963],[167.9884765625001,-21.337890624999986],[168.01093750000004,-21.429980468750017]]],[[[167.40087890625003,-21.16064453125003],[167.07265625,-20.99726562499997],[167.03271484374997,-20.922558593750026],[167.18945312500003,-20.803515625000017],[167.05576171875012,-20.720214843750014],[167.29794921875006,-20.732519531250034],[167.40087890625003,-21.16064453125003]]],[[[164.20234375000004,-20.246093749999957],[164.4359375,-20.282226562499957],[165.191796875,-20.768847656249974],[165.66279296875004,-21.267187499999977],[166.94238281250003,-22.09013671875003],[166.97031250000012,-22.32285156250002],[166.77412109375004,-22.37617187500004],[166.4679687500001,-22.256054687499997],[164.92744140625004,-21.289843749999974],[164.16972656250007,-20.48017578125004],[164.05966796875012,-20.141503906249966],[164.20234375000004,-20.246093749999957]]]]},"properties":{"name":"New Caledonia","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[14.97900390625,22.99619140624999],[15.181835937500011,21.523388671874997],[15.607324218750023,20.954394531250003],[15.587109375000011,20.733300781249994],[15.963183593750017,20.34619140625],[15.735058593750011,19.904052734375],[15.474316406250011,16.908398437499997],[14.367968750000017,15.750146484374994],[13.4482421875,14.380664062500003],[13.505761718750023,14.134423828124994],[13.606347656250023,13.70458984375],[13.426953125000011,13.701757812499991],[13.323828125,13.670849609374997],[12.871679687500006,13.449023437500003],[12.65478515625,13.3265625],[12.463183593750017,13.09375],[10.958886718750023,13.371533203124997],[10.475878906250017,13.330224609374994],[10.229589843750006,13.281005859375],[10.184667968750006,13.270117187499991],[9.615917968750011,12.810644531249991],[9.201562500000023,12.821484375],[8.750585937500006,12.908154296874997],[8.4560546875,13.059667968749991],[8.095019531250017,13.291162109374994],[7.955761718750011,13.32275390625],[7.788671875,13.337890625],[7.056738281250006,13.000195312499997],[6.804296875,13.107666015625],[6.2998046875,13.658789062499991],[6.184277343750011,13.66367187499999],[5.838183593750017,13.765380859375],[5.491992187500017,13.872851562500003],[5.415820312500017,13.859179687500003],[5.361621093750017,13.836865234374997],[5.241894531250011,13.757226562499994],[4.664843750000017,13.733203125],[4.147558593750006,13.457714843749997],[3.947851562500006,12.775048828124994],[3.646679687500011,12.529980468749997],[3.595410156250011,11.6962890625],[2.805273437500006,12.383837890624989],[2.366015625000017,12.221923828125],[2.38916015625,11.897070312499991],[2.072949218750011,12.309375],[2.226269531250011,12.466064453125],[2.104589843750006,12.701269531249991],[1.56494140625,12.635400390624994],[0.9873046875,13.041894531249994],[0.988476562500011,13.36484375],[1.201171875,13.357519531249991],[0.6181640625,13.703417968750003],[0.42919921875,13.972119140624997],[0.382519531250011,14.245800781249997],[0.163867187500017,14.497216796874994],[0.217480468750011,14.911474609374991],[0.947460937500011,14.982128906249997],[1.300195312500023,15.272265625],[3.001074218750006,15.340966796874994],[3.06015625,15.427197265624997],[3.504296875000023,15.356347656249994],[3.5205078125,15.483105468749997],[3.842968750000011,15.701708984375003],[4.121289062500011,16.357714843750003],[4.234667968750017,16.996386718750003],[4.227636718750006,19.142773437499997],[5.836621093750011,19.479150390624994],[7.481738281250017,20.873095703125003],[11.967871093750006,23.517871093750003],[13.48125,23.18017578125],[14.215527343750011,22.619677734375003],[14.97900390625,22.99619140624999]]]},"properties":{"name":"Niger","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[7.30078125,4.418164062500026],[7.140429687500017,4.395117187500034],[7.227343750000045,4.527343749999972],[7.30078125,4.418164062500026]]],[[[6.804296875,13.107666015625],[7.056738281250006,13.00019531250004],[7.788671875,13.337890625],[7.955761718750011,13.322753906250028],[8.095019531250045,13.29116210937498],[8.750585937500034,12.908154296875026],[9.20156250000008,12.82148437500004],[9.615917968750011,12.810644531249963],[10.184667968750063,13.270117187499963],[10.229589843749977,13.281005859375043],[10.475878906250074,13.330224609375037],[10.958886718750051,13.371533203125011],[12.463183593750017,13.09375],[12.654785156250057,13.3265625],[13.426953125000068,13.701757812499963],[13.606347656250023,13.704589843750014],[13.932324218750011,13.258496093749997],[14.06396484375,13.078515625],[14.160058593750023,12.612792968749986],[14.184863281250017,12.447216796874997],[14.272851562500023,12.356494140624989],[14.518945312500051,12.298242187500023],[14.619726562500063,12.150976562500048],[14.559765625000011,11.492285156249963],[14.20234375000004,11.268164062499963],[14.143261718750068,11.248535156250043],[14.056738281250034,11.245019531250037],[13.981445312500057,11.21186523437504],[13.892089843750057,11.140087890624983],[13.699902343749983,10.873144531250048],[13.53535156250004,10.605078124999963],[13.414550781250028,10.171435546874989],[13.269921875000051,10.036181640624974],[13.198730468750028,9.563769531250003],[12.929492187500074,9.426269531249972],[12.87568359375004,9.303515625000017],[12.80654296875008,8.886621093749994],[12.7822265625,8.817871093750014],[12.651562500000011,8.667773437499989],[12.40351562500004,8.59555664062502],[12.311328125000074,8.419726562499989],[12.2333984375,8.282324218749977],[12.016015625000051,7.589746093750009],[11.809179687500006,7.345068359374991],[11.767382812500017,7.272265624999989],[11.861425781249977,7.11640625000004],[11.657519531250017,6.951562500000023],[11.580078125000057,6.88886718750004],[11.551660156250023,6.697265625],[11.153320312500057,6.437939453125011],[11.1064453125,6.457714843750054],[11.032519531250045,6.697900390625037],[10.954199218750006,6.7765625],[10.60625,7.063085937500006],[10.413183593750006,6.877734375],[10.293066406250034,6.876757812499974],[10.205468750000051,6.891601562499986],[10.185546874999972,6.91279296875004],[10.167773437500017,6.959179687499983],[10.143554687500057,6.99643554687502],[10.038867187500045,6.921386718750014],[9.874218750000068,6.803271484375017],[9.82070312500008,6.783935546874986],[9.779882812500034,6.760156250000023],[9.725585937499972,6.65],[9.659960937500017,6.531982421874986],[9.490234375,6.418652343749997],[8.997167968750006,5.917724609375],[8.715625,5.046875],[8.514843750000068,4.724707031250034],[8.23378906250008,4.907470703124972],[8.293066406250006,4.557617187500014],[7.644238281250068,4.525341796875011],[7.530761718750028,4.655175781249994],[7.284375,4.547656250000031],[7.076562500000051,4.716162109374991],[7.15468750000008,4.514404296875],[6.92324218750008,4.390673828125017],[6.767675781250006,4.724707031250034],[6.860351562500057,4.373339843750045],[6.633007812500011,4.340234375000051],[6.579980468750051,4.475976562499994],[6.554589843750023,4.34140625000002],[6.263671875,4.309423828124991],[6.270996093749972,4.432128906250028],[6.173339843749972,4.277392578125031],[5.970703125,4.338574218749983],[5.587792968750051,4.647216796874972],[5.448144531250023,4.945849609374974],[5.383300781250057,5.129003906249977],[5.475976562500023,5.153857421874989],[5.370019531250023,5.195019531250026],[5.367968750000045,5.337744140624963],[5.549707031250023,5.474218749999963],[5.385839843750034,5.401757812500037],[5.199218750000028,5.533544921874977],[5.456640624999977,5.61171875],[5.327343750000011,5.707519531249986],[5.112402343750034,5.64155273437504],[4.861035156250068,6.026318359374997],[4.431347656250011,6.348583984375026],[3.450781249999977,6.427050781250017],[3.71699218750004,6.597949218750017],[3.430175781250057,6.525],[3.335546875000063,6.396923828125011],[2.706445312500051,6.369238281249963],[2.735644531250045,6.595703125],[2.753710937499989,6.661767578124966],[2.774609374999983,6.711718750000017],[2.752929687500028,6.771630859374966],[2.731738281250045,6.852832031249989],[2.721386718750068,6.980273437500017],[2.75673828125008,7.067919921875017],[2.750488281250057,7.39506835937496],[2.765820312500068,7.422509765625051],[2.783984375000045,7.443408203125045],[2.78515625,7.476855468750017],[2.703125,8.371826171875],[2.774804687500023,9.048535156250026],[3.044921875,9.08383789062502],[3.325195312499972,9.778466796875051],[3.60205078125,10.004541015625009],[3.646582031250006,10.408984374999989],[3.771777343750017,10.417626953124966],[3.83447265625,10.607421875],[3.7568359375,10.76875],[3.71640625,11.07958984375],[3.695312499999972,11.12031250000004],[3.63886718750004,11.176855468750006],[3.487792968749972,11.395410156250037],[3.490527343750017,11.499218750000054],[3.55390625000004,11.631884765624989],[3.595410156250068,11.696289062500057],[3.664746093750068,11.762451171875028],[3.646679687500011,12.529980468749983],[3.947851562500006,12.775048828124994],[4.147558593750006,13.457714843749983],[4.664843750000045,13.733203124999974],[5.241894531250011,13.757226562499994],[5.361621093750074,13.836865234375054],[5.415820312500017,13.859179687499974],[5.491992187500074,13.872851562500003],[6.2998046875,13.658789062500006],[6.804296875,13.107666015625]]]]},"properties":{"name":"Nigeria","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-83.6419921875,10.917236328125],[-83.71293945312499,10.785888671875],[-83.91928710937499,10.7353515625],[-84.6341796875,11.045605468749997],[-84.9091796875,10.9453125],[-85.5841796875,11.189453125],[-85.7443359375,11.06210937499999],[-87.670166015625,12.965673828124991],[-87.58505859374999,13.043310546874991],[-87.42436523437499,12.921142578125],[-87.33725585937499,12.979248046875],[-87.05917968749999,12.991455078125],[-87.00932617187499,13.0078125],[-86.918212890625,13.223583984374997],[-86.87353515625,13.266503906249994],[-86.792138671875,13.27978515625],[-86.72929687499999,13.284375],[-86.710693359375,13.313378906249994],[-86.76352539062499,13.63525390625],[-86.77060546874999,13.69873046875],[-86.758984375,13.746142578125003],[-86.733642578125,13.763476562500003],[-86.61025390625,13.774853515624997],[-86.376953125,13.755664062500003],[-86.33173828125,13.770068359375003],[-86.238232421875,13.899462890625003],[-86.15122070312499,13.994580078124997],[-86.0892578125,14.037207031249991],[-86.04038085937499,14.050146484374991],[-85.9837890625,13.965673828124991],[-85.78671875,13.844433593749997],[-85.75341796875,13.85205078125],[-85.73393554687499,13.858691406250003],[-85.727734375,13.876074218749991],[-85.731201171875,13.931835937499997],[-85.68193359374999,13.982568359374994],[-85.20834960937499,14.311816406250003],[-85.059375,14.582958984374997],[-84.86044921874999,14.809765625],[-84.645947265625,14.661083984374997],[-84.53764648437499,14.633398437499991],[-83.635498046875,14.876416015624997],[-83.5365234375,14.977001953124997],[-83.4150390625,15.008056640625],[-83.15751953124999,14.993066406249994],[-83.18535156249999,14.956396484374991],[-83.21591796874999,14.932373046875],[-83.27988281249999,14.812792968750003],[-83.344384765625,14.902099609375],[-83.413720703125,14.825341796874994],[-83.29921875,14.7490234375],[-83.187744140625,14.340087890625],[-83.4123046875,13.99648437499999],[-83.567333984375,13.3203125],[-83.5109375,12.411816406249997],[-83.627197265625,12.459326171874991],[-83.59335937499999,12.713085937499997],[-83.75424804687499,12.501953125],[-83.680419921875,12.024316406249994],[-83.7671875,12.059277343749997],[-83.82890624999999,11.861035156249997],[-83.70458984375,11.824560546874991],[-83.6517578125,11.642041015624997],[-83.86787109375,11.300048828125],[-83.6419921875,10.917236328125]]]},"properties":{"name":"Nicaragua","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-169.80341796875,-19.0830078125],[-169.94833984375,-19.072851562500006],[-169.834033203125,-18.96601562500001],[-169.80341796875,-19.0830078125]]]},"properties":{"name":"Niue","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.205810546875,12.144580078124989],[-68.25434570312495,12.032080078124977],[-68.36923828125,12.301953124999983],[-68.205810546875,12.144580078124989]]],[[[4.226171875000034,51.38647460937503],[3.902050781250011,51.20766601562502],[3.43251953125008,51.24575195312505],[3.35009765625,51.37768554687503],[4.226171875000034,51.38647460937503]]],[[[3.94912109375008,51.73945312500001],[4.07509765625008,51.648779296875006],[3.699023437500017,51.70991210937501],[3.94912109375008,51.73945312500001]]],[[[4.886132812500023,53.07070312500005],[4.70917968750004,53.036035156249994],[4.886425781249983,53.18330078124998],[4.886132812500023,53.07070312500005]]],[[[4.226171875000034,51.38647460937503],[3.448925781250068,51.54077148437503],[3.743945312500017,51.596044921875006],[4.27412109375004,51.47163085937498],[4.004785156250051,51.595849609374966],[4.182617187500057,51.61030273437498],[3.946875,51.810546875],[4.482812500000023,52.30917968749998],[4.76875,52.941308593749966],[5.061230468750068,52.96064453125001],[5.532031250000074,53.268701171874966],[6.062207031250068,53.407080078125006],[6.816210937500045,53.44116210937503],[7.197265625000028,53.28227539062499],[7.033007812500045,52.65136718749997],[6.710742187500045,52.61787109374998],[6.748828125000074,52.464013671874994],[7.035156250000057,52.38022460937498],[6.724511718749994,52.080224609374966],[6.800390625,51.96738281249998],[5.948730468750057,51.80268554687501],[6.198828125000034,51.45],[6.129980468750034,51.14741210937501],[5.857519531250034,51.030126953125006],[6.048437500000034,50.90488281250006],[5.993945312500017,50.75043945312504],[5.693554687500011,50.774755859375006],[5.796484375000034,51.153076171875],[5.214160156250045,51.278955078124966],[5.03095703125004,51.46909179687498],[4.226171875000034,51.38647460937503]]],[[[5.325781250000063,53.38574218750003],[5.190234375000074,53.39179687500001],[5.582617187500063,53.438085937500034],[5.325781250000063,53.38574218750003]]]]},"properties":{"name":"Netherlands","childNum":6,"cp":[5.0752777,52.358465]}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[5.085839843750023,60.30756835937501],[5.089062500000068,60.188769531250045],[4.95722656250004,60.44726562500006],[5.085839843750023,60.30756835937501]]],[[[4.958691406250068,61.084570312500034],[4.79902343750004,61.08271484375001],[4.861621093749989,61.19384765625],[4.958691406250068,61.084570312500034]]],[[[8.10273437500004,63.33759765625004],[7.804003906250017,63.413916015625034],[8.073535156250045,63.47080078124998],[8.10273437500004,63.33759765625004]]],[[[8.470800781250063,63.66713867187502],[8.287109375000028,63.68715820312502],[8.764648437500057,63.804638671874955],[8.78652343750008,63.703466796875034],[8.470800781250063,63.66713867187502]]],[[[11.2314453125,64.865869140625],[10.739843750000034,64.87031250000001],[11.02099609375,64.97871093749995],[11.2314453125,64.865869140625]]],[[[12.971777343750063,67.87412109375],[12.824023437500074,67.82124023437498],[13.068066406250068,68.07133789062505],[12.971777343750063,67.87412109375]]],[[[13.872851562500045,68.26533203125004],[14.096777343750034,68.218603515625],[13.229394531250051,67.995361328125],[13.300195312499994,68.16044921875007],[13.872851562500045,68.26533203125004]]],[[[15.207128906250006,68.943115234375],[15.222070312500023,68.61630859375003],[14.404687500000051,68.663232421875],[15.037792968750068,69.00053710937507],[15.207128906250006,68.943115234375]]],[[[15.760351562500006,68.56123046875001],[16.328906250000017,68.87631835937498],[16.519238281250068,68.63300781249998],[15.975292968750011,68.402490234375],[14.257519531249983,68.19077148437503],[15.412597656250028,68.61582031250003],[15.483007812500006,69.04345703125003],[16.04804687500001,69.30205078125002],[15.760351562500006,68.56123046875001]]],[[[17.503027343750034,69.59624023437502],[18.004101562500068,69.50498046874998],[17.95068359375003,69.19814453125],[17.487890625000063,69.19682617187499],[17.08251953124997,69.013671875],[16.81044921875008,69.07070312499997],[17.001757812500045,69.36191406250006],[17.36083984375003,69.38149414062497],[17.503027343750034,69.59624023437502]]],[[[29.956152343750006,69.79677734375002],[29.766210937500006,69.76752929687501],[29.835839843749994,69.90556640625005],[29.956152343750006,69.79677734375002]]],[[[20.779199218750023,70.08974609375002],[20.46425781250005,70.0765625],[20.492773437500006,70.20332031249995],[20.78603515625008,70.21953124999999],[20.779199218750023,70.08974609375002]]],[[[19.25507812500001,70.06640625000006],[19.607812500000023,70.019140625],[19.334765625000074,69.82026367187501],[18.784765625000034,69.57900390624997],[18.12988281250003,69.557861328125],[18.34931640625004,69.76787109374999],[18.67402343750004,69.78164062500002],[19.13271484375005,70.24414062500003],[19.25507812500001,70.06640625000006]]],[[[19.76748046875005,70.21669921875002],[20.005957031250034,70.07622070312502],[19.599023437499994,70.26616210937507],[19.76748046875005,70.21669921875002]]],[[[23.615332031250034,70.54931640625003],[23.15917968750003,70.28261718750005],[22.941015625000063,70.444580078125],[23.546679687500017,70.61708984374997],[23.615332031250034,70.54931640625003]]],[[[24.01757812500003,70.56738281249997],[23.716601562500074,70.561865234375],[23.778417968750063,70.74736328125005],[24.01757812500003,70.56738281249997]]],[[[23.440527343750063,70.81577148437503],[22.8291015625,70.54155273437505],[22.358691406250017,70.514794921875],[21.99453125000008,70.65712890624997],[23.440527343750063,70.81577148437503]]],[[[30.869726562500006,69.78344726562506],[30.860742187499994,69.53842773437503],[30.18017578124997,69.63583984375],[30.08730468750005,69.43286132812503],[29.38828125,69.29814453125005],[28.96582031250003,69.02197265625],[28.846289062500006,69.17690429687502],[29.33339843750005,69.47299804687503],[29.14160156250003,69.67143554687505],[27.747851562500045,70.06484375],[27.127539062500063,69.90649414062497],[26.525390625000057,69.91503906250003],[26.07246093750004,69.69155273437497],[25.748339843750017,68.99013671875],[24.94140625000003,68.59326171875006],[23.85400390625,68.80590820312503],[23.324023437500017,68.64897460937502],[22.410937500000074,68.719873046875],[21.59375,69.273583984375],[21.06611328125001,69.21411132812497],[21.065722656250017,69.04174804687503],[20.622167968750006,69.036865234375],[20.116699218750057,69.02089843750005],[20.348046875000023,68.84873046875003],[19.969824218750063,68.35639648437501],[18.303027343750045,68.55541992187497],[17.91669921875001,67.96489257812502],[17.324609375000023,68.10380859374999],[16.783593750000023,67.89501953125],[16.12744140625,67.42583007812507],[16.40351562500004,67.05498046875002],[15.422949218750006,66.48984374999998],[15.483789062500051,66.30595703124999],[14.543261718750045,66.12934570312498],[14.47968750000004,65.30146484374998],[13.650292968750023,64.58154296874997],[14.077636718750028,64.464013671875],[14.141210937500006,64.17353515624998],[13.960546875000063,64.01401367187498],[13.203515625000023,64.07509765625],[12.792773437500017,64],[12.175195312500051,63.595947265625],[11.999902343750051,63.29169921875001],[12.303515625000074,62.28559570312501],[12.155371093750006,61.720751953125045],[12.88076171875008,61.35229492187506],[12.706054687500028,61.059863281250074],[12.29414062500004,61.00268554687506],[12.588671874999989,60.450732421875045],[12.486132812500074,60.10678710937506],[11.680761718750034,59.59228515625003],[11.798144531250074,59.28989257812498],[11.64277343750004,58.92607421875002],[11.470703125000057,58.909521484375034],[11.388281250000063,59.036523437499966],[10.834472656250028,59.18393554687498],[10.595312500000063,59.764550781249966],[10.179394531250068,59.00927734375003],[9.842578125000017,58.95849609374997],[9.557226562500063,59.11269531250002],[9.65693359375004,58.97119140624997],[8.166113281250063,58.145312500000045],[7.0048828125,58.024218750000074],[6.877050781250006,58.15073242187498],[6.590527343750068,58.09731445312502],[6.659863281250068,58.26274414062499],[5.706835937500074,58.52363281250001],[5.55556640625008,58.975195312500006],[6.099023437500023,58.87026367187502],[6.363281250000028,59.00092773437501],[6.099414062500017,58.951953125000074],[5.88916015625,59.097949218750045],[5.951855468750068,59.299072265625],[6.415332031250074,59.547119140625],[5.17324218750008,59.16254882812498],[5.2421875,59.564306640625034],[5.472460937500017,59.713085937499955],[5.77216796875004,59.66093749999999],[6.216601562499989,59.818359375],[5.73046875,59.863085937500045],[6.348730468750006,60.35297851562504],[6.57363281250008,60.36059570312497],[6.526855468750057,60.152929687500034],[6.995703125,60.511962890625],[6.1533203125,60.34624023437499],[5.145800781250074,59.63881835937502],[5.205664062500006,60.087939453125045],[5.688574218749977,60.12319335937502],[5.285839843750011,60.20571289062505],[5.13710937500008,60.445605468750074],[5.648339843750051,60.68798828124997],[5.244042968750023,60.569580078125],[5.115820312500006,60.63598632812503],[5.008593750000017,61.038183593750006],[6.777832031250028,61.142431640625006],[7.038671875000063,60.952929687500045],[7.040136718750006,61.091162109375034],[7.604492187500057,61.210546875000034],[7.34658203125008,61.30058593749999],[7.442578125000011,61.43461914062502],[7.173535156250011,61.16596679687501],[6.599902343750017,61.28964843749998],[6.383496093750068,61.133886718750034],[5.451269531250034,61.10234375000002],[5.106738281250017,61.187548828125045],[5.002734375000074,61.43359375],[5.338671875000017,61.485498046874994],[4.927832031249977,61.71069335937506],[4.93007812499999,61.878320312499994],[6.01582031250004,61.7875],[6.730761718750045,61.86977539062505],[5.266894531250045,61.935595703125045],[5.143164062500063,62.159912109375],[5.908300781249977,62.41601562500003],[6.083496093750057,62.349609375],[6.580078125000057,62.407275390625045],[6.692382812500028,62.46806640624999],[6.136132812500051,62.40747070312497],[6.352929687500051,62.61113281249999],[7.653125,62.56401367187499],[7.538378906250074,62.67207031249998],[8.045507812500006,62.77124023437503],[6.734960937500006,62.72070312500003],[6.940429687500028,62.930468750000045],[7.571875,63.09951171875002],[8.100585937500028,63.090966796874966],[8.623144531250006,62.84624023437502],[8.158007812500017,63.16152343750005],[8.635546875000045,63.34233398437502],[8.360742187500023,63.498876953125034],[8.576171875000028,63.60117187499998],[9.135839843750006,63.593652343749966],[9.156054687500045,63.459326171875034],[9.696875,63.624560546875045],[10.020996093750028,63.39082031250004],[10.76015625000008,63.461279296875006],[10.725292968750068,63.625],[11.370703125000034,63.804833984374994],[11.175585937500074,63.89887695312498],[11.457617187500063,64.00297851562505],[11.306640625000028,64.04887695312499],[10.91425781250004,63.92109374999998],[10.934863281250045,63.770214843749955],[10.055078125000051,63.5126953125],[9.567285156250051,63.70615234374998],[10.565625,64.418310546875],[11.523828125000051,64.744384765625],[11.632910156250063,64.81391601562495],[11.296777343750051,64.75478515625],[11.489355468750034,64.975830078125],[12.15966796875,65.178955078125],[12.508398437499977,65.09941406250005],[12.915527343750057,65.33925781249997],[12.417578125000063,65.18408203124997],[12.133886718749977,65.27915039062498],[12.68886718750008,65.90219726562498],[13.033105468750051,65.95625],[12.783789062500063,66.10043945312506],[14.034179687500057,66.29755859374998],[13.118847656250011,66.23066406250004],[13.211425781250028,66.64082031250001],[13.959472656250028,66.79433593750002],[13.651562500000011,66.90708007812498],[14.10878906250008,67.11923828125003],[15.41572265625004,67.20244140625002],[14.441699218750045,67.27138671875005],[14.961914062500057,67.57426757812502],[15.59443359375004,67.34853515625005],[15.691503906250006,67.52138671875],[15.24873046875004,67.6021484375],[15.303906250000011,67.76528320312502],[14.854687500000068,67.66333007812506],[14.798925781250063,67.80932617187503],[15.13427734375,67.97270507812502],[15.621386718750017,67.94829101562502],[15.316015624999977,68.06875],[16.007910156250006,68.22871093750004],[16.312304687500017,67.88144531249998],[16.20380859375001,68.31674804687503],[17.552832031250063,68.42626953125006],[16.51435546875004,68.53256835937503],[18.101464843749994,69.15629882812499],[18.259765625,69.47060546875],[18.915917968750023,69.33559570312502],[18.614453125000068,69.49057617187498],[19.197265625000057,69.74785156249999],[19.722460937500017,69.78164062500002],[19.64150390625005,69.42402343750001],[20.324218750000057,69.94531249999997],[20.054492187500074,69.33266601562497],[20.486718750000023,69.54208984375],[20.739453124999983,69.52050781250003],[20.622070312500057,69.91391601562498],[21.163085937500057,69.88950195312498],[21.432910156250045,70.01318359375006],[21.974707031250034,69.83457031249998],[21.355761718750045,70.23339843749997],[22.321972656250068,70.264501953125],[22.684570312500057,70.374755859375],[23.35390625000008,69.98339843750003],[23.3291015625,70.20722656249995],[24.420019531250034,70.70200195312503],[24.263476562500017,70.82631835937497],[24.658007812500017,71.00102539062505],[25.264648437500057,70.843505859375],[25.768164062500063,70.85317382812502],[25.043847656250023,70.10903320312502],[26.66132812500004,70.93974609374999],[26.585058593750034,70.41000976562498],[26.989355468750063,70.51137695312502],[27.183691406250034,70.74404296875],[27.546484375000063,70.80400390625005],[27.23525390625008,70.94721679687498],[27.59707031250005,71.09130859375003],[28.392285156250068,70.97529296875004],[27.898046875,70.67792968750001],[28.271777343750017,70.66796875000003],[28.192968750000034,70.24858398437505],[28.83154296875003,70.86396484375001],[29.7375,70.646826171875],[30.065136718750097,70.70297851562498],[30.944140625000017,70.27441406249997],[30.262988281250074,70.12470703125004],[28.804296875000063,70.09252929687506],[29.601367187500017,69.97675781249998],[29.792089843750063,69.727880859375],[30.08828125,69.71757812500005],[30.237597656250017,69.86220703125002],[30.428320312500006,69.722265625],[30.869726562500006,69.78344726562506]]],[[[25.58632812500005,71.14208984375],[26.13378906250003,70.99580078125004],[25.582031250000057,70.960791015625],[25.31494140625,71.03413085937504],[25.58632812500005,71.14208984375]]],[[[-8.953564453124983,70.83916015625002],[-8.001367187499966,71.17768554687495],[-8.002099609374937,71.04125976562497],[-8.953564453124983,70.83916015625002]]],[[[19.219335937500006,74.39101562500002],[18.86123046875008,74.51416015624997],[19.182910156250045,74.51791992187503],[19.219335937500006,74.39101562500002]]],[[[21.60810546875004,78.59570312499997],[22.04316406250004,78.57695312500007],[22.29951171875004,78.22817382812497],[23.451953125000074,78.14946289062502],[23.11669921874997,77.99150390624999],[24.901855468750057,77.756591796875],[22.55371093750003,77.26665039062502],[22.685351562500045,77.55351562500002],[20.928125,77.45966796874998],[21.653125,77.92353515624998],[20.22792968750005,78.47783203125005],[21.60810546875004,78.59570312499997]]],[[[11.250292968750017,78.610693359375],[12.116406250000068,78.232568359375],[11.121289062500011,78.46328125],[10.558203125000063,78.90292968750003],[11.250292968750017,78.610693359375]]],[[[29.047070312500068,78.91206054687504],[29.69667968750005,78.90473632812495],[27.88906250000005,78.8521484375],[28.511132812500023,78.96733398437502],[29.047070312500068,78.91206054687504]]],[[[16.786718750000034,79.90673828125],[17.834570312499977,79.80004882812503],[17.66875,79.38593750000004],[18.39736328125008,79.60517578125001],[18.677832031250006,79.26171875000003],[19.893554687500057,79.05620117187499],[20.61103515625004,79.10664062499998],[21.388769531250034,78.74042968749998],[19.67675781250003,78.60957031249995],[16.700488281250045,76.57929687499995],[14.365820312500034,77.23447265625003],[13.995703125000034,77.50820312500002],[14.69501953125004,77.525048828125],[14.920800781250023,77.68881835937506],[17.033300781250006,77.79770507812503],[16.91406250000003,77.89799804687505],[14.089941406250063,77.77138671875],[13.680566406250051,78.028125],[14.307226562500006,78.00507812500001],[15.783886718750011,78.32705078125005],[17.00292968750003,78.36938476562497],[16.44863281250008,78.50356445312502],[16.78261718750008,78.66362304687505],[15.417382812500023,78.47324218749998],[15.384179687500023,78.77119140625001],[15.01630859375004,78.63012695312497],[14.689257812500017,78.720947265625],[14.638281250000034,78.41459960937502],[14.110449218750063,78.27089843749997],[13.150195312499989,78.2375],[11.365429687500011,78.95039062500004],[12.323437500000068,78.91425781249995],[12.083984375000028,79.26752929687498],[11.579785156250068,79.28349609375005],[11.208105468750034,79.12963867187503],[10.737597656250017,79.52016601562502],[10.804003906250045,79.79877929687504],[11.150390625,79.71699218749998],[11.702343750000011,79.82060546875005],[12.287792968750068,79.713134765625],[12.279980468749983,79.81596679687507],[13.692871093749972,79.860986328125],[13.777539062500011,79.71528320312498],[12.555371093750068,79.56948242187502],[13.333789062500017,79.57480468750006],[14.029589843750017,79.34414062500005],[14.59365234375008,79.79873046875002],[16.34375,78.97612304687502],[15.816113281250011,79.68183593750001],[16.245703125000034,80.04946289062502],[16.786718750000034,79.90673828125]]],[[[32.52597656250006,80.119140625],[31.48193359374997,80.10791015625003],[33.62929687499999,80.21743164062497],[32.52597656250006,80.119140625]]],[[[20.897851562500023,80.24995117187501],[22.289746093749983,80.04921874999997],[22.450781250000034,80.40224609375005],[23.00800781250004,80.473974609375],[23.114550781250074,80.18696289062498],[24.29755859375004,80.36040039062505],[26.86083984375,80.16000976562498],[27.19863281250008,79.90659179687506],[25.641210937500034,79.40302734374995],[23.94775390625,79.19428710937498],[22.903710937500023,79.23066406250001],[22.865527343750045,79.41186523437497],[20.861132812500017,79.39785156249997],[20.128222656250074,79.489599609375],[19.674609375000045,79.591162109375],[20.784082031250023,79.74858398437502],[18.725,79.7607421875],[18.25537109375,79.92919921875003],[18.855957031250057,80.03662109375],[17.91689453125005,80.14311523437502],[19.343359375000063,80.11640624999998],[19.733300781249994,80.47783203124999],[20.897851562500023,80.24995117187501]]]]},"properties":{"name":"Norway","childNum":27}},{"geometry":{"type":"Polygon","coordinates":[[[87.984375,27.133935546874994],[87.9931640625,27.086083984374994],[88.11103515625001,26.928466796875],[88.1572265625,26.807324218749997],[88.16152343750002,26.724804687499997],[88.11152343750001,26.58642578125],[88.05488281250001,26.430029296875],[88.02695312500003,26.39501953125],[87.9951171875,26.382373046874996],[87.28740234374999,26.360302734374997],[87.01640624999999,26.555419921875],[86.70136718750001,26.43505859375],[86.00732421875,26.649365234374997],[85.79453125000003,26.604150390624994],[85.7373046875,26.63974609375],[85.6484375,26.829003906249994],[85.56845703125003,26.83984375],[85.29296875,26.741015625],[85.19179687500002,26.766552734374997],[84.68535156249999,27.041015625],[84.65380859375,27.091699218749994],[84.65478515625,27.203662109374996],[84.64072265625003,27.249853515625],[84.61015624999999,27.298681640625],[84.48085937500002,27.348193359374996],[84.22978515624999,27.42783203125],[84.09101562500001,27.491357421874994],[83.82880859375001,27.377832031249994],[83.74697265625002,27.395947265624997],[83.55166015625002,27.456347656249996],[83.44716796875002,27.46533203125],[83.38398437500001,27.44482421875],[83.36943359374999,27.41025390625],[83.28974609375001,27.370996093749994],[82.7333984375,27.518994140624997],[82.71083984375002,27.5966796875],[82.67734375000003,27.6734375],[82.6298828125,27.687060546874996],[82.45136718750001,27.671826171874997],[82.28769531250003,27.756542968749997],[82.11191406250003,27.864941406249997],[82.03701171875002,27.900585937499997],[81.98769531250002,27.913769531249997],[81.94521484375002,27.899267578125],[81.896875,27.874462890624997],[81.85263671875003,27.867089843749994],[81.1689453125,28.335009765624996],[80.58701171875003,28.649609375],[80.51787109374999,28.665185546874994],[80.49580078125001,28.635791015624996],[80.47910156250003,28.604882812499994],[80.41855468750003,28.612011718749997],[80.32480468750003,28.66640625],[80.2265625,28.723339843749997],[80.07070312500002,28.83017578125],[80.05166015625002,28.8703125],[80.08457031250003,28.994189453124996],[80.13046875000003,29.100390625],[80.16953125000003,29.124316406249996],[80.23300781250003,29.194628906249996],[80.25595703125003,29.318017578124994],[80.2548828125,29.42333984375],[80.31689453125,29.572070312499996],[80.40185546875,29.730273437499996],[80.54902343750001,29.899804687499994],[80.81992187500003,30.119335937499997],[80.84814453125,30.13974609375],[80.90761718750002,30.171923828124996],[80.96611328124999,30.180029296875],[81.17714843750002,30.039892578125],[81.25507812500001,30.093310546874996],[81.41718750000001,30.337597656249997],[81.64189453124999,30.3875],[81.85488281250002,30.36240234375],[82.04335937500002,30.3267578125],[82.220703125,30.063867187499994],[83.15546875000001,29.612646484375],[83.58349609375,29.18359375],[83.93593750000002,29.279492187499997],[84.02197265625,29.253857421874997],[84.10136718749999,29.219970703125],[84.12783203125002,29.156298828124996],[84.17558593749999,29.036376953125],[84.22871093750001,28.911767578124994],[84.796875,28.560205078124994],[84.85507812500003,28.553613281249994],[85.06914062499999,28.609667968749996],[85.12636718750002,28.60263671875],[85.15908203125002,28.592236328124997],[85.16015625,28.571875],[85.12148437500002,28.484277343749994],[85.08857421875001,28.372265625],[85.12246093750002,28.315966796874996],[85.21210937500001,28.292626953124994],[85.41064453125,28.276025390624994],[85.67832031250003,28.27744140625],[85.75947265625001,28.220654296874997],[85.84023437500002,28.1353515625],[85.92167968749999,27.989697265624997],[85.9541015625,27.92822265625],[85.99453125000002,27.910400390625],[86.06416015625001,27.934716796874994],[86.07871093750003,28.08359375],[86.13701171874999,28.11435546875],[86.21796875000001,28.0220703125],[86.32861328125,27.959521484374996],[86.40869140625,27.928662109374997],[86.51689453124999,27.963525390624994],[86.55449218749999,28.085205078125],[86.61445312500001,28.10302734375],[86.69052734375003,28.094921875],[86.71962890625002,28.070654296875],[86.75039062500002,28.0220703125],[86.93378906250001,27.968457031249997],[87.02011718750003,27.928662109374997],[87.14140624999999,27.838330078124997],[87.29072265625001,27.821923828124994],[87.62255859375,27.815185546875],[87.86074218750002,27.886083984375],[88.10976562500002,27.87060546875],[87.984375,27.133935546874994]]]},"properties":{"name":"Nepal","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[169.17822265624997,-52.497265625],[169.12753906250006,-52.570312499999964],[169.02177734375002,-52.49541015624998],[169.17822265624997,-52.497265625]]],[[[166.22109375,-50.76152343749997],[166.2428710937501,-50.84570312499998],[165.88916015624997,-50.80771484374996],[166.10136718750002,-50.538964843750016],[166.26748046875005,-50.558593750000014],[166.22109375,-50.76152343749997]]],[[[168.14492187500005,-46.862207031249966],[168.04316406250004,-46.9326171875],[168.2409179687501,-47.070019531250026],[167.52197265624997,-47.258691406249994],[167.80078125000003,-46.90654296875002],[167.78398437500007,-46.699804687500006],[167.9557617187501,-46.69443359374998],[168.14492187500005,-46.862207031249966]]],[[[166.97949218749997,-45.17968750000003],[167.02265625000004,-45.299804687499986],[166.89267578125012,-45.24052734374999],[166.97949218749997,-45.17968750000003]]],[[[-176.17763671874997,-43.74033203124998],[-176.38173828124997,-43.86679687499998],[-176.40737304687497,-43.7609375],[-176.516552734375,-43.78476562499996],[-176.33359375000003,-44.02529296875004],[-176.51552734374997,-44.11660156249998],[-176.62934570312495,-44.036132812500014],[-176.55512695312504,-43.85195312499998],[-176.84765625000003,-43.82392578125004],[-176.56611328124995,-43.717578125000045],[-176.17763671874997,-43.74033203124998]]],[[[173.91464843750018,-40.86367187500004],[173.78085937500012,-40.921777343749966],[173.964453125,-40.71298828124998],[173.91464843750018,-40.86367187500004]]],[[[173.11533203125006,-41.27929687499997],[173.94716796875005,-40.92412109375],[173.79785156250003,-41.271972656249986],[173.99941406250005,-40.99326171874996],[174.30253906249996,-41.019531249999986],[174.03857421875003,-41.24189453125],[174.37011718750009,-41.1037109375],[174.06933593750009,-41.42949218750002],[174.08369140625015,-41.67080078124998],[174.2831054687501,-41.740625],[173.22119140624997,-42.976562499999986],[172.62402343749997,-43.27246093749996],[172.73476562500005,-43.35478515625003],[172.52666015625002,-43.464746093749966],[172.69345703125006,-43.444335937499986],[172.80703125000005,-43.620996093749994],[173.07324218750003,-43.676171874999966],[173.065625,-43.87460937499998],[172.50273437500002,-43.84365234374998],[172.48037109375,-43.726660156250034],[172.29658203125004,-43.867871093750026],[172.035546875,-43.70175781250002],[172.17978515625006,-43.895996093749986],[171.24072265624997,-44.26416015625003],[171.14628906250002,-44.9123046875],[170.99902343750003,-44.91142578124999],[171.11328125000003,-45.03925781250001],[170.7005859375,-45.68427734374997],[170.77626953125005,-45.870898437499974],[170.4191406250001,-45.94101562499996],[169.68662109375006,-46.55166015625002],[169.34228515625003,-46.62050781250001],[168.38212890625007,-46.60537109374995],[168.1891601562501,-46.362207031249966],[167.8419921875001,-46.366210937499986],[167.539453125,-46.14853515624996],[167.36894531250007,-46.24150390624999],[166.73154296875006,-46.19785156249998],[166.91669921875004,-45.95722656249998],[166.64990234374997,-46.04169921875004],[166.71796875000004,-45.88935546875001],[166.49316406249997,-45.9638671875],[166.48828124999997,-45.83183593750002],[167.0033203125,-45.71210937500004],[166.79765625000002,-45.64560546874999],[166.99082031250012,-45.531738281249986],[166.73398437500012,-45.54355468749999],[166.74306640625,-45.46845703124997],[166.91992187499997,-45.40791015624998],[166.86923828125006,-45.31123046875],[167.15566406250005,-45.410937499999974],[167.23007812500012,-45.29033203125],[167.02587890624997,-45.12363281249998],[167.25947265625004,-45.08222656249997],[167.19453125000004,-44.963476562500034],[167.41074218750006,-44.82792968750003],[167.4662109375,-44.958300781250045],[167.48496093750006,-44.77138671874998],[167.78701171875,-44.59501953125002],[167.90898437500002,-44.66474609375001],[167.85654296875012,-44.50068359374998],[168.45742187500005,-44.030566406250045],[169.17890625000004,-43.9130859375],[169.16953125000006,-43.77705078125],[169.83388671875,-43.53701171875004],[170.24023437499997,-43.163867187500045],[170.39609375000012,-43.18222656249996],[170.30283203125012,-43.10761718750004],[170.61181640625003,-43.091796875000014],[170.5236328125001,-43.00898437500001],[170.6654296875,-42.961230468749974],[170.73525390625005,-43.029785156249986],[170.96992187500004,-42.71835937499996],[171.01171875000003,-42.88505859374999],[171.027734375,-42.696093750000045],[171.31337890625005,-42.460156250000026],[171.48623046875,-41.7947265625],[171.94804687500002,-41.53867187499996],[172.13945312500002,-40.947265625000014],[172.640625,-40.51826171875001],[172.94365234375007,-40.51875],[172.73261718750004,-40.54375],[172.70439453125002,-40.6677734375],[172.988671875,-40.84824218749999],[173.11533203125006,-41.27929687499997]]],[[[175.54316406250015,-36.279296874999986],[175.34619140624997,-36.217773437499986],[175.3895507812501,-36.07773437499996],[175.54316406250015,-36.279296874999986]]],[[[173.26943359375,-34.93476562499998],[173.44785156250012,-34.844335937500034],[173.47265625000003,-34.94697265624998],[174.10400390625003,-35.14287109375002],[174.1431640625,-35.3],[174.32031250000003,-35.246679687500034],[174.58066406250018,-35.78554687500004],[174.39580078124996,-35.79736328124996],[174.8021484375,-36.30947265625001],[174.72246093750007,-36.84121093749998],[175.29951171875004,-36.99326171874996],[175.38535156250012,-37.206933593749966],[175.54248046874997,-37.2013671875],[175.46083984375005,-36.475683593750034],[175.77216796875004,-36.73515625],[176.10839843749997,-37.64511718749998],[177.27402343750012,-37.993457031249974],[178.0091796875,-37.55488281249998],[178.53623046875006,-37.69208984375004],[178.26767578125006,-38.551171875],[177.976171875,-38.72226562500005],[177.90878906250012,-39.23955078125],[177.52294921875003,-39.07382812499999],[177.07675781250012,-39.22177734375002],[176.93925781249996,-39.55527343750002],[177.10986328125009,-39.673144531250045],[176.8421875000001,-40.15781250000002],[175.98291015625003,-41.21328125000002],[175.30976562499998,-41.610644531249974],[175.16562500000012,-41.41738281249995],[174.88134765624997,-41.42402343749997],[174.8656250000001,-41.223046874999966],[174.63535156250012,-41.28945312499999],[175.1625,-40.62158203125],[175.25410156250004,-40.28935546875],[175.1559570312501,-40.11494140625],[175.00927734375009,-39.95214843749996],[173.93437500000013,-39.50908203125002],[173.76367187499997,-39.31875],[173.84433593750006,-39.13935546875001],[174.39843749999997,-38.96259765624998],[174.59736328124998,-38.78505859374995],[174.80166015625005,-37.895507812500014],[174.92802734375002,-37.80449218750003],[174.58583984374994,-37.09775390625002],[174.73427734375,-37.21523437499998],[174.92890625000004,-37.084765625000045],[174.78203125000013,-36.94375],[174.47558593750009,-36.94189453124997],[174.1888671875001,-36.492285156250034],[174.4015625000001,-36.60195312499999],[174.39277343750004,-36.24003906249999],[174.26787109375002,-36.16308593750003],[174.25371093749996,-36.24912109374998],[174.03642578125013,-36.12246093750001],[173.91445312499994,-35.908691406249986],[173.91728515625002,-36.01816406249999],[174.16640624999994,-36.327636718749986],[174.05468749999991,-36.35976562500004],[173.41220703125012,-35.542578125],[173.62617187500004,-35.31914062499996],[173.3763671875001,-35.50009765624996],[173.31396484375003,-35.44335937499996],[173.11669921874997,-35.205273437500026],[173.190625,-35.01621093749998],[172.70595703125005,-34.45517578124998],[173.04394531249997,-34.429101562499994],[172.96376953125,-34.53515625000003],[173.26943359375,-34.93476562499998]]]]},"properties":{"name":"New Zealand","childNum":9}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[58.722070312499994,20.21875],[58.640917968750074,20.210693359375057],[58.64121093750006,20.33735351562501],[58.884375,20.680566406250023],[58.95078125000006,20.516162109375017],[58.722070312499994,20.21875]]],[[[56.38798828125002,24.97919921875004],[56.640625,24.4703125],[57.12304687500003,23.980712890625],[58.773046875,23.517187499999977],[59.42939453125004,22.660839843749955],[59.82324218749997,22.50898437500004],[59.8,22.21992187500001],[59.37148437500005,21.498828125000017],[58.89570312500004,21.11279296874997],[58.47421875000006,20.406884765624966],[58.20898437500003,20.423974609374994],[58.245019531249994,20.599218749999977],[58.16943359375003,20.58950195312505],[57.86181640624997,20.24414062500003],[57.71416015625002,19.678417968749983],[57.81162109375006,19.01708984374997],[56.825976562500074,18.753515625],[56.3834960937501,17.98798828125001],[55.479101562500006,17.84326171875003],[55.25537109375003,17.58564453125004],[55.275195312500074,17.320898437500006],[55.06416015625004,17.038916015625034],[54.06816406250002,17.005517578124966],[53.60986328124997,16.75996093750004],[53.08564453125004,16.648388671874955],[51.977636718750006,18.996142578125074],[54.97734375000002,19.995947265625006],[55.64101562499999,22.001855468749994],[55.185839843750074,22.7041015625],[55.1999023437501,23.034765625000034],[55.53164062499999,23.81904296875001],[55.4684570312501,23.94111328125001],[55.98515625000002,24.063378906249966],[55.92861328125005,24.215136718750074],[55.76083984375006,24.24267578125],[55.795703125000074,24.868115234374955],[56.00058593750006,24.953222656249977],[56.06386718750005,24.73876953125],[56.38798828125002,24.97919921875004]]],[[[56.29785156250003,25.650683593750045],[56.144628906250006,25.690527343750006],[56.16748046875003,26.047460937499977],[56.08046875,26.06264648437505],[56.41308593749997,26.351171875000034],[56.29785156250003,25.650683593750045]]]]},"properties":{"name":"Oman","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[73.08961802927895,36.86435907947333],[73.08203125000107,36.43949943991182],[72.31128647748268,35.77290936638241],[73.13410859949555,34.82510160558277],[73.19895048106557,33.88770931468204],[74.00809389139292,33.25375789331485],[73.98984375,33.22119140625],[74.30361328125002,32.991796875],[74.30546875000002,32.810449218749994],[74.35458984375,32.768701171874994],[74.58828125000002,32.753222656249996],[74.632421875,32.770898437499994],[74.66328125000001,32.757666015625],[74.64335937500002,32.607714843749996],[74.68574218750001,32.493798828124994],[74.78886718750002,32.4578125],[74.9873046875,32.462207031249996],[75.33349609375,32.279199218749994],[75.25410156250001,32.14033203125],[75.13876953125,32.104785156249996],[75.07148437500001,32.08935546875],[74.73945312500001,31.948828125],[74.6357421875,31.88974609375],[74.55556640625002,31.818554687499997],[74.5259765625,31.76513671875],[74.50996093750001,31.712939453124996],[74.58183593750002,31.52392578125],[74.59394531250001,31.465380859374996],[74.53496093750002,31.261376953124994],[74.51767578125,31.185595703124996],[74.6103515625,31.112841796874996],[74.62578125000002,31.06875],[74.6328125,31.03466796875],[74.509765625,30.959667968749997],[74.38037109375,30.893408203125],[74.33935546875,30.8935546875],[74.00898437500001,30.519677734374994],[73.89931640625002,30.435351562499996],[73.88271484375002,30.3521484375],[73.92460937500002,30.28164062499999],[73.93339843750002,30.222070312499994],[73.88652343750002,30.162011718749994],[73.8091796875,30.093359375],[73.38164062500002,29.934375],[72.9033203125,29.028759765624997],[72.34189453125,28.751904296874997],[72.2919921875,28.697265625],[72.128515625,28.346337890624994],[71.94804687500002,28.177294921874996],[71.88886718750001,28.0474609375],[71.87031250000001,27.9625],[71.54296875,27.869873046875],[71.18476562500001,27.831640625],[70.87490234375002,27.714453125],[70.79794921875,27.709619140624994],[70.69160156250001,27.768994140624997],[70.62910156250001,27.937451171874997],[70.40371093750002,28.025048828124994],[70.24433593750001,27.934130859374996],[70.1939453125,27.894873046875],[70.14453125,27.849023437499994],[70.0498046875,27.694726562499994],[69.89628906250002,27.4736328125],[69.56796875,27.174609375],[69.47001953125002,26.804443359375],[70.11464843750002,26.548046875],[70.14921875000002,26.347558593749994],[70.1001953125,25.910058593749994],[70.2646484375,25.70654296875],[70.3251953125,25.685742187499997],[70.44853515625002,25.681347656249997],[70.505859375,25.685302734375],[70.56953125000001,25.705957031249994],[70.6484375,25.666943359374997],[70.65205078125001,25.422900390625003],[70.87773437500002,25.06298828125],[70.95087890625001,24.8916015625],[71.02070312500001,24.75766601562499],[71.0478515625,24.687744140625],[71.00234375000002,24.65390625],[70.97636718750002,24.61875],[70.96982421875,24.571875],[71.04531250000002,24.429980468750003],[71.04404296875,24.400097656249997],[70.98281250000002,24.361035156249997],[70.928125,24.362353515625003],[70.88623046875,24.34375],[70.80507812500002,24.261962890625],[70.76728515625001,24.245410156250003],[70.71630859375,24.237988281249997],[70.65947265625002,24.24609375],[70.57929687500001,24.279052734375],[70.55585937500001,24.331103515625003],[70.5650390625,24.385791015625003],[70.54677734375002,24.41831054687499],[70.2890625,24.35629882812499],[70.0982421875,24.2875],[69.80517578125,24.165234375],[69.71621093750002,24.172607421875],[69.63417968750002,24.22519531249999],[69.5591796875,24.273095703124994],[69.44345703125,24.275390625],[69.23505859375001,24.268261718749997],[69.11953125000002,24.26865234374999],[69.05156250000002,24.286328125],[68.98457031250001,24.273095703124994],[68.90078125000002,24.292431640624997],[68.86347656250001,24.266503906249994],[68.82832031250001,24.26401367187499],[68.78115234375002,24.313720703125],[68.75898437500001,24.30722656249999],[68.73964843750002,24.2919921875],[68.728125,24.265625],[68.72412109375,23.96469726562499],[68.48867187500002,23.967236328124997],[68.38125,23.950878906249997],[68.28251953125002,23.927978515625],[68.1650390625,23.857324218749994],[68.11552734375002,23.753369140624997],[67.8599609375,23.90268554687499],[67.66845703125,23.810986328124997],[67.309375,24.1748046875],[67.171484375,24.756103515625],[66.70302734375002,24.8609375],[66.69863281250002,25.226318359375],[66.32421875,25.601806640625],[66.13115234375002,25.49326171874999],[66.46767578125002,25.4453125],[64.77666015625002,25.307324218749997],[64.65898437500002,25.18408203125],[64.059375,25.40292968749999],[63.556640625,25.353173828124994],[63.49140625000001,25.210839843749994],[61.56689453125,25.186328125],[61.587890625,25.20234375],[61.61542968750001,25.2861328125],[61.64013671875,25.584619140624994],[61.67138671875,25.6923828125],[61.66181640625001,25.751269531250003],[61.66865234375001,25.768994140624997],[61.73769531250002,25.82109375],[61.75439453125,25.84335937499999],[61.78076171875,25.995849609375],[61.80996093750002,26.165283203125],[61.842382812500006,26.225927734375],[62.1259765625,26.368994140625],[62.239355468750006,26.35703125],[62.31230468750002,26.490869140624994],[63.168066406250006,26.665576171874996],[63.186132812500006,26.837597656249997],[63.24160156250002,26.86474609375],[63.25039062500002,26.879248046875],[63.24208984375002,27.077685546874996],[63.30517578125,27.124560546874996],[63.30156250000002,27.15146484375],[63.25625,27.207910156249994],[63.19609375000002,27.243945312499996],[63.16679687500002,27.252490234374996],[62.75273437500002,27.265625],[62.782324218750006,27.800537109375],[62.7625,28.202050781249994],[61.88984375000001,28.546533203124994],[61.15214843750002,29.542724609375],[61.0341796875,29.663427734375],[60.843359375,29.858691406249996],[61.22441406250002,29.749414062499994],[62.0009765625,29.530419921874994],[62.4765625,29.408349609374994],[63.56757812500001,29.497998046874997],[64.09873046875,29.391943359375],[64.39375,29.544335937499994],[65.09550781250002,29.559472656249994],[66.23125,29.86572265625],[66.346875,30.802783203124996],[66.82929687500001,31.263671875],[67.45283203125001,31.234619140625],[67.737890625,31.343945312499997],[67.57822265625,31.506494140624994],[68.16103515625002,31.802978515625],[68.59765625,31.802978515625],[68.86894531250002,31.634228515624997],[69.279296875,31.936816406249996],[69.24140625000001,32.433544921875],[69.5015625,33.020068359374996],[70.26113281250002,33.289013671875],[69.8896484375,34.007275390625],[70.65400390625001,33.952294921874994],[71.05156250000002,34.049707031249994],[71.095703125,34.369433593749996],[70.965625,34.53037109375],[71.62050781250002,35.183007812499994],[71.57197265625001,35.546826171875],[71.18505859375,36.04208984375],[71.23291015625,36.12177734375],[72.24980468750002,36.734716796875],[73.08961802927895,36.86435907947333]]]},"properties":{"name":"Pakistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.60327148437497,7.332812499999989],[-81.85205078125003,7.453320312500026],[-81.812158203125,7.59238281250002],[-81.72875976562494,7.62119140625002],[-81.60327148437497,7.332812499999989]]],[[[-78.89833984375002,8.27426757812502],[-78.960595703125,8.435839843749989],[-78.88325195312495,8.460253906249989],[-78.89833984375002,8.27426757812502]]],[[[-77.37421874999993,8.65830078125002],[-77.47851562499994,8.498437500000037],[-77.19599609374995,7.972460937500003],[-77.53828124999995,7.56625976562502],[-77.76191406249995,7.698828125000034],[-77.90117187499999,7.229345703125048],[-78.42158203124995,8.060986328125011],[-78.28735351562497,8.091796874999972],[-78.14189453125002,8.386083984374977],[-77.76054687499993,8.133251953124983],[-78.09946289062498,8.496972656250009],[-78.22304687500002,8.396630859374994],[-78.39921874999993,8.505664062500003],[-78.40986328124998,8.35532226562502],[-78.51406249999997,8.628173828125],[-79.08637695312495,8.997167968750034],[-79.50708007812494,8.97006835937502],[-79.68745117187493,8.850976562500009],[-79.81591796875,8.639208984375031],[-79.75043945312498,8.595507812500017],[-80.458984375,8.213867187499972],[-80.45810546875,8.077050781249994],[-80.01123046875,7.500048828125031],[-80.66669921874995,7.225683593750006],[-80.90122070312503,7.277148437500017],[-81.06386718749994,7.89975585937502],[-81.26840820312495,7.625488281250014],[-81.50415039062503,7.721191406249972],[-81.72763671875,8.137548828124977],[-82.15986328124995,8.19482421875],[-82.23544921874998,8.311035156250057],[-82.67954101562503,8.321972656249969],[-82.86611328124994,8.246337890625014],[-82.87934570312498,8.07065429687502],[-83.02734375,8.337744140624991],[-82.86162109374999,8.453515625000037],[-82.84477539062493,8.489355468749963],[-82.85571289062494,8.635302734375031],[-82.91704101562502,8.740332031250034],[-82.88198242187497,8.805322265625037],[-82.72783203125002,8.916064453125031],[-82.78305664062498,8.990283203124974],[-82.88134765625003,9.055859375000011],[-82.94033203124997,9.060107421874989],[-82.93984374999994,9.449169921875026],[-82.92504882812494,9.469042968749989],[-82.88896484374999,9.481005859375017],[-82.86015625,9.511474609375014],[-82.84399414062497,9.570800781250014],[-82.801025390625,9.591796875000028],[-82.64409179687502,9.505859375000028],[-82.56357421875003,9.576660156249972],[-82.50034179687503,9.523242187500017],[-82.37080078124993,9.428564453124991],[-82.33974609375,9.209179687499983],[-82.18813476562502,9.191748046874977],[-82.24418945312499,9.031494140625014],[-82.07788085937503,8.93486328124996],[-81.78022460937495,8.957226562499983],[-81.89448242187495,9.140429687500003],[-81.35478515624996,8.78056640624996],[-80.83867187499999,8.887207031250014],[-80.12709960937497,9.20991210937504],[-79.57729492187497,9.597851562500026],[-78.08276367187494,9.236279296874997],[-77.37421874999993,8.65830078125002]]]]},"properties":{"name":"Panama","childNum":3}},{"geometry":{"type":"Polygon","coordinates":[[[-73.137353515625,-6.4658203125],[-73.75810546874999,-6.90576171875],[-73.79301757812499,-7.135058593750003],[-73.758203125,-7.172753906250009],[-73.72041015625,-7.309277343750011],[-73.964306640625,-7.37890625],[-73.95849609375,-7.506640625],[-73.98173828124999,-7.535742187500006],[-74.00205078124999,-7.556054687500009],[-73.98173828124999,-7.585058593750006],[-73.946875,-7.611230468750009],[-73.89462890624999,-7.65478515625],[-73.82207031249999,-7.738964843750011],[-73.76689453124999,-7.753515625],[-73.72041015625,-7.782519531250003],[-73.73203125,-7.875390625],[-73.54912109374999,-8.345800781250006],[-73.39814453125,-8.458984375],[-73.36040039062499,-8.479296875],[-73.351708984375,-8.51416015625],[-73.35673828124999,-8.566992187500006],[-73.30244140625,-8.654003906250011],[-73.203125,-8.719335937500006],[-73.0705078125,-8.8828125],[-72.9740234375,-8.9931640625],[-72.970361328125,-9.1201171875],[-73.08984375,-9.265722656250006],[-73.209423828125,-9.411425781250003],[-72.379052734375,-9.51015625],[-72.181591796875,-10.003710937500003],[-71.33940429687499,-9.988574218750003],[-71.11528320312499,-9.852441406250009],[-71.041748046875,-9.81875],[-70.6369140625,-9.478222656250011],[-70.60791015625,-9.463671875],[-70.54111328124999,-9.4375],[-70.57016601562499,-9.48984375],[-70.592236328125,-9.54345703125],[-70.59916992187499,-9.620507812500009],[-70.642333984375,-11.01025390625],[-70.59653320312499,-10.976855468750003],[-70.53325195312499,-10.946875],[-70.45087890625,-11.024804687500009],[-70.39228515625,-11.05859375],[-70.3419921875,-11.066699218750003],[-70.29038085937499,-11.064257812500003],[-70.22006835937499,-11.04765625],[-70.06630859375,-10.982421875],[-69.9603515625,-10.929882812500011],[-69.839794921875,-10.933398437500003],[-69.6740234375,-10.9541015625],[-69.57861328125,-10.951757812500006],[-68.68525390625,-12.501953125],[-68.97861328124999,-12.880078125000011],[-69.07412109375,-13.682812500000011],[-68.87089843749999,-14.169726562500003],[-69.35947265624999,-14.7953125],[-69.37470703125,-14.962988281250006],[-69.17246093749999,-15.236621093750003],[-69.4208984375,-15.640625],[-69.21757812499999,-16.14912109375001],[-68.8427734375,-16.337890625],[-69.03291015625,-16.47597656250001],[-69.020703125,-16.6421875],[-69.62485351562499,-17.2001953125],[-69.645703125,-17.24853515625],[-69.521923828125,-17.388964843750003],[-69.510986328125,-17.46035156250001],[-69.51108398437499,-17.5048828125],[-69.5109375,-17.50605468750001],[-69.58642578125,-17.5732421875],[-69.684765625,-17.64980468750001],[-69.85209960937499,-17.70380859375001],[-69.80258789062499,-17.990234375],[-69.92636718749999,-18.2060546875],[-70.41826171874999,-18.34560546875001],[-71.33696289062499,-17.68251953125001],[-71.5322265625,-17.29433593750001],[-72.46767578125,-16.708105468750006],[-73.727685546875,-16.20166015625],[-75.104248046875,-15.411914062500003],[-75.533642578125,-14.89921875],[-75.93388671874999,-14.63359375],[-76.37646484375,-13.863085937500003],[-76.259228515625,-13.802832031250006],[-76.2236328125,-13.371191406250006],[-76.83212890624999,-12.348730468750006],[-77.152734375,-12.060351562500003],[-77.2203125,-11.663378906250003],[-77.633203125,-11.287792968750011],[-77.736083984375,-10.83671875],[-78.18559570312499,-10.089062500000011],[-78.76225585937499,-8.616992187500003],[-79.37724609374999,-7.835546875],[-79.99497070312499,-6.768945312500009],[-81.142041015625,-6.056738281250006],[-81.164306640625,-5.875292968750003],[-80.9306640625,-5.8408203125],[-80.88193359374999,-5.635058593750003],[-81.33662109375,-4.66953125],[-81.283203125,-4.322265625],[-80.503662109375,-3.49609375],[-80.324658203125,-3.387890625000011],[-80.24375,-3.576757812500006],[-80.19414062499999,-3.905859375],[-80.23051757812499,-3.924023437500011],[-80.26689453124999,-3.948828125],[-80.30327148437499,-4.005078125000011],[-80.43720703125,-3.978613281250006],[-80.49013671875,-4.010058593750003],[-80.510009765625,-4.069531250000011],[-80.49345703124999,-4.119140625],[-80.4884765625,-4.16552734375],[-80.453759765625,-4.205175781250006],[-80.35288085937499,-4.20849609375],[-80.44384765625,-4.335839843750009],[-80.4884765625,-4.393652343750006],[-80.47856445312499,-4.430078125],[-80.42416992187499,-4.46142578125],[-80.38349609375,-4.463671875],[-80.293359375,-4.416796875],[-80.1974609375,-4.31103515625],[-80.13955078125,-4.296093750000011],[-80.06352539062499,-4.327539062500009],[-79.962890625,-4.390332031250011],[-79.8451171875,-4.445898437500006],[-79.797265625,-4.476367187500003],[-79.71098632812499,-4.467578125],[-79.63852539062499,-4.454882812500003],[-79.57768554687499,-4.500585937500006],[-79.51616210937499,-4.539160156250006],[-79.501904296875,-4.670605468750011],[-79.45576171875,-4.766210937500006],[-79.3994140625,-4.840039062500011],[-79.33095703125,-4.927832031250006],[-79.26811523437499,-4.957617187500006],[-79.186669921875,-4.958203125000011],[-79.07626953124999,-4.990625],[-79.03330078124999,-4.969140625],[-78.995263671875,-4.908007812500003],[-78.97539062499999,-4.873242187500011],[-78.919189453125,-4.8583984375],[-78.92578125,-4.770703125000011],[-78.9076171875,-4.714453125],[-78.8615234375,-4.6650390625],[-78.68603515625,-4.562402343750009],[-78.64799804687499,-4.248144531250006],[-78.345361328125,-3.397363281250009],[-78.240380859375,-3.472558593750009],[-77.860595703125,-2.981640625000011],[-76.6791015625,-2.562597656250006],[-76.089794921875,-2.133105468750003],[-75.570556640625,-1.53125],[-75.42041015625,-0.962207031250003],[-75.40805664062499,-0.92431640625],[-75.24960937499999,-0.951855468750011],[-75.259375,-0.590136718750003],[-75.42470703125,-0.408886718750011],[-75.49106445312499,-0.248339843750003],[-75.56059570312499,-0.200097656250009],[-75.63203125,-0.157617187500009],[-75.62626953124999,-0.122851562500003],[-75.340478515625,-0.1421875],[-75.13837890625,-0.050488281250011],[-74.8017578125,-0.200097656250009],[-74.78046875,-0.24453125],[-74.75537109375,-0.298632812500003],[-74.691650390625,-0.335253906250003],[-74.616357421875,-0.370019531250009],[-74.555078125,-0.429882812500011],[-74.5138671875,-0.470117187500009],[-74.46518554687499,-0.517675781250006],[-74.41787109375,-0.580664062500006],[-74.334423828125,-0.850878906250003],[-74.28388671875,-0.927832031250006],[-74.24638671874999,-0.970605468750009],[-74.05439453125,-1.028613281250003],[-73.98681640625,-1.09814453125],[-73.926953125,-1.125195312500011],[-73.86318359375,-1.196679687500009],[-73.664306640625,-1.248828125],[-73.4962890625,-1.693066406250011],[-73.19697265625,-1.830273437500011],[-73.1544921875,-2.278222656250009],[-72.9896484375,-2.339746093750009],[-72.94111328125,-2.39404296875],[-72.21845703125,-2.400488281250006],[-71.98427734375,-2.3265625],[-71.93247070312499,-2.288671875],[-71.86728515624999,-2.227734375000011],[-71.802734375,-2.166308593750003],[-71.75253906249999,-2.152734375],[-71.55947265625,-2.22421875],[-71.39697265625,-2.334082031250006],[-71.19638671874999,-2.313085937500006],[-71.11337890624999,-2.245410156250003],[-71.027294921875,-2.225781250000011],[-70.96855468749999,-2.206835937500003],[-70.70537109374999,-2.341992187500011],[-70.64799804687499,-2.40576171875],[-70.57587890625,-2.418261718750003],[-70.29462890625,-2.552539062500003],[-70.24443359374999,-2.606542968750006],[-70.16474609375,-2.639843750000011],[-70.095849609375,-2.658203125],[-70.735107421875,-3.781542968750003],[-70.5296875,-3.866406250000011],[-70.48583984375,-3.869335937500011],[-70.42109375,-3.849609375],[-70.37919921874999,-3.81875],[-70.339501953125,-3.814355468750009],[-70.2984375,-3.84423828125],[-70.24028320312499,-3.882714843750009],[-70.16752929687499,-4.050195312500009],[-70.0171875,-4.162011718750009],[-69.96591796874999,-4.2359375],[-69.97202148437499,-4.301171875],[-70.00395507812499,-4.327246093750006],[-70.05332031249999,-4.333105468750006],[-70.12880859375,-4.28662109375],[-70.23916015625,-4.301171875],[-70.31689453125,-4.246972656250009],[-70.34365234375,-4.193652343750003],[-70.40463867187499,-4.150097656250011],[-70.5306640625,-4.167578125],[-70.72158203125,-4.158886718750011],[-70.79951171875,-4.17333984375],[-70.97368164062499,-4.350488281250009],[-71.8447265625,-4.50439453125],[-72.256787109375,-4.748925781250009],[-72.35283203124999,-4.786035156250009],[-72.468994140625,-4.901269531250009],[-72.608349609375,-5.009570312500003],[-72.69873046875,-5.0671875],[-72.83193359375,-5.09375],[-72.88706054687499,-5.122753906250011],[-72.9798828125,-5.634863281250006],[-73.16289062499999,-5.933398437500003],[-73.209375,-6.028710937500009],[-73.235546875,-6.0984375],[-73.137353515625,-6.4658203125]]]},"properties":{"name":"Peru","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[120.250390625,5.256591796875043],[119.82148437500004,5.06953125000004],[120.1652343750001,5.332421875000037],[120.250390625,5.256591796875043]]],[[[121.159375,6.075634765625011],[121.41103515625005,5.939843749999966],[121.29443359374997,5.869970703125034],[120.8763671875,5.95263671875],[121.159375,6.075634765625011]]],[[[122.09287109375012,6.428320312500006],[121.95917968750004,6.415820312500045],[121.83203125000003,6.664062499999986],[122.0583007812501,6.740722656249972],[122.32353515625002,6.602246093750011],[122.09287109375012,6.428320312500006]]],[[[122.93710937500006,7.409130859374983],[122.80468750000003,7.315966796875017],[122.82216796875,7.428466796875014],[122.93710937500006,7.409130859374983]]],[[[117.07988281250007,7.883398437499977],[117.02832031249997,7.807519531249966],[116.96953125000007,7.894921875],[116.9935546875,8.050537109375014],[117.07705078125,8.069140624999974],[117.07988281250007,7.883398437499977]]],[[[117.35527343750002,8.21464843749996],[117.28701171875,8.191015625000034],[117.28085937500006,8.314990234374974],[117.35527343750002,8.21464843749996]]],[[[124.80664062500003,9.142626953125003],[124.66582031250002,9.132324218750043],[124.65332031250003,9.225830078125],[124.80664062500003,9.142626953125003]]],[[[123.69765625000005,9.237304687500028],[123.61445312500004,9.103320312499989],[123.49345703125002,9.192089843750054],[123.69765625000005,9.237304687500028]]],[[[126.00595703125006,9.320947265625009],[126.19335937499997,9.276708984374963],[126.30458984375,8.952050781249994],[126.13955078125005,8.59565429687504],[126.36533203125012,8.483886718750014],[126.45869140625004,8.20283203125004],[126.43535156250002,7.832812499999974],[126.57011718750002,7.677246093749986],[126.58154296875003,7.247753906249969],[126.1920898437501,6.852539062500014],[126.18935546875,6.309667968749991],[125.82441406250004,7.333300781249989],[125.68925781250007,7.263037109374977],[125.38066406250007,6.689941406250014],[125.58847656250012,6.465771484374997],[125.66796874999997,5.97866210937498],[125.34648437500002,5.598974609374977],[125.23154296875006,6.069531250000011],[124.92734375000006,5.875341796874977],[124.21279296875,6.233251953124977],[124.078125,6.404443359375037],[123.98525390625,6.993701171875003],[124.20664062500006,7.396435546874983],[123.66582031250002,7.817773437500023],[123.49306640625,7.80791015624996],[123.39091796875007,7.407519531250017],[123.09667968749997,7.700439453125],[122.8429687500001,7.529296875000043],[122.79179687500002,7.72246093749996],[122.61621093749997,7.763134765624983],[122.14248046875,6.949658203124997],[121.96425781250005,6.96821289062504],[121.92460937500002,7.199511718750003],[122.24335937500004,7.945117187500031],[122.91113281250003,8.156445312499997],[123.05058593750002,8.433935546875048],[123.43457031249997,8.70332031250004],[123.84921875000006,8.432714843749977],[123.79941406250006,8.049121093749989],[124.19765625,8.229541015624974],[124.40488281250006,8.599853515625014],[124.7311523437501,8.562988281250043],[124.86894531250002,8.972265625000034],[125.141015625,8.86875],[125.20966796875004,9.027148437500017],[125.49873046875004,9.014746093749977],[125.47128906250006,9.756787109374983],[126.00595703125006,9.320947265625009]]],[[[126.059375,9.766210937500034],[125.99121093750003,9.838525390625023],[126.07382812500006,10.059228515625051],[126.1725585937501,9.79995117187498],[126.059375,9.766210937500034]]],[[[124.59384765625006,9.787207031249963],[124.1224609375,9.599316406249969],[123.93564453125012,9.623974609375011],[123.81718750000002,9.817382812499986],[124.17285156250003,10.135205078124983],[124.33574218750002,10.159912109375043],[124.57714843749997,10.026708984374991],[124.59384765625006,9.787207031249963]]],[[[125.69023437500007,9.914453125000037],[125.49482421875004,10.118701171875003],[125.66679687500002,10.440136718750026],[125.69023437500007,9.914453125000037]]],[[[119.91621093750004,10.485986328125037],[119.79316406250004,10.455273437499997],[119.85205078124997,10.64013671875],[120.00839843750012,10.570117187500031],[119.91621093750004,10.485986328125037]]],[[[122.64951171875012,10.472705078125003],[122.53837890625002,10.424951171875037],[122.5375,10.607568359375023],[122.70126953125006,10.740625],[122.64951171875012,10.472705078125003]]],[[[123.13085937500003,9.064111328124994],[122.99472656250006,9.058837890624986],[122.8666015625,9.319824218750043],[122.5625,9.482812500000037],[122.39951171875006,9.823046874999989],[122.47148437500007,9.961523437500034],[122.85556640625006,10.0869140625],[122.81699218750012,10.503808593750023],[122.98330078125,10.886621093750037],[123.25664062500007,10.99394531249996],[123.51064453125005,10.923046875],[123.5675781250001,10.780761718750057],[123.16201171875,9.864257812500028],[123.1498046875,9.606152343750026],[123.32050781250004,9.27294921875],[123.13085937500003,9.064111328124994]]],[[[123.37031250000004,9.449609375000023],[123.38623046874997,9.967089843750017],[124.03886718750002,11.273535156249991],[124.00498046875012,10.40009765625004],[123.70048828125007,10.128320312500009],[123.37031250000004,9.449609375000023]]],[[[123.75703125000004,11.28330078125002],[123.815625,11.15073242187502],[123.73671875,11.151464843749991],[123.75703125000004,11.28330078125002]]],[[[117.31113281250012,8.439599609375051],[117.21855468750007,8.367285156249963],[117.34990234375002,8.713574218749997],[119.22382812500004,10.477294921875043],[119.30566406250003,10.9736328125],[119.55332031250012,11.31352539062496],[119.52666015625002,10.953173828125003],[119.68691406250005,10.500341796875034],[119.36933593750004,10.327294921875037],[119.19150390625012,10.061083984374989],[118.78212890625005,9.91611328125002],[118.4349609375,9.256005859375009],[117.31113281250012,8.439599609375051]]],[[[119.86142578125006,11.52534179687504],[119.83066406250012,11.375683593750011],[119.72998046874997,11.431933593750017],[119.86142578125006,11.52534179687504]]],[[[124.574609375,11.343066406250031],[124.92998046875002,11.372851562499974],[125.02656250000004,11.21171875],[125.01318359374997,10.785693359374989],[125.26845703125005,10.307714843750048],[125.14257812499997,10.189453125000028],[124.9875,10.36757812499998],[125.02656250000004,10.033105468749966],[124.78076171874997,10.16806640625002],[124.78671875000012,10.781396484375009],[124.66269531250006,10.961962890625017],[124.44550781250004,10.923583984375014],[124.33066406250012,11.535205078125003],[124.574609375,11.343066406250031]]],[[[124.60839843750003,11.492187500000043],[124.48349609375006,11.485839843749986],[124.36035156250003,11.665917968749994],[124.5109375000001,11.687109375000048],[124.60839843750003,11.492187500000043]]],[[[122.49619140625006,11.615087890625034],[122.83808593750004,11.595654296874983],[122.89453125000003,11.44130859374998],[123.15830078125012,11.53554687499999],[123.11953125,11.286816406250026],[122.8029296875001,10.99003906249996],[122.76992187500005,10.823828125000034],[121.95400390625,10.444384765625003],[122.10351562499997,11.64291992187502],[121.91601562499997,11.854345703125006],[122.02919921875005,11.895410156250023],[122.49619140625006,11.615087890625034]]],[[[120.03876953125004,11.703320312499969],[119.94492187500006,11.690722656249989],[119.86093750000006,11.953955078124963],[120.03593750000002,11.917236328125028],[120.03876953125004,11.703320312499969]]],[[[120.1,12.167675781249983],[120.22822265625004,12.219824218750034],[120.31455078125012,12.012402343749969],[120.01054687500002,12.008251953125011],[119.88574218749997,12.299853515625003],[120.1,12.167675781249983]]],[[[122.65449218750004,12.309033203125011],[122.42294921875006,12.455078125],[122.60361328125006,12.49160156249998],[122.65449218750004,12.309033203125011]]],[[[125.23955078125002,12.527880859375003],[125.32021484375,12.321826171875031],[125.53564453125003,12.191406250000028],[125.49179687500006,11.594335937499977],[125.57353515625002,11.238232421874997],[125.73564453125002,11.049609375000017],[125.23339843749997,11.145068359375017],[125.03427734375012,11.341259765625026],[124.91699218750003,11.558398437500031],[124.99501953125,11.764941406250003],[124.445703125,12.152783203124969],[124.29472656250007,12.569335937500014],[125.23955078125002,12.527880859375003]]],[[[123.71660156250007,12.287353515625028],[124.04033203125002,11.966796875],[124.04550781250012,11.752441406250028],[123.47373046875006,12.21665039062502],[123.15781250000012,11.925634765624963],[123.23642578125012,12.583496093750057],[123.71660156250007,12.287353515625028]]],[[[122.09404296875002,12.354882812500023],[122.01396484375002,12.105615234375037],[121.9232421875,12.331298828125014],[122.00156250000006,12.598535156250009],[122.14501953124997,12.652636718750017],[122.09404296875002,12.354882812500023]]],[[[123.77539062499997,12.453906250000031],[123.77910156250002,12.366259765625031],[123.62148437500005,12.67490234375002],[123.77539062499997,12.453906250000031]]],[[[123.28183593750006,12.85341796874998],[123.36718750000003,12.70083007812498],[122.95751953124997,13.107177734374986],[123.28183593750006,12.85341796874998]]],[[[120.70439453125002,13.479492187499986],[121.20273437500006,13.432324218749969],[121.52275390625007,13.131201171874991],[121.540625,12.63818359375],[121.39433593750002,12.300585937499974],[121.23671875000005,12.218798828125003],[120.92216796875002,12.51162109374998],[120.65136718749997,13.169140625],[120.33847656250012,13.412353515624986],[120.40126953125,13.517041015624997],[120.70439453125002,13.479492187499986]]],[[[121.91484375000002,13.540332031250031],[122.11455078125002,13.463183593750031],[122.00488281249997,13.204980468750009],[121.82919921875006,13.328613281249972],[121.91484375000002,13.540332031250031]]],[[[124.35361328125006,13.632226562500009],[124.17539062500012,13.531542968750017],[124.03886718750002,13.663134765625003],[124.22490234375007,14.077587890624969],[124.41718750000004,13.871044921874997],[124.35361328125006,13.632226562500009]]],[[[122.03349609375002,15.005029296875009],[121.93300781250005,14.656054687500045],[121.83984374999997,15.038134765625003],[122.03349609375002,15.005029296875009]]],[[[121.10156249999997,18.615283203125017],[121.84560546875,18.29541015625003],[122.03847656250005,18.32792968749999],[122.14667968750004,18.486572265625],[122.26552734375005,18.458837890625034],[122.15234374999997,17.664404296875006],[122.51914062500012,17.124853515625034],[122.13515625000005,16.18481445312503],[121.59531250000012,15.933251953125023],[121.60703125000006,15.669824218749994],[121.39228515625004,15.324414062499969],[121.69541015625006,14.7373046875],[121.62792968749997,14.581152343749977],[121.76660156249997,14.16806640625002],[122.21171875000002,13.930175781250057],[122.2875,13.996191406250006],[122.19970703125003,14.148046875000034],[122.6271484375001,14.317529296875009],[122.93417968750012,14.18808593750002],[123.101953125,13.750244140624986],[123.29697265625012,13.836425781250043],[123.32031249999997,14.061669921875023],[123.81572265625002,13.837109375000011],[123.80625000000012,13.721728515625045],[123.54960937500007,13.645751953125014],[123.81923828125,13.269482421875011],[123.78515625000003,13.110546875000054],[124.14277343750004,13.035791015625009],[124.0597656250001,12.567089843749997],[123.87783203125005,12.689697265625014],[123.94853515625007,12.916406250000023],[123.31093750000005,13.044091796875009],[123.16328125000004,13.44174804687502],[122.59521484374997,13.90761718749998],[122.46796875000004,13.886718749999986],[122.66787109375,13.395361328124991],[122.59990234375002,13.194140625000031],[122.37656250000012,13.520605468750006],[121.77792968750006,13.93764648437498],[121.50107421875006,13.8421875],[121.344140625,13.649121093749997],[121.09550781250007,13.679492187500045],[120.84072265625,13.884716796875026],[120.637109375,13.804492187500031],[120.61679687500006,14.188037109375003],[120.9220703125001,14.493115234374983],[120.94130859375,14.645068359375031],[120.58369140625004,14.88125],[120.58867187500002,14.483105468749983],[120.43876953125002,14.453369140624972],[120.25078125000002,14.793310546875034],[120.08212890625012,14.851074218749986],[119.77255859375012,16.25512695312503],[119.83076171875004,16.326562500000023],[120.15976562500012,16.047656250000045],[120.36875,16.109570312499955],[120.35839843749997,17.63818359375],[120.59970703125012,18.507861328125074],[121.10156249999997,18.615283203125017]]],[[[121.92167968750007,18.89472656250001],[121.82519531250003,18.842724609374983],[121.94335937500003,19.010449218749955],[121.92167968750007,18.89472656250001]]],[[[121.52089843750005,19.361962890624994],[121.53125,19.271337890625006],[121.37460937500006,19.356298828124977],[121.52089843750005,19.361962890624994]]]]},"properties":{"name":"Philippines","childNum":37}},{"geometry":{"type":"Polygon","coordinates":[[[134.5954101562501,7.382031249999969],[134.51572265625012,7.525781250000037],[134.65117187500002,7.712109374999983],[134.5954101562501,7.382031249999969]]]},"properties":{"name":"Palau","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[153.53613281249997,-11.476171874999949],[153.75986328125006,-11.586328125],[153.55371093749997,-11.630566406249969],[153.28681640625004,-11.516992187500009],[153.20361328124997,-11.32412109374998],[153.53613281249997,-11.476171874999949]]],[[[154.28076171874997,-11.36142578125002],[154.12119140625006,-11.425683593749966],[154.02343750000003,-11.347949218750031],[154.28076171874997,-11.36142578125002]]],[[[150.89873046875002,-10.565332031250023],[150.88466796875,-10.643457031250037],[150.78574218750006,-10.603417968749966],[150.89873046875002,-10.565332031250023]]],[[[151.08095703125,-10.020117187499963],[151.29648437500012,-9.956738281250026],[151.230859375,-10.194726562500009],[150.95917968750004,-10.092578124999989],[150.77607421875004,-9.70908203125002],[151.08095703125,-10.020117187499963]]],[[[150.52841796875006,-9.34658203124998],[150.78867187500006,-9.417968749999957],[150.89404296875003,-9.667480468749986],[150.43623046875004,-9.624609374999949],[150.5084960937501,-9.536132812499957],[150.43730468750007,-9.359960937500034],[150.52841796875006,-9.34658203124998]]],[[[150.3454101562501,-9.493847656249955],[150.10976562500005,-9.361914062499991],[150.20830078125002,-9.206347656250003],[150.32011718750007,-9.264160156249972],[150.3454101562501,-9.493847656249955]]],[[[152.63095703125012,-8.959375],[152.95292968750007,-9.07011718749996],[152.96689453125006,-9.208984375000014],[152.51513671874997,-9.009863281250034],[152.63095703125012,-8.959375]]],[[[151.10683593750005,-8.733496093749949],[151.12412109375012,-8.804882812500011],[151.00498046875006,-8.523828124999952],[151.117578125,-8.41884765624998],[151.10683593750005,-8.733496093749949]]],[[[143.58681640625005,-8.481738281250003],[143.321875,-8.367578125],[143.5814453125,-8.390917968749974],[143.58681640625005,-8.481738281250003]]],[[[148.02578125,-5.826367187500011],[147.78105468750007,-5.627246093749946],[147.7946289062501,-5.492382812500011],[148.05478515625006,-5.61152343750004],[148.02578125,-5.826367187500011]]],[[[155.95761718750006,-6.686816406249989],[155.71933593750012,-6.862792968749957],[155.34404296875007,-6.721679687499986],[155.20214843750003,-6.3076171875],[154.75927734375003,-5.931347656249997],[154.72929687500002,-5.444433593750006],[155.09384765625006,-5.620214843750034],[155.46699218750004,-6.145117187500034],[155.82255859375002,-6.38046875000002],[155.95761718750006,-6.686816406249989]]],[[[147.17626953124997,-5.431933593749946],[147.00585937499997,-5.30703125],[147.1310546875001,-5.190820312500037],[147.17626953124997,-5.431933593749946]]],[[[154.64726562500002,-5.43271484375002],[154.54003906250003,-5.11083984375],[154.63261718750007,-5.013867187499955],[154.72714843750006,-5.218066406249989],[154.64726562500002,-5.43271484375002]]],[[[146.01933593750007,-4.726171874999963],[145.88359375000007,-4.66748046875],[145.9958007812501,-4.539257812499983],[146.01933593750007,-4.726171874999963]]],[[[151.915625,-4.296777343749966],[152.11718749999997,-4.212207031249974],[152.40566406250005,-4.340722656249952],[152.35117187500006,-4.82216796874998],[151.98369140625007,-5.07441406250004],[152.14296875,-5.357031249999963],[152.07705078125,-5.458300781249989],[151.86542968750004,-5.564843750000023],[151.51513671874997,-5.552343749999963],[151.22929687500002,-5.919921874999986],[150.47353515625,-6.263378906249969],[149.65253906250004,-6.290429687499966],[149.38232421874997,-6.078125],[149.0990234375,-6.116992187499989],[148.33720703125007,-5.669433593750014],[148.43203125,-5.471777343749991],[149.35888671875003,-5.583984375000014],[149.8314453125,-5.524121093749997],[149.96279296875,-5.447753906249972],[150.0900390625001,-5.011816406249977],[150.1703125,-5.070605468749974],[150.0724609375001,-5.309570312499986],[150.18310546874997,-5.523632812499983],[150.90029296875005,-5.447167968750037],[151.32656250000005,-4.96035156249998],[151.67119140625007,-4.88330078125],[151.59306640625007,-4.200781249999949],[151.915625,-4.296777343749966]]],[[[152.67060546875004,-3.13339843750002],[152.64619140625004,-3.221191406249957],[152.54326171875002,-3.095605468749952],[152.63876953125012,-3.042773437500031],[152.67060546875004,-3.13339843750002]]],[[[140.97617187500012,-9.11875],[140.97519531250006,-6.90537109375002],[140.86230468749997,-6.740039062499989],[140.975,-6.346093750000023],[140.97353515625,-2.803417968750026],[140.97343750000007,-2.609765625],[142.90517578125,-3.32070312499998],[143.50898437500004,-3.431152343750014],[144.06640625000003,-3.80517578125],[144.4777343750001,-3.82529296875002],[145.08779296875,-4.349121093749972],[145.33457031250012,-4.385253906249972],[145.7669921875,-4.823046874999989],[145.74521484375012,-5.402441406249977],[147.56669921875002,-6.056933593750003],[147.80205078125002,-6.31523437499996],[147.84550781250007,-6.662402343749989],[147.11914062499997,-6.721679687499986],[146.95361328124997,-6.834082031249963],[147.19003906250012,-7.378125],[148.12675781250007,-8.103613281249963],[148.246875,-8.554296875000034],[148.45117187499997,-8.694531250000011],[148.58310546875006,-9.051757812499957],[149.19833984375006,-9.03125],[149.26318359374997,-9.497851562499974],[150.01103515625007,-9.688183593750026],[149.76123046874997,-9.805859375000011],[149.87441406250005,-10.012988281250031],[150.84951171875,-10.236035156249997],[150.44609375000007,-10.30732421875004],[150.6471679687501,-10.517968749999966],[150.31992187500012,-10.654882812499963],[150.0167968750001,-10.577148437500028],[149.75410156250004,-10.353027343750028],[147.76865234375012,-10.070117187500031],[147.01718750000006,-9.38789062500004],[146.96376953125,-9.059570312499943],[146.63085937499997,-8.951171874999972],[146.03320312499997,-8.076367187500011],[144.97382812500004,-7.802148437500009],[144.86425781249997,-7.631542968749983],[144.50986328125006,-7.567382812499972],[144.14287109375007,-7.757226562500009],[143.65488281250012,-7.460351562500009],[143.94228515625005,-7.944238281250009],[143.8333984375,-8.029101562499974],[143.51816406250006,-8.000683593749955],[143.61376953125003,-8.200390624999969],[142.52412109375004,-8.32167968749998],[142.34746093750002,-8.167480468750014],[142.20683593750002,-8.195800781250014],[142.47480468750004,-8.369433593750031],[142.79794921875006,-8.345019531250031],[143.11181640624997,-8.474511718750037],[143.37724609375007,-8.762207031250028],[143.36621093750003,-8.961035156250034],[142.6471679687501,-9.327832031249969],[142.22958984375012,-9.169921874999957],[141.13320312500005,-9.221289062500034],[140.97617187500012,-9.11875]]],[[[152.96582031249997,-4.756347656249986],[152.89169921875006,-4.832421875000023],[152.73994140625004,-4.635839843750034],[152.66816406250004,-4.131835937500028],[152.27939453125006,-3.582421875],[151.06679687500005,-2.829003906249994],[150.74609374999997,-2.73886718750002],[150.8253906250001,-2.572949218749969],[152.03291015625004,-3.25136718749998],[153.01679687500004,-4.105664062500026],[153.1325195312501,-4.352441406250037],[152.96582031249997,-4.756347656249986]]],[[[150.43662109375012,-2.66181640625004],[150.16572265625004,-2.660253906249991],[149.96162109375004,-2.473828125000026],[150.22714843750006,-2.384179687499966],[150.42949218750007,-2.47041015625004],[150.43662109375012,-2.66181640625004]]],[[[147.06757812500004,-1.96015625],[147.43808593750012,-2.05898437499998],[147.20634765625007,-2.181933593749974],[146.54648437500012,-2.20859375],[146.65625,-1.97402343749998],[147.06757812500004,-1.96015625]]],[[[149.76542968750007,-1.553027343750017],[149.54589843749997,-1.471679687499957],[149.58095703125005,-1.353222656249983],[149.76542968750007,-1.553027343750017]]]]},"properties":{"name":"Papua New Guinea","childNum":21}},{"geometry":{"type":"Polygon","coordinates":[[[23.484667968750017,53.939794921875],[23.915429687500023,52.770263671875],[23.175097656250017,52.28662109375],[23.652441406250006,52.040380859375],[23.605273437500017,51.517919921875],[23.664453125000023,51.31005859375],[24.095800781250006,50.87275390625],[23.9970703125,50.809375],[24.089941406250006,50.53046875],[23.97265625,50.410058593749994],[23.711718750000017,50.37734375],[23.03632812500001,49.899072265624994],[22.706152343750006,49.606201171875],[22.6494140625,49.539013671875],[22.66064453125,49.483691406249996],[22.71992187500001,49.353808593749996],[22.732421875,49.295166015625],[22.705664062500006,49.171191406249996],[22.847070312500023,49.08125],[22.538671875,49.072705078125],[22.473046875000023,49.081298828125],[22.020117187500006,49.209521484374996],[21.6396484375,49.411962890625],[21.079394531250017,49.418261718749996],[20.868457031250017,49.314697265625],[20.36298828125001,49.38525390625],[20.0576171875,49.181298828124994],[19.756640625000017,49.204394531249996],[19.77392578125,49.37216796875],[19.44160156250001,49.597705078124996],[19.1494140625,49.4],[18.83222656250001,49.510791015624996],[18.562402343750023,49.879345703125],[18.0283203125,50.03525390625],[17.874804687500017,49.972265625],[17.627050781250006,50.11640625],[17.702246093750006,50.307177734374996],[17.41523437500001,50.254785156249994],[16.88007812500001,50.427050781249996],[16.989648437500023,50.2369140625],[16.63916015625,50.1021484375],[16.210351562500023,50.423730468749994],[16.419726562500017,50.573632812499994],[16.2822265625,50.655615234375],[16.007226562500023,50.611621093749996],[14.99375,51.01435546875],[14.98291015625,50.886572265625],[14.895800781250017,50.861376953124996],[14.809375,50.858984375],[14.814257812500017,50.871630859374996],[14.91748046875,51.008740234375],[14.9638671875,51.095117187499994],[14.935546875,51.435351562499996],[14.905957031250011,51.463330078125],[14.724707031250006,51.523876953125],[14.7109375,51.544921875],[14.738671875000023,51.6271484375],[14.601660156250006,51.832373046875],[14.752539062500006,52.081835937499996],[14.679882812500011,52.25],[14.615625,52.277636718749996],[14.573925781250011,52.31416015625],[14.554589843750023,52.359667968749996],[14.569726562500023,52.431103515625],[14.619433593750017,52.528515625],[14.514062500000023,52.64560546875],[14.253710937500017,52.782519531249996],[14.128613281250011,52.878222656249996],[14.138867187500011,52.932861328125],[14.293164062500011,53.0267578125],[14.368554687500023,53.10556640625],[14.410937500000017,53.199023437499996],[14.412304687500011,53.216748046875],[14.41455078125,53.283496093749996],[14.258886718750006,53.729638671875],[14.58349609375,53.63935546875],[14.558398437500017,53.823193359375],[14.21142578125,53.950341796875],[16.186328125000017,54.290380859375],[16.55976562500001,54.55380859375],[18.32343750000001,54.838183593749996],[18.75927734375,54.6845703125],[18.43623046875001,54.7447265625],[18.83642578125,54.369580078125],[19.604394531250023,54.4591796875],[20.20820312500001,54.420751953125],[22.16845703125,54.35986328125],[22.731835937500023,54.35009765625],[22.766210937500006,54.356787109375],[22.82373046875,54.395800781249996],[22.893945312500023,54.39052734375],[22.97675781250001,54.366357421875],[23.015527343750023,54.34833984375],[23.04218750000001,54.30419921875],[23.0875,54.299462890625],[23.170312500000023,54.2814453125],[23.282324218750006,54.24033203125],[23.3701171875,54.200488281249996],[23.45361328125,54.14345703125],[23.484667968750017,53.939794921875]]]},"properties":{"name":"Poland","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.42558593749999,18.105615234374994],[-65.57221679687493,18.137304687499977],[-65.29487304687501,18.133349609375045],[-65.42558593749999,18.105615234374994]]],[[[-66.12939453125003,18.444921875000034],[-65.62880859375,18.381396484375045],[-65.62084960937497,18.242333984374966],[-65.97080078124995,17.974365234375],[-67.196875,17.994189453125045],[-67.2640625,18.364599609375006],[-67.15864257812501,18.499218749999983],[-66.12939453125003,18.444921875000034]]]]},"properties":{"name":"Puerto Rico","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[130.52695312500012,42.535400390625],[130.68730468750007,42.30253906249999],[130.2357421875,42.183203125000034],[129.75634765624997,41.712255859375006],[129.70869140625004,40.857324218749994],[129.34111328125002,40.72631835937506],[128.51123046874997,40.130224609375006],[127.56816406250002,39.78198242187503],[127.39453125000003,39.207910156249966],[127.78613281250003,39.084130859374966],[128.37460937500012,38.6234375],[128.03896484375,38.30854492187498],[127.09033203125003,38.28388671875001],[126.63388671875012,37.78183593750006],[126.36992187500007,37.87836914062501],[126.11669921875003,37.74291992187503],[125.76914062500006,37.98535156250003],[125.35781250000005,37.72480468749998],[125.31074218750004,37.843505859375],[124.98876953124997,37.93144531249999],[125.2067382812501,38.08154296875],[124.69091796874997,38.12919921875002],[125.06738281250003,38.556738281250006],[125.55449218750002,38.68623046875001],[125.16884765625,38.80551757812506],[125.40966796875003,39.28837890625002],[125.36083984375003,39.52661132812497],[124.77529296875,39.75805664062506],[124.63828125000006,39.61508789062506],[124.36210937500002,40.004052734374994],[124.8893554687501,40.459814453125006],[125.98906250000002,40.904638671875034],[126.74306640625,41.724853515625],[126.95478515625004,41.76948242187501],[127.17968750000003,41.531347656250006],[128.14941406249997,41.38774414062496],[128.28925781250004,41.60742187500006],[128.04521484375007,41.9875],[128.92343750000006,42.038232421874966],[129.3136718750001,42.41357421874997],[129.69785156250012,42.448144531249994],[129.89824218750002,42.998144531250034],[130.24033203125006,42.891796874999955],[130.24667968750012,42.744824218749955],[130.52695312500012,42.535400390625]]]},"properties":{"name":"Dem. Rep. Korea","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.190869140624926,32.86860351562498],[-16.693261718749966,32.75800781250001],[-17.018261718749926,32.66279296874998],[-17.226025390624983,32.76684570312503],[-17.190869140624926,32.86860351562498]]],[[[-25.64897460937499,37.840917968750006],[-25.18193359374996,37.837890625],[-25.19072265624999,37.764355468749955],[-25.73447265624992,37.76289062500001],[-25.845898437499983,37.89404296875],[-25.64897460937499,37.840917968750006]]],[[[-28.14726562499996,38.45268554687502],[-28.064794921875034,38.412744140624966],[-28.454492187500023,38.40864257812504],[-28.54882812499997,38.51855468750003],[-28.14726562499996,38.45268554687502]]],[[[-28.641308593749983,38.525],[-28.842041015625,38.5984375],[-28.69775390625,38.638476562500045],[-28.641308593749983,38.525]]],[[[-27.07524414062496,38.643457031249994],[-27.38593750000001,38.765820312499955],[-27.127001953125017,38.78984375],[-27.07524414062496,38.643457031249994]]],[[[-31.137109374999937,39.40693359375001],[-31.282958984375,39.39409179687496],[-31.260839843750034,39.49677734375001],[-31.137109374999937,39.40693359375001]]],[[[-7.406152343749937,37.17944335937497],[-7.834130859374994,37.005712890625034],[-8.597656249999943,37.12133789062506],[-8.997802734375028,37.03227539062502],[-8.814160156249983,37.43081054687502],[-8.881103515624943,38.44667968750005],[-8.668310546874949,38.42431640625003],[-8.798876953124989,38.518164062500034],[-9.213281249999937,38.44809570312498],[-9.250390624999966,38.65673828125003],[-9.021484374999943,38.746875],[-8.79160156249992,39.07817382812502],[-9.13579101562496,38.74277343749998],[-9.35673828124996,38.697900390624994],[-9.479736328124972,38.79877929687501],[-9.374755859374972,39.338281249999966],[-8.837841796874926,40.11567382812498],[-8.684619140624989,40.75253906250006],[-8.755419921874932,41.69838867187502],[-8.887597656249937,41.76459960937501],[-8.777148437500017,41.941064453124994],[-8.266064453124983,42.13740234375001],[-8.152490234374937,41.81196289062498],[-7.40361328124996,41.833691406249955],[-7.147119140625023,41.98115234374998],[-6.61826171874992,41.9423828125],[-6.542187499999955,41.672509765624994],[-6.2125,41.53203125],[-6.928466796874972,41.009130859375006],[-6.8101562499999,40.343115234375034],[-7.032617187499966,40.16791992187498],[-6.896093749999949,40.02182617187506],[-6.975390624999932,39.79838867187502],[-7.117675781249972,39.681689453125045],[-7.53569335937496,39.66157226562501],[-6.997949218749994,39.05644531250002],[-7.343017578124943,38.45742187500002],[-7.106396484374983,38.181005859375006],[-6.957568359374932,38.18789062499999],[-7.44394531249992,37.72827148437497],[-7.406152343749937,37.17944335937497]]]]},"properties":{"name":"Portugal","childNum":7,"cp":[-8.7440694,39.9251454]}},{"geometry":{"type":"Polygon","coordinates":[[[-58.15976562499999,-20.164648437500006],[-58.13779296874999,-20.2373046875],[-58.12460937499999,-20.29345703125],[-58.09150390625,-20.33320312500001],[-58.05844726562499,-20.38613281250001],[-58.025390625,-20.415820312500003],[-58.00224609374999,-20.465429687500006],[-57.97905273437499,-20.657324218750006],[-57.91513671874999,-20.69033203125001],[-57.830224609374994,-20.99794921875001],[-57.94267578124999,-21.79833984375],[-57.95590820312499,-22.109179687500003],[-56.77519531249999,-22.261328125],[-56.44780273437499,-22.076171875],[-56.39487304687499,-22.09267578125001],[-56.35185546874999,-22.17861328125001],[-56.246044921875,-22.2646484375],[-56.18984375,-22.28115234375001],[-55.99140625,-22.28115234375001],[-55.84916992187499,-22.3076171875],[-55.75327148437499,-22.41015625],[-55.74663085937499,-22.5126953125],[-55.61767578125,-22.671484375],[-55.53828125,-23.58095703125001],[-55.518457031249994,-23.627246093750003],[-55.458886718749994,-23.68671875000001],[-55.4423828125,-23.792578125],[-55.4423828125,-23.865332031250006],[-55.415917968749994,-23.95136718750001],[-55.36630859374999,-23.991015625],[-55.28691406249999,-24.004296875],[-55.1943359375,-24.01748046875001],[-55.08188476562499,-23.99765625],[-54.982666015625,-23.97451171875001],[-54.62548828125,-23.8125],[-54.44023437499999,-23.90175781250001],[-54.37080078125,-23.97119140625],[-54.24179687499999,-24.047265625],[-54.281005859375,-24.30605468750001],[-54.43623046875,-25.12128906250001],[-54.47314453125,-25.22021484375],[-54.610546875,-25.432714843750006],[-54.615869140624994,-25.57607421875001],[-54.63193359374999,-26.00576171875001],[-54.677734375,-26.30878906250001],[-54.934472656249994,-26.70253906250001],[-55.1359375,-26.93115234375],[-55.426660156249994,-27.00927734375],[-55.450634765625,-27.068359375],[-55.496728515624994,-27.115332031250006],[-55.564892578125,-27.15],[-55.59726562499999,-27.207617187500006],[-55.59379882812499,-27.2880859375],[-55.63291015624999,-27.35712890625001],[-55.71464843749999,-27.41484375],[-55.789990234375,-27.41640625],[-55.95146484374999,-27.32568359375],[-56.1640625,-27.32148437500001],[-56.437158203124994,-27.553808593750006],[-58.16826171874999,-27.2734375],[-58.60483398437499,-27.31435546875001],[-58.641748046874994,-27.19609375],[-58.618603515625,-27.132128906250003],[-58.222070312499994,-26.65],[-58.18149414062499,-26.307421875],[-57.943115234375,-26.05292968750001],[-57.563134765624994,-25.473730468750006],[-57.821679687499994,-25.13642578125001],[-59.187255859375,-24.562304687500003],[-59.892480468749994,-24.093554687500003],[-60.83984375,-23.85810546875001],[-61.084716796875,-23.65644531250001],[-61.79853515625,-23.18203125],[-62.21416015624999,-22.612402343750006],[-62.372509765625,-22.43916015625001],[-62.54155273437499,-22.349609375],[-62.6259765625,-22.29042968750001],[-62.62568359375,-22.261523437500003],[-62.65097656249999,-22.233691406250003],[-62.27666015624999,-21.066015625],[-62.276318359375,-20.5625],[-61.7568359375,-19.6453125],[-60.00737304687499,-19.29755859375001],[-59.09052734375,-19.286230468750006],[-58.18017578125,-19.81787109375],[-58.15976562499999,-20.164648437500006]]]},"properties":{"name":"Paraguay","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[34.34833984375004,31.292919921874955],[34.2453125000001,31.208300781250045],[34.2125,31.292285156250017],[34.198144531249994,31.322607421875063],[34.47734375000002,31.584863281250023],[34.52412109375004,31.541650390624994],[34.5255859375001,31.52563476562503],[34.34833984375004,31.292919921874955]]],[[[34.88046875,31.3681640625],[34.950976562500074,31.60229492187503],[35.20371093750006,31.75],[35.1271484375001,31.816748046875006],[35.05322265625003,31.83793945312496],[34.983007812500006,31.816796875000023],[34.9611328125001,31.823339843750006],[34.95380859375004,31.84125976562504],[34.98974609374997,31.913281249999955],[34.955957031249994,32.1609375],[35.01054687500002,32.33818359375002],[35.06503906250006,32.46044921875006],[35.19326171875005,32.53442382812503],[35.303808593750006,32.512939453125],[35.38671875000003,32.493017578125034],[35.402636718750074,32.45063476562501],[35.484375,32.40166015624999],[35.5514648437501,32.39550781250006],[35.57207031250002,32.237890625],[35.450585937499994,31.479296875000017],[34.88046875,31.3681640625]]]]},"properties":{"name":"Palestine","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-149.321533203125,-17.690039062499963],[-149.177685546875,-17.736621093750045],[-149.18178710937497,-17.86230468749997],[-149.34111328125,-17.732421874999986],[-149.57890624999993,-17.734960937499963],[-149.635009765625,-17.564257812500003],[-149.37919921874993,-17.522363281249994],[-149.321533203125,-17.690039062499963]]],[[[-143.44057617187497,-16.619726562499963],[-143.38618164062498,-16.668847656250023],[-143.55068359375002,-16.62109374999997],[-143.44057617187497,-16.619726562499963]]],[[[-139.02431640624997,-9.695214843750037],[-138.82734375,-9.74160156249998],[-139.13408203124996,-9.829492187500037],[-139.02431640624997,-9.695214843750037]]],[[[-140.075634765625,-9.425976562499983],[-140.14438476562498,-9.359375],[-140.07094726562497,-9.328125],[-140.075634765625,-9.425976562499983]]],[[[-140.07260742187503,-8.910449218750031],[-140.21743164062497,-8.929687499999957],[-140.24003906249993,-8.79755859375004],[-140.057666015625,-8.801464843750026],[-140.07260742187503,-8.910449218750031]]]]},"properties":{"name":"Fr. Polynesia","childNum":5}},{"geometry":{"type":"Polygon","coordinates":[[[51.26796875000002,24.607226562500003],[51.17802734375002,24.58671875],[51.093359375,24.564648437499997],[51.02275390625002,24.565234375],[50.96601562500001,24.573925781249997],[50.928320312500006,24.595117187499994],[50.85566406250001,24.679638671874997],[50.80439453125001,24.789257812499997],[50.8359375,24.850390625],[50.846777343750006,24.888574218749994],[50.75458984375001,25.39926757812499],[51.003125,25.9814453125],[51.262304687500006,26.153271484374997],[51.543066406250006,25.902392578125003],[51.4853515625,25.524707031250003],[51.60888671875,25.052880859374994],[51.42792968750001,24.668261718750003],[51.26796875000002,24.607226562500003]]]},"properties":{"name":"Qatar","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[28.2125,45.450439453125],[28.317675781250017,45.347119140625],[28.451269531250006,45.2921875],[28.78828125000001,45.240966796875],[28.78173828125,45.309863281249996],[28.894335937500017,45.289941406249994],[29.223535156250023,45.4029296875],[29.403710937500023,45.419677734375],[29.567675781250017,45.37080078125],[29.705859375000017,45.259912109374994],[29.557519531250023,44.843408203124994],[29.048242187500023,44.757568359375],[29.0953125,44.975048828125],[28.891503906250023,44.91865234375],[28.585351562500023,43.742236328124996],[28.221972656250017,43.772851562499994],[27.88427734375,43.987353515624996],[27.425390625,44.0205078125],[27.0869140625,44.167382812499994],[26.2158203125,44.007275390625],[25.4970703125,43.670800781249994],[22.919042968750006,43.83447265625],[22.868261718750006,43.947900390624994],[23.02851562500001,44.077978515625],[22.705078125,44.23779296875],[22.687890625000023,44.248291015625],[22.494531250000023,44.435449218749994],[22.554003906250017,44.540332031249996],[22.6201171875,44.562353515625],[22.70078125,44.555517578125],[22.734375,44.569921875],[22.72089843750001,44.605517578124996],[22.64208984375,44.6509765625],[22.49765625,44.70625],[22.350683593750006,44.676123046875],[22.200976562500017,44.560693359374994],[22.093066406250017,44.541943359375],[21.909277343750006,44.66611328125],[21.636132812500023,44.71044921875],[21.52314453125001,44.790087890624996],[21.36005859375001,44.82666015625],[21.35791015625,44.86181640625],[21.384375,44.870068359375],[21.442187500000017,44.873388671875],[21.519921875000023,44.880810546875],[21.532324218750006,44.900683593749996],[21.35703125,44.990771484374996],[21.465429687500006,45.171875],[21.431445312500017,45.192529296874994],[20.794042968750006,45.46787109375],[20.775,45.749804687499996],[20.760156250000023,45.758105468749996],[20.746875,45.748974609375],[20.727832031250017,45.73740234375],[20.709277343750017,45.735253906249994],[20.652734375000023,45.77939453125],[20.581152343750006,45.869482421875],[20.35859375000001,45.975488281249994],[20.241796875,46.10859375],[20.28095703125001,46.1330078125],[20.508105468750017,46.166943359375],[20.613671875000023,46.13349609375],[20.76025390625,46.246240234374994],[21.121679687500006,46.282421875],[21.99970703125001,47.505029296874994],[22.87666015625001,47.947265625],[23.054785156250006,48.00654296875],[23.139453125000017,48.08740234375],[23.20263671875,48.084521484374996],[23.408203125,47.989990234375],[23.628710937500017,47.995849609375],[24.578906250000017,47.931054687499994],[24.979101562500006,47.72412109375],[25.464257812500023,47.910791015624994],[25.689257812500017,47.932470703125],[25.90869140625,47.967578125],[26.162695312500006,47.992529296875],[26.236230468750023,48.064355468749994],[26.276953125,48.113232421875],[26.3056640625,48.203759765624994],[26.4423828125,48.22998046875],[26.618945312500017,48.25986328125],[26.980761718750017,48.155029296875],[27.614062500000017,47.34052734375],[28.07177734375,46.978417968749994],[28.23945312500001,46.6408203125],[28.07470703125,45.598974609375],[28.2125,45.450439453125]]]},"properties":{"name":"Romania","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[146.71396484375012,43.743798828124994],[146.62197265625,43.81298828125006],[146.88408203125002,43.82915039062496],[146.71396484375012,43.743798828124994]]],[[[146.20761718750006,44.49765625],[146.5677734375,44.44042968749997],[145.91406249999997,44.10371093750004],[145.58681640625,43.84511718750002],[145.5558593750001,43.66459960937502],[145.46171875000007,43.870898437500045],[146.20761718750006,44.49765625]]],[[[148.59951171875,45.317626953125],[147.91376953125004,44.99038085937502],[147.65781250000012,44.97714843749998],[146.89746093750003,44.404296875],[147.24658203124997,44.856054687500006],[147.88554687500007,45.22563476562499],[147.9240234375001,45.38330078125006],[148.05605468750005,45.26210937500005],[148.32421874999997,45.28242187500001],[148.8122070312501,45.510009765625],[148.83710937500004,45.36269531250002],[148.59951171875,45.317626953125]]],[[[149.68769531250004,45.64204101562501],[149.44707031250002,45.593359375000034],[149.9623046875,46.02192382812504],[150.553125,46.208544921875045],[149.68769531250004,45.64204101562501]]],[[[152.00205078125006,46.89716796874998],[151.72343750000007,46.82880859375001],[152.28886718750007,47.1421875],[152.00205078125006,46.89716796874998]]],[[[154.81044921875005,49.31201171875],[154.61093750000006,49.29404296874998],[154.82490234375004,49.64692382812501],[154.81044921875005,49.31201171875]]],[[[155.9210937500001,50.30219726562501],[155.39716796875004,50.04125976562497],[155.24306640625,50.09462890625002],[155.21835937500012,50.29785156250003],[155.68017578124997,50.400732421875034],[156.096875,50.771875],[155.9210937500001,50.30219726562501]]],[[[156.40507812500002,50.65761718750005],[156.16796874999997,50.73188476562498],[156.37646484374997,50.86210937499996],[156.4875,50.84296874999998],[156.40507812500002,50.65761718750005]]],[[[142.76103515625002,54.393945312499966],[143.32470703125003,52.96308593749998],[143.15556640625002,52.08374023437497],[143.29951171875004,51.632373046875045],[143.81601562500006,50.28261718750002],[144.71376953125,48.64028320312502],[144.04873046875,49.249169921874994],[143.73232421875,49.31201171875],[143.10498046875003,49.198828125000034],[142.57421874999997,48.07216796875002],[142.55693359375002,47.737890625000034],[143.21767578125005,46.79487304687504],[143.48564453125002,46.752050781250006],[143.58066406250012,46.360693359375034],[143.43164062500003,46.02866210937498],[143.28232421875006,46.55898437500002],[142.57802734375005,46.700781250000034],[142.07714843749997,45.91704101562499],[141.83037109375002,46.451074218749966],[142.03867187500012,47.140283203124966],[141.9640625000001,47.58745117187502],[142.18173828125012,48.01337890625001],[141.86630859375006,48.750097656250006],[142.1422851562501,49.56914062499999],[142.06601562500006,50.630468750000034],[142.20673828125004,51.22255859375002],[141.72236328125004,51.73632812499997],[141.66083984375004,52.27294921874997],[141.85556640625012,52.79350585937499],[141.82353515625007,53.33950195312502],[142.1419921875,53.49560546875003],[142.52617187500002,53.44746093749998],[142.70595703125,53.89570312499998],[142.33496093749997,54.28071289062501],[142.76103515625002,54.393945312499966]]],[[[137.17861328125005,55.100439453125034],[137.05527343750006,54.9267578125],[136.71464843750002,54.956152343750034],[137.17861328125005,55.100439453125034]]],[[[137.94052734375012,55.092626953125034],[138.20615234375012,55.03354492187498],[137.72148437500007,54.66323242187505],[137.46269531250002,54.873388671875034],[137.23291015624997,54.79057617187496],[137.5773437500001,55.19702148437497],[137.94052734375012,55.092626953125034]]],[[[21.235742187500023,55.26411132812498],[22.072363281250034,55.06367187499998],[22.56728515625005,55.05913085937496],[22.82470703125,54.87128906249998],[22.684472656250023,54.56293945312504],[22.679882812500068,54.493017578125006],[22.766210937499977,54.356787109375034],[22.168457031250057,54.35986328125006],[21.14052734375008,54.39179687499998],[19.604394531250023,54.45917968750004],[19.974511718750023,54.92119140625002],[20.520312500000017,54.994873046875],[20.89980468750008,55.286669921875045],[20.957812500000074,55.27890625000006],[20.594824218750006,54.982373046874955],[20.995898437500017,54.90268554687506],[21.18886718750008,54.93520507812502],[21.235742187500023,55.26411132812498]]],[[[166.65029296875005,54.83906249999998],[166.64511718750006,54.69409179687503],[165.75107421875006,55.294531250000034],[166.27578125000005,55.311962890624955],[166.24804687499997,55.16542968750002],[166.65029296875005,54.83906249999998]]],[[[150.58994140625006,59.01875],[150.47021484375003,59.05405273437498],[150.66621093750004,59.16015625000003],[150.58994140625006,59.01875]]],[[[163.63515625000005,58.603369140625006],[163.47138671875004,58.509375],[163.7609375000001,59.01503906250002],[164.57265625,59.22114257812501],[164.61572265624997,58.885595703125034],[163.63515625000005,58.603369140625006]]],[[[35.8161132812501,65.18208007812501],[35.77871093750005,64.97666015625],[35.52890625000006,65.15107421875001],[35.8161132812501,65.18208007812501]]],[[[70.02070312500004,66.502197265625],[69.65136718750003,66.56533203125],[69.50273437500002,66.75107421875],[70.07666015624997,66.69589843750003],[70.02070312500004,66.502197265625]]],[[[-179.79853515625,68.9404296875],[-178.873876953125,68.75410156249995],[-178.69262695312503,68.54599609375],[-178.09746093750002,68.4248046875],[-178.05581054687497,68.26489257812503],[-177.79677734374997,68.33798828125],[-178.37304687500003,68.56567382812503],[-177.52724609375002,68.29438476562501],[-177.58920898437503,68.22421875],[-175.34521484375,67.67807617187503],[-175.37470703124998,67.35737304687498],[-175.00268554687494,67.4375],[-174.849853515625,67.34887695312503],[-174.92490234375,66.62314453125006],[-174.503759765625,66.537939453125],[-174.39409179687496,66.34423828124997],[-174.084765625,66.47309570312504],[-174.06503906249998,66.22958984374998],[-173.77397460937502,66.43466796875003],[-174.23159179687497,66.63188476562505],[-174.08642578125,66.94287109375],[-174.55009765624993,67.090625],[-173.6796875,67.144775390625],[-173.15781249999998,67.06909179687503],[-173.32353515625,66.95483398437503],[-173.25893554687497,66.84008789062503],[-173.19301757812497,66.99360351562504],[-172.5201171875,66.952490234375],[-173.00751953125,67.06489257812498],[-171.79555664062502,66.93173828125003],[-170.50952148437503,66.34365234375005],[-170.604443359375,66.24892578125002],[-170.30122070312504,66.29404296874998],[-170.24394531250002,66.16928710937503],[-169.777880859375,66.14311523437505],[-169.83168945312497,65.99892578124997],[-170.54067382812497,65.86542968749995],[-170.66630859375,65.62153320312501],[-171.42153320312502,65.81035156250002],[-171.10585937500002,65.51103515625005],[-171.90712890625,65.495947265625],[-172.78330078124998,65.68105468749997],[-172.23281250000002,65.45571289062497],[-172.30927734375004,65.27563476562497],[-172.66191406249993,65.24853515625006],[-172.28603515625002,65.20571289062502],[-172.21318359375,65.04814453124999],[-173.08579101562498,64.81733398437495],[-172.80107421874996,64.79052734375],[-172.90087890624994,64.62885742187501],[-172.40146484374998,64.413916015625],[-172.73916015624997,64.41225585937502],[-172.90317382812498,64.52607421875004],[-172.96005859375003,64.32768554687502],[-173.27548828124998,64.2896484375],[-173.327490234375,64.53955078125003],[-173.72973632812497,64.36450195312497],[-174.57055664062503,64.7177734375],[-175.39511718749998,64.80239257812502],[-175.85385742187498,65.01083984375003],[-176.09326171875,65.471044921875],[-177.05625,65.613623046875],[-177.48876953125,65.50371093749999],[-178.4125,65.49555664062501],[-178.93906249999998,66.03276367187505],[-178.74672851562497,66.01367187500006],[-178.52656250000004,66.40156250000004],[-178.86811523437498,66.18706054687502],[-179.14340820312503,66.37504882812505],[-179.327197265625,66.16259765625003],[-179.68330078124998,66.18413085937505],[-179.78969726562497,65.90087890625],[-179.352099609375,65.51674804687497],[-180,65.06723632812498],[-180,65.31196289062501],[-180,65.55678710937497],[-180,65.80156250000002],[-180,66.04628906250002],[-180,66.29106445312499],[-180,66.53583984375004],[-180,66.78056640625005],[-180,67.02534179687501],[-180,67.27011718750006],[-180,67.51484374999998],[-180,67.75961914062503],[-180,68.00439453124997],[-180,68.24912109375],[-180,68.49389648437497],[-180,68.738671875],[-179.999951171875,68.98344726562505],[-179.79853515625,68.9404296875]]],[[[50.265234375,69.18559570312502],[49.62626953125002,68.85971679687498],[48.91035156250004,68.74306640625002],[48.4390625,68.80488281249998],[48.319921875,69.26923828125001],[48.8449218750001,69.49472656250003],[49.22519531250006,69.51123046875],[50.265234375,69.18559570312502]]],[[[161.46708984375002,68.90097656250003],[161.08281250000007,69.4056640625],[161.50517578125007,69.63945312500002],[161.46708984375002,68.90097656250003]]],[[[169.20078125000006,69.58046875],[168.34804687500005,69.66435546875005],[167.86474609375003,69.90107421875004],[168.35791015625003,70.01567382812502],[169.37480468750007,69.88261718749999],[169.20078125000006,69.58046875]]],[[[60.450488281250074,69.93486328124999],[60.44023437500002,69.72592773437506],[59.637011718750074,69.72104492187503],[59.50263671875004,69.86621093750003],[58.952734375,69.89277343750004],[58.51992187500005,70.31831054687504],[59.04804687500004,70.46049804687505],[60.450488281250074,69.93486328124999]]],[[[52.90332031250003,71.36499023437503],[53.19257812500004,71.21528320312498],[53.0226562500001,70.96870117187501],[52.24960937500006,71.28491210937506],[52.90332031250003,71.36499023437503]]],[[[178.8615234375001,70.826416015625],[178.68388671875013,71.10566406250004],[180,71.53774414062505],[180,70.993017578125],[178.8615234375001,70.826416015625]]],[[[137.95986328125005,71.50766601562503],[137.71181640625005,71.4232421875],[137.06406250000006,71.52988281250003],[137.816796875,71.58789062500006],[137.95986328125005,71.50766601562503]]],[[[-178.87646484375,71.57705078124997],[-178.13388671874998,71.46547851562497],[-177.523583984375,71.16689453125],[-179.415673828125,70.91899414062502],[-179.999951171875,70.993017578125],[-179.999951171875,71.53774414062505],[-178.87646484375,71.57705078124997]]],[[[77.6325195312501,72.291259765625],[76.87109374999997,72.317041015625],[77.74853515625003,72.63120117187506],[78.36513671875005,72.48242187500003],[77.6325195312501,72.291259765625]]],[[[79.50146484374997,72.72192382812497],[78.63320312500005,72.85073242187502],[79.16425781250004,73.0943359375],[79.50146484374997,72.72192382812497]]],[[[74.660546875,72.87343750000002],[74.18066406250003,72.975341796875],[74.19853515625002,73.10908203124998],[74.9615234375,73.0625],[74.660546875,72.87343750000002]]],[[[120.26132812500012,73.08984374999997],[119.79208984375006,73.04541015624997],[119.64042968750002,73.12431640625007],[120.26132812500012,73.08984374999997]]],[[[55.31982421875003,73.30830078124998],[56.42958984375005,73.201171875],[56.121679687500006,72.80659179687498],[55.40332031249997,72.54907226562503],[55.29785156249997,71.93535156250005],[56.45439453125002,71.10737304687504],[57.62539062500005,70.72880859374999],[57.14589843750005,70.58911132812506],[56.38574218749997,70.73413085937503],[56.49970703125004,70.56640625000003],[55.687304687500074,70.69218749999999],[54.60117187500006,70.68007812500002],[53.383593750000074,70.87353515625],[53.670507812500006,71.08691406250003],[54.155664062499994,71.12548828125],[53.40996093750002,71.34013671875002],[53.41162109375003,71.530126953125],[51.93789062500005,71.47470703124998],[51.511328125,71.64809570312497],[51.58251953124997,72.07119140625],[52.252050781250006,72.12973632812503],[52.66191406250002,72.33686523437495],[52.91660156250006,72.66889648437501],[52.5792968750001,72.791357421875],[53.3698242187501,72.91674804687506],[53.2511718750001,73.182958984375],[54.80390625000004,73.38764648437498],[55.31982421875003,73.30830078124998]]],[[[70.67392578125006,73.09501953125005],[70.04072265625004,73.03715820312507],[69.99589843750002,73.359375],[70.94023437500002,73.51440429687503],[71.6261718750001,73.17397460937497],[70.67392578125006,73.09501953125005]]],[[[142.18486328125007,73.89589843750005],[143.34375,73.56875],[143.45146484375007,73.231298828125],[141.59667968750003,73.31083984375005],[140.66279296875004,73.45200195312503],[139.785546875,73.35522460937503],[141.08476562500002,73.86586914062497],[142.18486328125007,73.89589843750005]]],[[[83.5490234375001,74.07177734375],[82.8177734375,74.09160156250005],[83.14980468750005,74.151611328125],[83.5490234375001,74.07177734375]]],[[[141.01025390625003,73.99946289062501],[140.40947265625002,73.92167968750005],[140.1935546875001,74.23671875000002],[141.03857421875003,74.24272460937502],[141.01025390625003,73.99946289062501]]],[[[113.38720703124997,74.40043945312499],[112.78242187500004,74.09506835937503],[111.50341796874997,74.35307617187502],[111.87978515625,74.36381835937499],[112.08447265624997,74.54897460937505],[113.38720703124997,74.40043945312499]]],[[[86.653125,74.981298828125],[87.05214843750005,74.982568359375],[86.92714843750005,74.83076171874998],[86.25859375000002,74.89350585937498],[86.653125,74.981298828125]]],[[[82.17236328125003,75.41938476562501],[81.97851562499997,75.24711914062499],[81.65478515625003,75.28891601562498],[81.71210937500004,75.45141601562506],[82.165625,75.515625],[82.17236328125003,75.41938476562501]]],[[[146.79521484375007,75.37075195312505],[148.43242187500002,75.41352539062495],[148.59013671875007,75.23637695312502],[150.82236328125006,75.15654296875002],[150.64628906250002,74.944580078125],[149.596875,74.77260742187505],[148.296875,74.80043945312502],[146.14853515625012,75.19829101562499],[146.5375,75.58178710937506],[146.79521484375007,75.37075195312505]]],[[[135.9486328125,75.40957031250005],[135.45195312500007,75.38955078124997],[135.6986328125,75.84526367187499],[136.16894531249997,75.60556640625],[135.9486328125,75.40957031250005]]],[[[140.04873046875,75.82895507812503],[140.81591796874997,75.63071289062498],[141.48544921875012,76.13715820312495],[142.66953125000012,75.86342773437497],[143.68583984375002,75.86367187500002],[145.35996093750006,75.53046874999998],[144.01972656250004,75.04467773437506],[143.1703125,75.11689453125001],[142.72949218749997,75.33764648437506],[142.941796875,75.71328125000002],[142.30791015625007,75.69169921875005],[142.19882812500006,75.39267578124998],[143.12792968749997,74.9703125],[142.47275390625006,74.82041015625],[141.98730468750003,74.99125976562499],[140.26787109375002,74.846923828125],[139.68125,74.96406249999995],[139.09912109374997,74.65654296875002],[138.09228515625003,74.79746093750003],[136.94765625000005,75.32553710937498],[137.28974609375004,75.34863281249997],[137.26884765625002,75.7494140625],[137.70654296875003,75.75957031250002],[137.56054687499997,75.95522460937502],[138.20761718750006,76.11494140624995],[138.91953125000006,76.19672851562501],[140.04873046875,75.82895507812503]]],[[[96.5324218750001,76.278125],[96.30058593750002,76.121728515625],[95.31113281250006,76.21474609375002],[95.37988281250003,76.2890625],[96.5324218750001,76.278125]]],[[[112.47802734375003,76.62089843749999],[112.531640625,76.450048828125],[111.96894531250004,76.62617187500001],[112.47802734375003,76.62089843749999]]],[[[149.15019531250002,76.65991210937506],[148.39863281250004,76.64824218750007],[149.4064453125001,76.78208007812498],[149.15019531250002,76.65991210937506]]],[[[67.7653320312501,76.23759765624999],[61.35595703124997,75.31484375000002],[60.27685546875003,75.00756835937503],[60.501367187499994,74.90463867187503],[59.67402343750004,74.61015624999999],[59.24013671875005,74.69296874999998],[59.040429687499994,74.48554687500001],[58.53466796875003,74.49892578124997],[58.6178710937501,74.22739257812498],[57.76738281250002,74.013818359375],[57.755957031250006,73.769189453125],[57.313085937500006,73.838037109375],[57.54257812500006,73.65820312500003],[56.96386718750003,73.36655273437503],[56.43037109375004,73.29721679687503],[55.00683593750003,73.45385742187506],[54.29990234375006,73.35097656249997],[53.7628906250001,73.76616210937499],[54.64267578125006,73.95957031250006],[55.34091796875006,74.41962890624998],[56.13710937500005,74.49609375000003],[55.5822265625001,74.627685546875],[56.4987304687501,74.95708007812505],[55.81005859374997,75.12490234374997],[56.03554687499999,75.19423828124997],[56.57031250000003,75.09775390625003],[56.8444335937501,75.351416015625],[57.606835937499994,75.34125976562498],[58.05830078125004,75.6630859375],[58.88125,75.85478515625007],[60.27929687499997,76.09624023437505],[60.94218750000002,76.07128906250003],[61.20166015624997,76.28203125000007],[62.97148437500002,76.23666992187498],[64.4634765625,76.37817382812503],[67.65185546874997,77.011572265625],[68.48574218750005,76.93369140625003],[68.94169921875002,76.707666015625],[67.7653320312501,76.23759765624999]]],[[[96.28544921875002,77.02666015625007],[95.27031250000007,77.01884765624999],[96.52841796875006,77.20551757812501],[96.28544921875002,77.02666015625007]]],[[[89.51425781250006,77.18881835937498],[89.14169921875012,77.22680664062497],[89.61621093749997,77.31103515625],[89.51425781250006,77.18881835937498]]],[[[130.68730468750007,42.30253906249999],[130.52695312500012,42.535400390625],[130.42480468749997,42.72705078124997],[131.06855468750004,42.90224609375005],[131.25732421875003,43.378076171874994],[131.2552734375,44.07158203124999],[130.9816406250001,44.844335937500034],[131.44687500000012,44.984033203124966],[131.85185546875002,45.32685546875001],[132.93603515624997,45.029931640624994],[133.1134765625001,45.130712890625006],[133.18603515625003,45.49482421875004],[133.43642578125,45.60468750000004],[133.86132812500003,46.24775390625004],[134.1676757812501,47.30219726562501],[134.75234375,47.71542968749998],[134.56601562500006,48.02250976562502],[134.66523437500004,48.25390625],[134.29335937500005,48.37343750000002],[133.46835937500006,48.09716796875003],[133.14404296875003,48.10566406249998],[132.7072265625001,47.94726562500006],[132.47626953125004,47.714990234374994],[130.96191406249997,47.70932617187498],[130.7326171875001,48.01923828124998],[130.80429687500012,48.34150390624998],[130.5521484375,48.602490234374955],[130.553125,48.861181640625006],[130.1959960937501,48.89165039062499],[129.49814453125012,49.38881835937502],[129.0651367187501,49.374658203124966],[128.70400390625,49.60014648437499],[127.99960937500006,49.56860351562506],[127.55078124999997,49.801806640625045],[127.590234375,50.20898437500003],[127.33720703125007,50.35014648437502],[127.30703125000005,50.70795898437501],[126.92480468749997,51.10014648437496],[126.34169921875,52.36201171875001],[125.64902343750012,53.042285156250045],[125.075,53.20366210937496],[124.81230468750002,53.133837890625045],[123.6078125,53.546533203124994],[120.98544921875012,53.28457031250002],[120.09453125000007,52.787207031250034],[120.0675781250001,52.632910156250034],[120.65615234375,52.56665039062503],[120.74980468750007,52.096533203125006],[120.06689453125003,51.60068359375006],[119.16367187500006,50.40600585937503],[119.34628906250012,50.278955078124994],[119.25986328125012,50.06640625000003],[118.4515625,49.84448242187503],[117.8734375,49.51347656250002],[116.6833007812501,49.82377929687499],[116.551171875,49.92031250000002],[116.35117187500012,49.97807617187499],[116.21679687500003,50.00927734375003],[116.13457031250002,50.01079101562499],[115.9259765625001,49.95214843750003],[115.79521484375002,49.90590820312502],[115.71777343750003,49.88061523437503],[115.58798828125006,49.88603515624996],[115.42919921874997,49.89648437499997],[115.36503906250002,49.911767578124966],[115.27451171875006,49.948876953124994],[115.00332031250005,50.138574218749994],[114.74316406249997,50.23369140625002],[114.29707031250004,50.27441406250006],[113.57421874999997,50.00703125000001],[113.44550781250004,49.94160156250001],[113.31904296875004,49.87431640624999],[113.16416015625012,49.79716796874999],[113.09208984375007,49.692529296874994],[113.05556640625,49.61625976562499],[112.91484375000002,49.569238281249994],[112.80644531250007,49.52358398437502],[112.69736328125012,49.50727539062498],[112.49492187500002,49.532324218750034],[112.07968750000006,49.42421875000002],[111.42929687500006,49.342626953125034],[111.3366210937501,49.355859374999966],[111.20419921875012,49.304296875000034],[110.82792968750002,49.16616210937505],[110.70976562500002,49.14296875000002],[110.42783203125006,49.219970703125],[110.32138671875012,49.215869140625045],[110.19990234375004,49.17041015625003],[109.5287109375,49.269873046875034],[109.45371093750012,49.29633789062501],[109.23671875000005,49.334912109374955],[108.61367187500005,49.32280273437499],[108.52246093750003,49.34150390624998],[108.4069335937501,49.39638671875005],[107.96542968750012,49.65351562500004],[107.91660156250012,49.947802734375045],[107.63095703125012,49.98310546875004],[107.3470703125,49.986669921875034],[107.23330078125,49.989404296874994],[107.14306640625003,50.03300781249999],[107.04023437500004,50.086474609375045],[106.94130859375005,50.19667968750002],[106.71113281250004,50.312597656250006],[106.57441406250004,50.32880859375004],[106.36845703125002,50.317578124999955],[106.21787109375006,50.304589843749966],[105.38359375000002,50.47373046874998],[104.07871093750012,50.15424804687498],[103.63291015625006,50.138574218749994],[103.49628906250004,50.16494140625005],[103.42119140625002,50.18706054687502],[103.3043945312501,50.200292968750034],[102.28837890625007,50.58510742187502],[102.31660156250004,50.71845703125001],[102.21503906250004,50.82944335937506],[102.19453125000004,51.05068359375002],[102.15195312500006,51.107519531250034],[102.14238281250007,51.21606445312503],[102.16005859375005,51.260839843750006],[102.1556640625,51.31376953124996],[102.1115234375001,51.353466796874955],[101.97919921875004,51.382226562499966],[101.82119140625,51.421044921874966],[101.57089843750006,51.46718750000005],[101.38125,51.45263671875],[100.53623046875006,51.713476562500034],[100.46894531250004,51.72607421875003],[100.23037109375,51.729833984375006],[100.0345703125,51.73710937499996],[99.92167968750002,51.755517578124994],[99.71923828124997,51.87163085937502],[98.89316406250006,52.11728515625006],[98.64052734375005,51.80117187500005],[98.103125,51.483544921874994],[97.82529296875012,50.985253906249994],[97.953125,50.85517578124998],[98.02978515625003,50.64462890624998],[98.07890625000002,50.60380859375002],[98.14501953124997,50.56855468750001],[98.22050781250007,50.55717773437502],[98.2794921875001,50.53325195312502],[98.25029296875002,50.30244140624998],[98.00390625000003,50.01425781249998],[97.35976562500005,49.741455078125],[97.20859375000006,49.73081054687506],[96.98574218750005,49.88281250000003],[96.31503906250012,49.90112304687503],[96.06552734375006,49.99873046875001],[95.52265625000004,49.911230468750034],[95.11142578125012,49.935449218749994],[94.93027343750006,50.04375],[94.8112304687501,50.04819335937506],[94.71806640625002,50.04326171875002],[94.67548828125004,50.02807617187506],[94.61474609375003,50.02373046874996],[94.56464843750004,50.08793945312499],[94.35468750000004,50.221826171874994],[94.25107421875006,50.55639648437503],[93.103125,50.60390625000002],[92.94130859375005,50.77822265625002],[92.85644531250003,50.78911132812502],[92.77929687500003,50.778662109375006],[92.738671875,50.71093749999997],[92.68134765625004,50.683203125],[92.6266601562501,50.68828124999999],[92.57890625000002,50.725439453125006],[92.42636718750006,50.803076171875006],[92.35478515625002,50.86416015625002],[92.29580078125,50.84980468750004],[92.19238281249997,50.700585937499994],[91.80429687500006,50.693603515625],[91.4464843750001,50.52216796874998],[91.41503906249997,50.46801757812506],[91.34082031249997,50.470068359375034],[91.30058593750002,50.46337890625],[91.2337890625,50.45239257812497],[91.02158203125012,50.41547851562501],[90.83808593750004,50.32373046874997],[90.76074218749997,50.30595703124999],[90.71435546874997,50.25942382812502],[90.65507812500007,50.22236328125001],[90.05371093750003,50.09375],[89.64384765625002,49.90302734374998],[89.65410156250007,49.71748046875001],[89.57919921875006,49.69970703125003],[89.475,49.66054687500005],[89.39560546875006,49.61152343750001],[89.24394531250007,49.62705078125006],[89.20292968750007,49.59570312499997],[89.17998046875002,49.5322265625],[89.10947265625012,49.50136718750002],[89.00839843750006,49.472802734374994],[88.97060546875,49.483740234375006],[88.94541015625012,49.50766601562498],[88.90019531250002,49.53969726562502],[88.86386718750006,49.52763671874996],[88.83164062500012,49.44843749999998],[88.633203125,49.486132812500045],[88.19257812500004,49.451708984375045],[88.13554687500002,49.38149414062502],[88.11572265624997,49.25629882812501],[88.0285156250001,49.219775390625045],[87.98808593750002,49.186914062499994],[87.9347656250001,49.16455078124997],[87.81425781250002,49.162304687499955],[87.7625,49.16582031249996],[87.5158203125001,49.122412109375006],[87.41669921875004,49.07661132812501],[87.32285156250012,49.085791015625006],[86.62646484374997,49.56269531250001],[86.67548828125004,49.77729492187501],[86.1808593750001,49.49931640624996],[85.2326171875001,49.61582031249998],[84.9894531250001,50.061425781249994],[84.32324218749997,50.239160156249966],[83.94511718750007,50.774658203125],[83.35732421875005,50.99458007812504],[82.76083984375012,50.89335937500002],[82.49394531250007,50.72758789062499],[81.46591796875006,50.73984375],[81.38828125000006,50.95649414062501],[81.0714843750001,50.96875],[81.12724609375002,51.19106445312502],[80.73525390625,51.29340820312498],[80.44804687500002,51.18334960937503],[80.42363281250002,50.94628906249997],[79.98623046875,50.774560546874966],[77.85996093750006,53.269189453124994],[76.48476562500005,54.02255859374998],[76.42167968750007,54.151513671874966],[76.65458984375007,54.14526367187503],[76.8373046875,54.4423828125],[75.43720703125004,54.08964843749999],[75.22021484374997,53.89379882812506],[74.45195312500007,53.64726562500002],[74.35156250000003,53.487646484375006],[73.85898437500006,53.61972656249998],[73.40693359375004,53.44755859374999],[73.30566406250003,53.707226562499955],[73.71240234375003,54.04238281250002],[73.22988281250005,53.957812500000045],[72.62226562500004,54.13432617187502],[72.44677734375003,53.94184570312498],[72.18603515625003,54.32563476562501],[72.00449218750006,54.20566406249998],[71.09316406250005,54.21220703124999],[71.18554687500003,54.59931640624998],[70.73808593750007,55.30517578125],[70.18242187500002,55.162451171875034],[68.9772460937501,55.389599609374955],[68.20625,55.16093750000002],[68.15585937500006,54.97670898437505],[65.476953125,54.62329101562497],[65.08837890624997,54.340185546875034],[64.46123046875002,54.38417968750002],[61.92871093750003,53.94648437500004],[61.231054687500006,54.01948242187498],[60.97949218749997,53.62172851562505],[61.53496093750002,53.52329101562506],[61.22890625,53.445898437500006],[61.19921874999997,53.28715820312502],[61.65986328125004,53.22846679687504],[62.08271484375004,53.00541992187499],[61.047460937500006,52.97246093750002],[60.77441406249997,52.67578124999997],[60.99453125000005,52.33686523437504],[60.03027343749997,51.93325195312505],[60.464746093749994,51.651171875000045],[61.55468750000003,51.32460937500005],[61.38945312500002,50.86103515625001],[60.94228515625005,50.69550781250004],[60.42480468749997,50.67915039062498],[60.05859374999997,50.850292968749955],[59.812402343749994,50.58203125],[59.523046875,50.492871093749955],[59.4523437500001,50.62041015625002],[58.88369140625005,50.694433593750006],[58.359179687500074,51.063818359375034],[57.83886718750003,51.091650390625006],[57.44218750000002,50.88886718749998],[57.01171874999997,51.06518554687503],[56.49140625000004,51.01953124999997],[55.68623046875004,50.582861328125006],[54.64160156250003,51.011572265625034],[54.555273437500006,50.535791015624994],[54.139746093750006,51.04077148437503],[53.33808593750004,51.48237304687504],[52.57119140625005,51.481640624999955],[52.21914062499999,51.709375],[51.344531250000074,51.47534179687503],[51.16347656250005,51.6474609375],[50.79394531249997,51.729199218749955],[50.246875,51.28950195312498],[49.49804687500003,51.08359375000006],[49.32343750000004,50.851708984374966],[48.625097656250006,50.61269531250005],[48.7589843750001,49.92832031250006],[48.33496093750003,49.858251953125006],[47.7057617187501,50.37797851562502],[47.42919921874997,50.35795898437502],[46.889550781249994,49.69697265625001],[46.80205078125002,49.36708984375002],[47.031347656250006,49.150292968749994],[46.70263671875003,48.80556640625002],[46.660937500000074,48.41225585937502],[47.06464843750004,48.23247070312499],[47.292382812499994,47.74091796875004],[47.48193359374997,47.80390624999998],[48.16699218750003,47.70878906249996],[48.959375,46.77460937499998],[48.558398437500074,46.75712890624999],[48.54121093750004,46.60561523437502],[49.232226562500074,46.33715820312503],[48.683691406250006,46.08618164062497],[48.72958984375006,45.896826171875034],[48.4870117187501,45.93486328124996],[47.63330078124997,45.58403320312499],[47.46328125,45.67968750000003],[47.5294921875001,45.530224609374955],[47.3512695312501,45.21772460937498],[46.7072265625001,44.503320312499994],[47.30703125000005,44.103125],[47.462792968749994,43.55502929687498],[47.64648437500003,43.88461914062498],[47.463183593750074,43.03505859375002],[48.572851562500006,41.84448242187503],[47.79101562499997,41.19926757812502],[47.31767578125002,41.28242187500001],[46.74931640625002,41.812597656250006],[46.42988281250004,41.890966796875006],[46.21269531250002,41.989892578124994],[45.63857421875005,42.20507812500003],[45.63427734374997,42.234716796875034],[45.72753906249997,42.47504882812498],[45.70527343750004,42.49809570312496],[45.56289062499999,42.53574218749998],[45.34375,42.52978515625003],[45.16025390625006,42.675],[45.07158203125002,42.69414062500002],[44.94335937499997,42.73027343750002],[44.870996093749994,42.75639648437499],[44.850488281249994,42.746826171875],[44.77109375000006,42.61679687499998],[44.69179687499999,42.709619140624966],[44.64433593750002,42.734716796875034],[44.50585937500003,42.748632812500006],[44.329492187499994,42.703515624999966],[44.10273437500004,42.616357421874994],[44.004687500000074,42.59560546875002],[43.95742187500005,42.56655273437505],[43.825976562500074,42.571533203125],[43.759863281250006,42.593847656250006],[43.738378906250006,42.61699218750002],[43.74990234375005,42.65751953125002],[43.79541015624997,42.702978515625034],[43.78261718750005,42.747021484374955],[43.62304687500003,42.80771484374998],[43.5578125000001,42.844482421875],[43.089160156250074,42.9890625],[43.00019531250004,43.04965820312506],[42.991601562499994,43.09150390624998],[42.76064453125005,43.169580078124966],[41.58056640624997,43.21923828124997],[41.460742187500074,43.276318359374955],[41.35820312500002,43.33339843750005],[41.08310546875006,43.37446289062498],[40.94199218750006,43.41806640624998],[40.801660156249994,43.479931640624955],[40.64804687500006,43.53388671875004],[40.084570312500006,43.553125],[40.02373046875002,43.48486328125],[39.873632812500006,43.47280273437502],[38.71728515624997,44.28808593750003],[38.18125,44.41967773437503],[37.851464843749994,44.698828125000034],[37.49511718750003,44.69526367187504],[37.20478515625004,44.97197265624999],[36.62763671875004,45.15131835937504],[36.941210937500074,45.289697265624994],[36.72041015625004,45.371875],[36.8659179687501,45.42705078124999],[37.21357421875004,45.272314453125006],[37.6471679687501,45.37719726562506],[37.61240234375006,45.56469726562506],[37.93310546875003,46.001708984375],[38.014257812500006,46.047753906249966],[38.07958984375003,45.93481445312506],[38.18359374999997,46.09482421875006],[38.49228515625006,46.09052734374998],[37.913867187500074,46.40649414062503],[37.766503906249994,46.63613281250002],[38.50097656249997,46.663671875000034],[38.43867187500004,46.813085937500006],[39.29345703125003,47.105761718750045],[39.19570312499999,47.268847656250045],[39.023730468750074,47.27221679687503],[38.928320312500006,47.175683593749994],[38.55244140625004,47.15034179687498],[38.7619140625001,47.261621093749994],[38.21435546875003,47.091455078124966],[38.36884765625004,47.609960937500006],[38.90029296875005,47.85512695312502],[39.77871093750005,47.88754882812506],[39.95791015625005,48.268896484375034],[39.8356445312501,48.54277343749996],[39.6447265625001,48.591210937499966],[39.792871093749994,48.807714843750034],[40.00361328125004,48.82207031250002],[39.68652343749997,49.007910156250034],[40.10878906250005,49.251562500000034],[40.080664062500006,49.576855468749955],[39.780566406250074,49.57202148437503],[39.17480468750003,49.85595703124997],[38.91835937499999,49.82470703125],[38.258593750000074,50.05234375],[38.046875,49.92001953125006],[37.42285156249997,50.411474609375006],[36.619433593750074,50.209228515625],[36.1164062500001,50.408544921875006],[35.59111328125002,50.36875],[35.31191406250005,51.043896484374955],[35.0640625,51.203417968750045],[34.21386718750003,51.25537109375006],[34.12109375000003,51.67915039062498],[34.397851562499994,51.780419921874994],[33.735253906249994,52.344775390625045],[32.435449218749994,52.307226562500034],[32.12226562500004,52.05058593749996],[31.763378906250097,52.10107421875003],[31.758593750000017,52.125830078125034],[31.690625,52.22065429687498],[31.64990234374997,52.26220703125],[31.60156250000003,52.284814453124994],[31.57734375000004,52.31230468749999],[31.585546875,52.532470703125],[31.56484375,52.75922851562501],[31.53515624999997,52.798242187499966],[31.442773437499994,52.86181640625003],[31.35302734374997,52.93344726562498],[31.295117187500097,52.98979492187499],[31.25878906249997,53.01669921875006],[31.364550781250017,53.13896484375002],[31.388378906250097,53.18481445312503],[31.41787109375005,53.196044921875],[31.849707031250006,53.106201171875],[32.14199218750005,53.091162109375034],[32.46933593750006,53.270312500000045],[32.578027343749994,53.312402343749994],[32.644433593749994,53.32890624999999],[32.70429687500004,53.33632812499999],[32.45097656250002,53.6533203125],[32.20039062500004,53.78125],[31.99218750000003,53.796875],[31.82080078124997,53.79194335937498],[31.754199218750017,53.81044921875002],[31.825292968750006,53.93500976562501],[31.837792968749994,54.00078124999999],[31.825976562500074,54.030712890624955],[31.79199218749997,54.05590820312503],[31.62841796874997,54.111181640625006],[31.403613281250017,54.195947265624966],[31.299121093750017,54.29169921875001],[31.184765625000097,54.452978515625006],[31.074804687500063,54.491796875],[31.154882812500063,54.610937500000034],[31.152148437500017,54.625341796875034],[31.12128906250004,54.64848632812496],[30.984179687500074,54.695898437500034],[30.79882812499997,54.78325195312499],[30.79101562499997,54.806005859375006],[30.804492187500074,54.8609375],[30.829882812500017,54.91499023437498],[30.977734375000097,55.05048828124998],[30.977734375000097,55.08779296875002],[30.958886718749994,55.13759765625005],[30.87744140625003,55.223437500000045],[30.81445312499997,55.27871093750002],[30.81054687499997,55.306982421875006],[30.82099609375004,55.330273437499955],[30.900585937500097,55.397412109374955],[30.906835937500063,55.57001953125004],[30.625585937500006,55.666259765625],[30.23359375000004,55.84521484375006],[30.04267578125004,55.83642578125003],[29.93701171874997,55.84526367187499],[29.881640625000074,55.83232421875002],[29.82392578125004,55.79511718749998],[29.74414062499997,55.770410156249994],[29.630078125000097,55.75117187499998],[29.482226562500074,55.6845703125],[29.412988281249994,55.72485351562506],[29.35341796875005,55.784375],[29.375,55.938720703125],[28.284277343750006,56.055908203125],[28.14794921875003,56.142919921875034],[28.202050781250023,56.260400390624994],[28.191699218750045,56.31557617187505],[28.169238281250017,56.386865234374994],[28.11083984375,56.51069335937501],[28.103125,56.545703125000045],[27.89208984375003,56.741064453125034],[27.88154296875001,56.82416992187501],[27.848632812500057,56.85341796875002],[27.806054687499994,56.86708984375005],[27.639453125000074,56.84565429687504],[27.83027343750004,57.19448242187505],[27.83828125000008,57.247705078124966],[27.82861328124997,57.293310546875006],[27.796875,57.316943359375045],[27.538671875000063,57.429785156250034],[27.51113281250005,57.508154296875006],[27.469726562500057,57.524023437500034],[27.35195312500005,57.528125],[27.4,57.66679687499999],[27.542089843750063,57.799414062500006],[27.778515625000068,57.87070312500006],[27.502441406250057,58.221337890624994],[27.434179687500006,58.787255859374994],[28.15107421875004,59.374414062499966],[28.0125,59.484277343749966],[28.05800781250008,59.781542968750045],[28.334570312500034,59.69252929687502],[28.518164062500034,59.849560546874955],[28.947265625000057,59.828759765624994],[29.147265625000045,59.999755859375],[30.12255859374997,59.873583984375074],[30.172656250000017,59.957128906250034],[29.72119140624997,60.19531249999997],[29.069140625000017,60.19145507812499],[28.643164062500006,60.375292968750045],[28.512792968750006,60.67729492187502],[27.797656250000074,60.53613281250003],[29.69013671875004,61.54609375000001],[31.18671875000004,62.48139648437504],[31.533984375000017,62.885400390624994],[31.180859375000097,63.208300781250074],[29.991503906250074,63.73515625000002],[30.50390625000003,64.02060546875],[30.513769531250006,64.2],[30.04189453125005,64.44335937499997],[30.072851562500063,64.76503906250005],[29.60419921875004,64.968408203125],[29.826953125000017,65.14506835937502],[29.608007812500006,65.248681640625],[29.715917968750063,65.62456054687502],[30.102734375000097,65.72626953125004],[29.066210937500045,66.89174804687497],[29.988085937500017,67.66826171874999],[29.343847656250006,68.06186523437506],[28.685156250000034,68.189794921875],[28.470703125000057,68.48837890625],[28.77285156250005,68.84003906249995],[28.414062500000057,68.90415039062506],[28.96582031250003,69.02197265625],[29.38828125,69.29814453125005],[30.08730468750005,69.43286132812503],[30.18017578124997,69.63583984375],[30.860742187499994,69.53842773437503],[30.869726562500006,69.78344726562506],[31.546972656250063,69.696923828125],[31.997949218749994,69.80991210937503],[31.98457031250004,69.95366210937499],[33.00781249999997,69.72211914062498],[32.91503906249997,69.60170898437497],[32.17675781250003,69.67402343749995],[32.37773437500002,69.47910156250003],[32.99980468750002,69.4701171875],[32.97890625000005,69.367333984375],[33.45429687500004,69.42817382812495],[33.14121093750006,69.068701171875],[33.684375,69.31025390625001],[35.85791015625003,69.19174804687503],[37.73056640625006,68.69213867187503],[38.43017578125003,68.35561523437505],[39.568945312500006,68.07172851562501],[39.82333984375006,68.05859375],[39.80927734375004,68.15083007812498],[40.38066406250002,67.831884765625],[40.96640625000006,67.71347656250003],[41.358789062499994,67.20966796874998],[41.18896484375003,66.82617187500003],[40.10332031250002,66.29995117187502],[38.65390625000006,66.06904296874995],[35.51347656250002,66.39580078125002],[34.82460937499999,66.61113281249999],[34.48261718750004,66.55034179687505],[34.4515625,66.651220703125],[33.15019531250002,66.84394531250001],[32.93046875000002,67.08681640625002],[31.895312500000074,67.16142578125002],[33.65595703125004,66.44262695312506],[33.36054687500004,66.32954101562501],[34.112695312499994,66.225244140625],[34.69179687500005,65.95185546874998],[34.77695312500006,65.76826171874998],[34.40644531250004,65.39575195312503],[35.03535156250004,64.44023437500005],[35.802050781250074,64.3353515625],[36.3649414062501,64.00283203125002],[37.44218750000002,63.813378906249966],[37.9679687500001,63.949121093749994],[38.0622070312501,64.09101562499995],[37.953710937500006,64.32011718749999],[37.183691406250006,64.40849609375007],[36.6242187500001,64.75053710937502],[36.534570312499994,64.93862304687497],[36.88281249999997,65.17236328124997],[39.7580078125001,64.57705078125002],[40.05781250000004,64.77075195312497],[40.44492187500006,64.7787109375],[39.7980468750001,65.349853515625],[39.816503906250006,65.59794921874999],[41.4757812500001,66.12343750000002],[42.21054687500006,66.51967773437502],[43.23320312500002,66.41552734375003],[43.653125,66.2509765625],[43.54189453125005,66.12338867187503],[43.84375,66.14238281249999],[44.10439453125005,66.00859374999999],[44.42929687500006,66.93774414062503],[43.7824218750001,67.25449218749998],[44.20468750000006,68.25375976562498],[43.33320312500004,68.67338867187502],[44.04804687500004,68.54882812499997],[45.891992187499994,68.47968750000001],[46.69042968750003,67.84882812500001],[45.52871093750005,67.75756835937497],[44.90214843750002,67.41313476562505],[45.56220703125004,67.18559570312507],[45.88535156250006,66.89106445312501],[46.4923828125001,66.80019531249997],[47.65585937500006,66.97592773437498],[47.87470703125004,67.58417968749998],[48.83320312500004,67.681494140625],[48.75429687500005,67.89594726562501],[49.15527343750003,67.87041015625005],[51.994726562500006,68.53876953124995],[52.3966796875001,68.35170898437505],[52.72265624999997,68.484033203125],[52.34404296875002,68.60815429687497],[53.80195312500004,68.99589843750002],[54.49121093750003,68.992333984375],[53.797656250000074,68.90747070312503],[53.9308593750001,68.43554687499997],[53.260546875000074,68.26748046875002],[54.476171875,68.29414062499995],[54.86132812500003,68.20185546874998],[55.418066406250006,68.56782226562501],[56.04365234375004,68.64887695312501],[57.126855468749994,68.55400390625005],[58.17304687500004,68.88974609375006],[59.0573242187501,69.00605468750004],[59.37050781250005,68.73837890625003],[59.09902343750005,68.4443359375],[59.725683593750006,68.35161132812502],[59.89599609374997,68.70634765624999],[60.489160156249994,68.72895507812498],[60.93359374999997,68.98676757812501],[60.17060546875004,69.59091796875],[60.90908203125005,69.84711914062495],[64.19042968750003,69.53466796875],[64.89628906250002,69.247802734375],[67.00244140625003,68.87358398437505],[68.37119140625006,68.31425781250005],[69.14052734375005,68.95063476562501],[68.54277343750002,68.96708984374999],[68.00585937499997,69.48002929687505],[67.62412109375,69.58442382812501],[67.06445312500003,69.69370117187498],[66.89667968750004,69.55380859374998],[67.28476562500006,70.73872070312498],[67.14335937500002,70.83754882812502],[66.70224609375006,70.81850585937497],[66.63964843749997,71.08139648437498],[68.2692382812501,71.68281250000001],[69.61181640625003,72.98193359375],[69.73828124999997,72.88496093749998],[71.5001953125001,72.91367187500003],[72.812109375,72.69140624999997],[72.57412109375,72.01254882812506],[71.86728515625,71.457373046875],[72.70449218750005,70.96323242187498],[72.5767578125,68.96870117187498],[73.59169921875005,68.48188476562501],[73.13945312500002,68.18134765624998],[73.06679687500005,67.766943359375],[71.84746093750002,67.00761718750005],[71.36523437500003,66.96152343749998],[71.53955078125003,66.68310546875],[70.72490234375007,66.51943359374997],[70.38281249999997,66.60249023437501],[70.69072265625002,66.74531249999998],[70.2833984375001,66.68579101562503],[69.8771484375001,66.84545898437506],[69.21777343749997,66.82861328125],[69.01347656250002,66.78833007812503],[69.19433593749997,66.57866210937505],[70.33945312500006,66.34238281250006],[71.35800781250006,66.35942382812505],[71.91699218749997,66.24672851562502],[72.32158203125002,66.33212890625],[72.4173828125,66.56079101562506],[73.79208984375,66.99531250000001],[74.07451171875007,67.41411132812499],[74.76953124999997,67.76635742187497],[74.39140625000007,68.42060546874995],[74.57958984375003,68.751220703125],[76.10751953125006,68.975732421875],[76.45917968750004,68.97827148437497],[77.2384765625001,68.46958007812498],[77.17441406250012,67.77851562499998],[77.77158203125006,67.57026367187501],[78.92246093750006,67.58911132812503],[77.58828125000005,67.75190429687498],[77.66484375000002,68.19038085937495],[77.99511718749997,68.25947265624998],[77.65068359375007,68.90302734375001],[76.00097656249997,69.23505859374998],[75.42001953125,69.23862304687498],[74.81484375,69.09057617187503],[73.83603515625006,69.143212890625],[73.578125,69.80297851562503],[74.34335937500006,70.57871093749998],[73.08623046875007,71.44492187500006],[73.67177734375,71.84506835937503],[74.99218749999997,72.14482421874999],[74.78681640625004,72.811865234375],[75.15244140625,72.85273437499998],[75.74140625000004,72.29624023437503],[75.273828125,71.95893554687495],[75.33203125000003,71.34174804687498],[76.92900390625002,71.12788085937504],[77.58964843750007,71.16791992187501],[78.32060546875002,70.93041992187503],[78.94218750000002,70.93378906250001],[79.08388671875,71.00200195312505],[78.58769531250007,70.993896484375],[78.21259765625004,71.26630859374998],[76.43339843750002,71.55249023437503],[76.03242187500004,71.91040039062503],[76.87138671875002,72.03300781250005],[77.77753906250004,71.83642578125006],[78.23242187500003,71.95229492187502],[78.01640625000007,72.092041015625],[77.49287109375004,72.07172851562504],[77.47158203125,72.19213867187506],[78.22539062500007,72.37744140625006],[79.4220703125001,72.38076171875002],[80.7625,72.08916015625002],[81.66162109374997,71.71596679687502],[82.75781250000003,71.76411132812498],[83.23359375000004,71.66816406249995],[82.32285156250006,71.26000976562503],[82.16318359375012,70.59814453125003],[82.22119140625003,70.39570312499998],[82.86914062499997,70.95483398437503],[83.03017578125,70.58051757812498],[82.6823242187501,70.21772460937498],[83.0807617187501,70.09301757812497],[83.07382812500012,70.276708984375],[83.73593750000006,70.54648437499998],[83.15126953125005,71.10361328124998],[83.534375,71.68393554687498],[83.20029296875012,71.87470703125004],[82.64541015625005,71.92524414062504],[82.09365234375,72.26542968750005],[80.82705078125005,72.48828124999997],[80.84160156250007,72.94916992187498],[80.4245117187501,73.23115234374998],[80.5832031250001,73.56845703125003],[85.20058593750005,73.72153320312506],[86.89296875,73.88710937500002],[85.79257812500012,73.438330078125],[86.67705078125002,73.10678710937503],[85.93896484374997,73.45649414062495],[87.12011718750003,73.61503906250002],[87.57119140625,73.81074218750001],[86.57109375000007,74.24375],[86.0013671875,74.316015625],[86.39580078125007,74.45009765624997],[86.89794921874997,74.32534179687497],[87.22968750000004,74.3638671875],[85.79101562499997,74.6451171875],[86.20126953125006,74.81621093750005],[86.65146484375012,74.68242187500005],[87.04179687500007,74.77885742187499],[87.46757812500002,75.01323242187505],[86.93906250000006,75.06811523437503],[87.00595703125012,75.16982421874997],[87.67138671874997,75.12958984375004],[90.18496093750005,75.59106445312497],[94.07519531249997,75.91289062499999],[92.89042968750002,75.90996093750002],[93.25927734375003,76.09877929687502],[95.57871093750012,76.13730468749998],[96.07548828125007,76.08198242187498],[95.65332031250003,75.89218750000003],[96.50859375000002,76.00556640624995],[96.49707031249997,75.89121093750003],[98.66201171875005,76.24267578125003],[99.77041015625,76.02875976562498],[99.5407226562501,75.79858398437497],[99.85136718750007,75.93027343749998],[99.8253906250001,76.13593749999995],[98.80566406250003,76.48066406250004],[100.84375,76.52519531250005],[101.59775390625006,76.43920898437503],[100.92802734375002,76.55673828124998],[100.98994140625004,76.99047851562497],[102.61015625000007,77.508544921875],[104.01455078125,77.73041992187501],[106.05957031249997,77.39052734375002],[104.20244140625002,77.101806640625],[106.9416015625001,77.034375],[107.42978515625006,76.92656250000002],[106.41357421874997,76.51225585937499],[107.72216796875003,76.52231445312498],[108.18164062500003,76.73784179687502],[111.39248046875,76.686669921875],[112.09394531250004,76.48032226562506],[111.94267578125002,76.38046875000003],[112.61953125,76.38354492187506],[112.65625,76.05356445312498],[113.2726562500001,76.25166015625001],[113.5638671875,75.89165039062502],[113.85722656250007,75.92128906250002],[113.56757812500004,75.56840820312499],[112.45302734375,75.83017578125003],[112.95566406250006,75.571923828125],[113.24296875000007,75.61142578125003],[113.72617187500012,75.45063476562498],[112.92490234375012,75.01503906249997],[109.84033203124997,74.32197265624998],[109.8102539062501,74.16918945312503],[108.19951171875002,73.69409179687497],[107.27109375000006,73.62104492187501],[106.67939453125004,73.3306640625],[106.1886718750001,73.3080078125],[105.14394531250005,72.77705078125001],[105.7082031250001,72.836669921875],[106.47792968750005,73.13940429687503],[107.750390625,73.17314453125007],[109.33105468749997,73.48745117187497],[109.85527343750002,73.47246093750002],[110.86816406249997,73.73071289062497],[109.70673828125004,73.74375],[110.2614257812501,74.01743164062503],[111.05625,73.93935546875002],[111.13085937500003,74.05283203125003],[111.55058593750007,74.02851562499998],[111.22812500000012,73.96855468750002],[111.40039062500003,73.827734375],[112.14726562500007,73.70893554687498],[112.79541015625003,73.74609375],[112.83593750000003,73.96206054687502],[113.03281250000006,73.91386718750007],[113.4162109375001,73.647607421875],[113.15693359375004,73.45957031249998],[113.49091796875004,73.34609375000002],[113.12783203125,72.8306640625],[113.66455078124997,72.63452148437503],[113.2155273437501,72.80585937500001],[113.88623046875003,73.34580078124998],[113.51035156250012,73.50498046874998],[115.33769531250007,73.70258789062501],[118.87089843750007,73.53789062500002],[118.45703124999997,73.46440429687507],[118.43027343750012,73.24653320312501],[119.750390625,72.97910156250006],[122.26015625,72.88056640624995],[122.75195312500003,72.906494140625],[122.61523437499997,73.02792968750006],[123.1603515625001,72.95488281250002],[123.62226562500004,73.19326171875],[123.49111328125005,73.666357421875],[124.54121093750004,73.75126953125007],[125.59853515625005,73.447412109375],[126.25449218750012,73.548193359375],[126.55253906250007,73.33491210937498],[127.03134765625006,73.54746093750003],[127.74033203125012,73.48154296875],[129.10058593750003,73.11235351562502],[128.5990234375,72.895166015625],[129.01728515625004,72.8724609375],[129.250390625,72.70517578125003],[128.41826171875002,72.53515625000003],[129.28134765625006,72.43769531249998],[129.41064453124997,72.16630859375002],[128.93496093750005,72.07949218750002],[127.8034179687501,72.43403320312504],[127.84140625000012,72.308251953125],[128.91142578125002,71.75532226562495],[129.21025390625007,71.91694335937501],[129.46083984375,71.73930664062499],[128.84326171875003,71.6634765625],[129.76191406250004,71.11953125000002],[130.53710937500003,70.89252929687495],[130.75712890625002,70.96235351562498],[131.02158203125006,70.74609374999997],[132.0353515625001,71.24404296875],[132.65390625000006,71.92597656250001],[133.6888671875,71.434228515625],[134.70273437500012,71.38681640625003],[135.55917968750006,71.6103515625],[136.09033203125003,71.61958007812501],[137.9396484375001,71.1333984375],[137.84404296875007,71.22680664062503],[138.31406250000006,71.32553710937498],[137.918359375,71.38408203124999],[138.23417968750007,71.596337890625],[138.78017578125,71.62900390624998],[139.209375,71.44477539062501],[139.98417968750007,71.49150390625005],[139.72294921875002,71.88496093749998],[139.35927734375005,71.95136718750001],[140.18769531250004,72.19130859374997],[139.17636718750006,72.16347656249997],[139.14082031250004,72.32973632812502],[139.60117187500012,72.49609374999997],[141.07929687500004,72.5869140625],[140.80820312500006,72.89096679687503],[142.06142578125005,72.72080078125],[146.25292968749997,72.442236328125],[146.234765625,72.34970703125],[144.77636718749997,72.38227539062495],[144.16923828125002,72.25878906250003],[144.29492187499997,72.19262695312497],[146.83183593750007,72.29541015625003],[146.11328125000003,71.94497070312497],[146.23027343750007,72.1375],[145.75859375000007,72.22587890624999],[145.75673828125005,71.94130859375002],[145.06396484374997,71.92607421875002],[145.18857421875012,71.69580078125],[146.07324218749997,71.80834960937503],[147.26181640625006,72.327880859375],[149.50156250000012,72.16430664062497],[150.01689453125002,71.89565429687505],[149.04873046875005,71.79575195312503],[148.9681640625,71.69047851562499],[150.59980468750004,71.5201171875],[150.09765624999997,71.22656249999997],[150.96777343749997,71.38046874999998],[151.58242187500005,71.28696289062503],[152.09277343749997,71.02329101562503],[151.76201171875002,70.98247070312499],[152.50878906250003,70.83447265625003],[156.68457031250003,71.09375],[158.03701171875005,71.03925781250001],[159.35068359375006,70.79072265625001],[160.00644531250006,70.30966796875006],[159.72939453125005,69.87021484375006],[160.91074218750012,69.60634765625002],[161.03554687500005,69.09819335937507],[161.30986328125007,68.98227539062498],[160.85605468750006,68.53833007812506],[161.565625,68.90517578125],[161.53691406250002,69.379541015625],[162.16601562499997,69.61157226562503],[163.20136718750004,69.71474609375],[166.82031250000003,69.49956054687505],[167.8568359375,69.72822265624998],[168.30302734375002,69.27148437500003],[169.31064453125006,69.07954101562498],[169.60986328124997,68.78603515624997],[170.53759765624997,68.82539062500001],[170.99541015625002,69.04531250000005],[170.58222656250004,69.58334960937506],[170.16093750000007,69.62656249999998],[170.48681640625003,70.107568359375],[173.27744140625006,69.823828125],[173.43867187500004,69.94682617187502],[175.92148437500012,69.89531250000002],[179.27265624999998,69.25966796875002],[180,68.98344726562505],[180,65.06723632812498],[178.51953125000003,64.60297851562498],[177.7486328125,64.71704101562503],[176.88085937499997,65.08193359375002],[176.34101562500015,65.04731445312501],[177.03730468750004,64.99965820312497],[177.22285156250004,64.861669921875],[177.06875,64.78666992187502],[176.06113281250012,64.96088867187498],[174.54882812500009,64.68388671875005],[176.0565429687501,64.90473632812498],[176.35097656250005,64.70512695312502],[176.14091796875007,64.58583984375005],[177.42744140625015,64.76337890624998],[177.43291015625002,64.44448242187502],[177.6875,64.30473632812507],[178.04472656250013,64.21958007812503],[178.22949218749991,64.36440429687497],[178.38144531250018,64.26088867187502],[178.73144531250003,63.667089843750006],[178.44042968750009,63.605566406250006],[178.74404296874994,63.39477539062503],[178.79296874999997,63.54033203125002],[179.38857421875,63.14721679687497],[179.25957031250002,63.00830078125],[179.5705078125001,62.6875],[179.12070312500012,62.32036132812499],[177.292578125,62.59902343750002],[177.33896484375006,62.781347656250034],[177.02353515625012,62.777246093749994],[177.15947265625007,62.56098632812498],[174.51435546875015,61.823632812499966],[173.6234375,61.716064453125],[173.13183593749997,61.40664062500002],[172.85654296875006,61.469189453124955],[172.90800781250002,61.311621093750006],[172.39609375000006,61.16738281250002],[172.39277343750004,61.061767578125],[170.60820312500007,60.434912109375034],[170.3509765625,59.965527343749955],[169.9826171875001,60.067089843749955],[169.2267578125001,60.59594726562497],[168.1375,60.57392578125001],[167.22675781250004,60.406298828125045],[166.27304687500012,59.85625],[166.13603515625007,59.979345703125034],[166.35214843750006,60.48481445312498],[165.08457031250006,60.09858398437498],[164.95371093750006,59.843603515625006],[164.52529296875,60.06127929687503],[164.11328125000003,59.89755859374998],[164.13505859375002,59.984375],[163.74384765625004,60.02802734374998],[163.36484375000012,59.78144531250004],[163.27285156250005,59.302587890625006],[162.14160156249997,58.44741210937502],[161.96005859375012,58.07690429687506],[162.39140625000002,57.717236328124955],[162.65429687499997,57.94824218750003],[163.22578125000004,57.790380859375034],[162.77929687500003,57.35761718749998],[162.79111328125012,56.875390624999966],[162.92207031250004,56.72265625000003],[163.2565429687501,56.68803710937499],[163.33554687500012,56.232519531250006],[163.04736328125003,56.044677734375],[162.84033203125003,56.065625],[162.628125,56.232275390625034],[163.03837890625002,56.521875],[162.67148437500006,56.49008789062498],[162.52822265625005,56.260693359374955],[162.08496093749997,56.08964843750002],[161.72392578125002,55.49614257812499],[162.10556640625006,54.75214843750004],[161.62480468750002,54.51625976562502],[160.77265625000004,54.54135742187498],[160.0744140625001,54.18916015625001],[159.84375,53.78364257812498],[160.02509765625004,53.129589843749955],[159.58593750000003,53.237695312499966],[158.74541015625002,52.90893554687506],[158.47207031250005,53.032373046874966],[158.6087890625,52.873632812500034],[158.49316406249997,52.383154296875034],[158.10351562500003,51.80961914062499],[156.84746093750002,51.006591796875],[156.74775390625004,50.969287109375045],[156.52119140625004,51.38027343750002],[156.36474609374997,52.509375],[156.11035156250003,52.86616210937504],[155.62031250000004,54.86455078125002],[155.5548828125001,55.348486328125034],[155.98251953125012,56.69521484375002],[156.8488281250001,57.290185546874994],[156.97675781250004,57.46630859375],[156.82988281250007,57.77963867187498],[157.4503906250001,57.79926757812498],[157.66640625000005,58.01977539062506],[158.27519531250007,58.00898437499998],[159.21064453125004,58.519433593749966],[159.8473632812501,59.127148437499955],[161.75351562500012,60.15229492187501],[162.06816406250002,60.466406250000034],[163.70996093749997,60.916796875000045],[163.55351562500002,61.02563476562503],[164.00546875000006,61.34379882812499],[163.80439453125004,61.46137695312498],[164.20722656250004,62.29223632812506],[164.59833984375004,62.470556640625034],[165.20810546875012,62.37397460937501],[165.41738281250005,62.447070312500045],[164.418359375,62.704638671875045],[163.33173828125004,62.550927734374994],[163.01767578125006,61.89106445312504],[163.25781249999997,61.69946289062497],[163.08525390625002,61.570556640625],[162.85595703125003,61.705029296874955],[162.39257812500003,61.662109375],[160.76660156249997,60.753320312499966],[160.17363281250002,60.638427734375],[160.37890625000003,61.02548828124998],[159.79042968750005,60.956640625],[160.309375,61.894384765625006],[159.55234375000012,61.71948242187497],[159.18925781250007,61.92939453125001],[158.07011718750002,61.75361328125001],[157.46933593750012,61.798925781250006],[157.0841796875001,61.67568359375002],[155.71611328125002,60.682373046875],[154.97080078125012,60.376660156249955],[154.29306640625006,59.833349609375034],[154.1498046875,59.52851562500001],[154.97128906250006,59.44960937500002],[155.16044921875002,59.19013671875001],[154.45800781250003,59.21655273437497],[154.01093750000004,59.075537109375006],[153.69521484375005,59.22475585937505],[153.36113281250002,59.214794921874955],[152.81787109375003,58.92626953124997],[152.31962890625002,59.03076171875003],[152.08789062499997,58.910449218750045],[151.32675781250006,58.875097656250034],[151.12109375000003,59.08251953125003],[152.26064453125,59.22358398437498],[151.34824218750012,59.561132812500006],[150.4835937500001,59.494384765625],[150.66728515625002,59.55634765625001],[149.64257812499997,59.770410156249994],[149.06523437500002,59.63051757812502],[149.20498046875,59.488183593749966],[148.79707031250004,59.532324218750006],[148.74414062499997,59.37353515624997],[148.96464843750007,59.36914062499997],[148.72666015625006,59.257910156250034],[148.25742187500006,59.414208984374994],[147.51445312500002,59.2685546875],[146.53720703125006,59.45698242187501],[146.0495117187501,59.17055664062502],[145.55458984375,59.413525390624955],[143.19218750000002,59.3701171875],[142.58027343750004,59.240136718749966],[140.79023437500004,58.30346679687503],[140.446875,57.81367187499998],[138.66210937500003,56.96552734375004],[137.69150390625006,56.13935546875004],[135.2625,54.94331054687498],[135.25771484375005,54.73149414062499],[135.85156249999997,54.583935546874955],[136.797265625,54.62099609375005],[136.71884765625006,53.804101562499994],[137.15537109375012,53.82167968750002],[137.14160156249997,54.182226562500006],[137.66601562500003,54.283300781250006],[137.3392578125,54.10053710937498],[137.83476562500002,53.94672851562498],[137.25371093750007,53.546142578125],[137.95048828125007,53.60356445312499],[138.52792968750012,53.959863281249994],[138.56914062500002,53.818798828124955],[138.24970703125004,53.524023437500034],[138.45068359375003,53.53701171875002],[138.69941406250004,53.869726562500034],[138.65722656249997,54.29833984375003],[139.31972656250005,54.19296874999998],[139.707421875,54.27714843749999],[140.68759765625012,53.59643554687503],[141.3737304687501,53.29277343749999],[141.18125,53.01528320312505],[140.83964843750002,53.087890625],[141.25585937499997,52.84013671874996],[141.13242187500006,52.435693359374994],[141.48525390625,52.17851562500002],[141.36689453125004,51.92065429687506],[140.93261718750003,51.61992187499999],[140.5208984375,50.80019531250005],[140.62451171874997,50.08242187500002],[140.46269531250002,49.911474609375006],[140.51718750000012,49.59614257812498],[140.17060546875004,48.52368164062497],[138.58681640625005,47.057226562500006],[138.33691406250003,46.543408203124955],[137.68544921875,45.81835937500003],[136.14228515625004,44.489111328125034],[135.87460937500012,44.37353515625003],[135.1310546875001,43.52573242187506],[134.01044921875004,42.94746093750001],[133.15996093750007,42.69697265624998],[132.70898437500003,42.875830078125006],[132.30380859375006,42.88330078125],[132.30957031249997,43.31352539062499],[131.8666015625,43.09516601562501],[131.93896484374997,43.30195312500004],[131.15830078125012,42.62602539062499],[130.709375,42.656396484374966],[130.8341796875001,42.52294921875006],[130.68730468750007,42.30253906249999]]],[[[107.69550781250004,78.13090820312505],[107.48164062500004,78.057763671875],[106.41552734375003,78.13984375000001],[107.69550781250004,78.13090820312505]]],[[[102.88476562499997,79.25395507812505],[102.4123046875001,78.83544921874997],[103.80078124999997,79.14926757812503],[104.45205078125005,78.880029296875],[105.14599609375003,78.81884765625006],[105.31259765625012,78.49990234375],[104.74179687500012,78.33974609374997],[102.79667968750007,78.18789062500002],[101.20410156249997,78.19194335937505],[99.50029296875002,77.97607421875003],[101.590625,79.350439453125],[102.25126953125002,79.25605468749995],[102.40488281250006,79.43320312499998],[102.88476562499997,79.25395507812505]]],[[[76.24892578125005,79.65107421874995],[77.58896484375012,79.50190429687504],[76.64951171875012,79.493408203125],[76.24892578125005,79.65107421874995]]],[[[92.68349609375005,79.685205078125],[91.37626953125007,79.83549804687505],[91.22929687500007,80.03071289062504],[93.803125,79.904541015625],[92.68349609375005,79.685205078125]]],[[[51.409277343750006,79.94423828125],[50.09140625,79.98056640625003],[50.93632812500002,80.09423828125],[51.409277343750006,79.94423828125]]],[[[59.68886718750005,79.95581054687506],[58.91923828125002,79.98461914062506],[59.54453125000006,80.11884765624995],[59.68886718750005,79.95581054687506]]],[[[97.67451171875004,80.15825195312499],[97.65166015625002,79.76064453125],[98.59648437500002,80.05219726562495],[100.0612304687501,79.77709960937506],[99.68066406250003,79.32333984374998],[99.04179687500007,79.29301757812502],[99.92929687500012,78.96142578124997],[98.41113281250003,78.78779296875004],[95.53105468750007,79.09809570312501],[95.02041015625005,79.05268554687498],[94.21875,79.40234375],[93.07080078124997,79.49531250000001],[94.98730468749997,80.096826171875],[95.28134765625012,80.030517578125],[97.67451171875004,80.15825195312499]]],[[[50.05175781250003,80.07431640625003],[49.55605468750005,80.15893554687503],[49.883691406249994,80.230224609375],[50.05175781250003,80.07431640625003]]],[[[57.07871093750006,80.35092773437498],[56.986914062500006,80.07148437499998],[55.811621093750006,80.08715820312497],[56.02441406250003,80.34130859374997],[57.07871093750006,80.35092773437498]]],[[[53.521386718749994,80.18520507812497],[52.34355468750002,80.213232421875],[52.85390625,80.40239257812499],[53.85166015625006,80.26835937500005],[53.521386718749994,80.18520507812497]]],[[[57.95625,80.12324218749995],[57.33232421875002,80.15810546875005],[57.075,80.49394531249999],[59.25546875000006,80.34321289062501],[58.39794921874997,80.31875],[57.95625,80.12324218749995]]],[[[54.41533203125002,80.47280273437502],[53.811914062499994,80.47622070312502],[53.87724609375002,80.60527343750002],[54.41533203125002,80.47280273437502]]],[[[47.441992187500006,80.853662109375],[48.44570312500005,80.80600585937506],[48.68359375000003,80.63325195312504],[47.7052734375001,80.76518554687499],[46.141406250000074,80.44672851562495],[45.969042968750074,80.56948242187502],[44.9049804687501,80.61127929687501],[47.441992187500006,80.853662109375]]],[[[62.167773437500074,80.83476562500005],[62.07578125000006,80.616943359375],[61.05126953124997,80.418603515625],[60.27832031249997,80.49443359374999],[59.649804687499994,80.43125],[59.59228515625003,80.81650390624998],[62.167773437500074,80.83476562500005]]],[[[50.278125,80.92724609374997],[51.70361328125003,80.68764648437502],[48.81103515625003,80.35371093750001],[48.97753906250003,80.16259765624997],[47.73730468749997,80.08168945312502],[47.89296875000005,80.23925781249997],[46.991015625000074,80.182763671875],[46.644433593749994,80.30034179687507],[47.89580078125002,80.52905273437503],[49.087792968749994,80.515771484375],[49.24433593750004,80.82138671875],[50.278125,80.92724609374997]]],[[[80.02666015625007,80.84814453125003],[79.09853515625005,80.81206054687505],[79.21738281250012,80.96035156249997],[80.27958984375007,80.94980468750003],[80.02666015625007,80.84814453125003]]],[[[61.1408203125001,80.95034179687497],[60.0783203125001,80.99916992187497],[61.45742187499999,81.10395507812501],[61.1408203125001,80.95034179687497]]],[[[54.71894531250004,81.11596679687497],[56.47226562500006,80.99824218749995],[57.58037109375002,80.75546874999998],[55.88339843750006,80.62841796875003],[54.66816406250004,80.73867187500002],[54.04541015624997,80.87197265625],[54.71894531250004,81.11596679687497]]],[[[58.62236328125002,81.04165039062502],[58.930566406249994,80.83168945312497],[58.28564453124997,80.76489257812503],[57.21093749999997,81.01708984374997],[58.04951171875004,81.11845703125002],[58.62236328125002,81.04165039062502]]],[[[63.37382812500002,80.70009765624997],[62.59257812500002,80.85302734375006],[64.80205078125002,81.197265625],[65.43740234375005,80.93071289062507],[63.37382812500002,80.70009765624997]]],[[[91.56718750000007,81.14121093750003],[91.2228515625001,81.063818359375],[89.90117187500002,81.17070312500002],[91.56718750000007,81.14121093750003]]],[[[96.52656250000004,81.0755859375],[97.86992187500007,80.76328125000006],[97.02539062499997,80.53554687500002],[97.29843750000006,80.27275390625005],[93.6546875,80.009619140625],[91.52382812500005,80.35854492187502],[93.2625,80.79125976562497],[92.59257812500007,80.780859375],[92.7103515625,80.87216796875003],[95.1595703125,81.27099609375003],[95.80068359375005,81.28046874999998],[96.52656250000004,81.0755859375]]],[[[57.81025390625004,81.54604492187502],[58.563867187499994,81.41840820312504],[57.858691406250074,81.36806640625],[57.76972656250004,81.16972656249999],[55.71669921875005,81.1884765625],[55.46601562500004,81.31118164062502],[57.81025390625004,81.54604492187502]]],[[[63.65097656250006,81.60932617187501],[62.10644531249997,81.679345703125],[63.709570312500006,81.68730468750002],[63.65097656250006,81.60932617187501]]],[[[58.29541015625003,81.715185546875],[58.13457031250002,81.82797851562498],[59.261816406250006,81.85419921874998],[59.35644531250003,81.75898437499995],[58.29541015625003,81.715185546875]]]]},"properties":{"name":"Russia","childNum":73}},{"geometry":{"type":"Polygon","coordinates":[[[30.50996093750001,-1.067285156250009],[30.47705078125,-1.0830078125],[30.47021484375,-1.131152343750003],[30.508105468750017,-1.208203125000011],[30.631933593750006,-1.367480468750003],[30.710742187500017,-1.396777343750003],[30.76220703125,-1.458691406250011],[30.812597656250006,-1.563085937500006],[30.8765625,-2.143359375],[30.85498046875,-2.265429687500003],[30.828710937500006,-2.338476562500006],[30.7625,-2.371679687500006],[30.71484375,-2.363476562500011],[30.656640625000023,-2.373828125],[30.593359375,-2.396777343750003],[30.553613281250023,-2.400097656250011],[30.408496093750017,-2.31298828125],[30.117285156250006,-2.416601562500006],[29.93017578125,-2.339550781250011],[29.8681640625,-2.71640625],[29.698046875000017,-2.794726562500003],[29.390234375,-2.80859375],[29.10205078125,-2.595703125],[29.01435546875001,-2.72021484375],[28.893945312500023,-2.635058593750003],[28.876367187500023,-2.400292968750009],[29.13154296875001,-2.195117187500003],[29.196582031250017,-1.719921875000011],[29.576953125000017,-1.387890625000011],[29.82539062500001,-1.335546875],[29.930078125000023,-1.469921875000011],[30.360253906250023,-1.074609375],[30.41230468750001,-1.063085937500006],[30.46992187500001,-1.066015625],[30.50996093750001,-1.067285156250009]]]},"properties":{"name":"Rwanda","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[41.98769531250005,16.715625],[42.059960937499994,16.803515625000017],[42.15781250000006,16.570703125000023],[41.80156250000002,16.778759765624955],[41.86044921875006,17.002539062499977],[41.98769531250005,16.715625]]],[[[46.53144531250004,29.09624023437499],[47.433203125,28.989550781250017],[47.671289062499994,28.53315429687504],[48.442480468750006,28.542919921874983],[48.80898437499999,27.895898437499966],[48.797167968750074,27.72431640625001],[49.2375,27.49272460937499],[49.17509765625002,27.43764648437505],[49.40527343749997,27.18095703124996],[50.149804687499994,26.66264648437499],[50.00810546875002,26.678515625000017],[50.21386718750003,26.30849609375005],[50.15546875000004,26.100537109374955],[50.03164062499999,26.11098632812505],[50.55791015625002,25.086669921875],[50.66689453125005,24.96381835937501],[50.72558593749997,24.869384765625057],[50.80439453125004,24.789257812499983],[50.928320312500006,24.595117187500023],[50.96601562500004,24.573925781249983],[51.022753906250074,24.56523437499999],[51.09335937500006,24.564648437499955],[51.178027343750074,24.586718750000017],[51.26796875,24.607226562500017],[51.33847656250006,24.564355468749994],[51.41123046875006,24.570800781250057],[51.30986328125002,24.340380859375017],[51.56835937500003,24.286181640625074],[51.592578125000074,24.07885742187503],[52.55507812500005,22.932812499999955],[55.104296875000074,22.621484375000023],[55.185839843750074,22.7041015625],[55.64101562499999,22.001855468749994],[54.97734375000002,19.995947265625006],[51.977636718750006,18.996142578125074],[49.04199218750003,18.58178710937503],[48.17216796875002,18.156933593749983],[47.57958984374997,17.448339843750034],[47.44179687499999,17.111865234375045],[47.14355468749997,16.946679687499966],[46.97568359375006,16.953466796875034],[46.72763671875006,17.26557617187501],[45.5353515625001,17.30205078124999],[45.14804687500006,17.427441406249955],[43.91699218749997,17.32470703124997],[43.41796875000003,17.516259765625023],[43.19091796875003,17.359375],[43.16503906249997,16.689404296874955],[42.79931640624997,16.37177734375001],[42.29394531249997,17.434960937499966],[41.75,17.88574218749997],[41.22949218750003,18.678417968749983],[40.75917968750005,19.755468750000034],[40.080664062500006,20.265917968750017],[39.728320312500074,20.390332031249955],[39.27607421875004,20.973974609375034],[39.093554687500074,21.31035156249999],[39.14707031250006,21.518994140624955],[38.98789062500006,21.88173828125005],[39.06201171874997,22.592187500000023],[38.46416015625002,23.71186523437504],[37.91972656250002,24.185400390625063],[37.54306640625006,24.291650390625023],[37.18085937500004,24.82001953125001],[37.26630859375004,24.960058593750034],[37.14882812499999,25.291113281249977],[35.18046875000002,28.03486328125004],[34.722070312499994,28.130664062500017],[34.625,28.064501953125017],[34.95078125,29.353515625],[36.068457031250006,29.200537109375006],[36.28281250000006,29.355371093750023],[36.47607421874997,29.49511718749997],[36.59179687500003,29.666113281250006],[36.703906250000074,29.831640624999977],[36.75527343750005,29.86601562499996],[37.46923828125003,29.995068359374955],[37.49072265625003,30.01171874999997],[37.55361328125005,30.14458007812496],[37.63359375000002,30.313281250000045],[37.64990234374997,30.330957031249994],[37.669726562500074,30.34814453125003],[37.862890625,30.44262695312503],[37.98007812500006,30.5],[37.47900390624997,31.007763671874955],[37.10527343750002,31.35517578125004],[36.95859375000006,31.491503906250017],[37.215625,31.55610351562501],[37.49335937500004,31.625878906250023],[38.111425781250006,31.78115234375005],[38.37548828124997,31.84746093749996],[38.962304687499994,31.99492187499999],[38.99707031249997,32.00747070312505],[39.145410156249994,32.12451171875],[39.36865234374997,32.09174804687498],[39.70410156250003,32.04252929687499],[40.02783203124997,31.995019531249994],[40.3693359375001,31.93896484375003],[40.47890625000005,31.89335937499999],[42.07441406250004,31.08037109374999],[43.77373046875002,29.84921875],[44.71650390625004,29.19360351562503],[46.35644531250003,29.06367187500001],[46.53144531250004,29.09624023437499]]]]},"properties":{"name":"Saudi Arabia","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[36.87138671875002,21.996728515624994],[36.92695312500001,21.58652343749999],[37.25859375000002,21.108544921874994],[37.25722656250002,21.03940429687499],[37.15058593750001,21.103759765625],[37.14111328125,20.98178710937499],[37.19316406250002,20.12070312499999],[37.471289062500006,18.820117187500003],[38.609472656250006,18.005078125],[38.422460937500006,17.823925781249997],[38.39716796875001,17.778369140625003],[38.38554687500002,17.751269531250003],[38.37373046875001,17.717333984375003],[38.34736328125001,17.68359375],[38.28984375000002,17.637011718750003],[38.26728515625001,17.61669921875],[38.253515625,17.584765625],[37.78242187500001,17.4580078125],[37.547460937500006,17.324121093749994],[37.51015625000002,17.288134765625003],[37.45292968750002,17.108691406250003],[37.41103515625002,17.06171875],[37.24882812500002,17.056884765625],[37.16953125,17.04140625],[37.0615234375,17.061279296875],[37.00898437500001,17.058886718750003],[36.995214843750006,17.020556640625003],[36.97578125000001,16.86655273437499],[36.97871093750001,16.800585937500003],[36.887792968750006,16.624658203124994],[36.91376953125001,16.296191406250003],[36.566015625,15.362109375],[36.4267578125,15.132080078125],[36.44814453125002,14.940087890624994],[36.470800781250006,14.736474609374994],[36.52431640625002,14.2568359375],[36.12519531250001,12.75703125],[35.67021484375002,12.623730468749997],[35.1123046875,11.816552734374994],[34.93144531250002,10.864794921874989],[34.77128906250002,10.746191406249991],[34.571875,10.880175781249989],[34.34394531250001,10.658642578124997],[34.31123046875001,10.190869140624997],[34.078125,9.461523437499991],[33.87148437500002,9.506152343749989],[33.96328125000002,9.861767578124997],[33.90703125000002,10.181445312499989],[33.13007812500001,10.745947265624991],[33.073339843750006,11.606103515624994],[33.199316406250006,12.21728515625],[32.721875,12.223095703124997],[32.73671875000002,12.009667968749994],[32.072265625,12.006738281249994],[32.338476562500006,11.710107421874994],[32.42080078125002,11.089111328125],[31.224902343750017,9.799267578124997],[30.75537109375,9.731201171875],[30.003027343750006,10.277392578124989],[29.60546875,10.065087890624994],[29.47314453125,9.768603515624989],[28.979589843750006,9.594189453124997],[28.844531250000017,9.326074218749994],[28.048925781250006,9.32861328125],[27.880859375,9.601611328124989],[27.07421875,9.613818359374989],[26.65869140625,9.484130859375],[25.91914062500001,10.169335937499994],[25.858203125000017,10.406494140625],[25.211718750000017,10.329931640624991],[25.066992187500006,10.293798828124991],[24.785253906250006,9.774658203125],[24.53193359375001,8.886914062499997],[24.147363281250023,8.665625],[23.53730468750001,8.815820312499994],[23.46826171875,9.11474609375],[23.62265625,9.340625],[23.646289062500017,9.822900390624994],[22.86005859375001,10.919677734375],[22.922656250000017,11.344873046874994],[22.591113281250017,11.579882812499989],[22.580957031250023,11.990136718749994],[22.472460937500017,12.067773437499994],[22.352343750000017,12.660449218749989],[21.928125,12.678125],[21.825292968750006,12.79052734375],[22.228125,13.32958984375],[22.1064453125,13.7998046875],[22.53857421875,14.161865234375],[22.38154296875001,14.550488281249997],[22.6708984375,14.722460937500003],[22.93232421875001,15.162109375],[22.933886718750017,15.533105468749994],[23.10517578125001,15.702539062499994],[23.970800781250006,15.721533203124991],[23.980273437500017,19.496630859375003],[23.980273437500017,19.99594726562499],[24.9794921875,20.002587890624994],[24.980273437500017,21.995849609375],[28.036425781250017,21.995361328125],[31.092675781250023,21.994873046875],[31.260644531250023,22.00229492187499],[31.400292968750023,22.202441406250003],[31.486132812500017,22.14780273437499],[31.434472656250023,21.995849609375],[36.87138671875002,21.996728515624994]]]},"properties":{"name":"Sudan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[34.078125,9.461523437499991],[34.07275390625,8.545263671874991],[33.95332031250001,8.443505859374994],[33.28105468750002,8.437255859375],[32.99892578125002,7.899511718749991],[33.902441406250006,7.509521484375],[34.06425781250002,7.225732421874994],[34.71064453125001,6.660302734374994],[34.98359375000001,5.858300781249994],[35.26835937500002,5.492285156249991],[35.08447265625,5.311865234374991],[34.87832031250002,5.109570312499997],[34.63984375000001,4.87548828125],[34.38017578125002,4.620654296874989],[34.176855468750006,4.419091796874994],[33.97607421875,4.22021484375],[33.74160156250002,3.985253906249994],[33.568457031250006,3.81171875],[33.489355468750006,3.755078125],[32.99726562500001,3.880175781249989],[32.33574218750002,3.706201171874994],[32.13593750000001,3.519726562499997],[31.79804687500001,3.802636718749994],[31.547167968750017,3.677587890624991],[31.15234375,3.785595703124997],[30.83857421875001,3.49072265625],[30.757226562500023,3.62421875],[30.586718750000017,3.62421875],[30.50830078125,3.835693359375],[30.194921875,3.98193359375],[29.676855468750006,4.5869140625],[29.469628906250023,4.61181640625],[29.224902343750017,4.391894531249989],[28.72705078125,4.504980468749991],[28.427539062500017,4.324169921874997],[28.19208984375001,4.350244140624994],[27.7880859375,4.644677734374994],[27.4033203125,5.109179687499989],[27.143945312500023,5.722949218749989],[26.514257812500006,6.069238281249994],[26.30859375,6.455322265625],[26.36181640625,6.635302734374989],[25.27890625,7.427490234375],[25.18134765625001,7.557226562499991],[25.20039062500001,7.807910156249989],[24.853320312500017,8.137548828124991],[24.291406250000023,8.29140625],[24.147363281250023,8.665625],[24.53193359375001,8.886914062499997],[24.785253906250006,9.774658203125],[25.066992187500006,10.293798828124991],[25.211718750000017,10.329931640624991],[25.858203125000017,10.406494140625],[25.91914062500001,10.169335937499994],[26.65869140625,9.484130859375],[27.07421875,9.613818359374989],[27.880859375,9.601611328124989],[28.048925781250006,9.32861328125],[28.844531250000017,9.326074218749994],[28.979589843750006,9.594189453124997],[29.47314453125,9.768603515624989],[29.60546875,10.065087890624994],[30.003027343750006,10.277392578124989],[30.75537109375,9.731201171875],[31.224902343750017,9.799267578124997],[32.42080078125002,11.089111328125],[32.338476562500006,11.710107421874994],[32.072265625,12.006738281249994],[32.73671875000002,12.009667968749994],[32.721875,12.223095703124997],[33.199316406250006,12.21728515625],[33.073339843750006,11.606103515624994],[33.13007812500001,10.745947265624991],[33.90703125000002,10.181445312499989],[33.96328125000002,9.861767578124997],[33.87148437500002,9.506152343749989],[34.078125,9.461523437499991]]]},"properties":{"name":"S. Sudan","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-12.280615234374977,14.809033203124997],[-12.228417968749994,14.45859375],[-12.019189453124994,14.206494140624997],[-11.960888671874983,13.875292968750003],[-12.05419921875,13.633056640625],[-11.831689453124994,13.315820312499994],[-11.634960937499983,13.369873046875],[-11.390380859375,12.941992187499991],[-11.389404296875,12.404394531249991],[-12.399072265624994,12.340087890625],[-12.930712890624989,12.532275390624989],[-13.061279296875,12.489990234375],[-13.082910156249994,12.633544921875],[-13.729248046875,12.673925781249991],[-14.06484375,12.67529296875],[-14.349218749999977,12.676416015624994],[-15.196093749999989,12.679931640625],[-15.3779296875,12.588964843749991],[-15.574804687499977,12.490380859374994],[-15.839550781249983,12.43789062499999],[-16.144189453124994,12.45742187499999],[-16.24150390624999,12.443310546874997],[-16.41630859374999,12.36767578125],[-16.521337890624977,12.3486328125],[-16.656933593749983,12.364355468749991],[-16.711816406249994,12.354833984374991],[-16.76030273437499,12.52578125],[-16.44287109375,12.609472656249991],[-16.59765625,12.715283203124997],[-16.743896484375,12.58544921875],[-16.763330078124994,13.064160156249997],[-16.648779296874977,13.154150390624991],[-15.834277343749989,13.156445312499997],[-15.814404296874983,13.325146484374997],[-15.286230468749977,13.39599609375],[-15.151123046875,13.556494140624991],[-14.246777343749983,13.23583984375],[-13.826708984374989,13.4078125],[-13.977392578124977,13.54345703125],[-14.405468749999983,13.503710937500003],[-15.108349609374983,13.81210937499999],[-15.426855468749977,13.727001953124997],[-15.509667968749994,13.586230468750003],[-16.56230468749999,13.587304687499994],[-16.766943359374977,13.904931640624994],[-16.618115234374983,14.04052734375],[-16.791748046875,14.004150390625],[-17.168066406249977,14.640625],[-17.345800781249977,14.729296875],[-17.445019531249983,14.651611328125],[-17.53564453125,14.755126953125],[-17.147167968749983,14.922021484374994],[-16.843408203124994,15.293994140625003],[-16.570751953124983,15.734423828125003],[-16.535253906249977,15.83837890625],[-16.502050781249977,15.917333984374991],[-16.480078124999977,16.097216796875003],[-16.441015624999977,16.204541015624997],[-16.239013671875,16.531298828125003],[-15.768212890624994,16.485107421875],[-14.990625,16.676904296874994],[-14.300097656249989,16.580273437499997],[-13.868457031249989,16.148144531249997],[-13.756640624999989,16.172509765624994],[-13.40966796875,16.05917968749999],[-13.105273437499989,15.57177734375],[-12.735253906249994,15.13125],[-12.40869140625,14.889013671874991],[-12.280615234374977,14.809033203124997]]]},"properties":{"name":"Senegal","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[103.9697265625,1.331445312499994],[103.65019531249999,1.325537109374991],[103.81796875000003,1.447070312499989],[103.9697265625,1.331445312499994]]]},"properties":{"name":"Singapore","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-37.10332031249996,-54.065625],[-36.70380859375001,-54.10810546874999],[-36.64741210937498,-54.26230468749996],[-36.32646484374996,-54.251171875],[-35.79858398437497,-54.76347656250002],[-36.08549804687499,-54.86679687500001],[-36.885986328125,-54.33945312499996],[-37.63090820312496,-54.16748046875001],[-37.61884765625001,-54.04208984375004],[-38.017431640625034,-54.008007812500026],[-37.10332031249996,-54.065625]]]},"properties":{"name":"S. Geo. and S. Sandw. Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-5.692138671874972,-15.997753906249997],[-5.782519531250017,-16.00400390625002],[-5.707861328124977,-15.90615234374998],[-5.692138671874972,-15.997753906249997]]]},"properties":{"name":"Saint Helena","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[160.57626953125006,-11.797851562500028],[160.44306640625004,-11.814941406249957],[159.98632812499997,-11.494726562500006],[160.57626953125006,-11.797851562500028]]],[[[166.13320312500005,-10.757812499999972],[165.90400390625004,-10.851464843749966],[165.79101562500003,-10.784765624999963],[166.02382812500005,-10.6611328125],[166.13320312500005,-10.757812499999972]]],[[[161.71533203124997,-10.387304687499991],[162.10537109375005,-10.45380859375004],[162.37333984375002,-10.823242187499986],[161.78681640625004,-10.716894531249991],[161.53789062500007,-10.566406249999972],[161.4870117187501,-10.361425781249963],[161.29394531250003,-10.326464843750031],[161.30478515625012,-10.204394531250031],[161.71533203124997,-10.387304687499991]]],[[[161.54785156249997,-9.625683593749997],[161.55380859375012,-9.769726562500026],[161.40976562500006,-9.681640625000028],[161.36416015625,-9.353417968750037],[161.54785156249997,-9.625683593749997]]],[[[159.75039062500005,-9.272656250000011],[159.97060546875,-9.433300781249969],[160.35458984375006,-9.421582031249983],[160.81894531250006,-9.862792968749986],[160.64921875000002,-9.92861328124998],[159.80273437499997,-9.763476562500003],[159.61230468749997,-9.470703124999943],[159.62558593750012,-9.311230468749969],[159.75039062500005,-9.272656250000011]]],[[[160.1681640625001,-8.995507812500037],[160.40751953125007,-9.140332031249969],[160.10537109375,-9.080761718749997],[160.1681640625001,-8.995507812500037]]],[[[159.18857421875006,-9.123535156250014],[159.03632812500004,-9.075],[159.12978515625,-8.99306640624998],[159.22841796875005,-9.029980468749955],[159.18857421875006,-9.123535156250014]]],[[[158.10791015625003,-8.684179687500034],[157.93759765625006,-8.73642578125002],[157.90927734375006,-8.565625],[158.10546874999997,-8.536816406250026],[158.10791015625003,-8.684179687500034]]],[[[157.38896484375002,-8.713476562499963],[157.2123046875,-8.565039062500006],[157.37949218750012,-8.420898437499943],[157.38896484375002,-8.713476562499963]]],[[[160.7494140625,-8.313964843750014],[160.99765625000006,-8.612011718749983],[160.94433593750003,-8.799023437499983],[161.15869140624997,-8.961816406250009],[161.36738281250004,-9.61123046874998],[160.77207031250012,-8.963867187499986],[160.7140625000001,-8.539257812499997],[160.59042968750006,-8.372753906249997],[160.7494140625,-8.313964843750014]]],[[[157.76347656250002,-8.242187499999957],[157.89843749999997,-8.506347656249943],[157.81933593750003,-8.612011718749983],[157.58789062500003,-8.445410156249963],[157.5580078125,-8.269921875],[157.30244140625004,-8.33330078124996],[157.21757812500002,-8.262792968749977],[157.490625,-7.965722656250037],[157.76347656250002,-8.242187499999957]]],[[[157.171875,-8.108105468749997],[156.95830078125002,-8.014355468749997],[157.02412109375004,-7.867871093749997],[157.18613281250006,-7.941210937500017],[157.171875,-8.108105468749997]]],[[[156.687890625,-7.92304687500004],[156.5109375000001,-7.707812499999974],[156.5609375,-7.574023437499989],[156.80908203124997,-7.722851562500026],[156.687890625,-7.92304687500004]]],[[[159.8791015625001,-8.534277343749949],[158.9440429687501,-8.04072265625004],[158.457421875,-7.544726562499974],[158.734375,-7.604296875000031],[159.43144531250002,-8.029003906249955],[159.84306640625002,-8.326953124999989],[159.8791015625001,-8.534277343749949]]],[[[155.83984374999997,-7.097167968750014],[155.67753906250002,-7.08896484375002],[155.73896484375004,-6.972949218750017],[155.83984374999997,-7.097167968750014]]],[[[157.48671875000005,-7.330371093750003],[157.44130859375,-7.425683593749966],[157.10156249999997,-7.323632812499966],[156.4525390625,-6.638281249999963],[157.03027343750003,-6.891992187499952],[157.19335937499997,-7.160351562499997],[157.48671875000005,-7.330371093750003]]]]},"properties":{"name":"Solomon Is.","childNum":16}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-12.526074218749926,7.436328125000017],[-12.951611328124926,7.570849609374989],[-12.615234374999972,7.63720703125],[-12.5125,7.582421875000037],[-12.526074218749926,7.436328125000017]]],[[[-10.758593749999989,9.385351562499991],[-10.682714843750006,9.289355468749974],[-10.687646484374937,9.261132812499994],[-10.749951171874926,9.12236328124996],[-10.747021484374955,9.095263671875045],[-10.726855468749932,9.081689453125023],[-10.615966796875,9.059179687499977],[-10.500537109375017,8.687548828125017],[-10.677343749999977,8.400585937499997],[-10.712109374999955,8.335253906250017],[-10.686962890624983,8.321679687500009],[-10.652636718749989,8.330273437499983],[-10.604003906249943,8.319482421874994],[-10.55771484374992,8.315673828125028],[-10.496435546874977,8.362109374999974],[-10.394433593749966,8.480957031250028],[-10.360058593749983,8.49550781249998],[-10.283203124999972,8.48515625],[-10.285742187499949,8.454101562499986],[-10.314648437499983,8.310839843750017],[-10.359814453124926,8.187939453125026],[-10.570849609374932,8.071142578125034],[-10.6474609375,7.759375],[-10.878076171874994,7.538232421874994],[-11.267675781249977,7.232617187499997],[-11.507519531249983,6.906542968750003],[-12.48564453124996,7.386279296875045],[-12.480273437499932,7.75327148437502],[-12.697607421874977,7.715869140625045],[-12.850878906249932,7.818701171875034],[-12.956933593749966,8.145312500000045],[-13.148974609374989,8.214599609375043],[-13.272753906249989,8.429736328124989],[-13.085009765624932,8.42475585937504],[-12.894091796874932,8.62978515624998],[-13.181835937499955,8.576904296875043],[-13.206933593749994,8.843115234375006],[-13.059472656249966,8.881152343750031],[-13.292675781249955,9.04921875],[-13.077294921874966,9.069628906249974],[-12.958789062499989,9.263330078124994],[-12.755859374999943,9.373583984374989],[-12.557861328125,9.704980468749994],[-12.427978515625028,9.898144531250011],[-12.142333984375,9.87539062499999],[-11.911083984374955,9.993017578124977],[-11.273632812499955,9.996533203124983],[-11.205664062499949,9.977734374999969],[-11.180859374999955,9.925341796875045],[-11.047460937499977,9.786328125000054],[-10.758593749999989,9.385351562499991]]]]},"properties":{"name":"Sierra Leone","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-89.36259765624999,14.416015625],[-89.1205078125,14.370214843749991],[-88.51254882812499,13.978955078124997],[-88.504345703125,13.964208984374991],[-88.49765625,13.904541015625],[-88.482666015625,13.854248046875],[-88.44912109375,13.850976562499994],[-88.40849609374999,13.87539062499999],[-88.27622070312499,13.942675781250003],[-88.151025390625,13.987353515625003],[-87.99101562499999,13.879638671875],[-87.8919921875,13.894970703124997],[-87.80224609375,13.889990234374991],[-87.7314453125,13.841064453125],[-87.71533203125,13.812695312499997],[-87.781884765625,13.521386718749994],[-87.930859375,13.1806640625],[-88.68564453124999,13.281494140625],[-88.51201171874999,13.183935546874991],[-89.80419921875,13.560107421875003],[-90.09521484375,13.736523437499997],[-90.04814453124999,13.904052734375],[-89.54716796874999,14.241259765625003],[-89.5736328125,14.390087890624997],[-89.36259765624999,14.416015625]]]},"properties":{"name":"El Salvador","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-56.26708984374997,46.838476562500034],[-56.38476562499994,46.81943359375006],[-56.36464843749994,47.09897460937498],[-56.26708984374997,46.838476562500034]]]},"properties":{"name":"St. Pierre and Miquelon","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[6.659960937499989,0.120654296874989],[6.51972656250004,0.066308593750023],[6.468164062499994,0.22734375],[6.68691406250008,0.404394531249977],[6.75,0.24345703124996],[6.659960937499989,0.120654296874989]]],[[[7.423828125,1.567724609375006],[7.330664062500034,1.603369140624991],[7.414453125000051,1.699121093750037],[7.423828125,1.567724609375006]]]]},"properties":{"name":"São Tomé and Principe","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-54.03422851562499,3.62939453125],[-54.00957031249999,3.448535156249989],[-54.06318359375,3.353320312499989],[-54.18803710937499,3.178759765624989],[-54.203125,3.13818359375],[-54.17070312499999,2.993603515624997],[-54.18808593749999,2.874853515624991],[-54.1955078125,2.81787109375],[-54.256738281249994,2.713720703124991],[-54.402001953124994,2.461523437499991],[-54.53593749999999,2.343310546874989],[-54.56840820312499,2.342578124999989],[-54.604736328125,2.335791015624991],[-54.61625976562499,2.326757812499991],[-54.661865234375,2.327539062499994],[-54.697412109374994,2.359814453124997],[-54.72221679687499,2.441650390625],[-54.87607421874999,2.450390625],[-54.92656249999999,2.497363281249989],[-54.968408203124994,2.54833984375],[-54.978662109374994,2.59765625],[-55.005810546875,2.59296875],[-55.0703125,2.54833984375],[-55.11411132812499,2.539208984374994],[-55.1876953125,2.547509765624994],[-55.286035156249994,2.499658203124994],[-55.343994140625,2.48876953125],[-55.38535156249999,2.440625],[-55.73056640624999,2.406152343749994],[-55.957470703125,2.520458984374997],[-55.99350585937499,2.497509765624997],[-56.02036132812499,2.392773437499997],[-56.0451171875,2.364404296874994],[-56.087792968749994,2.34130859375],[-56.12939453125,2.299511718749997],[-56.1376953125,2.259033203125],[-56.073632812499994,2.236767578124997],[-56.02006835937499,2.158154296874997],[-55.96196289062499,2.095117187499994],[-55.91533203124999,2.03955078125],[-55.921630859375,1.976660156249991],[-55.929638671875,1.8875],[-56.01992187499999,1.842236328124997],[-56.4828125,1.942138671875],[-56.704345703125,2.036474609374991],[-57.19736328124999,2.853271484375],[-57.303662109375,3.377099609374994],[-57.646728515625,3.39453125],[-58.05429687499999,4.101660156249991],[-57.84599609374999,4.668164062499997],[-57.91704101562499,4.820410156249991],[-57.711083984374994,4.991064453124991],[-57.331005859375,5.020166015624994],[-57.20981445312499,5.195410156249991],[-57.3185546875,5.335351562499994],[-57.194775390625,5.5484375],[-56.96982421874999,5.992871093749997],[-56.235595703125,5.885351562499991],[-55.897607421874994,5.699316406249991],[-55.909912109375,5.892626953124989],[-55.648339843749994,5.985888671874989],[-54.83369140625,5.988330078124989],[-54.05419921875,5.807910156249989],[-54.08046875,5.502246093749989],[-54.4796875,4.836523437499991],[-54.350732421874994,4.054101562499994],[-54.03422851562499,3.62939453125]]]},"properties":{"name":"Suriname","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[22.538671875,49.072705078125],[22.52412109375001,49.031396484374994],[22.389453125000017,48.873486328125],[22.295214843750017,48.685839843749996],[22.142871093750017,48.568505859374994],[22.1318359375,48.405322265624996],[21.766992187500023,48.3380859375],[21.45136718750001,48.55224609375],[20.490039062500017,48.526904296874996],[20.333789062500017,48.295556640624994],[19.95039062500001,48.146630859374994],[19.625390625000023,48.223095703125],[18.791894531250023,48.000292968749996],[18.72421875,47.787158203124996],[17.76191406250001,47.770166015624994],[17.147363281250023,48.00595703125],[16.86542968750001,48.3869140625],[16.953125,48.598828125],[17.135644531250023,48.841064453125],[17.75849609375001,48.888134765625],[18.0859375,49.06513671875],[18.160937500000017,49.257373046874996],[18.83222656250001,49.510791015624996],[19.1494140625,49.4],[19.44160156250001,49.597705078124996],[19.77392578125,49.37216796875],[19.756640625000017,49.204394531249996],[20.0576171875,49.181298828124994],[20.36298828125001,49.38525390625],[20.868457031250017,49.314697265625],[21.079394531250017,49.418261718749996],[21.6396484375,49.411962890625],[22.020117187500006,49.209521484374996],[22.473046875000023,49.081298828125],[22.538671875,49.072705078125]]]},"properties":{"name":"Slovakia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[16.516210937500006,46.499902343749994],[16.427636718750023,46.5244140625],[16.321191406250023,46.534619140625],[16.1064453125,46.382226562499994],[15.608984375,46.171923828124996],[15.592578125000017,46.139990234375],[15.596875,46.109228515625],[15.675585937500017,45.983691406249996],[15.652148437500017,45.862158203125],[15.277050781250011,45.7326171875],[15.353710937500011,45.659912109375],[15.283593750000023,45.5796875],[15.291210937500011,45.541552734374996],[15.32666015625,45.502294921875],[15.339453125,45.467041015625],[15.242089843750023,45.44140625],[15.110449218750006,45.45078125],[14.95458984375,45.499902343749994],[14.793066406250006,45.47822265625],[14.649511718750006,45.571484375],[14.591796875,45.651269531249994],[14.56884765625,45.6572265625],[14.548448660714302,45.628388671875],[14.507586495535731,45.59039341517857],[14.42734375,45.505761718749994],[14.369921875000017,45.4814453125],[13.878710937500017,45.428369140624994],[13.577929687500017,45.516894531249996],[13.8447265625,45.59287109375],[13.831152343750006,45.680419921875],[13.663476562500023,45.7919921875],[13.6005859375,45.979785156249996],[13.509179687500023,45.973779296874994],[13.487695312500023,45.987109375],[13.480273437500017,46.009228515625],[13.486425781250006,46.03955078125],[13.548046875000011,46.089111328125],[13.616601562500023,46.133105468749996],[13.634960937500011,46.157763671874996],[13.632519531250011,46.177050781249996],[13.420996093750006,46.212304687499994],[13.399511718750006,46.317529296874994],[13.563281250000017,46.415087890624996],[13.637109375000023,46.448535156249996],[13.6796875,46.462890625],[13.7,46.520263671875],[14.5498046875,46.399707031249996],[14.893261718750011,46.605908203125],[15.957617187500006,46.677636718749994],[16.093066406250017,46.86328125],[16.283593750000023,46.857275390625],[16.516210937500006,46.499902343749994]]]},"properties":{"name":"Slovenia","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[16.52851562500001,56.29052734375],[16.431640625,56.24375],[16.41230468750004,56.568994140624994],[17.02539062499997,57.345068359375006],[16.52851562500001,56.29052734375]]],[[[19.076464843750045,57.8359375],[18.813867187500023,57.70620117187502],[18.907910156250068,57.39833984375002],[18.146386718749994,56.920507812500006],[18.285351562500068,57.08320312500001],[18.136523437500045,57.55664062500003],[18.53740234374999,57.83056640625006],[18.90058593750001,57.91547851562504],[19.076464843750045,57.8359375]]],[[[19.156347656250063,57.92260742187497],[19.086523437500034,57.86499023437506],[19.134863281250034,57.98134765625002],[19.331445312500023,57.962890625],[19.156347656250063,57.92260742187497]]],[[[24.15546875000004,65.80527343750006],[23.102343750000074,65.73535156250003],[22.400976562500006,65.86210937499999],[22.254003906250006,65.59755859375002],[21.565527343750063,65.40810546874997],[21.609179687500074,65.261376953125],[21.410351562500068,65.31743164062505],[21.57392578125001,65.12578124999999],[21.138183593750057,64.80869140625006],[21.519628906250034,64.46308593749998],[20.76269531250003,63.86782226562505],[18.60644531250003,63.17827148437499],[18.31289062500008,62.996386718750045],[18.46308593750004,62.895849609375006],[18.170019531250034,62.789355468750074],[17.906640625000023,62.88676757812502],[18.037304687500068,62.60053710937498],[17.834472656250057,62.50273437500002],[17.410253906250063,62.508398437500034],[17.633691406249994,62.23300781250006],[17.374511718750057,61.866308593750034],[17.465429687500006,61.68447265625005],[17.196386718750006,61.72456054687504],[17.13076171875005,61.57573242187499],[17.25097656250003,60.70078125],[17.6611328125,60.53515625000003],[17.955761718750068,60.589794921874955],[18.85273437500001,60.02587890625],[18.970507812500045,59.757226562499994],[17.964257812500023,59.359375],[18.56025390625004,59.39448242187498],[18.285351562500068,59.109375],[16.978125,58.65415039062506],[16.214257812500023,58.636669921874955],[16.92382812499997,58.49257812499999],[16.651953125,58.43432617187503],[16.65224609375008,57.50068359374998],[16.348730468750063,56.70927734374996],[15.826660156250028,56.12495117187501],[14.782031250000017,56.16191406250002],[14.754785156250051,56.03315429687498],[14.401953125000034,55.97675781250004],[14.21503906250004,55.83261718749998],[14.341699218749994,55.52773437500002],[14.17373046875008,55.396630859374966],[12.885839843750063,55.41137695312506],[12.973925781250074,55.748144531250006],[12.471191406250057,56.29052734375],[12.801660156250051,56.263916015625],[12.65644531250004,56.44057617187502],[12.857421875000028,56.45239257812503],[12.883691406250051,56.61772460937496],[12.421484375000034,56.906396484374966],[11.449316406250063,58.118359374999955],[11.43154296875008,58.339990234374994],[11.24824218750004,58.369140625],[11.14716796875004,58.98862304687498],[11.19580078125,59.07827148437505],[11.388281250000063,59.036523437499966],[11.470703125000057,58.909521484375034],[11.64277343750004,58.92607421875002],[11.798144531250074,59.28989257812498],[11.680761718750034,59.59228515625003],[12.486132812500074,60.10678710937506],[12.588671874999989,60.450732421875045],[12.29414062500004,61.00268554687506],[12.706054687500028,61.059863281250074],[12.88076171875008,61.35229492187506],[12.155371093750006,61.720751953125045],[12.303515625000074,62.28559570312501],[11.999902343750051,63.29169921875001],[12.175195312500051,63.595947265625],[12.792773437500017,64],[13.203515625000023,64.07509765625],[13.960546875000063,64.01401367187498],[14.141210937500006,64.17353515624998],[14.077636718750028,64.464013671875],[13.650292968750023,64.58154296874997],[14.47968750000004,65.30146484374998],[14.543261718750045,66.12934570312498],[15.483789062500051,66.30595703124999],[15.422949218750006,66.48984374999998],[16.40351562500004,67.05498046875002],[16.12744140625,67.42583007812507],[16.783593750000023,67.89501953125],[17.324609375000023,68.10380859374999],[17.91669921875001,67.96489257812502],[18.303027343750045,68.55541992187497],[19.969824218750063,68.35639648437501],[20.348046875000023,68.84873046875003],[20.116699218750057,69.02089843750005],[20.622167968750006,69.036865234375],[21.99746093750005,68.52060546874998],[22.854101562500034,68.36733398437502],[23.63886718750004,67.95439453125002],[23.454882812500045,67.46025390625007],[23.733593750000068,67.42290039062499],[23.64150390625005,67.12939453124997],[23.988574218750045,66.81054687500003],[23.700292968750034,66.25263671874998],[24.15546875000004,65.80527343750006]]]]},"properties":{"name":"Sweden","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[31.9482421875,-25.957617187500006],[32.060546875,-26.018359375],[32.04140625000002,-26.28125],[32.10595703125,-26.52001953125],[32.112890625,-26.839453125],[32.02480468750002,-26.811132812500006],[31.994726562500006,-26.817480468750006],[31.967187500000023,-26.96064453125001],[31.946093750000017,-27.173632812500003],[31.958398437500023,-27.30585937500001],[31.742578125000023,-27.30996093750001],[31.469531250000017,-27.295507812500006],[31.274023437500006,-27.238378906250006],[31.063378906250023,-27.1123046875],[30.938085937500006,-26.915820312500003],[30.88330078125,-26.79238281250001],[30.806738281250006,-26.785253906250006],[30.794335937500023,-26.764257812500006],[30.803320312500006,-26.41347656250001],[31.08808593750001,-25.98066406250001],[31.207324218750017,-25.843359375],[31.33515625000001,-25.75556640625001],[31.382617187500017,-25.74296875],[31.415136718750006,-25.74658203125],[31.921679687500017,-25.96875],[31.9482421875,-25.957617187500006]]]},"properties":{"name":"Swaziland","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[55.54033203125002,-4.693066406250011],[55.54296875,-4.785546875],[55.383398437500006,-4.609277343750009],[55.45576171875001,-4.558789062500011],[55.54033203125002,-4.693066406250011]]]},"properties":{"name":"Seychelles","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[42.358984375,37.10859375],[41.78857421875,36.59716796875],[41.41679687500002,36.5146484375],[41.295996093750006,36.383349609374996],[41.354101562500006,35.640429687499996],[41.19472656250002,34.768994140625],[40.98701171875001,34.429052734375],[38.773535156250006,33.372216796874994],[36.818359375,32.317285156249994],[36.3720703125,32.3869140625],[35.78730468750001,32.734912109374996],[35.91347656250002,32.94960937499999],[35.869140625,33.43173828125],[36.03447265625002,33.58505859375],[35.98613281250002,33.75263671875],[36.36503906250002,33.83935546875],[36.27783203125,33.92529296875],[36.5849609375,34.221240234374996],[36.50439453125,34.432373046875],[36.32988281250002,34.499609375],[36.383886718750006,34.65791015625],[35.97626953125001,34.629199218749996],[35.902441406250006,35.420703125],[35.76445312500002,35.571582031249996],[35.83964843750002,35.84921875],[35.892675781250006,35.916552734374996],[35.96757812500002,35.910058593749994],[36.12734375000002,35.831445312499994],[36.15361328125002,35.833886718749994],[36.34755859375002,36.003515625],[36.37539062500002,36.171240234375],[36.63671875,36.233984375],[36.64140625000002,36.263525390625],[36.5375,36.45742187499999],[36.54667968750002,36.50634765625],[36.596875,36.7013671875],[36.62841796875,36.777685546875],[36.65859375000002,36.802539062499996],[36.77656250000001,36.79267578125],[36.94179687500002,36.7583984375],[36.9853515625,36.702392578125],[37.06621093750002,36.652636718749996],[37.43632812500002,36.643310546875],[37.523535156250006,36.6783203125],[37.7203125,36.743701171874996],[37.90664062500002,36.79462890625],[38.19169921875002,36.9015625],[38.7666015625,36.693115234375],[38.90644531250001,36.694677734375],[39.1083984375,36.680566406249994],[39.35664062500001,36.681591796875],[39.50146484375,36.70224609375],[39.6865234375,36.738623046875],[40.01640625000002,36.826074218749994],[40.705664062500006,37.097705078124996],[41.886816406250006,37.156396484374994],[42.05986328125002,37.2060546875],[42.16787109375002,37.288623046874996],[42.202734375,37.29726562499999],[42.24755859375,37.2822265625],[42.2685546875,37.2765625],[42.31289062500002,37.22958984375],[42.358984375,37.10859375]]]},"properties":{"name":"Syria","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[-72.3328125,21.85136718749999],[-72.14433593750002,21.79272460937503],[-72.33544921874994,21.758007812499983],[-72.3328125,21.85136718749999]]]},"properties":{"name":"Turks and Caicos Is.","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[23.980273437500017,19.496630859375003],[23.970800781250006,15.721533203124991],[23.10517578125001,15.702539062499994],[22.933886718750017,15.533105468749994],[22.93232421875001,15.162109375],[22.6708984375,14.722460937500003],[22.38154296875001,14.550488281249997],[22.53857421875,14.161865234375],[22.1064453125,13.7998046875],[22.228125,13.32958984375],[21.825292968750006,12.79052734375],[21.928125,12.678125],[22.352343750000017,12.660449218749989],[22.472460937500017,12.067773437499994],[22.580957031250023,11.990136718749994],[22.591113281250017,11.579882812499989],[22.922656250000017,11.344873046874994],[22.86005859375001,10.919677734375],[22.49384765625001,10.996240234374994],[21.771484375,10.642822265625],[21.682714843750006,10.289843749999989],[20.773242187500017,9.405664062499994],[20.342089843750017,9.127099609374994],[18.95625,8.938867187499994],[18.886035156250017,8.836035156249991],[19.108691406250017,8.656152343749994],[18.56416015625001,8.0458984375],[17.6494140625,7.98359375],[16.784765625,7.550976562499997],[16.545312500000023,7.865478515625],[16.37890625,7.683544921874997],[15.957617187500006,7.507568359375],[15.480078125,7.523779296874991],[15.5498046875,7.787890624999989],[15.1162109375,8.557324218749997],[14.332324218750017,9.20351562499999],[13.977246093750011,9.691552734374994],[14.243261718750006,9.979736328125],[15.654882812500006,10.0078125],[15.276074218750011,10.357373046874997],[15.132226562500023,10.648486328124989],[15.029882812500006,11.11367187499999],[15.08125,11.845507812499989],[14.847070312500023,12.502099609374994],[14.461718750000017,13.021777343749989],[14.244824218750011,13.07734375],[14.06396484375,13.07851562499999],[13.932324218750011,13.258496093749997],[13.606347656250023,13.70458984375],[13.505761718750023,14.134423828124994],[13.4482421875,14.380664062500003],[14.367968750000017,15.750146484374994],[15.474316406250011,16.908398437499997],[15.735058593750011,19.904052734375],[15.963183593750017,20.34619140625],[15.587109375000011,20.733300781249994],[15.607324218750023,20.954394531250003],[15.181835937500011,21.523388671874997],[14.97900390625,22.99619140624999],[15.984082031250011,23.445214843749994],[20.14765625000001,21.38925781249999],[23.980273437500017,19.496630859375003]]]},"properties":{"name":"Chad","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[0.900488281250006,10.993261718749991],[0.763378906250011,10.386669921874997],[1.330078125,9.996972656249994],[1.3857421875,9.361669921874991],[1.600195312500006,9.050048828125],[1.624707031250011,6.997314453125],[1.530957031250011,6.992431640625],[1.777929687500006,6.294628906249997],[1.62265625,6.216796875],[1.187207031250011,6.089404296874989],[0.736914062500006,6.452587890624997],[0.525585937500011,6.850927734374991],[0.634765625,7.353662109374994],[0.5,7.546875],[0.686328125000017,8.354882812499994],[0.37255859375,8.75927734375],[0.48876953125,8.851464843749994],[0.525683593750017,9.398486328124989],[0.2333984375,9.463525390624994],[0.342578125000017,9.604150390624994],[0.264550781250023,9.644726562499997],[0.380859375,10.291845703124991],[-0.08632812499999,10.673046875],[0.009423828125023,11.02099609375],[-0.068603515625,11.115625],[0.49267578125,10.954980468749994],[0.900488281250006,10.993261718749991]]]},"properties":{"name":"Togo","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[98.40908203125005,7.90205078125004],[98.2962890625,7.776074218750054],[98.32207031250007,8.166308593749974],[98.4349609375,8.085644531249969],[98.40908203125005,7.90205078125004]]],[[[100.070703125,9.58603515625002],[99.96240234375003,9.421630859375],[99.93955078125006,9.559960937500037],[100.070703125,9.58603515625002]]],[[[102.42675781250003,11.988720703125026],[102.30195312500004,11.98081054687502],[102.27744140625006,12.151855468750043],[102.42675781250003,11.988720703125026]]],[[[100.12246093750005,20.316650390625057],[100.11494140625004,20.257666015625034],[100.13974609375012,20.245410156250017],[100.31796875000006,20.38588867187505],[100.51953125000003,20.17792968750004],[100.39765625000004,19.756103515625],[100.51357421875005,19.553466796875],[101.21191406249997,19.54833984375003],[101.22080078125006,19.486621093750074],[101.19755859375007,19.327929687500074],[101.2863281250001,18.977148437500006],[101.04697265625012,18.441992187500063],[101.05058593750002,18.407031250000045],[101.1375,18.28686523437497],[101.14394531250005,18.14262695312499],[100.90849609375002,17.583886718750023],[100.95585937500002,17.541113281250006],[101.10517578125004,17.47954101562499],[101.16748046874997,17.49902343749997],[101.41367187500012,17.71875],[101.55507812500005,17.812353515625034],[101.56367187500004,17.82050781250001],[101.6875,17.889404296875],[101.77480468750005,18.03339843750004],[101.81865234375002,18.06464843750001],[101.87548828124997,18.046435546875017],[101.94746093750004,18.081494140624983],[102.03457031250005,18.169824218750023],[102.10146484375,18.210644531249983],[102.14824218750002,18.20385742187503],[102.35185546875002,18.045947265625017],[102.45878906250002,17.984619140625057],[102.55253906250007,17.96508789062497],[102.61679687500006,17.833349609375034],[102.66064453124997,17.817968750000034],[102.680078125,17.824121093750023],[103.05136718750006,18.02851562500001],[103.0912109375,18.13823242187499],[103.14853515625006,18.221728515625045],[103.19970703124997,18.259472656249983],[103.26318359374997,18.27846679687505],[103.27958984375002,18.304980468750017],[103.24892578125,18.338964843750034],[103.25175781250002,18.373486328124955],[103.2882812500001,18.408398437499955],[103.36699218750007,18.42333984374997],[103.48798828125004,18.418164062499983],[103.62968750000002,18.38256835937503],[103.79228515625002,18.316503906249977],[103.89882812500005,18.295312500000023],[103.949609375,18.31899414062505],[104.04873046875005,18.216699218749994],[104.19619140625005,17.988378906250006],[104.32265625,17.815820312500023],[104.428125,17.69897460937503],[104.7396484375,17.461669921875],[104.81601562500012,17.30029296874997],[104.75898437500004,17.0771484375],[104.7435546875,16.884375],[104.75058593750012,16.647558593750063],[104.81933593750003,16.46606445312503],[105.04716796875007,16.160253906249977],[105.14873046875007,16.09355468749999],[105.33066406250006,16.037890625000017],[105.40625,15.987451171875051],[105.39892578124997,15.829882812500017],[105.62207031250003,15.699951171875],[105.641015625,15.656542968750045],[105.6388671875001,15.585937500000057],[105.615625,15.488281250000057],[105.49042968750004,15.256591796875],[105.49042968750004,15.127587890625009],[105.5333984375001,15.041601562499991],[105.54667968750002,14.932470703124963],[105.52304687500012,14.843310546875003],[105.49736328125002,14.590673828124963],[105.47558593750003,14.530126953124977],[105.42265625000007,14.471630859375054],[105.34218750000005,14.416699218750054],[105.24365234375003,14.367871093750054],[105.1833007812501,14.346240234374989],[105.16914062500004,14.336083984374966],[105.12597656250003,14.280957031250011],[105.07412109375005,14.227441406250037],[104.77900390625004,14.427832031250006],[103.19941406250004,14.332617187499977],[102.90927734375006,14.136718750000028],[102.546875,13.585693359375043],[102.33632812500005,13.560302734375014],[102.49960937500012,12.669970703125003],[102.75566406250002,12.42626953125],[102.73662109375007,12.089794921875011],[102.93388671875002,11.706689453125037],[102.594140625,12.203027343749994],[102.54023437500004,12.109228515624977],[101.83574218750002,12.640380859375014],[100.89775390625007,12.653808593749986],[100.96269531250007,13.431982421874991],[100.60292968750005,13.568164062500017],[100.23564453125002,13.48447265625002],[99.99052734375007,13.243457031250031],[100.08994140625006,13.045654296874972],[99.96396484375006,12.690039062500006],[99.98906250000007,12.170800781249994],[99.16503906250003,10.319824218750028],[99.25390625000003,9.265234375000034],[99.83554687500012,9.288378906250031],[99.98955078125007,8.589208984374977],[100.129296875,8.428076171875006],[100.16347656250005,8.508398437500034],[100.27939453125006,8.268505859375011],[100.54521484375002,7.226904296874991],[100.43935546875005,7.280761718750043],[100.38037109375003,7.541503906250043],[100.28378906250006,7.551513671875043],[100.25664062500002,7.774902343749986],[100.16074218750012,7.599267578124994],[100.4235351562501,7.18784179687502],[101.01787109375002,6.860937500000034],[101.49794921875005,6.865283203125031],[102.10107421874997,6.242236328125031],[101.87363281250012,5.825292968749991],[101.67841796875004,5.778808593750028],[101.5560546875,5.907763671875003],[101.1139648437501,5.636767578125045],[100.98164062500004,5.771044921875045],[101.05351562500002,6.242578125],[100.87392578125,6.24541015624996],[100.75449218750012,6.460058593749991],[100.3454101562501,6.549902343750006],[100.26142578125004,6.682714843749963],[100.11914062499997,6.441992187500048],[99.69599609375004,6.87666015625004],[99.72031250000012,7.106201171875],[99.55302734375002,7.218798828125031],[99.59697265625002,7.355615234375009],[99.35859375000004,7.372216796875023],[99.26367187499997,7.619042968750037],[99.07763671874997,7.718066406250045],[99.05107421875002,7.887841796874994],[98.78867187500012,8.059814453125028],[98.703515625,8.256738281250009],[98.57919921875006,8.344287109374989],[98.42099609375006,8.17822265625],[98.30546875000007,8.226220703125009],[98.24179687500006,8.767871093750045],[98.70253906250005,10.19038085937504],[98.7572265625,10.660937499999974],[99.1901367187501,11.105273437499989],[99.61474609374997,11.781201171875026],[99.40507812500002,12.547900390625003],[99.12392578125,13.030761718750043],[99.13681640625006,13.716699218749994],[98.57001953125004,14.359912109375031],[98.20214843749997,14.97592773437502],[98.19101562500012,15.204101562499972],[98.55693359375007,15.367675781249986],[98.59238281250006,16.05068359375005],[98.81796875000012,16.180810546874994],[98.88828125000006,16.351904296875034],[98.83544921875003,16.417578125],[98.66074218750006,16.330419921875006],[98.4388671875,16.975683593750034],[97.7064453125,17.79711914062503],[97.63222656250005,18.290332031250074],[97.37392578125,18.51796875],[97.74589843750002,18.58818359374999],[97.816796875,19.459960937500057],[98.01503906250005,19.74951171874997],[98.37128906250004,19.68916015625004],[98.9166992187501,19.77290039062504],[99.07421875000003,20.09936523437503],[99.48593750000006,20.14985351562501],[99.45888671875005,20.363037109375],[99.72011718750005,20.32543945312497],[99.8903320312501,20.424414062499977],[99.9542968750001,20.415429687500023],[100.0036132812501,20.37958984375001],[100.12246093750005,20.316650390625057]]]]},"properties":{"name":"Thailand","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[70.66416015625,39.85546875],[70.55957031250003,39.790917968749994],[70.48925781250003,39.86303710937503],[70.48281250000005,39.88271484375005],[70.49775390625004,39.88242187499998],[70.56708984375004,39.86660156250005],[70.66416015625,39.85546875]]],[[[70.95800781250003,40.238867187500034],[70.59921875,39.974511718749994],[69.96679687499997,40.202246093750034],[69.46875,40.020751953125],[69.47099609375002,39.990625],[69.43193359375007,39.909765625000034],[69.36542968750004,39.94707031250002],[69.30722656250006,39.968554687500045],[69.27880859374997,39.91777343749999],[69.24472656250006,39.82709960937498],[69.29765625000007,39.52480468750005],[70.50117187500004,39.58735351562501],[70.79931640625003,39.39472656250001],[71.4703125,39.60366210937502],[71.50302734375006,39.58217773437502],[71.51738281250002,39.55385742187502],[71.50585937499997,39.51708984374997],[71.5033203125,39.47880859374999],[71.73222656250002,39.422998046874994],[71.77861328125007,39.27797851562502],[72.04277343750002,39.352148437500034],[72.08417968750004,39.310644531250034],[72.14736328125005,39.26074218749997],[72.22998046874997,39.20751953124997],[72.63994140625002,39.385986328125],[73.10927734375,39.36191406249998],[73.2349609375,39.37456054687499],[73.3361328125001,39.41235351562506],[73.38740234375004,39.442724609375034],[73.4704101562501,39.46059570312502],[73.63164062500007,39.44887695312502],[73.63632812500006,39.396679687499955],[73.60732421875,39.229199218749955],[73.8052734375,38.968652343749994],[73.69609375000007,38.85429687499996],[73.80166015625,38.60688476562501],[74.02558593750004,38.53984375000002],[74.27744140625,38.659765625000034],[74.81230468750002,38.46030273437498],[74.8942382812501,37.60141601562498],[75.11875,37.38569335937498],[74.89130859375004,37.231640624999955],[74.875390625,37.24199218750002],[74.83046875,37.28593750000002],[74.73056640625006,37.35703125],[74.659375,37.39448242187501],[74.34902343750005,37.41875],[74.25966796875005,37.41542968750002],[74.20351562500005,37.37246093750005],[74.16708984375,37.32944335937498],[73.74960937500006,37.23178710937498],[73.6535156250001,37.239355468750034],[73.62753906250006,37.261572265625006],[73.71728515625003,37.32944335937498],[73.7337890625,37.37578125000002],[73.72060546875,37.41875],[73.65712890625005,37.43046875],[73.6046875000001,37.44604492187503],[73.48134765625,37.4716796875],[73.38291015625006,37.462255859375034],[73.21113281250004,37.40849609375002],[72.89550781250003,37.26752929687498],[72.65742187500004,37.029052734375],[71.665625,36.696923828124994],[71.530859375,36.845117187499994],[71.43291015625007,37.12753906249998],[71.5822265625001,37.91010742187498],[71.55195312500004,37.93315429687496],[71.48779296874997,37.93188476562497],[71.38964843750003,37.90629882812502],[71.31992187500006,37.90185546875],[71.27851562500004,37.91840820312498],[71.33271484375004,38.170263671875034],[71.25585937499997,38.306982421875006],[70.7359375,38.42255859375001],[70.41777343750002,38.075439453125],[70.21464843750002,37.92441406250006],[70.19941406250004,37.88603515624996],[70.25498046875006,37.76538085937497],[70.25146484374997,37.66416015625006],[70.18867187500004,37.58247070312501],[70.11982421875004,37.54350585937499],[69.9849609375,37.566162109375],[69.8208984375,37.60957031250004],[69.62578125000002,37.59404296874999],[69.49208984375,37.55307617187498],[69.42011718750004,37.486718749999966],[69.39921875000007,37.39931640625002],[69.42968749999997,37.290869140625034],[69.414453125,37.20776367187497],[69.35380859375007,37.15004882812502],[69.3039062500001,37.11694335937503],[69.26484375000004,37.1083984375],[69.18017578125003,37.158300781250034],[68.96044921875003,37.32504882812498],[68.9118164062501,37.33393554687501],[68.88525390624997,37.32807617187498],[68.85537109375005,37.31684570312501],[68.83847656250006,37.30283203124998],[68.82373046874997,37.27070312500001],[68.78203125000002,37.25800781250001],[68.7232421875,37.26801757812501],[68.6691406250001,37.258398437500006],[68.3869140625001,37.1375],[68.29951171875004,37.08842773437502],[68.28476562500006,37.036328124999955],[68.2609375000001,37.01308593750002],[68.2121093750001,37.02153320312496],[68.0677734375,36.949804687500006],[67.95800781249997,36.972021484375006],[67.83447265624997,37.06420898437506],[67.75898437500004,37.172216796875034],[67.7980468750001,37.244970703125006],[67.81435546875005,37.48701171875004],[68.3502929687501,38.211035156250006],[68.08720703125002,38.47353515625002],[68.13251953125004,38.927636718749966],[67.69443359375006,38.99462890625003],[67.64833984375005,39.13105468750004],[67.3576171875001,39.216699218749994],[67.426171875,39.46557617187497],[67.71904296875007,39.62138671875002],[68.46328125,39.53671874999998],[68.63896484375007,39.8388671875],[68.86875,39.90747070312503],[68.80468750000003,40.05034179687499],[68.9720703125,40.08994140624998],[68.63066406250007,40.16708984374998],[69.27490234374997,40.19809570312498],[69.20625,40.566552734374994],[69.35722656250002,40.76738281249996],[69.71289062500003,40.65698242187503],[70.40195312500006,41.03510742187498],[70.75107421875006,40.721777343750006],[70.37158203125003,40.38413085937506],[70.653125,40.201171875],[70.95800781250003,40.238867187500034]]]]},"properties":{"name":"Tajikistan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[66.52226562500007,37.34848632812506],[66.471875,37.3447265625],[65.7650390625,37.56914062499996],[65.55498046875002,37.25117187500004],[65.30361328125005,37.24677734375001],[65.08964843750007,37.237939453124994],[64.9515625,37.19355468750001],[64.81630859375005,37.13208007812503],[64.7824218750001,37.05927734375001],[64.60253906250003,36.554541015625034],[64.5658203125,36.427587890625034],[64.51103515625002,36.34067382812498],[64.184375,36.14892578125],[63.8625,36.012353515624994],[63.12998046875006,35.84619140624997],[63.169726562500074,35.678125],[63.05664062500003,35.44580078125003],[62.98027343750002,35.40917968750003],[62.85800781250006,35.34965820312499],[62.688085937500006,35.25532226562504],[62.3078125000001,35.17080078125005],[62.08964843750002,35.3796875],[61.62099609375005,35.43232421875004],[61.34472656249997,35.62949218750006],[61.26201171875002,35.61958007812498],[61.25214843750004,35.86762695312498],[61.15292968750006,35.97675781250001],[61.212011718750006,36.190527343750034],[61.11962890625003,36.64257812500003],[60.34130859375003,36.63764648437501],[60.06279296875002,36.962890625],[59.454980468749994,37.25283203125002],[59.30175781249997,37.51064453125005],[58.81542968750003,37.683496093749994],[58.261621093749994,37.665820312500045],[57.35371093750004,37.97333984374998],[57.1935546875001,38.216406250000034],[56.440625,38.249414062499994],[56.272070312500006,38.080419921875034],[55.38085937500003,38.051123046875034],[54.90009765625004,37.77792968750006],[54.6994140625001,37.47016601562498],[53.91416015625006,37.34355468750002],[53.86865234375003,38.949267578125045],[53.70458984375003,39.209570312500034],[53.33632812500005,39.34082031250006],[53.15664062499999,39.26499023437506],[53.23564453125002,39.608544921874966],[53.603125,39.546972656250034],[53.472265625,39.66879882812498],[53.48730468749997,39.909375],[52.9875,39.98759765625002],[53.03554687500005,39.7744140625],[52.80468749999997,40.054003906250045],[52.73369140625002,40.39873046875002],[52.943457031250006,41.03808593750006],[53.1452148437501,40.82495117187497],[53.61523437500003,40.818505859374994],[53.87001953125005,40.64868164062503],[54.37734375,40.693261718749966],[54.319433593750006,40.83457031249998],[54.68505859375003,40.873046875],[54.70371093750006,41.071142578125034],[54.094824218750006,41.51938476562506],[53.80468749999997,42.11762695312498],[53.16416015625006,42.09379882812502],[52.97001953125002,41.97622070312505],[52.81484375,41.711816406249994],[52.850390625000074,41.20029296875006],[52.4938476562501,41.780371093750034],[53.0558593750001,42.14775390624999],[54.120996093749994,42.335205078125],[54.85380859375002,41.965185546875006],[55.434375,41.296289062499994],[55.97744140625005,41.32221679687504],[57.01796875,41.26347656249996],[57.11884765625004,41.35029296874998],[56.96406250000004,41.856542968750006],[57.290625,42.123779296875],[57.814257812500074,42.18984375000005],[58.02890625,42.48764648437506],[58.474414062500074,42.29936523437496],[58.15156250000004,42.628076171874966],[58.477148437500006,42.66284179687503],[58.5890625000001,42.778466796874966],[59.35429687500002,42.32329101562496],[59.98515625000002,42.21171875],[59.94179687499999,41.97353515625002],[60.20078125000006,41.803125],[60.07558593750005,41.759667968749966],[60.089648437500074,41.39941406250003],[60.454980468749994,41.221630859374955],[61.2423828125001,41.18920898437503],[61.496972656249994,41.276074218749955],[61.90283203124997,41.09370117187501],[62.48320312500002,39.97563476562496],[63.76367187500003,39.16054687499999],[64.3099609375,38.97729492187497],[65.612890625,38.23857421875002],[65.97119140624997,38.244238281250006],[66.60625,37.98671875000005],[66.52558593750004,37.785742187500034],[66.51132812500006,37.59916992187496],[66.51064453125,37.45869140625004],[66.52226562500007,37.34848632812506]]]},"properties":{"name":"Turkmenistan","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[124.0363281250001,-9.341601562500031],[124.44443359375012,-9.190332031250023],[124.28232421875012,-9.427929687500026],[124.0363281250001,-9.341601562500031]]],[[[125.06816406250002,-9.511914062499997],[124.96015625000004,-9.213769531250009],[125.10048828125,-9.189843750000023],[125.14902343750012,-9.042578125000034],[124.93681640625007,-9.053417968750026],[124.92226562500005,-8.942480468749977],[125.17802734375002,-8.647851562499994],[125.38183593749997,-8.575390624999983],[126.61972656250006,-8.459472656249986],[126.96640625000012,-8.315722656250017],[127.29609375000004,-8.424511718749969],[126.91523437500004,-8.715234374999966],[125.40800781250002,-9.275781250000023],[125.06816406250002,-9.511914062499997]]],[[[125.64609375000006,-8.139941406250003],[125.5794921875,-8.311816406250017],[125.50712890625007,-8.275097656249997],[125.64609375000006,-8.139941406250003]]]]},"properties":{"name":"Timor-Leste","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-175.1619140625,-21.169335937500023],[-175.07817382812496,-21.129003906249977],[-175.15659179687495,-21.26367187499997],[-175.36235351562496,-21.106835937499994],[-175.1619140625,-21.169335937500023]]],[[[-173.953515625,-18.63935546875001],[-174.06914062500002,-18.640234375],[-173.96806640624993,-18.565332031250023],[-173.953515625,-18.63935546875001]]]]},"properties":{"name":"Tonga","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-61.012109374999966,10.134326171874989],[-61.906103515625006,10.069140625000031],[-61.49931640624999,10.268554687499972],[-61.47827148437497,10.603369140624977],[-61.65117187499993,10.718066406249974],[-60.917626953124966,10.84023437499999],[-61.03374023437502,10.669873046875026],[-61.012109374999966,10.134326171874989]]]},"properties":{"name":"Trinidad and Tobago","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[10.957617187500063,33.72207031250005],[10.722070312500051,33.738916015624994],[10.745214843750063,33.88867187500006],[11.017871093749989,33.82333984374998],[10.957617187500063,33.72207031250005]]],[[[11.278027343750068,34.753808593749994],[11.123632812500063,34.68168945312496],[11.254882812500057,34.82031250000006],[11.278027343750068,34.753808593749994]]],[[[10.274609375000011,31.684960937499994],[10.114941406250068,31.46376953125005],[10.216406250000063,30.78320312500003],[10.05976562500004,30.58007812500003],[9.932519531250051,30.42534179687496],[9.895019531250028,30.387304687500034],[9.51875,30.229394531249994],[9.224023437500023,31.373681640624994],[9.160253906250006,31.621337890625],[9.044042968750034,32.072363281250034],[8.333398437500051,32.54360351562502],[8.1125,33.055322265624994],[7.877246093750017,33.172119140625],[7.534375,33.717919921874994],[7.513867187500068,34.080517578124955],[8.24560546875,34.73408203124998],[8.276855468750057,34.97949218749997],[8.312109375000063,35.084619140624994],[8.394238281250011,35.20385742187503],[8.318066406250011,35.654931640624994],[8.348730468750063,36.367968750000045],[8.207617187500006,36.518945312499994],[8.601269531250068,36.83393554687504],[8.576562500000023,36.93720703125001],[9.687988281250057,37.34038085937499],[9.838476562500063,37.30898437499999],[9.830273437499983,37.13535156250006],[9.875585937499977,37.25415039062503],[10.196386718750063,37.205859375000045],[10.293261718750074,36.781494140625],[10.412304687499983,36.73183593750002],[11.053906250000068,37.07250976562506],[11.12666015625004,36.874072265625045],[10.476562500000028,36.175146484375006],[10.590820312500028,35.88725585937499],[11.00429687500008,35.63383789062496],[11.120117187500057,35.24028320312499],[10.69091796875,34.67846679687503],[10.118359375000068,34.280078125000045],[10.049023437500068,34.056298828124994],[10.305273437500034,33.72827148437497],[10.713183593750017,33.68901367187496],[10.722753906250006,33.514404296875],[10.958007812500057,33.62631835937498],[11.257421875000034,33.30883789062506],[11.202636718749972,33.24921874999998],[11.50458984375004,33.181933593750045],[11.502441406250028,33.15556640624999],[11.467187500000051,32.96572265625005],[11.459179687500011,32.897363281249966],[11.453906250000017,32.64257812500003],[11.533789062500034,32.52495117187496],[11.535937500000017,32.47333984375001],[11.504980468750034,32.413671875000034],[11.358007812500006,32.34521484375003],[11.168261718750074,32.25673828125002],[11.005175781250074,32.17270507812506],[10.826367187500068,32.080664062500034],[10.771582031250006,32.02119140625001],[10.60888671875,31.929541015624977],[10.47578125000004,31.736035156249983],[10.274609375000011,31.684960937499994]]]]},"properties":{"name":"Tunisia","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[25.970019531250045,40.136328125],[25.6689453125,40.13588867187502],[25.918359375000023,40.23798828125004],[25.970019531250045,40.136328125]]],[[[43.43339843750002,41.155517578125],[43.43945312500003,41.10712890625001],[43.72265624999997,40.71953124999999],[43.56933593750003,40.48237304687498],[43.66621093750004,40.12636718750002],[44.28925781250004,40.040380859375006],[44.76826171875004,39.70351562500005],[44.81718750000002,39.65043945312496],[44.58710937500004,39.76855468750006],[44.3893554687501,39.422119140625],[44.02324218750002,39.37744140625006],[44.27167968750004,38.83603515625006],[44.2985351562501,38.38627929687499],[44.4499023437501,38.33422851562506],[44.21132812499999,37.908056640625006],[44.589941406250006,37.710351562499966],[44.574023437500074,37.435400390625006],[44.79414062500004,37.290380859375034],[44.76513671875003,37.142431640625006],[44.73095703124997,37.16528320312503],[44.66933593750005,37.17358398437503],[44.60595703124997,37.176025390625],[44.401953125,37.05849609375002],[44.325585937499994,37.0107421875],[44.28183593750006,36.97802734374997],[44.24570312500006,36.983300781249994],[44.20166015624997,37.05180664062502],[44.208398437499994,37.20263671875],[44.19179687499999,37.249853515625034],[44.15625,37.28295898437503],[44.11445312500004,37.30185546875006],[44.01318359375003,37.313525390625045],[43.83642578124997,37.223535156249994],[43.67578125000003,37.227246093749955],[43.09248046875004,37.36738281249998],[42.936621093750006,37.32475585937502],[42.77460937500004,37.371875],[42.74111328125005,37.361914062500034],[42.6354492187501,37.249267578125],[42.45585937500002,37.128710937500045],[42.358984375,37.10859375000004],[42.31289062499999,37.22958984374998],[42.26855468749997,37.276562499999955],[42.24755859375003,37.28222656250006],[42.20273437500006,37.29726562499999],[42.16787109375005,37.28862304687502],[42.059863281250074,37.2060546875],[41.886816406250006,37.156396484374994],[40.70566406250006,37.09770507812502],[40.4503906250001,37.00888671875006],[40.016406250000074,36.82607421875002],[39.68652343749997,36.73862304687506],[39.50146484374997,36.702246093750034],[39.35664062500004,36.68159179687498],[39.10839843749997,36.68056640625005],[38.90644531250004,36.69467773437498],[38.76660156249997,36.69311523437503],[38.19169921875002,36.90156250000004],[37.90664062500005,36.79462890625001],[37.7203125,36.74370117187502],[37.52353515625006,36.678320312500034],[37.436328125000074,36.643310546875],[37.327050781249994,36.64658203125006],[37.18740234375005,36.655908203124994],[37.066210937500074,36.652636718750045],[36.98535156250003,36.70239257812506],[36.94179687499999,36.758398437500006],[36.77656250000004,36.79267578124998],[36.65859375000005,36.80253906250002],[36.62841796875003,36.777685546875034],[36.596875,36.70136718750001],[36.546679687500074,36.50634765625],[36.5375,36.457421874999966],[36.63671874999997,36.233984375],[36.37539062499999,36.171240234375034],[36.347558593749994,36.003515625000034],[36.20195312500002,35.93754882812502],[36.15361328125002,35.83388671875005],[36.12734375,35.831445312499994],[35.967578125000074,35.91005859375002],[35.89267578125006,35.91655273437502],[35.81093750000005,36.30986328125002],[36.18847656250003,36.65898437499999],[36.048925781250006,36.91059570312501],[35.393164062500006,36.57519531249997],[34.70361328125003,36.81679687499999],[33.694726562499994,36.18198242187498],[32.794824218749994,36.03588867187497],[32.37773437500002,36.18364257812496],[32.02197265625003,36.53530273437502],[31.35253906249997,36.80107421874999],[30.64404296874997,36.86567382812501],[30.446093750000074,36.269873046875034],[29.6890625,36.15668945312498],[29.22363281249997,36.32446289062497],[28.96962890625008,36.71533203125003],[28.303710937500057,36.81196289062498],[28.01943359375005,36.63447265624998],[28.083984375000057,36.75146484375],[27.453906250000017,36.712158203125],[28.00537109375003,36.83198242187498],[28.242382812500068,37.029052734375],[27.262988281250045,36.97656250000003],[27.30019531250005,37.12685546875002],[27.53505859375005,37.16386718750002],[27.06796875,37.65791015625004],[27.224414062500074,37.725439453125006],[27.23242187500003,37.978662109374994],[26.29072265625001,38.27719726562498],[26.44130859375005,38.64121093749998],[26.67421875000008,38.33574218750002],[27.14423828125001,38.45195312499996],[26.906835937500034,38.48173828124999],[26.763671875,38.709619140624966],[27.013671875000057,38.88686523437502],[26.814941406250057,38.96098632812502],[26.853613281250034,39.115625],[26.68183593750004,39.292236328125],[26.89921874999999,39.549658203125034],[26.113085937500074,39.46738281249998],[26.101367187500074,39.56894531249998],[26.18134765625004,39.99008789062498],[26.738085937500045,40.40024414062506],[27.28457031250008,40.45561523437496],[27.4755859375,40.319921875000034],[27.72802734375,40.32880859374998],[27.84853515625005,40.38173828125002],[27.73183593750008,40.48149414062499],[27.87490234375008,40.512939453125],[27.989550781250074,40.48945312500001],[27.96259765625001,40.369873046875],[29.00712890624999,40.389746093750034],[28.787890625000017,40.534033203125034],[28.95800781250003,40.63056640624998],[29.849218750000063,40.760107421875006],[29.113867187499977,40.93784179687506],[29.14814453125004,41.221044921875034],[31.25488281249997,41.10761718750001],[31.45800781249997,41.32001953125004],[32.306445312500074,41.72958984374998],[33.38134765625003,42.01757812500003],[34.75048828124997,41.95683593749999],[35.006445312500006,42.06328125000002],[35.15488281250006,42.02753906250001],[35.12207031250003,41.89111328125003],[35.297753906249994,41.72851562500003],[35.558007812499994,41.63403320312506],[36.05175781249997,41.68256835937498],[36.40537109375006,41.27460937500001],[36.77773437499999,41.36347656250001],[37.066210937500074,41.184423828125034],[38.38105468750004,40.92451171875001],[39.426367187500006,41.10644531250003],[40.26523437500006,40.96132812500005],[41.08359375000006,41.26118164062504],[41.41435546875002,41.42363281249999],[41.510058593750074,41.51748046875002],[41.70175781250006,41.471582031249994],[41.77939453125006,41.44052734374998],[41.823535156250074,41.432373046875],[41.92578125000003,41.49565429687502],[42.46640625,41.43984375000002],[42.56738281249997,41.55927734375001],[42.590429687500006,41.57070312500002],[42.60683593750005,41.57880859374998],[42.682421875000074,41.58574218749999],[42.75410156250004,41.57890625000002],[42.787890625000074,41.56372070312503],[42.82167968750005,41.49238281249998],[42.90673828125003,41.46684570312502],[43.05712890625003,41.35283203124996],[43.149023437500006,41.30712890624997],[43.171289062499994,41.28793945312498],[43.14101562499999,41.26484374999998],[43.15283203124997,41.23642578125006],[43.20546875000005,41.19916992187501],[43.43339843750002,41.155517578125]]],[[[27.47480468750001,41.946875],[28.014453125000017,41.96904296874999],[28.197851562500063,41.55449218750002],[29.057226562500006,41.22973632812503],[28.95625,41.00820312499999],[28.172167968750074,41.08071289062502],[27.49941406250005,40.97314453124997],[27.258007812499983,40.687353515625006],[26.772070312500034,40.498046875],[26.202734375000034,40.07539062500004],[26.25380859375005,40.31469726562503],[26.792089843750034,40.626611328124994],[26.10546875000003,40.61132812499997],[26.03896484375008,40.726757812499955],[26.331054687500057,40.954492187499994],[26.330664062499977,41.23876953125],[26.62490234375008,41.401757812499994],[26.581347656250074,41.60126953125004],[26.320898437500034,41.716552734375],[26.3603515625,41.80156249999999],[26.51142578125004,41.82636718749998],[26.549707031250023,41.896728515625],[26.5796875,41.947949218749955],[26.615332031250063,41.964892578125045],[26.884863281250006,41.99184570312502],[26.96875,42.02685546875006],[27.01171875,42.05864257812496],[27.193359375000057,42.07709960937498],[27.24433593750004,42.09326171875],[27.294921875000057,42.079541015624955],[27.47480468750001,41.946875]]]]},"properties":{"name":"Turkey","childNum":3}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[39.71132812499999,-7.977441406250023],[39.602929687499994,-7.936132812499949],[39.907128906249994,-7.649218750000031],[39.71132812499999,-7.977441406250023]]],[[[39.49648437499999,-6.174609375],[39.573046875000074,-6.387402343750011],[39.48095703124997,-6.45371093750002],[39.18232421875004,-6.172558593750026],[39.30898437499999,-5.721972656249974],[39.49648437499999,-6.174609375]]],[[[39.86503906250002,-4.906152343750037],[39.74931640625002,-5.443847656249986],[39.646777343750074,-5.368554687500009],[39.6734375,-4.927050781250031],[39.86503906250002,-4.906152343750037]]],[[[33.90322265625005,-1.002050781250034],[37.643847656250074,-3.045410156250028],[37.608203125000074,-3.497070312500028],[39.221777343750006,-4.692382812500014],[38.80468750000003,-6.070117187500031],[38.87402343750003,-6.33125],[39.5460937500001,-7.024023437500034],[39.288476562499994,-7.517871093750003],[39.28701171875005,-7.787695312500006],[39.4284179687501,-7.81279296874996],[39.441015625,-8.011523437499946],[39.304003906250074,-8.44384765625],[39.451269531250006,-8.94296875],[39.64130859375004,-9.19248046875002],[39.72519531250006,-10.000488281249972],[40.46357421875004,-10.464355468749972],[39.98867187499999,-10.820800781250014],[39.81708984375004,-10.912402343750031],[38.9875,-11.167285156250003],[38.49179687500006,-11.413281250000026],[37.92021484375002,-11.294726562500031],[37.72480468750004,-11.58066406250002],[37.54169921875004,-11.675097656249974],[37.37285156250002,-11.710449218749986],[36.97890625000005,-11.566992187499977],[36.30566406250003,-11.706347656249946],[36.191308593749994,-11.670703124999974],[36.17548828125004,-11.60927734374998],[36.08222656250004,-11.537304687499969],[35.91132812500004,-11.45468750000002],[35.785449218750074,-11.452929687500017],[35.63095703125006,-11.582031250000028],[35.564355468749994,-11.602343749999989],[35.418261718750074,-11.583203125],[35.18261718750003,-11.574804687499977],[34.95947265625003,-11.578125],[34.93701171874997,-11.463476562500034],[34.890625,-11.3935546875],[34.77382812500005,-11.341699218750009],[34.60791015624997,-11.08046875],[34.66708984375006,-10.792480468750028],[34.56992187500006,-10.241113281249966],[34.32089843750006,-9.731542968749977],[33.99560546875003,-9.495410156250003],[33.88886718750004,-9.670117187499983],[32.91992187500003,-9.407421875000026],[32.75664062500002,-9.322265625],[31.94257812500004,-9.05400390624996],[31.91865234375004,-8.942187500000017],[31.886132812499994,-8.921972656249977],[31.81806640625004,-8.902246093749952],[31.673632812500017,-8.908789062499963],[31.55625,-8.80546875],[31.44921874999997,-8.65390625],[31.35058593750003,-8.607031250000034],[31.07636718750004,-8.611914062499963],[30.968359375000063,-8.550976562499983],[30.89199218750005,-8.473730468749963],[30.830664062500063,-8.385546875000031],[30.720898437500097,-8.104394531250037],[30.40673828125003,-7.460644531249983],[30.313183593750097,-7.203710937499949],[30.212695312500017,-7.037890625000017],[30.10625,-6.915039062500028],[29.961816406249994,-6.803125],[29.798144531250017,-6.691894531249957],[29.70966796875004,-6.61689453125004],[29.590625,-6.394433593750023],[29.540820312500017,-6.313867187500037],[29.50625,-6.172070312500011],[29.480078125,-6.025],[29.490820312500063,-5.96542968750002],[29.59638671875004,-5.775976562499963],[29.60703125,-5.722656250000028],[29.59414062500005,-5.650781250000037],[29.542382812499994,-5.499804687500017],[29.34277343749997,-4.983105468749997],[29.32343750000004,-4.898828124999966],[29.32568359374997,-4.835644531249969],[29.404199218749994,-4.49667968750002],[29.40322265625005,-4.449316406249963],[29.71777343750003,-4.45585937499996],[29.94726562499997,-4.307324218749983],[30.4,-3.65390625],[30.790234375000097,-3.274609375000011],[30.811132812500006,-3.116406250000011],[30.78027343750003,-2.984863281249957],[30.70947265624997,-2.977246093749997],[30.604296875000074,-2.935253906249969],[30.515039062499994,-2.917578125],[30.45556640625003,-2.893164062500006],[30.433496093749994,-2.874511718750028],[30.424023437500097,-2.82402343749996],[30.473339843750097,-2.6943359375],[30.42421875000005,-2.641601562500014],[30.441992187500006,-2.613476562499969],[30.53369140624997,-2.426269531250014],[30.55361328125005,-2.400097656250011],[30.593359375000063,-2.39677734374996],[30.65664062500005,-2.373828124999989],[30.71484375000003,-2.363476562500011],[30.7625,-2.371679687499991],[30.828710937500006,-2.338476562499977],[30.85498046874997,-2.265429687500017],[30.8765625,-2.143359375000017],[30.864648437499994,-2.044042968749949],[30.819140625000017,-1.967480468749983],[30.812597656250006,-1.56308593750002],[30.76220703124997,-1.458691406249983],[30.710742187500074,-1.396777343749974],[30.631933593750006,-1.36748046874996],[30.508105468750074,-1.208203125000026],[30.47021484374997,-1.13115234374996],[30.47705078124997,-1.0830078125],[30.509960937500097,-1.067285156249994],[30.51992187499999,-1.0625],[30.67275390625005,-1.051367187499949],[30.741992187500017,-1.007519531249997],[30.809179687500063,-0.994921875],[30.82363281250005,-0.999023437499943],[30.84472656250003,-1.002050781250034],[32.371875,-1.002050781250034],[33.90322265625005,-1.002050781250034]]]]},"properties":{"name":"Tanzania","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[30.50996093750001,-1.067285156250009],[30.46992187500001,-1.066015625],[30.41230468750001,-1.063085937500006],[30.360253906250023,-1.074609375],[29.930078125000023,-1.469921875000011],[29.82539062500001,-1.335546875],[29.576953125000017,-1.387890625000011],[29.717675781250023,0.098339843749997],[29.934472656250023,0.4990234375],[29.94287109375,0.819238281249994],[31.252734375000017,2.044580078124994],[31.176367187500006,2.270068359374989],[30.728613281250006,2.455371093749989],[30.8466796875,2.847021484374991],[30.754003906250006,3.041796874999989],[30.90644531250001,3.408935546875],[30.83857421875001,3.49072265625],[31.15234375,3.785595703124997],[31.547167968750017,3.677587890624991],[31.79804687500001,3.802636718749994],[32.13593750000001,3.519726562499997],[32.33574218750002,3.706201171874994],[32.99726562500001,3.880175781249989],[33.489355468750006,3.755078125],[33.568457031250006,3.81171875],[33.74160156250002,3.985253906249994],[33.97607421875,4.22021484375],[34.13203125000001,3.88916015625],[34.18574218750001,3.869775390624994],[34.1650390625,3.81298828125],[34.26708984375,3.733154296875],[34.39287109375002,3.691503906249991],[34.43769531250001,3.650585937499997],[34.44179687500002,3.60625],[34.3994140625,3.412695312499991],[34.4072265625,3.357519531249991],[34.447851562500006,3.163476562499994],[34.90576171875,2.4796875],[34.88300781250001,2.417919921874997],[34.96406250000001,2.062402343749994],[34.9775390625,1.861914062499991],[34.97646484375002,1.719628906249994],[34.79863281250002,1.24453125],[34.48173828125002,1.042138671874994],[34.41083984375001,0.867285156249991],[34.16093750000002,0.605175781249997],[33.94316406250002,0.173779296874997],[33.90322265625002,-1.002050781250006],[32.371875,-1.002050781250006],[30.8447265625,-1.002050781250006],[30.823632812500023,-0.9990234375],[30.809179687500006,-0.994921875],[30.741992187500017,-1.007519531250011],[30.672753906250023,-1.051367187500006],[30.598730468750006,-1.069726562500009],[30.519921875000023,-1.0625],[30.50996093750001,-1.067285156250009]]]},"properties":{"name":"Uganda","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[32.01220703124997,46.20390624999999],[32.15009765625004,46.1546875],[31.56386718750005,46.25776367187504],[31.50878906250003,46.373144531250006],[32.01220703124997,46.20390624999999]]],[[[38.21435546875003,47.091455078124966],[37.54335937499999,47.07456054687498],[36.794824218749994,46.71440429687499],[36.55878906250004,46.76269531250006],[35.82714843749997,46.62431640625002],[35.01455078125005,46.10600585937502],[35.280175781249994,46.27949218750001],[35.23037109375005,46.440625],[34.84960937500003,46.189892578124955],[35.02285156250005,45.70097656250002],[35.45751953124997,45.316308593749994],[36.170507812500006,45.453076171874955],[36.575,45.3935546875],[36.39335937500002,45.06538085937501],[35.87011718750003,45.005322265624955],[35.472558593749994,45.098486328125006],[35.08769531250002,44.802636718749966],[34.46992187500004,44.7216796875],[33.909960937500074,44.387597656249966],[33.45068359374997,44.553662109374955],[33.55517578125003,45.09765625000003],[32.5080078125001,45.40380859375006],[33.664843750000074,45.94707031249996],[33.59414062500005,46.09624023437499],[33.42988281250004,46.05761718750003],[33.20224609375006,46.17573242187501],[32.47675781250004,46.08369140625001],[31.83125,46.28168945312501],[32.00849609375004,46.42998046875002],[31.554882812500097,46.554296875000034],[32.36132812499997,46.474951171875034],[32.578027343749994,46.615625],[32.04433593750005,46.642480468749966],[31.75917968750005,47.21284179687501],[31.872851562500017,46.649755859375034],[31.532128906249994,46.66474609374998],[31.56337890625005,46.77729492187501],[31.402929687500063,46.62880859375002],[30.796289062499994,46.55200195312503],[30.219042968750074,45.866748046875045],[29.62841796875003,45.722460937500045],[29.705859375000074,45.25991210937505],[29.567675781250074,45.37080078124998],[29.40371093750005,45.419677734375],[29.22353515625005,45.402929687500034],[28.894335937500017,45.28994140625002],[28.78173828125,45.30986328125002],[28.76660156250003,45.28623046874998],[28.78828125000001,45.240966796875],[28.451269531250006,45.292187499999955],[28.317675781250045,45.347119140624955],[28.2125,45.45043945312506],[28.26484375000004,45.48388671875003],[28.310351562500074,45.49858398437499],[28.499023437500057,45.517724609374994],[28.513769531250034,45.57241210937502],[28.49160156250005,45.66577148437503],[28.562304687500074,45.73579101562501],[28.667578125,45.79384765625002],[28.729296875000074,45.852001953124955],[28.73876953125003,45.937158203124994],[28.84951171875005,45.97866210937502],[28.94775390624997,46.049951171874966],[28.971875,46.12763671874998],[29.00625,46.17646484374998],[28.94375,46.28842773437506],[28.930566406250023,46.36225585937501],[28.92744140625001,46.42412109374999],[28.958398437500023,46.45849609374997],[29.146289062500017,46.52690429687496],[29.186230468750068,46.52397460937499],[29.20078125,46.504980468750034],[29.20458984374997,46.37934570312501],[29.223828125000097,46.37695312499997],[29.458789062500017,46.453759765624994],[29.83789062499997,46.35053710937501],[29.878027343750063,46.360205078125034],[30.07568359375003,46.377832031249966],[30.131054687500097,46.42309570312506],[29.92431640624997,46.53886718750002],[29.934765625000097,46.625],[29.942480468750063,46.72377929687502],[29.918066406250063,46.78242187499998],[29.877832031249994,46.828906250000045],[29.57197265625004,46.96401367187502],[29.455664062500006,47.292626953124994],[29.134863281250006,47.48969726562501],[29.125390625000023,47.96455078125001],[28.42304687500001,48.146875],[28.34052734375001,48.144433593749994],[27.54921875000008,48.47773437500004],[27.22851562500003,48.37143554687506],[26.90058593750001,48.37192382812506],[26.847070312500023,48.387158203124955],[26.640429687500045,48.29414062500001],[26.618945312500017,48.25986328125006],[26.4423828125,48.22998046875],[26.162695312500063,47.992529296875034],[25.90869140625,47.96757812500002],[25.689257812500045,47.93247070312506],[25.46425781250005,47.910791015624994],[24.979101562500063,47.72412109374997],[24.578906250000074,47.93105468750005],[23.628710937500017,47.995849609375],[23.40820312500003,47.98999023437506],[23.20263671875,48.084521484375045],[23.13945312499999,48.08740234375],[22.87666015625001,47.94726562500006],[22.769140625000063,48.109619140625],[22.582421875000023,48.134033203125],[22.253710937500017,48.407373046874994],[22.131835937500057,48.40532226562502],[22.142871093750017,48.568505859374966],[22.295214843750045,48.68583984374999],[22.389453125000045,48.87348632812501],[22.52412109375004,49.03139648437502],[22.538671875,49.07270507812501],[22.847070312500023,49.08125],[22.705664062500006,49.17119140624999],[22.6494140625,49.53901367187498],[22.706152343750006,49.60620117187497],[23.03632812500004,49.899072265624966],[23.711718750000045,50.377343749999966],[23.97265625,50.410058593749966],[24.089941406250006,50.53046874999998],[24.0947265625,50.617041015625034],[23.9970703125,50.809375],[24.095800781250063,50.87275390625001],[23.664453125000023,51.31005859375],[23.61376953125,51.525390625],[23.706835937500045,51.64130859374998],[23.79169921875001,51.63710937500002],[23.864257812500057,51.62397460937501],[23.951171875,51.58505859374998],[23.978320312500017,51.59130859375003],[24.12685546875008,51.664648437500034],[24.280078125000017,51.77470703124999],[24.361914062500006,51.86752929687498],[25.785742187500006,51.923828125],[26.77343750000003,51.77070312499998],[26.952832031249983,51.754003906250034],[27.074121093750023,51.760839843750006],[27.14199218750008,51.75205078124998],[27.29628906250008,51.59741210937503],[27.689746093750017,51.572412109374994],[27.7,51.47797851562501],[27.85859375000004,51.59238281250006],[28.532031250000017,51.56245117187501],[28.59902343750008,51.54262695312505],[28.647753906250074,51.45654296875],[28.690234375000017,51.43886718750005],[28.73125,51.43339843749999],[28.84951171875005,51.540185546874994],[28.927539062500045,51.56215820312502],[28.97773437500004,51.57177734375003],[29.01308593750005,51.59892578124996],[29.06074218750001,51.625439453124955],[29.102050781250057,51.627539062500034],[29.346484375000017,51.38256835937503],[30.160742187500006,51.477880859375006],[30.449511718750017,51.274316406249994],[30.63251953125004,51.35541992187501],[30.61171875000005,51.406347656250006],[30.602343750000017,51.47124023437499],[30.56074218750004,51.531494140625],[30.533007812500017,51.596337890624966],[30.583886718749994,51.68896484375003],[30.667285156250017,51.81411132812502],[30.755273437499994,51.89516601562502],[30.84570312500003,51.95307617187501],[30.980664062500097,52.04619140624996],[31.217968750000097,52.05024414062498],[31.345996093750074,52.10537109375002],[31.57373046875003,52.108105468749955],[31.763378906250097,52.10107421875003],[32.12226562500004,52.05058593749996],[32.435449218749994,52.307226562500034],[33.735253906249994,52.344775390625045],[34.397851562499994,51.780419921874994],[34.12109375000003,51.67915039062498],[34.21386718750003,51.25537109375006],[35.0640625,51.203417968750045],[35.31191406250005,51.043896484374955],[35.59111328125002,50.36875],[36.1164062500001,50.408544921875006],[36.619433593750074,50.209228515625],[37.42285156249997,50.411474609375006],[38.046875,49.92001953125006],[38.258593750000074,50.05234375],[38.91835937499999,49.82470703125],[39.17480468750003,49.85595703124997],[39.780566406250074,49.57202148437503],[40.080664062500006,49.576855468749955],[40.10878906250005,49.251562500000034],[39.68652343749997,49.007910156250034],[40.00361328125004,48.82207031250002],[39.792871093749994,48.807714843750034],[39.6447265625001,48.591210937499966],[39.8356445312501,48.54277343749996],[39.95791015625005,48.268896484375034],[39.77871093750005,47.88754882812506],[38.90029296875005,47.85512695312502],[38.36884765625004,47.609960937500006],[38.21435546875003,47.091455078124966]]]]},"properties":{"name":"Ukraine","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-57.81059570312499,-30.85859375000001],[-57.872509765625,-30.59101562500001],[-57.831201171874994,-30.495214843750006],[-57.71269531249999,-30.38447265625001],[-57.65087890625,-30.295019531250006],[-57.645751953125,-30.226953125],[-57.60888671875,-30.187792968750003],[-57.55229492187499,-30.26123046875],[-57.21445312499999,-30.28339843750001],[-57.186914062499994,-30.26484375000001],[-57.120507812499994,-30.14443359375001],[-56.83271484375,-30.107226562500003],[-56.4072265625,-30.44746093750001],[-55.998974609375,-30.837207031250003],[-56.018457031249994,-30.99189453125001],[-56.00468749999999,-31.079199218750006],[-55.873681640624994,-31.069628906250003],[-55.6271484375,-30.85810546875001],[-55.60302734375,-30.85078125000001],[-55.55732421875,-30.8759765625],[-55.17353515625,-31.279589843750003],[-55.09116210937499,-31.31396484375],[-55.036035156249994,-31.27900390625001],[-54.587646484375,-31.48515625],[-54.22055664062499,-31.85517578125001],[-53.76171875,-32.05683593750001],[-53.601708984374994,-32.40302734375001],[-53.12558593749999,-32.73671875],[-53.2140625,-32.82109375],[-53.31010742187499,-32.92705078125],[-53.39521484375,-33.010351562500006],[-53.482861328125,-33.06855468750001],[-53.511865234374994,-33.10869140625],[-53.53134765624999,-33.1708984375],[-53.53134765624999,-33.65546875000001],[-53.37060546875,-33.7421875],[-53.419580078124994,-33.77919921875001],[-53.47246093749999,-33.84931640625001],[-53.53452148437499,-34.01748046875001],[-53.742919921875,-34.24951171875],[-53.785302734374994,-34.38037109375],[-54.16855468749999,-34.670703125],[-54.902294921875,-34.93281250000001],[-55.67314453124999,-34.77568359375],[-56.249951171875,-34.90126953125001],[-57.17070312499999,-34.45234375000001],[-57.8291015625,-34.47734375],[-58.40019531249999,-33.91240234375],[-58.363525390625,-33.18232421875001],[-58.08232421874999,-32.893652343750006],[-58.12958984375,-32.75722656250001],[-58.16220703124999,-32.566503906250006],[-58.201171875,-32.4716796875],[-58.123046875,-32.321875],[-58.11972656249999,-32.24892578125001],[-58.164794921875,-32.18486328125],[-58.177001953125,-32.11904296875001],[-58.15634765624999,-32.0515625],[-58.160400390625,-31.98652343750001],[-58.18901367187499,-31.92421875],[-58.16748046875,-31.87265625],[-58.04233398437499,-31.76923828125001],[-58.006982421874994,-31.68496093750001],[-58.053857421874994,-31.494921875],[-58.0333984375,-31.416601562500006],[-57.89335937499999,-31.1953125],[-57.868408203125,-31.10439453125001],[-57.88632812499999,-30.93740234375001],[-57.81059570312499,-30.85859375000001]]]},"properties":{"name":"Uruguay","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.58134765624996,19.012011718750017],[-155.88129882812495,19.07050781250001],[-156.04868164062498,19.749951171874983],[-155.82031249999997,20.01416015624997],[-155.83164062499998,20.27583007812501],[-155.198779296875,19.99438476562503],[-154.80419921875,19.524462890625045],[-155.58134765624996,19.012011718750017]]],[[[-156.84960937499997,20.772656249999955],[-156.97338867187497,20.757519531249983],[-157.0505859375,20.912451171875034],[-156.88056640624995,20.904833984375074],[-156.84960937499997,20.772656249999955]]],[[[-156.48681640624994,20.93256835937504],[-156.27753906250004,20.951269531250034],[-155.98984374999998,20.75712890624999],[-156.40878906249998,20.60517578125004],[-156.480078125,20.80122070312501],[-156.69775390625003,20.949072265625034],[-156.58540039062495,21.034326171874994],[-156.48681640624994,20.93256835937504]]],[[[-157.21362304687497,21.215380859375017],[-156.71215820312506,21.155078125000074],[-156.85986328125,21.05634765625004],[-157.29033203124996,21.112597656250017],[-157.21362304687497,21.215380859375017]]],[[[-157.79936523437502,21.456640625000034],[-157.63540039062502,21.30761718749997],[-158.11035156249994,21.318603515625],[-158.27314453125,21.585253906250045],[-157.9625,21.701367187499983],[-157.79936523437502,21.456640625000034]]],[[[-159.37275390625,21.93237304687497],[-159.60883789062495,21.909521484375034],[-159.78916015625003,22.041796875000074],[-159.57919921874998,22.22314453124997],[-159.35205078124997,22.219580078125034],[-159.37275390625,21.93237304687497]]],[[[-81.04418945312503,24.716796875000057],[-81.137353515625,24.710498046875017],[-80.93046875,24.75947265625004],[-81.04418945312503,24.716796875000057]]],[[[-80.3818359375,25.142285156249955],[-80.58056640624997,24.954248046875023],[-80.25708007812497,25.34760742187504],[-80.3818359375,25.142285156249955]]],[[[-97.17070312499996,26.159375],[-97.40209960937494,26.820507812499983],[-97.38598632812494,27.19648437500004],[-97.17070312499996,26.159375]]],[[[-80.18676757812497,27.278417968750034],[-80.17050781250003,27.20478515625004],[-80.43691406249994,27.850537109374955],[-80.18676757812497,27.278417968750034]]],[[[-91.793701171875,29.50073242187497],[-92.00664062499996,29.61030273437501],[-91.875244140625,29.640966796875034],[-91.793701171875,29.50073242187497]]],[[[-84.90791015624998,29.642626953125017],[-85.11674804687499,29.63281249999997],[-84.737158203125,29.732421875],[-84.90791015624998,29.642626953125017]]],[[[-89.22397460937498,30.084082031249977],[-89.34199218749995,30.062841796875006],[-89.18466796874995,30.168652343749983],[-89.22397460937498,30.084082031249977]]],[[[-118.34794921875002,33.3857421875],[-118.29746093750003,33.312109375],[-118.44628906249997,33.317089843749955],[-118.56943359375002,33.46416015624999],[-118.34794921875002,33.3857421875]]],[[[-120.04355468749995,33.918847656249994],[-120.25190429687494,34.01386718749998],[-120.07182617187493,34.026513671874966],[-120.04355468749995,33.918847656249994]]],[[[-119.88237304687497,34.07968749999998],[-119.54926757812497,34.02817382812506],[-119.80957031249997,33.9677734375],[-119.88237304687497,34.07968749999998]]],[[[-75.54414062499995,35.240087890625034],[-75.69008789062502,35.221582031249994],[-75.53637695312497,35.27861328124999],[-75.50351562500003,35.769140625],[-75.46474609374994,35.448632812499966],[-75.54414062499995,35.240087890625034]]],[[[-74.13320312500002,39.680761718750034],[-74.25048828125,39.529394531250006],[-74.10673828124996,39.74643554687498],[-74.13320312500002,39.680761718750034]]],[[[-72.50976562500003,40.98603515625001],[-72.58085937499996,40.92133789062498],[-71.90322265625,41.06069335937505],[-73.19428710937495,40.654199218749994],[-74.01489257812497,40.581201171874966],[-73.87924804687498,40.79165039062502],[-73.573828125,40.91962890624998],[-72.62509765624998,40.99184570312505],[-72.27412109374998,41.15302734375001],[-72.50976562500003,40.98603515625001]]],[[[-69.9779296875,41.26557617187504],[-70.23305664062502,41.28632812500001],[-70.04121093750001,41.3974609375],[-69.9779296875,41.26557617187504]]],[[[-70.50991210937502,41.376318359375034],[-70.82919921874995,41.35898437500006],[-70.61601562499996,41.45722656250001],[-70.50991210937502,41.376318359375034]]],[[[-71.24140625000001,41.49194335937497],[-71.34624023437496,41.469384765624994],[-71.23203124999995,41.654296875],[-71.24140625000001,41.49194335937497]]],[[[-68.18725585937497,44.33247070312501],[-68.41171875000003,44.294335937499966],[-68.29941406249998,44.456494140624955],[-68.18725585937497,44.33247070312501]]],[[[-122.394140625,47.39526367187503],[-122.50991210937497,47.358007812500006],[-122.486474609375,47.48876953125],[-122.394140625,47.39526367187503]]],[[[-122.57275390624999,48.15664062499999],[-122.38315429687499,47.923193359375034],[-122.74150390624999,48.22529296875004],[-122.62861328125,48.38422851562498],[-122.54243164062503,48.29399414062499],[-122.69702148437499,48.228662109374994],[-122.57275390624999,48.15664062499999]]],[[[-94.80346679687497,49.0029296875],[-94.71279296874997,48.863427734374994],[-94.62089843749999,48.74262695312501],[-93.85161132812496,48.607275390625034],[-93.70771484374995,48.52543945312499],[-93.37788085937498,48.61655273437498],[-93.25795898437497,48.62885742187501],[-92.83671875,48.567773437499994],[-92.50058593749995,48.43535156250002],[-92.41459960937493,48.276611328125],[-92.3484375,48.276611328125],[-92.00517578125002,48.301855468750006],[-91.38720703124997,48.05854492187498],[-91.04345703125003,48.19370117187498],[-90.84033203125003,48.20053710937506],[-90.79731445312495,48.13105468750001],[-89.4556640625,47.996240234374994],[-88.37817382812497,48.30307617187498],[-87.74389648437497,48.06054687500003],[-87.20800781249997,47.848486328125006],[-86.67216796874996,47.636425781249955],[-85.65224609375,47.21997070312503],[-85.07006835937497,46.97993164062498],[-84.87597656249994,46.89990234375003],[-84.66577148437503,46.54326171875002],[-84.44047851562496,46.49814453125006],[-84.12319335937497,46.50292968749997],[-83.97778320312503,46.08491210937498],[-83.61596679687503,46.116845703124994],[-83.46948242187503,45.99467773437499],[-83.59267578125,45.81713867187506],[-82.91933593749994,45.51796875000002],[-82.55107421874996,45.34736328125001],[-82.48505859374993,45.08374023437503],[-82.137841796875,43.570898437500034],[-82.19038085937495,43.47407226562501],[-82.54531249999997,42.62470703124998],[-83.10952148437497,42.25068359375001],[-83.141943359375,41.97587890624996],[-82.69003906249995,41.675195312499994],[-82.43906249999998,41.67485351562502],[-81.97416992187496,41.88872070312499],[-81.50732421874997,42.10346679687504],[-81.02822265624997,42.247167968750006],[-80.24755859375,42.36601562499996],[-79.17373046875,42.74853515625],[-78.91508789062496,42.90913085937504],[-78.98076171874993,42.98061523437502],[-79.02617187499996,43.01733398437506],[-79.066064453125,43.10610351562502],[-79.171875,43.466552734375],[-79.00249023437502,43.52714843749999],[-78.845556640625,43.58334960937498],[-78.72041015625001,43.62495117187501],[-78.45825195312497,43.63149414062502],[-77.596533203125,43.62861328124998],[-76.819970703125,43.62880859375002],[-76.18579101562503,44.24223632812502],[-75.81933593749997,44.468017578125],[-75.40126953124997,44.77226562499999],[-74.99614257812496,44.970117187499966],[-74.76245117187494,44.99907226562502],[-74.663232421875,45.00390625000003],[-71.51752929687495,45.00756835937497],[-71.327294921875,45.29008789062496],[-70.86503906249999,45.27070312500001],[-70.296240234375,45.90610351562506],[-70.00771484375002,46.70893554687501],[-69.24287109374998,47.46298828124998],[-69.0501953125,47.426611328125034],[-68.93720703124998,47.21123046875002],[-68.23549804687502,47.34594726562503],[-67.806787109375,47.08281249999999],[-67.80224609374994,45.7275390625],[-67.43266601562496,45.603125],[-67.366943359375,45.17377929687498],[-67.12485351562498,45.16943359375],[-66.98701171874995,44.82768554687502],[-67.191259765625,44.67558593750002],[-67.83906249999998,44.576269531250034],[-68.056640625,44.38432617187502],[-68.15205078124998,44.50200195312499],[-68.45058593749997,44.50761718749999],[-68.53251953124996,44.25864257812498],[-68.81191406249994,44.33935546875],[-68.76269531249994,44.57075195312498],[-69.22607421875003,43.98647460937505],[-69.52075195312503,43.89736328125002],[-69.55668945312496,43.982763671875006],[-69.62392578125,43.88061523437497],[-69.65288085937493,43.99389648437506],[-69.808349609375,43.772314453125034],[-69.965234375,43.855078125],[-70.17880859374998,43.76635742187506],[-70.73310546875001,43.07001953125004],[-70.82905273437493,42.82534179687502],[-70.61293945312497,42.623242187499955],[-71.04619140624993,42.331103515625045],[-70.73828125,42.228857421875006],[-70.42666015625002,41.75727539062501],[-70.00141601562498,41.82617187500003],[-70.24106445312495,42.09121093750002],[-70.10893554687496,42.07832031249998],[-69.97788085937498,41.961279296875006],[-69.94863281249997,41.67714843750005],[-70.65712890625,41.53422851562496],[-70.70112304687498,41.71484375],[-71.1685546875,41.489404296874994],[-71.14873046874996,41.74570312499998],[-71.27109375,41.68125],[-71.39013671875003,41.79531250000005],[-71.52285156249997,41.378955078125045],[-72.92470703125002,41.28515625000003],[-73.98710937499999,40.751367187499994],[-73.87197265625,41.05517578124997],[-73.96992187499995,41.24970703125001],[-73.92719726562495,40.914257812499955],[-74.26420898437496,40.52861328124999],[-73.972265625,40.40034179687498],[-74.079931640625,39.78813476562496],[-74.06459960937497,39.99311523437498],[-74.79448242187499,39.00190429687501],[-74.95429687499995,38.949951171875],[-74.89702148437502,39.14545898437504],[-75.52421874999999,39.49018554687501],[-75.421875,39.78969726562502],[-75.07416992187495,39.98349609375006],[-75.40063476562503,39.83159179687502],[-75.58759765625001,39.64077148437505],[-75.3921875,39.09277343750006],[-75.08867187499999,38.777539062499955],[-75.18710937499995,38.59111328124999],[-75.03876953124993,38.426367187500006],[-75.934375,37.15190429687496],[-75.97504882812498,37.3984375],[-75.65927734374995,37.953955078125034],[-75.850830078125,37.971582031249994],[-75.85869140624999,38.36206054687503],[-76.05122070312495,38.27954101562503],[-76.2646484375,38.436425781249994],[-76.26416015625,38.599951171875006],[-76.016943359375,38.62509765624998],[-76.21298828124998,38.75830078125003],[-76.34116210937498,38.70966796874998],[-76.16816406249998,38.85273437499998],[-76.32958984375,38.95278320312505],[-76.13520507812493,39.082128906250006],[-76.23569335937498,39.19160156250001],[-76.153125,39.315039062500034],[-75.87597656249997,39.3759765625],[-76.003125,39.41083984375001],[-75.87294921874997,39.510888671874966],[-75.95893554687498,39.58505859374998],[-76.2763671875,39.32275390625],[-76.330810546875,39.40390625],[-76.42089843749997,39.225],[-76.57041015624995,39.26933593749996],[-76.42758789062498,39.12602539062499],[-76.55854492187493,39.065234375000045],[-76.39409179687502,38.368994140625034],[-76.67734374999998,38.611962890624966],[-76.66855468749998,38.5375],[-76.34116210937498,38.08701171875006],[-76.86811523437495,38.39028320312502],[-76.88974609375,38.292089843750006],[-77.00117187499995,38.44526367187504],[-77.23251953125,38.40771484375003],[-77.03037109374995,38.88925781249998],[-77.26040039062502,38.6],[-77.27324218749996,38.35175781249998],[-77.04677734375002,38.356689453125],[-76.26425781250003,37.89355468749997],[-76.34414062499997,37.675683593749994],[-76.49248046874999,37.682226562500006],[-77.11108398437497,38.165673828124994],[-76.54946289062494,37.66914062500001],[-76.30556640625,37.57148437500001],[-76.26347656249996,37.35703125],[-76.40097656249998,37.386132812499994],[-76.45390624999993,37.27353515625006],[-76.75771484375002,37.50541992187496],[-76.28330078125,37.05268554687501],[-76.40087890624997,36.991308593750034],[-76.63090820312493,37.22172851562499],[-77.25087890624994,37.329199218750034],[-76.671875,37.172949218750006],[-76.48784179687502,36.89702148437499],[-75.99941406249997,36.91264648437499],[-75.53417968749997,35.81909179687506],[-75.94648437499995,36.65908203125002],[-75.99277343749995,36.47377929687502],[-75.82006835937494,36.11284179687502],[-76.14785156250002,36.279296875],[-76.15,36.14575195312497],[-76.27060546874998,36.18989257812501],[-76.22739257812498,36.11601562499996],[-76.559375,36.015332031249955],[-76.733642578125,36.229150390624994],[-76.726220703125,35.957617187500034],[-76.06977539062501,35.970312500000034],[-76.08359374999998,35.69052734375006],[-75.85390625,35.96015625000001],[-75.75883789062499,35.84326171875],[-75.77392578124997,35.64697265624997],[-76.17382812499997,35.354150390624994],[-76.489501953125,35.397021484375045],[-76.57719726562502,35.53232421874998],[-76.74140624999998,35.431494140625034],[-77.03999023437495,35.527392578125045],[-76.51293945312497,35.270410156249994],[-76.77915039062503,34.990332031250034],[-77.07026367187501,35.154638671875034],[-76.97495117187503,35.025195312500045],[-76.74497070312498,34.94096679687502],[-76.45673828124998,34.989355468750034],[-76.36220703125,34.9365234375],[-76.43979492187498,34.84291992187502],[-77.29624023437503,34.602929687499994],[-77.41225585937497,34.730810546875034],[-77.37978515625,34.526611328125],[-77.750732421875,34.28496093749996],[-77.92783203125,33.93974609374999],[-77.95327148437494,34.16899414062496],[-78.01333007812502,33.91181640624998],[-78.40585937499995,33.91757812499998],[-78.84145507812497,33.72407226562501],[-79.19379882812498,33.24414062500003],[-79.22646484375,33.40488281249998],[-79.27602539062497,33.135400390624966],[-79.80498046874999,32.78740234374996],[-79.93310546874997,32.81005859375006],[-79.94072265625002,32.667138671874966],[-80.36284179687496,32.500732421875],[-80.6341796875,32.51171875000003],[-80.474267578125,32.42275390625002],[-80.579345703125,32.28730468750004],[-80.80253906249999,32.44804687500002],[-80.69423828124997,32.21572265625002],[-81.11328124999997,31.87861328125001],[-81.06611328124995,31.787988281250023],[-81.259375,31.538916015624977],[-81.17543945312494,31.531298828125017],[-81.38095703124998,31.353271484375],[-81.28847656249997,31.263916015625],[-81.441748046875,31.19970703124997],[-81.5162109375,30.801806640625017],[-81.24951171875003,29.793798828125006],[-80.52412109374995,28.48608398437503],[-80.5849609375,28.271582031250034],[-80.456884765625,27.90068359374996],[-80.61000976562494,28.177587890624977],[-80.60693359375003,28.522900390624983],[-80.693505859375,28.34497070312497],[-80.68847656250003,28.578515625000023],[-80.83818359374999,28.757666015625034],[-80.74863281250003,28.381005859375023],[-80.050048828125,26.807714843750063],[-80.1263671875,25.83349609375],[-80.48466796874999,25.229833984375034],[-81.11049804687494,25.138037109374977],[-81.13603515624999,25.309667968750034],[-80.94042968750003,25.264208984375017],[-81.11333007812499,25.367236328125045],[-81.36494140625001,25.83105468750003],[-81.715478515625,25.98315429687503],[-81.95893554687495,26.489941406249983],[-81.82866210937496,26.68706054687499],[-82.03959960937496,26.552050781250017],[-82.01328125,26.96157226562505],[-82.24287109374998,26.848876953125],[-82.44135742187501,27.059667968750034],[-82.71459960937497,27.499609375000063],[-82.40576171874994,27.862890624999977],[-82.67519531249994,27.963769531250023],[-82.61098632812502,27.77724609375005],[-82.74287109374995,27.709375],[-82.84350585937494,27.845996093750017],[-82.65146484375,28.8875],[-83.69438476562502,29.92597656250001],[-84.04423828124996,30.10380859374999],[-84.30966796874995,30.064746093750045],[-84.38281250000003,29.90737304687505],[-85.31894531249995,29.680224609375045],[-85.413818359375,29.76757812499997],[-85.413818359375,29.842480468749955],[-85.31489257812493,29.758105468750017],[-85.35361328125,29.875732421875],[-85.67578125,30.121923828125063],[-85.60351562500003,30.286767578124966],[-85.75581054687495,30.1669921875],[-86.454443359375,30.39912109375004],[-86.12382812499999,30.40581054687499],[-86.25737304687502,30.493017578124977],[-87.201171875,30.339257812499994],[-86.98579101562498,30.43085937500001],[-86.99755859375,30.5703125],[-87.17060546874998,30.538769531249983],[-87.28105468750002,30.339257812499994],[-87.47578124999998,30.294287109375006],[-87.44829101562499,30.394140625],[-87.62226562499998,30.264746093750006],[-88.00595703124998,30.230908203124955],[-87.79028320312503,30.291796875000017],[-88.011328125,30.694189453125006],[-88.13544921874998,30.366601562499994],[-88.90522460937495,30.415136718750006],[-89.32055664062503,30.3453125],[-89.58847656249998,30.165966796874955],[-90.12597656249997,30.369091796874955],[-90.33198242187493,30.277587890625057],[-90.41303710937501,30.140332031249983],[-90.17534179687499,30.02910156249996],[-89.73745117187497,30.171972656250034],[-89.66503906249994,30.117041015625034],[-89.81518554687497,30.007275390624955],[-89.631689453125,29.90380859375003],[-89.400732421875,30.04604492187505],[-89.35444335937501,29.82021484375005],[-89.72089843749995,29.619287109374966],[-89.01572265625,29.202880859375057],[-89.15551757812497,29.01660156250003],[-89.23608398437494,29.081103515625017],[-89.37612304687497,28.981347656250023],[-89.44316406249996,29.194140625000045],[-90.15908203124997,29.537158203125017],[-90.05278320312499,29.336816406249966],[-90.21279296875,29.104931640624983],[-90.37919921874996,29.29511718750001],[-90.75102539062496,29.13085937500003],[-91.29013671875,29.288964843749994],[-91.15078124999994,29.317919921875045],[-91.24882812499993,29.56420898437503],[-91.51420898437499,29.55537109375001],[-91.8931640625,29.836035156249977],[-92.135498046875,29.699462890625057],[-92.08403320312499,29.59282226562499],[-92.26083984374995,29.55683593750004],[-93.17568359375,29.778955078124994],[-93.82646484374999,29.725146484375045],[-93.84145507812502,29.97973632812503],[-93.89047851562495,29.689355468750023],[-94.759619140625,29.384277343750057],[-94.52626953125,29.547949218750006],[-94.77827148437498,29.54785156249997],[-94.74194335937497,29.75],[-95.0228515625,29.70234375000001],[-94.88828125000003,29.37055664062501],[-95.27348632812499,28.96386718750003],[-96.23452148437502,28.488964843749983],[-96.01103515624996,28.631933593749977],[-96.44873046874997,28.594482421875],[-96.64003906249994,28.708789062500017],[-96.42109374999993,28.457324218750045],[-96.67636718749998,28.34130859375003],[-96.77353515624998,28.421630859375057],[-96.839501953125,28.194384765625017],[-97.156494140625,28.144335937500045],[-97.141259765625,28.060742187499983],[-97.034326171875,28.093847656250063],[-97.07309570312498,27.98608398437503],[-97.43149414062498,27.83720703124999],[-97.28872070312494,27.670605468749983],[-97.43911132812502,27.328271484374966],[-97.76845703124997,27.45751953125],[-97.69238281250003,27.287158203125017],[-97.48510742187497,27.237402343750006],[-97.55468749999994,26.96733398437496],[-97.43505859375,26.48583984375003],[-97.14624023437494,25.961474609375045],[-97.37563476562497,25.871826171875],[-99.10776367187498,26.446923828124994],[-99.45654296874999,27.05668945312496],[-99.50532226562497,27.54833984375003],[-100.29604492187495,28.32768554687499],[-100.75458984375001,29.182519531249994],[-101.44038085937503,29.77685546875],[-102.26894531249998,29.871191406250034],[-102.61494140624994,29.75234375],[-102.8919921875,29.216406250000034],[-103.16831054687498,28.998193359374994],[-104.110595703125,29.386132812499994],[-104.50400390624995,29.677685546874955],[-104.97880859374996,30.645947265624955],[-106.14804687499995,31.450927734375],[-106.44541015624996,31.768408203125006],[-108.21181640625002,31.779345703125017],[-108.21445312499993,31.329443359375034],[-111.0419921875,31.32421875000003],[-114.83593749999994,32.50830078125003],[-114.72475585937495,32.71533203125003],[-117.12827148437495,32.533349609374994],[-117.46743164062495,33.295507812500006],[-118.08051757812497,33.72216796874997],[-118.41044921874996,33.74394531249996],[-118.506201171875,34.01738281249999],[-119.14375,34.11201171874998],[-119.60605468749999,34.41801757812499],[-120.48120117187503,34.47163085937498],[-120.64467773437502,34.57998046875002],[-120.65908203124994,35.122412109375034],[-120.85737304687501,35.209667968749955],[-120.899609375,35.42509765624999],[-121.28383789062494,35.67631835937499],[-121.87739257812498,36.33105468749997],[-121.80742187499995,36.851220703124994],[-122.394921875,37.20751953125003],[-122.49921875000001,37.542626953124994],[-122.44560546875002,37.797998046874966],[-122.07050781249998,37.47827148437503],[-122.38544921875001,37.960595703124966],[-122.31425781249999,38.00732421874997],[-121.52534179687503,38.05590820312503],[-122.39335937499995,38.14482421875002],[-122.52133789062499,37.82641601562497],[-122.93198242187498,38.05546875000002],[-122.998779296875,37.98862304687498],[-122.90815429687501,38.19658203124999],[-123.701123046875,38.90727539062502],[-123.83291015624994,39.775488281250034],[-124.35654296875003,40.37109374999997],[-124.07192382812497,41.45952148437502],[-124.53964843750003,42.812890624999966],[-124.14873046874997,43.691748046875034],[-123.92934570312495,45.57695312499996],[-123.989306640625,46.21938476562502],[-123.22060546874998,46.153613281250045],[-123.46484375,46.27109374999998],[-124.07275390624996,46.279443359374994],[-124.04433593750002,46.605078125],[-123.946142578125,46.43256835937501],[-123.88916015625003,46.660009765625006],[-124.11254882812497,46.862695312499994],[-123.84287109375002,46.963183593750045],[-124.11171875,47.03520507812496],[-124.1392578125,46.95468749999998],[-124.376025390625,47.658642578124955],[-124.66308593749996,47.97412109375003],[-124.7099609375,48.38037109375],[-123.97578125,48.16845703125],[-122.97387695312499,48.07329101562496],[-122.77861328125,48.13759765625002],[-122.65664062500002,47.88115234374999],[-122.77841796874996,47.738427734374966],[-122.82138671875,47.79316406250001],[-123.1390625,47.386083984375034],[-122.92216796874993,47.40766601562498],[-123.066796875,47.39965820312506],[-123.04863281249995,47.479345703125034],[-122.53281250000002,47.919726562500045],[-122.67548828124995,47.612353515625045],[-122.57788085937496,47.29316406250001],[-122.76777343750001,47.21835937500006],[-122.82846679687503,47.336572265624994],[-123.02758789062501,47.13891601562503],[-122.70195312500002,47.11088867187502],[-122.35380859374996,47.37158203125],[-122.40180664062497,47.78427734374998],[-122.24199218750002,48.01074218750003],[-122.5169921875,48.15966796874997],[-122.40854492187502,48.29389648437498],[-122.66899414062496,48.465234374999966],[-122.49677734374995,48.50556640625001],[-122.51274414062502,48.66943359375],[-122.56201171875001,48.777978515624994],[-122.68593749999995,48.794287109375034],[-122.72246093750002,48.85302734375003],[-122.78876953125003,48.993017578125034],[-121.40722656249994,48.993017578125034],[-119.70170898437495,48.993017578125034],[-119.27534179687494,48.99306640625005],[-118.84892578124993,48.99306640625005],[-117.99619140625002,48.99306640625005],[-116.71704101562501,48.99306640625005],[-110.74765625,48.99306640625005],[-104.77832031249997,48.993115234374955],[-98.80898437499995,48.99316406249997],[-97.52983398437493,48.99316406249997],[-96.67705078124993,48.99316406249997],[-96.25068359374993,48.99316406249997],[-95.39790039062493,48.99316406249997],[-95.16206054687493,48.991748046875045],[-95.15527343749997,49.36967773437502],[-94.85434570312495,49.304589843749994],[-94.86040039062493,49.258593750000045],[-94.80346679687497,49.0029296875]]],[[[-176.28671874999998,51.79199218750006],[-176.34965820312502,51.733300781249994],[-176.41372070312502,51.840576171875],[-176.28671874999998,51.79199218750006]]],[[[-177.87905273437502,51.64970703125002],[-178.05888671875,51.67260742187497],[-177.98637695312493,51.76425781249998],[-178.16826171874996,51.90302734375001],[-177.644482421875,51.826269531250006],[-177.87905273437502,51.64970703125002]]],[[[-177.14819335937497,51.71674804687498],[-177.67021484375002,51.701074218749994],[-177.11005859375,51.92875976562502],[-177.14819335937497,51.71674804687498]]],[[[-176.593310546875,51.86669921875],[-176.45234374999995,51.735693359375034],[-176.96162109374998,51.60366210937505],[-176.69833984374998,51.986035156249955],[-176.593310546875,51.86669921875]]],[[[179.72773437500015,51.905419921874966],[179.50390625000003,51.97958984374998],[179.6271484375001,52.03041992187502],[179.72773437500015,51.905419921874966]]],[[[177.4154296875,51.88281249999997],[177.25029296875013,51.902929687500006],[177.6696289062501,52.10302734375],[177.4154296875,51.88281249999997]]],[[[-173.5533203125,52.13627929687502],[-173.02290039062504,52.07915039062502],[-173.83579101562498,52.048193359375006],[-173.99248046874993,52.12333984374996],[-173.5533203125,52.13627929687502]]],[[[-172.464794921875,52.27226562500002],[-172.61982421874998,52.27285156250005],[-172.47041015625,52.38803710937506],[-172.31362304687497,52.32958984375006],[-172.464794921875,52.27226562500002]]],[[[-174.67739257812502,52.035009765625006],[-175.29555664062502,52.022167968749955],[-174.30615234375,52.216162109375034],[-174.43554687499997,52.317236328125034],[-174.168896484375,52.42016601562503],[-174.04560546875,52.36723632812499],[-174.12065429687493,52.13520507812498],[-174.67739257812502,52.035009765625006]]],[[[173.72275390625018,52.35957031250004],[173.40234375000009,52.40478515625],[173.77607421875004,52.49511718750003],[173.72275390625018,52.35957031250004]]],[[[172.81181640625002,53.01298828125002],[173.43603515625003,52.85205078125],[172.93515625000012,52.752099609374966],[172.49482421875004,52.93789062499999],[172.81181640625002,53.01298828125002]]],[[[-167.96435546875003,53.345117187499994],[-169.088916015625,52.83203125],[-168.68984375000002,53.227246093749955],[-168.38041992187496,53.28344726562506],[-168.28769531249998,53.500146484374966],[-167.82807617187495,53.50795898437505],[-167.96435546875003,53.345117187499994]]],[[[-166.61533203124998,53.90092773437499],[-166.37231445312494,53.99897460937498],[-166.230859375,53.93261718750006],[-166.54560546875,53.726464843749966],[-166.354541015625,53.67353515625004],[-166.85097656249997,53.45288085937503],[-167.78085937500003,53.30024414062501],[-167.13608398437503,53.526464843750006],[-167.01572265625003,53.69838867187502],[-166.80898437500002,53.64614257812505],[-166.741259765625,53.71293945312496],[-167.10561523437497,53.813378906249994],[-167.03808593749997,53.9421875],[-166.67329101562498,54.00595703124998],[-166.61533203124998,53.90092773437499]]],[[[-165.841552734375,54.070654296875006],[-166.05664062500003,54.054345703124994],[-166.08774414062498,54.16914062500001],[-165.89287109375,54.20698242187498],[-165.69287109375,54.09990234375002],[-165.841552734375,54.070654296875006]]],[[[-165.56113281249998,54.13671874999997],[-165.55063476562498,54.28452148437498],[-165.40786132812502,54.19682617187496],[-165.56113281249998,54.13671874999997]]],[[[-162.29814453124993,54.847021484375006],[-162.43388671875,54.931542968749994],[-162.26459960937504,54.983496093750006],[-162.29814453124993,54.847021484375006]]],[[[-163.476025390625,54.98071289062497],[-163.37895507812496,54.81552734374998],[-163.083251953125,54.66899414062496],[-163.35810546874995,54.73569335937506],[-164.82343749999998,54.41909179687505],[-164.887646484375,54.60781250000002],[-164.47861328124998,54.906835937500006],[-163.80712890624997,55.04907226562503],[-163.476025390625,54.98071289062497]]],[[[-159.51513671875,55.15185546875003],[-159.617724609375,55.05732421875004],[-159.54506835937497,55.22597656250002],[-159.51513671875,55.15185546875003]]],[[[-131.33974609375002,55.079833984375],[-131.32954101562498,54.887744140625045],[-131.592236328125,55.02568359374999],[-131.5654296875,55.26411132812498],[-131.33974609375002,55.079833984375]]],[[[-159.87299804687495,55.128759765625034],[-160.22705078124997,54.92270507812506],[-160.17207031249995,55.123046875],[-159.88735351562497,55.27299804687502],[-159.87299804687495,55.128759765625034]]],[[[-132.86225585937504,54.894433593749966],[-132.61723632812493,54.892431640625006],[-132.70581054687497,54.684179687500034],[-133.42905273437498,55.30380859374998],[-133.097412109375,55.213720703125006],[-132.86225585937504,54.894433593749966]]],[[[-160.329296875,55.337695312500045],[-160.34331054687493,55.25878906250006],[-160.51748046875,55.33383789062506],[-160.329296875,55.337695312500045]]],[[[-160.68491210937498,55.314794921875006],[-160.552783203125,55.38076171875002],[-160.48754882812503,55.18486328124999],[-160.79506835937497,55.14521484375001],[-160.72392578124993,55.404638671875006],[-160.68491210937498,55.314794921875006]]],[[[-133.30507812500002,55.54375],[-133.6501953125,55.26928710937506],[-133.73710937500002,55.49692382812498],[-133.30507812500002,55.54375]]],[[[-155.56601562500003,55.82119140625005],[-155.73735351562493,55.82978515625001],[-155.59394531250004,55.92431640625],[-155.56601562500003,55.82119140625005]]],[[[-130.97915039062502,55.489160156249994],[-131.187890625,55.206298828125],[-131.44755859374996,55.40878906250006],[-131.7625,55.16582031250002],[-131.84609374999997,55.41625976562497],[-131.62495117187504,55.831689453124966],[-131.26923828125004,55.95537109375002],[-130.997802734375,55.727636718750006],[-130.97915039062502,55.489160156249994]]],[[[-133.56611328125,56.33920898437498],[-133.202978515625,56.31982421875003],[-133.096630859375,56.09003906250001],[-132.59760742187504,55.89501953125],[-132.17270507812498,55.48061523437502],[-132.51127929687493,55.59394531250001],[-132.63129882812495,55.47319335937502],[-132.41787109375002,55.48291015625006],[-132.20668945312497,55.22441406249996],[-131.97641601562498,55.208593750000034],[-132.06474609375002,54.713134765625],[-133.11855468750002,55.32763671875003],[-132.95888671875002,55.39555664062502],[-133.0333984375,55.589697265625034],[-133.68017578124994,55.78515625],[-133.24150390624993,55.920800781249994],[-133.371240234375,56.035888671875],[-133.74252929687498,55.96484375],[-133.530859375,56.145654296874966],[-133.56611328125,56.33920898437498]]],[[[-132.77988281249998,56.24726562499998],[-133.03500976562498,56.34091796875006],[-132.90205078124998,56.45375976562505],[-132.62910156249995,56.411914062500045],[-132.77988281249998,56.24726562499998]]],[[[-132.11235351562493,56.109375],[-132.13295898437497,55.94326171875005],[-132.28730468749995,55.92939453124998],[-132.65991210937503,56.07817382812499],[-132.379833984375,56.49877929687497],[-132.06689453125,56.24423828124998],[-132.11235351562493,56.109375]]],[[[-154.208642578125,56.51489257812497],[-154.32221679687504,56.570605468750045],[-154.11040039062496,56.602929687499966],[-154.208642578125,56.51489257812497]]],[[[-169.755224609375,56.63505859375002],[-169.47431640624998,56.59404296875002],[-169.6326171875,56.545703125000045],[-169.755224609375,56.63505859375002]]],[[[-132.746875,56.525683593750045],[-132.94804687500002,56.56723632812498],[-132.842529296875,56.79477539062506],[-132.56796875000003,56.57583007812505],[-132.746875,56.525683593750045]]],[[[-133.98959960937503,56.84497070312497],[-133.73837890625,56.65043945312496],[-133.94970703125,56.12773437499996],[-134.18959960937502,56.07695312500002],[-134.084375,56.456347656250045],[-134.37368164062502,56.838671875000045],[-134.14326171874998,56.93232421875001],[-133.98959960937503,56.84497070312497]]],[[[-133.36621093750006,57.003515625000034],[-132.99624023437497,56.93041992187497],[-132.95917968749998,56.67705078124996],[-133.03491210937494,56.62075195312505],[-133.32895507812498,56.83007812499997],[-133.158154296875,56.495166015625045],[-133.4841796875,56.45175781249998],[-133.979443359375,57.009570312500045],[-133.36621093750006,57.003515625000034]]],[[[-153.007080078125,57.12485351562498],[-153.37460937499998,57.05190429687505],[-153.285205078125,57.18505859375],[-152.90839843750004,57.152441406250006],[-153.007080078125,57.12485351562498]]],[[[-134.96977539062496,57.351416015625034],[-134.62070312499998,56.71831054687502],[-134.68188476562503,56.216162109375034],[-134.98056640625003,56.518945312499994],[-134.88344726562497,56.679052734375034],[-135.33061523437505,56.821875],[-135.19960937499997,57.02734375],[-135.45493164062503,57.24941406250005],[-135.81230468750002,57.00952148437503],[-135.82275390625,57.280419921874966],[-135.448681640625,57.534375],[-134.96977539062496,57.351416015625034]]],[[[-152.89804687499998,57.82392578125004],[-152.42875976562493,57.82568359375003],[-152.48261718749998,57.70332031249998],[-152.21621093749997,57.577001953125006],[-152.41220703125003,57.454785156249955],[-152.94077148437498,57.49809570312499],[-152.67905273437503,57.345117187499994],[-153.274365234375,57.22636718749996],[-153.732568359375,57.052343750000034],[-153.643310546875,56.960742187500045],[-154.02734375,56.77797851562502],[-153.793212890625,56.98950195312503],[-154.24375,57.143017578124955],[-154.33896484374998,56.9208984375],[-154.67319335937498,57.44609375],[-154.11616210937498,57.651220703125006],[-153.6876953125,57.30512695312504],[-153.841552734375,57.86284179687496],[-153.48793945312497,57.73095703125],[-153.21748046875004,57.79575195312506],[-153.16044921875,57.97197265624999],[-152.85039062499993,57.896777343750045],[-152.89804687499998,57.82392578125004]]],[[[-135.73037109375002,58.244238281250034],[-135.61323242187507,57.99184570312505],[-135.346630859375,58.12412109374998],[-134.9546875,58.01533203125004],[-134.97065429687495,57.817236328125006],[-135.33847656250003,57.768652343750034],[-134.97885742187503,57.724365234375],[-134.93149414062498,57.48115234375001],[-135.564208984375,57.66640625],[-135.691943359375,57.41992187500006],[-135.91079101562502,57.44658203124999],[-136.568603515625,57.97216796875003],[-136.32197265625,58.21889648437502],[-136.14375,58.098486328125006],[-136.09438476562502,58.198144531249966],[-135.73037109375002,58.244238281250034]]],[[[-134.68027343749998,58.16166992187499],[-134.24008789062498,58.143994140624955],[-133.82275390624997,57.62866210937503],[-134.29233398437498,58.044726562500074],[-133.91113281250003,57.3525390625],[-134.51601562499997,57.042578125],[-134.48676757812495,57.48203125],[-134.92348632812497,58.354638671874966],[-134.68027343749998,58.16166992187499]]],[[[-152.416943359375,58.360205078125034],[-151.974365234375,58.30986328124999],[-152.068896484375,58.17792968750001],[-152.26835937499993,58.25170898437506],[-152.30922851562502,58.133886718750034],[-152.5982421875,58.16259765625],[-152.92841796875004,57.99370117187499],[-153.38134765625003,58.08720703125002],[-152.976123046875,58.29702148437505],[-152.771875,58.278564453125],[-152.84111328125002,58.41640625000002],[-152.416943359375,58.360205078125034]]],[[[-152.486083984375,58.485009765624966],[-152.63662109375002,58.54169921874998],[-152.3955078125,58.619384765625],[-152.486083984375,58.485009765624966]]],[[[-160.918994140625,58.57709960937498],[-161.13149414062502,58.668212890625],[-160.71513671875005,58.79521484375002],[-160.918994140625,58.57709960937498]]],[[[-148.02177734375,60.06533203125005],[-148.271875,60.05327148437499],[-148.07958984375003,60.151660156250045],[-148.02177734375,60.06533203125005]]],[[[-147.735888671875,59.81323242187503],[-147.76806640625,59.94375],[-147.180859375,60.358251953125034],[-147.01987304687498,60.33222656249998],[-147.735888671875,59.81323242187503]]],[[[-166.13544921875,60.38354492187503],[-165.72968750000004,60.31420898437503],[-165.591796875,59.913134765625045],[-166.14873046874996,59.764111328124955],[-167.13886718749998,60.00854492187503],[-167.43642578125002,60.20664062500006],[-166.836328125,60.21699218750004],[-166.47568359374998,60.382763671874955],[-166.13544921875,60.38354492187503]]],[[[-146.3939453125,60.44965820312501],[-146.10224609374998,60.41118164062499],[-146.61831054687497,60.27368164062503],[-146.70253906249997,60.40854492187498],[-146.3939453125,60.44965820312501]]],[[[-147.658251953125,60.45048828124999],[-147.787841796875,60.17792968749998],[-147.89145507812498,60.299414062500034],[-147.658251953125,60.45048828124999]]],[[[-172.74223632812496,60.45737304687498],[-172.23208007812494,60.299121093750074],[-172.63574218750003,60.328857421875],[-173.04765625000002,60.56831054687501],[-172.74223632812496,60.45737304687498]]],[[[-171.46303710937494,63.640039062499994],[-171.03486328125,63.58549804687499],[-170.29936523437502,63.68061523437501],[-169.55454101562498,63.373486328124955],[-168.71601562500004,63.310595703125045],[-168.76132812500003,63.21376953125002],[-169.364697265625,63.17114257812506],[-169.67636718750003,62.95610351562502],[-169.81860351562494,63.122363281250045],[-170.84838867187494,63.44438476562502],[-171.63183593749997,63.351220703124966],[-171.74638671874993,63.703076171874955],[-171.46303710937494,63.640039062499994]]],[[[-141.00214843750004,68.77416992187506],[-141.00214843750004,67.89755859374998],[-141.00214843750004,66.43652343750006],[-141.00214843750004,65.55991210937498],[-141.00214843750004,64.09887695312506],[-141.00214843750004,63.22226562499998],[-141.00214843750004,61.761279296875045],[-141.00214843750004,60.884667968749994],[-141.00214843750004,60.30024414062504],[-140.76274414062505,60.259130859375006],[-140.525439453125,60.218359375000034],[-140.45283203125004,60.29970703125002],[-139.97329101562497,60.183154296875074],[-139.67631835937505,60.32832031249998],[-139.23476562499997,60.339746093749994],[-139.07924804687497,60.34370117187501],[-139.07924804687497,60.279443359374966],[-139.136962890625,60.17270507812498],[-139.18515624999998,60.083593750000034],[-138.86875,59.94575195312501],[-138.317626953125,59.611132812500074],[-137.59331054687493,59.22626953124998],[-137.52089843750002,58.91538085937498],[-137.43857421875003,58.903125],[-137.2775390625,58.988183593749994],[-137.126220703125,59.04096679687498],[-136.81328125000002,59.150048828124994],[-136.57875976562502,59.15224609375002],[-136.46635742187493,59.459082031250006],[-136.27797851562502,59.48032226562506],[-136.321826171875,59.604833984375034],[-135.70258789062504,59.72875976562506],[-135.36787109374998,59.743310546874994],[-135.051025390625,59.57866210937502],[-134.94375,59.28828125000001],[-134.67724609374997,59.19926757812499],[-134.39306640625,59.009179687499994],[-134.32963867187505,58.93969726562506],[-134.21850585937503,58.849902343750045],[-133.54638671874997,58.50346679687499],[-133.27529296875,58.22285156250004],[-133.00141601562495,57.948974609375],[-132.55048828125,57.499902343749994],[-132.44248046874998,57.40673828125003],[-132.30166015624997,57.27631835937501],[-132.232177734375,57.19853515624999],[-132.27939453124998,57.14536132812498],[-132.33798828124998,57.07944335937506],[-132.15703125,57.048193359375006],[-132.03154296875,57.02656250000004],[-132.062890625,56.95336914062503],[-132.104296875,56.856787109375006],[-131.86616210937495,56.792822265625006],[-131.82426757812496,56.589990234374994],[-131.471875,56.55673828125006],[-130.649072265625,56.26367187500003],[-130.47709960937496,56.230566406250034],[-130.413134765625,56.12250976562498],[-130.09785156249995,56.10927734375002],[-130.01406249999997,55.950537109375006],[-130.2140625,55.02587890625003],[-130.57534179687497,54.769677734374966],[-130.849609375,54.80761718750006],[-131.04785156249997,55.157666015624955],[-130.74819335937502,55.31801757812502],[-131.127685546875,55.96015625000001],[-131.032763671875,56.08808593749998],[-131.78417968749997,55.876562500000034],[-131.98339843749994,55.535009765625006],[-132.15541992187502,55.59956054687501],[-132.20751953124997,55.75341796875],[-131.84384765625003,56.16010742187498],[-131.55136718749998,56.206787109375],[-131.88789062500004,56.24165039062498],[-132.18203125000002,56.42065429687506],[-132.82460937500002,57.05581054687505],[-133.465869140625,57.17216796875002],[-133.64873046874993,57.64228515624998],[-133.11704101562498,57.56621093750002],[-133.535205078125,57.83295898437501],[-133.1943359375,57.87768554687506],[-133.559375,57.924462890624994],[-133.72231445312502,57.84423828125],[-134.03110351562498,58.072167968749966],[-133.87675781249996,58.51816406249998],[-134.20883789062503,58.232958984375045],[-134.77612304687506,58.45385742187503],[-135.36367187500002,59.41943359375],[-135.50234375000002,59.202294921874994],[-135.090234375,58.245849609375],[-135.57177734374994,58.41206054687504],[-135.89755859374998,58.40019531250002],[-136.04311523437497,58.82163085937498],[-135.82636718750004,58.89794921874997],[-136.0166015625,58.87397460937498],[-136.150048828125,59.04809570312503],[-136.22583007812497,58.765478515625006],[-136.98901367187503,59.03447265624999],[-137.05903320312498,58.87373046875001],[-136.613916015625,58.809277343749955],[-136.48374023437503,58.61767578125],[-136.224609375,58.602246093749955],[-136.06147460937495,58.45273437500006],[-136.607421875,58.24399414062498],[-137.54399414062502,58.58120117187502],[-138.51489257812503,59.16591796875005],[-139.77329101562498,59.52729492187504],[-139.51303710937498,59.698095703125006],[-139.5123046875,59.95356445312501],[-139.28671874999998,59.610937500000034],[-139.22080078125003,59.819873046875045],[-138.9880859375,59.83500976562502],[-139.43144531249996,60.012255859375074],[-140.41982421874997,59.71074218750002],[-141.40830078125,59.90278320312498],[-141.408740234375,60.11767578125006],[-141.67016601562497,59.969873046874966],[-142.94565429687503,60.09697265625002],[-144.14721679687494,60.01640625000002],[-144.185498046875,60.150732421875034],[-144.901318359375,60.335156249999955],[-144.69111328125,60.66909179687502],[-145.248291015625,60.38012695312506],[-145.898876953125,60.47817382812505],[-145.67490234374998,60.65112304687503],[-146.57045898437497,60.72915039062502],[-146.39199218749997,60.810839843750045],[-146.63842773437497,60.89731445312498],[-146.59912109374994,61.05351562500002],[-146.284912109375,61.11264648437498],[-147.89111328125,60.889892578125],[-148.00512695312494,60.96855468750002],[-147.75185546874997,61.218945312499955],[-148.34189453125,61.060400390625006],[-148.34443359374998,60.853564453125045],[-148.55615234374994,60.82700195312506],[-148.25673828124997,60.67529296874997],[-148.64013671875,60.48945312500004],[-148.11918945312502,60.57514648437498],[-147.96411132812494,60.48486328124997],[-148.430712890625,59.98911132812498],[-149.2666015625,59.99829101562497],[-149.395263671875,60.10576171875002],[-149.59804687500002,59.77045898437501],[-149.7138671875,59.91958007812502],[-149.80126953124994,59.737939453124966],[-150.00532226562507,59.78442382812503],[-150.19804687499996,59.56655273437505],[-150.60737304687504,59.56337890625002],[-150.934521484375,59.249121093750034],[-151.18276367187502,59.30078124999997],[-151.73818359375002,59.18852539062502],[-151.94951171875,59.26508789062498],[-151.88461914062503,59.386328125],[-151.39960937499995,59.51630859375001],[-151.04648437499998,59.771826171875034],[-151.45009765624997,59.65039062499997],[-151.85322265625,59.78208007812498],[-151.39599609375006,60.27446289062502],[-151.35644531249997,60.72294921874999],[-150.44125976562503,61.02358398437505],[-149.07509765624997,60.87641601562498],[-150.05327148437496,61.17109374999998],[-149.433544921875,61.50078125000002],[-149.97568359374998,61.27934570312502],[-150.61225585937495,61.301123046875006],[-151.59350585937494,60.979638671874966],[-152.54091796874997,60.265429687500045],[-153.025,60.29565429687497],[-152.660107421875,59.99721679687502],[-153.21123046875002,59.84272460937498],[-153.09360351562503,59.70913085937505],[-153.65253906250004,59.64702148437499],[-154.17832031250003,59.155566406250074],[-153.41826171875,58.9599609375],[-153.43759765625003,58.754833984374955],[-154.289013671875,58.30434570312502],[-154.247021484375,58.15942382812497],[-155.006884765625,58.01606445312501],[-155.77797851562497,57.56821289062498],[-156.43588867187498,57.359960937500006],[-156.62900390624998,57.00996093750001],[-158.41440429687498,56.435839843750045],[-158.5521484375,56.31269531249998],[-158.27563476562497,56.19624023437498],[-158.5046875,56.062109375],[-158.59116210937503,56.18452148437498],[-158.78984375000002,55.98691406250006],[-159.52324218749993,55.81000976562498],[-159.65966796875003,55.625927734374955],[-159.77138671874997,55.84111328125002],[-160.49931640625002,55.53730468750004],[-161.38193359374998,55.371289062499955],[-161.44379882812495,55.513281250000034],[-161.202099609375,55.54355468750006],[-161.51694335937503,55.61840820312503],[-162.073974609375,55.13930664062505],[-162.38637695312497,55.05234375],[-162.63037109375003,55.24667968749998],[-162.67436523437505,54.99658203125],[-162.86503906249996,54.954541015624955],[-163.11962890624997,55.06469726562503],[-163.131103515625,54.916552734375045],[-163.33530273437503,54.83916015624999],[-163.27880859374997,55.12182617187503],[-162.906591796875,55.19555664062503],[-161.69731445312502,55.9072265625],[-161.215625,56.02143554687498],[-160.8986328125,55.99365234375],[-161.00537109375,55.88715820312498],[-160.80283203125003,55.754443359375045],[-160.70634765625002,55.870458984375034],[-160.29169921875,55.80507812500005],[-160.53906250000006,56.00629882812501],[-160.30205078125,56.31411132812502],[-158.91801757812502,56.882177734375006],[-158.675146484375,56.79487304687498],[-158.66079101562502,57.03940429687498],[-158.32094726562497,57.29790039062499],[-157.84575195312496,57.52807617187497],[-157.4619140625,57.506201171875034],[-157.697216796875,57.679443359375],[-157.610888671875,58.050830078125074],[-157.19370117187498,58.19418945312506],[-157.48837890624998,58.25371093750002],[-157.52363281249998,58.421337890624955],[-156.97465820312496,58.736328125],[-156.80888671875005,59.13427734375],[-157.14204101562504,58.87763671875001],[-158.19091796875003,58.6142578125],[-158.50317382812494,58.85034179687497],[-158.42563476562498,58.99931640625002],[-158.080517578125,58.97744140625002],[-158.422802734375,59.08984375],[-158.67827148437502,58.92939453124998],[-158.80947265625002,58.973876953125],[-158.78862304687493,58.440966796875045],[-158.95068359375,58.404541015625],[-159.67026367187498,58.9111328125],[-159.92021484375,58.819873046875074],[-160.36313476562498,59.05117187500002],[-161.246826171875,58.799462890624994],[-161.36132812499994,58.66953124999998],[-162.144921875,58.64423828124998],[-161.724365234375,58.794287109375006],[-161.64438476562498,59.109667968750045],[-161.9810546875,59.14614257812502],[-161.82871093749998,59.588623046875],[-162.421337890625,60.28398437500002],[-161.96201171875003,60.695361328125045],[-162.68496093749997,60.268945312499966],[-162.57075195312495,59.98974609375],[-163.68037109374998,59.80151367187503],[-164.14282226562497,59.89677734374999],[-165.02651367187497,60.500634765624994],[-165.35380859375002,60.54121093750001],[-164.80517578125,60.89204101562498],[-164.31850585937497,60.77128906249999],[-164.37236328125002,60.59184570312502],[-163.999560546875,60.76606445312498],[-163.72998046874997,60.589990234374994],[-163.420947265625,60.757421875],[-163.90654296874996,60.85380859375002],[-163.58691406249994,60.902978515624994],[-163.74902343750003,60.9697265625],[-163.99462890624997,60.86469726562501],[-165.11484375,60.93281250000004],[-164.86899414062503,61.11176757812498],[-165.27978515624994,61.169628906249955],[-165.27363281250004,61.27485351562498],[-165.56586914062498,61.10234375000002],[-165.86396484375004,61.33569335937503],[-165.84531249999998,61.536230468750034],[-166.152734375,61.545947265625074],[-166.16811523437502,61.65083007812501],[-165.80893554687503,61.69609375000002],[-166.07880859375,61.803125],[-165.61279296875003,61.86928710937502],[-165.707275390625,62.10043945312506],[-165.19453125,62.47353515625002],[-164.75786132812493,62.496728515624966],[-164.589453125,62.709375],[-164.79267578125,62.623193359374966],[-164.79965820312503,62.918066406250006],[-164.384228515625,63.03046874999998],[-164.40903320312503,63.21503906250001],[-163.94287109375,63.247216796874994],[-163.61630859374998,63.125146484374994],[-163.73784179687496,63.016406250000045],[-163.504345703125,63.105859374999966],[-163.28784179687494,63.046435546875045],[-162.621484375,63.26582031249998],[-162.28281250000003,63.529199218749994],[-161.97397460937498,63.45292968749999],[-161.09970703125003,63.557910156250045],[-160.778564453125,63.818945312500034],[-160.987548828125,64.25126953125002],[-161.49072265625003,64.43378906249998],[-160.93193359374996,64.5791015625],[-160.855908203125,64.755615234375],[-161.13017578125005,64.92543945312505],[-161.759375,64.816259765625],[-162.80703124999997,64.37421875000001],[-163.20390625,64.65200195312502],[-163.14433593750002,64.423828125],[-163.71308593749998,64.588232421875],[-164.978759765625,64.45366210937502],[-166.1427734375,64.58276367187503],[-166.48139648437498,64.72807617187507],[-166.415234375,64.926513671875],[-166.92841796875,65.15708007812498],[-166.15703125,65.28583984375001],[-167.40400390625,65.42211914062497],[-168.08837890624997,65.65776367187502],[-166.39873046875002,66.14443359375005],[-165.62993164062496,66.131201171875],[-165.77617187500002,66.31904296875001],[-164.46049804687502,66.58842773437499],[-163.63823242187502,66.57465820312504],[-163.89394531249997,66.57587890625001],[-164.03374023437493,66.21552734374995],[-163.69536132812502,66.08383789062503],[-161.93369140625003,66.04287109374997],[-161.45541992187503,66.28139648437497],[-161.03427734375003,66.18881835937503],[-161.12031249999995,66.334326171875],[-161.91689453124997,66.41181640624998],[-162.54365234375004,66.80512695312501],[-162.36162109375,66.94731445312502],[-161.591015625,66.45952148437502],[-160.23168945312503,66.420263671875],[-160.360888671875,66.6125],[-160.864013671875,66.67084960937501],[-161.39804687499998,66.55185546875],[-161.85668945312497,66.70034179687497],[-161.719921875,67.02055664062502],[-163.5318359375,67.10258789062502],[-164.1251953125,67.60673828125007],[-166.786279296875,68.35961914062497],[-166.38051757812502,68.425146484375],[-166.20908203125,68.88535156250003],[-165.04394531249994,68.882470703125],[-163.867919921875,69.03666992187505],[-161.88095703125003,70.33173828125001],[-162.073876953125,70.16196289062498],[-160.9962890625,70.30458984375],[-160.11713867187495,70.59121093750002],[-159.86567382812498,70.27885742187499],[-159.81499023437496,70.49707031250003],[-159.38676757812493,70.52451171875003],[-160.081591796875,70.63486328125003],[-159.680908203125,70.786767578125],[-159.31450195312496,70.87851562500003],[-159.251171875,70.7484375],[-157.909375,70.860107421875],[-156.47021484374994,71.40766601562501],[-156.469970703125,71.29155273437507],[-155.57944335937503,71.12109374999997],[-156.14658203125,70.92783203125003],[-155.97353515625002,70.84199218749995],[-155.16684570312498,71.09921875000006],[-154.19521484375002,70.80112304687498],[-153.23291015625,70.93256835937504],[-152.49121093749994,70.88095703125],[-152.23291015625,70.81035156249999],[-152.39921875,70.62045898437503],[-151.76904296875,70.56015625],[-151.94467773437498,70.45209960937501],[-149.26943359374997,70.50078124999999],[-147.70537109375,70.21723632812495],[-145.82314453124997,70.16005859375002],[-145.19736328125003,70.00869140625002],[-143.218310546875,70.11625976562499],[-142.70786132812498,70.03378906249998],[-141.40791015625,69.65336914062502],[-141.00214843750004,69.65078125000002],[-141.00214843750004,68.77416992187506]]]]},"properties":{"name":"United States","childNum":76}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[71.20615234375006,39.892578125],[71.15625,39.88344726562502],[71.06425781250002,39.88491210937505],[71.01171874999997,39.895117187500006],[71.04365234375004,39.97631835937503],[71.04482421875005,39.992529296875034],[70.96064453125004,40.087988281250034],[71.00546875,40.15229492187498],[71.0241210937501,40.14916992187497],[71.08037109375007,40.07988281249999],[71.2287109375001,40.04814453124999],[71.20615234375006,39.892578125]]],[[[70.94677734374997,42.24868164062505],[70.97900390625003,42.26655273437504],[71.03603515625,42.28466796875],[71.12998046875006,42.25],[71.21269531250002,42.20644531250005],[71.23232421875005,42.18627929687503],[71.22851562499997,42.16289062499996],[70.18095703125007,41.571435546874994],[70.734375,41.400537109374994],[70.86044921875006,41.22490234375002],[71.11074218750005,41.152636718750045],[71.29882812500003,41.152490234374994],[71.39306640625003,41.123388671875034],[71.40839843750004,41.13603515625002],[71.42089843750003,41.341894531250034],[71.60625,41.367431640625],[71.66494140625,41.54121093749998],[71.70068359374997,41.454003906249966],[71.75771484375005,41.42802734375002],[71.79248046875003,41.41313476562499],[71.85800781250006,41.311376953125034],[71.8786132812501,41.195019531249955],[71.95849609375003,41.18706054687502],[72.05244140625004,41.16474609375001],[72.1154296875001,41.18657226562502],[72.1642578125001,41.173730468749966],[72.18095703125002,41.11845703124999],[72.18730468750002,41.02592773437499],[72.2130859375001,41.014257812500006],[72.36406250000002,41.04345703125],[72.65830078125,40.86992187499999],[73.13212890625002,40.82851562499999],[72.6041015625,40.52543945312499],[72.40205078125004,40.578076171874955],[72.3892578125,40.427392578124994],[72.13125,40.438623046874966],[71.69248046875,40.15234375],[71.30468749999997,40.28691406249996],[70.990625,40.2548828125],[70.95800781250003,40.238867187500034],[70.653125,40.201171875],[70.37158203125003,40.38413085937506],[70.75107421875006,40.721777343750006],[70.40195312500006,41.03510742187498],[69.71289062500003,40.65698242187503],[69.35722656250002,40.76738281249996],[69.20625,40.566552734374994],[69.27490234374997,40.19809570312498],[68.63066406250007,40.16708984374998],[68.9720703125,40.08994140624998],[68.80468750000003,40.05034179687499],[68.86875,39.90747070312503],[68.63896484375007,39.8388671875],[68.46328125,39.53671874999998],[67.71904296875007,39.62138671875002],[67.426171875,39.46557617187497],[67.3576171875001,39.216699218749994],[67.64833984375005,39.13105468750004],[67.69443359375006,38.99462890625003],[68.13251953125004,38.927636718749966],[68.08720703125002,38.47353515625002],[68.3502929687501,38.211035156250006],[67.81435546875005,37.48701171875004],[67.7980468750001,37.244970703125006],[67.75898437500004,37.172216796875034],[67.75292968749997,37.199804687500034],[67.7,37.227246093749955],[67.60742187499997,37.22250976562506],[67.5172851562501,37.26665039062499],[67.44169921875007,37.25800781250001],[67.3197265625,37.209570312500006],[67.1955078125001,37.23520507812498],[67.06884765624997,37.334814453125006],[66.82773437500006,37.37128906249998],[66.52226562500007,37.34848632812506],[66.51064453125,37.45869140625004],[66.51132812500006,37.59916992187496],[66.52558593750004,37.785742187500034],[66.60625,37.98671875000005],[65.97119140624997,38.244238281250006],[65.612890625,38.23857421875002],[64.3099609375,38.97729492187497],[63.76367187500003,39.16054687499999],[62.48320312500002,39.97563476562496],[61.90283203124997,41.09370117187501],[61.496972656249994,41.276074218749955],[61.2423828125001,41.18920898437503],[60.454980468749994,41.221630859374955],[60.089648437500074,41.39941406250003],[60.07558593750005,41.759667968749966],[60.20078125000006,41.803125],[59.94179687499999,41.97353515625002],[59.98515625000002,42.21171875],[59.35429687500002,42.32329101562496],[58.5890625000001,42.778466796874966],[58.477148437500006,42.66284179687503],[58.15156250000004,42.628076171874966],[58.474414062500074,42.29936523437496],[58.02890625,42.48764648437506],[57.814257812500074,42.18984375000005],[57.290625,42.123779296875],[56.96406250000004,41.856542968750006],[57.11884765625004,41.35029296874998],[57.01796875,41.26347656249996],[55.97744140625005,41.32221679687504],[55.97568359375006,44.99492187499996],[58.555273437500006,45.55537109375001],[61.007910156250006,44.39379882812497],[61.99023437500003,43.492138671874955],[63.20703125000003,43.62797851562502],[64.44316406250007,43.55117187499999],[64.9054687500001,43.714697265625006],[65.49619140625,43.310546875],[65.80302734375002,42.87695312500006],[66.1002929687501,42.99082031249998],[66.00957031250007,42.00488281250003],[66.49863281250006,41.99487304687503],[66.70966796875004,41.17915039062501],[67.9357421875001,41.19658203125002],[68.11308593750007,41.02861328124999],[68.04765625000007,40.80927734374998],[68.29189453125,40.656103515625034],[68.57265625,40.62265624999998],[68.58408203125,40.876269531250045],[69.15361328125002,41.42524414062498],[70.94677734374997,42.24868164062505]]]]},"properties":{"name":"Uzbekistan","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[-61.17451171875001,13.158105468749966],[-61.268457031249966,13.287695312499991],[-61.13896484374996,13.358740234374991],[-61.17451171875001,13.158105468749966]]]},"properties":{"name":"St. Vin. and Gren.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.99790039062498,8.867333984374966],[-61.069189453125034,8.947314453125003],[-60.91582031249996,9.070312500000014],[-60.86142578124998,8.949609375000037],[-60.99790039062498,8.867333984374966]]],[[[-60.821191406249966,9.138378906250026],[-60.94140625000003,9.105566406250006],[-60.73583984374997,9.203320312500026],[-60.821191406249966,9.138378906250026]]],[[[-63.84936523437494,11.131005859374994],[-63.917626953124994,10.887548828125048],[-64.40234375,10.981591796875023],[-64.21367187500002,11.086132812499997],[-64.0283203125,11.00185546874998],[-63.84936523437494,11.131005859374994]]],[[[-60.742138671874926,5.202050781250037],[-60.71196289062499,5.191552734375023],[-60.671972656250034,5.164355468749989],[-60.603857421875006,4.94936523437498],[-61.00283203125002,4.535253906249991],[-61.28007812500002,4.516894531249974],[-61.82084960937496,4.197021484375],[-62.153125,4.098388671874986],[-62.41064453124994,4.156738281249972],[-62.71210937499998,4.01791992187502],[-62.85698242187502,3.593457031249969],[-63.33867187500002,3.943896484375045],[-64.02148437500003,3.929101562500051],[-64.19248046874995,4.126855468750009],[-64.57636718750001,4.139892578125],[-64.788671875,4.276025390625023],[-64.66899414062496,4.01181640625002],[-64.22109375000002,3.587402343749972],[-64.04658203124998,2.502392578124997],[-63.389257812500006,2.411914062500045],[-63.43251953124994,2.155566406250045],[-64.00849609374995,1.931591796874969],[-64.20502929687493,1.52949218750004],[-65.10375976562497,1.108105468749983],[-65.47338867187497,0.691259765624977],[-65.55605468750002,0.687988281250014],[-65.52299804687493,0.843408203124966],[-65.68144531249999,0.983447265624989],[-66.06005859375003,0.78535156250004],[-66.34711914062498,0.7671875],[-66.87602539062499,1.223046875000037],[-67.21083984375,2.390136718750043],[-67.61870117187496,2.793603515624994],[-67.85908203124998,2.793603515624994],[-67.3111328125,3.41586914062502],[-67.66162109375,3.864257812499986],[-67.85527343750002,4.506884765624989],[-67.82490234374995,5.270458984375026],[-67.47387695312503,5.929980468750003],[-67.48198242187499,6.18027343750002],[-67.85917968749999,6.289892578124963],[-68.47177734375,6.156542968749974],[-69.42714843749997,6.123974609374997],[-70.12919921874999,6.95361328125],[-70.73715820312503,7.090039062499997],[-71.12861328124993,6.98671875],[-72.00664062499993,7.032617187500023],[-72.20771484374995,7.37026367187498],[-72.47197265624996,7.524267578124991],[-72.39033203124995,8.287060546874969],[-72.66542968749994,8.62758789062498],[-72.79638671874997,9.10898437499999],[-73.05839843749999,9.259570312500031],[-73.36621093749997,9.194140625000017],[-73.00654296874998,9.789160156250006],[-72.86933593750001,10.49125976562496],[-72.690087890625,10.835839843749994],[-72.24848632812501,11.196435546875009],[-71.95810546875,11.66640625],[-71.31972656249997,11.861914062500048],[-71.95693359375002,11.569921874999977],[-71.835107421875,11.190332031250009],[-71.6416015625,11.013525390625048],[-71.73090820312498,10.994677734375017],[-71.59433593749995,10.657373046875051],[-72.11284179687499,9.815576171874966],[-71.61953124999994,9.047949218749991],[-71.24140625000001,9.160449218750003],[-71.08583984375002,9.348242187499977],[-71.05268554687501,9.705810546874986],[-71.49423828125,10.533203124999972],[-71.46953124999993,10.964160156250017],[-70.23251953124998,11.372998046874997],[-70.09711914062493,11.519775390624972],[-69.80478515624998,11.47421875000002],[-69.81733398437495,11.672070312499997],[-70.19257812499993,11.62460937500002],[-70.28652343749997,11.886035156249989],[-70.20278320312497,12.098388671874986],[-70.00395507812496,12.177880859375023],[-69.63159179687494,11.479931640625026],[-68.827978515625,11.431738281249977],[-68.39863281249995,11.160986328124977],[-68.29628906249997,10.689355468749994],[-68.13994140624999,10.492724609374989],[-66.24721679687497,10.632226562499994],[-65.85175781249995,10.257763671874997],[-65.12910156249998,10.070068359375043],[-64.85048828125,10.098095703124969],[-64.188330078125,10.457812499999989],[-63.73188476562501,10.503417968750043],[-64.24750976562498,10.54257812500002],[-64.298193359375,10.635156249999966],[-61.879492187500006,10.741015625000031],[-62.379980468750006,10.546875],[-62.91357421875,10.531494140624986],[-62.68583984374996,10.289794921875043],[-62.740576171875006,10.056152343750043],[-62.55034179687499,10.200439453125043],[-62.320410156250034,9.783056640625006],[-62.22114257812498,9.882568359375028],[-62.15336914062493,9.821777343749986],[-62.15532226562499,9.979248046875014],[-62.077099609374926,9.97504882812504],[-61.73593749999998,9.631201171874977],[-61.76591796874996,9.813818359374963],[-61.58886718749994,9.894531249999986],[-60.79248046874997,9.360742187500037],[-61.02314453124998,9.15458984374996],[-61.24726562499998,8.600341796875014],[-61.61870117187499,8.59746093749996],[-61.30400390624999,8.410400390625043],[-60.800976562499926,8.592138671875034],[-60.16748046875,8.616992187500031],[-60.01752929687501,8.549316406250014],[-59.83164062499998,8.305957031250003],[-59.84907226562498,8.248681640624966],[-59.96484375000003,8.191601562499969],[-59.99072265624997,8.16201171874998],[-60.032421874999926,8.053564453125006],[-60.51362304687501,7.813183593749969],[-60.71865234374994,7.535937499999974],[-60.606542968750006,7.320849609375031],[-60.63330078124997,7.211083984374966],[-60.58320312499998,7.156201171874969],[-60.523193359375,7.143701171875009],[-60.464941406250034,7.166552734375045],[-60.39238281249999,7.164550781249986],[-60.34506835937495,7.15],[-60.32548828124996,7.133984374999983],[-60.32207031249996,7.092041015625043],[-60.35209960937496,7.002880859374997],[-60.39501953125,6.945361328125003],[-60.717919921874966,6.768310546875],[-61.14560546874998,6.694531249999983],[-61.20361328124997,6.588378906250028],[-61.181591796874926,6.513378906250026],[-61.15102539062502,6.446533203124986],[-61.15229492187501,6.385107421875006],[-61.12871093749999,6.214306640625026],[-61.15947265624996,6.174414062499977],[-61.22495117187498,6.129199218750003],[-61.303125,6.049511718750026],[-61.39082031250001,5.938769531250017],[-61.376806640625006,5.906982421875028],[-61.167187499999926,5.674218750000037],[-60.95400390625002,5.437402343750023],[-60.742138671874926,5.202050781250037]]]]},"properties":{"name":"Venezuela","childNum":4}},{"geometry":{"type":"Polygon","coordinates":[[[-64.765625,17.794335937499994],[-64.58046874999994,17.750195312499983],[-64.88911132812495,17.701708984375045],[-64.765625,17.794335937499994]]]},"properties":{"name":"U.S. Virgin Is.","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[104.06396484375003,10.390820312500011],[104.01845703125,10.029199218749966],[103.84951171875005,10.371093749999986],[104.06396484375003,10.390820312500011]]],[[[107.52128906250007,20.926611328124977],[107.39921875000007,20.903466796874966],[107.55126953125003,21.034033203125006],[107.52128906250007,20.926611328124977]]],[[[107.60273437500004,21.21679687500003],[107.40351562500004,21.093652343749994],[107.47626953125004,21.268945312499994],[107.60273437500004,21.21679687500003]]],[[[107.97265624999997,21.507958984375023],[107.40996093750002,21.284814453125023],[107.35429687500007,21.055175781250057],[107.1647460937501,20.94873046875003],[106.68339843750007,21.000292968750074],[106.75341796875003,20.73505859375004],[106.55078124999997,20.52656250000001],[106.57285156250012,20.392187499999977],[105.98408203125004,19.939062500000034],[105.62177734375004,18.96630859375003],[105.88828125000006,18.502490234375045],[106.49902343749997,17.946435546874994],[106.47890625000005,17.719580078125063],[106.3705078125,17.746875],[107.83378906250002,16.322460937499983],[108.02939453125012,16.331103515625074],[108.82128906249997,15.377929687500028],[109.30332031250012,13.856445312500043],[109.271875,13.279345703124974],[109.42392578125006,12.955957031249994],[109.44492187500006,12.599609375000057],[109.33554687500012,12.751904296874997],[109.21894531250004,12.64580078124996],[109.30468750000003,12.391162109375045],[109.20683593750007,12.415380859375006],[109.1986328125,11.724853515625014],[109.03964843750012,11.592675781249994],[108.98671875,11.336376953124997],[108.09492187500004,10.897265624999989],[108.0013671875,10.720361328125009],[107.26152343750007,10.39838867187504],[107.00664062500002,10.66054687499998],[106.94746093750004,10.400341796874997],[106.72734375000007,10.535644531250028],[106.605859375,10.46494140625002],[106.74121093750003,10.444384765625003],[106.75742187500006,10.295800781250023],[106.46406250000004,10.298291015624997],[106.78525390625012,10.116455078124986],[106.59560546875005,9.859863281250028],[106.1364257812501,10.221679687500014],[106.56435546875005,9.715625],[106.48408203125004,9.559423828125006],[105.83095703125005,10.000732421875028],[106.15859375,9.59414062499998],[106.16835937500005,9.396728515625],[105.50097656249997,9.093212890624983],[105.11435546875006,8.629199218750031],[104.77041015625,8.59765625],[104.89628906250007,8.746630859374974],[104.81855468750004,8.801855468750034],[104.84521484375003,9.606152343750026],[105.08447265625003,9.99570312499999],[104.8019531250001,10.202734374999977],[104.66347656250005,10.169921875000043],[104.42636718750006,10.411230468749991],[104.85058593749997,10.534472656249974],[105.04638671874997,10.701660156250014],[105.04570312500002,10.911376953125014],[105.3146484375001,10.845166015625026],[105.40576171875003,10.95161132812504],[105.75507812500004,10.989990234375043],[105.85332031250007,10.86357421874996],[106.16396484375005,10.794921875],[106.16093750000002,11.037109375000057],[105.85605468750006,11.294287109375048],[105.85146484375005,11.635009765625],[106.0060546875001,11.758007812500011],[106.39921875000007,11.687011718750028],[106.41386718750002,11.9484375],[106.70009765625,11.979296874999974],[107.21210937500004,12.30400390624996],[107.39335937500002,12.260498046874972],[107.50644531250006,12.364550781250031],[107.47539062500002,13.030371093749963],[107.60546874999997,13.437792968750017],[107.3314453125,14.126611328125009],[107.51943359375005,14.705078125],[107.51376953125012,14.817382812500057],[107.52451171875012,14.871826171875043],[107.50468750000007,14.915917968749966],[107.48037109375,14.979882812500037],[107.55527343750006,15.057031250000023],[107.58964843750002,15.118457031250017],[107.63369140625005,15.18984375],[107.653125,15.255224609374991],[107.62167968750006,15.309863281250017],[107.56425781250002,15.391601562499972],[107.45957031250012,15.4658203125],[107.33876953125,15.560498046875011],[107.27939453125006,15.618701171875045],[107.16591796875005,15.802490234375028],[107.1888671875,15.838623046875],[107.36064453125002,15.921728515624977],[107.3919921875,15.951660156250028],[107.39638671875,16.04301757812499],[106.93066406249997,16.353125],[106.8927734375001,16.396533203125074],[106.85107421875003,16.515625],[106.83242187500005,16.526269531250023],[106.79160156250006,16.490332031250006],[106.73955078125007,16.452539062500023],[106.6564453125001,16.49262695312501],[106.54619140625002,16.650732421874977],[106.53369140625003,16.821044921875057],[106.52597656250006,16.876611328124994],[106.50224609375002,16.95410156249997],[106.26953125000003,17.21679687500003],[106.00625,17.415283203125057],[105.69140625000003,17.737841796875045],[105.58847656250012,17.983691406250045],[105.51855468749997,18.077441406250045],[105.45820312500004,18.15429687499997],[105.11455078125002,18.40527343750003],[105.08701171875006,18.496240234374994],[105.14541015625,18.616796875000063],[105.14648437500003,18.650976562500006],[103.89160156250003,19.304980468750017],[103.89638671875,19.339990234375023],[103.93203125,19.366064453125006],[104.0275390625001,19.42045898437499],[104.062890625,19.48256835937505],[104.05156250000007,19.564160156249955],[104.01347656250007,19.64648437500003],[104.03203125000002,19.675146484375006],[104.06279296875007,19.678417968749983],[104.25986328125006,19.685498046874983],[104.5462890625,19.61054687500001],[104.58789062500003,19.61875],[104.74316406250003,19.754736328124977],[104.80175781249997,19.83613281250004],[104.81513671875004,19.90400390625001],[104.9279296875001,20.01811523437499],[104.92919921875003,20.082812500000017],[104.88867187500003,20.169091796875023],[104.84785156250004,20.202441406250045],[104.69873046875003,20.20532226562503],[104.67695312500004,20.224707031249977],[104.66191406250007,20.28901367187501],[104.65644531250004,20.32851562499999],[104.6188476562501,20.37451171875003],[104.49619140625006,20.413671875],[104.39218750000012,20.424755859374955],[104.36777343750012,20.44140624999997],[104.40781250000012,20.48574218750005],[104.47861328125006,20.529589843750017],[104.53271484374997,20.55488281250001],[104.58320312500004,20.646679687499955],[104.34960937499997,20.821093750000074],[104.19531249999997,20.913964843749966],[104.10136718750002,20.94550781250001],[103.63505859375007,20.697070312500017],[103.46357421875004,20.779833984375017],[103.21074218750002,20.840625],[103.10449218749997,20.891650390625045],[102.88378906250003,21.202587890624983],[102.85117187500006,21.26591796874999],[102.94960937500005,21.681347656249983],[102.84521484374997,21.73476562500005],[102.81591796874997,21.807373046875],[102.7982421875,21.797949218750034],[102.77109375000006,21.709667968749983],[102.73857421875002,21.67792968750001],[102.66201171875005,21.67602539062497],[102.58251953125003,21.90429687500003],[102.12744140624997,22.379199218750045],[102.1759765625001,22.414648437500006],[102.2370117187501,22.466015624999983],[102.40644531250004,22.70800781249997],[102.47089843750004,22.75092773437501],[102.98193359374997,22.4482421875],[103.32666015625003,22.769775390625057],[103.49296875000007,22.587988281250034],[103.62021484375006,22.782031250000045],[103.94150390625006,22.540087890625045],[104.14306640624997,22.800146484375006],[104.37177734375004,22.704052734374983],[104.68730468750002,22.822216796874983],[104.86474609375003,23.136376953125023],[105.27539062500003,23.34521484375003],[105.8429687500001,22.922802734374955],[106.14843749999997,22.970068359375006],[106.2790039062501,22.857470703125045],[106.54179687500007,22.908349609375023],[106.78027343749997,22.778906250000034],[106.55039062500006,22.501367187499994],[106.66357421875003,21.97890625000005],[106.97099609375002,21.923925781250034],[107.35117187500012,21.60888671874997],[107.75927734374997,21.655029296875057],[107.97265624999997,21.507958984375023]]]]},"properties":{"name":"Vietnam","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[169.49130859375006,-19.54013671875002],[169.34726562500006,-19.623535156249957],[169.2174804687501,-19.476367187500003],[169.24746093750005,-19.3447265625],[169.49130859375006,-19.54013671875002]]],[[[169.334375,-18.940234375000017],[168.98691406250006,-18.87128906250001],[169.01582031250004,-18.64375],[169.14384765625002,-18.63105468750001],[169.334375,-18.940234375000017]]],[[[168.44580078124997,-17.54218750000004],[168.58496093750003,-17.695898437500006],[168.52460937500004,-17.798046875000026],[168.15820312500003,-17.710546874999963],[168.2731445312501,-17.552246093749957],[168.44580078124997,-17.54218750000004]]],[[[168.44677734375003,-16.778808593749957],[168.18144531250002,-16.804003906250017],[168.13535156250006,-16.636914062499997],[168.44677734375003,-16.778808593749957]]],[[[168.29667968750007,-16.33652343749999],[167.92900390625002,-16.22871093749997],[168.16386718750002,-16.081640625000034],[168.29667968750007,-16.33652343749999]]],[[[167.4125,-16.095898437499997],[167.83662109375004,-16.449707031249957],[167.44931640625012,-16.554980468750003],[167.34921875000006,-16.15449218750004],[167.15146484375006,-16.080468749999966],[167.19951171875002,-15.885058593750031],[167.33574218750007,-15.916699218749997],[167.4125,-16.095898437499997]]],[[[167.9113281250001,-15.435937500000023],[167.67421875,-15.4515625],[168.00253906250012,-15.283203124999986],[167.9113281250001,-15.435937500000023]]],[[[166.74580078125004,-14.826855468750011],[166.81015625000012,-15.15742187500004],[167.0755859375,-14.935644531249977],[167.20078125000012,-15.443066406249969],[167.0939453125001,-15.580859374999974],[166.75830078125003,-15.631152343750003],[166.63105468750004,-15.406054687499974],[166.56738281250003,-14.641796874999969],[166.74580078125004,-14.826855468750011]]],[[[167.58486328125,-14.260937500000011],[167.43027343750012,-14.294921875],[167.41074218750006,-14.19746093750004],[167.50644531250012,-14.142187499999977],[167.58486328125,-14.260937500000011]]],[[[167.48886718750006,-13.907226562499972],[167.3917968750001,-13.788378906250017],[167.48105468750006,-13.709472656250014],[167.48886718750006,-13.907226562499972]]]]},"properties":{"name":"Vanuatu","childNum":10}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[-171.4541015625,-14.04648437500002],[-171.9119140625,-14.001660156250026],[-172.04589843750003,-13.857128906249983],[-171.60390624999997,-13.879199218750045],[-171.4541015625,-14.04648437500002]]],[[[-172.33349609375,-13.46523437499999],[-172.17685546874998,-13.68466796875002],[-172.224951171875,-13.804296874999963],[-172.535693359375,-13.791699218749983],[-172.77851562499998,-13.516796875000011],[-172.33349609375,-13.46523437499999]]]]},"properties":{"name":"Samoa","childNum":2}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[53.76318359374997,12.636816406249991],[54.18740234375005,12.664013671875026],[54.511132812499994,12.552783203125017],[54.12949218750006,12.360644531250045],[53.71884765625006,12.318994140624994],[53.31582031250005,12.533154296875011],[53.53496093750002,12.715771484374997],[53.76318359374997,12.636816406249991]]],[[[42.75585937500003,13.70429687500004],[42.689746093750074,13.673632812500017],[42.7941406250001,13.766113281250028],[42.75585937500003,13.70429687500004]]],[[[42.787402343750074,13.971484375000031],[42.69404296875004,14.007910156249991],[42.76210937500005,14.067480468750048],[42.787402343750074,13.971484375000031]]],[[[53.08564453125004,16.648388671874955],[52.327734375,16.293554687500063],[52.17402343750004,15.956835937500017],[52.2174804687501,15.655517578125],[51.3224609375001,15.22626953125004],[49.34990234375002,14.637792968749977],[48.66835937499999,14.050146484374977],[47.9899414062501,14.048095703125],[47.40771484374997,13.661621093750057],[46.78886718750002,13.465576171874986],[45.65732421875006,13.338720703124991],[45.03867187500006,12.815869140624969],[44.617773437500006,12.817236328124977],[44.00585937499997,12.607666015625],[43.634375,12.744482421874991],[43.487597656250074,12.69882812500002],[43.23193359375003,13.267089843750057],[43.2824218750001,13.692529296875037],[43.08906250000004,14.010986328125],[42.93642578125005,14.938574218749963],[42.85566406250004,15.132958984375037],[42.65781250000006,15.232812500000051],[42.79902343750004,15.326269531249991],[42.71718750000005,15.654638671875006],[42.83964843750002,16.032031250000074],[42.79931640624997,16.37177734375001],[43.16503906249997,16.689404296874955],[43.19091796875003,17.359375],[43.41796875000003,17.516259765625023],[43.91699218749997,17.32470703124997],[45.14804687500006,17.427441406249955],[45.5353515625001,17.30205078124999],[46.72763671875006,17.26557617187501],[46.97568359375006,16.953466796875034],[47.14355468749997,16.946679687499966],[47.44179687499999,17.111865234375045],[47.57958984374997,17.448339843750034],[48.17216796875002,18.156933593749983],[49.04199218750003,18.58178710937503],[51.977636718750006,18.996142578125074],[53.08564453125004,16.648388671874955]]]]},"properties":{"name":"Yemen","childNum":4}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[37.85693359375003,-46.94423828124998],[37.5900390625001,-46.90800781250006],[37.78955078124997,-46.8375],[37.85693359375003,-46.94423828124998]]],[[[31.799609375000017,-23.8921875],[31.98583984374997,-24.460644531249983],[31.921679687500017,-25.96875],[31.335156250000097,-25.755566406249997],[31.207324218750074,-25.843359375000034],[31.08808593750004,-25.980664062500026],[30.803320312500006,-26.41347656250001],[30.806738281250006,-26.78525390624999],[30.88330078124997,-26.792382812500023],[30.938085937500006,-26.91582031250003],[31.06337890625005,-27.1123046875],[31.274023437500063,-27.23837890625002],[31.469531250000017,-27.29550781250002],[31.74257812500005,-27.309960937500037],[31.95839843750005,-27.305859375],[31.946093750000017,-27.173632812499974],[31.96718750000005,-26.96064453125001],[31.994726562500006,-26.817480468749977],[32.024804687499994,-26.81113281250002],[32.112890625,-26.83945312500002],[32.19960937499999,-26.833496093749957],[32.35351562499997,-26.861621093750003],[32.7765625000001,-26.850976562499966],[32.88613281250005,-26.849316406249983],[32.53476562500006,-28.19970703125003],[32.285742187500006,-28.62148437499998],[31.335156250000097,-29.378125],[29.97119140625003,-31.322070312500017],[28.449414062500068,-32.62460937499999],[27.077441406250074,-33.52119140625004],[26.429492187500045,-33.75957031250002],[25.80585937500001,-33.737109374999974],[25.574218750000057,-34.03535156249998],[25.00292968750003,-33.97363281250003],[24.8271484375,-34.16894531250003],[24.595507812500074,-34.17451171875],[23.697851562500063,-33.99277343750002],[23.268164062500006,-34.08115234374999],[22.553808593750063,-34.01005859374999],[22.24550781250005,-34.06914062500003],[21.788964843750023,-34.37265624999996],[20.529882812500034,-34.4630859375],[20.020605468750006,-34.785742187500006],[19.298242187500023,-34.61503906249996],[19.330761718750068,-34.49238281250001],[19.098339843750068,-34.350097656249986],[18.831347656250017,-34.36406249999999],[18.75214843750004,-34.08261718750002],[18.50039062499999,-34.10927734375004],[18.46162109375001,-34.346875],[18.35205078124997,-34.1884765625],[18.43300781250005,-33.71728515625003],[17.851074218750057,-32.82744140625002],[17.96523437500005,-32.70859374999996],[18.125,-32.74912109374996],[18.325292968750034,-32.50498046874996],[18.21083984375008,-31.74248046874996],[17.34707031250005,-30.44482421875],[16.95,-29.40341796875002],[16.739453124999983,-29.009375],[16.447558593750045,-28.61757812499998],[16.755761718750023,-28.45214843750003],[16.7875,-28.39472656249997],[16.81015625,-28.264550781249994],[16.841210937500023,-28.21894531250004],[16.875292968750045,-28.12792968749997],[16.93330078125004,-28.06962890624999],[17.05625,-28.03105468750003],[17.1884765625,-28.13251953125001],[17.358691406250017,-28.269433593750023],[17.44794921875001,-28.698144531249966],[18.310839843750017,-28.88623046875],[19.16171875,-28.93876953124996],[19.245800781250068,-28.90166015625003],[19.31269531250004,-28.733300781250023],[19.539843750000017,-28.574609375000023],[19.98046875,-28.45126953125002],[19.98046875,-28.310351562500003],[19.98046875,-24.77675781249998],[20.430664062500057,-25.14707031250002],[20.79316406250001,-25.915625],[20.641406250000017,-26.7421875],[20.739843749999977,-26.84882812499997],[21.694726562500023,-26.840917968749963],[21.738085937500045,-26.806835937500026],[21.788281250000068,-26.710058593750034],[22.01093750000004,-26.635839843750006],[22.090917968749977,-26.580175781250034],[22.217578125000045,-26.38886718749997],[22.47089843750004,-26.219042968750003],[22.548632812500074,-26.178417968749997],[22.59765625000003,-26.13271484375001],[22.878808593750023,-25.457910156250023],[23.148730468750017,-25.288671875],[23.389257812500006,-25.291406250000023],[23.89375,-25.600878906250017],[23.96953124999999,-25.62607421874999],[24.192968750000034,-25.632910156249963],[24.33056640625,-25.742871093749983],[25.21337890625,-25.75625],[25.518164062500006,-25.66279296875001],[25.91210937499997,-24.747460937499966],[26.031835937500034,-24.70244140625003],[26.130859375000057,-24.671484375000034],[26.39716796875004,-24.61357421874996],[26.451757812500063,-24.582714843749983],[26.835058593750063,-24.240820312499963],[27.085546875000034,-23.577929687500003],[27.7685546875,-23.14892578125],[27.812597656250006,-23.108007812500006],[28.210156249999983,-22.693652343749974],[28.83984375000003,-22.480859374999966],[28.94580078125003,-22.39511718749999],[29.013476562500045,-22.27841796875002],[29.129882812500057,-22.21328125],[29.364843750000063,-22.19394531250005],[29.37744140625003,-22.19277343749998],[29.66308593749997,-22.146289062500017],[29.90234375000003,-22.184179687500006],[30.19042968750003,-22.291113281250034],[30.460156250000097,-22.329003906250023],[30.71162109375004,-22.297851562499986],[31.07343750000004,-22.30781249999997],[31.19726562499997,-22.344921874999983],[31.287890625000074,-22.402050781249983],[31.54560546875004,-23.48232421874998],[31.799609375000017,-23.8921875]],[[27.19355468750001,-29.94130859375001],[27.364062500000017,-30.27919921875001],[27.753125,-30.6],[28.05683593750001,-30.63105468750001],[28.128710937500017,-30.52509765625001],[28.39208984375003,-30.14755859375002],[28.646875,-30.1265625],[29.09804687500005,-29.919042968750006],[29.142187500000063,-29.70097656249999],[29.293554687500006,-29.56689453125003],[29.348828125000097,-29.441992187499977],[29.38671874999997,-29.319726562500023],[29.301367187500006,-29.08984375],[28.625781250000017,-28.581738281250054],[28.583398437499994,-28.59414062499999],[28.471875,-28.615820312499977],[28.23261718750004,-28.701269531249977],[28.084375,-28.779980468750026],[27.95986328125008,-28.87333984375003],[27.73554687500004,-28.940039062500034],[27.294531250000063,-29.519335937500017],[27.056933593750074,-29.62558593749999],[27.19355468750001,-29.94130859375001]]]]},"properties":{"name":"South Africa","childNum":2}},{"geometry":{"type":"Polygon","coordinates":[[[33.148046875,-9.603515625],[33.25,-9.759570312500003],[33.35097656250002,-9.862207031250009],[33.33710937500001,-9.954003906250009],[33.3115234375,-10.037988281250009],[33.52890625,-10.234667968750003],[33.53759765625,-10.3515625],[33.5537109375,-10.391308593750011],[33.66152343750002,-10.553125],[33.29277343750002,-10.85234375],[33.37978515625002,-11.157910156250011],[33.26835937500002,-11.40390625],[33.23271484375002,-11.417675781250011],[33.22636718750002,-11.534863281250011],[33.30390625000001,-11.690820312500009],[33.25234375000002,-12.112597656250003],[33.34013671875002,-12.308300781250011],[33.512304687500006,-12.347753906250006],[32.975195312500006,-12.701367187500011],[32.96757812500002,-13.225],[32.67041015625,-13.590429687500006],[32.797460937500006,-13.6884765625],[32.98125,-14.009375],[33.148046875,-13.94091796875],[33.201757812500006,-14.013378906250011],[30.231835937500023,-14.990332031250006],[30.39609375,-15.64306640625],[29.4873046875,-15.69677734375],[28.9130859375,-15.98779296875],[28.760546875000017,-16.53212890625001],[27.932226562500006,-16.89619140625001],[27.020800781250017,-17.95839843750001],[26.779882812500006,-18.04150390625],[26.333398437500023,-17.929296875],[25.995898437500017,-17.969824218750006],[25.2587890625,-17.793554687500006],[25.001757812500017,-17.56855468750001],[24.73291015625,-17.51777343750001],[24.27490234375,-17.481054687500006],[23.380664062500017,-17.640625],[22.193945312500006,-16.628125],[21.979785156250017,-15.95556640625],[21.979394531250023,-14.440527343750006],[21.979296875000017,-14.11962890625],[21.979101562500006,-13.798730468750009],[21.978906250000023,-13.0009765625],[22.209570312500006,-13.0009765625],[23.843164062500023,-13.0009765625],[23.962988281250006,-12.988476562500011],[23.882421875,-12.799023437500011],[23.886523437500017,-12.743261718750006],[23.909375,-12.636132812500009],[23.98388671875,-11.725],[23.96650390625001,-10.871777343750011],[24.36572265625,-11.1298828125],[24.3779296875,-11.417089843750006],[25.28876953125001,-11.21240234375],[25.349414062500017,-11.623046875],[26.025976562500006,-11.89013671875],[26.824023437500017,-11.965234375],[27.1591796875,-11.579199218750006],[27.573828125,-12.22705078125],[28.412890625000017,-12.51806640625],[28.550878906250006,-12.836132812500011],[28.730078125,-12.925488281250011],[29.014257812500006,-13.368847656250011],[29.20185546875001,-13.398339843750009],[29.55419921875,-13.248925781250009],[29.775195312500017,-13.438085937500006],[29.79511718750001,-12.155468750000011],[29.508203125000023,-12.228222656250011],[29.48554687500001,-12.41845703125],[29.064355468750023,-12.348828125000011],[28.482519531250006,-11.812109375],[28.383398437500006,-11.566699218750003],[28.6455078125,-10.550195312500009],[28.60419921875001,-9.678808593750006],[28.400683593750017,-9.224804687500011],[28.869531250000023,-8.785839843750011],[28.89814453125001,-8.485449218750006],[30.75117187500001,-8.193652343750003],[30.830664062500006,-8.385546875],[30.891992187500023,-8.473730468750006],[30.968359375,-8.550976562500011],[31.07636718750001,-8.611914062500006],[31.3505859375,-8.60703125],[31.44921875,-8.65390625],[31.53486328125001,-8.71328125],[31.55625,-8.80546875],[31.673632812500017,-8.908789062500006],[31.91865234375001,-8.9421875],[31.921875,-9.019433593750009],[31.94257812500001,-9.054003906250003],[32.75664062500002,-9.322265625],[32.919921875,-9.407421875000011],[32.99599609375002,-9.622851562500003],[33.148046875,-9.603515625]]]},"properties":{"name":"Zambia","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[31.287890625000017,-22.40205078125001],[31.07343750000001,-22.30781250000001],[30.71162109375001,-22.2978515625],[30.46015625000001,-22.32900390625001],[30.1904296875,-22.291113281250006],[29.90234375,-22.184179687500006],[29.6630859375,-22.146289062500003],[29.37744140625,-22.19277343750001],[29.36484375,-22.193945312500006],[29.315234375000017,-22.15771484375],[29.237207031250023,-22.07949218750001],[29.042382812500023,-22.018359375],[29.02558593750001,-21.796875],[28.014062500000023,-21.55419921875],[27.66943359375,-21.064257812500003],[27.679296875,-20.503027343750006],[27.28076171875,-20.47871093750001],[27.17822265625,-20.10097656250001],[26.168066406250006,-19.53828125000001],[25.939355468750023,-18.93867187500001],[25.242285156250006,-17.969042968750003],[25.2587890625,-17.793554687500006],[25.995898437500017,-17.969824218750006],[26.333398437500023,-17.929296875],[26.779882812500006,-18.04150390625],[27.020800781250017,-17.95839843750001],[27.932226562500006,-16.89619140625001],[28.760546875000017,-16.53212890625001],[28.9130859375,-15.98779296875],[29.4873046875,-15.69677734375],[30.39609375,-15.64306640625],[30.437792968750017,-15.995312500000011],[31.236230468750023,-16.02363281250001],[31.939843750000023,-16.428808593750006],[32.94804687500002,-16.71230468750001],[32.87626953125002,-16.88359375],[32.99306640625002,-18.35957031250001],[32.69970703125,-18.94091796875],[32.84980468750001,-19.10439453125001],[32.77763671875002,-19.388769531250006],[32.992773437500006,-19.98486328125],[32.49238281250001,-20.659765625],[32.353613281250006,-21.136523437500003],[32.429785156250006,-21.29707031250001],[31.429492187500017,-22.298828125],[31.287890625000017,-22.40205078125001]]]},"properties":{"name":"Zimbabwe","childNum":1}},{"geometry":{"type":"Polygon","coordinates":[[[74.00809389139292,33.25375789331485],[73.19660141888893,33.898124784580936],[73.13410859949555,34.82510160558277],[72.31128647748268,35.77290936638241],[73.08203125000107,36.43949943991182],[73.08961802927895,36.86435907947333],[73.116796875,36.868554687499994],[74.03886718750002,36.825732421874996],[74.54140625000002,37.02216796875],[74.69218750000002,37.0357421875],[74.8892578125,36.952441406249996],[74.94912109375002,36.968359375],[75.05390625000001,36.987158203125],[75.14521484375001,36.9732421875],[75.3466796875,36.913476562499994],[75.37685546875002,36.883691406249994],[75.42421875000002,36.738232421875],[75.46025390625002,36.725048828125],[75.57373046875,36.759326171874996],[75.66718750000001,36.741992187499996],[75.77216796875001,36.694921875],[75.84023437500002,36.649707031249996],[75.88496093750001,36.600732421874994],[75.93300781250002,36.52158203125],[75.95185546875001,36.45810546875],[75.97441406250002,36.382421875],[75.91230468750001,36.048974609374994],[76.07089843750003,35.9830078125],[76.14785156250002,35.829003906249994],[76.17783203125003,35.810546875],[76.25166015625001,35.8109375],[76.3857421875,35.837158203125],[76.50205078125003,35.878222656249996],[76.55126953125,35.887060546875],[76.5634765625,35.772998046874996],[76.6318359375,35.729394531249994],[76.7275390625,35.678662109375],[76.76689453124999,35.66171875],[76.81279296874999,35.571826171874996],[76.88222656250002,35.4357421875],[76.927734375,35.346630859375],[77.04863281249999,35.109912109374996],[77.00087890625002,34.991992187499996],[76.78291015625001,34.900195312499996],[76.75751953125001,34.877832031249994],[76.7490234375,34.847558593749994],[76.6962890625,34.786914062499996],[76.59443359375001,34.73583984375],[76.45673828125001,34.756103515625],[76.17246093750003,34.667724609375],[76.041015625,34.669921875],[75.93828125000002,34.612548828125],[75.86210937500002,34.56025390625],[75.70917968750001,34.503076171874994],[74.300390625,34.765380859375],[74.17197265625,34.7208984375],[74.05585937500001,34.6806640625],[73.96123046875002,34.653466796874994],[73.79453125,34.378222656249996],[73.80996093750002,34.325341796874994],[73.92460937500002,34.287841796875],[73.97236328125001,34.236621093749996],[73.9794921875,34.191308593749994],[73.90390625,34.1080078125],[73.94990234375001,34.018798828125],[74.24648437500002,33.990185546875],[73.97646484375002,33.7212890625],[74.15,33.506982421874994],[74.00809389139292,33.25375789331485]]]},"properties":{"name":"","childNum":1}},{"geometry":{"type":"MultiPolygon","coordinates":[[[[78.49194250885338,32.53122786149202],[78.10154031239509,32.87658365066666],[77.71342088235082,32.6917648744551],[77.06655516561037,33.301666835953235],[76.62299010270264,33.32014871357439],[76.32728006076415,32.87658365066666],[75.73585997688717,32.78417426256088],[75.62496871116024,32.28516356678968],[75.32221348233018,32.28516356678968],[74.98730468749997,32.46220703124996],[74.78886718750013,32.4578125],[74.6857421875001,32.493798828124994],[74.66328125000004,32.75766601562495],[74.63242187499995,32.770898437500136],[74.58828125000011,32.7532226562501],[74.35458984375012,32.76870117187505],[74.30546875000007,32.81044921875002],[74.30361328125005,32.991796875000034],[73.98984375000006,33.22119140625006],[74.15,33.506982421874994],[73.97646484375016,33.72128906249998],[74.24648437500011,33.99018554687504],[73.9499023437501,34.018798828125],[73.90390625000012,34.10800781250006],[73.97949218750009,34.191308593749966],[73.97236328125004,34.23662109374996],[73.92460937500007,34.287841796875114],[73.80996093750016,34.32534179687511],[73.79453125000006,34.378222656250045],[73.96123046875007,34.653466796874994],[74.05585937500015,34.68066406250003],[74.17197265624995,34.72089843750004],[74.30039062500006,34.76538085937506],[75.70917968750004,34.50307617187508],[75.86210937500002,34.56025390625001],[75.93828125000019,34.612548828125],[76.04101562500014,34.66992187499997],[76.17246093750006,34.66772460937506],[76.4567382812501,34.756103515625114],[76.5944335937501,34.73583984375006],[76.69628906249997,34.78691406249999],[76.74902343750014,34.84755859375008],[76.7575195312501,34.87783203125005],[76.7829101562501,34.90019531249999],[77.00087890625011,34.99199218750002],[77.03066406250011,35.06235351562498],[77.04863281250007,35.109912109375074],[77.42343749999995,35.30258789062506],[77.57158203125002,35.37875976562495],[77.69697265625015,35.443261718750136],[77.79941406250006,35.49589843750002],[78.0426757812501,35.4797851562501],[78.07578125000006,35.13491210937502],[78.15849609375002,34.94648437499998],[78.32695312500007,34.60639648437498],[78.86484375000006,34.39033203125001],[78.93642578125,34.35195312500002],[78.97060546875011,34.22822265625004],[78.72666015625006,34.013378906249955],[78.78378906250006,33.80878906250004],[78.86503906250002,33.43110351562501],[78.94843750000004,33.346533203125006],[79.1125,33.22626953125001],[79.13515625000005,33.17192382812496],[79.10283203125007,33.05253906249996],[79.14550781250003,33.00146484375006],[79.16992187500003,32.497216796874994],[78.91894531249997,32.3582031250001],[78.75351562500012,32.49926757812506],[78.73671875,32.55839843750002],[78.49194250885338,32.53122786149202]]]]},"properties":{"name":"","childNum":1}}]} \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..109cfcb --- /dev/null +++ b/src/main.js @@ -0,0 +1,53 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import App from './App' +import store from './store/index'; +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; + +import GeminiScrollbar from "vue-gemini-scrollbar" +Vue.use(ElementUI); +Vue.use(GeminiScrollbar); +// 引入下载的 echarts 模块 +import * as echarts from 'echarts'; + +// 添加到 Vue 的原型链上 +Vue.prototype.$echarts = echarts; + +// 引入 axios +import axios from 'axios' + +// 挂载一个自定义属性$http +Vue.prototype.$http = axios + +// // 全局配置axios请求根路径(axios.默认配置.请求根路径) +// axios.defaults.baseURL = 'http://yufei.shop:3000' + + +// 全局引入 echarts 配置 +// import "./echartsjs/echarts" +// 引入导入的路由 +import router from "@/router/index" +import VueRouter from "vue-router"; + + + +Vue.use(echarts) +Vue.use(VueRouter) + +Vue.config.productionTip = false + +/* eslint-disable no-new */ +// new Vue({ +// el: '#app', +// components: { App }, +// template: '', +// }) + +new Vue({ + el: "#app", + router, + store, + render: h => h(App), +}).$mount('#app') \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..56bde21 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,37 @@ +import Vue from "vue"; +import VueRouter from "vue-router"; +import index from "@/views/Index"; +import chinaco2 from "@/views/ChinaCo2"; +import detailsco2 from "@/views/DetailsCo2"; + +Vue.use(VueRouter); + +const router = new VueRouter({ + mode: 'history', + routes: [ + { + path: "/", + name: "index", + meta: { + title: '首页', + }, + component: index, + }, + { + path: "/chinaco2", + name: "chinaco2", + meta: { + title: '第二个页', + }, + component: chinaco2, + }, + { + path: "/detailsco2", + name: "detailsco2", + component: detailsco2, + } + ] +}) + + +export default router; \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..4d9d72a --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,274 @@ +import Vue from "vue" +import Vuex from "vuex" +import axios from "axios" + +let path = "http://127.0.0.1:5000/" // 本地 +// let path = "http://124.71.168.125:5000" // 服务器 + +Vue.use(Vuex); + +const store = new Vuex.Store({ + state: { + // title + title: "", + // 第一个页面 + data: {}, + times: [], + worldMapData: [], + worldMap: {}, + worldBarData: [], + saveworldPlot: [], + time: 2023, + // 第二个图的数据 + savechinaMap: [], + savechinacolorList: [], + savechinaPorText: [], + savechinabar: [], + savechinaPie: [], + savechinaPlot: [], + savechinaPor: [], + savechinaname: "", + // 第三个图的数据 + citytable: [], + ciyun: [], + + }, + mutations: { + + changetitle(state, obj) { + state.title = obj; + }, + + // 第一个模块的数据 + + // 条形图数据 + changeData(state, obj) { + state.times = obj; + }, + // 保存地图里面数据 + saveworldMapData(state, obj) { + state.worldMapData = obj; + }, + // 保存地图json数据 + saveworldMap(state, obj) { + state.worldMap = obj; + }, + // 保存 barh 数据 + saveworldBar(state, obj) { + state.worldBarData = obj; + }, + // 保存 plot 的数据 + saveworldPlot(state, obj) { + state.saveworldPlot = obj; + }, + + // 第二个板块的数据 + + // 中国数据 地图内的数据 + savechinaMap(state, obj) { + state.savechinaMap = obj + }, + savechinaname(state, obj) { + state.savechinaname = obj + }, + savechinatime(state, str) { + state.time = str + }, + // 中国数据 条形图 + savechinaBar(state, list) { + state.savechinacolorList = eval(list[1]); + state.savechinabar = eval(list[0]); + state.savechinaPor = eval(list[2]); + state.savechinaPorText = eval(list[3]); + + }, + // 中国数据 饼图 + savechinaPie(state, obj) { + state.savechinaPie = obj + }, + // 中国数据 折线图 + savechinaPlot(state, obj) { + state.savechinaPlot = obj + }, + // 中国数据 雷达图 + savechinaPor(state, obj) { + state.savechinaPor = obj + }, + + + // 第三个模块的数据 + + // // 表单 + saveCityTable(state, obj) { + state.citytable = obj + }, + saveCiyun(state, obj) { + state.ciyun = obj + }, + + }, + + + + + actions: { //, context.state.test + + changetitle(context, value) { + context.commit('changetitle', value) + }, + + // 第一个模块的请求 + async saveForm(context) { // 获取时间list 世界模块的 + await axios.get(path + "/worldtime.exc").then(res => { // 调用接口 + // console.log(res.data); + context.commit('changeData', res.data) // 通过接口获取的后台数据保存到store中,等待组件取用 + }) + }, + async saveworldMapData(context) { // 世界地图 数据 + await axios.get(path + "/worldData.exc").then( + res => { + context.commit('saveworldMapData', res.data) + } + ) + }, + async saveworldMap(context) { // 世界地图数据 + await axios.get(path + '/map/world').then( + res => { + // console.log("ces", typeof(res.data)); + context.commit('saveworldMap', res.data) + } + ) + }, + async saveworldBarData(context) { // + await axios.get(path + '/worldBarhData.exc').then( + res => { + // console.log(res.data); + context.commit('saveworldBar', res.data) + } + ) + }, + async saveworldPlotData(context) { // 世界折线图 数据请求 + await axios.get(path + "/worldCo2DataPloat.exc").then( + res => { + // console.log(res.data[1][1]); + context.commit('saveworldPlot', res.data) + } + ) + }, + + + // 第二个,模块的请求 + savechinaname(context, value) { + context.commit('savechinaname', value) + }, + savechinatime(context, value) { + context.commit("savechinatime", value) + }, + async savechinaMap(context, value = { name: null, time: null }) { + // console.log(value.name, value.time); + await axios.post(path + "/china/mapdata.exc", { + provincename: value.name, + provincetime: value.time + + }, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then( + res => { + console.log(res.data); + context.commit('savechinaMap', res.data) + } + ) + }, + async savechinaPlot(context, value = { name: null }) { + await axios.post(path + "/china/plotdata.exc", { + provincename: value.name, + }, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then( + res => { + console.log(res.data); + context.commit('savechinaPlot', res.data) + } + ) + }, + // 雷达图 和 条形图的数据 + async savechinaBar(context, value = { name: null, time: null }) { + console.log(value); + await axios.post(path + "/china/barhdata.exc", { + provincename: value.name, + provincetime: value.time + }, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then( + res => { + console.log(res.data); + let data = res.data; + let colorList = []; + let list = []; + let savechinaPor = []; + let savechinaPorText = []; + for (let i = 0; i < 6; i++) { + if (data[i] == undefined) { + context.commit('savechinaBar', [null, null, null, null]) + return; + } + + if ("name" in data[i]) { + list.push(data[i]); + savechinaPor.push(data[i].value) + colorList.push({ "name": data[i].name, from: "#" + i + "F" + i + "6F" + i, to: "#" + i + "A" + i + "A9" + i }) + savechinaPorText.push({ "name": data[i].name, "max": parseInt(data[0].value) + 1 }) + } + // colorList.push({ name: data[i].name, from: "#7416F7", to: "#E021FD" },) + } + // console.log('text', colorList, list, savechinaPorText); + context.commit('savechinaBar', [list, colorList, savechinaPor, savechinaPorText]) + } + ) + }, + + // 第三个,模块 + // async saveCityTable(context, provinceTime = '2011', lookName = '%%', area = '省') { + // provinceTime, lookName, area + async saveCityTable(context, value = { provinceTime: null, lookName: null, area: null }) { + console.log('provinceTime', value.provinceTime, value.lookName); + if (value.provinceTime != null) + await axios.post(path + '/cx.exc', { + 'lookName': value.lookName, + 'area': value.area, + 'provinceTime': value.provinceTime + }, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then(res => { + console.log('1', res.data); + context.commit('saveCityTable', res.data) + }); + await axios.post(path + '/ciyun.exc', { + 'lookName': value.lookName, + 'area': value.area, + 'provinceTime': value.provinceTime + }, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then(res => { + console.log('lookName', value.lookName, + 'area', value.area, + 'provinceTime', value.provinceTime); + console.log('2', res.data); + context.commit('saveCiyun', res.data) + }) + }, + + } +}) + +export default store; diff --git a/src/views/ChinaCo2.vue b/src/views/ChinaCo2.vue new file mode 100644 index 0000000..bf7064c --- /dev/null +++ b/src/views/ChinaCo2.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/src/views/DetailsCo2.vue b/src/views/DetailsCo2.vue new file mode 100644 index 0000000..1390513 --- /dev/null +++ b/src/views/DetailsCo2.vue @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/src/views/Index.vue b/src/views/Index.vue new file mode 100644 index 0000000..4f95702 --- /dev/null +++ b/src/views/Index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/views/text.vue b/src/views/text.vue new file mode 100644 index 0000000..d997dca --- /dev/null +++ b/src/views/text.vue @@ -0,0 +1,64 @@ + + + + \ No newline at end of file diff --git a/static/.gitkeep b/static/.gitkeep new file mode 100644 index 0000000..e69de29 -- Gitee