]> source.dussan.org Git - svg.js.git/commitdiff
dependency updates, easier formatting
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Mon, 12 Jun 2023 23:43:37 +0000 (01:43 +0200)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Mon, 12 Jun 2023 23:43:37 +0000 (01:43 +0200)
190 files changed:
.config/karma.conf.cjs [new file with mode: 0644]
.config/karma.conf.common.cjs [new file with mode: 0644]
.config/karma.conf.common.js [deleted file]
.config/karma.conf.js [deleted file]
.config/karma.conf.saucelabs.cjs [new file with mode: 0644]
.config/karma.conf.saucelabs.js [deleted file]
.config/polyfillListIE.js
.config/pretest.js
.config/rollup.config.js
.config/rollup.tests.js
.eslintrc.json
.github/CONTRIBUTING.md
.github/ISSUE_TEMPLATE/bug-report.md
.github/ISSUE_TEMPLATE/feature-request.md
.github/ISSUE_TEMPLATE/other.md
.prettierignore [new file with mode: 0644]
.prettierrc.json [new file with mode: 0644]
.travis.yml
README.md
bench/runner.html
bench/svg.bench.js
bench/tests/10000-accesses.js
bench/tests/10000-boxes.js
bench/tests/10000-circles.js
bench/tests/10000-each.js
bench/tests/10000-pathArray-bbox.js
bench/tests/10000-pathArrays.js
bench/tests/10000-paths.js
bench/tests/10000-pointArray-bbox.js
bench/tests/10000-rects.js
bench/tests/10000-textContent.js
bench/tests/10000-transform.js
package-lock.json
package.json
playgrounds/colors/index.html
playgrounds/colors/main.js
playgrounds/colors/style.css
playgrounds/matrix/drag.js
playgrounds/matrix/index.html
playgrounds/matrix/matrix.js
playgrounds/matrix/style.css
playgrounds/transforms/index.html
playgrounds/transforms/style.css
playgrounds/transforms/transforms.js
playgrounds/webpack.config.js
spec/RAFPlugin.js
spec/SpecRunner.html
spec/SpecRunnerEs6.html
spec/checkForAllTests.js
spec/fixtures/fixture.css
spec/helpers.js
spec/runSVGDomTest.js
spec/setupSVGDom.js
spec/spec/animation/Animator.js
spec/spec/animation/Controller.js
spec/spec/animation/Morphable.js
spec/spec/animation/Queue.js
spec/spec/animation/Runner.js
spec/spec/animation/Timeline.js
spec/spec/elements/A.js
spec/spec/elements/ClipPath.js
spec/spec/elements/Container.js
spec/spec/elements/Dom.js
spec/spec/elements/Element.js
spec/spec/elements/ForeignObject.js
spec/spec/elements/Fragment.js
spec/spec/elements/G.js
spec/spec/elements/Gradient.js
spec/spec/elements/Image.js
spec/spec/elements/Line.js
spec/spec/elements/Marker.js
spec/spec/elements/Mask.js
spec/spec/elements/Path.js
spec/spec/elements/Pattern.js
spec/spec/elements/Polygon.js
spec/spec/elements/Polyline.js
spec/spec/elements/Rect.js
spec/spec/elements/Stop.js
spec/spec/elements/Style.js
spec/spec/elements/Svg.js
spec/spec/elements/Symbol.js
spec/spec/elements/Text.js
spec/spec/elements/TextPath.js
spec/spec/elements/Tspan.js
spec/spec/modules/core/attr.js
spec/spec/modules/core/circled.js
spec/spec/modules/core/containerGeometry.js
spec/spec/modules/core/event.js
spec/spec/modules/core/gradiented.js
spec/spec/modules/core/pointed.js
spec/spec/modules/core/poly.js
spec/spec/modules/core/regex.js
spec/spec/modules/core/selector.js
spec/spec/modules/core/textable.js
spec/spec/modules/optional/arrange.js
spec/spec/modules/optional/class.js
spec/spec/modules/optional/css.js
spec/spec/modules/optional/data.js
spec/spec/modules/optional/memory.js
spec/spec/modules/optional/sugar.js
spec/spec/modules/optional/transform.js
spec/spec/types/Box.js
spec/spec/types/Color.js
spec/spec/types/EventTarget.js
spec/spec/types/List.js
spec/spec/types/Matrix.js
spec/spec/types/PathArray.js
spec/spec/types/Point.js
spec/spec/types/PointArray.js
spec/spec/types/SVGArray.js
spec/spec/types/SVGNumber.js
spec/spec/utils/adopter.js
spec/spec/utils/methods.js
spec/spec/utils/pathParser.js
spec/spec/utils/utils.js
spec/spec/utils/window.js
src/animation/Animator.js
src/animation/Controller.js
src/animation/Morphable.js
src/animation/Queue.js
src/animation/Runner.js
src/animation/Timeline.js
src/elements/A.js
src/elements/Circle.js
src/elements/ClipPath.js
src/elements/Container.js
src/elements/Defs.js
src/elements/Dom.js
src/elements/Element.js
src/elements/Ellipse.js
src/elements/ForeignObject.js
src/elements/Fragment.js
src/elements/G.js
src/elements/Gradient.js
src/elements/Image.js
src/elements/Line.js
src/elements/Marker.js
src/elements/Mask.js
src/elements/Path.js
src/elements/Pattern.js
src/elements/Polygon.js
src/elements/Polyline.js
src/elements/Rect.js
src/elements/Stop.js
src/elements/Style.js
src/elements/Svg.js
src/elements/Symbol.js
src/elements/Text.js
src/elements/TextPath.js
src/elements/Tspan.js
src/elements/Use.js
src/main.js
src/modules/core/attr.js
src/modules/core/circled.js
src/modules/core/containerGeometry.js
src/modules/core/defaults.js
src/modules/core/event.js
src/modules/core/gradiented.js
src/modules/core/parser.js
src/modules/core/pointed.js
src/modules/core/poly.js
src/modules/core/regex.js
src/modules/core/selector.js
src/modules/core/textable.js
src/modules/optional/arrange.js
src/modules/optional/class.js
src/modules/optional/css.js
src/modules/optional/data.js
src/modules/optional/memory.js
src/modules/optional/sugar.js
src/modules/optional/transform.js
src/polyfills/children.js
src/polyfills/innerHTML.js
src/svg.js
src/types/Box.js
src/types/Color.js
src/types/EventTarget.js
src/types/List.js
src/types/Matrix.js
src/types/PathArray.js
src/types/Point.js
src/types/PointArray.js
src/types/SVGArray.js
src/types/SVGNumber.js
src/utils/adopter.js
src/utils/methods.js
src/utils/pathParser.js
src/utils/utils.js
src/utils/window.js
svg.js.d.ts

diff --git a/.config/karma.conf.cjs b/.config/karma.conf.cjs
new file mode 100644 (file)
index 0000000..7584c92
--- /dev/null
@@ -0,0 +1,88 @@
+// Karma configuration
+const karmaCommon = require('./karma.conf.common.cjs')
+
+let chromeBin = 'ChromeHeadless'
+if (process.platform === 'linux') {
+  // We need to choose either Chrome or Chromium.
+  // Canary is not available on linux.
+  // If we do not find Chromium then we can deduce that
+  // either Chrome is installed or there is no Chrome variant at all,
+  // in which case karma-chrome-launcher will output an error.
+  // If `which` finds nothing it will throw an error.
+  const { execSync } = require('child_process')
+
+  try {
+    if (execSync('which chromium-browser')) chromeBin = 'ChromiumHeadless'
+  } catch (e) {}
+}
+
+module.exports = function (config) {
+  config.set(
+    Object.assign(karmaCommon(config), {
+      files: [
+        'spec/RAFPlugin.js',
+        {
+          pattern: 'spec/fixtures/fixture.css',
+          included: false,
+          served: true
+        },
+        {
+          pattern: 'spec/fixtures/pixel.png',
+          included: false,
+          served: true
+        },
+        {
+          pattern: 'src/**/*.js',
+          included: false,
+          served: true,
+          type: 'modules'
+        },
+        {
+          pattern: 'spec/helpers.js',
+          included: false,
+          served: true,
+          type: 'module'
+        },
+        {
+          pattern: 'spec/setupBrowser.js',
+          included: true,
+          type: 'module'
+        },
+        {
+          pattern: 'spec/spec/*/**/*.js',
+          included: true,
+          type: 'module'
+        }
+      ],
+
+      // preprocess matching files before serving them to the browser
+      // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+      preprocessors: {
+        'src/**/*.js': ['coverage']
+      },
+
+      // test results reporter to use
+      // possible values: 'dots', 'progress'
+      // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+      reporters: ['progress', 'coverage'],
+      coverageReporter: {
+        // Specify a reporter type.
+        type: 'lcov',
+        dir: 'coverage/',
+        subdir: function (browser) {
+          // normalization process to keep a consistent browser name accross different OS
+          return browser.toLowerCase().split(/[ /-]/)[0] // output the results into: './coverage/firefox/'
+        },
+        instrumenterOptions: {
+          istanbul: {
+            esModules: true
+          }
+        }
+      },
+
+      // start these browsers
+      // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+      browsers: [chromeBin, 'FirefoxHeadless']
+    })
+  )
+}
diff --git a/.config/karma.conf.common.cjs b/.config/karma.conf.common.cjs
new file mode 100644 (file)
index 0000000..4808996
--- /dev/null
@@ -0,0 +1,67 @@
+// Karma shared configuration
+
+const os = require('os')
+const cpuCount = os.cpus().length
+
+module.exports = function (config) {
+  return {
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '../',
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+    // list of files / patterns to load in the browser
+    files: [
+      '.config/pretest.js',
+      'spec/RAFPlugin.js',
+      {
+        pattern: 'spec/fixtures/fixture.css',
+        included: false,
+        served: true
+      },
+      {
+        pattern: 'spec/fixtures/fixture.svg',
+        included: false,
+        served: true
+      },
+      {
+        pattern: 'spec/fixtures/pixel.png',
+        included: false,
+        served: true
+      },
+      'dist/svg.js',
+      'spec/spec/*.js'
+    ],
+
+    proxies: {
+      '/fixtures/': '/base/spec/fixtures/',
+      '/spec/': '/base/spec/'
+    },
+
+    // web server port
+    port: 9876,
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_INFO,
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: false,
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: true,
+
+    // Concurrency level
+    // how many browser should be started simultaneous
+    concurrency: cpuCount || Infinity,
+
+    // list of files to exclude
+    exclude: []
+  }
+}
diff --git a/.config/karma.conf.common.js b/.config/karma.conf.common.js
deleted file mode 100644 (file)
index 4808996..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// Karma shared configuration
-
-const os = require('os')
-const cpuCount = os.cpus().length
-
-module.exports = function (config) {
-  return {
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '../',
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['jasmine'],
-
-    // list of files / patterns to load in the browser
-    files: [
-      '.config/pretest.js',
-      'spec/RAFPlugin.js',
-      {
-        pattern: 'spec/fixtures/fixture.css',
-        included: false,
-        served: true
-      },
-      {
-        pattern: 'spec/fixtures/fixture.svg',
-        included: false,
-        served: true
-      },
-      {
-        pattern: 'spec/fixtures/pixel.png',
-        included: false,
-        served: true
-      },
-      'dist/svg.js',
-      'spec/spec/*.js'
-    ],
-
-    proxies: {
-      '/fixtures/': '/base/spec/fixtures/',
-      '/spec/': '/base/spec/'
-    },
-
-    // web server port
-    port: 9876,
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: false,
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: true,
-
-    // Concurrency level
-    // how many browser should be started simultaneous
-    concurrency: cpuCount || Infinity,
-
-    // list of files to exclude
-    exclude: []
-  }
-}
diff --git a/.config/karma.conf.js b/.config/karma.conf.js
deleted file mode 100644 (file)
index 67667c7..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-// Karma configuration
-const karmaCommon = require('./karma.conf.common.js')
-
-let chromeBin = 'ChromeHeadless'
-if (process.platform === 'linux') {
-  // We need to choose either Chrome or Chromium.
-  // Canary is not available on linux.
-  // If we do not find Chromium then we can deduce that
-  // either Chrome is installed or there is no Chrome variant at all,
-  // in which case karma-chrome-launcher will output an error.
-  // If `which` finds nothing it will throw an error.
-  const { execSync } = require('child_process')
-
-  try {
-    if (execSync('which chromium-browser')) chromeBin = 'ChromiumHeadless'
-  } catch (e) {}
-}
-
-module.exports = function (config) {
-  config.set(
-    Object.assign(karmaCommon(config), {
-      files: [
-        'spec/RAFPlugin.js',
-        {
-          pattern: 'spec/fixtures/fixture.css',
-          included: false,
-          served: true
-        },
-        {
-          pattern: 'spec/fixtures/pixel.png',
-          included: false,
-          served: true
-        },
-        {
-          pattern: 'src/**/*.js',
-          included: false,
-          served: true,
-          type: 'modules'
-        },
-        {
-          pattern: 'spec/helpers.js',
-          included: false,
-          served: true,
-          type: 'module'
-        },
-        {
-          pattern: 'spec/setupBrowser.js',
-          included: true,
-          type: 'module'
-        },
-        {
-          pattern: 'spec/spec/*/**/*.js',
-          included: true,
-          type: 'module'
-        }
-      ],
-
-      // preprocess matching files before serving them to the browser
-      // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-      preprocessors: {
-        'src/**/*.js': ['coverage']
-      },
-
-      // test results reporter to use
-      // possible values: 'dots', 'progress'
-      // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-      reporters: ['progress', 'coverage'],
-      coverageReporter: {
-        // Specify a reporter type.
-        type: 'lcov',
-        dir: 'coverage/',
-        subdir: function (browser) {
-          // normalization process to keep a consistent browser name accross different OS
-          return browser.toLowerCase().split(/[ /-]/)[0] // output the results into: './coverage/firefox/'
-        },
-        instrumenterOptions: {
-          istanbul: {
-              esModules: true
-          }
-        }
-      },
-
-      // start these browsers
-      // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-      browsers: [chromeBin, 'FirefoxHeadless']
-    })
-  )
-}
diff --git a/.config/karma.conf.saucelabs.cjs b/.config/karma.conf.saucelabs.cjs
new file mode 100644 (file)
index 0000000..484ebee
--- /dev/null
@@ -0,0 +1,144 @@
+// Karma configuration
+// https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
+
+// TODO: remove dotenv after local test
+// require('dotenv').config()
+
+const karmaCommon = require('./karma.conf.common.cjs')
+
+const SauceLabsLaunchers = {
+  /** Real mobile devices are not available
+   *  Your account does not have access to Android devices.
+   *  Please contact sales@saucelabs.com to add this feature to your account. */
+  /* sl_android_chrome: {
+    base: 'SauceLabs',
+    appiumVersion: '1.5.3',
+    deviceName: 'Samsung Galaxy S7 Device',
+    deviceOrientation: 'portrait',
+    browserName: 'Chrome',
+    platformVersion: '6.0',
+    platformName: 'Android'
+  }, */
+  /* sl_android: {
+    base: 'SauceLabs',
+    browserName: 'Android',
+    deviceName: 'Android Emulator',
+    deviceOrientation: 'portrait'
+  }, */
+  SL_firefox_latest: {
+    base: 'SauceLabs',
+    browserName: 'firefox',
+    version: 'latest'
+  },
+  SL_chrome_latest: {
+    base: 'SauceLabs',
+    browserName: 'chrome',
+    version: 'latest'
+  },
+  SL_InternetExplorer: {
+    base: 'SauceLabs',
+    browserName: 'internet explorer',
+    version: '11.0'
+  } /*
+  sl_windows_edge: {
+    base: 'SauceLabs',
+    browserName: 'MicrosoftEdge',
+    version: 'latest',
+    platform: 'Windows 10'
+  },
+  sl_macos_safari: {
+    base: 'SauceLabs',
+    browserName: 'safari',
+    platform: 'macOS 10.13',
+    version: '12.0',
+    recordVideo: true,
+    recordScreenshots: true,
+    screenResolution: '1024x768'
+  } */ /*,
+  sl_macos_iphone: {
+    base: 'SauceLabs',
+    browserName: 'Safari',
+    deviceName: 'iPhone SE Simulator',
+    deviceOrientation: 'portrait',
+    platformVersion: '10.2',
+    platformName: 'iOS'
+  }
+  'SL_Chrome': {
+    base: 'SauceLabs',
+    browserName: 'chrome',
+    version: '48.0',
+    platform: 'Linux'
+  },
+  'SL_Firefox': {
+    base: 'SauceLabs',
+    browserName: 'firefox',
+    version: '50.0',
+    platform: 'Windows 10'
+  },
+  'SL_Safari': {
+    base: 'SauceLabs',
+    browserName: 'safari',
+    platform: 'OS X 10.11',
+    version: '10.0'
+  } */
+}
+
+module.exports = function (config) {
+  if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) {
+    console.error(
+      'SAUCE_USERNAME and SAUCE_ACCESS_KEY must be provided as environment variables.'
+    )
+    console.warn('Aborting Sauce Labs test')
+    process.exit(1)
+  }
+  const settings = Object.assign(karmaCommon(config), {
+    // Concurrency level
+    // how many browser should be started simultaneous
+    // Saucelabs allow up to 5 concurrent sessions on the free open source tier.
+    concurrency: 5,
+
+    // this specifies which plugins karma should load
+    // by default all karma plugins, starting with `karma-` will load
+    // so if you are really puzzled why something isn't working, then comment
+    // out plugins: [] - it's here to make karma load faster
+    // get possible karma plugins by `ls node_modules | grep 'karma-*'`
+    plugins: ['karma-jasmine', 'karma-sauce-launcher'],
+
+    // logLevel: config.LOG_DEBUG,
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['dots', 'saucelabs'],
+
+    customLaunchers: SauceLabsLaunchers,
+
+    // start these browsers
+    browsers: Object.keys(SauceLabsLaunchers),
+    sauceLabs: {
+      testName: 'SVG.js Unit Tests'
+      // connectOptions: {
+      //   noSslBumpDomains: "all"
+      // },
+      // connectOptions: {
+      //   port: 5757,
+      //   logfile: 'sauce_connect.log'
+      // },
+    }
+
+    // The number of disconnections tolerated.
+    // browserDisconnectTolerance: 0, // well, sometimes it helps to just restart
+    // // How long does Karma wait for a browser to reconnect (in ms).
+    // browserDisconnectTimeout: 10 * 60 * 1000,
+    // // How long will Karma wait for a message from a browser before disconnecting from it (in ms). ~ macOS 10.12 needs more than 7 minutes
+    // browserNoActivityTimeout: 20 * 60 * 1000,
+    // // Timeout for capturing a browser (in ms).  On newer versions of iOS simulator (10.0+), the start up time could be between 3 - 6 minutes.
+    // captureTimeout: 12 * 60 * 1000, // this is useful if saucelabs takes a long time to boot a vm
+
+    // // Required to make Safari on Sauce Labs play nice.
+    // // hostname: 'karmalocal.dev'
+  })
+
+  console.log(settings)
+  config.set(settings)
+}
diff --git a/.config/karma.conf.saucelabs.js b/.config/karma.conf.saucelabs.js
deleted file mode 100644 (file)
index 089f25a..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-// Karma configuration
-// https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
-
-// TODO: remove dotenv after local test
-require('dotenv').config()
-
-const karmaCommon = require('./karma.conf.common.js')
-
-const SauceLabsLaunchers = {
-  /** Real mobile devices are not available
-   *  Your account does not have access to Android devices.
-   *  Please contact sales@saucelabs.com to add this feature to your account. */
-  /* sl_android_chrome: {
-    base: 'SauceLabs',
-    appiumVersion: '1.5.3',
-    deviceName: 'Samsung Galaxy S7 Device',
-    deviceOrientation: 'portrait',
-    browserName: 'Chrome',
-    platformVersion: '6.0',
-    platformName: 'Android'
-  }, */
-  /* sl_android: {
-    base: 'SauceLabs',
-    browserName: 'Android',
-    deviceName: 'Android Emulator',
-    deviceOrientation: 'portrait'
-  }, */
-  SL_firefox_latest: {
-    base: 'SauceLabs',
-    browserName: 'firefox',
-    version: 'latest'
-  },
-  SL_chrome_latest: {
-    base: 'SauceLabs',
-    browserName: 'chrome',
-    version: 'latest'
-  },
-  SL_InternetExplorer: {
-    base: 'SauceLabs',
-    browserName: 'internet explorer',
-    version: '11.0'
-  }/*
-  sl_windows_edge: {
-    base: 'SauceLabs',
-    browserName: 'MicrosoftEdge',
-    version: 'latest',
-    platform: 'Windows 10'
-  },
-  sl_macos_safari: {
-    base: 'SauceLabs',
-    browserName: 'safari',
-    platform: 'macOS 10.13',
-    version: '12.0',
-    recordVideo: true,
-    recordScreenshots: true,
-    screenResolution: '1024x768'
-  } *//*,
-  sl_macos_iphone: {
-    base: 'SauceLabs',
-    browserName: 'Safari',
-    deviceName: 'iPhone SE Simulator',
-    deviceOrientation: 'portrait',
-    platformVersion: '10.2',
-    platformName: 'iOS'
-  }
-  'SL_Chrome': {
-    base: 'SauceLabs',
-    browserName: 'chrome',
-    version: '48.0',
-    platform: 'Linux'
-  },
-  'SL_Firefox': {
-    base: 'SauceLabs',
-    browserName: 'firefox',
-    version: '50.0',
-    platform: 'Windows 10'
-  },
-  'SL_Safari': {
-    base: 'SauceLabs',
-    browserName: 'safari',
-    platform: 'OS X 10.11',
-    version: '10.0'
-  } */
-}
-
-module.exports = function (config) {
-  if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) {
-    console.error('SAUCE_USERNAME and SAUCE_ACCESS_KEY must be provided as environment variables.')
-    console.warn('Aborting Sauce Labs test')
-    process.exit(1)
-  }
-  const settings = Object.assign(karmaCommon(config), {
-    // Concurrency level
-    // how many browser should be started simultaneous
-    // Saucelabs allow up to 5 concurrent sessions on the free open source tier.
-    concurrency: 5,
-
-    // this specifies which plugins karma should load
-    // by default all karma plugins, starting with `karma-` will load
-    // so if you are really puzzled why something isn't working, then comment
-    // out plugins: [] - it's here to make karma load faster
-    // get possible karma plugins by `ls node_modules | grep 'karma-*'`
-    plugins: [
-      'karma-jasmine',
-      'karma-sauce-launcher'
-    ],
-
-    // logLevel: config.LOG_DEBUG,
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['dots', 'saucelabs'],
-
-    customLaunchers: SauceLabsLaunchers,
-
-    // start these browsers
-    browsers: Object.keys(SauceLabsLaunchers),
-    sauceLabs: {
-      testName: 'SVG.js Unit Tests'
-      // connectOptions: {
-      //   noSslBumpDomains: "all"
-      // },
-      // connectOptions: {
-      //   port: 5757,
-      //   logfile: 'sauce_connect.log'
-      // },
-    }
-
-    // The number of disconnections tolerated.
-    // browserDisconnectTolerance: 0, // well, sometimes it helps to just restart
-    // // How long does Karma wait for a browser to reconnect (in ms).
-    // browserDisconnectTimeout: 10 * 60 * 1000,
-    // // How long will Karma wait for a message from a browser before disconnecting from it (in ms). ~ macOS 10.12 needs more than 7 minutes
-    // browserNoActivityTimeout: 20 * 60 * 1000,
-    // // Timeout for capturing a browser (in ms).  On newer versions of iOS simulator (10.0+), the start up time could be between 3 - 6 minutes.
-    // captureTimeout: 12 * 60 * 1000, // this is useful if saucelabs takes a long time to boot a vm
-
-    // // Required to make Safari on Sauce Labs play nice.
-    // // hostname: 'karmalocal.dev'
-  })
-
-  console.log(settings)
-  config.set(settings)
-}
index dbffbc590400cfd99b1060552f63a8e44f5d5607..7c7fc33726f8f0e8f4d27a738b377d926616fb78 100644 (file)
@@ -14,7 +14,9 @@ CustomEventPolyfill()
 try {
   if (!SVGElement.prototype.children) {
     Object.defineProperty(SVGElement.prototype, 'children', {
-      get: function () { return children(this) }
+      get: function () {
+        return children(this)
+      }
     })
   }
 } catch (e) {}
index 23b989e939b55a2718f7d8069c79deefe4f50876..0e6ecb75a49eb9ec69b774bae5b64ebec65e1ec9 100644 (file)
@@ -1,15 +1,17 @@
 /* global XMLHttpRequest */
 'use strict'
 
-function get (uri) {
+function get(uri) {
   var xhr = new XMLHttpRequest()
   xhr.open('GET', uri, false)
   xhr.send()
-  if (xhr.status !== 200) { console.error('SVG.js fixture could not be loaded. Tests will fail.') }
+  if (xhr.status !== 200) {
+    console.error('SVG.js fixture could not be loaded. Tests will fail.')
+  }
   return xhr.responseText
 }
 
-function main () {
+function main() {
   var style = document.createElement('style')
   document.head.appendChild(style)
   style.sheet.insertRule(get('/fixtures/fixture.css'), 0)
index 8391ba0b268cacdce075a99e613b10c96c22e1f4..586e8ea86e9678583a8d55a6d16b62ce6597442a 100644 (file)
@@ -1,9 +1,9 @@
-import * as pkg from '../package.json'
+import pkg from '../package.json' assert { type: 'json' }
 import babel from '@rollup/plugin-babel'
 import resolve from '@rollup/plugin-node-resolve'
 import commonjs from '@rollup/plugin-commonjs'
 import filesize from 'rollup-plugin-filesize'
-import { terser } from 'rollup-plugin-terser'
+import terser from '@rollup/plugin-terser'
 
 const buildDate = Date()
 
@@ -21,17 +21,22 @@ const headerLong = `/*!
 const headerShort = `/*! ${pkg.name} v${pkg.version} ${pkg.license}*/;`
 
 const getBabelConfig = (node = false) => {
-  
   let targets = pkg.browserslist
   const plugins = [
-    ['@babel/transform-runtime', {
-      version: "^7.14.5",
-      regenerator: false,
-      useESModules: true
-    }],
-    ["polyfill-corejs3", {
-      "method": "usage-pure"
-    }]
+    [
+      '@babel/transform-runtime',
+      {
+        version: '^7.14.5',
+        regenerator: false,
+        useESModules: true
+      }
+    ],
+    [
+      'polyfill-corejs3',
+      {
+        method: 'usage-pure'
+      }
+    ]
   ]
 
   if (node) {
@@ -43,15 +48,20 @@ const getBabelConfig = (node = false) => {
     babelHelpers: 'runtime',
     babelrc: false,
     targets: targets,
-    presets: [['@babel/preset-env', {
-      modules: false,
-      // useBuildins and plugin-transform-runtime are mutually exclusive
-      // https://github.com/babel/babel/issues/10271#issuecomment-528379505
-      // use babel-polyfills when released
-      useBuiltIns: false,
-      bugfixes: true,
-      loose: true
-    }]],
+    presets: [
+      [
+        '@babel/preset-env',
+        {
+          modules: false,
+          // useBuildins and plugin-transform-runtime are mutually exclusive
+          // https://github.com/babel/babel/issues/10271#issuecomment-528379505
+          // use babel-polyfills when released
+          useBuiltIns: false,
+          bugfixes: true,
+          loose: true
+        }
+      ]
+    ],
     plugins
   })
 }
@@ -90,11 +100,14 @@ const classes = [
 ]
 
 const config = (node, min, esm = false) => ({
-  input: (node || esm) ? './src/main.js' : './src/svg.js',
+  input: node || esm ? './src/main.js' : './src/svg.js',
   output: {
-    file: esm ? './dist/svg.esm.js'
-      : node ? './dist/svg.node.js'
-      : min ? './dist/svg.min.js'
+    file: esm
+      ? './dist/svg.esm.js'
+      : node
+      ? './dist/svg.node.js'
+      : min
+      ? './dist/svg.min.js'
       : './dist/svg.js',
     format: esm ? 'esm' : node ? 'cjs' : 'iife',
     name: 'SVG',
@@ -112,18 +125,20 @@ const config = (node, min, esm = false) => ({
     commonjs(),
     getBabelConfig(node),
     filesize(),
-    !min ? {} : terser({
-      mangle: {
-        reserved: classes
-      },
-      output: {
-        preamble: headerShort
-      }
-    })
+    !min
+      ? {}
+      : terser({
+          mangle: {
+            reserved: classes
+          },
+          output: {
+            preamble: headerShort
+          }
+        })
   ]
 })
 
 // [node, minified, esm]
 const modes = [[false], [false, true], [true], [false, false, true]]
 
-export default modes.map(m => config(...m))
+export default modes.map((m) => config(...m))
index 362014978adba41c3ae1602bfec2f31b1869c8a4..fe093b6f26fb88e46352c3701e65a24a3b352403 100644 (file)
@@ -4,40 +4,46 @@ import multiEntry from '@rollup/plugin-multi-entry'
 import resolve from '@rollup/plugin-node-resolve'
 import commonjs from '@rollup/plugin-commonjs'
 
-const getBabelConfig = (targets) => babel({
-  include: ['src/**', 'spec/**/*'],
-  babelHelpers: 'runtime',
-  babelrc: false,
-  presets: [['@babel/preset-env', {
-    modules: false,
-    targets: targets || pkg.browserslist,
-    // useBuildins and plugin-transform-runtime are mutually exclusive
-    // https://github.com/babel/babel/issues/10271#issuecomment-528379505
-    // use babel-polyfills when released
-    useBuiltIns: false,
-    // corejs: 3,
-    bugfixes: true
-  }]],
-  plugins: [
-    ['@babel/plugin-transform-runtime', {
-      corejs: 3,
-      helpers: true,
-      useESModules: true,
-      version: "^7.9.6",
-      regenerator: false
-    }]
-  ]
-})
+const getBabelConfig = (targets) =>
+  babel({
+    include: ['src/**', 'spec/**/*'],
+    babelHelpers: 'runtime',
+    babelrc: false,
+    presets: [
+      [
+        '@babel/preset-env',
+        {
+          modules: false,
+          targets: targets || pkg.browserslist,
+          // useBuildins and plugin-transform-runtime are mutually exclusive
+          // https://github.com/babel/babel/issues/10271#issuecomment-528379505
+          // use babel-polyfills when released
+          useBuiltIns: false,
+          // corejs: 3,
+          bugfixes: true
+        }
+      ]
+    ],
+    plugins: [
+      [
+        '@babel/plugin-transform-runtime',
+        {
+          corejs: 3,
+          helpers: true,
+          useESModules: true,
+          version: '^7.9.6',
+          regenerator: false
+        }
+      ]
+    ]
+  })
 
 export default {
-  input: [
-    'spec/setupBrowser.js',
-    'spec/spec/*/*.js'
-  ],
+  input: ['spec/setupBrowser.js', 'spec/spec/*/*.js'],
   output: {
     file: 'spec/es5TestBundle.js',
     name: 'SVGTests',
-    format: 'iife',
+    format: 'iife'
   },
   plugins: [
     resolve({ browser: true }),
index 0eb0613a3b96827323c03d90803e3ab709b2fdd2..210975eef9fb894399e2c1354ab4c4410f3f21e4 100644 (file)
@@ -1,85 +1,23 @@
 {
-       "extends": "standard",
-       "plugins": [ "sort-class-members" ],
-       "rules": {
-               "operator-linebreak": [ "error", "before" ],
-               "object-curly-spacing": [ "error", "always" ],
-               "array-bracket-spacing": [ "error", "always" ],
-               "indent": [ "error", 2,         { "flatTernaryExpressions": true } ],
-               "padded-blocks": "off",
-               "sort-class-members/sort-class-members": [ 2, {
-      "order": [
-        "[static-properties]",
-        "[properties]",
-        "[conventional-private-properties]",
-        "constructor",
-        "[static-methods]",
-        "[methods]",
-        "[conventional-private-methods]",
-        "[accessor-pairs]",
-        "[getters]",
-        "[setters]",
-        "[everything-else]"
-      ],
-      "groups": {
-        "constructor": [{
-          "name": "constructor",
-          "type": "method",
-          "sort": "alphabetical"
-        }],
-        "properties": [{
-          "type": "property",
-          "sort": "alphabetical"
-        }],
-        "getters": [{
-          "kind": "get",
-          "sort": "alphabetical"
-        }],
-        "setters": [{
-          "kind": "set",
-          "sort": "alphabetical"
-        }],
-        "accessor-pairs": [{
-          "accessorPair": true,
-          "sort": "alphabetical"
-        }],
-        "static-properties": [{
-          "type": "property",
-          "static": true,
-          "sort": "alphabetical"
-        }],
-        "conventional-private-properties": [{
-          "type": "property",
-          "name": "/_.+/",
-          "sort": "alphabetical"
-        }],
-        "arrow-function-properties": [{
-          "propertyType": "ArrowFunctionExpression",
-          "sort": "alphabetical"
-        }],
-        "methods": [{
-          "type": "method",
-          "sort": "alphabetical"
-        }],
-        "static-methods": [{
-          "type": "method",
-          "static": true,
-          "sort": "alphabetical"
-        }],
-        "async-methods": [{
-          "type": "method",
-          "async": true,
-          "sort": "alphabetical"
-        }],
-        "conventional-private-methods": [{
-          "type": "method",
-          "name": "/_.+/",
-          "sort": "alphabetical"
-        }],
-        "everything-else": [{
-          "sort": "alphabetical"
-        }]
+  "parserOptions": {
+    "ecmaVersion": "latest",
+    "sourceType": "module"
+  },
+  "env": {
+    "browser": true,
+    "es6": true
+  },
+  "extends": ["eslint:recommended", "prettier"],
+  "rules": {
+    "padded-blocks": "off",
+    "no-unused-vars": [
+      "error",
+      {
+        "vars": "all",
+        "args": "after-used",
+        "ignoreRestSiblings": true,
+        "varsIgnorePattern": "^_"
       }
-    }]
-       }
-}
\ No newline at end of file
+    ]
+  }
+}
index fe6d43132774b801bfedfd7f7e3c5f95c5348a76..ac96ca86e703e3f6a5cb610694ab0b85ebccc728 100644 (file)
@@ -1,9 +1,7 @@
-
 # Contributing
 
 When contributing to this repository, please first discuss the change you wish to make on gitter, or with an issue to increase your chances of getting your pull request merged into the main code base.
 
-
 ## Pull Request Process
 
 When you want to make contributions to the project, the process is pretty simple:
@@ -12,15 +10,13 @@ When you want to make contributions to the project, the process is pretty simple
 2. Fork the repository to make your own local copy
 3. Make a branch in the format of <issue-number>-<friendly-name>. So for example if I made an issue to change the default color, and it was issue 385 (random) on the repo, the branch would be called `385-change-default-color`
 4. Make the changes to the src and perhaps make a playground by duplicating the playgrounds we already have.
-    - Build the code during the development process with `npm run build:dev` so that we don't throw a huge number of pointless errors
-    - When you're done making changes, run `npm run build` to build the code and run the linter
-5. If applicable - please write new tests, we like to keep our code well tested 🎉. Run the tests by either opening the SpecRunner.html file or just run `npm test`, either is fine.
+   - When you're done making changes, run `npm run build` to build the code and run the linter
+5. If applicable - please write new tests, we like to keep our code well tesvted 🎉. Run the tests by running `npm test`
 6. Push the code and make a pull request on the main svg.js repo
 7. Enjoy our endless love and gratitude ❤️
 
 Seriously, we love pull requests! So go wild!
 
-
 ## Code of Conduct
 
 We only have a few simple rules, because we know you wouldn't want to read a whole code of conduct guide now would you? 🤡
index 77280cbd81cebedaf77a4b98c697d9bc78ecd814..21ab143de9fba49a8bc9982aadf4135cbc21825a 100644 (file)
@@ -1,7 +1,6 @@
 ---
 name: Bug Report
 about: 🐞 Report a bug that you found
-
 ---
 
 # Bug report
index acaaef525dcb1c5be255256896d242d7e7c43d85..9cf9d7bb298745b17488b1c80369cba953ca4305 100644 (file)
@@ -1,15 +1,14 @@
 ---
 name: Feature Request
 about: 🎂 Ask nicely for something you reaaaaaaaally want
-
 ---
 
-
 # Feature request
 
 > **For support questions, please use [stackoverflow](https://stackoverflow.com/questions/tagged/svg.js) with the tag svg.js or head to our chat over at [gitter](https://gitter.im/svgdotjs/svg.js)**.
 
 If you want to make a feature request, here are some guidelines to make a good one:
+
 - Add example code and usage for feature requests to see how a user would use it
 - Tell us the benefits (everything is allowed)
 - Make a simple use case like the one below. Obviously your feature request shouldn't be so silly. But make it clear to the maintainers what you want added and how you plan to use it 😃
@@ -19,13 +18,14 @@ If you want to make a feature request, here are some guidelines to make a good o
 It would be cool if SVG.js could be used to easily draw smiley the meme, it would make my life so much easier when I want to have memes in my svg.
 
 ### Benefits
+
 - Drawing memes would be quick and easy
 - Memes are funny
 
 I think the syntax to achieve this should be:
 
 ```js
-let meme = draw.meme({radius: 300, cx: 50, cy: 80, lookAt: [30, 50]})
+let meme = draw.meme({ radius: 300, cx: 50, cy: 80, lookAt: [30, 50] })
 ```
 
 Then the user could easily change where the smiley is looking with:
index 75287e6d6a82c9a0a40caa46fa7ca8250b2acac9..b3769d0f44da65b875779b3f5f08632bb7aad858 100644 (file)
@@ -1,7 +1,6 @@
 ---
 name: Other Issue
 about: 🍺 Something else...
-
 ---
 
 > **For support questions, please use [stackoverflow](https://stackoverflow.com/questions/tagged/svg.js) with the tag svg.js or head to our chat over at [gitter](https://gitter.im/svgdotjs/svg.js), if you have a bug report or feature request, use those templates**.
diff --git a/.prettierignore b/.prettierignore
new file mode 100644 (file)
index 0000000..f960e69
--- /dev/null
@@ -0,0 +1,11 @@
+.DS_Store
+.idea
+.importjs.js
+test/
+node_modules/
+.vscode/
+coverage/
+spec/es5TestBundle.js
+.env
+dist
+package-lock.json
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644 (file)
index 0000000..c50384f
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "trailingComma": "none",
+  "tabWidth": 2,
+  "semi": false,
+  "singleQuote": true
+}
index 8ea60c891684a9719793c8c56a1383eb6fabdfac..770ac06bfeb6a8eb19e1af7013557bc44b8fe602 100644 (file)
@@ -1,14 +1,14 @@
 language: node_js
 node_js:
-  - "stable"
+  - 'stable'
 services:
   - xvfb
 addons:
-    firefox: latest
-    chrome: stable
+  firefox: latest
+  chrome: stable
 install:
   - npm install
   - npm run build
 script:
   - npm test
-  - cat coverage/firefox/lcov.info | node_modules/.bin/coveralls
\ No newline at end of file
+  - cat coverage/firefox/lcov.info | node_modules/.bin/coveralls
index 3b975695db92d215d71dc80d4a8cf3a9efde083b..e02fcd1039454d8fc7695503674fd76ad8bdb918 100644 (file)
--- a/README.md
+++ b/README.md
@@ -7,9 +7,7 @@
 [![Join the chat at https://gitter.im/svgdotjs/svg.js](https://badges.gitter.im/svgdotjs/svg.js.svg)](https://gitter.im/svgdotjs/svg.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 [![Twitter](https://img.shields.io/badge/Twitter-@svg__js-green.svg)](https://twitter.com/svg_js)
 
-
-
-__A lightweight library for manipulating and animating SVG, without any dependencies.__
+**A lightweight library for manipulating and animating SVG, without any dependencies.**
 
 SVG.js is licensed under the terms of the MIT License.
 
@@ -30,6 +28,7 @@ SVG.js is licensed under the terms of the MIT License.
 [https://unpkg.com/@svgdotjs/svg.js](https://unpkg.com/@svgdotjs/svg.js)
 
 ## Documentation
+
 Check [svgjs.dev](https://svgjs.dev/docs/3.0/) to learn more.
 
 [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=ulima.ums%40googlemail.com&lc=US&item_name=SVG.JS&currency_code=EUR&bn=PP-DonationsBF%3Abtn_donate_74x21.png%3ANonHostedGuest) or [![Sponsor](https://img.shields.io/badge/Sponsor-svg.js-green.svg)](https://github.com/sponsors/Fuzzyma)
index fbd4e24522d7a90699396e52d5da349acd15d5de..c1587c62e413072f4e13981603a2823c66053b84 100644 (file)
@@ -1,55 +1,63 @@
 <!DOCTYPE html>
 <html>
-<head>
-  <title>SVG.js benchmarker</title>
-  <style>
-    @import url('https://fonts.googleapis.com/css?family=Inconsolata');
-    body {
-      font-family: 'Inconsolata', 'Menlo', monospace;
-      font-weight: 300;
-      color: #999;
-      font-size: 14px;
-    }
-    svg {
-      width: 2px;
-      height: 2px;
-      overflow: hidden;
-      position: fixed;
-      right: 0;
-    }
-    span.name {
-      color: #B7CD3E;
-    }
-    span.ms {
-      color: #FF0066;
-    }
-    h1 {
-      font-size: 1.2em;
-    }
-    .test {
-      text-indent: 1em;
-    }
-    .skipped {
-      color: #FBCB72;
-    }
-  </style>
-</head>
-<body>
-  <div id="draw"></div>
-  <svg id="native" width="100" height="100" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs"></svg>
-  <script src="../dist/svg.js"></script>
-  <script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js"></script>
-  <script src="svg.bench.js"></script>
-  <!--<script src="tests/10000-each.js"></script> -->
-  <script src="tests/10000-rects.js"></script>
-  <!-- <script src="tests/10000-circles.js"></script>
+  <head>
+    <title>SVG.js benchmarker</title>
+    <style>
+      @import url('https://fonts.googleapis.com/css?family=Inconsolata');
+      body {
+        font-family: 'Inconsolata', 'Menlo', monospace;
+        font-weight: 300;
+        color: #999;
+        font-size: 14px;
+      }
+      svg {
+        width: 2px;
+        height: 2px;
+        overflow: hidden;
+        position: fixed;
+        right: 0;
+      }
+      span.name {
+        color: #b7cd3e;
+      }
+      span.ms {
+        color: #ff0066;
+      }
+      h1 {
+        font-size: 1.2em;
+      }
+      .test {
+        text-indent: 1em;
+      }
+      .skipped {
+        color: #fbcb72;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="draw"></div>
+    <svg
+      id="native"
+      width="100"
+      height="100"
+      xmlns="http://www.w3.org/2000/svg"
+      version="1.1"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      xmlns:svgjs="http://svgjs.dev/svgjs"
+    ></svg>
+    <script src="../dist/svg.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js"></script>
+    <script src="svg.bench.js"></script>
+    <!--<script src="tests/10000-each.js"></script> -->
+    <script src="tests/10000-rects.js"></script>
+    <!-- <script src="tests/10000-circles.js"></script>
   <script src="tests/10000-paths.js"></script>
   <script src="tests/10000-boxes.js"></script>
   <script src="tests/10000-pointArray-bbox.js"></script>
   <script src="tests/10000-accesses.js"></script>
   <script src="tests/10000-transform.js"></script> -->
-  <script>
-    SVG.bench.run()
-  </script>
-</body>
+    <script>
+      SVG.bench.run()
+    </script>
+  </body>
 </html>
index 50ef547b75ccba74b0bc31423c2f7175d23a4014..bec92a5831f5d174663f930f553bd69dab1a5d1e 100644 (file)
@@ -23,9 +23,9 @@
     // Add test
     test: function (name, run) {
       // run test
-      var start = (new Date()).getTime()
+      var start = new Date().getTime()
       run()
-      this.write(name, (new Date()).getTime() - start)
+      this.write(name, new Date().getTime() - start)
 
       // clear everything
       this.clear()
 
       if (typeof ms === 'number') {
         test.className = 'test'
-        test.innerHTML = '<span class="name">' + name + '</span> completed in <span class="ms">' + ms + 'ms</span>'
+        test.innerHTML =
+          '<span class="name">' +
+          name +
+          '</span> completed in <span class="ms">' +
+          ms +
+          'ms</span>'
       } else {
         test.className = 'test skipped'
         test.innerHTML = name + ' (skipped)'
index 867dfaae1e930d0573607224bebf1c9a10a7900a..ed149e158e411a733333fd3798d2d3daa207f7a8 100644 (file)
@@ -1,35 +1,37 @@
+SVG.bench.describe(
+  'Access a dom attributes vs dom properties vs object properties',
+  function (bench) {
+    bench.test('using an object', function () {
+      var sum = 0
+      var obj = { x: '30' }
+      for (var i = 0; i < 1000000; i++) {
+        sum += obj.x * i
+      }
+      console.log(sum)
+    })
 
-SVG.bench.describe('Access a dom attributes vs dom properties vs object properties', function(bench) {
-  bench.test('using an object', function() {
-    var sum = 0
-    var obj = {x: "30"}
-    for (var i = 0; i < 1000000; i++) {
-      sum += obj.x * i
-    }
-    console.log(sum)
-  })
+    bench.test('figure out what the overhead is', function () {
+      var obj = bench.draw.rect(100, 100).move(0, 0)
+    })
 
-  bench.test('figure out what the overhead is', function () {
-    var obj = bench.draw.rect(100, 100).move(0, 0)
-  })
+    bench.test('using dom attributes', function () {
+      var sum = 0
+      var obj = bench.draw.rect(100, 100).move(0, 0)
+      var node = obj.node
+      for (var i = 0; i < 1000000; i++) {
+        sum += node.getAttribute('x') * i
+      }
+      console.log(sum, node.getAttribute('x'))
+    })
 
-  bench.test('using dom attributes', function () {
-    var sum = 0
-    var obj = bench.draw.rect(100, 100).move(0, 0)
-    var node = obj.node
-    for (var i = 0; i < 1000000; i++) {
-      sum += node.getAttribute('x') * i
-    }
-    console.log(sum, node.getAttribute('x'))
-  })
-
-  bench.test('using dom properties', function () {
-    var sum = 0
-    var obj = bench.draw.rect(100, 100).move(0, 0)
-    var node = obj.node
-    for (var i = 0; i < 1000000; i++) {
-      sum += node.x.baseVal * i
-    }
-    console.log(sum, node.x)
-  })
-})
+    bench.test('using dom properties', function () {
+      var sum = 0
+      var obj = bench.draw.rect(100, 100).move(0, 0)
+      var node = obj.node
+      for (var i = 0; i < 1000000; i++) {
+        sum += node.x.baseVal * i
+      }
+      console.log(sum, node.x)
+    })
+  }
+)
index 0466f64b02211aece3d7ebd23d7be9da38291b22..e20693b5d2c18bcd9cb5f09150dff3e259f8f007 100644 (file)
@@ -1,9 +1,8 @@
-SVG.bench.describe('Generate 100000 bbox', function(bench) {
-  var rect = bench.draw.rect(100,100)
-  
-  bench.test('using SVG.js v3.0.0', function() {
-    for (var i = 0; i < 100000; i++)
-      rect.bbox()
+SVG.bench.describe('Generate 100000 bbox', function (bench) {
+  var rect = bench.draw.rect(100, 100)
+
+  bench.test('using SVG.js v3.0.0', function () {
+    for (var i = 0; i < 100000; i++) rect.bbox()
   })
   //bench.test('using vanilla js', function() {
   //  var node = rect.node
@@ -17,12 +16,11 @@ SVG.bench.describe('Generate 100000 bbox', function(bench) {
   //})
 })
 
-SVG.bench.describe('Generate 100000 rbox', function(bench) {
-  var rect = bench.draw.rect(100,100)
-  
-  bench.test('using SVG.js v3.0.0', function() {
-    for (var i = 0; i < 100000; i++)
-      rect.bbox()
+SVG.bench.describe('Generate 100000 rbox', function (bench) {
+  var rect = bench.draw.rect(100, 100)
+
+  bench.test('using SVG.js v3.0.0', function () {
+    for (var i = 0; i < 100000; i++) rect.bbox()
   })
   //bench.test('using vanilla js', function() {
   //  var node = rect.node
@@ -35,12 +33,11 @@ SVG.bench.describe('Generate 100000 rbox', function(bench) {
   //    bench.snap.rect(50, 50, 100, 100)
   //})
 })
-SVG.bench.describe('Generate 100000 viewbox', function(bench) {
+SVG.bench.describe('Generate 100000 viewbox', function (bench) {
   var nested = bench.draw.nested().viewbox(10, 10, 100, 100)
-  
-  bench.test('using SVG.js v3.0.0', function() {
-    for (var i = 0; i < 100000; i++)
-      nested.viewbox()
+
+  bench.test('using SVG.js v3.0.0', function () {
+    for (var i = 0; i < 100000; i++) nested.viewbox()
   })
   //bench.test('using vanilla js', function() {
   //  var node = rect.node
index f090281a2854b900c466bdbaec6505688cc300cf..fcfbf9a1ef90d851c35ccdc911c2371596fa33b6 100644 (file)
@@ -1,9 +1,8 @@
-SVG.bench.describe('Generate 10000 circles', function(bench) {
-  bench.test('using SVG.js v2.5.3', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.circle(100,100)
+SVG.bench.describe('Generate 10000 circles', function (bench) {
+  bench.test('using SVG.js v2.5.3', function () {
+    for (var i = 0; i < 10000; i++) bench.draw.circle(100, 100)
   })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var circle = document.createElementNS(SVG.ns, 'circle')
       circle.setAttributeNS(null, 'rx', 50)
@@ -11,18 +10,16 @@ SVG.bench.describe('Generate 10000 circles', function(bench) {
       bench.raw.appendChild(circle)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.snap.circle(50, 50, 100, 100)
+  bench.test('using Snap.svg v0.5.1', function () {
+    for (var i = 0; i < 10000; i++) bench.snap.circle(50, 50, 100, 100)
   })
 })
 
-SVG.bench.describe('Generate 10000 circles with fill', function(bench) {
-  bench.test('using SVG.js v2.5.3', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.circle(100,100).fill('#f06')
+SVG.bench.describe('Generate 10000 circles with fill', function (bench) {
+  bench.test('using SVG.js v2.5.3', function () {
+    for (var i = 0; i < 10000; i++) bench.draw.circle(100, 100).fill('#f06')
   })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var circle = document.createElementNS(SVG.ns, 'circle')
       circle.setAttributeNS(null, 'rx', 50)
@@ -31,8 +28,8 @@ SVG.bench.describe('Generate 10000 circles with fill', function(bench) {
       bench.raw.appendChild(circle)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
+  bench.test('using Snap.svg v0.5.1', function () {
     for (var i = 0; i < 10000; i++)
       bench.snap.circle(50, 50, 100, 100).attr('fill', '#f06')
   })
-})
\ No newline at end of file
+})
index c47eb60f0fcfbe9695abb327961965d7c2a7db40..e8170944caa6568196fb9f409bf5907fd7f6b974 100644 (file)
@@ -1,27 +1,24 @@
-SVG.bench.describe('each() vs forEach()', function(bench) {
+SVG.bench.describe('each() vs forEach()', function (bench) {
   // preparation
   var list = []
 
-  for (var i = 99; i >= 0; i--)
-    list.push(bench.draw.rect(100, 50))
+  for (var i = 99; i >= 0; i--) list.push(bench.draw.rect(100, 50))
 
   var set = new SVG.Set(list)
 
-
-  bench.test('10000 x each()', function() {
+  bench.test('10000 x each()', function () {
     for (var i = 0; i < 10000; i++) {
-      set.each(function() {
+      set.each(function () {
         this.fill('#f06')
       })
     }
   })
 
-  bench.test('10000 x forEach()', function() {
+  bench.test('10000 x forEach()', function () {
     for (var i = 0; i < 10000; i++) {
-      list.forEach(function(e) {
+      list.forEach(function (e) {
         e.fill('#f06')
       })
     }
   })
-
-})
\ No newline at end of file
+})
index 48ca11122350c15903fd543559513638e0ceeb30..42640736ee4ab18fdba16add8000b32723076d71 100644 (file)
@@ -1,7 +1,9 @@
-SVG.bench.describe('Generate 10000 pathArrays bbox', function(bench) {
-  var data = 'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z'
+SVG.bench.describe('Generate 10000 pathArrays bbox', function (bench) {
+  var data =
+    'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z'
 
-  var data2 = 'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z '
+  var data2 =
+    'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z '
 
   var data3 = 'M10 10-45-30.5.5 .89L2e-2.5.5.5-.5C.5.5.5.5.5.5L-3-4z'
 
@@ -9,51 +11,54 @@ SVG.bench.describe('Generate 10000 pathArrays bbox', function(bench) {
   var path = SVG.create('path')
   path.style.visibility = 'hidden'
 
-  bench.test('using SVG.js v3.0.0', function() {
+  bench.test('using SVG.js v3.0.0', function () {
     for (var i = 0; i < 10000; i++) {
       SVG.parser.path.setAttribute('d', data)
       SVG.parser.path.getBBox()
     }
   })
 
-  bench.test('using SVG.js v3.0.0 more data', function() {
+  bench.test('using SVG.js v3.0.0 more data', function () {
     for (var i = 0; i < 10000; i++) {
       SVG.parser.path.setAttribute('d', data2)
       SVG.parser.path.getBBox()
     }
   })
 
-  bench.test('using SVG.js v3.0.0 complicated data', function() {
+  bench.test('using SVG.js v3.0.0 complicated data', function () {
     for (var i = 0; i < 10000; i++) {
       SVG.parser.path.setAttribute('d', data3)
       SVG.parser.path.getBBox()
     }
   })
 
-  bench.test('using SVG.js v3.0.0 without parser', function() {
+  bench.test('using SVG.js v3.0.0 without parser', function () {
     for (var i = 0; i < 10000; i++) {
       path.setAttribute('d', data)
       draw.node.appendChild(path)
       path.getBBox()
     }
-      //new SVG.Path().attr('d', data).addTo(draw).bbox()
+    //new SVG.Path().attr('d', data).addTo(draw).bbox()
   })
 
-  bench.test('using SVG.js v3.0.0 more data without parser', function() {
+  bench.test('using SVG.js v3.0.0 more data without parser', function () {
     for (var i = 0; i < 10000; i++) {
       path.setAttribute('d', data2)
       draw.node.appendChild(path)
       path.getBBox()
     }
-      //new SVG.Path().attr('d', data2).addTo(draw).bbox()
+    //new SVG.Path().attr('d', data2).addTo(draw).bbox()
   })
 
-  bench.test('using SVG.js v3.0.0 complicated data without parser', function() {
-    for (var i = 0; i < 10000; i++) {
-      path.setAttribute('d', data3)
-      draw.node.appendChild(path)
-      path.getBBox()
-    }
+  bench.test(
+    'using SVG.js v3.0.0 complicated data without parser',
+    function () {
+      for (var i = 0; i < 10000; i++) {
+        path.setAttribute('d', data3)
+        draw.node.appendChild(path)
+        path.getBBox()
+      }
       //new SVG.Path().attr('d', data3).addTo(draw).bbox()
-  })
-})
\ No newline at end of file
+    }
+  )
+})
index a4c0fdc3ae91bdeae23d9d0e14fcdc902ea8526c..72bd74f2eeed6bc0d94fddfb325a744bbe9272e5 100644 (file)
@@ -1,22 +1,21 @@
-SVG.bench.describe('Generate 10000 pathArrays', function(bench) {
-  var data = 'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z'
-  
-  var data2 = 'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z '
+SVG.bench.describe('Generate 10000 pathArrays', function (bench) {
+  var data =
+    'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z'
+
+  var data2 =
+    'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z '
 
   var data3 = 'M10 10-45-30.5.5 .89L2e-2.5.5.5-.5C.5.5.5.5.5.5L-3-4z'
-  
-  bench.test('using SVG.js v2.5.3', function() {
-    for (var i = 0; i < 10000; i++)
-      new SVG.PathArray(data)
+
+  bench.test('using SVG.js v2.5.3', function () {
+    for (var i = 0; i < 10000; i++) new SVG.PathArray(data)
   })
-  
-  bench.test('using SVG.js v2.5.3 more data', function() {
-    for (var i = 0; i < 10000; i++)
-      new SVG.PathArray(data2)
+
+  bench.test('using SVG.js v2.5.3 more data', function () {
+    for (var i = 0; i < 10000; i++) new SVG.PathArray(data2)
   })
-  
-  bench.test('using SVG.js v2.5.3 complicated data', function() {
-    for (var i = 0; i < 10000; i++)
-      new SVG.PathArray(data3)
+
+  bench.test('using SVG.js v2.5.3 complicated data', function () {
+    for (var i = 0; i < 10000; i++) new SVG.PathArray(data3)
   })
-})
\ No newline at end of file
+})
index cdf1d22157b389f11923e2e2a16f734ad60aeb00..2e96c5f26b0602a05e913214c43d98a9ed6d3674 100644 (file)
@@ -1,19 +1,18 @@
-SVG.bench.describe('Generate 10000 paths', function(bench) {
-  var data = 'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+SVG.bench.describe('Generate 10000 paths', function (bench) {
+  var data =
+    'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
 
-  bench.test('using SVG.js v2.5.3', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.path(data)
+  bench.test('using SVG.js v2.5.3', function () {
+    for (var i = 0; i < 10000; i++) bench.draw.path(data)
   })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var path = document.createElementNS(SVG.ns, 'path')
       path.setAttributeNS(null, 'd', data)
       bench.raw.appendChild(path)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.snap.path(data)
+  bench.test('using Snap.svg v0.5.1', function () {
+    for (var i = 0; i < 10000; i++) bench.snap.path(data)
   })
-})
\ No newline at end of file
+})
index 32bc21adabe5aeaa476cbc215a20dd2a8498d7b0..8c9c42ce101daef0a9b55934b66571cdc098073b 100644 (file)
@@ -1,29 +1,52 @@
-SVG.bench.describe('Generate 10000 pathArrays bbox', function(bench) {
-  var data = '209,153 389,107 547,188 482,289 374,287 91,254 407,243 391,185 166,226 71,177 65,52 234,50 107,136 163,199 158,131 323,45 218,145 305,190 374,143 174,216 296,241'
+SVG.bench.describe('Generate 10000 pathArrays bbox', function (bench) {
+  var data =
+    '209,153 389,107 547,188 482,289 374,287 91,254 407,243 391,185 166,226 71,177 65,52 234,50 107,136 163,199 158,131 323,45 218,145 305,190 374,143 174,216 296,241'
 
-  var dataArr = [[209,153],[389,107],[547,188],[482,289],[374,287],[91,254],[407,243],[391,185],[166,226],[71,177],[65,52],[234,50],[107,136],[163,199],[158,131],[323,45],[218,145],[305,190],[374,143],[174,216],[296,241]]
+  var dataArr = [
+    [209, 153],
+    [389, 107],
+    [547, 188],
+    [482, 289],
+    [374, 287],
+    [91, 254],
+    [407, 243],
+    [391, 185],
+    [166, 226],
+    [71, 177],
+    [65, 52],
+    [234, 50],
+    [107, 136],
+    [163, 199],
+    [158, 131],
+    [323, 45],
+    [218, 145],
+    [305, 190],
+    [374, 143],
+    [174, 216],
+    [296, 241]
+  ]
 
-
-  bench.test('using SVG.js v3.0.0', function() {
+  bench.test('using SVG.js v3.0.0', function () {
     for (var i = 0; i < 10000; i++) {
       SVG.parser.poly.setAttribute('points', data)
       SVG.parser.poly.getBBox()
     }
   })
-  
 
-  bench.test('using SVG.js v3.0.0 without parser', function() {
+  bench.test('using SVG.js v3.0.0 without parser', function () {
     for (var i = 0; i < 10000; i++) {
-      var maxX = -Infinity, maxY = -Infinity, minX = Infinity, minY = Infinity
-      dataArr.forEach(function(el) {
+      var maxX = -Infinity,
+        maxY = -Infinity,
+        minX = Infinity,
+        minY = Infinity
+      dataArr.forEach(function (el) {
         maxX = Math.max(el[0], maxX)
         maxY = Math.max(el[1], maxY)
         minX = Math.min(el[0], minX)
         minY = Math.min(el[1], minY)
       })
-      var a = {x: minX, y: minY, width: maxX-minX, height: maxY-minY}
+      var a = { x: minX, y: minY, width: maxX - minX, height: maxY - minY }
     }
-      //new SVG.Path().attr('d', data).addTo(draw).bbox()
+    //new SVG.Path().attr('d', data).addTo(draw).bbox()
   })
-
-})
\ No newline at end of file
+})
index e01eb9550045fd3a86efb4bc1cf7ee66704badc6..884e3a5377808bdbdd48ad6dfc914c689c045e44 100644 (file)
@@ -1,80 +1,77 @@
-SVG.bench.describe('Generate 10000 rects', function(bench) {
-  bench.test('using SVG.js v3.0.6', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.rect(100,100)
-  })
-  bench.test('using vanilla js', function() {
-    for (var i = 0; i < 10000; i++) {
-      var rect = document.createElementNS(SVG.ns, 'rect')
-      rect.setAttributeNS(null, 'height', 100)
-      rect.setAttributeNS(null, 'width', 100)
-      bench.raw.appendChild(rect)
-    }
-  })
-  bench.test('using Snap.svg v0.5.1', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.snap.rect(50, 50, 100, 100)
+SVG.bench.describe('Generate 10000 rects', function (bench) {
+  bench.test('using SVG.js v3.0.6', function () {
+    for (var i = 0; i < 10000; i++) bench.draw.rect(100, 100)
   })
-})
-
-
-SVG.bench.describe('Generate 10000 rects with fill', function(bench) {
-  bench.test('using SVG.js v3.0.6', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.rect(100,100).fill('#f06')
-  })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var rect = document.createElementNS(SVG.ns, 'rect')
       rect.setAttributeNS(null, 'height', 100)
       rect.setAttributeNS(null, 'width', 100)
-      rect.setAttributeNS(null, 'fill', '#f06')
       bench.raw.appendChild(rect)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.snap.rect(50, 50, 100, 100).attr('fill', '#f06')
+  bench.test('using Snap.svg v0.5.1', function () {
+    for (var i = 0; i < 10000; i++) bench.snap.rect(50, 50, 100, 100)
   })
 })
 
-
-SVG.bench.describe('Generate 10000 rects with position and fill', function(bench) {
-  bench.test('using SVG.js v3.0.6', function() {
-    for (var i = 0; i < 10000; i++)
-      bench.draw.rect(100,100).move(50,50).fill('#f06')
+SVG.bench.describe('Generate 10000 rects with fill', function (bench) {
+  bench.test('using SVG.js v3.0.6', function () {
+    for (var i = 0; i < 10000; i++) bench.draw.rect(100, 100).fill('#f06')
   })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var rect = document.createElementNS(SVG.ns, 'rect')
       rect.setAttributeNS(null, 'height', 100)
       rect.setAttributeNS(null, 'width', 100)
       rect.setAttributeNS(null, 'fill', '#f06')
-      rect.setAttributeNS(null, 'x', 50)
-      rect.setAttributeNS(null, 'y', 50)
       bench.raw.appendChild(rect)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
+  bench.test('using Snap.svg v0.5.1', function () {
     for (var i = 0; i < 10000; i++)
       bench.snap.rect(50, 50, 100, 100).attr('fill', '#f06')
   })
 })
 
+SVG.bench.describe(
+  'Generate 10000 rects with position and fill',
+  function (bench) {
+    bench.test('using SVG.js v3.0.6', function () {
+      for (var i = 0; i < 10000; i++)
+        bench.draw.rect(100, 100).move(50, 50).fill('#f06')
+    })
+    bench.test('using vanilla js', function () {
+      for (var i = 0; i < 10000; i++) {
+        var rect = document.createElementNS(SVG.ns, 'rect')
+        rect.setAttributeNS(null, 'height', 100)
+        rect.setAttributeNS(null, 'width', 100)
+        rect.setAttributeNS(null, 'fill', '#f06')
+        rect.setAttributeNS(null, 'x', 50)
+        rect.setAttributeNS(null, 'y', 50)
+        bench.raw.appendChild(rect)
+      }
+    })
+    bench.test('using Snap.svg v0.5.1', function () {
+      for (var i = 0; i < 10000; i++)
+        bench.snap.rect(50, 50, 100, 100).attr('fill', '#f06')
+    })
+  }
+)
 
-SVG.bench.describe('Generate 10000 rects with gradient fill', function(bench) {
-  bench.test('using SVG.js v3.0.6', function() {
+SVG.bench.describe('Generate 10000 rects with gradient fill', function (bench) {
+  bench.test('using SVG.js v3.0.6', function () {
     for (var i = 0; i < 10000; i++) {
-      var g = bench.draw.gradient('linear', function(add) {
+      var g = bench.draw.gradient('linear', function (add) {
         add.stop(0, '#000')
         add.stop(0.25, '#f00')
         add.stop(1, '#fff')
       })
 
-      bench.draw.rect(100,100).fill(g)
+      bench.draw.rect(100, 100).fill(g)
     }
   })
-  bench.test('using vanilla js', function() {
+  bench.test('using vanilla js', function () {
     for (var i = 0; i < 10000; i++) {
       var g = document.createElementNS(SVG.ns, 'linearGradient')
       var stop = document.createElementNS(SVG.ns, 'stop')
@@ -98,9 +95,9 @@ SVG.bench.describe('Generate 10000 rects with gradient fill', function(bench) {
       bench.raw.appendChild(rect)
     }
   })
-  bench.test('using Snap.svg v0.5.1', function() {
+  bench.test('using Snap.svg v0.5.1', function () {
     for (var i = 0; i < 10000; i++) {
-      var g = bench.snap.gradient("L(0, 0, 100, 100)#000-#f00:25%-#fff")
+      var g = bench.snap.gradient('L(0, 0, 100, 100)#000-#f00:25%-#fff')
 
       bench.snap.rect(50, 50, 100, 100).attr({
         fill: g
index 9a023083b9b6a31832c3bb9e3838ad8da4b38afd..cb0df7716b94d76ddd7fd72540d81bcdeaca7c58 100644 (file)
@@ -1,21 +1,21 @@
-SVG.bench.describe('Change textContent 10000 times', function(bench) {
-  var data = 'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+SVG.bench.describe('Change textContent 10000 times', function (bench) {
+  var data =
+    'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
 
   var node = bench.draw.plain('').node
 
-
-  bench.test('using appendChild', function() {
+  bench.test('using appendChild', function () {
     for (var i = 0; i < 1000000; i++) {
       while (node.hasChildNodes()) {
         node.removeChild(node.lastChild)
       }
 
-      node.appendChild(document.createTextNode('test'+i))
+      node.appendChild(document.createTextNode('test' + i))
     }
   })
-  bench.test('using textContent', function() {
+  bench.test('using textContent', function () {
     for (var i = 0; i < 1000000; i++) {
-      node.textContent = 'test'+i
+      node.textContent = 'test' + i
     }
   })
 })
index 0fcc16251fa107ac7077746ba3adfb98d01c232f..9e22d0961ea7deb7184134e2829bbc62142f5a14 100644 (file)
@@ -1,4 +1,4 @@
-SVG.bench.describe('Transform 1000000 rects', function(bench) {
+SVG.bench.describe('Transform 1000000 rects', function (bench) {
   let parameters = {
     translate: [20, 30],
     origin: [100, 100],
@@ -6,27 +6,24 @@ SVG.bench.describe('Transform 1000000 rects', function(bench) {
     skew: [10, 30],
     scale: 0.5
   }
-  
-  let matrixLike = {a:2, b:3, c:1, d:2, e:49, f:100}
+
+  let matrixLike = { a: 2, b: 3, c: 1, d: 2, e: 49, f: 100 }
   let matrix = new SVG.Matrix(matrixLike)
-  
+
   let worker = new SVG.Matrix()
-  bench.test('with parameters', function() {
-    for (var i = 0; i < 1000000; i++)
-      worker.transform(parameters)
+  bench.test('with parameters', function () {
+    for (var i = 0; i < 1000000; i++) worker.transform(parameters)
   })
-  
+
   worker = new SVG.Matrix()
-  bench.test('with matrix like', function() {
+  bench.test('with matrix like', function () {
     for (var i = 0; i < 1000000; i++) {
       worker.transform(matrixLike)
     }
   })
-  
+
   worker = new SVG.Matrix()
-  bench.test('with SVG.Matrix', function() {
-    for (var i = 0; i < 1000000; i++)
-      worker.transform(matrix)
+  bench.test('with SVG.Matrix', function () {
+    for (var i = 0; i < 1000000; i++) worker.transform(matrix)
   })
 })
-
index f60930ec2abf147639e268439d8a1e6a8052e463..62fbebbf46a8938a0f295241fd05455e3deb346b 100644 (file)
@@ -9,89 +9,98 @@
       "version": "3.2.0",
       "license": "MIT",
       "devDependencies": {
-        "@babel/core": "^7.16.12",
-        "@babel/plugin-transform-runtime": "^7.16.10",
-        "@babel/preset-env": "^7.16.11",
-        "@rollup/plugin-babel": "^5.3.0",
-        "@rollup/plugin-commonjs": "^21.0.1",
-        "@rollup/plugin-multi-entry": "^4.1.0",
-        "@rollup/plugin-node-resolve": "^13.1.3",
+        "@babel/core": "^7.22.5",
+        "@babel/eslint-parser": "^7.22.5",
+        "@babel/plugin-transform-runtime": "^7.22.5",
+        "@babel/preset-env": "^7.22.5",
+        "@rollup/plugin-babel": "^6.0.3",
+        "@rollup/plugin-commonjs": "^25.0.1",
+        "@rollup/plugin-node-resolve": "^15.1.0",
+        "@rollup/plugin-terser": "^0.4.3",
         "@target/custom-event-polyfill": "github:Adobe-Marketing-Cloud/custom-event-polyfill",
-        "babel-eslint": "^10.1.0",
-        "babel-plugin-polyfill-corejs3": "^0.5.1",
-        "core-js": "^3.20.3",
+        "@types/jasmine": "^4.3.2",
+        "babel-plugin-polyfill-corejs3": "^0.8.1",
+        "core-js": "^3.31.0",
         "coveralls": "^3.1.1",
-        "eslint": "^8.7.0",
-        "eslint-config-standard": "^16.0.3",
-        "eslint-plugin-import": "^2.25.4",
-        "eslint-plugin-node": "^11.1.0",
-        "eslint-plugin-promise": "^6.0.0",
-        "eslint-plugin-sort-class-members": "^1.14.1",
-        "eslint-plugin-standard": "^5.0.0",
-        "esm": "^3.2.25",
-        "http-server": "^14.1.0",
-        "jasmine": "^4.0.2",
-        "jasmine-core": "^4.0.0",
-        "karma": "^6.3.12",
-        "karma-chrome-launcher": "^3.1.0",
-        "karma-coverage": "^2.1.0",
+        "eslint": "^8.42.0",
+        "eslint-config-prettier": "^8.8.0",
+        "eslint-config-standard": "^17.1.0",
+        "http-server": "^14.1.1",
+        "jasmine": "^5.0.1",
+        "jasmine-core": "^5.0.1",
+        "karma": "^6.4.2",
+        "karma-chrome-launcher": "^3.2.0",
+        "karma-coverage": "^2.2.0",
         "karma-firefox-launcher": "^2.1.2",
-        "karma-jasmine": "^4.0.1",
+        "karma-jasmine": "^5.1.0",
         "karma-sauce-launcher": "^4.3.6",
-        "rollup": "^2.66.1",
-        "rollup-plugin-filesize": "^9.1.2",
-        "rollup-plugin-terser": "^7.0.2",
-        "svgdom": "^0.1.10",
-        "typescript": "^4.5.5",
-        "yargs": "^17.3.1"
+        "prettier": "^2.8.8",
+        "rollup": "^3.25.1",
+        "rollup-plugin-filesize": "^10.0.0",
+        "svgdom": "^0.1.14",
+        "typescript": "^5.1.3",
+        "yargs": "^17.7.2"
       },
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/Fuzzyma"
       }
     },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/@babel/code-frame": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
-      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+      "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
       "dev": true,
       "dependencies": {
-        "@babel/highlight": "^7.16.7"
+        "@babel/highlight": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
-      "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
+      "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.16.12",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
-      "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.8",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helpers": "^7.16.7",
-        "@babel/parser": "^7.16.12",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.10",
-        "@babel/types": "^7.16.8",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
+      "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
+      "dev": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.22.5",
+        "@babel/generator": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.22.5",
+        "@babel/helper-module-transforms": "^7.22.5",
+        "@babel/helpers": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.1.2",
-        "semver": "^6.3.0",
-        "source-map": "^0.5.0"
+        "json5": "^2.2.2",
+        "semver": "^6.3.0"
       },
       "engines": {
         "node": ">=6.9.0"
         "url": "https://opencollective.com/babel"
       }
     },
+    "node_modules/@babel/eslint-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.5.tgz",
+      "integrity": "sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==",
+      "dev": true,
+      "dependencies": {
+        "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+        "eslint-visitor-keys": "^2.1.0",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": ">=7.11.0",
+        "eslint": "^7.5.0 || ^8.0.0"
+      }
+    },
+    "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@babel/generator": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
-      "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
+      "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.8",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
+        "@babel/types": "^7.22.5",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
-      "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+      "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
-      "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz",
+      "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-explode-assignable-expression": "^7.16.7",
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
-      "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
+      "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-validator-option": "^7.16.7",
-        "browserslist": "^4.17.5",
+        "@babel/compat-data": "^7.22.5",
+        "@babel/helper-validator-option": "^7.22.5",
+        "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
         "semver": "^6.3.0"
       },
       "engines": {
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.16.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz",
-      "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==",
+    "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7"
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz",
+      "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-member-expression-to-functions": "^7.22.5",
+        "@babel/helper-optimise-call-expression": "^7.22.5",
+        "@babel/helper-replace-supers": "^7.22.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.5",
+        "semver": "^6.3.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
-      "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz",
+      "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "regexpu-core": "^4.7.1"
+        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "regexpu-core": "^5.3.1",
+        "semver": "^6.3.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
-      "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz",
+      "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.13.0",
-        "@babel/helper-module-imports": "^7.12.13",
-        "@babel/helper-plugin-utils": "^7.13.0",
-        "@babel/traverse": "^7.13.0",
+        "@babel/helper-compilation-targets": "^7.17.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
         "debug": "^4.1.1",
         "lodash.debounce": "^4.0.8",
         "resolve": "^1.14.2",
       }
     },
     "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
-      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-explode-assignable-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
-      "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
       "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
-      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-get-function-arity": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-get-function-arity": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
-      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/template": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
-      "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
-      "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz",
+      "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
-      "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
-      "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
+      "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-module-imports": "^7.22.5",
+        "@babel/helper-simple-access": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.5",
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
-      "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
+      "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
-      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
-      "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz",
+      "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-wrap-function": "^7.16.8",
-        "@babel/types": "^7.16.8"
+        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-wrap-function": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
-      "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz",
+      "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-member-expression-to-functions": "^7.22.5",
+        "@babel/helper-optimise-call-expression": "^7.22.5",
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
-      "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.16.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
-      "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
+      "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.0"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
-      "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz",
+      "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.16.7"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
-      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+      "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
-      "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
-      "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz",
+      "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.8",
-        "@babel/types": "^7.16.8"
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
-      "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz",
+      "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.16.10",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
-      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+      "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.16.7",
+        "@babel/helper-validator-identifier": "^7.22.5",
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       },
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.16.12",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
-      "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
+      "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
       "dev": true,
       "bin": {
         "parser": "bin/babel-parser.js"
       }
     },
     "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
-      "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz",
+      "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz",
+      "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/plugin-transform-optional-chaining": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.13.0"
       }
     },
-    "node_modules/@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
-      "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0-placeholder-for-preset-env.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
       "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.8",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
-      },
       "engines": {
         "node": ">=6.9.0"
       },
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-class-properties": {
+    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
       "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
-      "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
+      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
+        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
         "@babel/helper-plugin-utils": "^7.16.7"
       },
       "engines": {
-        "node": ">=6.9.0"
+        "node": ">=4"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-class-static-block": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
-      "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.12.0"
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-dynamic-import": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
-      "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.12.13"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
-      "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
+    "node_modules/@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.14.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-json-strings": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
-      "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-json-strings": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
-      "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
+    "node_modules/@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.3"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
-      "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz",
+      "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-numeric-separator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
-      "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz",
+      "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
-      "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
-      "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-private-methods": {
-      "version": "7.16.11",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
-      "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.10",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
-      "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
-      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=4"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-class-properties": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.12.13"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-class-static-block": {
+    "node_modules/@babel/plugin-syntax-private-property-in-object": {
       "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
-      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
       "dev": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.14.5"
       },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz",
+      "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz",
+      "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-remap-async-to-generator": "^7.22.5",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz",
+      "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-module-imports": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-remap-async-to-generator": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz",
+      "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz",
+      "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-private-property-in-object": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
-      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz",
+      "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
+        "@babel/helper-create-class-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-top-level-await": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz",
+      "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
+        "@babel/helper-create-class-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
         "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.12.0"
       }
     },
-    "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
-      "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz",
+      "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.22.5",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-optimise-call-expression": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-replace-supers": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.5",
+        "globals": "^11.1.0"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
-      "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz",
+      "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.8"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/template": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
-      "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz",
+      "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
-      "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz",
+      "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
-      "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz",
+      "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "globals": "^11.1.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
-      "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz",
+      "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
-      "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz",
+      "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
-      "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
+    "node_modules/@babel/plugin-transform-export-namespace-from": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz",
+      "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
-      "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz",
+      "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
-      "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz",
+      "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-compilation-targets": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
-      "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
+    "node_modules/@babel/plugin-transform-json-strings": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz",
+      "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
-      "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz",
+      "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
-      "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
+    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz",
+      "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
-      "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz",
+      "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
-      "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz",
+      "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-module-transforms": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
-      "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz",
+      "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-module-transforms": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-simple-access": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
-      "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz",
+      "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-module-transforms": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
-      "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz",
+      "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-module-transforms": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
-      "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
+      "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
-      "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz",
+      "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
-      "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
+    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz",
+      "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
-      "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
+    "node_modules/@babel/plugin-transform-numeric-separator": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz",
+      "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
-      "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
+    "node_modules/@babel/plugin-transform-object-rest-spread": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz",
+      "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/compat-data": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
-      "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz",
+      "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==",
       "dev": true,
       "dependencies": {
-        "regenerator-transform": "^0.14.2"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-replace-supers": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
-      "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
+    "node_modules/@babel/plugin-transform-optional-catch-binding": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz",
+      "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-runtime": {
-      "version": "7.16.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz",
-      "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==",
+    "node_modules/@babel/plugin-transform-optional-chaining": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz",
+      "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "babel-plugin-polyfill-corejs2": "^0.3.0",
-        "babel-plugin-polyfill-corejs3": "^0.5.0",
-        "babel-plugin-polyfill-regenerator": "^0.3.0",
-        "semver": "^6.3.0"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
-      "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz",
+      "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
-      "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
+    "node_modules/@babel/plugin-transform-private-methods": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz",
+      "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
+        "@babel/helper-create-class-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
-      "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
+    "node_modules/@babel/plugin-transform-private-property-in-object": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz",
+      "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-create-class-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
-      "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz",
+      "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
-      "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz",
+      "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "regenerator-transform": "^0.15.1"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
-      "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz",
+      "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
-      "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
+    "node_modules/@babel/plugin-transform-runtime": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz",
+      "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
+        "@babel/helper-module-imports": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "babel-plugin-polyfill-corejs2": "^0.4.3",
+        "babel-plugin-polyfill-corejs3": "^0.8.1",
+        "babel-plugin-polyfill-regenerator": "^0.5.0",
+        "semver": "^6.3.0"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/preset-env": {
-      "version": "7.16.11",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
-      "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz",
+      "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.16.8",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-option": "^7.16.7",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
-        "@babel/plugin-proposal-class-properties": "^7.16.7",
-        "@babel/plugin-proposal-class-static-block": "^7.16.7",
-        "@babel/plugin-proposal-dynamic-import": "^7.16.7",
-        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
-        "@babel/plugin-proposal-json-strings": "^7.16.7",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
-        "@babel/plugin-proposal-numeric-separator": "^7.16.7",
-        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-private-methods": "^7.16.11",
-        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-class-properties": "^7.12.13",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-        "@babel/plugin-syntax-top-level-await": "^7.14.5",
-        "@babel/plugin-transform-arrow-functions": "^7.16.7",
-        "@babel/plugin-transform-async-to-generator": "^7.16.8",
-        "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
-        "@babel/plugin-transform-block-scoping": "^7.16.7",
-        "@babel/plugin-transform-classes": "^7.16.7",
-        "@babel/plugin-transform-computed-properties": "^7.16.7",
-        "@babel/plugin-transform-destructuring": "^7.16.7",
-        "@babel/plugin-transform-dotall-regex": "^7.16.7",
-        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
-        "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
-        "@babel/plugin-transform-for-of": "^7.16.7",
-        "@babel/plugin-transform-function-name": "^7.16.7",
-        "@babel/plugin-transform-literals": "^7.16.7",
-        "@babel/plugin-transform-member-expression-literals": "^7.16.7",
-        "@babel/plugin-transform-modules-amd": "^7.16.7",
-        "@babel/plugin-transform-modules-commonjs": "^7.16.8",
-        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
-        "@babel/plugin-transform-modules-umd": "^7.16.7",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
-        "@babel/plugin-transform-new-target": "^7.16.7",
-        "@babel/plugin-transform-object-super": "^7.16.7",
-        "@babel/plugin-transform-parameters": "^7.16.7",
-        "@babel/plugin-transform-property-literals": "^7.16.7",
-        "@babel/plugin-transform-regenerator": "^7.16.7",
-        "@babel/plugin-transform-reserved-words": "^7.16.7",
-        "@babel/plugin-transform-shorthand-properties": "^7.16.7",
-        "@babel/plugin-transform-spread": "^7.16.7",
-        "@babel/plugin-transform-sticky-regex": "^7.16.7",
-        "@babel/plugin-transform-template-literals": "^7.16.7",
-        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
-        "@babel/plugin-transform-unicode-escapes": "^7.16.7",
-        "@babel/plugin-transform-unicode-regex": "^7.16.7",
-        "@babel/preset-modules": "^0.1.5",
-        "@babel/types": "^7.16.8",
-        "babel-plugin-polyfill-corejs2": "^0.3.0",
-        "babel-plugin-polyfill-corejs3": "^0.5.0",
-        "babel-plugin-polyfill-regenerator": "^0.3.0",
-        "core-js-compat": "^3.20.2",
-        "semver": "^6.3.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/preset-modules": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
-      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz",
+      "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/runtime": {
-      "version": "7.15.4",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
-      "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz",
+      "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==",
       "dev": true,
       "dependencies": {
-        "regenerator-runtime": "^0.13.4"
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz",
+      "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz",
+      "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz",
+      "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-property-regex": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz",
+      "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz",
+      "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz",
+      "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz",
+      "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-validator-option": "^7.22.5",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5",
+        "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-import-assertions": "^7.22.5",
+        "@babel/plugin-syntax-import-attributes": "^7.22.5",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+        "@babel/plugin-transform-arrow-functions": "^7.22.5",
+        "@babel/plugin-transform-async-generator-functions": "^7.22.5",
+        "@babel/plugin-transform-async-to-generator": "^7.22.5",
+        "@babel/plugin-transform-block-scoped-functions": "^7.22.5",
+        "@babel/plugin-transform-block-scoping": "^7.22.5",
+        "@babel/plugin-transform-class-properties": "^7.22.5",
+        "@babel/plugin-transform-class-static-block": "^7.22.5",
+        "@babel/plugin-transform-classes": "^7.22.5",
+        "@babel/plugin-transform-computed-properties": "^7.22.5",
+        "@babel/plugin-transform-destructuring": "^7.22.5",
+        "@babel/plugin-transform-dotall-regex": "^7.22.5",
+        "@babel/plugin-transform-duplicate-keys": "^7.22.5",
+        "@babel/plugin-transform-dynamic-import": "^7.22.5",
+        "@babel/plugin-transform-exponentiation-operator": "^7.22.5",
+        "@babel/plugin-transform-export-namespace-from": "^7.22.5",
+        "@babel/plugin-transform-for-of": "^7.22.5",
+        "@babel/plugin-transform-function-name": "^7.22.5",
+        "@babel/plugin-transform-json-strings": "^7.22.5",
+        "@babel/plugin-transform-literals": "^7.22.5",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.22.5",
+        "@babel/plugin-transform-member-expression-literals": "^7.22.5",
+        "@babel/plugin-transform-modules-amd": "^7.22.5",
+        "@babel/plugin-transform-modules-commonjs": "^7.22.5",
+        "@babel/plugin-transform-modules-systemjs": "^7.22.5",
+        "@babel/plugin-transform-modules-umd": "^7.22.5",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
+        "@babel/plugin-transform-new-target": "^7.22.5",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5",
+        "@babel/plugin-transform-numeric-separator": "^7.22.5",
+        "@babel/plugin-transform-object-rest-spread": "^7.22.5",
+        "@babel/plugin-transform-object-super": "^7.22.5",
+        "@babel/plugin-transform-optional-catch-binding": "^7.22.5",
+        "@babel/plugin-transform-optional-chaining": "^7.22.5",
+        "@babel/plugin-transform-parameters": "^7.22.5",
+        "@babel/plugin-transform-private-methods": "^7.22.5",
+        "@babel/plugin-transform-private-property-in-object": "^7.22.5",
+        "@babel/plugin-transform-property-literals": "^7.22.5",
+        "@babel/plugin-transform-regenerator": "^7.22.5",
+        "@babel/plugin-transform-reserved-words": "^7.22.5",
+        "@babel/plugin-transform-shorthand-properties": "^7.22.5",
+        "@babel/plugin-transform-spread": "^7.22.5",
+        "@babel/plugin-transform-sticky-regex": "^7.22.5",
+        "@babel/plugin-transform-template-literals": "^7.22.5",
+        "@babel/plugin-transform-typeof-symbol": "^7.22.5",
+        "@babel/plugin-transform-unicode-escapes": "^7.22.5",
+        "@babel/plugin-transform-unicode-property-regex": "^7.22.5",
+        "@babel/plugin-transform-unicode-regex": "^7.22.5",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
+        "@babel/preset-modules": "^0.1.5",
+        "@babel/types": "^7.22.5",
+        "babel-plugin-polyfill-corejs2": "^0.4.3",
+        "babel-plugin-polyfill-corejs3": "^0.8.1",
+        "babel-plugin-polyfill-regenerator": "^0.5.0",
+        "core-js-compat": "^3.30.2",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+      "dev": true
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.15.4",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
+      "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
+      "dev": true,
+      "dependencies": {
+        "regenerator-runtime": "^0.13.4"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
-      "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+      "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/types": "^7.16.7"
+        "@babel/code-frame": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.16.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
-      "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.8",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/parser": "^7.16.10",
-        "@babel/types": "^7.16.8",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz",
+      "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.22.5",
+        "@babel/generator": "^7.22.5",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/types": "^7.22.5",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.16.8",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
-      "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+      "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.16.7",
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.5",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@colors/colors": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+      "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.1.90"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+      "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+      "dev": true,
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
-      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+      "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.2.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
+        "espree": "^9.5.2",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/@eslint/eslintrc/node_modules/argparse": {
       "dev": true
     },
     "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "13.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
+      "version": "13.20.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
     "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
         "js-yaml": "bin/js-yaml.js"
       }
     },
+    "node_modules/@eslint/js": {
+      "version": "8.42.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz",
+      "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
     "node_modules/@gar/promisify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz",
-      "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
       "dev": true
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
-      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+      "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
       "dev": true,
       "dependencies": {
         "@humanwhocodes/object-schema": "^1.2.1",
         "debug": "^4.1.1",
-        "minimatch": "^3.0.4"
+        "minimatch": "^3.0.5"
       },
       "engines": {
         "node": ">=10.10.0"
       }
     },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
     "node_modules/@humanwhocodes/object-schema": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
       "dev": true
     },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dev": true,
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/@istanbuljs/schema": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
         "node": ">=8"
       }
     },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
+      "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+      "dev": true
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.18",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "dev": true
+    },
+    "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+      "version": "5.1.1-v1",
+      "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+      "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+      "dev": true,
+      "dependencies": {
+        "eslint-scope": "5.1.1"
+      }
+    },
+    "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/@npmcli/fs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz",
-      "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz",
+      "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==",
       "dev": true,
       "dependencies": {
-        "@gar/promisify": "^1.0.1",
         "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/@npmcli/fs/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       }
     },
     "node_modules/@npmcli/git": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
-      "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz",
+      "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==",
       "dev": true,
       "dependencies": {
-        "@npmcli/promise-spawn": "^1.3.2",
-        "lru-cache": "^6.0.0",
-        "mkdirp": "^1.0.4",
-        "npm-pick-manifest": "^6.1.1",
+        "@npmcli/promise-spawn": "^6.0.0",
+        "lru-cache": "^7.4.4",
+        "npm-pick-manifest": "^8.0.0",
+        "proc-log": "^3.0.0",
         "promise-inflight": "^1.0.1",
         "promise-retry": "^2.0.1",
         "semver": "^7.3.5",
-        "which": "^2.0.2"
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/@npmcli/git/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+    "node_modules/@npmcli/git/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
       "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
       }
     },
     "node_modules/@npmcli/git/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
         "node": ">=10"
       }
     },
+    "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/git/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/@npmcli/installed-package-contents": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz",
-      "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz",
+      "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==",
       "dev": true,
       "dependencies": {
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
+        "npm-bundled": "^3.0.0",
+        "npm-normalize-package-bin": "^3.0.0"
       },
       "bin": {
-        "installed-package-contents": "index.js"
+        "installed-package-contents": "lib/index.js"
       },
       "engines": {
-        "node": ">= 10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/@npmcli/move-file": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
-      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
+      "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
       "deprecated": "This functionality has been moved to @npmcli/fs",
       "dev": true,
       "dependencies": {
         "rimraf": "^3.0.2"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
     "node_modules/@npmcli/move-file/node_modules/mkdirp": {
       }
     },
     "node_modules/@npmcli/node-gyp": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz",
-      "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==",
-      "dev": true
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
+      "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
     },
     "node_modules/@npmcli/promise-spawn": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz",
-      "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz",
+      "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==",
       "dev": true,
       "dependencies": {
-        "infer-owner": "^1.0.4"
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@npmcli/promise-spawn/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@npmcli/run-script": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz",
+      "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==",
+      "dev": true,
+      "dependencies": {
+        "@npmcli/node-gyp": "^3.0.0",
+        "@npmcli/promise-spawn": "^6.0.0",
+        "node-gyp": "^9.0.0",
+        "read-package-json-fast": "^3.0.0",
+        "which": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@npmcli/run-script/node_modules/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@puppeteer/browsers": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.1.tgz",
+      "integrity": "sha512-H43VosMzywHCcYcgv0GXXopvwnV21Ud9g2aXbPlQUJj1Xcz9V0wBwHeFz6saFhx/3VKisZfI1GEKEOhQCau7Vw==",
+      "dev": true,
+      "dependencies": {
+        "debug": "4.3.4",
+        "extract-zip": "2.0.1",
+        "progress": "2.0.3",
+        "proxy-agent": "6.2.1",
+        "tar-fs": "2.1.1",
+        "unbzip2-stream": "1.4.3",
+        "yargs": "17.7.1"
+      },
+      "bin": {
+        "browsers": "lib/cjs/main-cli.js"
+      },
+      "engines": {
+        "node": ">=16.3.0"
+      },
+      "peerDependencies": {
+        "typescript": ">= 4.7.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@puppeteer/browsers/node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@puppeteer/browsers/node_modules/yargs": {
+      "version": "17.7.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+      "dev": true,
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@puppeteer/browsers/node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@rollup/plugin-babel": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz",
+      "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.18.6",
+        "@rollup/pluginutils": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "@types/babel__core": "^7.1.9",
+        "rollup": "^1.20.0||^2.0.0||^3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/babel__core": {
+          "optional": true
+        },
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/plugin-commonjs": {
+      "version": "25.0.1",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.1.tgz",
+      "integrity": "sha512-2DJ4kv4b1xfTJopWhu61ANdNRHvzQZ2fpaIrlgaP2jOfUv1wDJ0Ucqy8AZlbFmn/iUjiwKoqki9j55Y6L8kyNQ==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.1",
+        "commondir": "^1.0.1",
+        "estree-walker": "^2.0.2",
+        "glob": "^8.0.3",
+        "is-reference": "1.2.1",
+        "magic-string": "^0.27.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^2.68.0||^3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@rollup/plugin-commonjs/node_modules/glob": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^5.0.1",
+        "once": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/@npmcli/run-script": {
-      "version": "1.8.6",
-      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz",
-      "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==",
+    "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dev": true,
       "dependencies": {
-        "@npmcli/node-gyp": "^1.0.2",
-        "@npmcli/promise-spawn": "^1.3.2",
-        "node-gyp": "^7.1.0",
-        "read-package-json-fast": "^2.0.1"
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/@rollup/plugin-babel": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
-      "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
+    "node_modules/@rollup/plugin-node-resolve": {
+      "version": "15.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz",
+      "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.10.4",
-        "@rollup/pluginutils": "^3.1.0"
+        "@rollup/pluginutils": "^5.0.1",
+        "@types/resolve": "1.20.2",
+        "deepmerge": "^4.2.2",
+        "is-builtin-module": "^3.2.1",
+        "is-module": "^1.0.0",
+        "resolve": "^1.22.1"
       },
       "engines": {
-        "node": ">= 10.0.0"
+        "node": ">=14.0.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0",
-        "@types/babel__core": "^7.1.9",
-        "rollup": "^1.20.0||^2.0.0"
+        "rollup": "^2.78.0||^3.0.0"
       },
       "peerDependenciesMeta": {
-        "@types/babel__core": {
+        "rollup": {
           "optional": true
         }
       }
     },
-    "node_modules/@rollup/plugin-commonjs": {
-      "version": "21.0.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz",
-      "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==",
+    "node_modules/@rollup/plugin-terser": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz",
+      "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "commondir": "^1.0.1",
-        "estree-walker": "^2.0.1",
-        "glob": "^7.1.6",
-        "is-reference": "^1.2.1",
-        "magic-string": "^0.25.7",
-        "resolve": "^1.17.0"
+        "serialize-javascript": "^6.0.1",
+        "smob": "^1.0.0",
+        "terser": "^5.17.4"
       },
       "engines": {
-        "node": ">= 8.0.0"
+        "node": ">=14.0.0"
       },
       "peerDependencies": {
-        "rollup": "^2.38.3"
+        "rollup": "^2.x || ^3.x"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
-    },
-    "node_modules/@rollup/plugin-multi-entry": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-multi-entry/-/plugin-multi-entry-4.1.0.tgz",
-      "integrity": "sha512-nellK5pr50W0JA2+bDJbG8F79GBP802J40YRoC0wyfpTAeAn5mJ4eaFiB/MN+YoX9hgb/6RJoZl9leDjZnUFKw==",
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+      "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
       "dev": true,
       "dependencies": {
-        "@rollup/plugin-virtual": "^2.0.3",
-        "matched": "^5.0.0"
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
       },
       "engines": {
-        "node": ">=10.0.0"
+        "node": ">=14.0.0"
       },
       "peerDependencies": {
-        "rollup": "^1.20.0 || ^2.0.0"
+        "rollup": "^1.20.0||^2.0.0||^3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "13.1.3",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz",
-      "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==",
+    "node_modules/@sigstore/protobuf-specs": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz",
+      "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@sigstore/tuf": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.0.tgz",
+      "integrity": "sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
+        "@sigstore/protobuf-specs": "^0.1.0",
+        "make-fetch-happen": "^11.0.1",
+        "tuf-js": "^1.1.3"
       },
       "engines": {
-        "node": ">= 10.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.42.0"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/@rollup/plugin-virtual": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-2.0.3.tgz",
-      "integrity": "sha512-pw6ziJcyjZtntQ//bkad9qXaBx665SgEL8C8KI5wO8G5iU5MPxvdWrQyVaAvjojGm9tJoS8M9Z/EEepbqieYmw==",
+    "node_modules/@sigstore/tuf/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
       "dev": true,
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+    "node_modules/@sigstore/tuf/node_modules/make-fetch-happen": {
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+      "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
       "dev": true,
       "dependencies": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
+        "agentkeepalive": "^4.2.1",
+        "cacache": "^17.0.0",
+        "http-cache-semantics": "^4.1.1",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^7.7.1",
+        "minipass": "^5.0.0",
+        "minipass-fetch": "^3.0.0",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.3",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^7.0.0",
+        "ssri": "^10.0.0"
       },
       "engines": {
-        "node": ">= 8.0.0"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@sigstore/tuf/node_modules/minipass-fetch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz",
+      "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^5.0.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.1.2"
       },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.13"
       }
     },
     "node_modules/@sindresorhus/is": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
-      "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+      "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/is?sponsor=1"
       }
     },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+      "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
+      "dev": true
+    },
     "node_modules/@szmarczak/http-timer": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
       "license": "ISC"
     },
     "node_modules/@tootallnate/once": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
       "dev": true,
       "engines": {
-        "node": ">= 6"
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tufjs/canonical-json": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz",
+      "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@tufjs/models": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz",
+      "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==",
+      "dev": true,
+      "dependencies": {
+        "@tufjs/canonical-json": "1.0.0",
+        "minimatch": "^9.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@tufjs/models/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@tufjs/models/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/@types/cacheable-request": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
-      "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+      "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
       "dev": true,
       "dependencies": {
         "@types/http-cache-semantics": "*",
-        "@types/keyv": "*",
+        "@types/keyv": "^3.1.4",
         "@types/node": "*",
-        "@types/responselike": "*"
+        "@types/responselike": "^1.0.0"
       }
     },
-    "node_modules/@types/component-emitter": {
-      "version": "1.2.11",
-      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
-      "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==",
-      "dev": true
-    },
     "node_modules/@types/cookie": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
       "dev": true
     },
     "node_modules/@types/cors": {
-      "version": "2.8.12",
-      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-      "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==",
-      "dev": true
+      "version": "2.8.13",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+      "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
     },
     "node_modules/@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
       "dev": true
     },
     "node_modules/@types/http-cache-semantics": {
       "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
       "dev": true
     },
+    "node_modules/@types/jasmine": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.2.tgz",
+      "integrity": "sha512-lKkWBcbxEZX/7nxPqEtv/OjPLaBa2j0o+hmv5Yn83b/+11C1kfBAkgvmrb13WDkmizUJ3B+jYrWh4M0YRtrzEQ==",
+      "dev": true
+    },
     "node_modules/@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+      "dev": true,
+      "peer": true
     },
     "node_modules/@types/keyv": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz",
-      "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+      "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
       "dev": true,
       "dependencies": {
         "@types/node": "*"
       "dev": true
     },
     "node_modules/@types/puppeteer": {
-      "version": "5.4.4",
-      "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz",
-      "integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-7.0.4.tgz",
+      "integrity": "sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==",
+      "deprecated": "This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed.",
       "dev": true,
       "dependencies": {
-        "@types/node": "*"
+        "puppeteer": "*"
       }
     },
     "node_modules/@types/puppeteer-core": {
       }
     },
     "node_modules/@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+      "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+      "dev": true
     },
     "node_modules/@types/responselike": {
       "version": "1.0.0",
       "dev": true
     },
     "node_modules/@types/yauzl": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
-      "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
       "dev": true,
       "optional": true,
       "dependencies": {
       "dev": true
     },
     "node_modules/accepts": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "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.24",
-        "negotiator": "0.6.2"
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
       },
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/agent-base": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
-      "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
       "dev": true,
+      "dependencies": {
+        "debug": "4"
+      },
       "engines": {
         "node": ">= 6.0.0"
       }
     },
     "node_modules/agentkeepalive": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz",
-      "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
       "dev": true,
       "dependencies": {
         "debug": "^4.1.0",
-        "depd": "^1.1.2",
+        "depd": "^2.0.0",
         "humanize-ms": "^1.2.1"
       },
       "engines": {
       }
     },
     "node_modules/aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
       "dev": true
     },
     "node_modules/arch": {
     "node_modules/archive-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
-      "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
+      "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==",
       "dev": true,
       "dependencies": {
         "file-type": "^4.2.0"
     "node_modules/archive-type/node_modules/file-type": {
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
-      "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
+      "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/archiver": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz",
-      "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
+      "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==",
       "dev": true,
       "dependencies": {
         "archiver-utils": "^2.1.0",
-        "async": "^3.2.0",
+        "async": "^3.2.3",
         "buffer-crc32": "^0.2.1",
         "readable-stream": "^3.6.0",
         "readdir-glob": "^1.0.0",
       }
     },
     "node_modules/archiver/node_modules/async": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz",
-      "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
       "dev": true
     },
     "node_modules/archiver/node_modules/bl": {
       }
     },
     "node_modules/archiver/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "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",
       }
     },
     "node_modules/are-we-there-yet": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
-      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+      "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
       "dev": true,
       "dependencies": {
         "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/are-we-there-yet/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/argparse": {
         "sprintf-js": "~1.0.2"
       }
     },
+    "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,
+      "peer": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "is-array-buffer": "^3.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/array-from": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
       "dev": true
     },
     "node_modules/array-includes": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
-      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
+      "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,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1",
-        "get-intrinsic": "^1.1.1",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4",
+        "get-intrinsic": "^1.1.3",
         "is-string": "^1.0.7"
       },
       "engines": {
       }
     },
     "node_modules/array.prototype.flat": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
-      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+      "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4",
+        "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flatmap": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+      "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4",
+        "es-shim-unscopables": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "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": ">= 4.5.0"
       }
     },
+    "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,
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
       "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
       "dev": true
     },
-    "node_modules/babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "peerDependencies": {
-        "eslint": ">= 4.12.1"
-      }
-    },
-    "node_modules/babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "dev": true,
-      "dependencies": {
-        "object.assign": "^4.1.0"
-      }
-    },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
-      "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz",
+      "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.13.11",
-        "@babel/helper-define-polyfill-provider": "^0.3.1",
+        "@babel/compat-data": "^7.17.7",
+        "@babel/helper-define-polyfill-provider": "^0.4.0",
         "semver": "^6.1.1"
       },
       "peerDependencies": {
       }
     },
     "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz",
-      "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==",
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz",
+      "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.3.1",
-        "core-js-compat": "^3.20.0"
+        "@babel/helper-define-polyfill-provider": "^0.4.0",
+        "core-js-compat": "^3.30.1"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
-      "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz",
+      "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.3.1"
+        "@babel/helper-define-polyfill-provider": "^0.4.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
-    "node_modules/base64-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz",
-      "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
     "node_modules/base64-js": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
         "node": ">= 0.8"
       }
     },
+    "node_modules/basic-ftp": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz",
+      "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
     "node_modules/bcrypt-pbkdf": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
     "node_modules/bin-version/node_modules/path-key": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
       "dev": true,
       "engines": {
         "node": ">=4"
     "node_modules/bin-version/node_modules/shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
       "dev": true,
       "dependencies": {
         "shebang-regex": "^1.0.0"
     "node_modules/bin-version/node_modules/shebang-regex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/body-parser": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
-      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+      "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
       "dev": true,
       "dependencies": {
-        "bytes": "3.1.0",
-        "content-type": "~1.0.4",
+        "bytes": "3.1.2",
+        "content-type": "~1.0.5",
         "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.7.2",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
         "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
+        "on-finished": "2.4.1",
+        "qs": "6.11.0",
+        "raw-body": "2.5.2",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
       },
       "engines": {
-        "node": ">= 0.8"
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
       }
     },
     "node_modules/body-parser/node_modules/debug": {
       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
       "dev": true
     },
+    "node_modules/body-parser/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/body-parser/node_modules/qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+      "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/boolean": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz",
-      "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+      "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
       "dev": true
     },
     "node_modules/boxen": {
       }
     },
     "node_modules/browserslist": {
-      "version": "4.19.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
-      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+      "version": "4.21.7",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz",
+      "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
       "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001286",
-        "electron-to-chromium": "^1.4.17",
-        "escalade": "^3.1.1",
-        "node-releases": "^2.0.1",
-        "picocolors": "^1.0.0"
+        "caniuse-lite": "^1.0.30001489",
+        "electron-to-chromium": "^1.4.411",
+        "node-releases": "^2.0.12",
+        "update-browserslist-db": "^1.0.11"
       },
       "bin": {
         "browserslist": "cli.js"
       },
       "engines": {
         "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
       }
     },
     "node_modules/buffer": {
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
       "dev": true,
       "engines": {
         "node": "*"
     "node_modules/buffer-fill": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
       "dev": true
     },
     "node_modules/buffer-from": {
       "dev": true
     },
     "node_modules/builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
       "dev": true,
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/builtins": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
-      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
-      "dev": true
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+      "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+      "dev": true,
+      "dependencies": {
+        "semver": "^7.0.0"
+      }
+    },
+    "node_modules/builtins/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
     },
     "node_modules/bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "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": "15.3.0",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
-      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+      "version": "17.1.3",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz",
+      "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==",
       "dev": true,
       "dependencies": {
-        "@npmcli/fs": "^1.0.0",
-        "@npmcli/move-file": "^1.0.1",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "glob": "^7.1.4",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^6.0.0",
-        "minipass": "^3.1.1",
+        "@npmcli/fs": "^3.1.0",
+        "fs-minipass": "^3.0.0",
+        "glob": "^10.2.2",
+        "lru-cache": "^7.7.1",
+        "minipass": "^5.0.0",
         "minipass-collect": "^1.0.2",
         "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.2",
-        "mkdirp": "^1.0.3",
+        "minipass-pipeline": "^1.2.4",
         "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^8.0.1",
-        "tar": "^6.0.2",
-        "unique-filename": "^1.1.1"
+        "ssri": "^10.0.0",
+        "tar": "^6.1.11",
+        "unique-filename": "^3.0.0"
       },
       "engines": {
-        "node": ">= 10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
-    "node_modules/cacache/node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+    "node_modules/cacache/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
-      "engines": {
-        "node": ">=10"
+      "dependencies": {
+        "balanced-match": "^1.0.0"
       }
     },
-    "node_modules/cacache/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+    "node_modules/cacache/node_modules/glob": {
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+      "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
       "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2",
+        "path-scurry": "^1.7.0"
+      },
       "bin": {
-        "mkdirp": "bin/cmd.js"
+        "glob": "dist/cjs/src/bin.js"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/cacache/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/cacache/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/cacheable-lookup": {
       }
     },
     "node_modules/cacheable-request": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
-      "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
+      "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
       "dev": true,
       "dependencies": {
-        "clone-response": "1.0.2",
-        "get-stream": "3.0.0",
-        "http-cache-semantics": "3.8.1",
-        "keyv": "3.0.0",
-        "lowercase-keys": "1.0.0",
-        "normalize-url": "2.0.1",
-        "responselike": "1.0.2"
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^4.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^6.0.1",
+        "responselike": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/cacheable-request/node_modules/lowercase-keys": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
-      "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+    "node_modules/cacheable-request/node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
       "dev": true,
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/call-bind": {
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001302",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001302.tgz",
-      "integrity": "sha512-YYTMO+tfwvgUN+1ZnRViE53Ma1S/oETg+J2lISsqi/ZTNThj3ZYBOKP2rHwJc37oCsPqAzJ3w2puZHn0xlLPPw==",
+      "version": "1.0.30001502",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz",
+      "integrity": "sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==",
       "dev": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
+      "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/capital-case": {
       "version": "1.0.4",
         "rimraf": "^3.0.2"
       }
     },
+    "node_modules/chromium-bidi": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.11.tgz",
+      "integrity": "sha512-p03ajLhlQ5gebw3cmbDBFmBc2wnJM5dnXS8Phu6mblGn/KQd76yOVL5VwE0VAisa7oazNfKGTaXlIZ8Q5Bb9OA==",
+      "dev": true,
+      "dependencies": {
+        "mitt": "3.0.0"
+      },
+      "peerDependencies": {
+        "devtools-protocol": "*"
+      }
+    },
     "node_modules/clean-stack": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
       }
     },
     "node_modules/clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
       "dev": true,
       "dependencies": {
         "mimic-response": "^1.0.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": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/color-convert": {
     "node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
       "dev": true
     },
+    "node_modules/color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "dev": true,
+      "bin": {
+        "color-support": "bin.js"
+      }
+    },
     "node_modules/colors": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
     "node_modules/commondir": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "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==",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
       "dev": true
     },
     "node_modules/compress-commons": {
       }
     },
     "node_modules/compress-commons/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "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",
     "node_modules/console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
       "dev": true
     },
     "node_modules/constant-case": {
       }
     },
     "node_modules/content-disposition": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "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.1.2"
+        "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.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "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/cookie": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
-      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
       "dev": true,
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/core-js": {
-      "version": "3.20.3",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz",
-      "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==",
-      "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.",
+      "version": "3.31.0",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz",
+      "integrity": "sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==",
       "dev": true,
       "hasInstallScript": true,
       "funding": {
       }
     },
     "node_modules/core-js-compat": {
-      "version": "3.20.3",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz",
-      "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==",
+      "version": "3.31.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz",
+      "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==",
       "dev": true,
       "dependencies": {
-        "browserslist": "^4.19.1",
-        "semver": "7.0.0"
+        "browserslist": "^4.21.5"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/core-js"
       }
     },
-    "node_modules/core-js-compat/node_modules/semver": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
     "node_modules/core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
         "node": ">= 0.4.0"
       }
     },
+    "node_modules/cosmiconfig": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+      "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
+      "dev": true,
+      "dependencies": {
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/d-fischer"
+      }
+    },
+    "node_modules/cosmiconfig/node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "node_modules/cosmiconfig/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/coveralls": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz",
       }
     },
     "node_modules/crc-32": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
-      "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
       "dev": true,
-      "dependencies": {
-        "exit-on-epipe": "~1.0.1",
-        "printj": "~1.1.0"
-      },
       "bin": {
         "crc32": "bin/crc32.njs"
       },
       }
     },
     "node_modules/crc32-stream/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "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",
         "node": ">= 6"
       }
     },
+    "node_modules/cross-fetch": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
+      "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
+      "dev": true,
+      "dependencies": {
+        "node-fetch": "^2.6.11"
+      }
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
     "node_modules/css-value": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz",
-      "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=",
+      "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==",
       "dev": true
     },
     "node_modules/custom-event": {
         "node": ">=0.10"
       }
     },
+    "node_modules/data-uri-to-buffer": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz",
+      "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/date-format": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz",
-      "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==",
-      "deprecated": "3.x is no longer supported. Please upgrade to 4.x or higher.",
+      "version": "4.0.14",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
+      "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
       "dev": true,
       "engines": {
         "node": ">=4.0"
       }
     },
     "node_modules/debug": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+      "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"
       }
     },
     "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "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/decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
       "dev": true,
       "dependencies": {
-        "mimic-response": "^1.0.0"
+        "mimic-response": "^3.1.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/decompress-response/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/decompress-tar": {
     "node_modules/decompress-tar/node_modules/file-type": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-      "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+      "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
       "dev": true,
       "engines": {
         "node": ">=4"
     "node_modules/decompress-targz/node_modules/file-type": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
-      "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+      "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
       "dev": true,
       "engines": {
         "node": ">=4"
     "node_modules/decompress-unzip": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
-      "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
+      "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==",
       "dev": true,
       "dependencies": {
         "file-type": "^3.8.0",
     "node_modules/decompress-unzip/node_modules/file-type": {
       "version": "3.9.0",
       "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
-      "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+      "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
     "node_modules/decompress-unzip/node_modules/get-stream": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
-      "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+      "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
       "dev": true,
       "dependencies": {
         "object-assign": "^4.0.1",
     "node_modules/decompress-unzip/node_modules/pify": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
     "node_modules/decompress/node_modules/make-dir/node_modules/pify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
       "dev": true,
       "engines": {
         "node": ">=4"
     "node_modules/decompress/node_modules/pify": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       "dev": true
     },
     "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=10"
+      }
+    },
+    "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/degenerator": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-4.0.2.tgz",
+      "integrity": "sha512-HKwIFvZROUMfH3qI3gBpD61BYh7q3c3GXD5UGZzoVNJwVSYgZKvYl1fRMXc9ozoTxl/VZxKJ5v/bA+19tywFiw==",
+      "dev": true,
+      "dependencies": {
+        "ast-types": "^0.13.2",
+        "escodegen": "^1.8.1",
+        "esprima": "^4.0.0",
+        "vm2": "^3.9.17"
+      },
+      "engines": {
+        "node": ">= 14"
       }
     },
-    "node_modules/define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+    "node_modules/degenerator/node_modules/ast-types": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+      "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
       "dev": true,
       "dependencies": {
-        "object-keys": "^1.0.12"
+        "tslib": "^2.0.1"
       },
       "engines": {
-        "node": ">= 0.4"
+        "node": ">=4"
       }
     },
     "node_modules/delayed-stream": {
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
       "dev": true
     },
     "node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "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.6"
+        "node": ">= 0.8"
+      }
+    },
+    "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-node": {
         "node": ">=6"
       }
     },
+    "node_modules/download/node_modules/@sindresorhus/is": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
+      "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/download/node_modules/cacheable-request": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
+      "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==",
+      "dev": true,
+      "dependencies": {
+        "clone-response": "1.0.2",
+        "get-stream": "3.0.0",
+        "http-cache-semantics": "3.8.1",
+        "keyv": "3.0.0",
+        "lowercase-keys": "1.0.0",
+        "normalize-url": "2.0.1",
+        "responselike": "1.0.2"
+      }
+    },
+    "node_modules/download/node_modules/cacheable-request/node_modules/lowercase-keys": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+      "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/download/node_modules/clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==",
+      "dev": true,
+      "dependencies": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "node_modules/download/node_modules/decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
+      "dev": true,
+      "dependencies": {
+        "mimic-response": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/download/node_modules/got": {
       "version": "8.3.2",
       "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
         "node": ">=4"
       }
     },
+    "node_modules/download/node_modules/http-cache-semantics": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+      "dev": true
+    },
+    "node_modules/download/node_modules/json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
+      "dev": true
+    },
+    "node_modules/download/node_modules/keyv": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
+      "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+      "dev": true,
+      "dependencies": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "node_modules/download/node_modules/lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/download/node_modules/make-dir": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
         "node": ">=4"
       }
     },
+    "node_modules/download/node_modules/normalize-url": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+      "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+      "dev": true,
+      "dependencies": {
+        "prepend-http": "^2.0.0",
+        "query-string": "^5.0.1",
+        "sort-keys": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/download/node_modules/p-cancelable": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+      "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/download/node_modules/pify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/download/node_modules/responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
+      "dev": true,
+      "dependencies": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "node_modules/download/node_modules/sort-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+      "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
       "dev": true,
+      "dependencies": {
+        "is-plain-obj": "^1.0.0"
+      },
       "engines": {
         "node": ">=4"
       }
       }
     },
     "node_modules/duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
+      "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
+      "dev": true
+    },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
       "dev": true
     },
     "node_modules/ecc-jsbn": {
       "dev": true
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.53",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.53.tgz",
-      "integrity": "sha512-rFveSKQczlcav+H3zkKqykU6ANseFwXwkl855jOIap5/0gnEcuIhv2ecz6aoTrXavF6I/CEBeRnBnkB51k06ew==",
+      "version": "1.4.427",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz",
+      "integrity": "sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw==",
       "dev": true
     },
     "node_modules/emoji-regex": {
       }
     },
     "node_modules/engine.io": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.0.tgz",
-      "integrity": "sha512-Ui7yl3JajEIaACg8MOUwWvuuwU7jepZqX3BKs1ho7NQRuP4LhN4XIykXhp8bEy+x/DhA0LBZZXYSCkZDqrwMMg==",
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz",
+      "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==",
       "dev": true,
       "dependencies": {
         "@types/cookie": "^0.4.1",
         "cookie": "~0.4.1",
         "cors": "~2.8.5",
         "debug": "~4.3.1",
-        "engine.io-parser": "~5.0.0",
-        "ws": "~8.2.3"
+        "engine.io-parser": "~5.0.3",
+        "ws": "~8.11.0"
       },
       "engines": {
         "node": ">=10.0.0"
       }
     },
     "node_modules/engine.io-parser": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz",
-      "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==",
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz",
+      "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==",
       "dev": true,
-      "dependencies": {
-        "base64-arraybuffer": "~1.0.1"
-      },
       "engines": {
         "node": ">=10.0.0"
       }
       "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
       "dev": true
     },
+    "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/es-abstract": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
-      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+      "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,
+      "peer": 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-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.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-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
-        "is-negative-zero": "^2.0.1",
+        "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.1",
+        "is-shared-array-buffer": "^1.0.2",
         "is-string": "^1.0.7",
-        "is-weakref": "^1.0.1",
-        "object-inspect": "^1.11.0",
+        "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.2",
-        "string.prototype.trimend": "^1.0.4",
-        "string.prototype.trimstart": "^1.0.4",
-        "unbox-primitive": "^1.0.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"
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "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,
+      "peer": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.3",
+        "has": "^1.0.3",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+      "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      }
+    },
     "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,
+      "peer": true,
       "dependencies": {
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
       }
     },
     "node_modules/eslint": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz",
-      "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==",
-      "dev": true,
-      "dependencies": {
-        "@eslint/eslintrc": "^1.0.5",
-        "@humanwhocodes/config-array": "^0.9.2",
+      "version": "8.42.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz",
+      "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.4.0",
+        "@eslint/eslintrc": "^2.0.3",
+        "@eslint/js": "8.42.0",
+        "@humanwhocodes/config-array": "^0.11.10",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.0",
-        "eslint-utils": "^3.0.0",
-        "eslint-visitor-keys": "^3.2.0",
-        "espree": "^9.3.0",
-        "esquery": "^1.4.0",
+        "eslint-scope": "^7.2.0",
+        "eslint-visitor-keys": "^3.4.1",
+        "espree": "^9.5.2",
+        "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^6.0.1",
-        "globals": "^13.6.0",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
         "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
-        "regexpp": "^3.2.0",
         "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
+        "text-table": "^0.2.0"
       },
       "bin": {
         "eslint": "bin/eslint.js"
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint-config-prettier": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz",
+      "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==",
+      "dev": true,
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
+      }
+    },
     "node_modules/eslint-config-standard": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz",
-      "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==",
+      "version": "17.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
+      "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
       "dev": true,
       "funding": [
         {
           "url": "https://feross.org/support"
         }
       ],
+      "engines": {
+        "node": ">=12.0.0"
+      },
       "peerDependencies": {
-        "eslint": "^7.12.1",
-        "eslint-plugin-import": "^2.22.1",
-        "eslint-plugin-node": "^11.1.0",
-        "eslint-plugin-promise": "^4.2.1 || ^5.0.0"
+        "eslint": "^8.0.1",
+        "eslint-plugin-import": "^2.25.2",
+        "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
+        "eslint-plugin-promise": "^6.0.0"
       }
     },
     "node_modules/eslint-import-resolver-node": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
-      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+      "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "debug": "^3.2.7",
-        "resolve": "^1.20.0"
+        "is-core-module": "^2.11.0",
+        "resolve": "^1.22.1"
       }
     },
     "node_modules/eslint-import-resolver-node/node_modules/debug": {
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "ms": "^2.1.1"
       }
     },
     "node_modules/eslint-module-utils": {
-      "version": "2.7.2",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz",
-      "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "debug": "^3.2.7",
-        "find-up": "^2.1.0"
+        "debug": "^3.2.7"
       },
       "engines": {
         "node": ">=4"
+      },
+      "peerDependenciesMeta": {
+        "eslint": {
+          "optional": true
+        }
       }
     },
     "node_modules/eslint-module-utils/node_modules/debug": {
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "ms": "^2.1.1"
       }
     },
-    "node_modules/eslint-plugin-es": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
-      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+    "node_modules/eslint-plugin-es-x": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-6.2.1.tgz",
+      "integrity": "sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "eslint-utils": "^2.0.0",
-        "regexpp": "^3.0.0"
+        "@eslint-community/eslint-utils": "^4.1.2",
+        "@eslint-community/regexpp": "^4.5.0"
       },
       "engines": {
-        "node": ">=8.10.0"
+        "node": "^14.18.0 || >=16.0.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
+        "url": "https://github.com/sponsors/ota-meshi"
       },
       "peerDependencies": {
-        "eslint": ">=4.19.1"
+        "eslint": ">=8"
       }
     },
     "node_modules/eslint-plugin-import": {
-      "version": "2.25.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
-      "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
+      "version": "2.27.5",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+      "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "array-includes": "^3.1.4",
-        "array.prototype.flat": "^1.2.5",
-        "debug": "^2.6.9",
+        "array-includes": "^3.1.6",
+        "array.prototype.flat": "^1.3.1",
+        "array.prototype.flatmap": "^1.3.1",
+        "debug": "^3.2.7",
         "doctrine": "^2.1.0",
-        "eslint-import-resolver-node": "^0.3.6",
-        "eslint-module-utils": "^2.7.2",
+        "eslint-import-resolver-node": "^0.3.7",
+        "eslint-module-utils": "^2.7.4",
         "has": "^1.0.3",
-        "is-core-module": "^2.8.0",
+        "is-core-module": "^2.11.0",
         "is-glob": "^4.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.5",
-        "resolve": "^1.20.0",
-        "tsconfig-paths": "^3.12.0"
+        "minimatch": "^3.1.2",
+        "object.values": "^1.1.6",
+        "resolve": "^1.22.1",
+        "semver": "^6.3.0",
+        "tsconfig-paths": "^3.14.1"
       },
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/eslint-plugin-import/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "ms": "^2.1.1"
       }
     },
     "node_modules/eslint-plugin-import/node_modules/doctrine": {
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
       "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "esutils": "^2.0.2"
       },
         "node": ">=0.10.0"
       }
     },
-    "node_modules/eslint-plugin-import/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/eslint-plugin-node": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
-      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+    "node_modules/eslint-plugin-n": {
+      "version": "16.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.0.tgz",
+      "integrity": "sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "eslint-plugin-es": "^3.0.0",
-        "eslint-utils": "^2.0.0",
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "builtins": "^5.0.1",
+        "eslint-plugin-es-x": "^6.1.0",
         "ignore": "^5.1.1",
-        "minimatch": "^3.0.4",
-        "resolve": "^1.10.1",
-        "semver": "^6.1.0"
+        "is-core-module": "^2.12.0",
+        "minimatch": "^3.1.2",
+        "resolve": "^1.22.2",
+        "semver": "^7.5.0"
       },
       "engines": {
-        "node": ">=8.10.0"
+        "node": ">=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
       },
       "peerDependencies": {
-        "eslint": ">=5.16.0"
+        "eslint": ">=7.0.0"
       }
     },
-    "node_modules/eslint-plugin-promise": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
-      "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
+    "node_modules/eslint-plugin-n/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      "peer": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
       },
-      "peerDependencies": {
-        "eslint": "^7.0.0 || ^8.0.0"
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/eslint-plugin-sort-class-members": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.14.1.tgz",
-      "integrity": "sha512-/Q/cm3h4N9DBNYvJMQMhluucSmr3Yydr9U0BgGcXUQe/rgWdXKSymZ5Ewcf4vmAG0bbTmAYmekuMnYYrqlu9Rg==",
+    "node_modules/eslint-plugin-promise": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
+      "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
       "dev": true,
+      "peer": true,
       "engines": {
-        "node": ">=4.0.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
       "peerDependencies": {
-        "eslint": ">=0.8.0"
-      }
-    },
-    "node_modules/eslint-plugin-standard": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz",
-      "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==",
-      "deprecated": "standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: https://github.com/standard/standard/issues/1316",
-      "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"
-        }
-      ],
-      "peerDependencies": {
-        "eslint": ">=5.0.0"
+        "eslint": "^7.0.0 || ^8.0.0"
       }
     },
     "node_modules/eslint-scope": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
-      "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
+      "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
       "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/eslint-scope/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/eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+    "node_modules/eslint-scope/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"
+        "node": ">=4.0"
       }
     },
     "node_modules/eslint/node_modules/ansi-styles": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/eslint/node_modules/eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      },
-      "peerDependencies": {
-        "eslint": ">=5"
-      }
-    },
-    "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/eslint/node_modules/eslint-visitor-keys": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
-      "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/eslint/node_modules/glob-parent": {
       }
     },
     "node_modules/eslint/node_modules/globals": {
-      "version": "13.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
+      "version": "13.20.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
         "node": ">=8"
       }
     },
-    "node_modules/esm": {
-      "version": "3.2.25",
-      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
-      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/espree": {
-      "version": "9.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
-      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
+      "version": "9.5.2",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+      "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.7.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^3.1.0"
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/espree/node_modules/acorn": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
-      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
+      "version": "8.8.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
       "dev": true,
       "bin": {
         "acorn": "bin/acorn"
       }
     },
     "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
-      "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/esprima": {
       }
     },
     "node_modules/esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
       "dev": true,
       "dependencies": {
         "estraverse": "^5.1.0"
       "dev": true
     },
     "node_modules/estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
       "dev": true
     },
     "node_modules/esutils": {
     "node_modules/execa": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==",
       "dev": true,
       "dependencies": {
         "cross-spawn": "^5.0.1",
     "node_modules/execa/node_modules/cross-spawn": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^4.0.1",
     "node_modules/execa/node_modules/shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
       "dev": true,
       "dependencies": {
         "shebang-regex": "^1.0.0"
     "node_modules/execa/node_modules/shebang-regex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
     "node_modules/execa/node_modules/yallist": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
       "dev": true
     },
     "node_modules/executable": {
     "node_modules/executable/node_modules/pify": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/exit-on-epipe": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
-      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
     "node_modules/ext": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
+    "node_modules/fastq": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
     "node_modules/fd-slicer": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
       "dev": true,
       "dependencies": {
         "pend": "~1.2.0"
     "node_modules/filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
-      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
+      "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
       "dev": true,
       "engines": {
         "node": ">=4"
       "dev": true
     },
     "node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "dependencies": {
-        "locate-path": "^2.0.0"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/find-versions": {
       }
     },
     "node_modules/flatted": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
-      "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
       "dev": true
     },
     "node_modules/follow-redirects": {
-      "version": "1.14.4",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz",
-      "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==",
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
       "dev": true,
       "funding": [
         {
         "unicode-trie": "^0.3.0"
       }
     },
+    "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,
+      "peer": true,
+      "dependencies": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+      "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
     "node_modules/from2": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
       "dev": true,
       "dependencies": {
         "inherits": "^2.0.1",
       }
     },
     "node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz",
+      "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==",
       "dev": true,
       "dependencies": {
-        "minipass": "^3.0.0"
+        "minipass": "^5.0.0"
       },
       "engines": {
-        "node": ">= 8"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/fs.realpath": {
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
       "dev": true
     },
-    "node_modules/functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "node_modules/gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-      "dev": true,
-      "dependencies": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
-      }
-    },
-    "node_modules/gauge/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gauge/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": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+    "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,
+      "peer": true,
       "dependencies": {
-        "number-is-nan": "^1.0.0"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.0",
+        "functions-have-names": "^1.2.2"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/gauge/node_modules/string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+    "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,
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/gauge/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+    "node_modules/gauge": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+      "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
       "dev": true,
       "dependencies": {
-        "ansi-regex": "^2.0.0"
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.3",
+        "console-control-strings": "^1.1.0",
+        "has-unicode": "^2.0.1",
+        "signal-exit": "^3.0.7",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.5"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
     "node_modules/gensync": {
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
       "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
     "node_modules/get-stream": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
       "dev": true,
       "engines": {
         "node": ">=4"
       "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
       "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "get-intrinsic": "^1.1.1"
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/get-uri": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz",
+      "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==",
+      "dev": true,
+      "dependencies": {
+        "basic-ftp": "^5.0.2",
+        "data-uri-to-buffer": "^5.0.1",
+        "debug": "^4.3.4",
+        "fs-extra": "^8.1.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/getpass": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
         "semver": "^7.3.2",
         "serialize-error": "^7.0.1"
       },
-      "engines": {
-        "node": ">=10.0"
-      }
-    },
-    "node_modules/global-agent/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globalthis": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
-      "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
-      "dev": true,
-      "dependencies": {
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/got": {
-      "version": "11.8.2",
-      "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz",
-      "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==",
-      "dev": true,
-      "dependencies": {
-        "@sindresorhus/is": "^4.0.0",
-        "@szmarczak/http-timer": "^4.0.5",
-        "@types/cacheable-request": "^6.0.1",
-        "@types/responselike": "^1.0.0",
-        "cacheable-lookup": "^5.0.3",
-        "cacheable-request": "^7.0.1",
-        "decompress-response": "^6.0.0",
-        "http2-wrapper": "^1.0.0-beta.5.2",
-        "lowercase-keys": "^2.0.0",
-        "p-cancelable": "^2.0.0",
-        "responselike": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.19.0"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/got?sponsor=1"
-      }
-    },
-    "node_modules/got/node_modules/@sindresorhus/is": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz",
-      "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/is?sponsor=1"
-      }
-    },
-    "node_modules/got/node_modules/cacheable-request": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
-      "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
-      "dev": true,
-      "dependencies": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^4.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^6.0.1",
-        "responselike": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/got/node_modules/decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/got/node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "engines": {
+        "node": ">=10.0"
       }
     },
-    "node_modules/got/node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
-    },
-    "node_modules/got/node_modules/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true
-    },
-    "node_modules/got/node_modules/keyv": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
-      "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
+    "node_modules/global-agent/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
-        "json-buffer": "3.0.1"
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "node_modules/got/node_modules/lowercase-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=4"
       }
     },
-    "node_modules/got/node_modules/mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+    "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": ">=10"
+        "node": ">= 0.4"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/got/node_modules/normalize-url": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
-      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
       "dev": true,
-      "engines": {
-        "node": ">=10"
+      "peer": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/got/node_modules/p-cancelable": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
-      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/got/node_modules/responselike": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
-      "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+    "node_modules/got": {
+      "version": "11.8.6",
+      "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+      "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
       "dev": true,
       "dependencies": {
-        "lowercase-keys": "^2.0.0"
+        "@sindresorhus/is": "^4.0.0",
+        "@szmarczak/http-timer": "^4.0.5",
+        "@types/cacheable-request": "^6.0.1",
+        "@types/responselike": "^1.0.0",
+        "cacheable-lookup": "^5.0.3",
+        "cacheable-request": "^7.0.2",
+        "decompress-response": "^6.0.0",
+        "http2-wrapper": "^1.0.0-beta.5.2",
+        "lowercase-keys": "^2.0.0",
+        "p-cancelable": "^2.0.0",
+        "responselike": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/got?sponsor=1"
       }
     },
     "node_modules/graceful-fs": {
       "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
       "dev": true
     },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true
+    },
     "node_modules/gzip-size": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
       }
     },
     "node_modules/has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+      "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,
+      "peer": 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": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "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-symbol-support-x": {
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
       }
     },
     "node_modules/has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+      "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"
     "node_modules/has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
       "dev": true
     },
     "node_modules/hash.js": {
       }
     },
     "node_modules/hosted-git-info": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
-      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz",
+      "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==",
       "dev": true,
       "dependencies": {
-        "lru-cache": "^6.0.0"
+        "lru-cache": "^7.5.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/hosted-git-info/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
       }
     },
     "node_modules/html-encoding-sniffer": {
       "dev": true
     },
     "node_modules/http-cache-semantics": {
-      "version": "3.8.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
-      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
       "dev": true
     },
     "node_modules/http-errors": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "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": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
       },
       "engines": {
-        "node": ">= 0.6"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/http-errors/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
+    "node_modules/http-errors/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/http-proxy": {
       "version": "1.18.1",
       }
     },
     "node_modules/http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
       "dev": true,
       "dependencies": {
-        "@tootallnate/once": "1",
+        "@tootallnate/once": "2",
         "agent-base": "6",
         "debug": "4"
       },
         "node": ">= 6"
       }
     },
-    "node_modules/http-proxy-agent/node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
     "node_modules/http-server": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.0.tgz",
-      "integrity": "sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==",
+      "version": "14.1.1",
+      "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
+      "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
       "dev": true,
       "dependencies": {
         "basic-auth": "^2.0.1",
         "html-encoding-sniffer": "^3.0.0",
         "http-proxy": "^1.18.1",
         "mime": "^1.6.0",
-        "minimist": "^1.2.5",
+        "minimist": "^1.2.6",
         "opener": "^1.5.1",
         "portfinder": "^1.0.28",
         "secure-compare": "3.0.1",
       }
     },
     "node_modules/https-proxy-agent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
-      "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
       "dev": true,
       "dependencies": {
-        "agent-base": "5",
+        "agent-base": "6",
         "debug": "4"
       },
       "engines": {
-        "node": ">= 6.0.0"
+        "node": ">= 6"
       }
     },
     "node_modules/humanize-ms": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
       "dev": true,
       "dependencies": {
         "ms": "^2.0.0"
       }
     },
     "node_modules/ignore-walk": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
-      "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz",
+      "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==",
       "dev": true,
       "dependencies": {
-        "minimatch": "^3.0.4"
+        "minimatch": "^9.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/ignore-walk/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/ignore-walk/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/image-size": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz",
-      "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz",
+      "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==",
       "dev": true,
       "dependencies": {
         "queue": "6.0.2"
         "image-size": "bin/image-size.js"
       },
       "engines": {
-        "node": ">=12.0.0"
+        "node": ">=14.0.0"
       }
     },
     "node_modules/import-fresh": {
       "dev": true
     },
     "node_modules/internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+      "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "get-intrinsic": "^1.1.0",
+        "get-intrinsic": "^1.2.0",
         "has": "^1.0.3",
         "side-channel": "^1.0.4"
       },
     "node_modules/into-stream": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
-      "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
+      "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==",
       "dev": true,
       "dependencies": {
         "from2": "^2.1.1",
       }
     },
     "node_modules/ip": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
       "dev": true
     },
     "node_modules/is-arguments": {
         "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,
+      "peer": 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,
+      "peer": true,
       "dependencies": {
         "has-bigints": "^1.0.1"
       },
       "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
       "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-builtin-module": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+      "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
+      "dev": true,
+      "dependencies": {
+        "builtin-modules": "^3.3.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+      "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,
+      "peer": true,
       "engines": {
         "node": ">= 0.4"
       },
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
-      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+      "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
       "dev": true,
       "dependencies": {
         "has": "^1.0.3"
     "node_modules/is-lambda": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
-      "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
+      "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
       "dev": true
     },
     "node_modules/is-module": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
+      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
       "dev": true
     },
     "node_modules/is-natural-number": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
-      "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
+      "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==",
       "dev": true
     },
     "node_modules/is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
       "dev": true,
+      "peer": true,
       "engines": {
         "node": ">= 0.4"
       },
       }
     },
     "node_modules/is-number-object": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
-      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/is-shared-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
+      "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,
+      "peer": 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": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
       "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
       "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "has-symbols": "^1.0.2"
       },
         "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,
+      "peer": 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-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
       "dev": true
     },
     "node_modules/is-weakref": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
-      "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
+      "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,
+      "peer": true,
       "dependencies": {
-        "call-bind": "^1.0.0"
+        "call-bind": "^1.0.2"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/istanbul-lib-instrument": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.7.5",
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
         "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-coverage": "^3.2.0",
         "semver": "^6.3.0"
       },
       "engines": {
         "node": ">= 4"
       }
     },
+    "node_modules/jackspeak": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz",
+      "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==",
+      "dev": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
     "node_modules/jasmine": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.0.2.tgz",
-      "integrity": "sha512-YsrgxJQEggxzByYe4j68eQLOiQeSrPDYGv4sHhGBp3c6HHdq+uPXeAQ73kOAQpdLZ3/0zN7x/TZTloqeE1/qIA==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.0.1.tgz",
+      "integrity": "sha512-cLAGOzZyTaDF/T4J8AvBg3Jthp/CAFZNuzxMNBdc0IrNXMhbxxMIY7eLn+1hFjo+QJ0Pvj3ifahBCQDE6i08Ug==",
       "dev": true,
       "dependencies": {
-        "glob": "^7.1.6",
-        "jasmine-core": "^4.0.0"
+        "glob": "^10.2.2",
+        "jasmine-core": "~5.0.1"
       },
       "bin": {
         "jasmine": "bin/jasmine.js"
       }
     },
     "node_modules/jasmine-core": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.0.0.tgz",
-      "integrity": "sha512-tq24OCqHElgU9KDpb/8O21r1IfotgjIzalfW9eCmRR40LZpvwXT68iariIyayMwi0m98RDt16aljdbwK0sBMmQ==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.0.1.tgz",
+      "integrity": "sha512-D4bRej8CplwNtNGyTPD++cafJlZUphzZNV+MSAnbD3er4D0NjL4x9V+mu/SI+5129utnCBen23JwEuBZA9vlpQ==",
       "dev": true
     },
-    "node_modules/jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+    "node_modules/jasmine/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
       "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
+        "balanced-match": "^1.0.0"
       }
     },
-    "node_modules/jest-worker/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+    "node_modules/jasmine/node_modules/glob": {
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+      "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
       "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2",
+        "path-scurry": "^1.7.0"
+      },
+      "bin": {
+        "glob": "dist/cjs/src/bin.js"
+      },
       "engines": {
-        "node": ">=8"
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/jasmine/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/js-tokens": {
       }
     },
     "node_modules/json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
     "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz",
+      "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
     },
     "node_modules/json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
       "dev": true
     },
     "node_modules/json-schema-traverse": {
       "dev": true
     },
     "node_modules/json5": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
       "bin": {
         "json5": "lib/cli.js"
       },
     "node_modules/jsonfile": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
       "dev": true,
       "optionalDependencies": {
         "graceful-fs": "^4.1.6"
     "node_modules/jsonparse": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
       "dev": true,
       "engines": [
         "node >= 0.2.0"
       ]
     },
     "node_modules/jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
       "dev": true,
-      "engines": [
-        "node >=0.6.0"
-      ],
       "dependencies": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
+        "json-schema": "0.4.0",
         "verror": "1.10.0"
+      },
+      "engines": {
+        "node": ">=0.6.0"
       }
     },
     "node_modules/karma": {
-      "version": "6.3.12",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.12.tgz",
-      "integrity": "sha512-qwIG+oB2YmHx4hjvYSRMNzL3YWAJ9baHaLAxiP7biFNkfpwYTUTtPck0joFpucalNLzMr+7z/FX1uY/kl8DV9A==",
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz",
+      "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==",
       "dev": true,
       "dependencies": {
+        "@colors/colors": "1.5.0",
         "body-parser": "^1.19.0",
         "braces": "^3.0.2",
         "chokidar": "^3.5.1",
-        "colors": "1.4.0",
         "connect": "^3.7.0",
         "di": "^0.0.1",
         "dom-serialize": "^2.2.1",
         "http-proxy": "^1.18.1",
         "isbinaryfile": "^4.0.8",
         "lodash": "^4.17.21",
-        "log4js": "^6.3.0",
+        "log4js": "^6.4.1",
         "mime": "^2.5.2",
         "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.5",
         "qjobs": "^1.2.0",
         "range-parser": "^1.2.1",
         "rimraf": "^3.0.2",
-        "socket.io": "^4.2.0",
+        "socket.io": "^4.4.1",
         "source-map": "^0.6.1",
         "tmp": "^0.2.1",
         "ua-parser-js": "^0.7.30",
       }
     },
     "node_modules/karma-chrome-launcher": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
-      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz",
+      "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==",
       "dev": true,
       "dependencies": {
         "which": "^1.2.1"
       }
     },
     "node_modules/karma-coverage": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.1.0.tgz",
-      "integrity": "sha512-uIejpnArNFQIovB6EPsKO/T4XofELdJWXcA2ADXztFlKhHbr0Ws6ba7wKTMVWsIhEs4iJxdhQkCQrkkhFJSZCw==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz",
+      "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==",
       "dev": true,
       "dependencies": {
         "istanbul-lib-coverage": "^3.2.0",
-        "istanbul-lib-instrument": "^4.0.3",
+        "istanbul-lib-instrument": "^5.1.0",
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.1",
         "istanbul-reports": "^3.0.5",
       }
     },
     "node_modules/karma-jasmine": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz",
-      "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz",
+      "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==",
       "dev": true,
       "dependencies": {
-        "jasmine-core": "^3.6.0"
+        "jasmine-core": "^4.1.0"
       },
       "engines": {
-        "node": ">= 10"
+        "node": ">=12"
       },
       "peerDependencies": {
-        "karma": "*"
+        "karma": "^6.0.0"
       }
     },
     "node_modules/karma-jasmine/node_modules/jasmine-core": {
-      "version": "3.99.0",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz",
-      "integrity": "sha512-+ZDaJlEfRopINQqgE+hvzRyDIQDeKfqqTvF8RzXsvU1yE3pBDRud2+Qfh9WvGgRpuzqxyQJVI6Amy5XQ11r/3w==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz",
+      "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==",
       "dev": true
     },
     "node_modules/karma-sauce-launcher": {
       }
     },
     "node_modules/keyv": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
-      "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
       "dev": true,
       "dependencies": {
-        "json-buffer": "3.0.0"
+        "json-buffer": "3.0.1"
       }
     },
     "node_modules/lazystream": {
       }
     },
     "node_modules/lighthouse-logger": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz",
-      "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+      "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
       "dev": true,
       "dependencies": {
         "debug": "^2.6.9",
     "node_modules/lighthouse-logger/node_modules/ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
       "dev": true
     },
     "node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^5.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/lodash": {
     "node_modules/lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
       "dev": true
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
       "dev": true
     },
     "node_modules/lodash.defaults": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
-      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+      "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
       "dev": true
     },
     "node_modules/lodash.difference": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
-      "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+      "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
       "dev": true
     },
     "node_modules/lodash.flatten": {
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
-      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
       "dev": true
     },
     "node_modules/lodash.isobject": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
-      "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=",
+      "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==",
       "dev": true
     },
     "node_modules/lodash.isplainobject": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
       "dev": true
     },
     "node_modules/lodash.merge": {
     "node_modules/lodash.union": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
-      "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+      "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
       "dev": true
     },
     "node_modules/lodash.zip": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
-      "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=",
+      "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
       "dev": true
     },
     "node_modules/log-driver": {
       }
     },
     "node_modules/log4js": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz",
-      "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==",
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
+      "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
       "dev": true,
       "dependencies": {
-        "date-format": "^3.0.0",
-        "debug": "^4.1.1",
-        "flatted": "^2.0.1",
-        "rfdc": "^1.1.4",
-        "streamroller": "^2.2.4"
+        "date-format": "^4.0.14",
+        "debug": "^4.3.4",
+        "flatted": "^3.2.7",
+        "rfdc": "^1.3.0",
+        "streamroller": "^3.1.5"
       },
       "engines": {
         "node": ">=8.0"
       }
     },
-    "node_modules/log4js/node_modules/flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
-      "dev": true
-    },
     "node_modules/loglevel": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
-      "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
+      "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"
       }
     },
     "node_modules/lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
     "node_modules/lru-cache": {
       }
     },
     "node_modules/magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
       "dev": true,
       "dependencies": {
-        "sourcemap-codec": "^1.4.4"
+        "@jridgewell/sourcemap-codec": "^1.4.13"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
     "node_modules/make-dir": {
       }
     },
     "node_modules/make-fetch-happen": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
-      "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
+      "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
       "dev": true,
       "dependencies": {
-        "agentkeepalive": "^4.1.3",
-        "cacache": "^15.2.0",
+        "agentkeepalive": "^4.2.1",
+        "cacache": "^16.1.0",
         "http-cache-semantics": "^4.1.0",
-        "http-proxy-agent": "^4.0.1",
+        "http-proxy-agent": "^5.0.0",
         "https-proxy-agent": "^5.0.0",
         "is-lambda": "^1.0.1",
-        "lru-cache": "^6.0.0",
-        "minipass": "^3.1.3",
+        "lru-cache": "^7.7.1",
+        "minipass": "^3.1.6",
         "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^1.3.2",
+        "minipass-fetch": "^2.0.3",
         "minipass-flush": "^1.0.5",
         "minipass-pipeline": "^1.2.4",
-        "negotiator": "^0.6.2",
+        "negotiator": "^0.6.3",
         "promise-retry": "^2.0.1",
-        "socks-proxy-agent": "^6.0.0",
-        "ssri": "^8.0.0"
+        "socks-proxy-agent": "^7.0.0",
+        "ssri": "^9.0.0"
       },
       "engines": {
-        "node": ">= 10"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "node_modules/make-fetch-happen/node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+    "node_modules/make-fetch-happen/node_modules/@npmcli/fs": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
+      "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
       "dev": true,
       "dependencies": {
-        "debug": "4"
+        "@gar/promisify": "^1.1.3",
+        "semver": "^7.3.5"
       },
       "engines": {
-        "node": ">= 6.0.0"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "node_modules/make-fetch-happen/node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
+    "node_modules/make-fetch-happen/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
     },
-    "node_modules/make-fetch-happen/node_modules/https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+    "node_modules/make-fetch-happen/node_modules/cacache": {
+      "version": "16.1.3",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
+      "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
       "dev": true,
       "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
+        "@npmcli/fs": "^2.1.0",
+        "@npmcli/move-file": "^2.0.0",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.1.0",
+        "glob": "^8.0.1",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^7.7.1",
+        "minipass": "^3.1.6",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "mkdirp": "^1.0.4",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^9.0.0",
+        "tar": "^6.1.11",
+        "unique-filename": "^2.0.0"
       },
       "engines": {
-        "node": ">= 6"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "node_modules/marky": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz",
-      "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==",
-      "dev": true
+    "node_modules/make-fetch-happen/node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "node_modules/matched": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/matched/-/matched-5.0.1.tgz",
-      "integrity": "sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==",
+    "node_modules/make-fetch-happen/node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
       "dev": true,
       "dependencies": {
-        "glob": "^7.1.6",
-        "picomatch": "^2.2.1"
+        "minipass": "^3.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">= 8"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/glob": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^5.0.1",
+        "once": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=12"
       },
       "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true,
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/semver/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/ssri": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
+      "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/unique-filename": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
+      "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
+      "dev": true,
+      "dependencies": {
+        "unique-slug": "^3.0.0"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/make-fetch-happen/node_modules/unique-slug": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+      "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
+      "dev": true,
+      "dependencies": {
+        "imurmurhash": "^0.1.4"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
+    "node_modules/marky": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
+      "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
+      "dev": true
+    },
     "node_modules/matcher": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
         "source-map": "^0.5.6"
       }
     },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
     "node_modules/mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
       }
     },
     "node_modules/mime-db": {
-      "version": "1.50.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
-      "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "dev": true,
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/mime-types": {
-      "version": "2.1.33",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz",
-      "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==",
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dev": true,
       "dependencies": {
-        "mime-db": "1.50.0"
+        "mime-db": "1.52.0"
       },
       "engines": {
         "node": ">= 0.6"
       "dev": true
     },
     "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "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"
       }
     },
     "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "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/minipass": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
-      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
       "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
       "engines": {
         "node": ">=8"
       }
       "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
       "dev": true,
       "dependencies": {
-        "minipass": "^3.0.0"
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-collect/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minipass-fetch": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+      "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^3.1.6",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.1.2"
       },
       "engines": {
-        "node": ">= 8"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.13"
       }
     },
-    "node_modules/minipass-fetch": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
-      "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
+    "node_modules/minipass-fetch/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
       "dev": true,
       "dependencies": {
-        "minipass": "^3.1.0",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.0.0"
+        "yallist": "^4.0.0"
       },
       "engines": {
         "node": ">=8"
-      },
-      "optionalDependencies": {
-        "encoding": "^0.1.12"
       }
     },
     "node_modules/minipass-flush": {
         "node": ">= 8"
       }
     },
+    "node_modules/minipass-flush/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/minipass-json-stream": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
         "minipass": "^3.0.0"
       }
     },
+    "node_modules/minipass-json-stream/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/minipass-pipeline": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
         "node": ">=8"
       }
     },
+    "node_modules/minipass-pipeline/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/minipass-sized": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
         "node": ">=8"
       }
     },
+    "node_modules/minipass-sized/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/minizlib": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
         "node": ">= 8"
       }
     },
+    "node_modules/minizlib/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/mitt": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+      "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==",
+      "dev": true
+    },
     "node_modules/mkdirp": {
       "version": "0.5.5",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
       "dev": true
     },
     "node_modules/negotiator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "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/netmask": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+      "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
     "node_modules/next-tick": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
       }
     },
     "node_modules/node-fetch": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
-      "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==",
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
+      "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
       "dev": true,
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
       "engines": {
         "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
       }
     },
     "node_modules/node-gyp": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
-      "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
+      "version": "9.3.1",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz",
+      "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==",
       "dev": true,
       "dependencies": {
         "env-paths": "^2.2.0",
         "glob": "^7.1.4",
-        "graceful-fs": "^4.2.3",
-        "nopt": "^5.0.0",
-        "npmlog": "^4.1.2",
-        "request": "^2.88.2",
+        "graceful-fs": "^4.2.6",
+        "make-fetch-happen": "^10.0.3",
+        "nopt": "^6.0.0",
+        "npmlog": "^6.0.0",
         "rimraf": "^3.0.2",
-        "semver": "^7.3.2",
-        "tar": "^6.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.2",
         "which": "^2.0.2"
       },
       "bin": {
         "node-gyp": "bin/node-gyp.js"
       },
       "engines": {
-        "node": ">= 10.12.0"
+        "node": "^12.13 || ^14.13 || >=16"
       }
     },
     "node_modules/node-gyp/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       }
     },
     "node_modules/node-releases": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
-      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+      "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
       "dev": true
     },
     "node_modules/nopt": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+      "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
       "dev": true,
       "dependencies": {
-        "abbrev": "1"
+        "abbrev": "^1.0.0"
       },
       "bin": {
         "nopt": "bin/nopt.js"
       },
       "engines": {
-        "node": ">=6"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/normalize-package-data": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz",
+      "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==",
+      "dev": true,
+      "dependencies": {
+        "hosted-git-info": "^6.0.0",
+        "is-core-module": "^2.8.1",
+        "semver": "^7.3.5",
+        "validate-npm-package-license": "^3.0.4"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/normalize-package-data/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/normalize-path": {
       }
     },
     "node_modules/normalize-url": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
-      "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
       "dev": true,
-      "dependencies": {
-        "prepend-http": "^2.0.0",
-        "query-string": "^5.0.1",
-        "sort-keys": "^2.0.0"
-      },
       "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/normalize-url/node_modules/sort-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
-      "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
-      "dev": true,
-      "dependencies": {
-        "is-plain-obj": "^1.0.0"
+        "node": ">=10"
       },
-      "engines": {
-        "node": ">=4"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/npm-bundled": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
-      "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz",
+      "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==",
       "dev": true,
       "dependencies": {
-        "npm-normalize-package-bin": "^1.0.1"
+        "npm-normalize-package-bin": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/npm-conf": {
     "node_modules/npm-conf/node_modules/pify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/npm-install-checks": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
-      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz",
+      "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==",
       "dev": true,
       "dependencies": {
         "semver": "^7.1.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/npm-install-checks/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       }
     },
     "node_modules/npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
-      "dev": true
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+      "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
     },
     "node_modules/npm-package-arg": {
-      "version": "8.1.5",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
-      "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz",
+      "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==",
       "dev": true,
       "dependencies": {
-        "hosted-git-info": "^4.0.1",
-        "semver": "^7.3.4",
-        "validate-npm-package-name": "^3.0.0"
+        "hosted-git-info": "^6.0.0",
+        "proc-log": "^3.0.0",
+        "semver": "^7.3.5",
+        "validate-npm-package-name": "^5.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/npm-package-arg/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       }
     },
     "node_modules/npm-packlist": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz",
-      "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz",
+      "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==",
       "dev": true,
       "dependencies": {
-        "glob": "^7.1.6",
-        "ignore-walk": "^3.0.3",
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      },
-      "bin": {
-        "npm-packlist": "bin/index.js"
+        "ignore-walk": "^6.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/npm-pick-manifest": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
-      "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz",
+      "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==",
       "dev": true,
       "dependencies": {
-        "npm-install-checks": "^4.0.0",
-        "npm-normalize-package-bin": "^1.0.1",
-        "npm-package-arg": "^8.1.2",
-        "semver": "^7.3.4"
+        "npm-install-checks": "^6.0.0",
+        "npm-normalize-package-bin": "^3.0.0",
+        "npm-package-arg": "^10.0.0",
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/npm-pick-manifest/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       }
     },
     "node_modules/npm-registry-fetch": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz",
-      "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==",
+      "version": "14.0.5",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz",
+      "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==",
       "dev": true,
       "dependencies": {
-        "make-fetch-happen": "^9.0.1",
-        "minipass": "^3.1.3",
-        "minipass-fetch": "^1.3.0",
+        "make-fetch-happen": "^11.0.0",
+        "minipass": "^5.0.0",
+        "minipass-fetch": "^3.0.0",
         "minipass-json-stream": "^1.0.1",
-        "minizlib": "^2.0.0",
-        "npm-package-arg": "^8.0.0"
+        "minizlib": "^2.1.2",
+        "npm-package-arg": "^10.0.0",
+        "proc-log": "^3.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/npm-registry-fetch/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": {
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+      "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
+      "dev": true,
+      "dependencies": {
+        "agentkeepalive": "^4.2.1",
+        "cacache": "^17.0.0",
+        "http-cache-semantics": "^4.1.1",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^7.7.1",
+        "minipass": "^5.0.0",
+        "minipass-fetch": "^3.0.0",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.3",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^7.0.0",
+        "ssri": "^10.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/npm-registry-fetch/node_modules/minipass-fetch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz",
+      "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^5.0.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.1.2"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.13"
       }
     },
     "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": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
       "dev": true,
       "dependencies": {
         "path-key": "^2.0.0"
     "node_modules/npm-run-path/node_modules/path-key": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+      "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
       "dev": true,
       "dependencies": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
-      }
-    },
-    "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": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true,
+        "are-we-there-yet": "^3.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^4.0.3",
+        "set-blocking": "^2.0.0"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
     "node_modules/oauth-sign": {
       }
     },
     "node_modules/object-inspect": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-      "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+      "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.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "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,
+      "peer": true,
       "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "has-symbols": "^1.0.3",
         "object-keys": "^1.1.1"
       },
       "engines": {
       }
     },
     "node_modules/object.values": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
-      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
+      "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,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/p-cancelable": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
-      "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/p-event": {
     "node_modules/p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
       "dev": true,
       "engines": {
         "node": ">=4"
     "node_modules/p-is-promise": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
-      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
+      "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==",
       "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==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
       "dependencies": {
-        "p-try": "^1.0.0"
+        "yocto-queue": "^0.1.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
       "dependencies": {
-        "p-limit": "^1.1.0"
+        "p-limit": "^3.0.2"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/p-map": {
       }
     },
     "node_modules/p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=6"
       }
     },
-    "node_modules/pacote": {
-      "version": "11.3.5",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz",
-      "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==",
+    "node_modules/pac-proxy-agent": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz",
+      "integrity": "sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==",
       "dev": true,
       "dependencies": {
-        "@npmcli/git": "^2.1.0",
-        "@npmcli/installed-package-contents": "^1.0.6",
-        "@npmcli/promise-spawn": "^1.2.0",
-        "@npmcli/run-script": "^1.8.2",
-        "cacache": "^15.0.5",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "infer-owner": "^1.0.4",
-        "minipass": "^3.1.3",
-        "mkdirp": "^1.0.3",
-        "npm-package-arg": "^8.0.1",
-        "npm-packlist": "^2.1.4",
-        "npm-pick-manifest": "^6.0.0",
-        "npm-registry-fetch": "^11.0.0",
-        "promise-retry": "^2.0.1",
-        "read-package-json-fast": "^2.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^8.0.1",
-        "tar": "^6.1.0"
+        "agent-base": "^7.0.2",
+        "debug": "^4.3.4",
+        "get-uri": "^6.0.1",
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.0",
+        "pac-resolver": "^6.0.1",
+        "socks-proxy-agent": "^8.0.1"
       },
-      "bin": {
-        "pacote": "lib/bin.js"
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/agent-base": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.3.4"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">= 14"
       }
     },
-    "node_modules/pacote/node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+    "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz",
+      "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.0.1",
+        "debug": "^4.3.4",
+        "socks": "^2.7.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-resolver": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-6.0.1.tgz",
+      "integrity": "sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ==",
       "dev": true,
+      "dependencies": {
+        "degenerator": "^4.0.1",
+        "ip": "^1.1.5",
+        "netmask": "^2.0.2"
+      },
       "engines": {
-        "node": ">=10"
+        "node": ">= 14"
       }
     },
-    "node_modules/pacote/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
+    "node_modules/pac-resolver/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/pacote": {
+      "version": "15.2.0",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz",
+      "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==",
+      "dev": true,
+      "dependencies": {
+        "@npmcli/git": "^4.0.0",
+        "@npmcli/installed-package-contents": "^2.0.1",
+        "@npmcli/promise-spawn": "^6.0.1",
+        "@npmcli/run-script": "^6.0.0",
+        "cacache": "^17.0.0",
+        "fs-minipass": "^3.0.0",
+        "minipass": "^5.0.0",
+        "npm-package-arg": "^10.0.0",
+        "npm-packlist": "^7.0.0",
+        "npm-pick-manifest": "^8.0.0",
+        "npm-registry-fetch": "^14.0.0",
+        "proc-log": "^3.0.0",
+        "promise-retry": "^2.0.1",
+        "read-package-json": "^6.0.0",
+        "read-package-json-fast": "^3.0.0",
+        "sigstore": "^1.3.0",
+        "ssri": "^10.0.0",
+        "tar": "^6.1.11"
+      },
       "bin": {
-        "mkdirp": "bin/cmd.js"
+        "pacote": "lib/bin.js"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/pako": {
         "node": ">=6"
       }
     },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
     "node_modules/parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
       }
     },
     "node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/path-is-absolute": {
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
+    "node_modules/path-scurry": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz",
+      "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^9.1.1",
+        "minipass": "^5.0.0 || ^6.0.2"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "9.1.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz",
+      "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==",
+      "dev": true,
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/pend": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
       "dev": true
     },
     "node_modules/performance-now": {
       "dev": true
     },
     "node_modules/picomatch": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
       "engines": {
         "node": ">=8.6"
     "node_modules/pinkie": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "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": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
       "dev": true,
       "dependencies": {
         "pinkie": "^2.0.0"
         "node": ">=0.10.0"
       }
     },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/portfinder": {
       "version": "1.0.28",
       "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
     "node_modules/prepend-http": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
-    "node_modules/printj": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
-      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
+    "node_modules/prettier": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true,
       "bin": {
-        "printj": "bin/printj.njs"
+        "prettier": "bin-prettier.js"
       },
       "engines": {
-        "node": ">=0.8"
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/proc-log": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+      "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+      "dev": true,
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/process-nextick-args": {
     "node_modules/promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
       "dev": true
     },
     "node_modules/promise-retry": {
     "node_modules/proto-list": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
-      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+      "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
       "dev": true
     },
+    "node_modules/proxy-agent": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.2.1.tgz",
+      "integrity": "sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "^4.3.4",
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.0",
+        "lru-cache": "^7.14.1",
+        "pac-proxy-agent": "^6.0.3",
+        "proxy-from-env": "^1.1.0",
+        "socks-proxy-agent": "^8.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/agent-base": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/http-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/https-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/socks-proxy-agent": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz",
+      "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==",
+      "dev": true,
+      "dependencies": {
+        "agent-base": "^7.0.1",
+        "debug": "^4.3.4",
+        "socks": "^2.7.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
     "node_modules/pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
       "dev": true
     },
     "node_modules/psl": {
         "node": ">=6"
       }
     },
+    "node_modules/puppeteer": {
+      "version": "20.6.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.6.0.tgz",
+      "integrity": "sha512-D/kkEIpDFRqpLOcCoNNdXI+IUcoD1FmdlWteT4FFPOhNLC46urmItMfQDKSwk2NJoO38ncgCQe5XEQ3QHD+piA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "dependencies": {
+        "@puppeteer/browsers": "1.4.1",
+        "cosmiconfig": "8.2.0",
+        "puppeteer-core": "20.6.0"
+      },
+      "engines": {
+        "node": ">=16.3.0"
+      }
+    },
     "node_modules/puppeteer-core": {
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.5.0.tgz",
         "node": ">=10.18.1"
       }
     },
-    "node_modules/puppeteer-core/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+    "node_modules/puppeteer-core/node_modules/agent-base": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
+      "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
       "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">= 6.0.0"
       }
     },
-    "node_modules/puppeteer-core/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+    "node_modules/puppeteer-core/node_modules/https-proxy-agent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
+      "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
       "dev": true,
       "dependencies": {
-        "p-locate": "^4.1.0"
+        "agent-base": "5",
+        "debug": "4"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">= 6.0.0"
       }
     },
-    "node_modules/puppeteer-core/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+    "node_modules/puppeteer-core/node_modules/ws": {
+      "version": "7.5.9",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
       "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
       "engines": {
-        "node": ">=6"
+        "node": ">=8.3.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
       },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
       }
     },
-    "node_modules/puppeteer-core/node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
+    "node_modules/puppeteer/node_modules/devtools-protocol": {
+      "version": "0.0.1135028",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1135028.tgz",
+      "integrity": "sha512-jEcNGrh6lOXNRJvZb9RjeevtZGrgugPKSMJZxfyxWQnhlKawMPhMtk/dfC+Z/6xNXExlzTKlY5LzIAK/fRpQIw==",
+      "dev": true
     },
-    "node_modules/puppeteer-core/node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+    "node_modules/puppeteer/node_modules/puppeteer-core": {
+      "version": "20.6.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.6.0.tgz",
+      "integrity": "sha512-vUE6VnqvOHX1ABssTxtzTJUzEJrTL49DmXflSvlRIcolzOISVni1niI5/oWsDxzyRVE9sfwe8QqFbsWozs5RPA==",
       "dev": true,
       "dependencies": {
-        "find-up": "^4.0.0"
+        "@puppeteer/browsers": "1.4.1",
+        "chromium-bidi": "0.4.11",
+        "cross-fetch": "3.1.6",
+        "debug": "4.3.4",
+        "devtools-protocol": "0.0.1135028",
+        "ws": "8.13.0"
+      },
+      "engines": {
+        "node": ">=16.3.0"
+      },
+      "peerDependencies": {
+        "typescript": ">= 4.7.4"
       },
-      "engines": {
-        "node": ">=8"
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/puppeteer-core/node_modules/ws": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
-      "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
+    "node_modules/puppeteer/node_modules/ws": {
+      "version": "8.13.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
       "dev": true,
       "engines": {
-        "node": ">=8.3.0"
+        "node": ">=10.0.0"
       },
       "peerDependencies": {
         "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
+        "utf-8-validate": ">=5.0.2"
       },
       "peerDependenciesMeta": {
         "bufferutil": {
       }
     },
     "node_modules/qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
       "dev": true,
       "engines": {
         "node": ">=0.6"
         "inherits": "~2.0.3"
       }
     },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "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/quick-lru": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
       }
     },
     "node_modules/raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dev": true,
       "dependencies": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
         "iconv-lite": "0.4.24",
         "unpipe": "1.0.0"
       },
         "node": ">= 0.8"
       }
     },
+    "node_modules/read-package-json": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz",
+      "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^10.2.2",
+        "json-parse-even-better-errors": "^3.0.0",
+        "normalize-package-data": "^5.0.0",
+        "npm-normalize-package-bin": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/read-package-json-fast": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz",
-      "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+      "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
       "dev": true,
       "dependencies": {
-        "json-parse-even-better-errors": "^2.3.0",
-        "npm-normalize-package-bin": "^1.0.1"
+        "json-parse-even-better-errors": "^3.0.0",
+        "npm-normalize-package-bin": "^3.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/read-package-json/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/read-package-json/node_modules/glob": {
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz",
+      "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2",
+        "path-scurry": "^1.7.0"
+      },
+      "bin": {
+        "glob": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/read-package-json/node_modules/minimatch": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+      "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/readable-stream": {
       }
     },
     "node_modules/readdir-glob": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz",
-      "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
+      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
       "dev": true,
       "dependencies": {
-        "minimatch": "^3.0.4"
+        "minimatch": "^5.1.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/readdirp": {
       "dev": true
     },
     "node_modules/regenerate-unicode-properties": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
-      "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+      "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
       "dev": true,
       "dependencies": {
         "regenerate": "^1.4.2"
       "dev": true
     },
     "node_modules/regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+      "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
       "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.8.4"
       }
     },
     "node_modules/regexp.prototype.flags": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+      "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
+        "define-properties": "^1.2.0",
+        "functions-have-names": "^1.2.3"
       },
       "engines": {
         "node": ">= 0.4"
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/regexpp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
     "node_modules/regexpu-core": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
-      "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
       "dev": true,
       "dependencies": {
+        "@babel/regjsgen": "^0.8.0",
         "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^9.0.0",
-        "regjsgen": "^0.5.2",
-        "regjsparser": "^0.7.0",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
         "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.0.0"
+        "unicode-match-property-value-ecmascript": "^2.1.0"
       },
       "engines": {
         "node": ">=4"
       }
     },
-    "node_modules/regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
-      "dev": true
-    },
     "node_modules/regjsparser": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
-      "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
       "dev": true,
       "dependencies": {
         "jsesc": "~0.5.0"
     "node_modules/regjsparser/node_modules/jsesc": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
       "dev": true,
       "bin": {
         "jsesc": "bin/jsesc"
       "dev": true
     },
     "node_modules/resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "version": "1.22.2",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
       "dev": true,
       "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
+        "is-core-module": "^2.11.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/responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+      "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
       "dev": true,
       "dependencies": {
-        "lowercase-keys": "^1.0.0"
+        "lowercase-keys": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/resq": {
-      "version": "1.10.1",
-      "resolved": "https://registry.npmjs.org/resq/-/resq-1.10.1.tgz",
-      "integrity": "sha512-zhp1iyUH02MLciv3bIM2bNtTFx/fqRsK4Jk73jcPqp00d/sMTTjOtjdTMAcgjrQKGx5DvQ/HSpeqaMW0atGRJA==",
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz",
+      "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==",
       "dev": true,
       "dependencies": {
         "fast-deep-equal": "^2.0.1"
     "node_modules/resq/node_modules/fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
       "dev": true
     },
     "node_modules/restructure": {
     "node_modules/retry": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
       "dev": true,
       "engines": {
         "node": ">= 4"
       }
     },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/rfdc": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
       "dev": true
     },
     "node_modules/rollup": {
-      "version": "2.66.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.1.tgz",
-      "integrity": "sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==",
+      "version": "3.25.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz",
+      "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==",
       "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
       },
       "engines": {
-        "node": ">=10.0.0"
+        "node": ">=14.18.0",
+        "npm": ">=8.0.0"
       },
       "optionalDependencies": {
         "fsevents": "~2.3.2"
       }
     },
     "node_modules/rollup-plugin-filesize": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-9.1.2.tgz",
-      "integrity": "sha512-m2fE9hFaKgWKisJzyWXctOFKlgMRelo/58HgeC0lXUK/qykxiqkr6bsrotlvo2bvrwPsjgT7scNdQSr6qtl37A==",
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-10.0.0.tgz",
+      "integrity": "sha512-JAYYhzCcmGjmCzo3LEHSDE3RAPHKIeBdpqRhiyZSv5o/3wFhktUOzYAWg/uUKyEu5dEaVaql6UOmaqHx1qKrZA==",
       "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.13.8",
         "colors": "1.4.0",
         "filesize": "^6.1.0",
         "gzip-size": "^6.0.0",
-        "pacote": "^11.2.7",
+        "pacote": "^15.1.1",
         "terser": "^5.6.0"
       },
       "engines": {
-        "node": ">=10.0.0"
+        "node": ">=16.0.0"
       }
     },
-    "node_modules/rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
-      "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "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"
+        }
+      ],
       "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.0.0"
+        "queue-microtask": "^1.2.2"
       }
     },
     "node_modules/safe-buffer": {
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true
     },
+    "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,
+      "peer": 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",
     "node_modules/semver-compare": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
       "dev": true
     },
     "node_modules/semver-regex": {
     "node_modules/semver-truncate": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz",
-      "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=",
+      "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==",
       "dev": true,
       "dependencies": {
         "semver": "^5.3.0"
       }
     },
     "node_modules/serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
       "dev": true,
       "dependencies": {
         "randombytes": "^2.1.0"
     "node_modules/set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
       "dev": true
     },
     "node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
       "dev": true
     },
     "node_modules/shallow-copy": {
       }
     },
     "node_modules/signal-exit": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
-      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
+      "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/sigstore": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.6.0.tgz",
+      "integrity": "sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g==",
+      "dev": true,
+      "dependencies": {
+        "@sigstore/protobuf-specs": "^0.1.0",
+        "@sigstore/tuf": "^1.0.0",
+        "make-fetch-happen": "^11.0.1",
+        "tuf-js": "^1.1.3"
+      },
+      "bin": {
+        "sigstore": "bin/sigstore.js"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/sigstore/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/sigstore/node_modules/make-fetch-happen": {
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+      "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
+      "dev": true,
+      "dependencies": {
+        "agentkeepalive": "^4.2.1",
+        "cacache": "^17.0.0",
+        "http-cache-semantics": "^4.1.1",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^7.7.1",
+        "minipass": "^5.0.0",
+        "minipass-fetch": "^3.0.0",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.3",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^7.0.0",
+        "ssri": "^10.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/sigstore/node_modules/minipass-fetch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz",
+      "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^5.0.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.1.2"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.13"
+      }
+    },
     "node_modules/smart-buffer": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
         "npm": ">= 3.0.0"
       }
     },
+    "node_modules/smob": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz",
+      "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==",
+      "dev": true
+    },
     "node_modules/snake-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
       }
     },
     "node_modules/socket.io": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz",
-      "integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==",
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz",
+      "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==",
       "dev": true,
       "dependencies": {
         "accepts": "~1.3.4",
         "base64id": "~2.0.0",
         "debug": "~4.3.2",
-        "engine.io": "~6.0.0",
-        "socket.io-adapter": "~2.3.2",
-        "socket.io-parser": "~4.0.4"
+        "engine.io": "~6.4.2",
+        "socket.io-adapter": "~2.5.2",
+        "socket.io-parser": "~4.2.4"
       },
       "engines": {
         "node": ">=10.0.0"
       }
     },
     "node_modules/socket.io-adapter": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz",
-      "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==",
-      "dev": true
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
+      "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
+      "dev": true,
+      "dependencies": {
+        "ws": "~8.11.0"
+      }
     },
     "node_modules/socket.io-parser": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
-      "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
       "dev": true,
       "dependencies": {
-        "@types/component-emitter": "^1.2.10",
-        "component-emitter": "~1.3.0",
+        "@socket.io/component-emitter": "~3.1.0",
         "debug": "~4.3.1"
       },
       "engines": {
       }
     },
     "node_modules/socks": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz",
-      "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
       "dev": true,
       "dependencies": {
-        "ip": "^1.1.5",
-        "smart-buffer": "^4.1.0"
+        "ip": "^2.0.0",
+        "smart-buffer": "^4.2.0"
       },
       "engines": {
         "node": ">= 10.13.0",
       }
     },
     "node_modules/socks-proxy-agent": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz",
-      "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
       "dev": true,
       "dependencies": {
         "agent-base": "^6.0.2",
-        "debug": "^4.3.1",
-        "socks": "^2.6.1"
+        "debug": "^4.3.3",
+        "socks": "^2.6.2"
       },
       "engines": {
         "node": ">= 10"
       }
     },
-    "node_modules/socks-proxy-agent/node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
     "node_modules/sort-keys": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
       "dev": true,
       "dependencies": {
         "is-plain-obj": "^1.0.0"
     "node_modules/sort-keys-length": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
-      "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+      "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==",
       "dev": true,
       "dependencies": {
         "sort-keys": "^1.0.0"
       "deprecated": "Please use @jridgewell/sourcemap-codec instead",
       "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/sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
       }
     },
     "node_modules/ssri": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
-      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz",
+      "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==",
       "dev": true,
       "dependencies": {
-        "minipass": "^3.1.1"
+        "minipass": "^5.0.0"
       },
       "engines": {
-        "node": ">= 8"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/static-eval": {
       }
     },
     "node_modules/streamroller": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz",
-      "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==",
-      "deprecated": "2.x is no longer supported. Please upgrade to 3.x or higher.",
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
+      "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
       "dev": true,
       "dependencies": {
-        "date-format": "^2.1.0",
-        "debug": "^4.1.1",
+        "date-format": "^4.0.14",
+        "debug": "^4.3.4",
         "fs-extra": "^8.1.0"
       },
       "engines": {
         "node": ">=8.0"
       }
     },
-    "node_modules/streamroller/node_modules/date-format": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
-      "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
-      "deprecated": "2.x is no longer supported. Please upgrade to 4.x or higher.",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
     "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": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
       "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "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,
+      "peer": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+      "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,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
+        "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.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+      "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,
+      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
         "node": ">=8"
       }
     },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
       "dev": true,
+      "peer": true,
       "engines": {
         "node": ">=4"
       }
     "node_modules/strip-eof": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
         "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/svgdom": {
-      "version": "0.1.10",
-      "resolved": "https://registry.npmjs.org/svgdom/-/svgdom-0.1.10.tgz",
-      "integrity": "sha512-MMx2owmn+V8xYc+29MWVEsKZi7ZGxvnV4U/QNyX+miSH4F+veOL7gFO86kKawIfx1K+CogSK9ZAtod7dsf8LSA==",
+      "version": "0.1.14",
+      "resolved": "https://registry.npmjs.org/svgdom/-/svgdom-0.1.14.tgz",
+      "integrity": "sha512-RsaFHupZ92NLkpuszq2t04XUI6biqh/Q+R7ntpC0FteTs6zK1lP7jHk++p2N9IBfpi5iU4J/tkKTjIzDmKdOZw==",
       "dev": true,
       "dependencies": {
         "fontkit": "^1.8.1",
-        "image-size": "^1.0.0",
+        "image-size": "^1.0.2",
         "sax": "^1.2.4"
       },
       "funding": {
       }
     },
     "node_modules/tar": {
-      "version": "6.1.11",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-      "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+      "version": "6.1.15",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
+      "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
       "dev": true,
       "dependencies": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
+        "minipass": "^5.0.0",
         "minizlib": "^2.1.1",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
       },
       "engines": {
-        "node": ">= 10"
+        "node": ">=10"
       }
     },
     "node_modules/tar-fs": {
       }
     },
     "node_modules/tar-fs/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "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",
         "node": ">=10"
       }
     },
+    "node_modules/tar/node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/tar/node_modules/mkdirp": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
       }
     },
     "node_modules/terser": {
-      "version": "5.9.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz",
-      "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==",
+      "version": "5.17.7",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz",
+      "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==",
       "dev": true,
       "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
         "commander": "^2.20.0",
-        "source-map": "~0.7.2",
         "source-map-support": "~0.5.20"
       },
       "bin": {
         "node": ">=10"
       }
     },
-    "node_modules/terser/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+    "node_modules/terser/node_modules/acorn": {
+      "version": "8.8.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
       "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
       "engines": {
-        "node": ">= 8"
+        "node": ">=0.4.0"
       }
     },
     "node_modules/text-table": {
     "node_modules/timed-out": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+      "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "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/tr46": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
       "dev": true
     },
     "node_modules/trim-repeated": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+      "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
       "dev": true,
       "dependencies": {
         "escape-string-regexp": "^1.0.2"
       }
     },
     "node_modules/tsconfig-paths": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
-      "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
+      "version": "3.14.2",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
+        "json5": "^1.0.2",
+        "minimist": "^1.2.6",
         "strip-bom": "^3.0.0"
       }
     },
     "node_modules/tsconfig-paths/node_modules/json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "minimist": "^1.2.0"
       },
       }
     },
     "node_modules/tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz",
+      "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==",
       "dev": true
     },
+    "node_modules/tuf-js": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz",
+      "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==",
+      "dev": true,
+      "dependencies": {
+        "@tufjs/models": "1.0.4",
+        "debug": "^4.3.4",
+        "make-fetch-happen": "^11.1.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/tuf-js/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/tuf-js/node_modules/make-fetch-happen": {
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+      "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
+      "dev": true,
+      "dependencies": {
+        "agentkeepalive": "^4.2.1",
+        "cacache": "^17.0.0",
+        "http-cache-semantics": "^4.1.1",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^7.7.1",
+        "minipass": "^5.0.0",
+        "minipass-fetch": "^3.0.0",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.3",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^7.0.0",
+        "ssri": "^10.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/tuf-js/node_modules/minipass-fetch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz",
+      "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==",
+      "dev": true,
+      "dependencies": {
+        "minipass": "^5.0.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.1.2"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.13"
+      }
+    },
     "node_modules/tunnel": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
         "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,
+      "peer": 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",
       "dev": true
     },
     "node_modules/typescript": {
-      "version": "4.5.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
-      "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz",
+      "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
       },
       "engines": {
-        "node": ">=4.2.0"
+        "node": ">=14.17"
       }
     },
     "node_modules/ua-parser-js": {
-      "version": "0.7.31",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
-      "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
+      "version": "0.7.35",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz",
+      "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==",
       "dev": true,
       "funding": [
         {
       }
     },
     "node_modules/unbox-primitive": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
-      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
-        "function-bind": "^1.1.1",
-        "has-bigints": "^1.0.1",
-        "has-symbols": "^1.0.2",
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
         "which-boxed-primitive": "^1.0.2"
       },
       "funding": {
       }
     },
     "node_modules/unicode-match-property-value-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/unicode-property-aliases-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "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==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+      "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
       "dev": true,
       "dependencies": {
-        "unique-slug": "^2.0.0"
+        "unique-slug": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.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==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+      "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
       "dev": true,
       "dependencies": {
         "imurmurhash": "^0.1.4"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/universalify": {
         "node": ">= 0.8"
       }
     },
+    "node_modules/update-browserslist-db": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+      "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
     "node_modules/upper-case": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
     "node_modules/url-parse-lax": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
       "dev": true,
       "dependencies": {
         "prepend-http": "^2.0.0"
     "node_modules/url-to-options": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
-      "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
+      "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==",
       "dev": true,
       "engines": {
         "node": ">= 4"
         "uuid": "bin/uuid"
       }
     },
-    "node_modules/v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
-      "dev": true
+    "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/validate-npm-package-name": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
-      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz",
+      "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==",
       "dev": true,
       "dependencies": {
-        "builtins": "^1.0.3"
+        "builtins": "^5.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
       "dev": true,
       "engines": {
         "node": ">= 0.8"
         "extsprintf": "^1.2.0"
       }
     },
+    "node_modules/vm2": {
+      "version": "3.9.19",
+      "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz",
+      "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.7.0",
+        "acorn-walk": "^8.2.0"
+      },
+      "bin": {
+        "vm2": "bin/vm2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/vm2/node_modules/acorn": {
+      "version": "8.8.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/vm2/node_modules/acorn-walk": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/void-elements": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
       "dev": true
     },
     "node_modules/whatwg-encoding": {
     "node_modules/whatwg-url": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
       "dev": true,
       "dependencies": {
         "tr46": "~0.0.3",
       "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
       "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "is-bigint": "^1.0.1",
         "is-boolean-object": "^1.1.0",
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "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,
+      "peer": 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/wide-align": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
     "node_modules/wrap-ansi/node_modules/ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "dev": true
     },
     "node_modules/ws": {
-      "version": "8.2.3",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-      "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
       "dev": true,
       "engines": {
         "node": ">=10.0.0"
       "dev": true
     },
     "node_modules/yargs": {
-      "version": "17.3.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
-      "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
       "dev": true,
       "dependencies": {
-        "cliui": "^7.0.2",
+        "cliui": "^8.0.1",
         "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
         "string-width": "^4.2.3",
         "y18n": "^5.0.5",
-        "yargs-parser": "^21.0.0"
+        "yargs-parser": "^21.1.1"
       },
       "engines": {
         "node": ">=12"
         "node": ">=10"
       }
     },
+    "node_modules/yargs/node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/yargs/node_modules/yargs-parser": {
-      "version": "21.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
-      "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==",
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
       "dev": true,
       "engines": {
         "node": ">=12"
     "node_modules/yauzl": {
       "version": "2.10.0",
       "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
       "dev": true,
       "dependencies": {
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
       }
     },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/zip-stream": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
       }
     },
     "node_modules/zip-stream/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "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",
index f6945f239009a82c673e766993908c42794e9625..53ecb646f4e9ff723427b933f8a47ed3e8d81fc2 100644 (file)
@@ -1,6 +1,7 @@
 {
   "name": "@svgdotjs/svg.js",
   "version": "3.2.0",
+  "type": "module",
   "description": "A lightweight library for manipulating and animating SVG.",
   "url": "https://svgjs.dev/",
   "homepage": "https://svgjs.dev/",
   },
   "typings": "./svg.js.d.ts",
   "scripts": {
-    "build": "npm run fix && npm run rollup",
+    "build": "npm run format && npm run rollup",
     "build:polyfills": "npx rollup -c .config/rollup.polyfills.js",
     "build:tests": "npx rollup -c .config/rollup.tests.js",
     "fix": "npx eslint ./src --fix",
     "lint": "npx eslint ./src",
+    "prettier": "npx prettier --write .",
+    "format": "npm run fix && npm run prettier",
     "rollup": "npx rollup -c .config/rollup.config.js",
     "server": "npx http-server ./ -d",
-    "test": "npx karma start .config/karma.conf.js || true",
-    "test:ci": "karma start .config/karma.conf.saucelabs.js",
-    "test:svgdom": "node -r esm ./spec/runSVGDomTest.js || true",
+    "test": "npx karma start .config/karma.conf.cjs || true",
+    "test:ci": "karma start .config/karma.conf.saucelabs.cjs",
+    "test:svgdom": "node ./spec/runSVGDomTest.js || true",
     "zip": "zip -j dist/svg.js.zip -- LICENSE.txt README.md CHANGELOG.md dist/svg.js dist/svg.js.map dist/svg.min.js dist/svg.min.js.map dist/polyfills.js dist/polyfillsIE.js",
     "prepublishOnly": "rm -rf ./dist && npm run build && npm run build:polyfills && npm test",
     "postpublish": "npm run zip",
     "checkTests": "node spec/checkForAllTests.js"
   },
   "devDependencies": {
-    "@babel/core": "^7.16.12",
-    "@babel/plugin-transform-runtime": "^7.16.10",
-    "@babel/preset-env": "^7.16.11",
-    "@rollup/plugin-babel": "^5.3.0",
-    "@rollup/plugin-commonjs": "^21.0.1",
-    "@rollup/plugin-multi-entry": "^4.1.0",
-    "@rollup/plugin-node-resolve": "^13.1.3",
+    "@babel/core": "^7.22.5",
+    "@babel/eslint-parser": "^7.22.5",
+    "@babel/plugin-transform-runtime": "^7.22.5",
+    "@babel/preset-env": "^7.22.5",
+    "@rollup/plugin-babel": "^6.0.3",
+    "@rollup/plugin-commonjs": "^25.0.1",
+    "@rollup/plugin-node-resolve": "^15.1.0",
+    "@rollup/plugin-terser": "^0.4.3",
     "@target/custom-event-polyfill": "github:Adobe-Marketing-Cloud/custom-event-polyfill",
-    "babel-eslint": "^10.1.0",
-    "core-js": "^3.20.3",
+    "@types/jasmine": "^4.3.2",
+    "babel-plugin-polyfill-corejs3": "^0.8.1",
+    "core-js": "^3.31.0",
     "coveralls": "^3.1.1",
-    "eslint": "^8.7.0",
-    "eslint-config-standard": "^16.0.3",
-    "eslint-plugin-import": "^2.25.4",
-    "eslint-plugin-node": "^11.1.0",
-    "eslint-plugin-promise": "^6.0.0",
-    "eslint-plugin-sort-class-members": "^1.14.1",
-    "eslint-plugin-standard": "^5.0.0",
-    "esm": "^3.2.25",
-    "http-server": "^14.1.0",
-    "jasmine": "^4.0.2",
-    "jasmine-core": "^4.0.0",
-    "karma": "^6.3.12",
-    "karma-chrome-launcher": "^3.1.0",
-    "karma-coverage": "^2.1.0",
+    "eslint": "^8.42.0",
+    "eslint-config-prettier": "^8.8.0",
+    "eslint-config-standard": "^17.1.0",
+    "http-server": "^14.1.1",
+    "jasmine": "^5.0.1",
+    "jasmine-core": "^5.0.1",
+    "karma": "^6.4.2",
+    "karma-chrome-launcher": "^3.2.0",
+    "karma-coverage": "^2.2.0",
     "karma-firefox-launcher": "^2.1.2",
-    "karma-jasmine": "^4.0.1",
+    "karma-jasmine": "^5.1.0",
     "karma-sauce-launcher": "^4.3.6",
-    "rollup": "^2.66.1",
-    "rollup-plugin-filesize": "^9.1.2",
-    "rollup-plugin-terser": "^7.0.2",
-    "typescript": "^4.5.5",
-    "yargs": "^17.3.1",
-    "svgdom": "^0.1.10",
-    "babel-plugin-polyfill-corejs3": "^0.5.1"
+    "prettier": "^2.8.8",
+    "rollup": "^3.25.1",
+    "rollup-plugin-filesize": "^10.0.0",
+    "svgdom": "^0.1.14",
+    "typescript": "^5.1.3",
+    "yargs": "^17.7.2"
   },
-  "browserslist": "last 2 version and > 0.25% and not op_mini all and not ie 11"
+  "browserslist": ">0.3%, last 2 version, not dead, not op_mini all"
 }
index cb0b688a2a73842d89c3688254420ea2684e43e6..017abbab8b9cbf2b0d05741ec396f6945cad3c03 100644 (file)
@@ -1,26 +1,19 @@
-
 <!DOCTYPE html>
 <html>
-
   <head>
-    <meta charset="utf-8">
+    <meta charset="utf-8" />
     <title>SVG Playground</title>
-    <link type="text/css" rel="stylesheet" href="style.css">
+    <link type="text/css" rel="stylesheet" href="style.css" />
   </head>
 
   <body>
-
     <h1>Color Playground</h1>
 
-    <p>
-      Lets test the different types of random colors we can make
-    </p>
+    <p>Lets test the different types of random colors we can make</p>
 
     <svg viewBox="0 0 1500 1500" id="canvas"></svg>
-
   </body>
 
   <script src="../../dist/svg.js" charset="utf-8"></script>
   <script src="main.js" charset="utf-8"></script>
-
 </html>
index d81bb478fd9852ecea6c061ec9efe0523890c116..01be83e34479151edce654b873aaf771b35243ae 100644 (file)
@@ -1,29 +1,26 @@
-
-
-let canvas = SVG('#canvas').group()
-  .translate( -150, 230 )
+let canvas = SVG('#canvas').group().translate(-150, 230)
 
 // Make a bunch of rectangles
-function rectangles ( method='Vibrant') {
-
+function rectangles(method = 'Vibrant') {
   // Make a group
   let group = canvas.group()
-  group.text(method).attr('font-size', 50).move( -230, 20 )
+  group.text(method).attr('font-size', 50).move(-230, 20)
 
   // Add the squares
-  for ( let i = 0; i < 20; i++ ) {
-    let color = SVG.Color.random( method.toLowerCase() ).toHex()
-    let rect = group.rect(100, 100)
-      .x( 20 + 100 * i )
-      .fill( color )
+  for (let i = 0; i < 20; i++) {
+    let color = SVG.Color.random(method.toLowerCase()).toHex()
+    let rect = group
+      .rect(100, 100)
+      .x(20 + 100 * i)
+      .fill(color)
   }
   return group
 }
 
-rectangles( 'Vibrant' ).translate( 0, 100 )
-rectangles( 'Sine' ).translate( 0, 220 )
-rectangles( 'Pastel' ).translate( 0, 340 )
-rectangles( 'Dark' ).translate( 0, 460 )
-rectangles( 'RGB' ).translate( 0, 580 )
-rectangles( 'LAB' ).translate( 0, 700 )
-rectangles( 'Grey' ).translate( 0, 820 )
+rectangles('Vibrant').translate(0, 100)
+rectangles('Sine').translate(0, 220)
+rectangles('Pastel').translate(0, 340)
+rectangles('Dark').translate(0, 460)
+rectangles('RGB').translate(0, 580)
+rectangles('LAB').translate(0, 700)
+rectangles('Grey').translate(0, 820)
index f327905cee7daeb21e3ea479c4f9c0cd7fdc6c57..24a9d4e12c884f4bc9a732e7ed68eb1ca8a9405e 100644 (file)
@@ -1,10 +1,9 @@
-
 * {
   box-sizing: border-box;
 }
 
 html {
-  background-color : #fefefe;
+  background-color: #fefefe;
 }
 
 body {
@@ -50,7 +49,7 @@ svg {
 }
 
 .pink {
-  fill: #FF0066;
+  fill: #ff0066;
 }
 
 .green {
@@ -62,9 +61,9 @@ svg {
 }
 
 .light-pink {
-  fill: #FF99C2;
+  fill: #ff99c2;
 }
 
 .off-white {
-   fill: #FFCCE0;
+  fill: #ffcce0;
 }
index 7609404184011697d1a77e07e8dd50bda81cb88b..8f294ed7f7c6f55e511a000a215403ca6a757bda 100644 (file)
@@ -1,8 +1,6 @@
 function reactToDrag(element, onDrag, beforeDrag) {
-
   let xStart, yStart
-  let startDrag = event => {
-
+  let startDrag = (event) => {
     // Avoid the default events
     event.preventDefault()
 
@@ -21,15 +19,13 @@ function reactToDrag(element, onDrag, beforeDrag) {
     SVG.on(window, ['mouseup.drag', 'touchend.drag'], stopDrag)
   }
 
-  let reactDrag = event => {
-
+  let reactDrag = (event) => {
     // Convert screen coordinates to svg coordinates and use them
     var { x, y } = parent.point(event.pageX, event.pageY)
-    if (onDrag)
-      onDrag(event, x, y)
+    if (onDrag) onDrag(event, x, y)
   }
 
-  let stopDrag = event => {
+  let stopDrag = (event) => {
     SVG.off(window, ['mousemove.drag', 'touchmove.drag'])
     SVG.off(window, ['mouseup.drag', 'touchend.drag'])
   }
@@ -42,27 +38,27 @@ function reactToDrag(element, onDrag, beforeDrag) {
 
 SVG.extend(SVG.Element, {
   draggable: function (after) {
-
     let sx, sy
 
-    reactToDrag(this, (e, x, y) => {
-
-      this.transform({
-        origin: [sx, sy],
-        position: [x, y],
-      })
-
-      if (after) {
-        after(this, x, y)
+    reactToDrag(
+      this,
+      (e, x, y) => {
+        this.transform({
+          origin: [sx, sy],
+          position: [x, y]
+        })
+
+        if (after) {
+          after(this, x, y)
+        }
+      },
+      (e, x, y) => {
+        var toAbsolute = new SVG.Matrix(this).inverse()
+        var p = new SVG.Point(x, y).transform(toAbsolute)
+        sx = p.x
+        sy = p.y
       }
-
-    }, (e, x, y) => {
-
-      var toAbsolute = new SVG.Matrix(this).inverse()
-      var p = new SVG.Point(x, y).transform(toAbsolute)
-      sx = p.x
-      sy = p.y
-    })
+    )
     return this
-  },
+  }
 })
index e815ed5b9ba2f26fc55a97b85725c00c0dec0b6b..9da4c201d4af1a6c292a8fdbfebe558d64b61a2d 100644 (file)
@@ -1,15 +1,12 @@
-
 <!DOCTYPE html>
 <html>
-
   <head>
-    <meta charset="utf-8">
+    <meta charset="utf-8" />
     <title>SVG Playground</title>
-    <link rel="stylesheet" href="style.css">
+    <link rel="stylesheet" href="style.css" />
   </head>
 
   <body>
-
     <h1>SVG Transformations</h1>
 
     <p>
     </p>
 
     <svg viewBox="-200 -200 400 400">
-
       <g id="tester">
-        <rect class="green" width=50 height=50 />
-        <line x2=50 stroke=black stroke-width=1 />
+        <rect class="green" width="50" height="50" />
+        <line x2="50" stroke="black" stroke-width="1" />
       </g>
 
       <g id="guess">
-        <rect class="dark-pink" width=50 height=50 opacity=0.5 />
-        <line x2=50 stroke=black stroke-width=1 />
+        <rect class="dark-pink" width="50" height="50" opacity="0.5" />
+        <line x2="50" stroke="black" stroke-width="1" />
       </g>
       <g id="true">
-        <rect class="pink" width=50 height=50 opacity=0.5 />
-        <line x2=50 stroke=black stroke-width=1 />
+        <rect class="pink" width="50" height="50" opacity="0.5" />
+        <line x2="50" stroke="black" stroke-width="1" />
       </g>
-      <ellipse id="or" class="dark-pink" rx=5 ry=5 />
-      <ellipse id="b1" class="pink" cx="50" rx=5 ry=5 />
-      <ellipse id="b2" class="green" cy="50" rx=5 ry=5 />
-
+      <ellipse id="or" class="dark-pink" rx="5" ry="5" />
+      <ellipse id="b1" class="pink" cx="50" rx="5" ry="5" />
+      <ellipse id="b2" class="green" cy="50" rx="5" ry="5" />
     </svg>
-
   </body>
 
   <script src="../../dist/svg.js" charset="utf-8"></script>
   <script src="drag.js" charset="utf-8"></script>
   <script src="matrix.js" charset="utf-8"></script>
-
 </html>
index 33e21d1b8f480d45ea971759daf3622391173647..fb7471704c766cb755cfe091866c56f294abbc1e 100644 (file)
@@ -1,6 +1,5 @@
-
-function print (mat) {
-  let {a, b, c, d} = mat
+function print(mat) {
+  let { a, b, c, d } = mat
   console.log(`
     a: ${a.toFixed(2)}
     b: ${b.toFixed(2)}
@@ -9,14 +8,19 @@ function print (mat) {
     `)
 }
 
-function moveit () {
-
-  let {cx: x0, cy: y0} = or.rbox(svg)
-  let {cx: x1, cy: y1} = b1.rbox(svg)
-  let {cx: x2, cy: y2} = b2.rbox(svg)
+function moveit() {
+  let { cx: x0, cy: y0 } = or.rbox(svg)
+  let { cx: x1, cy: y1 } = b1.rbox(svg)
+  let { cx: x2, cy: y2 } = b2.rbox(svg)
 
   let m = new SVG.Matrix(
-    (x1 - x0) / 50, (y1 - y0) / 50, (x2 - x0) / 50, (y2 - y0) / 50, x0, y0)
+    (x1 - x0) / 50,
+    (y1 - y0) / 50,
+    (x2 - x0) / 50,
+    (y2 - y0) / 50,
+    x0,
+    y0
+  )
   let com = m.decompose()
   let g = new SVG.Matrix().compose(com)
 
@@ -24,18 +28,18 @@ function moveit () {
   target.transform(m)
   mover.transform(g)
 
-  console.log(com);
+  console.log(com)
   print(m)
   print(g)
 }
 
 // Declare the two points
 let svg = SVG('svg')
-var or = SVG("#or").draggable(moveit)
-var b1 = SVG("#b1").draggable(moveit)
-var b2 = SVG("#b2").draggable(moveit)
+var or = SVG('#or').draggable(moveit)
+var b1 = SVG('#b1').draggable(moveit)
+var b2 = SVG('#b2').draggable(moveit)
 
 // Declare the squares
-let target = SVG("#true")
-let mover = SVG("#guess")
-let tester = SVG("#tester")
+let target = SVG('#true')
+let mover = SVG('#guess')
+let tester = SVG('#tester')
index f327905cee7daeb21e3ea479c4f9c0cd7fdc6c57..24a9d4e12c884f4bc9a732e7ed68eb1ca8a9405e 100644 (file)
@@ -1,10 +1,9 @@
-
 * {
   box-sizing: border-box;
 }
 
 html {
-  background-color : #fefefe;
+  background-color: #fefefe;
 }
 
 body {
@@ -50,7 +49,7 @@ svg {
 }
 
 .pink {
-  fill: #FF0066;
+  fill: #ff0066;
 }
 
 .green {
@@ -62,9 +61,9 @@ svg {
 }
 
 .light-pink {
-  fill: #FF99C2;
+  fill: #ff99c2;
 }
 
 .off-white {
-   fill: #FFCCE0;
+  fill: #ffcce0;
 }
index 8e1f804783960db9cae314f78ffdbf429982d882..77ef1bc370522527c1438be8290e96fcf72c436c 100644 (file)
@@ -1,15 +1,12 @@
-
 <!DOCTYPE html>
 <html>
-
   <head>
-    <meta charset="utf-8">
+    <meta charset="utf-8" />
     <title>SVG Playground</title>
-    <link rel="stylesheet" href="style.css">
+    <link rel="stylesheet" href="style.css" />
   </head>
 
   <body>
-
     <h1>Transformations</h1>
 
     <p>
     </p>
 
     <svg viewBox="0 0 1500 1500" id="canvas"></svg>
-
   </body>
 
   <script src="../../dist/svg.js" charset="utf-8"></script>
   <script src="transforms.js" charset="utf-8"></script>
-
 </html>
index f327905cee7daeb21e3ea479c4f9c0cd7fdc6c57..24a9d4e12c884f4bc9a732e7ed68eb1ca8a9405e 100644 (file)
@@ -1,10 +1,9 @@
-
 * {
   box-sizing: border-box;
 }
 
 html {
-  background-color : #fefefe;
+  background-color: #fefefe;
 }
 
 body {
@@ -50,7 +49,7 @@ svg {
 }
 
 .pink {
-  fill: #FF0066;
+  fill: #ff0066;
 }
 
 .green {
@@ -62,9 +61,9 @@ svg {
 }
 
 .light-pink {
-  fill: #FF99C2;
+  fill: #ff99c2;
 }
 
 .off-white {
-   fill: #FFCCE0;
+  fill: #ffcce0;
 }
index e9c0376c8e8dff2951531208a838ca34a02c10e1..d750797810e173965bb8cae70aa4c25f6370d53b 100644 (file)
@@ -1,22 +1,21 @@
-
-
 let canvas = SVG('#canvas')
 
 // Make the green rectangle
-canvas.rect(200, 400).move(200, 400)
-  .attr('opacity', 0.3)
-  .addClass('green')
+canvas.rect(200, 400).move(200, 400).attr('opacity', 0.3).addClass('green')
 
 // Make the pink rectangle
-let a = canvas.rect(200, 400).move(200, 400)
+let a = canvas
+  .rect(200, 400)
+  .move(200, 400)
   .attr('opacity', 0.3)
   .addClass('pink')
   .transform({ px: 100, py: 500, origin: 'top-left' })
 
-  a.animate()
-  .rotate({ rotate: 500, origin: 'top-right' })
+a.animate().rotate({ rotate: 500, origin: 'top-right' })
 
 // Put an ellipse where we expect the object to be
-canvas.ellipse(30, 30).center(100, 500)
+canvas
+  .ellipse(30, 30)
+  .center(100, 500)
   .attr('opacity', 0.3)
   .addClass('dark-pink')
index 87a304a16f538e02fbff7dcf02ed741ffafd3def..c0e7233e07ea15cb40f2ab4823eebfd5e26ee322 100644 (file)
@@ -1,33 +1,28 @@
 var path = require('path')
 module.exports = function (env) {
-
   let currentTest = path.resolve(__dirname, env)
   return {
-
     mode: 'development',
     devtool: 'eval-source-map',
     devServer: {
-      contentBase: [ currentTest, __dirname ],
+      contentBase: [currentTest, __dirname]
     },
 
     devServer: {
-      contentBase: [currentTest, '..'],
+      contentBase: [currentTest, '..']
     },
 
     entry: {
-      app: path.resolve(currentTest, "main.js"),
+      app: path.resolve(currentTest, 'main.js')
     },
 
     output: {
       path: currentTest,
-      filename: 'bundle.js',
+      filename: 'bundle.js'
     },
 
     resolve: {
-      modules: [
-        path.resolve(__dirname, "node_modules"),
-        "node_modules"
-      ]
+      modules: [path.resolve(__dirname, 'node_modules'), 'node_modules']
     }
   }
 }
index 770212c1832d5264520b6c49e5936058d2963387..c6b96e2fb3d3d35b158554ac8065771faddefb4f 100644 (file)
@@ -3,19 +3,18 @@
  * Jasmine RequestAnimationFrame: a set of helpers for testing functionality
  * that uses requestAnimationFrame under the Jasmine BDD framework for JavaScript.
  */
-function RAFPlugin (jasmine) {
-
+function RAFPlugin(jasmine) {
   var index = 0
   var callbacks = []
 
-  function MockRAF () {
+  function MockRAF() {
     this.nextTime = 0
 
     var _this = this
 
     /**
-    * Mock for window.requestAnimationFrame
-    */
+     * Mock for window.requestAnimationFrame
+     */
     this.mockRAF = function (fn) {
       if (typeof fn !== 'function') {
         throw new Error('You should pass a function to requestAnimationFrame')
@@ -28,8 +27,8 @@ function RAFPlugin (jasmine) {
     }
 
     /**
-    * Mock for window.cancelAnimationFrame
-    */
+     * Mock for window.cancelAnimationFrame
+     */
     this.mockCAF = function (requestID) {
       callbacks.splice(requestID, 1)
     }
@@ -41,8 +40,8 @@ function RAFPlugin (jasmine) {
     }
 
     /**
-    * Install request animation frame mocks.
-    */
+     * Install request animation frame mocks.
+     */
     this.install = function (global) {
       _this.realRAF = global.requestAnimationFrame
       _this.realCAF = global.cancelAnimationFrame
@@ -53,8 +52,8 @@ function RAFPlugin (jasmine) {
     }
 
     /**
-    * Uninstall request animation frame mocks.
-    */
+     * Uninstall request animation frame mocks.
+     */
     this.uninstall = function (global) {
       global.requestAnimationFrame = _this.realRAF
       global.cancelAnimationFrame = _this.realCAF
@@ -64,12 +63,14 @@ function RAFPlugin (jasmine) {
     }
 
     /**
-    * Simulate animation frame readiness.
-    */
+     * Simulate animation frame readiness.
+     */
     this.tick = function (dt) {
-      _this.nextTime += (dt || 1)
+      _this.nextTime += dt || 1
 
-      var fns = callbacks; var fn; var i
+      var fns = callbacks
+      var fn
+      var i
 
       callbacks = []
       index = 0
index 56a8885720effedfb8ba38558697c904e8369432..bd7b59abd4301cdd24e01b5482c626b833b9561b 100644 (file)
@@ -1,27 +1,31 @@
 <!DOCTYPE html>
 <html>
-<head>
-  <meta charset="utf-8">
-  <title>SVG.js - Jasmine Spec Runner</title>
-
-  <link rel="shortcut icon" type="image/png" href="../node_modules/jasmine-core/images/jasmine_favicon.png">
-  <link rel="stylesheet" href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
-
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
-  <script src="RAFPlugin.js"></script>
-
-  <link rel="stylesheet" href="fixtures/fixture.css">
-
-</head>
-
-<body>
-
-
-  <!-- include spec files here... -->
-
-  <script src="../dist/polyfillsIE.js"></script>
-  <script src="es5TestBundle.js"></script>
-</body>
+  <head>
+    <meta charset="utf-8" />
+    <title>SVG.js - Jasmine Spec Runner</title>
+
+    <link
+      rel="shortcut icon"
+      type="image/png"
+      href="../node_modules/jasmine-core/images/jasmine_favicon.png"
+    />
+    <link
+      rel="stylesheet"
+      href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css"
+    />
+
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
+    <script src="RAFPlugin.js"></script>
+
+    <link rel="stylesheet" href="fixtures/fixture.css" />
+  </head>
+
+  <body>
+    <!-- include spec files here... -->
+
+    <script src="../dist/polyfillsIE.js"></script>
+    <script src="es5TestBundle.js"></script>
+  </body>
 </html>
index eb6b17baf035a1eac503f06913dffa5a3c36730c..05156bd92ad36b8322ee6b281420589f4fb1a70f 100644 (file)
@@ -1,45 +1,50 @@
 <!DOCTYPE html>
 <html>
-<head>
-  <meta charset="utf-8">
-  <title>SVG.js - Jasmine Spec Runner</title>
+  <head>
+    <meta charset="utf-8" />
+    <title>SVG.js - Jasmine Spec Runner</title>
 
-  <link rel="shortcut icon" type="image/png" href="../node_modules/jasmine-core/images/jasmine_favicon.png">
-  <link rel="stylesheet" href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
+    <link
+      rel="shortcut icon"
+      type="image/png"
+      href="../node_modules/jasmine-core/images/jasmine_favicon.png"
+    />
+    <link
+      rel="stylesheet"
+      href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css"
+    />
 
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
-  <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
-  <script src="RAFPlugin.js"></script>
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
+    <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
+    <script src="RAFPlugin.js"></script>
 
-  <link rel="stylesheet" href="fixtures/fixture.css">
+    <link rel="stylesheet" href="fixtures/fixture.css" />
+  </head>
 
-</head>
-
-<body>
-
-  <!-- include spec files here... -->
-  <script type="module" src="setupBrowser.js"></script>
-  <script type="module" src="spec/elements/A.js"></script>
-  <script type="module" src="spec/elements/Circle.js"></script>
-  <script type="module" src="spec/elements/ClipPath.js"></script>
-  <script type="module" src="spec/elements/Container.js"></script>
-  <script type="module" src="spec/elements/Dom.js"></script>
-  <script type="module" src="spec/elements/Element.js"></script>
-  <script type="module" src="spec/elements/ForeignObject.js"></script>
-  <script type="module" src="spec/elements/G.js"></script>
-  <script type="module" src="spec/elements/Image.js"></script>
-  <script type="module" src="spec/elements/Marker.js"></script>
-  <script type="module" src="spec/elements/Svg.js"></script>
-  <script type="module" src="spec/elements/Text.js"></script>
-  <script type="module" src="spec/elements/TextPath.js"></script>
-  <script type="module" src="spec/elements/Tspan.js"></script>
-  <script type="module" src="spec/modules/core/event.js"></script>
-  <script type="module" src="spec/modules/core/textable.js"></script>
-  <script type="module" src="spec/types/ArrayPolyfill.js"></script>
-  <script type="module" src="spec/types/Base.js"></script>
-  <script type="module" src="spec/types/Box.js"></script>
-  <script type="module" src="spec/utils/adopter.js"></script>
-  <script type="module" src="spec/utils/utils.js"></script>
-</body>
+  <body>
+    <!-- include spec files here... -->
+    <script type="module" src="setupBrowser.js"></script>
+    <script type="module" src="spec/elements/A.js"></script>
+    <script type="module" src="spec/elements/Circle.js"></script>
+    <script type="module" src="spec/elements/ClipPath.js"></script>
+    <script type="module" src="spec/elements/Container.js"></script>
+    <script type="module" src="spec/elements/Dom.js"></script>
+    <script type="module" src="spec/elements/Element.js"></script>
+    <script type="module" src="spec/elements/ForeignObject.js"></script>
+    <script type="module" src="spec/elements/G.js"></script>
+    <script type="module" src="spec/elements/Image.js"></script>
+    <script type="module" src="spec/elements/Marker.js"></script>
+    <script type="module" src="spec/elements/Svg.js"></script>
+    <script type="module" src="spec/elements/Text.js"></script>
+    <script type="module" src="spec/elements/TextPath.js"></script>
+    <script type="module" src="spec/elements/Tspan.js"></script>
+    <script type="module" src="spec/modules/core/event.js"></script>
+    <script type="module" src="spec/modules/core/textable.js"></script>
+    <script type="module" src="spec/types/ArrayPolyfill.js"></script>
+    <script type="module" src="spec/types/Base.js"></script>
+    <script type="module" src="spec/types/Box.js"></script>
+    <script type="module" src="spec/utils/adopter.js"></script>
+    <script type="module" src="spec/utils/utils.js"></script>
+  </body>
 </html>
index 99c648e2d094242a7d89483ea144e0a00c8413a9..d25a6a4e127ab9a3d96c73a718f2952354d8f3eb 100644 (file)
@@ -2,7 +2,6 @@ const glob = require('glob')
 const path = require('path')
 
 glob('./spec/*/**/*.js', (err, tests) => {
-
   if (err) {
     throw err
   }
@@ -14,10 +13,13 @@ glob('./spec/*/**/*.js', (err, tests) => {
 
     files = files.map((e) => path.basename(e))
     tests = tests.map((e) => path.basename(e))
-    const difference = files.filter(x => !tests.includes(x))
+    const difference = files.filter((x) => !tests.includes(x))
 
     if (difference.length) {
-      console.error('The following files dont have a test file:\n\t' + difference.join('\n\t'))
+      console.error(
+        'The following files dont have a test file:\n\t' +
+          difference.join('\n\t')
+      )
     } else {
       console.info('All src files are covered by tests')
     }
index 4fad17b3ab4d4423cb0f3247749c77f1423089ba..85d434558fd164e9380da2530edf42d0d9e9d6e4 100644 (file)
@@ -1,6 +1,6 @@
 #drawing {
-       width: 500px;
-       height: 500px;
-       position: fixed;
-       z-index: -1;
+  width: 500px;
+  height: 500px;
+  position: fixed;
+  z-index: -1;
 }
index 7d63dfa9464184c2c30405d1b3baa51ea24dc67c..b5b29c3443d4ac105c3e6f8c26b425b4e5df8f67 100644 (file)
@@ -1,7 +1,7 @@
 import { getWindow } from '../src/utils/window.js'
 import { svg } from '../src/modules/core/namespaces.js'
 
-function tag (name, attrs, children) {
+function tag(name, attrs, children) {
   const doc = getWindow().document
   const el = doc.createElementNS(svg, name)
   let i
@@ -11,7 +11,9 @@ function tag (name, attrs, children) {
   }
 
   for (i in children) {
-    if (typeof children[i] === 'string') { children[i] = doc.createTextNode(children[i]) }
+    if (typeof children[i] === 'string') {
+      children[i] = doc.createTextNode(children[i])
+    }
 
     el.appendChild(children[i])
   }
@@ -19,104 +21,128 @@ function tag (name, attrs, children) {
   return el
 }
 
-export function fixtures () {
-  return tag('svg', {
-    height: 0,
-    width: 0,
-    id: 'inlineSVG'
-  }, [
-    tag('defs', {}, [
-      tag('linearGradient', {}, [
-        tag('stop', { offset: '5%', 'stop-color': 'green' }),
-        tag('stop', { offset: '95%', 'stop-color': 'gold' })
+export function fixtures() {
+  return tag(
+    'svg',
+    {
+      height: 0,
+      width: 0,
+      id: 'inlineSVG'
+    },
+    [
+      tag('defs', {}, [
+        tag('linearGradient', {}, [
+          tag('stop', { offset: '5%', 'stop-color': 'green' }),
+          tag('stop', { offset: '95%', 'stop-color': 'gold' })
+        ]),
+        tag('radialGradient', {}, [
+          tag('stop', { offset: '5%', 'stop-color': 'green' }),
+          tag('stop', { offset: '95%', 'stop-color': 'gold' })
+        ])
       ]),
-      tag('radialGradient', {}, [
-        tag('stop', { offset: '5%', 'stop-color': 'green' }),
-        tag('stop', { offset: '95%', 'stop-color': 'gold' })
-      ])
-    ]),
-    tag('desc', {}, [ 'Some description' ]),
-    tag('path', {
-      id: 'lineAB',
-      d: 'M 100 350 l 150 -300',
-      stroke: 'red',
-      'stroke-width': '3',
-      fill: 'none'
-    }),
-    tag('path', {
-      id: 'lineBC',
-      d: 'M 250 50 l 150 300',
-      stroke: 'red',
-      'stroke-width': '3',
-      fill: 'none'
-    }),
-    tag('path', {
-      d: 'M 175 200 l 150 0',
-      stroke: 'green',
-      'stroke-width': '3',
-      fill: 'none'
-    }),
-    tag('path', {
-      d: 'M 100 350 q 150 -300 300 0',
-      stroke: 'blue',
-      'stroke-width': '5',
-      fill: 'none'
-    }),
-    tag('g', {
-      stroke: 'black',
-      'stroke-width': '2',
-      fill: 'black',
-      id: 'pointGroup'
-    }, [
-      tag('circle', {
-        id: 'pointA',
-        cx: '100',
-        cy: '350',
-        r: '3'
+      tag('desc', {}, ['Some description']),
+      tag('path', {
+        id: 'lineAB',
+        d: 'M 100 350 l 150 -300',
+        stroke: 'red',
+        'stroke-width': '3',
+        fill: 'none'
       }),
-      tag('circle', {
-        id: 'pointB',
-        cx: '250',
-        cy: '50',
-        r: '50'
+      tag('path', {
+        id: 'lineBC',
+        d: 'M 250 50 l 150 300',
+        stroke: 'red',
+        'stroke-width': '3',
+        fill: 'none'
       }),
-      tag('circle', {
-        id: 'pointC',
-        cx: '400',
-        cy: '350',
-        r: '50'
-      })
-    ]),
-    tag('g', {
-      'font-size': '30',
-      font: 'sans-serif',
-      fill: 'black',
-      stroke: 'none',
-      'text-anchor': 'middle',
-      id: 'labelGroup'
-    }, [
-      tag('text', {
-        x: '100',
-        y: '350',
-        dy: '-30'
-      }, [ 'A' ]),
-      tag('text', {
-        x: '250',
-        y: '50',
-        dy: '-10'
-      }, [ 'B' ]),
-      tag('text', {
-        x: '400',
-        y: '350',
-        dx: '30'
-      }, [ 'C' ])
-    ]),
-    tag('polygon', { points: '200,10 250,190 160,210' }),
-    tag('polyline', { points: '20,20 40,25 60,40 80,120 120,140 200,180' })
-  ])
+      tag('path', {
+        d: 'M 175 200 l 150 0',
+        stroke: 'green',
+        'stroke-width': '3',
+        fill: 'none'
+      }),
+      tag('path', {
+        d: 'M 100 350 q 150 -300 300 0',
+        stroke: 'blue',
+        'stroke-width': '5',
+        fill: 'none'
+      }),
+      tag(
+        'g',
+        {
+          stroke: 'black',
+          'stroke-width': '2',
+          fill: 'black',
+          id: 'pointGroup'
+        },
+        [
+          tag('circle', {
+            id: 'pointA',
+            cx: '100',
+            cy: '350',
+            r: '3'
+          }),
+          tag('circle', {
+            id: 'pointB',
+            cx: '250',
+            cy: '50',
+            r: '50'
+          }),
+          tag('circle', {
+            id: 'pointC',
+            cx: '400',
+            cy: '350',
+            r: '50'
+          })
+        ]
+      ),
+      tag(
+        'g',
+        {
+          'font-size': '30',
+          font: 'sans-serif',
+          fill: 'black',
+          stroke: 'none',
+          'text-anchor': 'middle',
+          id: 'labelGroup'
+        },
+        [
+          tag(
+            'text',
+            {
+              x: '100',
+              y: '350',
+              dy: '-30'
+            },
+            ['A']
+          ),
+          tag(
+            'text',
+            {
+              x: '250',
+              y: '50',
+              dy: '-10'
+            },
+            ['B']
+          ),
+          tag(
+            'text',
+            {
+              x: '400',
+              y: '350',
+              dx: '30'
+            },
+            ['C']
+          )
+        ]
+      ),
+      tag('polygon', { points: '200,10 250,190 160,210' }),
+      tag('polyline', { points: '20,20 40,25 60,40 80,120 120,140 200,180' })
+    ]
+  )
 }
 
-export function buildFixtures () {
+export function buildFixtures() {
   const doc = getWindow().document
   const body = doc.body || doc.documentElement
 
@@ -134,7 +160,7 @@ export function buildFixtures () {
   body.appendChild(div)
 }
 
-export function buildCanvas () {
+export function buildCanvas() {
   const doc = getWindow().document
   const body = doc.body || doc.documentElement
 
@@ -150,7 +176,7 @@ export function buildCanvas () {
   body.appendChild(div)
 }
 
-export function clear () {
+export function clear() {
   const doc = getWindow().document
   const canvas = doc.getElementById('canvas')
   const fixtures = doc.getElementById('fixtures')
@@ -158,6 +184,7 @@ export function clear () {
   // remove if present
   fixtures && fixtures.parentNode.removeChild(fixtures)
   canvas.parentNode.removeChild(canvas)
-
-  ;[ ...doc.querySelectorAll('svg') ].forEach((el) => el.parentNode.removeChild(el))
+  ;[...doc.querySelectorAll('svg')].forEach((el) =>
+    el.parentNode.removeChild(el)
+  )
 }
index 3ce24cf3a370be8a4690f740417bea6849a40b5f..cada48110c2856c2e0d2cdb589ff3506ce5e7593 100644 (file)
@@ -10,12 +10,8 @@ const jasmine = new Jasmine()
 
 jasmine.loadConfig({
   spec_dir: '/',
-  spec_files: [
-    'spec/spec/*/**/*.js'
-  ],
-  helpers: [
-    'spec/setupSVGDom.js'
-  ]
+  spec_files: ['spec/spec/*/**/*.js'],
+  helpers: ['spec/setupSVGDom.js']
 })
 
 jasmine.execute()
index 22bf56597507d873e1d2b793c4ec576926337867..be5b803177dfd9462bd598c24951ac04b525cad7 100644 (file)
@@ -7,7 +7,7 @@ import { registerWindow } from '../src/main.js'
 
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 200
 
-function setup () {
+function setup() {
   const win = createHTMLWindow()
   registerWindow(win, win.document)
   buildCanvas()
@@ -15,7 +15,7 @@ function setup () {
   global.container = win.document.getElementById('canvas')
 }
 
-function teardown () {
+function teardown() {
   clear()
   global.container = null
   registerWindow()
index 043beaab95c7bdd865c8b4cb47f228f670b4450c..695dca7eb2d53756df5517a7a00134f3094c0df8 100644 (file)
@@ -4,7 +4,6 @@ import { Animator, Queue } from '../../../src/main.js'
 import { getWindow } from '../../../src/utils/window.js'
 
 describe('Animator.js', () => {
-
   beforeEach(() => {
     jasmine.RequestAnimationFrame.install(getWindow())
     Animator.timeouts = new Queue()
@@ -19,7 +18,6 @@ describe('Animator.js', () => {
 
   describe('timeout()', () => {
     it('calls a function after a specific time', () => {
-
       var spy = jasmine.createSpy('tester')
       Animator.timeout(spy, 100)
 
index 8ad074d6edda6737ee785584a216b223a1fe3b02..b81678bc1dfa56b919ce14213b8a59fb733c73ec 100644 (file)
@@ -1,12 +1,17 @@
 /* globals describe, expect, it, jasmine */
 
 import { easing, defaults } from '../../../src/main.js'
-import { Stepper, Ease, Controller, Spring, PID } from '../../../src/animation/Controller.js'
+import {
+  Stepper,
+  Ease,
+  Controller,
+  Spring,
+  PID
+} from '../../../src/animation/Controller.js'
 
 const { any, createSpy } = jasmine
 
 describe('Controller.js', () => {
-
   describe('easing', () => {
     var easedValues = {
       '-': 0.5,
@@ -15,7 +20,7 @@ describe('Controller.js', () => {
       '<': 0.2929
     }
 
-    ;[ '-', '<>', '<', '>' ].forEach((el) => {
+    ;['-', '<>', '<', '>'].forEach((el) => {
       describe(el, () => {
         it('is 0 at 0', () => {
           expect(easing[el](0)).toBe(0)
index 2fa58aa09d0897b2045a3ea8e02a7275b48f8580..d5d313ad3eb83ca272d1d094aa700c56b5c27b78 100644 (file)
@@ -1,6 +1,18 @@
 /* globals describe, expect, it, jasmine */
 
-import { Morphable, NonMorphable, ObjectBag, Color, Box, Matrix, PointArray, PathArray, TransformBag, Number as SVGNumber, Array as SVGArray } from '../../../src/main.js'
+import {
+  Morphable,
+  NonMorphable,
+  ObjectBag,
+  Color,
+  Box,
+  Matrix,
+  PointArray,
+  PathArray,
+  TransformBag,
+  Number as SVGNumber,
+  Array as SVGArray
+} from '../../../src/main.js'
 import { Stepper, easing, Ease } from '../../../src/animation/Controller.js'
 
 const { objectContaining, arrayContaining, any } = jasmine
@@ -20,7 +32,6 @@ describe('Morphable.js', () => {
   })
 
   describe('constructors', () => {
-
     it('Morphable with SVGNumber', () => {
       const morpher = new Morphable().from(10).to(5)
 
@@ -46,16 +57,25 @@ describe('Morphable.js', () => {
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(ObjectBag)
       expect(morpher.at(0.5)).toEqual(any(Object))
-      expect(morpher.at(0.5).valueOf()).toEqual(objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) }))
+      expect(morpher.at(0.5).valueOf()).toEqual(
+        objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) })
+      )
     })
 
     it('Morphable from object containing css values', () => {
-      const morpher = new Morphable().from({ opacity: '0', 'stroke-width': '10px' }).to({ opacity: 1, 'stroke-width': 20 })
+      const morpher = new Morphable()
+        .from({ opacity: '0', 'stroke-width': '10px' })
+        .to({ opacity: 1, 'stroke-width': 20 })
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(ObjectBag)
       expect(morpher.at(0.5)).toEqual(any(Object))
-      expect(morpher.at(0.5).valueOf()).toEqual(objectContaining({ opacity: new SVGNumber(0.5), 'stroke-width': new SVGNumber('15px') }))
+      expect(morpher.at(0.5).valueOf()).toEqual(
+        objectContaining({
+          opacity: new SVGNumber(0.5),
+          'stroke-width': new SVGNumber('15px')
+        })
+      )
     })
 
     it('Creates a morphable out of an SVGNumber', () => {
@@ -77,48 +97,68 @@ describe('Morphable.js', () => {
     })
 
     it('Creates a morphable out of an Box', () => {
-      const morpher = new Box(1, 2, 3, 4).to([ 5, 6, 7, 8 ])
+      const morpher = new Box(1, 2, 3, 4).to([5, 6, 7, 8])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(Box)
       expect(morpher.at(0.5)).toEqual(any(Box))
-      expect(morpher.at(0.5)).toEqual(objectContaining({ x: 3, y: 4, width: 5, height: 6 }))
+      expect(morpher.at(0.5)).toEqual(
+        objectContaining({ x: 3, y: 4, width: 5, height: 6 })
+      )
     })
 
     it('Creates a morphable out of an Matrix', () => {
-      const morpher = new Matrix(1, 2, 3, 4, 5, 6).to([ 3, 4, 5, 6, 7, 8 ])
+      const morpher = new Matrix(1, 2, 3, 4, 5, 6).to([3, 4, 5, 6, 7, 8])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(Matrix)
       expect(morpher.at(0.5)).toEqual(any(Matrix))
-      expect(morpher.at(0.5)).toEqual(objectContaining(new Matrix(2, 3, 4, 5, 6, 7)))
+      expect(morpher.at(0.5)).toEqual(
+        objectContaining(new Matrix(2, 3, 4, 5, 6, 7))
+      )
     })
 
     it('Creates a morphable out of an SVGArray', () => {
-      const morpher = new SVGArray([ 1, 2, 3, 4, 5, 6 ]).to([ 3, 4, 5, 6, 7, 8 ])
+      const morpher = new SVGArray([1, 2, 3, 4, 5, 6]).to([3, 4, 5, 6, 7, 8])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(SVGArray)
       expect(morpher.at(0.5)).toEqual(any(SVGArray))
-      expect(morpher.at(0.5).toArray()).toEqual(arrayContaining([ 2, 3, 4, 5, 6, 7 ]))
+      expect(morpher.at(0.5).toArray()).toEqual(
+        arrayContaining([2, 3, 4, 5, 6, 7])
+      )
     })
 
     it('Creates a morphable out of an PointArray', () => {
-      const morpher = new PointArray([ 1, 2, 3, 4, 5, 6 ]).to([ 3, 4, 5, 6, 7, 8 ])
+      const morpher = new PointArray([1, 2, 3, 4, 5, 6]).to([3, 4, 5, 6, 7, 8])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(PointArray)
       expect(morpher.at(0.5)).toEqual(any(PointArray))
-      expect(morpher.at(0.5).toArray()).toEqual(arrayContaining([ 2, 3, 4, 5, 6, 7 ]))
+      expect(morpher.at(0.5).toArray()).toEqual(
+        arrayContaining([2, 3, 4, 5, 6, 7])
+      )
     })
 
     it('Creates a morphable out of an PathArray', () => {
-      const morpher = new PathArray([ 'M', 1, 2, 'L', 3, 4, 'L', 5, 6 ]).to([ 'M', 3, 4, 'L', 5, 6, 'L', 7, 8 ])
+      const morpher = new PathArray(['M', 1, 2, 'L', 3, 4, 'L', 5, 6]).to([
+        'M',
+        3,
+        4,
+        'L',
+        5,
+        6,
+        'L',
+        7,
+        8
+      ])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(PathArray)
       expect(morpher.at(0.5)).toEqual(any(PathArray))
-      expect(morpher.at(0.5).toArray()).toEqual(arrayContaining([ 'M', 2, 3, 'L', 4, 5, 'L', 6, 7 ]))
+      expect(morpher.at(0.5).toArray()).toEqual(
+        arrayContaining(['M', 2, 3, 'L', 4, 5, 'L', 6, 7])
+      )
     })
 
     it('creates a morphable from unmorphable types', () => {
@@ -132,14 +172,18 @@ describe('Morphable.js', () => {
     })
 
     it('Creates a morphable out of an TransformBag', () => {
-      const morpher = new TransformBag({ rotate: 0, translateX: 0 })
-        .to({ rotate: 50, translateX: 20 })
+      const morpher = new TransformBag({ rotate: 0, translateX: 0 }).to({
+        rotate: 50,
+        translateX: 20
+      })
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(TransformBag)
       expect(morpher.at(0.5)).toEqual(any(TransformBag))
 
-      expect(morpher.at(0.5)).toEqual(objectContaining({ rotate: 25, translateX: 10 }))
+      expect(morpher.at(0.5)).toEqual(
+        objectContaining({ rotate: 25, translateX: 10 })
+      )
     })
 
     it('Creates a morphable out of an ObjectBag', () => {
@@ -148,7 +192,9 @@ describe('Morphable.js', () => {
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(ObjectBag)
       expect(morpher.at(0.5)).toEqual(any(Object))
-      expect(morpher.at(0.5).valueOf()).toEqual(objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) }))
+      expect(morpher.at(0.5).valueOf()).toEqual(
+        objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) })
+      )
     })
 
     it('creates a morphable from a color string', () => {
@@ -198,16 +244,16 @@ describe('Morphable.js', () => {
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(SVGArray)
       expect(morpher.at(0.5)).toEqual(any(SVGArray))
-      expect(morpher.at(0.5)).toEqual([ 2, 3, 4, 5 ])
+      expect(morpher.at(0.5)).toEqual([2, 3, 4, 5])
     })
 
     it('creates a morphable from an array', () => {
-      const morpher = new Morphable().from([ 0, 1, 2, 3 ]).to([ 4, 5, 6, 7 ])
+      const morpher = new Morphable().from([0, 1, 2, 3]).to([4, 5, 6, 7])
 
       expect(morpher).toEqual(any(Morphable))
       expect(morpher.type()).toBe(SVGArray)
       expect(morpher.at(0.5)).toEqual(any(SVGArray))
-      expect(morpher.at(0.5)).toEqual([ 2, 3, 4, 5 ])
+      expect(morpher.at(0.5)).toEqual([2, 3, 4, 5])
     })
 
     it('converts the to-color to the from-type', () => {
@@ -231,7 +277,7 @@ describe('Morphable.js', () => {
 
     it('sets the from attribute to an array representation of the morphable type', () => {
       const morpher = new Morphable().from(5)
-      expect(morpher.from()).toEqual(arrayContaining([ 5 ]))
+      expect(morpher.from()).toEqual(arrayContaining([5]))
     })
   })
 
@@ -255,7 +301,7 @@ describe('Morphable.js', () => {
 
     it('sets the from attribute to an array representation of the morphable type', () => {
       const morpher = new Morphable().to(5)
-      expect(morpher.to()).toEqual(arrayContaining([ 5 ]))
+      expect(morpher.to()).toEqual(arrayContaining([5]))
     })
   })
 
@@ -270,7 +316,7 @@ describe('Morphable.js', () => {
   describe('NonMorphable', () => {
     describe('()', () => {
       it('wraps any type into a NonMorphable from an array', () => {
-        const non = new NonMorphable([ 5 ])
+        const non = new NonMorphable([5])
         expect(non.valueOf()).toBe(5)
       })
 
@@ -282,8 +328,8 @@ describe('Morphable.js', () => {
 
     describe('toArray()', () => {
       it('returns array representation of NonMorphable', () => {
-        expect(new NonMorphable(5).toArray()).toEqual([ 5 ])
-        expect(new NonMorphable('Hello').toArray()).toEqual([ 'Hello' ])
+        expect(new NonMorphable(5).toArray()).toEqual([5])
+        expect(new NonMorphable('Hello').toArray()).toEqual(['Hello'])
       })
     })
   })
@@ -291,8 +337,8 @@ describe('Morphable.js', () => {
   describe('TransformBag', () => {
     describe('()', () => {
       it('creates an object which holds transformations for morphing by passing array', () => {
-        const bag = new TransformBag([ 0, 1, 2, 3, 4, 5, 6, 7 ])
-        expect(bag.toArray()).toEqual([ 0, 1, 2, 3, 4, 5, 6, 7 ])
+        const bag = new TransformBag([0, 1, 2, 3, 4, 5, 6, 7])
+        expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7])
       })
 
       it('creates an object which holds transformations for morphing by passing object', () => {
@@ -307,14 +353,14 @@ describe('Morphable.js', () => {
           originY: 7
         })
 
-        expect(bag.toArray()).toEqual([ 0, 1, 2, 3, 4, 5, 6, 7 ])
+        expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7])
       })
     })
 
     describe('toArray()', () => {
       it('creates an array out of the transform values', () => {
-        const bag = new TransformBag([ 0, 1, 2, 3, 4, 5, 6, 7 ])
-        expect(bag.toArray()).toEqual([ 0, 1, 2, 3, 4, 5, 6, 7 ])
+        const bag = new TransformBag([0, 1, 2, 3, 4, 5, 6, 7])
+        expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7])
       })
     })
   })
@@ -322,51 +368,174 @@ describe('Morphable.js', () => {
   describe('ObjectBag', () => {
     describe('()', () => {
       it('wraps an object into a morphable object by passing an array', () => {
-        const bag = new ObjectBag([ 'foo', SVGNumber, 2, 1, '', 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '' ])
-        expect(bag.values).toEqual([ 'foo', SVGNumber, 2, 1, '', 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '' ])
+        const bag = new ObjectBag([
+          'foo',
+          SVGNumber,
+          2,
+          1,
+          '',
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'baz',
+          SVGNumber,
+          2,
+          3,
+          ''
+        ])
+        expect(bag.values).toEqual([
+          'foo',
+          SVGNumber,
+          2,
+          1,
+          '',
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'baz',
+          SVGNumber,
+          2,
+          3,
+          ''
+        ])
       })
 
       it('wraps an object into a morphable object by passing an object', () => {
         const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 })
-        expect(bag.values).toEqual([ 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '', 'foo', SVGNumber, 2, 1, '' ])
+        expect(bag.values).toEqual([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'baz',
+          SVGNumber,
+          2,
+          3,
+          '',
+          'foo',
+          SVGNumber,
+          2,
+          1,
+          ''
+        ])
       })
 
       it('wraps an object with morphable values in an ObjectBag', () => {
         const bag = new ObjectBag({ fill: new Color(), bar: 2 })
-        expect(bag.values).toEqual([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ])
+        expect(bag.values).toEqual([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'fill',
+          Color,
+          5,
+          0,
+          0,
+          0,
+          0,
+          'rgb'
+        ])
       })
 
       it('wraps an array with morphable representation in an ObjectBag', () => {
-        const bag = new ObjectBag([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ])
-        expect(bag.toArray()).toEqual([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ])
+        const bag = new ObjectBag([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'fill',
+          Color,
+          5,
+          0,
+          0,
+          0,
+          0,
+          'rgb'
+        ])
+        expect(bag.toArray()).toEqual([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'fill',
+          Color,
+          5,
+          0,
+          0,
+          0,
+          0,
+          'rgb'
+        ])
       })
     })
 
     describe('toArray()', () => {
       it('creates an array out of the object', () => {
         const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 })
-        expect(bag.toArray()).toEqual(
-          [ 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '', 'foo', SVGNumber, 2, 1, '' ]
-        )
+        expect(bag.toArray()).toEqual([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'baz',
+          SVGNumber,
+          2,
+          3,
+          '',
+          'foo',
+          SVGNumber,
+          2,
+          1,
+          ''
+        ])
       })
 
       it('creates a flattened array out of the object with morphable values', () => {
         const bag = new ObjectBag({ fill: new Color(), bar: 2 })
-        expect(bag.toArray()).toEqual(
-          [ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ]
-        )
+        expect(bag.toArray()).toEqual([
+          'bar',
+          SVGNumber,
+          2,
+          2,
+          '',
+          'fill',
+          Color,
+          5,
+          0,
+          0,
+          0,
+          0,
+          'rgb'
+        ])
       })
     })
 
     describe('valueOf()', () => {
       it('creates morphable objects from the stored values', () => {
         const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 })
-        expect(bag.valueOf()).toEqual({ foo: new SVGNumber(1), bar: new SVGNumber(2), baz: new SVGNumber(3) })
+        expect(bag.valueOf()).toEqual({
+          foo: new SVGNumber(1),
+          bar: new SVGNumber(2),
+          baz: new SVGNumber(3)
+        })
       })
 
       it('creates also morphable objects from the stored values', () => {
         const bag = new ObjectBag({ fill: new Color(), bar: 2 })
-        expect(bag.valueOf()).toEqual({ fill: objectContaining(new Color()), bar: new SVGNumber(2) })
+        expect(bag.valueOf()).toEqual({
+          fill: objectContaining(new Color()),
+          bar: new SVGNumber(2)
+        })
       })
     })
 
@@ -375,7 +544,21 @@ describe('Morphable.js', () => {
         const bag1 = new ObjectBag({ x: 1, y: '#fff' })
         const bag2 = new ObjectBag({ x: 2, y: new Color().hsl() })
         bag1.align(bag2.toArray())
-        expect(bag1.toArray()).toEqual([ 'x', SVGNumber, 2, 1, '', 'y', Color, 5, 0, 0, 100, 0, 'hsl' ])
+        expect(bag1.toArray()).toEqual([
+          'x',
+          SVGNumber,
+          2,
+          1,
+          '',
+          'y',
+          Color,
+          5,
+          0,
+          0,
+          100,
+          0,
+          'hsl'
+        ])
       })
     })
   })
index 83864055d382d55aeb96bb52dbb43b57f092b8d4..b405b6258350ab38da7e2a4b6c62973cbaf8e81a 100644 (file)
@@ -3,9 +3,7 @@
 import { Queue } from '../../../src/main.js'
 
 describe('Queue.js', function () {
-
   describe('first ()', function () {
-
     it('returns null if no item in the queue', function () {
       var queue = new Queue()
       expect(queue.first()).toEqual(null)
@@ -21,7 +19,6 @@ describe('Queue.js', function () {
   })
 
   describe('last ()', function () {
-
     it('returns null if no item in the queue', function () {
       var queue = new Queue()
       expect(queue.last()).toEqual(null)
@@ -37,7 +34,6 @@ describe('Queue.js', function () {
   })
 
   describe('push ()', function () {
-
     it('adds an element to the end of the queue', function () {
       var queue = new Queue()
       queue.push(1)
index 2512dacebbf1bbf16ef0afb5de4dd6f6a2fc4cf3..2325fd5d8af6f7f56228f8d74bca84c3fda68684 100644 (file)
@@ -1,6 +1,22 @@
 /* globals describe, expect, it, beforeEach, afterEach, spyOn, jasmine */
 
-import { Runner, defaults, Ease, Controller, SVG, Timeline, Rect, Morphable, Animator, Queue, Matrix, Color, Box, Polygon, PointArray } from '../../../src/main.js'
+import {
+  Runner,
+  defaults,
+  Ease,
+  Controller,
+  SVG,
+  Timeline,
+  Rect,
+  Morphable,
+  Animator,
+  Queue,
+  Matrix,
+  Color,
+  Box,
+  Polygon,
+  PointArray
+} from '../../../src/main.js'
 import { FakeRunner, RunnerArray } from '../../../src/animation/Runner.js'
 import { getWindow } from '../../../src/utils/window.js'
 import SVGNumber from '../../../src/types/SVGNumber.js'
@@ -8,7 +24,6 @@ import SVGNumber from '../../../src/types/SVGNumber.js'
 const { any, createSpy, objectContaining, arrayContaining } = jasmine
 
 describe('Runner.js', () => {
-
   describe('Runner', () => {
     var initFn = createSpy('initFn')
     var runFn = createSpy('runFn')
@@ -31,59 +46,73 @@ describe('Runner.js', () => {
       it('can handle all form of input', () => {
         var fn = Runner.sanitise
 
-        expect(fn(200, 200, 'now')).toEqual(objectContaining({
-          duration: 200,
-          delay: 200,
-          when: 'now',
-          times: 1,
-          wait: 0,
-          swing: false
-        }))
-
-        expect(fn(200, 200)).toEqual(objectContaining({
-          duration: 200,
-          delay: 200,
-          when: 'last',
-          times: 1,
-          wait: 0,
-          swing: false
-        }))
-
-        expect(fn(200)).toEqual(objectContaining({
-          duration: 200,
-          delay: defaults.timeline.delay,
-          when: 'last',
-          times: 1,
-          wait: 0,
-          swing: false
-        }))
-
-        expect(fn(runFn)).toEqual(objectContaining({
-          duration: runFn,
-          delay: defaults.timeline.delay,
-          when: 'last',
-          times: 1,
-          wait: 0,
-          swing: false
-        }))
-
-        expect(fn({ delay: 200 })).toEqual(objectContaining({
-          duration: defaults.timeline.duration,
-          delay: 200,
-          when: 'last',
-          times: 1,
-          wait: 0,
-          swing: false
-        }))
-
-        expect(fn({ times: 3, delay: 200, when: 'now', swing: true, wait: 200 })).toEqual(objectContaining({
-          duration: defaults.timeline.duration,
-          delay: 200,
-          when: 'now',
-          times: 3,
-          wait: 200,
-          swing: true
-        }))
+        expect(fn(200, 200, 'now')).toEqual(
+          objectContaining({
+            duration: 200,
+            delay: 200,
+            when: 'now',
+            times: 1,
+            wait: 0,
+            swing: false
+          })
+        )
+
+        expect(fn(200, 200)).toEqual(
+          objectContaining({
+            duration: 200,
+            delay: 200,
+            when: 'last',
+            times: 1,
+            wait: 0,
+            swing: false
+          })
+        )
+
+        expect(fn(200)).toEqual(
+          objectContaining({
+            duration: 200,
+            delay: defaults.timeline.delay,
+            when: 'last',
+            times: 1,
+            wait: 0,
+            swing: false
+          })
+        )
+
+        expect(fn(runFn)).toEqual(
+          objectContaining({
+            duration: runFn,
+            delay: defaults.timeline.delay,
+            when: 'last',
+            times: 1,
+            wait: 0,
+            swing: false
+          })
+        )
+
+        expect(fn({ delay: 200 })).toEqual(
+          objectContaining({
+            duration: defaults.timeline.duration,
+            delay: 200,
+            when: 'last',
+            times: 1,
+            wait: 0,
+            swing: false
+          })
+        )
+
+        expect(
+          fn({ times: 3, delay: 200, when: 'now', swing: true, wait: 200 })
+        ).toEqual(
+          objectContaining({
+            duration: defaults.timeline.duration,
+            delay: 200,
+            when: 'now',
+            times: 3,
+            wait: 200,
+            swing: true
+          })
+        )
       })
     })
 
@@ -115,17 +144,18 @@ describe('Runner.js', () => {
         var runner = new Runner()
         runner.queue(initFn, runFn, true)
 
-        expect(runner._queue[0]).toEqual(objectContaining({
-          initialiser: initFn,
-          initialised: false,
-          runner: runFn,
-          finished: false
-        }))
+        expect(runner._queue[0]).toEqual(
+          objectContaining({
+            initialiser: initFn,
+            initialised: false,
+            runner: runFn,
+            finished: false
+          })
+        )
       })
     })
 
     describe('step()', () => {
-
       it('returns itself', () => {
         var runner = new Runner()
         expect(runner.step()).toBe(runner)
@@ -163,7 +193,7 @@ describe('Runner.js', () => {
         expect(runFn.calls.count()).toBe(2)
       })
 
-      function getLoop (r) {
+      function getLoop(r) {
         var loopDuration = r._duration + r._wait
         var loopsDone = Math.floor(r._time / loopDuration)
         return loopsDone
@@ -447,7 +477,6 @@ describe('Runner.js', () => {
           })
         })
       })
-
     })
 
     describe('active()', () => {
@@ -613,7 +642,6 @@ describe('Runner.js', () => {
     })
 
     describe('position()', () => {
-
       it('gets the position of a runner', () => {
         var spy = createSpy('stepper')
         var runner = new Runner(1000).queue(null, spy)
@@ -718,9 +746,10 @@ describe('Runner.js', () => {
 
       it('throws if no timeline is given', () => {
         var runner = new Runner()
-        expect(() => runner.schedule(200, 'now')).toThrowError('Runner cannot be scheduled without timeline')
+        expect(() => runner.schedule(200, 'now')).toThrowError(
+          'Runner cannot be scheduled without timeline'
+        )
       })
-
     })
 
     describe('unschedule()', () => {
@@ -750,10 +779,22 @@ describe('Runner.js', () => {
         expect(runner2.timeline()).toBe(timeline)
         expect(runner2.time()).toBe(0)
 
-        expect(timeline.schedule()).toEqual(arrayContaining([
-          objectContaining({ start: t, duration: 1000, end: t + 1000, runner: runner }),
-          objectContaining({ start: t + 2000, duration: 500, end: t + 2500, runner: runner2 })
-        ]))
+        expect(timeline.schedule()).toEqual(
+          arrayContaining([
+            objectContaining({
+              start: t,
+              duration: 1000,
+              end: t + 1000,
+              runner: runner
+            }),
+            objectContaining({
+              start: t + 2000,
+              duration: 500,
+              end: t + 2500,
+              runner: runner2
+            })
+          ])
+        )
       })
 
       it('reuses timeline and element of current runner', () => {
@@ -909,7 +950,7 @@ describe('Runner.js', () => {
           const runner = rect.animate().move(10, 10)
           jasmine.RequestAnimationFrame.tick(16)
           expect(runner._tryRetarget('x', 20)).toBe(true)
-          expect(runner._history.x.morpher.to()).toEqual([ 20, '' ])
+          expect(runner._history.x.morpher.to()).toEqual([20, ''])
         })
 
         it('throws away the morpher if it was not initialized yet and returns false', () => {
@@ -929,10 +970,14 @@ describe('Runner.js', () => {
 
         it('does only work with controller for transformations and uses retarget function when retargeting transformations', () => {
           const rect = new Rect()
-          const runner = rect.animate(new Controller(() => 0)).transform({ translate: [ 10, 10 ] })
+          const runner = rect
+            .animate(new Controller(() => 0))
+            .transform({ translate: [10, 10] })
           jasmine.RequestAnimationFrame.tick(16)
           // In that case tryRetarget is not successful
-          expect(runner._tryRetarget('transform', { translate: [ 20, 20 ] })).toBe(true)
+          expect(
+            runner._tryRetarget('transform', { translate: [20, 20] })
+          ).toBe(true)
         })
 
         it('starts the timeline if retarget was successful', () => {
@@ -942,7 +987,7 @@ describe('Runner.js', () => {
           jasmine.RequestAnimationFrame.tick(16)
           const spy = spyOn(timeline, 'play')
           expect(runner._tryRetarget('x', 20)).toBe(true)
-          expect(runner._history.x.morpher.to()).toEqual([ 20, '' ])
+          expect(runner._history.x.morpher.to()).toEqual([20, ''])
           expect(spy).toHaveBeenCalledTimes(1)
         })
       })
@@ -1002,7 +1047,7 @@ describe('Runner.js', () => {
       describe('addTransform()', () => {
         it('adds a transformation by multiplying', () => {
           const runner = new Runner()
-          runner.addTransform({ translate: [ 10, 10 ] })
+          runner.addTransform({ translate: [10, 10] })
           expect(runner.transforms).toEqual(new Matrix(1, 0, 0, 1, 10, 10))
         })
       })
@@ -1010,7 +1055,7 @@ describe('Runner.js', () => {
       describe('clearTransform()', () => {
         it('resets the transformations to identity', () => {
           const runner = new Runner()
-          runner.addTransform({ translate: [ 10, 10 ] })
+          runner.addTransform({ translate: [10, 10] })
           runner.clearTransform()
           expect(runner.transforms).toEqual(new Matrix())
         })
@@ -1019,7 +1064,7 @@ describe('Runner.js', () => {
       describe('clearTransformsFromQueue', () => {
         it('deletes all functions from the queue which are transformations', () => {
           const runner = new Runner().queue(initFn, runFn)
-          runner.transform({ translate: [ 10, 20 ] })
+          runner.transform({ translate: [10, 20] })
           runner.clearTransformsFromQueue()
           expect(runner._queue.length).toBe(1)
         })
@@ -1062,17 +1107,15 @@ describe('Runner.js', () => {
         it('calculates the current transformation of this element', () => {
           const rect = new Rect()
           rect._prepareRunner()
-          const runner1 = new Runner().addTransform({ translate: [ 10, 20 ] })
+          const runner1 = new Runner().addTransform({ translate: [10, 20] })
           const runner2 = new Runner().addTransform({ rotate: 45 })
-          const runner3 = new Runner().addTransform({ translate: [ 10, 20 ] })
+          const runner3 = new Runner().addTransform({ translate: [10, 20] })
 
           rect._addRunner(runner1)
           rect._addRunner(runner2)
           rect._addRunner(runner3)
           expect(rect._currentTransform(runner3)).toEqual(
-            new Matrix({ translate: [ 10, 20 ] })
-              .rotate(45)
-              .translate(10, 20)
+            new Matrix({ translate: [10, 20] }).rotate(45).translate(10, 20)
           )
         })
       })
@@ -1132,14 +1175,26 @@ describe('Runner.js', () => {
           const runner = new Runner()
           runner.styleAttr('attr', 'x', 5)
           expect(runner._history.attr.morpher).toEqual(any(Morphable))
-          expect(runner._history.attr.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ])
+          expect(runner._history.attr.morpher.to()).toEqual([
+            'x',
+            SVGNumber,
+            2,
+            5,
+            ''
+          ])
         })
 
         it('adds a morpher for css', () => {
           const runner = new Runner()
           runner.styleAttr('css', 'x', 5)
           expect(runner._history.css.morpher).toEqual(any(Morphable))
-          expect(runner._history.css.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ])
+          expect(runner._history.css.morpher.to()).toEqual([
+            'x',
+            SVGNumber,
+            2,
+            5,
+            ''
+          ])
         })
 
         it('adds init and run fn for execution when runner runs', () => {
@@ -1147,8 +1202,20 @@ describe('Runner.js', () => {
           const runner = new Runner(100).ease('-').element(element)
           runner.styleAttr('attr', 'x', 5)
           runner.step(50)
-          expect(runner._history.attr.morpher.from()).toEqual([ 'x', SVGNumber, 2, 0, '' ])
-          expect(runner._history.attr.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ])
+          expect(runner._history.attr.morpher.from()).toEqual([
+            'x',
+            SVGNumber,
+            2,
+            0,
+            ''
+          ])
+          expect(runner._history.attr.morpher.to()).toEqual([
+            'x',
+            SVGNumber,
+            2,
+            5,
+            ''
+          ])
           expect(element.x()).toBe(2.5)
         })
 
@@ -1157,18 +1224,54 @@ describe('Runner.js', () => {
           const runner = new Runner(100).ease('-').element(element)
           runner.styleAttr('attr', { fill: '#000', stroke: new Color('#fff') })
           runner.step(50)
-          expect(runner._history.attr.morpher.from()).toEqual(
-            [ 'fill', Color, 5, 255, 255, 255, 0, 'rgb', 'stroke', Color, 5, 0, 0, 0, 0, 'rgb' ]
-          )
-
-          expect(runner._history.attr.morpher.to()).toEqual(
-            [ 'fill', Color, 5, 0, 0, 0, 0, 'rgb', 'stroke', Color, 5, 255, 255, 255, 0, 'rgb' ]
-          )
+          expect(runner._history.attr.morpher.from()).toEqual([
+            'fill',
+            Color,
+            5,
+            255,
+            255,
+            255,
+            0,
+            'rgb',
+            'stroke',
+            Color,
+            5,
+            0,
+            0,
+            0,
+            0,
+            'rgb'
+          ])
+
+          expect(runner._history.attr.morpher.to()).toEqual([
+            'fill',
+            Color,
+            5,
+            0,
+            0,
+            0,
+            0,
+            'rgb',
+            'stroke',
+            Color,
+            5,
+            255,
+            255,
+            255,
+            0,
+            'rgb'
+          ])
           const result = runner._history.attr.morpher.at(0.5).valueOf()
           expect(result.fill).toEqual(any(Color))
           expect(result.stroke).toEqual(any(Color))
-          expect(result.fill.toArray()).toEqual([ 127.5, 127.5, 127.5, 0, 'rgb' ])
-          expect(result.stroke.toArray()).toEqual([ 127.5, 127.5, 127.5, 0, 'rgb' ])
+          expect(result.fill.toArray()).toEqual([127.5, 127.5, 127.5, 0, 'rgb'])
+          expect(result.stroke.toArray()).toEqual([
+            127.5,
+            127.5,
+            127.5,
+            0,
+            'rgb'
+          ])
         })
 
         it('it changes color space', () => {
@@ -1176,16 +1279,30 @@ describe('Runner.js', () => {
           const runner = new Runner(100).ease('-').element(element)
           runner.styleAttr('attr', { fill: new Color(100, 12, 12, 'hsl') })
           runner.step(50)
-          expect(runner._history.attr.morpher.from()).toEqual(
-            [ 'fill', Color, 5, 0, 0, 100, 0, 'hsl' ]
-          )
-
-          expect(runner._history.attr.morpher.to()).toEqual(
-            [ 'fill', Color, 5, 100, 12, 12, 0, 'hsl' ]
-          )
+          expect(runner._history.attr.morpher.from()).toEqual([
+            'fill',
+            Color,
+            5,
+            0,
+            0,
+            100,
+            0,
+            'hsl'
+          ])
+
+          expect(runner._history.attr.morpher.to()).toEqual([
+            'fill',
+            Color,
+            5,
+            100,
+            12,
+            12,
+            0,
+            'hsl'
+          ])
           const result = runner._history.attr.morpher.at(0.5).valueOf()
           expect(result.fill).toEqual(any(Color))
-          expect(result.fill.toArray()).toEqual([ 50, 6, 56, 0, 'hsl' ])
+          expect(result.fill.toArray()).toEqual([50, 6, 56, 0, 'hsl'])
           expect(element.fill()).toBe('#969388')
         })
 
@@ -1195,7 +1312,10 @@ describe('Runner.js', () => {
           runner.styleAttr('attr', { fill: new Color(100, 12, 12, 'hsl') })
           runner.step(50)
           expect(element.fill()).toBe('#969388')
-          runner.styleAttr('attr', { fill: new Color(100, 50, 50, 'hsl'), x: 50 })
+          runner.styleAttr('attr', {
+            fill: new Color(100, 50, 50, 'hsl'),
+            x: 50
+          })
           runner.step(25)
           expect(element.fill()).toBe('#b1c37c')
           expect(element.x()).toBe(37.5)
@@ -1213,14 +1333,17 @@ describe('Runner.js', () => {
         })
       })
 
-      function closeTo (number, precision = 2) {
+      function closeTo(number, precision = 2) {
         return {
           /*
            * The asymmetricMatch function is required, and must return a boolean.
            */
           asymmetricMatch: function (compareTo) {
             const factor = 10 ** precision
-            return Math.round((~~(compareTo * factor)) / factor) === Math.round((~~(number * factor)) / factor)
+            return (
+              Math.round(~~(compareTo * factor) / factor) ===
+              Math.round(~~(number * factor) / factor)
+            )
           },
 
           /*
@@ -1228,12 +1351,14 @@ describe('Runner.js', () => {
            * be seen by the user in the message when a test fails.
            */
           jasmineToString: function () {
-            return '<close to: ' + number + ' with precision: ' + precision + '>'
+            return (
+              '<close to: ' + number + ' with precision: ' + precision + '>'
+            )
           }
         }
       }
 
-      function equal (obj) {
+      function equal(obj) {
         return {
           /*
            * The asymmetricMatch function is required, and must return a boolean.
@@ -1242,7 +1367,9 @@ describe('Runner.js', () => {
             if (!(compareTo instanceof obj.constructor)) return false
 
             const keys = Object.keys(obj)
-            const difference = Object.keys(compareTo).filter((el) => !keys.includes(el))
+            const difference = Object.keys(compareTo).filter(
+              (el) => !keys.includes(el)
+            )
 
             if (difference.length) return false
 
@@ -1269,15 +1396,16 @@ describe('Runner.js', () => {
           const runner = new Runner(100).ease('-').element(element)
           runner.zoom(2, { x: 0, y: 0 })
           runner.step(50)
-          expect(runner._history.zoom.morpher.from()).toEqual(
-            [ 1, '' ]
-          )
-          expect(runner._history.zoom.morpher.to()).toEqual(
-            [ 2, '' ]
-          )
+          expect(runner._history.zoom.morpher.from()).toEqual([1, ''])
+          expect(runner._history.zoom.morpher.to()).toEqual([2, ''])
 
           expect(element.zoom()).toBeCloseTo(1.5, 10)
-          expect(element.viewbox().toArray()).toEqual([ 0, 0, closeTo(66.666, 3), closeTo(66.666, 3) ])
+          expect(element.viewbox().toArray()).toEqual([
+            0,
+            0,
+            closeTo(66.666, 3),
+            closeTo(66.666, 3)
+          ])
         })
 
         it('retargets if called twice', () => {
@@ -1286,16 +1414,17 @@ describe('Runner.js', () => {
           runner.zoom(2, { x: 0, y: 0 })
           runner.step(50)
           runner.zoom(4, { x: 0, y: 0 })
-          expect(runner._history.zoom.morpher.from()).toEqual(
-            [ 1, '' ]
-          )
-          expect(runner._history.zoom.morpher.to()).toEqual(
-            [ 4, '' ]
-          )
+          expect(runner._history.zoom.morpher.from()).toEqual([1, ''])
+          expect(runner._history.zoom.morpher.to()).toEqual([4, ''])
 
           runner.step(25)
           expect(element.zoom()).toBeCloseTo(3.25, 10)
-          expect(element.viewbox().toArray()).toEqual([ 0, 0, closeTo(30.769, 3), closeTo(30.769, 3) ])
+          expect(element.viewbox().toArray()).toEqual([
+            0,
+            0,
+            closeTo(30.769, 3),
+            closeTo(30.769, 3)
+          ])
         })
       })
 
@@ -1303,52 +1432,59 @@ describe('Runner.js', () => {
         it('does not retarget for non-declarative transformations', () => {
           const runner = new Runner()
           const spy = spyOn(runner, '_tryRetarget')
-          runner.transform({ translate: [ 10, 20 ] })
+          runner.transform({ translate: [10, 20] })
           expect(spy).not.toHaveBeenCalled()
         })
 
         it('does not retarget for relative transformations', () => {
           const runner = new Runner(new Controller(() => 0))
           const spy = spyOn(runner, '_tryRetarget')
-          runner.transform({ translate: [ 10, 20 ] }, true)
+          runner.transform({ translate: [10, 20] }, true)
           expect(spy).not.toHaveBeenCalled()
         })
 
         it('does retarget for absolute declarative transformations', () => {
           const runner = new Runner(new Controller(() => 0))
           const spy = spyOn(runner, '_tryRetarget')
-          runner.transform({ translate: [ 10, 20 ] })
+          runner.transform({ translate: [10, 20] })
           expect(spy).toHaveBeenCalled()
         })
 
         it('calls queue with isTransform=true', () => {
           const runner = new Runner()
           const spy = spyOn(runner, 'queue')
-          runner.transform({ translate: [ 10, 20 ] })
-          expect(spy).toHaveBeenCalledWith(any(Function), any(Function), any(Function), true)
+          runner.transform({ translate: [10, 20] })
+          expect(spy).toHaveBeenCalledWith(
+            any(Function),
+            any(Function),
+            any(Function),
+            true
+          )
         })
 
         it('steps an affine transformation correctly', () => {
           const element = new Rect()
           const runner = new Runner(100).ease('-').element(element)
-          runner.transform({ translate: [ 10, 20 ], scale: 2, rotate: 90 })
+          runner.transform({ translate: [10, 20], scale: 2, rotate: 90 })
           runner.step(50)
           // transform sets an immediate callback to apply all merged transforms
           // when every runner had the chance to add its bit of transforms
           jasmine.RequestAnimationFrame.tick(1)
-          expect(element.matrix().decompose()).toEqual(objectContaining({
-            translateX: 5,
-            translateY: 10,
-            scaleX: closeTo(1.5, 10),
-            scaleY: closeTo(1.5),
-            rotate: closeTo(45, 10)
-          }))
+          expect(element.matrix().decompose()).toEqual(
+            objectContaining({
+              translateX: 5,
+              translateY: 10,
+              scaleX: closeTo(1.5, 10),
+              scaleY: closeTo(1.5),
+              rotate: closeTo(45, 10)
+            })
+          )
         })
 
         it('retargets an affine transformation correctly', () => {
           const element = new Rect()
           const runner = new Runner(() => 1).element(element)
-          runner.transform({ translate: [ 10, 20 ], scale: 2, rotate: 90 })
+          runner.transform({ translate: [10, 20], scale: 2, rotate: 90 })
           runner.step(50)
           runner.transform({ scale: 2 })
 
@@ -1357,26 +1493,26 @@ describe('Runner.js', () => {
           // on every frame. That is why we step here to see the effect of our retargeting
           runner.step(25)
 
-          expect(runner._history.transform.morpher.to()).toEqual(
-            [ 2, 2, 0, 0, 0, 0, 0, 0 ]
-          )
+          expect(runner._history.transform.morpher.to()).toEqual([
+            2, 2, 0, 0, 0, 0, 0, 0
+          ])
         })
 
         it('retargets an affine transformation correctly and sets new origin', () => {
           const element = new Rect()
           const runner = new Runner(() => 1).element(element)
-          runner.transform({ translate: [ 10, 20 ], scale: 2, rotate: 90 })
+          runner.transform({ translate: [10, 20], scale: 2, rotate: 90 })
           runner.step(50)
-          runner.transform({ scale: 2, origin: [ 10, 10 ] })
+          runner.transform({ scale: 2, origin: [10, 10] })
 
           // transform sets its to-target to the morpher in the initialisation step
           // because it depends on the from-target. Declaritive animation run the init-step
           // on every frame. That is why we step here to see the effect of our retargeting
           runner.step(25)
 
-          expect(runner._history.transform.morpher.to()).toEqual(
-            [ 2, 2, 0, 0, 0, 0, 10, 10 ]
-          )
+          expect(runner._history.transform.morpher.to()).toEqual([
+            2, 2, 0, 0, 0, 0, 10, 10
+          ])
         })
 
         it('steps multiple relative animations correctly', () => {
@@ -1433,9 +1569,7 @@ describe('Runner.js', () => {
           expect(runner1._queue.length).toBe(0)
 
           // The origin is transformed with every
-          expect(element.matrix()).toEqual(
-            new Matrix().scale(1.5).rotate(22.5)
-          )
+          expect(element.matrix()).toEqual(new Matrix().scale(1.5).rotate(22.5))
         })
 
         it('correctly animates matrices directly', () => {
@@ -1456,16 +1590,16 @@ describe('Runner.js', () => {
         it('correctly animates matrices affine', () => {
           const element = new Rect()
           const runner = new Runner(100).ease('-').element(element)
-          runner.transform(Object.assign({ affine: true }, new Matrix({ rotate: 90 })))
+          runner.transform(
+            Object.assign({ affine: true }, new Matrix({ rotate: 90 }))
+          )
           runner.step(50)
           // transform sets an immediate callback to apply all merged transforms
           // when every runner had the chance to add its bit of transforms
           jasmine.RequestAnimationFrame.tick(1)
 
           // The origin is transformed with every
-          expect(element.matrix()).toEqual(
-            new Matrix({ rotate: 45 })
-          )
+          expect(element.matrix()).toEqual(new Matrix({ rotate: 45 }))
         })
 
         it('correctly animates matrices affine by passing third parameter', () => {
@@ -1478,9 +1612,7 @@ describe('Runner.js', () => {
           jasmine.RequestAnimationFrame.tick(1)
 
           // The origin is transformed with every
-          expect(element.matrix()).toEqual(
-            new Matrix({ rotate: 45 })
-          )
+          expect(element.matrix()).toEqual(new Matrix({ rotate: 45 }))
         })
 
         it('correctly animates a declarative relative rotation', () => {
@@ -1563,8 +1695,8 @@ describe('Runner.js', () => {
           runner._queueNumberDelta('x', 10)
           runner.step(50)
           expect(runner._history.x.morpher.type()).toEqual(SVGNumber)
-          expect(runner._history.x.morpher.from()).toEqual([ 10, '' ])
-          expect(runner._history.x.morpher.to()).toEqual([ 20, '' ])
+          expect(runner._history.x.morpher.from()).toEqual([10, ''])
+          expect(runner._history.x.morpher.to()).toEqual([20, ''])
 
           expect(element.x()).toBe(15)
         })
@@ -1576,7 +1708,7 @@ describe('Runner.js', () => {
           runner.step(25)
           runner._queueNumberDelta('x', 20)
 
-          expect(runner._history.x.morpher.to()).toEqual([ 30, '' ])
+          expect(runner._history.x.morpher.to()).toEqual([30, ''])
 
           runner.step(25)
           expect(element.x()).toBe(20)
@@ -1590,8 +1722,8 @@ describe('Runner.js', () => {
           runner._queueObject('x', new SVGNumber(20))
           runner.step(50)
           expect(runner._history.x.morpher.type()).toEqual(SVGNumber)
-          expect(runner._history.x.morpher.from()).toEqual([ 10, '' ])
-          expect(runner._history.x.morpher.to()).toEqual([ 20, '' ])
+          expect(runner._history.x.morpher.from()).toEqual([10, ''])
+          expect(runner._history.x.morpher.to()).toEqual([20, ''])
 
           expect(element.x()).toBe(15)
         })
@@ -1719,25 +1851,25 @@ describe('Runner.js', () => {
 
       describe('plot()', () => {
         it('queues a morphable array', () => {
-          const element = new Polygon().plot([ 10, 10, 20, 20 ])
+          const element = new Polygon().plot([10, 10, 20, 20])
           const runner = new Runner(100).ease('-').element(element)
           runner.plot(20, 20, 30, 30)
           runner.step(50)
-          expect(runner._history.plot.morpher.from()).toEqual([ 10, 10, 20, 20 ])
-          expect(runner._history.plot.morpher.to()).toEqual([ 20, 20, 30, 30 ])
-          expect(element.array()).toEqual(new PointArray([ 15, 15, 25, 25 ]))
+          expect(runner._history.plot.morpher.from()).toEqual([10, 10, 20, 20])
+          expect(runner._history.plot.morpher.to()).toEqual([20, 20, 30, 30])
+          expect(element.array()).toEqual(new PointArray([15, 15, 25, 25]))
         })
 
         it('retargets correctly', () => {
-          const element = new Polygon().plot([ 10, 10, 20, 20 ])
+          const element = new Polygon().plot([10, 10, 20, 20])
           const runner = new Runner(100).ease('-').element(element)
           runner.plot(20, 20, 30, 30)
           runner.step(25)
           runner.plot(30, 30, 40, 40)
           runner.step(25)
-          expect(runner._history.plot.morpher.from()).toEqual([ 10, 10, 20, 20 ])
-          expect(runner._history.plot.morpher.to()).toEqual([ 30, 30, 40, 40 ])
-          expect(element.array()).toEqual(new PointArray([ 20, 20, 30, 30 ]))
+          expect(runner._history.plot.morpher.from()).toEqual([10, 10, 20, 20])
+          expect(runner._history.plot.morpher.to()).toEqual([30, 30, 40, 40])
+          expect(element.array()).toEqual(new PointArray([20, 20, 30, 30]))
         })
       })
 
@@ -1755,7 +1887,10 @@ describe('Runner.js', () => {
           const runner = new Runner()
           const spy = spyOn(runner, '_queueObject')
           runner.viewbox(10, 10, 100, 100)
-          expect(spy).toHaveBeenCalledWith('viewbox', equal(new Box(10, 10, 100, 100)))
+          expect(spy).toHaveBeenCalledWith(
+            'viewbox',
+            equal(new Box(10, 10, 100, 100))
+          )
         })
       })
 
@@ -1785,10 +1920,12 @@ describe('Runner.js', () => {
     describe('mergeWith()', () => {
       it('merges the transformations of a runner with another and returns a FakeRunner', () => {
         const fake = new FakeRunner()
-        const runner = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner = new Runner().addTransform({ translate: [10, 20] })
         const newRunner = fake.mergeWith(runner)
         expect(newRunner).toEqual(any(FakeRunner))
-        expect(newRunner.transforms).toEqual(new Matrix({ translate: [ 10, 20 ] }))
+        expect(newRunner.transforms).toEqual(
+          new Matrix({ translate: [10, 20] })
+        )
       })
     })
   })
@@ -1832,9 +1969,9 @@ describe('Runner.js', () => {
 
     describe('merge()', () => {
       it('merges all runners which are done', () => {
-        const runner1 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner1 = new Runner().addTransform({ translate: [10, 20] })
         const runner2 = new Runner().addTransform({ rotate: 45 })
-        const runner3 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner3 = new Runner().addTransform({ translate: [10, 20] })
         const arr = new RunnerArray()
         arr.add(runner1).add(runner2).add(runner3)
         runner1.done = true
@@ -1843,17 +1980,15 @@ describe('Runner.js', () => {
         arr.merge()
         expect(arr.runners[0]).toEqual(any(FakeRunner))
         expect(arr.runners[0].transforms).toEqual(
-          new Matrix({ translate: [ 10, 20 ] })
-            .rotate(45)
-            .translate(10, 20)
+          new Matrix({ translate: [10, 20] }).rotate(45).translate(10, 20)
         )
       })
 
       it('skips runners which are not done', () => {
-        const runner1 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner1 = new Runner().addTransform({ translate: [10, 20] })
         const runner2 = new Runner().addTransform({ rotate: 45 })
         const runner3 = new Runner().addTransform({ rotate: 45 })
-        const runner4 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner4 = new Runner().addTransform({ translate: [10, 20] })
         const runner5 = new Runner().addTransform({ rotate: 45 })
         const arr = new RunnerArray()
         arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5)
@@ -1865,24 +2000,22 @@ describe('Runner.js', () => {
         arr.merge()
         expect(arr.runners[0]).toEqual(any(FakeRunner))
         expect(arr.runners[0].transforms).toEqual(
-          new Matrix({ translate: [ 10, 20 ] })
-            .rotate(45)
+          new Matrix({ translate: [10, 20] }).rotate(45)
         )
 
         expect(arr.runners[2]).toEqual(any(FakeRunner))
         expect(arr.runners[2].transforms).toEqual(
-          new Matrix({ translate: [ 10, 20 ] })
-            .rotate(45)
+          new Matrix({ translate: [10, 20] }).rotate(45)
         )
 
         expect(arr.runners[1]).toBe(runner3)
       })
 
       it('skips runners which have a timeline and are scheduled on that timeline', () => {
-        const runner1 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner1 = new Runner().addTransform({ translate: [10, 20] })
         const runner2 = new Runner().addTransform({ rotate: 45 })
         const runner3 = new Runner().addTransform({ rotate: 45 })
-        const runner4 = new Runner().addTransform({ translate: [ 10, 20 ] })
+        const runner4 = new Runner().addTransform({ translate: [10, 20] })
         const runner5 = new Runner().addTransform({ rotate: 45 })
         const arr = new RunnerArray()
         arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5)
@@ -1896,14 +2029,12 @@ describe('Runner.js', () => {
         arr.merge()
         expect(arr.runners[0]).toEqual(any(FakeRunner))
         expect(arr.runners[0].transforms).toEqual(
-          new Matrix({ translate: [ 10, 20 ] })
-            .rotate(45)
+          new Matrix({ translate: [10, 20] }).rotate(45)
         )
 
         expect(arr.runners[2]).toEqual(any(FakeRunner))
         expect(arr.runners[2].transforms).toEqual(
-          new Matrix({ translate: [ 10, 20 ] })
-            .rotate(45)
+          new Matrix({ translate: [10, 20] }).rotate(45)
         )
 
         expect(arr.runners[1]).toBe(runner3)
@@ -1940,7 +2071,12 @@ describe('Runner.js', () => {
         arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5)
         arr.clearBefore(runner3.id)
         expect(arr.length()).toBe(4)
-        expect(arr.runners).toEqual([ any(FakeRunner), runner3, runner4, runner5 ])
+        expect(arr.runners).toEqual([
+          any(FakeRunner),
+          runner3,
+          runner4,
+          runner5
+        ])
       })
     })
   })
index 5f511ff7d918902c425aaa9ff03c72e1aab786b7..cbb40f815df5eb2bcc2535d8dc0ece4543e7d8c3 100644 (file)
@@ -1,6 +1,13 @@
 /* globals describe, expect, it, beforeEach, afterEach, spyOn, container, jasmine */
 
-import { Timeline, SVG, Runner, Animator, Queue, Rect } from '../../../src/main.js'
+import {
+  Timeline,
+  SVG,
+  Runner,
+  Animator,
+  Queue,
+  Rect
+} from '../../../src/main.js'
 import { getWindow } from '../../../src/utils/window.js'
 
 const { createSpy, any } = jasmine
@@ -127,7 +134,9 @@ describe('Timeline.js', () => {
     it('throws if when is not supported', () => {
       const timeline = new Timeline().schedule(new Runner(1000), 1000)
       const runner = new Runner(1000)
-      expect(() => timeline.schedule(runner, 0, 'not supported')).toThrowError('Invalid value for the "when" parameter')
+      expect(() => timeline.schedule(runner, 0, 'not supported')).toThrowError(
+        'Invalid value for the "when" parameter'
+      )
     })
 
     it('uses persist value of the runner of present', () => {
@@ -152,7 +161,9 @@ describe('Timeline.js', () => {
     it('gets a runner by its id from the timeline', () => {
       const timeline = new Timeline()
       const runner = new Runner(1000)
-      expect(timeline.schedule(runner).getRunnerInfoById(runner.id).runner).toBe(runner)
+      expect(
+        timeline.schedule(runner).getRunnerInfoById(runner.id).runner
+      ).toBe(runner)
     })
 
     it('returns null of runner not found', () => {
@@ -460,7 +471,10 @@ describe('Timeline.js', () => {
 
     it('continues if there are still runners left from us when going back in time', () => {
       const spy = createSpy()
-      const timeline = new Timeline().on('finished', spy).time(1200).reverse(true)
+      const timeline = new Timeline()
+        .on('finished', spy)
+        .time(1200)
+        .reverse(true)
       const runner = new Runner(1000)
       spy.calls.reset()
       timeline.schedule(runner, 0).play() // we have to play because its synchronous here
index 854204eb67e67bc86de7ee3493ef979a36845b3d..5fcbe87d297545401567d3d302d7fa9c0682f156 100644 (file)
@@ -6,7 +6,6 @@ const { any } = jasmine
 
 const url = 'https://svgjs.dev'
 describe('A.js', () => {
-
   describe('()', () => {
     it('creates a new object of type A', () => {
       expect(new A()).toEqual(any(A))
@@ -81,7 +80,7 @@ describe('A.js', () => {
         expect(link.parent()).toBe(null)
       })
 
-      it('removes also the link when link wasn\'t in document', () => {
+      it("removes also the link when link wasn't in document", () => {
         const link = new A().to(url)
         const rect = link.rect(100, 100)
 
@@ -116,5 +115,4 @@ describe('A.js', () => {
       })
     })
   })
-
 })
index 1effe6dcfec8b9bda3062036b70c387968dcdd79..5061a10017f066aa1d0c2ab6c54f77748eb0a0f7 100644 (file)
@@ -37,7 +37,7 @@ describe('ClipPath.js', () => {
       const canvas = SVG().addTo(container)
       const clip = canvas.clip()
       const rect = canvas.rect(100, 100).clipWith(clip)
-      expect(clip.targets()).toEqual([ rect ])
+      expect(clip.targets()).toEqual([rect])
     })
   })
 
@@ -47,7 +47,7 @@ describe('ClipPath.js', () => {
         const canvas = SVG()
         const clip = canvas.clip()
         expect(clip).toEqual(any(ClipPath))
-        expect(canvas.defs().children()).toEqual([ clip ])
+        expect(canvas.defs().children()).toEqual([clip])
       })
     })
   })
index 5d53eb151dd1b0914524e21b63e9214175dedd72..f9741edeca41cf5757c406c060c0078e78a3edfc 100644 (file)
@@ -61,7 +61,16 @@ describe('Container.js', () => {
     it('flattens the whole document when called on the root', () => {
       canvas.flatten()
 
-      expect(canvas.children()).toEqual([ rect1, rect2, circle1, circle2, line1, line2, circle3, rect3 ])
+      expect(canvas.children()).toEqual([
+        rect1,
+        rect2,
+        circle1,
+        circle2,
+        line1,
+        line2,
+        circle3,
+        rect3
+      ])
     })
 
     it('flattens a group and places all children into its parent when called on a group - 1', () => {
@@ -81,8 +90,15 @@ describe('Container.js', () => {
             rect3
       */
 
-      expect(canvas.children()).toEqual([ rect1, group1, group4 ])
-      expect(group1.children()).toEqual([ rect2, circle1, circle2, line1, line2, circle3 ])
+      expect(canvas.children()).toEqual([rect1, group1, group4])
+      expect(group1.children()).toEqual([
+        rect2,
+        circle1,
+        circle2,
+        line1,
+        line2,
+        circle3
+      ])
     })
 
     it('flattens a group and places all children into its parent when called on a group - 2', () => {
@@ -103,7 +119,7 @@ describe('Container.js', () => {
             rect3
       */
 
-      expect(group2.children()).toEqual([ circle2, line1, line2, circle3 ])
+      expect(group2.children()).toEqual([circle2, line1, line2, circle3])
     })
   })
 
@@ -111,21 +127,27 @@ describe('Container.js', () => {
     it('ungroups a group and inserts all children in the correct order in the parent parent of the group', () => {
       group1.ungroup()
 
-      expect(canvas.children()).toEqual([ rect1, rect2, circle1, group2, group4 ])
+      expect(canvas.children()).toEqual([rect1, rect2, circle1, group2, group4])
 
       group4.ungroup()
 
-      expect(canvas.children()).toEqual([ rect1, rect2, circle1, group2, rect3 ])
+      expect(canvas.children()).toEqual([rect1, rect2, circle1, group2, rect3])
     })
 
     it('ungroups a group into another group and appends the elements to the other group', () => {
       group1.ungroup(group4)
-      expect(group4.children()).toEqual([ rect3, rect2, circle1, group2 ])
+      expect(group4.children()).toEqual([rect3, rect2, circle1, group2])
     })
 
     it('ungroups a group into another group at the specified position', () => {
       group2.ungroup(group1, 1)
-      expect(group1.children()).toEqual([ rect2, circle2, group3, circle3, circle1 ])
+      expect(group1.children()).toEqual([
+        rect2,
+        circle2,
+        group3,
+        circle3,
+        circle1
+      ])
     })
   })
 })
index e33883d35066ed0946308abf023e15ba3b1b288c..3325d9300bc5fcaafe25c3f2b151450fe9297ee4 100644 (file)
@@ -1,12 +1,22 @@
 /* globals describe, expect, it, beforeEach, spyOn, jasmine, container */
 
-import { SVG, G, Rect, Svg, Dom, List, Fragment, Circle, Tspan, create } from '../../../src/main.js'
+import {
+  SVG,
+  G,
+  Rect,
+  Svg,
+  Dom,
+  List,
+  Fragment,
+  Circle,
+  Tspan,
+  create
+} from '../../../src/main.js'
 import { getWindow } from '../../../src/utils/window.js'
 import { svg, html } from '../../../src/modules/core/namespaces.js'
 const { any, createSpy, objectContaining } = jasmine
 
 describe('Dom.js', function () {
-
   describe('()', () => {
     it('creates a new object of type Dom', () => {
       const rect = new Rect()
@@ -119,7 +129,7 @@ describe('Dom.js', function () {
       const rect = g.rect(100, 100)
       const circle = g.circle(100, 100)
       const children = g.children()
-      expect(children).toEqual([ rect, circle ])
+      expect(children).toEqual([rect, circle])
       expect(children).toEqual(any(List))
     })
   })
@@ -197,8 +207,8 @@ describe('Dom.js', function () {
       group.each(spy)
 
       expect(spy.calls.all()).toEqual([
-        objectContaining({ object: group2, args: [ 0, [ group2, circle ] ] }),
-        objectContaining({ object: circle, args: [ 1, [ group2, circle ] ] })
+        objectContaining({ object: group2, args: [0, [group2, circle]] }),
+        objectContaining({ object: circle, args: [1, [group2, circle]] })
       ])
     })
 
@@ -211,9 +221,9 @@ describe('Dom.js', function () {
       group.each(spy, true)
 
       expect(spy.calls.all()).toEqual([
-        objectContaining({ object: group2, args: [ 0, [ group2, circle ] ] }),
-        objectContaining({ object: rect, args: [ 0, [ rect ] ] }),
-        objectContaining({ object: circle, args: [ 1, [ group2, circle ] ] })
+        objectContaining({ object: group2, args: [0, [group2, circle]] }),
+        objectContaining({ object: rect, args: [0, [rect]] }),
+        objectContaining({ object: circle, args: [1, [group2, circle]] })
       ])
     })
   })
@@ -277,7 +287,7 @@ describe('Dom.js', function () {
       expect(g.has(rect)).toBe(true)
     })
 
-    it('returns false if the element hasn\'t the passed element as child', () => {
+    it("returns false if the element hasn't the passed element as child", () => {
       const g = new G()
       const rect = new Rect()
       expect(g.has(rect)).toBe(false)
@@ -437,7 +447,7 @@ describe('Dom.js', function () {
       const rect = new Rect()
       const ret = rect.putIn(g)
       expect(ret).toEqual(any(G))
-      expect(ret.children()).toEqual([ rect ])
+      expect(ret.children()).toEqual([rect])
     })
 
     it('works with a query selector', () => {
@@ -446,7 +456,7 @@ describe('Dom.js', function () {
       const rect = canvas.rect(100, 100)
       const ret = rect.putIn('.test')
       expect(ret).toBe(g)
-      expect(g.children()).toEqual([ rect ])
+      expect(g.children()).toEqual([rect])
     })
   })
 
@@ -460,7 +470,7 @@ describe('Dom.js', function () {
     it('removes the element from the parent', () => {
       const canvas = SVG().addTo(container)
       const rect = canvas.rect(100, 100)
-      expect(canvas.children()).toEqual([ rect ])
+      expect(canvas.children()).toEqual([rect])
       rect.remove()
       expect(canvas.children()).toEqual([])
     })
@@ -473,7 +483,7 @@ describe('Dom.js', function () {
     it('also works when direct child of document-fragment', () => {
       const fragment = new Fragment()
       const rect = fragment.rect(100, 100)
-      expect(fragment.children()).toEqual([ rect ])
+      expect(fragment.children()).toEqual([rect])
       expect(rect.remove()).toBe(rect)
       expect(fragment.children()).toEqual([])
     })
@@ -518,7 +528,7 @@ describe('Dom.js', function () {
       const rect3 = g.rect(100, 100)
       const circle = new Circle()
       rect2.replace(circle)
-      expect(g.children()).toEqual([ rect1, circle, rect3 ])
+      expect(g.children()).toEqual([rect1, circle, rect3])
     })
 
     it('also works without a parent', () => {
@@ -531,17 +541,32 @@ describe('Dom.js', function () {
   describe('round()', () => {
     it('rounds all attributes whose values are numbers to two decimals by default', () => {
       const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 })
-      expect(rect.round().attr()).toEqual({ id: 'foo', x: 10.68, y: 3, width: 123.46 })
+      expect(rect.round().attr()).toEqual({
+        id: 'foo',
+        x: 10.68,
+        y: 3,
+        width: 123.46
+      })
     })
 
     it('rounds all attributes whose values are numbers to the passed precision', () => {
       const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 })
-      expect(rect.round(1).attr()).toEqual({ id: 'foo', x: 10.7, y: 3, width: 123.5 })
+      expect(rect.round(1).attr()).toEqual({
+        id: 'foo',
+        x: 10.7,
+        y: 3,
+        width: 123.5
+      })
     })
 
     it('rounds the given attributes whose values are numbers to the passed precision', () => {
       const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 })
-      expect(rect.round(1, [ 'id', 'x' ]).attr()).toEqual({ id: 'foo', x: 10.7, y: 3, width: 123.456 })
+      expect(rect.round(1, ['id', 'x']).attr()).toEqual({
+        id: 'foo',
+        x: 10.7,
+        y: 3,
+        width: 123.456
+      })
     })
   })
 
@@ -632,9 +657,9 @@ describe('Dom.js', function () {
     })
   })
 
-  describe('writeDataToDom()', () => {
-    // not really testable
-  })
+  // describe('writeDataToDom()', () => {
+  //   // not really testable
+  // })
 
   describe('xml()', () => {
     describe('as setter', () => {
@@ -645,27 +670,27 @@ describe('Dom.js', function () {
 
       it('imports a single element', () => {
         const g = new G().xml('<rect />', undefined, svg)
-        expect(g.children()).toEqual([ any(Rect) ])
+        expect(g.children()).toEqual([any(Rect)])
         expect(g.children()[0].node.namespaceURI).toBe(svg)
       })
 
       it('imports multiple elements', () => {
         const g = new G().xml('<rect /><circle />', undefined, svg)
-        expect(g.children()).toEqual([ any(Rect), any(Circle) ])
+        expect(g.children()).toEqual([any(Rect), any(Circle)])
       })
 
       it('replaces the current element with the imported elements with outerHtml = true', () => {
         const canvas = new Svg()
         const g = canvas.group()
         g.xml('<rect /><circle />', true, svg)
-        expect(canvas.children()).toEqual([ any(Rect), any(Circle) ])
+        expect(canvas.children()).toEqual([any(Rect), any(Circle)])
       })
 
       it('returns the parent when outerHtml = true', () => {
         const canvas = new Svg()
         const g = canvas.group()
         expect(g.xml('<rect /><circle />', true, svg)).toBe(canvas)
-        expect(canvas.children()).toEqual([ any(Rect), any(Circle) ])
+        expect(canvas.children()).toEqual([any(Rect), any(Circle)])
       })
 
       it('works without a parent', () => {
@@ -684,46 +709,58 @@ describe('Dom.js', function () {
       })
 
       it('returns the svg string of the element by default', () => {
-        expect(rect.xml(), svg).toBe('<rect width="123.456" height="234.567"></rect>')
-        expect(canvas.xml(), svg).toBe('<svg><g><rect width="123.456" height="234.567"></rect></g></svg>')
+        expect(rect.xml(), svg).toBe(
+          '<rect width="123.456" height="234.567"></rect>'
+        )
+        expect(canvas.xml(), svg).toBe(
+          '<svg><g><rect width="123.456" height="234.567"></rect></g></svg>'
+        )
       })
 
       it('returns the innerHtml when outerHtml = false', () => {
         expect(rect.xml(false, svg)).toBe('')
-        expect(canvas.xml(false, svg)).toBe('<g><rect width="123.456" height="234.567"></rect></g>')
+        expect(canvas.xml(false, svg)).toBe(
+          '<g><rect width="123.456" height="234.567"></rect></g>'
+        )
       })
 
       it('runs a function on every exported node', () => {
-        expect(rect.xml((el) => el.round(1))).toBe('<rect width="123.5" height="234.6"></rect>')
+        expect(rect.xml((el) => el.round(1))).toBe(
+          '<rect width="123.5" height="234.6"></rect>'
+        )
       })
 
       it('runs a function on every exported node and replaces node with returned node if return value is not falsy', () => {
-        expect(rect.xml((el) => new Circle(), svg)).toBe('<circle></circle>')
-        expect(canvas.xml((el) => new G(), svg)).toBe('<g></g>') // outer <svg> was replaced by an empty g
-        expect(canvas.xml((el) => {
-          if (el instanceof Rect) return new Circle()
-          if (el instanceof Svg) el.removeNamespace()
-        }, svg)).toBe('<svg><g><circle></circle></g></svg>')
+        expect(rect.xml(() => new Circle(), svg)).toBe('<circle></circle>')
+        expect(canvas.xml(() => new G(), svg)).toBe('<g></g>') // outer <svg> was replaced by an empty g
+        expect(
+          canvas.xml((el) => {
+            if (el instanceof Rect) return new Circle()
+            if (el instanceof Svg) el.removeNamespace()
+          }, svg)
+        ).toBe('<svg><g><circle></circle></g></svg>')
       })
 
       it('runs a function on every exported node and removes node if return value is false', () => {
         expect(group.xml(() => false, svg)).toBe('')
         expect(canvas.xml(() => false, svg)).toBe('')
-        expect(canvas.xml((el) => {
-          if (el instanceof Svg) {
-            el.removeNamespace()
-          } else {
-            return false
-          }
-        }, svg)).toBe('<svg></svg>')
+        expect(
+          canvas.xml((el) => {
+            if (el instanceof Svg) {
+              el.removeNamespace()
+            } else {
+              return false
+            }
+          }, svg)
+        ).toBe('<svg></svg>')
       })
 
       it('runs a function on every inner node and exports it when outerHtml = false', () => {
         expect(canvas.xml(() => false, false, svg)).toBe('')
-        expect(canvas.xml(() => undefined, false, svg)).toBe('<g><rect width="123.456" height="234.567"></rect></g>')
+        expect(canvas.xml(() => undefined, false, svg)).toBe(
+          '<g><rect width="123.456" height="234.567"></rect></g>'
+        )
       })
-
     })
-
   })
 })
index 70c3a52ff0a892a7333b4e404a288d7e85a3b230..53c5028e55bad8cedb4041e0c06b949508466afc 100644 (file)
@@ -171,10 +171,10 @@ describe('Element.js', function () {
       const group3 = group2.group()
       const rect = group3.rect(100, 100)
 
-      expect(rect.parents('.test')).toEqual([ group3, group2, group1 ])
-      expect(rect.parents(group2)).toEqual([ group3, group2 ])
+      expect(rect.parents('.test')).toEqual([group3, group2, group1])
+      expect(rect.parents(group2)).toEqual([group3, group2])
       expect(rect.parents(group1).length).toBe(3)
-      expect(rect.parents()).toEqual([ group3, group2, group1, canvas ])
+      expect(rect.parents()).toEqual([group3, group2, group1, canvas])
     })
 
     it('returns array of parents until the closest matching parent', () => {
@@ -185,9 +185,9 @@ describe('Element.js', function () {
       const group3 = group2.group().addClass('foo')
       const rect = group3.rect(100, 100)
 
-      expect(rect.parents('.test')).toEqual([ group3, group2 ])
-      expect(rect.parents('.foo')).toEqual([ group3 ])
-      expect(rect.parents('.test:not(.foo)')).toEqual([ group3, group2, group1 ])
+      expect(rect.parents('.test')).toEqual([group3, group2])
+      expect(rect.parents('.foo')).toEqual([group3])
+      expect(rect.parents('.test:not(.foo)')).toEqual([group3, group2, group1])
     })
 
     it('returns null if the passed element is not an ancestor', () => {
@@ -198,7 +198,6 @@ describe('Element.js', function () {
       const group3 = group2.group()
       const rect = group3.rect(100, 100)
 
-
       expect(rect.parents('.does-not-exist')).toEqual(null)
       expect(rect.parents('.test')).toEqual(null)
       expect(rect.parents(groupA)).toEqual(null)
@@ -274,7 +273,9 @@ describe('Element.js', function () {
     it('writes data from the dom property into the dom', () => {
       element.dom = { foo: 'bar' }
       element.writeDataToDom()
-      expect(element.node.getAttribute('svgjs:data')).toBe(JSON.stringify({ foo: 'bar' }))
+      expect(element.node.getAttribute('svgjs:data')).toBe(
+        JSON.stringify({ foo: 'bar' })
+      )
     })
 
     it('recursively calls writeDataToDom on all children', () => {
index 14e9e00a8664920595a930510a25ebd6533898fe..0040d04da7b7c3632e3627d42afc202bea8d1757 100644 (file)
@@ -5,7 +5,6 @@ import { makeInstance, ForeignObject } from '../../../src/main.js'
 const { any } = jasmine
 
 describe('ForeignObject.js', () => {
-
   describe('()', () => {
     it('creates a new object of type ForeignObject', () => {
       expect(new ForeignObject()).toEqual(any(ForeignObject))
index 8e6503d679b64e431e7953f0a60520bb24eb5549..dfac3d0dff9144b78036398aa9ff0e6965aff8c4 100644 (file)
@@ -7,7 +7,6 @@ import { svg } from '../../../src/modules/core/namespaces.js'
 const { any } = jasmine
 
 describe('Fragment.js', () => {
-
   describe('()', () => {
     it('creates a new object of type Fragment', () => {
       expect(new Fragment()).toEqual(any(Fragment))
@@ -22,7 +21,7 @@ describe('Fragment.js', () => {
       const frag = new Fragment()
       const rect = frag.rect(100, 100)
 
-      expect(frag.children()).toEqual([ rect ])
+      expect(frag.children()).toEqual([rect])
     })
   })
 
@@ -43,7 +42,9 @@ describe('Fragment.js', () => {
         group.rect(123.456, 234.567)
         const spy = spyOn(Dom.prototype, 'xml').and.callThrough()
 
-        expect(frag.xml(false, svg)).toBe('<g><rect width="123.456" height="234.567"></rect></g>')
+        expect(frag.xml(false, svg)).toBe(
+          '<g><rect width="123.456" height="234.567"></rect></g>'
+        )
         expect(spy).toHaveBeenCalledWith(false, svg)
       })
 
@@ -53,10 +54,11 @@ describe('Fragment.js', () => {
         group.rect(123.456, 234.567)
         const spy = spyOn(Dom.prototype, 'xml').and.callThrough()
 
-        expect(frag.xml(true, svg)).toBe('<g><rect width="123.456" height="234.567"></rect></g>')
+        expect(frag.xml(true, svg)).toBe(
+          '<g><rect width="123.456" height="234.567"></rect></g>'
+        )
         expect(spy).toHaveBeenCalledWith(false, svg)
       })
     })
-
   })
 })
index 58dc07d4650de582f23f261529ccbf71952cb3e8..b46e232276fff8b7ae0dd6442a133e92c8054ffd 100644 (file)
@@ -5,7 +5,6 @@ import { G, SVG } from '../../../src/main.js'
 const { any } = jasmine
 
 describe('G.js', () => {
-
   describe('()', () => {
     it('creates a new object of type G', () => {
       expect(new G()).toEqual(any(G))
index 76c36ce579b09f07cae44ffc896df0071f18d913..41b896e9d6c213c4a0dff4b2d09970db2eb7a474 100644 (file)
@@ -46,7 +46,7 @@ describe('Gradient.js', () => {
       const canvas = SVG().addTo(container)
       const gradient = canvas.gradient('linear')
       const rect = canvas.rect(100, 100).fill(gradient)
-      expect(gradient.targets()).toEqual([ rect ])
+      expect(gradient.targets()).toEqual([rect])
     })
   })
 
@@ -69,7 +69,7 @@ describe('Gradient.js', () => {
       const spy = createSpy('gradient')
       gradient.update(spy)
       expect(spy.calls.all()).toEqual([
-        objectContaining({ object: gradient, args: [ gradient ] })
+        objectContaining({ object: gradient, args: [gradient] })
       ])
     })
   })
@@ -102,7 +102,7 @@ describe('Gradient.js', () => {
       const gradient = defs.gradient('linear', spy)
       expect(gradient).toEqual(any(Gradient))
       expect(gradient.type).toBe('linearGradient')
-      expect(defs.children()).toEqual([ gradient ])
+      expect(defs.children()).toEqual([gradient])
       expect(spy).toHaveBeenCalled()
     })
   })
index c7b91d2e6433d0a36c054523d9c99c8354cf865b..2e92e13f5da128ebf6ab7d1219ee8155808b3272 100644 (file)
@@ -7,7 +7,6 @@ const { any, objectContaining, createSpy } = jasmine
 
 const url = 'spec/fixtures/pixel.png'
 describe('Image.js', () => {
-
   describe('()', () => {
     it('creates a new object of type Image', () => {
       expect(new Image()).toEqual(any(Image))
@@ -28,7 +27,7 @@ describe('Image.js', () => {
       const spy = createSpy('image', (e) => {
         expect(e.target.complete).toBe(true)
         expect(spy.calls.all()).toEqual([
-          objectContaining({ object: image, args: [ any(getWindow().Event) ] })
+          objectContaining({ object: image, args: [any(getWindow().Event)] })
         ])
         done()
       }).and.callThrough()
@@ -53,29 +52,37 @@ describe('Image.js', () => {
     })
 
     it('should not change with and height when size already set', (done) => {
-      const image = new Image().load(url, () => {
-        expect(image.attr('height')).toBe(100)
-        expect(image.attr('width')).toBe(100)
-        done()
-      }).size(100, 100)
+      const image = new Image()
+        .load(url, () => {
+          expect(image.attr('height')).toBe(100)
+          expect(image.attr('width')).toBe(100)
+          done()
+        })
+        .size(100, 100)
     })
 
     it('changes size of pattern to image size if parent is pattern and size is 0', (done) => {
       const pattern = new Pattern().size(0, 0)
-      new Image().load(url, () => {
-        expect(pattern.attr('height')).toBe(100)
-        expect(pattern.attr('width')).toBe(100)
-        done()
-      }).size(100, 100).addTo(pattern)
+      new Image()
+        .load(url, () => {
+          expect(pattern.attr('height')).toBe(100)
+          expect(pattern.attr('width')).toBe(100)
+          done()
+        })
+        .size(100, 100)
+        .addTo(pattern)
     })
 
     it('does not change size of pattern if pattern has a size set', (done) => {
       const pattern = new Pattern().size(50, 50)
-      new Image().load(url, () => {
-        expect(pattern.attr('height')).toBe(50)
-        expect(pattern.attr('width')).toBe(50)
-        done()
-      }).size(100, 100).addTo(pattern)
+      new Image()
+        .load(url, () => {
+          expect(pattern.attr('height')).toBe(50)
+          expect(pattern.attr('width')).toBe(50)
+          done()
+        })
+        .size(100, 100)
+        .addTo(pattern)
     })
   })
 
@@ -85,7 +92,7 @@ describe('Image.js', () => {
         const canvas = SVG()
         const image = canvas.image(url)
         expect(image).toBe(image)
-        expect(canvas.children()).toEqual([ image ])
+        expect(canvas.children()).toEqual([image])
       })
     })
   })
@@ -95,21 +102,21 @@ describe('Image.js', () => {
       const canvas = SVG()
       const image = new Image()
       canvas.rect(100, 100).attr('something', image)
-      expect(canvas.defs().children()).toEqual([ any(Pattern) ])
+      expect(canvas.defs().children()).toEqual([any(Pattern)])
       expect(canvas.defs().findOne('image')).toBe(image)
     })
 
     it('creates an image from image path in defs with pattern when attr is fill', () => {
       const canvas = SVG()
       canvas.rect(100, 100).attr('fill', url)
-      expect(canvas.defs().children()).toEqual([ any(Pattern) ])
+      expect(canvas.defs().children()).toEqual([any(Pattern)])
       expect(canvas.defs().findOne('image').attr('href')).toBe(url)
     })
 
     it('creates an image from image path in defs with pattern when attr is stroke', () => {
       const canvas = SVG()
       canvas.rect(100, 100).attr('stroke', url)
-      expect(canvas.defs().children()).toEqual([ any(Pattern) ])
+      expect(canvas.defs().children()).toEqual([any(Pattern)])
       expect(canvas.defs().findOne('image').attr('href')).toBe(url)
     })
   })
index 9f25937e75516340bd495375b439d670fc4fd2d6..48a02bf8a605450f44f5b300c183a78416483854 100644 (file)
@@ -25,7 +25,10 @@ describe('Line.js', () => {
     it('returns a PointArray containing the points of the line', () => {
       const array = line.plot(1, 2, 3, 4).array()
       expect(array).toEqual(any(PointArray))
-      expect(array).toEqual([ [ 1, 2 ], [ 3, 4 ] ])
+      expect(array).toEqual([
+        [1, 2],
+        [3, 4]
+      ])
     })
   })
 
@@ -38,9 +41,14 @@ describe('Line.js', () => {
       const canvas = SVG().addTo(container)
       const line = canvas.line(1, 2, 3, 4)
       line.move(50, 50)
-      expect(line.bbox()).toEqual(objectContaining({
-        x: 50, y: 50, width: 2, height: 2
-      }))
+      expect(line.bbox()).toEqual(
+        objectContaining({
+          x: 50,
+          y: 50,
+          width: 2,
+          height: 2
+        })
+      )
     })
   })
 
@@ -65,19 +73,27 @@ describe('Line.js', () => {
 
     it('calls attr with line attributes when array given', () => {
       const spy = spyOn(line, 'attr')
-      line.plot([ 1, 2, 3, 4 ])
+      line.plot([1, 2, 3, 4])
       expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 })
     })
 
     it('calls attr with line attributes when multi array given', () => {
       const spy = spyOn(line, 'attr')
-      line.plot([ [ 1, 2 ], [ 3, 4 ] ])
+      line.plot([
+        [1, 2],
+        [3, 4]
+      ])
       expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 })
     })
 
     it('calls attr with line attributes when PointArray given', () => {
       const spy = spyOn(line, 'attr')
-      line.plot(new PointArray([ [ 1, 2 ], [ 3, 4 ] ]))
+      line.plot(
+        new PointArray([
+          [1, 2],
+          [3, 4]
+        ])
+      )
       expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 })
     })
   })
@@ -91,27 +107,42 @@ describe('Line.js', () => {
       const canvas = SVG().addTo(container)
       const line = canvas.line(1, 2, 3, 4)
       line.size(50, 50)
-      expect(line.bbox()).toEqual(objectContaining({
-        width: 50, height: 50, x: 1, y: 2
-      }))
+      expect(line.bbox()).toEqual(
+        objectContaining({
+          width: 50,
+          height: 50,
+          x: 1,
+          y: 2
+        })
+      )
     })
 
     it('changes height proportionally', () => {
       const canvas = SVG().addTo(container)
       const line = canvas.line(1, 2, 3, 4)
       line.size(50, null)
-      expect(line.bbox()).toEqual(objectContaining({
-        width: 50, height: 50, x: 1, y: 2
-      }))
+      expect(line.bbox()).toEqual(
+        objectContaining({
+          width: 50,
+          height: 50,
+          x: 1,
+          y: 2
+        })
+      )
     })
 
     it('changes width proportionally', () => {
       const canvas = SVG().addTo(container)
       const line = canvas.line(1, 2, 3, 4)
       line.size(null, 50)
-      expect(line.bbox()).toEqual(objectContaining({
-        width: 50, height: 50, x: 1, y: 2
-      }))
+      expect(line.bbox()).toEqual(
+        objectContaining({
+          width: 50,
+          height: 50,
+          x: 1,
+          y: 2
+        })
+      )
     })
   })
 
@@ -120,14 +151,20 @@ describe('Line.js', () => {
       it('creates a line with given points', () => {
         const group = new G()
         const line = group.line(1, 2, 3, 4)
-        expect(line.array()).toEqual([ [ 1, 2 ], [ 3, 4 ] ])
+        expect(line.array()).toEqual([
+          [1, 2],
+          [3, 4]
+        ])
         expect(line).toEqual(any(Line))
       })
 
       it('defaults to zero line', () => {
         const group = new G()
         const line = group.line()
-        expect(line.array()).toEqual([ [ 0, 0 ], [ 0, 0 ] ])
+        expect(line.array()).toEqual([
+          [0, 0],
+          [0, 0]
+        ])
         expect(line).toEqual(any(Line))
       })
     })
index 63e06fe6be851b2c67b63faa16f21752e00aa3ba..cddfc50080a032348eb47a3045d3f1e2e219a82e 100644 (file)
@@ -5,7 +5,6 @@ import { Marker, SVG, Defs } from '../../../src/main.js'
 const { any } = jasmine
 
 describe('Marker.js', function () {
-
   describe('()', () => {
     it('creates a new object of type Marker', () => {
       expect(new Marker()).toEqual(any(Marker))
@@ -106,7 +105,7 @@ describe('Marker.js', function () {
         expect(marker.attr('viewBox')).toBe('0 0 10 12')
         expect(marker.attr('orient')).toBe('auto')
         expect(marker).toEqual(any(Marker))
-        expect(defs.children()).toEqual([ marker ])
+        expect(defs.children()).toEqual([marker])
       })
     })
   })
@@ -117,7 +116,9 @@ describe('Marker.js', function () {
     beforeEach(() => {
       // because we use `reference` here we need to put it into the live dom
       canvas = new SVG().addTo(container)
-      path = canvas.path('M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100')
+      path = canvas.path(
+        'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+      )
     })
 
     it('creates an instance of Marker', () => {
@@ -172,7 +173,5 @@ describe('Marker.js', function () {
         expect(path.node.getAttribute('marker-mid')).toBe(marker.toString())
       })
     })
-
   })
-
 })
index 32e5d15f5e109a47d16b1102069e5559aa5d9572..08a1aaa4b8bfb8f0216f874c21ae20e0905cd7f5 100644 (file)
@@ -5,7 +5,6 @@ import { Mask, SVG, Container, Rect } from '../../../src/main.js'
 const { any } = jasmine
 
 describe('Mask.js', () => {
-
   describe('()', () => {
     it('creates a new object of type Mask', () => {
       expect(new Mask()).toEqual(any(Mask))
@@ -38,7 +37,7 @@ describe('Mask.js', () => {
       const canvas = SVG().addTo(container)
       const mask = canvas.mask()
       const rect = canvas.rect(100, 100).maskWith(mask)
-      expect(mask.targets()).toEqual([ rect ])
+      expect(mask.targets()).toEqual([rect])
     })
   })
 
@@ -48,7 +47,7 @@ describe('Mask.js', () => {
         const canvas = SVG()
         const mask = canvas.mask()
         expect(mask).toEqual(any(Mask))
-        expect(canvas.defs().children()).toEqual([ mask ])
+        expect(canvas.defs().children()).toEqual([mask])
       })
     })
   })
index d43857e5e2fb9c9e839f2d3bb8d96ac8b6c3844a..08105bc95d064d23703fb44eb4412aab07d1c22e 100644 (file)
@@ -25,7 +25,10 @@ describe('Path.js', () => {
     it('returns the underlying PathArray', () => {
       const array = path.plot('M1 2 3 4').array()
       expect(array).toEqual(any(PathArray))
-      expect(array).toEqual([ [ 'M', 1, 2 ], [ 'L', 3, 4 ] ])
+      expect(array).toEqual([
+        ['M', 1, 2],
+        ['L', 3, 4]
+      ])
     })
   })
 
@@ -61,9 +64,14 @@ describe('Path.js', () => {
       const canvas = SVG().addTo(container)
       const path = canvas.path('M0 0 50, 50')
       path.move(50, 50)
-      expect(path.bbox()).toEqual(objectContaining({
-        x: 50, y: 50, width: 50, height: 50
-      }))
+      expect(path.bbox()).toEqual(
+        objectContaining({
+          x: 50,
+          y: 50,
+          width: 50,
+          height: 50
+        })
+      )
     })
   })
 
@@ -82,20 +90,37 @@ describe('Path.js', () => {
 
     it('works with flat array', () => {
       const spy = spyOn(path, 'attr')
-      path.plot([ 'M', 0, 0, 'L', 50, 50 ])
-      expect(spy).toHaveBeenCalledWith('d', [ [ 'M', 0, 0 ], [ 'L', 50, 50 ] ])
+      path.plot(['M', 0, 0, 'L', 50, 50])
+      expect(spy).toHaveBeenCalledWith('d', [
+        ['M', 0, 0],
+        ['L', 50, 50]
+      ])
     })
 
     it('works with multi array', () => {
       const spy = spyOn(path, 'attr')
-      path.plot([ [ 'M', 0, 0 ], [ 'L', 50, 50 ] ])
-      expect(spy).toHaveBeenCalledWith('d', [ [ 'M', 0, 0 ], [ 'L', 50, 50 ] ])
+      path.plot([
+        ['M', 0, 0],
+        ['L', 50, 50]
+      ])
+      expect(spy).toHaveBeenCalledWith('d', [
+        ['M', 0, 0],
+        ['L', 50, 50]
+      ])
     })
 
     it('works with PathArray', () => {
       const spy = spyOn(path, 'attr')
-      path.plot(new PathArray([ [ 'M', 0, 0 ], [ 'L', 50, 50 ] ]))
-      expect(spy).toHaveBeenCalledWith('d', [ [ 'M', 0, 0 ], [ 'L', 50, 50 ] ])
+      path.plot(
+        new PathArray([
+          ['M', 0, 0],
+          ['L', 50, 50]
+        ])
+      )
+      expect(spy).toHaveBeenCalledWith('d', [
+        ['M', 0, 0],
+        ['L', 50, 50]
+      ])
     })
   })
 
@@ -108,27 +133,42 @@ describe('Path.js', () => {
       const canvas = SVG().addTo(container)
       const path = canvas.path('M0 0 50, 50')
       path.size(100, 100)
-      expect(path.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(path.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
 
     it('changes height proportionally', () => {
       const canvas = SVG().addTo(container)
       const path = canvas.path('M0 0 50, 50')
       path.size(100, null)
-      expect(path.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(path.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
 
     it('changes width proportionally', () => {
       const canvas = SVG().addTo(container)
       const path = canvas.path('M0 0 50, 50')
       path.size(null, 100)
-      expect(path.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(path.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
   })
 
index 670a1af565533c213f385fd9a15ca818823422e3..edc98413ecc141ed6611801afd74751da885a8cc 100644 (file)
@@ -39,7 +39,7 @@ describe('Pattern.js', () => {
       const canvas = SVG().addTo(container)
       const pattern = canvas.pattern()
       const rect = canvas.rect(100, 100).fill(pattern)
-      expect(pattern.targets()).toEqual([ rect ])
+      expect(pattern.targets()).toEqual([rect])
     })
   })
 
@@ -62,7 +62,7 @@ describe('Pattern.js', () => {
       const spy = createSpy('pattern')
       pattern.update(spy)
       expect(spy.calls.all()).toEqual([
-        objectContaining({ object: pattern, args: [ pattern ] })
+        objectContaining({ object: pattern, args: [pattern] })
       ])
     })
   })
@@ -94,9 +94,14 @@ describe('Pattern.js', () => {
       const spy = createSpy('pattern')
       const pattern = defs.pattern(100, 100, spy)
       expect(pattern).toEqual(any(Pattern))
-      expect(defs.children()).toEqual([ pattern ])
+      expect(defs.children()).toEqual([pattern])
       expect(spy).toHaveBeenCalled()
-      expect(pattern.attr([ 'x', 'y', 'width', 'height' ])).toEqual({ x: 0, y: 0, width: 100, height: 100 })
+      expect(pattern.attr(['x', 'y', 'width', 'height'])).toEqual({
+        x: 0,
+        y: 0,
+        width: 100,
+        height: 100
+      })
     })
   })
 })
index 8a3f226f3931501d19f4a6468e7accf34a1d1071..872aa3278c1240f0fd9e21bc396e0a66a1f3f077 100644 (file)
@@ -19,8 +19,11 @@ describe('Polygon.js', () => {
     describe('polygon()', () => {
       it('creates a polygon with given points', () => {
         const group = new G()
-        const polygon = group.polygon([ 1, 2, 3, 4 ])
-        expect(polygon.array()).toEqual([ [ 1, 2 ], [ 3, 4 ] ])
+        const polygon = group.polygon([1, 2, 3, 4])
+        expect(polygon.array()).toEqual([
+          [1, 2],
+          [3, 4]
+        ])
         expect(polygon).toEqual(any(Polygon))
       })
     })
@@ -28,7 +31,7 @@ describe('Polygon.js', () => {
     it('creates a polygon with one point by default', () => {
       const group = new G()
       const polygon = group.polygon()
-      expect(polygon.array()).toEqual([ [ 0, 0 ] ])
+      expect(polygon.array()).toEqual([[0, 0]])
       expect(polygon).toEqual(any(Polygon))
     })
   })
index 76dca306c9a5d2075781f9bcef46e42ab8a22e7d..e4a571f1a56950c5ce21d242a84bc411e6a8721b 100644 (file)
@@ -19,15 +19,18 @@ describe('Polyline.js', () => {
     describe('polyline()', () => {
       it('creates a polyline with given points', () => {
         const group = new G()
-        const polyline = group.polyline([ 1, 2, 3, 4 ])
-        expect(polyline.array()).toEqual([ [ 1, 2 ], [ 3, 4 ] ])
+        const polyline = group.polyline([1, 2, 3, 4])
+        expect(polyline.array()).toEqual([
+          [1, 2],
+          [3, 4]
+        ])
         expect(polyline).toEqual(any(Polyline))
       })
 
       it('creates a polyline with one point by default', () => {
         const group = new G()
         const polyline = group.polyline()
-        expect(polyline.array()).toEqual([ [ 0, 0 ] ])
+        expect(polyline.array()).toEqual([[0, 0]])
         expect(polyline).toEqual(any(Polyline))
       })
     })
index 230078f30b33aa0dc8c6d6f3d6a411cc4c51da4e..20b511780335522e16ef3d182fbdd426779086e3 100644 (file)
@@ -20,7 +20,10 @@ describe('Rect.js', () => {
       it('creates a rect with given size', () => {
         const group = new G()
         const rect = group.rect(100, 100)
-        expect(rect.attr([ 'width', 'height' ])).toEqual({ width: 100, height: 100 })
+        expect(rect.attr(['width', 'height'])).toEqual({
+          width: 100,
+          height: 100
+        })
         expect(rect).toEqual(any(Rect))
       })
     })
index e2ce2a83598d5ac9b56cb937f2849b2a4bf22ba3..e58cb24235519feb18086cb02ce2bd0981d8a520 100644 (file)
@@ -66,7 +66,11 @@ describe('Stop.js', () => {
 
       it('creates stop in the gradient with object given', () => {
         const gradient = new Gradient('linear')
-        const stop = gradient.stop({ offset: 0.1, color: '#ffffff', opacity: 0.5 })
+        const stop = gradient.stop({
+          offset: 0.1,
+          color: '#ffffff',
+          opacity: 0.5
+        })
         expect(stop.attr('offset')).toBe(0.1)
         expect(stop.attr('stop-color')).toBe('#ffffff')
         expect(stop.attr('stop-opacity')).toBe(0.5)
index 7b69dd3fd23980a6e435897fcaf665fc12459679..fd587a18b91905faa222556d2f157e75002677fb 100644 (file)
@@ -33,13 +33,17 @@ describe('Style.js', () => {
     it('adds a font-face rule to load a custom font and returns itself', () => {
       const style = new Style()
       expect(style.font('fontName', 'url')).toBe(style)
-      expect(style.node.textContent).toBe('@font-face{font-family:fontName;src:url;}')
+      expect(style.node.textContent).toBe(
+        '@font-face{font-family:fontName;src:url;}'
+      )
     })
 
     it('adds extra parameters if wanted', () => {
       const style = new Style()
       style.font('fontName', 'url', { foo: 'bar' })
-      expect(style.node.textContent).toBe('@font-face{font-family:fontName;src:url;foo:bar;}')
+      expect(style.node.textContent).toBe(
+        '@font-face{font-family:fontName;src:url;foo:bar;}'
+      )
     })
   })
 
@@ -78,7 +82,9 @@ describe('Style.js', () => {
         const g = new G()
         const style = g.fontface('fontName', 'url', { foo: 'bar' })
         expect(style).toEqual(any(Style))
-        expect(style.node.textContent).toBe('@font-face{font-family:fontName;src:url;foo:bar;}')
+        expect(style.node.textContent).toBe(
+          '@font-face{font-family:fontName;src:url;foo:bar;}'
+        )
       })
     })
   })
index 990992a2db478b435de74231d0150a23c8ffadb3..6da7729c1ceb7856e435257b70dc2acbd0037222 100644 (file)
@@ -1,13 +1,16 @@
 /* globals describe, expect, it, jasmine, container */
 
 import { Svg, SVG, Defs } from '../../../src/main.js'
-import { svg as ns, xlink, svgjs } from '../../../src/modules/core/namespaces.js'
+import {
+  svg as ns,
+  xlink,
+  svgjs
+} from '../../../src/modules/core/namespaces.js'
 import { getWindow } from '../../../src/utils/window.js'
 
 const { any } = jasmine
 
 describe('Svg.js', () => {
-
   describe('()', () => {
     it('creates a new object of type Svg', () => {
       expect(new Svg()).toEqual(any(Svg))
index 12be314594a3fe0e88338b35bf4d9252eb213457..6d9c17eacdfb78e0bc8ad499440849901f1abe7f 100644 (file)
@@ -21,7 +21,7 @@ describe('Symbol.js', () => {
         const g = new G()
         const symbol = g.symbol()
         expect(symbol).toEqual(any(Symbol))
-        expect(g.children()).toEqual([ symbol ])
+        expect(g.children()).toEqual([symbol])
       })
     })
   })
index e1a74d2dc04d67ae32f831c63404faa2fa5dbe26..b0c5a9ac2550aa2e46496a55fa16713b63d3f63d 100644 (file)
@@ -1,6 +1,13 @@
 /* globals describe, expect, it, spyOn jasmine, container */
 
-import { Text, Number as SVGNumber, SVG, G, Path, TextPath } from '../../../src/main.js'
+import {
+  Text,
+  Number as SVGNumber,
+  SVG,
+  G,
+  Path,
+  TextPath
+} from '../../../src/main.js'
 
 const { any } = jasmine
 
index 91c78c8c7d96750f816f3679c5e2d7b836429949..5e85bdbc9f72660c1375169aba91dc0ab7af656d 100644 (file)
@@ -7,7 +7,8 @@ const { any } = jasmine
 describe('TextPath.js', () => {
   var canvas, text, path
   var txt = 'We go up, then we go down, then up again'
-  var data = 'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+  var data =
+    'M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
 
   beforeEach(() => {
     canvas = new SVG().addTo(container)
@@ -144,9 +145,8 @@ describe('TextPath.js', () => {
     describe('targets', () => {
       it('returns all elements referencing this path with href', () => {
         const textPath = text.path(path)
-        expect(path.targets()).toEqual([ textPath ])
+        expect(path.targets()).toEqual([textPath])
       })
     })
   })
-
 })
index d6f42b2eb088aa13108fcf7a8609e218cae88862..879267c739952b4d95ddf81233a3815580f583c2 100644 (file)
@@ -98,11 +98,12 @@ describe('Tspan.js', () => {
       text.tspan('Second Line').newLine()
       const third = text.tspan('Third Line').newLine()
 
-      const fontSize = getWindow().getComputedStyle(third.node).getPropertyValue('font-size')
+      const fontSize = getWindow()
+        .getComputedStyle(third.node)
+        .getPropertyValue('font-size')
       const dy = 2 * new SVGNumber(fontSize)
       expect(third.dy()).toBe(dy)
     })
-
   })
 
   describe('Tspan', () => {
index e73fb5341cf98cced7bb33675907f61d905f42da..b47794a4c520082e5458a7544fad8ae890af10dd 100644 (file)
@@ -6,7 +6,6 @@ import { registerAttrHook } from '../../../../src/modules/core/attr.js'
 const { objectContaining } = jasmine
 
 describe('attr.js', () => {
-
   describe('attr()', () => {
     let element
 
@@ -83,13 +82,13 @@ describe('attr.js', () => {
         'fill-opacity': 0.5
       })
 
-      const ret = element.attr([ 'x', 'fill-opacity' ])
+      const ret = element.attr(['x', 'fill-opacity'])
 
       expect(ret).toEqual({ x: 1, 'fill-opacity': 0.5 })
     })
 
     it('correctly creates SVG.Array if array given', () => {
-      element.attr('something', [ 2, 3, 4 ])
+      element.attr('something', [2, 3, 4])
       expect(element.attr('something')).toBe('2 3 4')
     })
 
@@ -120,8 +119,9 @@ describe('attr.js', () => {
         element.attr('name', 'Bob')
       }
 
-      expect(throwingFn).toThrowError('This hook should only be executed in one test')
+      expect(throwingFn).toThrowError(
+        'This hook should only be executed in one test'
+      )
     })
   })
-
 })
index a6324d84c66bf387d3a2749e340ad603f31073da..95217c0446c767b966bd072b08e2a60f84694cc0 100644 (file)
@@ -94,5 +94,4 @@ describe('circled.js', () => {
       expect(element.height()).toBe(100)
     })
   })
-
 })
index 740f99fb57fbaf7b49d02b5922bc47c3f1e34de1..011d9a83f1fae4ee201b36bbfbef7a6578712c80 100644 (file)
@@ -5,7 +5,6 @@ import { Box, create, Element, G, Rect, SVG } from '../../../../src/main.js'
 const { any, objectContaining } = jasmine
 
 describe('containerGeometry.js', () => {
-
   describe('dmove()', () => {
     it('moves the bbox of the group by a certain amount (1)', () => {
       const canvas = SVG().addTo(container)
@@ -17,9 +16,14 @@ describe('containerGeometry.js', () => {
       g.dmove(10, 10)
 
       const box = g.bbox()
-      expect(box).toEqual(objectContaining({
-        x: 20, y: 30, width: box.width, height: box.height
-      }))
+      expect(box).toEqual(
+        objectContaining({
+          x: 20,
+          y: 30,
+          width: box.width,
+          height: box.height
+        })
+      )
     })
 
     it('moves the bbox of the group by a certain amount (2)', () => {
@@ -55,9 +59,14 @@ describe('containerGeometry.js', () => {
       expect(fn).not.toThrowError()
 
       const box = g.bbox()
-      expect(box).toEqual(objectContaining({
-        x: 20, y: 30, width: box.width, height: box.height
-      }))
+      expect(box).toEqual(
+        objectContaining({
+          x: 20,
+          y: 30,
+          width: box.width,
+          height: box.height
+        })
+      )
     })
   })
 
@@ -211,7 +220,6 @@ describe('containerGeometry.js', () => {
       expect(newBox.w).toBeCloseTo(100, 4)
       expect(newBox.h).toBeCloseTo(100, 4)
     })
-
   })
 
   describe('width()', () => {
index a395a4b1ba36a2b39627b6d3a0bc530a33a84b79..e259593988efdc68fce13b337a3fed065adf5405 100644 (file)
@@ -1,5 +1,13 @@
 /* globals describe, expect, it, spyOn, jasmine */
-import { windowEvents, getEvents, getEventTarget, clearEvents, dispatch, on, off } from '../../../../src/modules/core/event.js'
+import {
+  windowEvents,
+  getEvents,
+  getEventTarget,
+  clearEvents,
+  dispatch,
+  on,
+  off
+} from '../../../../src/modules/core/event.js'
 import { getWindow } from '../../../../src/utils/window.js'
 import { EventTarget, SVG } from '../../../../src/main.js'
 
@@ -68,7 +76,7 @@ describe('event.js', () => {
     it('binds to multiple events passed as array', () => {
       const eventTarget = new EventTarget()
       const spy = createSpy('spy')
-      on(eventTarget, [ 'event1', 'event2', 'event3' ], spy)
+      on(eventTarget, ['event1', 'event2', 'event3'], spy)
       dispatch(eventTarget, 'event1')
       dispatch(eventTarget, 'event2')
       dispatch(eventTarget, 'event3')
@@ -112,11 +120,11 @@ describe('event.js', () => {
     it('unbinds multiple events with space or comma separated string', () => {
       const eventTarget = new EventTarget()
       const spy = createSpy('spy')
-      on(eventTarget, [ 'event1', 'event2', 'event3' ], spy)
+      on(eventTarget, ['event1', 'event2', 'event3'], spy)
       dispatch(eventTarget, 'event1')
       dispatch(eventTarget, 'event2')
       dispatch(eventTarget, 'event3')
-      off(eventTarget, [ 'event1', 'event2', 'event3' ], spy)
+      off(eventTarget, ['event1', 'event2', 'event3'], spy)
       dispatch(eventTarget, 'event1')
       dispatch(eventTarget, 'event2')
       dispatch(eventTarget, 'event3')
@@ -136,11 +144,11 @@ describe('event.js', () => {
     it('unbinds all events including namespaced ones when only event is passed', () => {
       const eventTarget = new EventTarget()
       const spy = createSpy('spy')
-      on(eventTarget, [ 'event1.ns1', 'event2.ns2', 'event3' ], spy)
+      on(eventTarget, ['event1.ns1', 'event2.ns2', 'event3'], spy)
       dispatch(eventTarget, 'event1')
       dispatch(eventTarget, 'event2')
       dispatch(eventTarget, 'event3')
-      off(eventTarget, [ 'event1', 'event2', 'event3' ])
+      off(eventTarget, ['event1', 'event2', 'event3'])
       dispatch(eventTarget, 'event1')
       dispatch(eventTarget, 'event2')
       dispatch(eventTarget, 'event3')
@@ -192,7 +200,12 @@ describe('event.js', () => {
     it('dispatches a custom event on the EventTarget by calling dispatchEvent()', () => {
       const eventTarget = new EventTarget()
       const spy = spyOn(eventTarget, 'dispatchEvent')
-      const event = dispatch(eventTarget, 'event', { some: 'data' }, { cancelable: false })
+      const event = dispatch(
+        eventTarget,
+        'event',
+        { some: 'data' },
+        { cancelable: false }
+      )
       expect(event).toEqual(any(getWindow().CustomEvent))
       expect(spy).toHaveBeenCalledWith(event)
       expect(event.detail).toEqual({ some: 'data' })
index ba159f57850317cc7d57d93642c635283f9d016e..7b2c22788e26d27804d3267b315e501ca73ace1d 100644 (file)
@@ -3,7 +3,6 @@
 import { Gradient } from '../../../../src/main.js'
 
 describe('gradiented.js', () => {
-
   describe('from()', () => {
     it('sets fx and fy for radial gradients and returns itself', () => {
       const gradient = new Gradient('radial')
@@ -35,5 +34,4 @@ describe('gradiented.js', () => {
       expect(gradient.attr('y2')).toBe(20)
     })
   })
-
 })
index bbe247521bae521be0bf0c9f6cb731a435464952..77bf2d31ebd8fdf43c3c8945d436d05dc0f6e8c0 100644 (file)
@@ -8,12 +8,11 @@ describe('pointed.js', () => {
   beforeEach(() => {
     canvas = SVG().addTo(container)
     const line = canvas.line(1, 2, 3, 4)
-    const polygon = canvas.polygon([ 1, 2, 3, 4 ])
-    const polyline = canvas.polyline([ 1, 2, 3, 4 ])
+    const polygon = canvas.polygon([1, 2, 3, 4])
+    const polyline = canvas.polyline([1, 2, 3, 4])
     lines = { line, polygon, polyline }
   })
-
-  ;[ 'line', 'polygon', 'polyline' ].forEach((l) => {
+  ;['line', 'polygon', 'polyline'].forEach((l) => {
     describe('for ' + l, () => {
       describe('x()', () => {
         it('sets the x value of the ' + l + 'and returns itself', () => {
index c44bebce063ff0d7d840eeab0edd367c88288379..e4c3bed594298dc154f4eb73aad3ee1c9459e642 100644 (file)
@@ -15,7 +15,10 @@ describe('Polygon.js', () => {
     it('returns the underlying PointArray', () => {
       const array = poly.plot('1 2 3 4').array()
       expect(array).toEqual(any(PointArray))
-      expect(array).toEqual([ [ 1, 2 ], [ 3, 4 ] ])
+      expect(array).toEqual([
+        [1, 2],
+        [3, 4]
+      ])
     })
   })
 
@@ -36,9 +39,14 @@ describe('Polygon.js', () => {
       const canvas = SVG().addTo(container)
       const poly = canvas.polygon('0 0 50 50')
       poly.move(50, 50)
-      expect(poly.bbox()).toEqual(objectContaining({
-        x: 50, y: 50, width: 50, height: 50
-      }))
+      expect(poly.bbox()).toEqual(
+        objectContaining({
+          x: 50,
+          y: 50,
+          width: 50,
+          height: 50
+        })
+      )
     })
   })
 
@@ -57,20 +65,37 @@ describe('Polygon.js', () => {
 
     it('works with flat array', () => {
       const spy = spyOn(poly, 'attr')
-      poly.plot([ 1, 2, 3, 4 ])
-      expect(spy).toHaveBeenCalledWith('points', [ [ 1, 2 ], [ 3, 4 ] ])
+      poly.plot([1, 2, 3, 4])
+      expect(spy).toHaveBeenCalledWith('points', [
+        [1, 2],
+        [3, 4]
+      ])
     })
 
     it('works with multi array', () => {
       const spy = spyOn(poly, 'attr')
-      poly.plot([ [ 1, 2 ], [ 3, 4 ] ])
-      expect(spy).toHaveBeenCalledWith('points', [ [ 1, 2 ], [ 3, 4 ] ])
+      poly.plot([
+        [1, 2],
+        [3, 4]
+      ])
+      expect(spy).toHaveBeenCalledWith('points', [
+        [1, 2],
+        [3, 4]
+      ])
     })
 
     it('works with PointArray', () => {
       const spy = spyOn(poly, 'attr')
-      poly.plot(new PointArray([ [ 1, 2 ], [ 3, 4 ] ]))
-      expect(spy).toHaveBeenCalledWith('points', [ [ 1, 2 ], [ 3, 4 ] ])
+      poly.plot(
+        new PointArray([
+          [1, 2],
+          [3, 4]
+        ])
+      )
+      expect(spy).toHaveBeenCalledWith('points', [
+        [1, 2],
+        [3, 4]
+      ])
     })
   })
 
@@ -83,27 +108,42 @@ describe('Polygon.js', () => {
       const canvas = SVG().addTo(container)
       const poly = canvas.polygon('0 0 50 50')
       poly.size(100, 100)
-      expect(poly.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(poly.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
 
     it('changes height proportionally', () => {
       const canvas = SVG().addTo(container)
       const poly = canvas.polygon('0 0 50 50')
       poly.size(100, null)
-      expect(poly.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(poly.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
 
     it('changes width proportionally', () => {
       const canvas = SVG().addTo(container)
       const poly = canvas.polygon('0 0 50 50')
       poly.size(null, 100)
-      expect(poly.bbox()).toEqual(objectContaining({
-        width: 100, height: 100, x: 0, y: 0
-      }))
+      expect(poly.bbox()).toEqual(
+        objectContaining({
+          width: 100,
+          height: 100,
+          x: 0,
+          y: 0
+        })
+      )
     })
   })
 })
index 5040fbd7057bcd613ad0aeea2a86302c7a9952a0..37f774c59d71de0db7c6a3ba18787af43bffa0f3 100644 (file)
@@ -96,14 +96,26 @@ describe('regex.js', () => {
 
   describe('transforms', () => {
     it('splits a transform chain', () => {
-      const split = 'rotate(34) translate(1,2), translate(1 ,  3),rotate(12)    ,   something(1,2,3)'.split(regex.transforms)
-      expect(split).toEqual([ 'rotate(34', 'translate(1,2', 'translate(1 ,  3', 'rotate(12', 'something(1,2,3', '' ])
+      const split =
+        'rotate(34) translate(1,2), translate(1 ,  3),rotate(12)    ,   something(1,2,3)'.split(
+          regex.transforms
+        )
+      expect(split).toEqual([
+        'rotate(34',
+        'translate(1,2',
+        'translate(1 ,  3',
+        'rotate(12',
+        'something(1,2,3',
+        ''
+      ])
     })
   })
 
   describe('whitespace', () => {
     it('replaces all whitespaces', () => {
-      expect('   \n \r   \t   '.replace(regex.whitespace, ' ')).toBe('             ')
+      expect('   \n \r   \t   '.replace(regex.whitespace, ' ')).toBe(
+        '             '
+      )
     })
   })
 
@@ -196,7 +208,7 @@ describe('regex.js', () => {
   describe('delimiter', () => {
     it('splits at whitespace and comma', () => {
       const split = '1,2 3 , 4   5,,  6'.split(regex.delimiter)
-      expect(split).toEqual([ '1', '2', '3', '4', '5', '6' ])
+      expect(split).toEqual(['1', '2', '3', '4', '5', '6'])
     })
   })
 
index 133605914a2f5a8c6b97f16cf5e5957243ff586c..8729b61922c19eeb7f74cd25f7f5ddd93f7436f7 100644 (file)
@@ -10,17 +10,17 @@ describe('selector.js', () => {
       const span = SVG('<span />', true).addClass('bar').addTo(div)
       const span2 = SVG('<span />', true).addTo(div)
 
-      expect(find('#canvas').map(el => el.node)).toEqual([ container ])
-      expect(find('span')).toEqual([ span, span2 ])
-      expect(find('#foo')).toEqual([ div ])
-      expect(find('.bar')).toEqual([ span ])
+      expect(find('#canvas').map((el) => el.node)).toEqual([container])
+      expect(find('span')).toEqual([span, span2])
+      expect(find('#foo')).toEqual([div])
+      expect(find('.bar')).toEqual([span])
     })
 
     it('finds all elements of a selector scoped to an element', () => {
       const div = SVG('<div />', true).id('foo').addTo(container)
 
       expect(find('#canvas', getWindow().document)[0].node).toBe(container)
-      expect(find('#foo', container)).toEqual([ div ])
+      expect(find('#foo', container)).toEqual([div])
       expect(find('#canvas', div.node)).toEqual([])
     })
   })
@@ -34,11 +34,11 @@ describe('selector.js', () => {
         const g4 = new G().addTo(g2)
         const g5 = new G().addTo(g3)
 
-        expect(g1.find('g')).toEqual([ g2, g4, g3, g5 ])
-        expect(g2.find('g')).toEqual([ g4 ])
-        expect(g1.find('#foo')).toEqual([ g2 ])
+        expect(g1.find('g')).toEqual([g2, g4, g3, g5])
+        expect(g2.find('g')).toEqual([g4])
+        expect(g1.find('#foo')).toEqual([g2])
         expect(g2.find('#foo')).toEqual([])
-        expect(g1.find('.bar')).toEqual([ g3 ])
+        expect(g1.find('.bar')).toEqual([g3])
       })
     })
 
index c0a21003621309035a451c9de6a0771d73db96fa..8135c6a1329655759f4bf7f6b1c0264048604fdd 100644 (file)
@@ -257,7 +257,10 @@ describe('textable.js', () => {
         add.tspan('The second.')
         add.tspan('The third.')
       })
-      expect(text.length()).toBeCloseTo(text.get(0).length() + text.get(1).length() + text.get(2).length(), 3)
+      expect(text.length()).toBeCloseTo(
+        text.get(0).length() + text.get(1).length() + text.get(2).length(),
+        3
+      )
     })
 
     it('gets total length of tspan', () => {
@@ -266,7 +269,10 @@ describe('textable.js', () => {
         add.tspan('The second.')
         add.tspan('The third.')
       })
-      expect(tspan.length()).toBeCloseTo(tspan.get(0).length() + tspan.get(1).length() + tspan.get(2).length(), 3)
+      expect(tspan.length()).toBeCloseTo(
+        tspan.get(0).length() + tspan.get(1).length() + tspan.get(2).length(),
+        3
+      )
     })
   })
 
@@ -284,7 +290,9 @@ describe('textable.js', () => {
       text.tspan('A great piece!')
       text.tspan('Another great piece!')
       expect(text.node.childNodes[0].childNodes[0].data).toBe('A great piece!')
-      expect(text.node.childNodes[1].childNodes[0].data).toBe('Another great piece!')
+      expect(text.node.childNodes[1].childNodes[0].data).toBe(
+        'Another great piece!'
+      )
     })
 
     it('disables adding multiple plain text nodes when given false for Text', () => {
@@ -299,7 +307,9 @@ describe('textable.js', () => {
       text.clear().build(true)
       text.tspan('A great piece!')
       text.build(false).tspan('Another great piece!')
-      expect(text.node.childNodes[0].childNodes[0].data).toBe('Another great piece!')
+      expect(text.node.childNodes[0].childNodes[0].data).toBe(
+        'Another great piece!'
+      )
       expect(text.node.childNodes[1]).toBe(undefined)
     })
 
@@ -316,7 +326,9 @@ describe('textable.js', () => {
       tspan.tspan('A great piece!')
       tspan.tspan('Another great piece!')
       expect(tspan.node.childNodes[0].childNodes[0].data).toBe('A great piece!')
-      expect(tspan.node.childNodes[1].childNodes[0].data).toBe('Another great piece!')
+      expect(tspan.node.childNodes[1].childNodes[0].data).toBe(
+        'Another great piece!'
+      )
     })
 
     it('disables adding multiple plain text nodes when given false for Tspan', () => {
@@ -331,9 +343,10 @@ describe('textable.js', () => {
       tspan.clear().build(true)
       tspan.tspan('A great piece!')
       tspan.build(false).tspan('Another great piece!')
-      expect(tspan.node.childNodes[0].childNodes[0].data).toBe('Another great piece!')
+      expect(tspan.node.childNodes[0].childNodes[0].data).toBe(
+        'Another great piece!'
+      )
       expect(tspan.node.childNodes[1]).toBe(undefined)
     })
   })
-
 })
index de1a4a0a4ac49b4b609ae909266938da40ac4327..c665aa516d08febf13c65661a610204beacbef43 100644 (file)
@@ -11,7 +11,7 @@ describe('arrange.js', () => {
         const circle = g.circle(100)
         const line = g.line(1, 2, 3, 4)
 
-        expect(circle.siblings()).toEqual([ rect, circle, line ])
+        expect(circle.siblings()).toEqual([rect, circle, line])
       })
     })
 
@@ -77,7 +77,7 @@ describe('arrange.js', () => {
 
         rect.forward()
 
-        expect(g.children()).toEqual([ circle, rect, line ])
+        expect(g.children()).toEqual([circle, rect, line])
       })
 
       it('does nothing when the element is already the last one', () => {
@@ -88,7 +88,7 @@ describe('arrange.js', () => {
 
         line.forward()
 
-        expect(g.children()).toEqual([ rect, circle, line ])
+        expect(g.children()).toEqual([rect, circle, line])
       })
     })
 
@@ -107,7 +107,7 @@ describe('arrange.js', () => {
 
         line.backward()
 
-        expect(g.children()).toEqual([ rect, line, circle ])
+        expect(g.children()).toEqual([rect, line, circle])
       })
 
       it('does nothing when the element is already the first one', () => {
@@ -118,7 +118,7 @@ describe('arrange.js', () => {
 
         rect.backward()
 
-        expect(g.children()).toEqual([ rect, circle, line ])
+        expect(g.children()).toEqual([rect, circle, line])
       })
     })
 
@@ -137,7 +137,7 @@ describe('arrange.js', () => {
 
         rect.front()
 
-        expect(g.children()).toEqual([ circle, line, rect ])
+        expect(g.children()).toEqual([circle, line, rect])
       })
 
       it('does nothing when the element is already the last one', () => {
@@ -148,7 +148,7 @@ describe('arrange.js', () => {
 
         line.front()
 
-        expect(g.children()).toEqual([ rect, circle, line ])
+        expect(g.children()).toEqual([rect, circle, line])
       })
     })
 
@@ -167,7 +167,7 @@ describe('arrange.js', () => {
 
         line.back()
 
-        expect(g.children()).toEqual([ line, rect, circle ])
+        expect(g.children()).toEqual([line, rect, circle])
       })
 
       it('does nothing when the element is already the first one', () => {
@@ -178,7 +178,7 @@ describe('arrange.js', () => {
 
         rect.back()
 
-        expect(g.children()).toEqual([ rect, circle, line ])
+        expect(g.children()).toEqual([rect, circle, line])
       })
     })
 
@@ -191,7 +191,7 @@ describe('arrange.js', () => {
         const line = new Line()
         circle.before(line)
 
-        expect(g.children()).toEqual([ rect, line, circle ])
+        expect(g.children()).toEqual([rect, line, circle])
       })
     })
 
@@ -204,7 +204,7 @@ describe('arrange.js', () => {
         const line = new Line()
         rect.after(line)
 
-        expect(g.children()).toEqual([ rect, line, circle ])
+        expect(g.children()).toEqual([rect, line, circle])
       })
     })
 
@@ -216,7 +216,7 @@ describe('arrange.js', () => {
 
         const line = new Line().insertBefore(circle)
 
-        expect(g.children()).toEqual([ rect, line, circle ])
+        expect(g.children()).toEqual([rect, line, circle])
       })
     })
 
@@ -228,7 +228,7 @@ describe('arrange.js', () => {
 
         const line = new Line().insertAfter(rect)
 
-        expect(g.children()).toEqual([ rect, line, circle ])
+        expect(g.children()).toEqual([rect, line, circle])
       })
     })
   })
index b6bb42b9919c5a7a3878809491b32c80ff409b0a..461c14fed7361631f4d6bf12b0786e658bcabdb0 100644 (file)
@@ -7,7 +7,7 @@ describe('class.js', () => {
     describe('classes()', () => {
       it('returns all classes on an element', () => {
         const rect = new Rect({ class: 'myClass myClass2' })
-        expect(rect.classes()).toEqual([ 'myClass', 'myClass2' ])
+        expect(rect.classes()).toEqual(['myClass', 'myClass2'])
       })
 
       it('returns an empty array if no class on the element', () => {
@@ -35,13 +35,15 @@ describe('class.js', () => {
       })
 
       it('adds a class to the element', () => {
-        const rect = new Rect({ class: 'myClass myClass2' }).addClass('myClass3')
-        expect(rect.classes()).toEqual([ 'myClass', 'myClass2', 'myClass3' ])
+        const rect = new Rect({ class: 'myClass myClass2' }).addClass(
+          'myClass3'
+        )
+        expect(rect.classes()).toEqual(['myClass', 'myClass2', 'myClass3'])
       })
 
       it('does nothing if class already present on the element', () => {
         const rect = new Rect({ class: 'myClass myClass2' }).addClass('myClass')
-        expect(rect.classes()).toEqual([ 'myClass', 'myClass2' ])
+        expect(rect.classes()).toEqual(['myClass', 'myClass2'])
       })
     })
 
@@ -52,13 +54,17 @@ describe('class.js', () => {
       })
 
       it('removes a class from the element', () => {
-        const rect = new Rect({ class: 'myClass myClass2' }).removeClass('myClass2')
-        expect(rect.classes()).toEqual([ 'myClass' ])
+        const rect = new Rect({ class: 'myClass myClass2' }).removeClass(
+          'myClass2'
+        )
+        expect(rect.classes()).toEqual(['myClass'])
       })
 
       it('does nothing if class is not present on the element', () => {
-        const rect = new Rect({ class: 'myClass myClass2' }).removeClass('myClass3')
-        expect(rect.classes()).toEqual([ 'myClass', 'myClass2' ])
+        const rect = new Rect({ class: 'myClass myClass2' }).removeClass(
+          'myClass3'
+        )
+        expect(rect.classes()).toEqual(['myClass', 'myClass2'])
       })
     })
 
@@ -69,13 +75,17 @@ describe('class.js', () => {
       })
 
       it('removes a class from the element when its present', () => {
-        const rect = new Rect({ class: 'myClass myClass2' }).toggleClass('myClass2')
-        expect(rect.classes()).toEqual([ 'myClass' ])
+        const rect = new Rect({ class: 'myClass myClass2' }).toggleClass(
+          'myClass2'
+        )
+        expect(rect.classes()).toEqual(['myClass'])
       })
 
       it('adds a class to the element if its not present', () => {
-        const rect = new Rect({ class: 'myClass myClass2' }).toggleClass('myClass3')
-        expect(rect.classes()).toEqual([ 'myClass', 'myClass2', 'myClass3' ])
+        const rect = new Rect({ class: 'myClass myClass2' }).toggleClass(
+          'myClass3'
+        )
+        expect(rect.classes()).toEqual(['myClass', 'myClass2', 'myClass3'])
       })
     })
   })
index b6c04bc92411cea7c0475e8360c27ad3ffb46a58..8a42acf3f5e71025fd7b1f4ee10478d589733d75 100644 (file)
@@ -7,7 +7,9 @@ describe('css.js', () => {
     describe('css()', () => {
       describe('as getter', () => {
         it('returns all css as object', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css()).toEqual({
             fill: 'none',
             'outline-width': '1px',
@@ -16,57 +18,80 @@ describe('css.js', () => {
         })
 
         it('returns an object with selected css properties', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
-          expect(rect.css([ 'fill', 'stroke' ])).toEqual({
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
+          expect(rect.css(['fill', 'stroke'])).toEqual({
             fill: 'none',
             stroke: 'none'
           })
         })
 
         it('returns a single property with property name given', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('fill')).toBe('none')
         })
 
         it('returns undefined if css property is not set', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('outline-color')).toBe('')
         })
       })
 
       describe('as setter', () => {
         it('returns itself', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('fill', 'black')).toBe(rect)
         })
 
         it('adds a css property', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
-          expect(rect.css('stroke-width', '2px').css('stroke-width')).toBe('2px')
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
+          expect(rect.css('stroke-width', '2px').css('stroke-width')).toBe(
+            '2px'
+          )
         })
 
         it('changes a css property', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('fill', 'black').css('fill')).toBe('black')
         })
 
         it('sets an object of properties', () => {
           const rect = new Rect()
-          expect(rect.css({ fill: 'none', stroke: 'none' }).css()).toEqual({ fill: 'none', stroke: 'none' })
+          expect(rect.css({ fill: 'none', stroke: 'none' }).css()).toEqual({
+            fill: 'none',
+            stroke: 'none'
+          })
         })
 
         it('removes property if empty string is passed as value', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('fill', '').css('fill')).toBe('')
         })
 
         it('removes property if null is passed as value', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css('fill', null).css('fill')).toBe('')
         })
 
         it('removes property if null is passed as part of object', () => {
-          const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' })
+          const rect = new Rect({
+            style: 'fill: none; outline-width: 1px; stroke: none'
+          })
           expect(rect.css({ fill: null, stroke: 'black' }).css('fill')).toBe('')
         })
       })
index 211fef331779b320d5d3054324c8f49b6841fcc3..5265dd16e97c536558720f3209761b8d4bbf03e6 100644 (file)
@@ -7,7 +7,11 @@ describe('data.js', () => {
     describe('data()', () => {
       describe('as getter', () => {
         it('returns all data as object', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data()).toEqual({
             fill: 'none',
             'outline-width': '1px',
@@ -16,65 +20,108 @@ describe('data.js', () => {
         })
 
         it('returns an object with selected data properties', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
-          expect(rect.data([ 'fill', 'stroke' ])).toEqual({
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
+          expect(rect.data(['fill', 'stroke'])).toEqual({
             fill: 'none',
             stroke: 'none'
           })
         })
 
         it('returns a single property with property name given', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data('fill')).toBe('none')
         })
 
         it('returns undefined if data property is not set', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data('outline-color')).toBe(undefined)
         })
       })
 
       describe('as setter', () => {
         it('returns itself', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data('fill', 'black')).toBe(rect)
         })
 
         it('adds a data property', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
-          expect(rect.data('stroke-width', '2px').data('stroke-width')).toBe('2px')
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
+          expect(rect.data('stroke-width', '2px').data('stroke-width')).toBe(
+            '2px'
+          )
         })
 
         it('changes a data property', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data('fill', 'black').data('fill')).toBe('black')
         })
 
         it('sets an object of properties', () => {
           const rect = new Rect()
-          expect(rect.data({ fill: 'none', stroke: 'none' }).data()).toEqual({ fill: 'none', stroke: 'none' })
+          expect(rect.data({ fill: 'none', stroke: 'none' }).data()).toEqual({
+            fill: 'none',
+            stroke: 'none'
+          })
         })
 
         it('removes property if null is passed as value', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
           expect(rect.data('fill', null).data('fill')).toBe(undefined)
         })
 
         it('removes property if null is passed as part of object', () => {
-          const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' })
-          expect(rect.data({ fill: null, stroke: 'black' }).data('fill')).toBe(undefined)
+          const rect = new Rect({
+            'data-fill': 'none',
+            'data-outline-width': '1px',
+            'data-stroke': 'none'
+          })
+          expect(rect.data({ fill: null, stroke: 'black' }).data('fill')).toBe(
+            undefined
+          )
         })
 
         it('converts everything except number and strings to JSON', () => {
           const rect = new Rect()
-          expect(rect.data('fill', { some: 'object' }).attr('data-fill')).toBe(JSON.stringify({ some: 'object' }))
+          expect(rect.data('fill', { some: 'object' }).attr('data-fill')).toBe(
+            JSON.stringify({ some: 'object' })
+          )
           expect(rect.data('fill', 5).attr('data-fill')).toBe(5)
           expect(rect.data('fill', 'string').attr('data-fill')).toBe('string')
         })
 
         it('does not convert to json with third parameter true', () => {
           const rect = new Rect()
-          expect(rect.data('fill', { some: 'object' }, true).attr('data-fill')).toBe({}.toString())
+          expect(
+            rect.data('fill', { some: 'object' }, true).attr('data-fill')
+          ).toBe({}.toString())
         })
       })
     })
index 3199456578b580b0598ade3497634935e21b2ce2..7472078484e8605f56ea253fe833e714d604e6e5 100644 (file)
@@ -6,7 +6,11 @@ describe('memory.js', () => {
   describe('Dom', () => {
     describe('memory()', () => {
       it('returns all memory as object', () => {
-        const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+        const rect = new Rect().remember({
+          fill: 'none',
+          'outline-width': '1px',
+          stroke: 'none'
+        })
         expect(rect.memory()).toEqual({
           fill: 'none',
           'outline-width': '1px',
@@ -18,52 +22,90 @@ describe('memory.js', () => {
     describe('remember()', () => {
       describe('as getter', () => {
         it('returns a single property with property name given', () => {
-          const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+          const rect = new Rect().remember({
+            fill: 'none',
+            'outline-width': '1px',
+            stroke: 'none'
+          })
           expect(rect.remember('fill')).toBe('none')
         })
 
         it('returns undefined if memory property is not set', () => {
-          const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+          const rect = new Rect().remember({
+            fill: 'none',
+            'outline-width': '1px',
+            stroke: 'none'
+          })
           expect(rect.remember('outline-color')).toBe(undefined)
         })
       })
 
       describe('as setter', () => {
         it('returns itself', () => {
-          const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+          const rect = new Rect().remember({
+            fill: 'none',
+            'outline-width': '1px',
+            stroke: 'none'
+          })
           expect(rect.remember('fill', 'black')).toBe(rect)
         })
 
         it('adds a memory property', () => {
-          const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
-          expect(rect.remember('stroke-width', '2px').remember('stroke-width')).toBe('2px')
+          const rect = new Rect().remember({
+            fill: 'none',
+            'outline-width': '1px',
+            stroke: 'none'
+          })
+          expect(
+            rect.remember('stroke-width', '2px').remember('stroke-width')
+          ).toBe('2px')
         })
 
         it('changes a memory property', () => {
-          const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+          const rect = new Rect().remember({
+            fill: 'none',
+            'outline-width': '1px',
+            stroke: 'none'
+          })
           expect(rect.remember('fill', 'black').remember('fill')).toBe('black')
         })
 
         it('sets an object of properties', () => {
           const rect = new Rect()
-          expect(rect.remember({ fill: 'none', stroke: 'none' }).memory()).toEqual({ fill: 'none', stroke: 'none' })
+          expect(
+            rect.remember({ fill: 'none', stroke: 'none' }).memory()
+          ).toEqual({ fill: 'none', stroke: 'none' })
         })
       })
     })
 
     describe('forget()', () => {
       it('removes property', () => {
-        const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+        const rect = new Rect().remember({
+          fill: 'none',
+          'outline-width': '1px',
+          stroke: 'none'
+        })
         expect(rect.forget('fill').remember('fill')).toBe(undefined)
       })
 
       it('removes multiple properties', () => {
-        const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
-        expect(rect.forget('fill', 'stroke').memory()).toEqual({ 'outline-width': '1px' })
+        const rect = new Rect().remember({
+          fill: 'none',
+          'outline-width': '1px',
+          stroke: 'none'
+        })
+        expect(rect.forget('fill', 'stroke').memory()).toEqual({
+          'outline-width': '1px'
+        })
       })
 
       it('erases the whole object with nothing passed', () => {
-        const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' })
+        const rect = new Rect().remember({
+          fill: 'none',
+          'outline-width': '1px',
+          stroke: 'none'
+        })
         expect(rect.forget().memory()).toEqual({})
       })
     })
index 84c95b0ce62df65ed4a1e8b425ec941304d514fb..74cef626721c1fe191c2c43e284b090a2da8932c 100644 (file)
@@ -32,15 +32,18 @@ describe('sugar.js', () => {
 
         it('sets an object of fill properties', () => {
           const rect = new Rect()
-          expect(rect.fill({
-            color: 'black',
-            opacity: 0.5,
-            rule: 'even-odd'
-          }).attr()).toEqual({
+          expect(
+            rect
+              .fill({
+                color: 'black',
+                opacity: 0.5,
+                rule: 'even-odd'
+              })
+              .attr()
+          ).toEqual({
             fill: 'black',
             'fill-opacity': 0.5,
-            'fill-rule':
-          'even-odd'
+            'fill-rule': 'even-odd'
           })
         })
       })
@@ -86,16 +89,20 @@ describe('sugar.js', () => {
 
         it('sets an object of stroke properties', () => {
           const rect = new Rect()
-          expect(rect.stroke({
-            color: 'black',
-            width: 2,
-            opacity: 0.5,
-            linecap: 'butt',
-            linejoin: 'miter',
-            miterlimit: 10,
-            dasharray: '2 2',
-            dashoffset: 15
-          }).attr()).toEqual({
+          expect(
+            rect
+              .stroke({
+                color: 'black',
+                width: 2,
+                opacity: 0.5,
+                linecap: 'butt',
+                linejoin: 'miter',
+                miterlimit: 10,
+                dasharray: '2 2',
+                dashoffset: 15
+              })
+              .attr()
+          ).toEqual({
             stroke: 'black',
             'stroke-width': 2,
             'stroke-opacity': 0.5,
@@ -108,7 +115,7 @@ describe('sugar.js', () => {
         })
 
         it('sets stroke dasharray with array passed', () => {
-          const rect = new Rect().stroke({ dasharray: [ 2, 2 ] })
+          const rect = new Rect().stroke({ dasharray: [2, 2] })
           expect(rect.attr()).toEqual({ 'stroke-dasharray': '2 2' })
         })
       })
@@ -157,21 +164,30 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.skew()
-        expect(spy).toHaveBeenCalledWith({ skew: [ undefined, undefined ], ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { skew: [undefined, undefined], ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with one argument', function () {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.skew(5)
-        expect(spy).toHaveBeenCalledWith({ skew: 5, ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { skew: 5, ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with two argument', function () {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.skew(5, 6)
-        expect(spy).toHaveBeenCalledWith({ skew: [ 5, 6 ], ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { skew: [5, 6], ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with three arguments', function () {
@@ -185,7 +201,7 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.skew(5, 6, 7, 8)
-        expect(spy).toHaveBeenCalledWith({ skew: [ 5, 6 ], ox: 7, oy: 8 }, true)
+        expect(spy).toHaveBeenCalledWith({ skew: [5, 6], ox: 7, oy: 8 }, true)
       })
     })
 
@@ -203,21 +219,30 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.scale()
-        expect(spy).toHaveBeenCalledWith({ scale: [ undefined, undefined ], ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { scale: [undefined, undefined], ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with one argument', function () {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.scale(5)
-        expect(spy).toHaveBeenCalledWith({ scale: 5, ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { scale: 5, ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with two argument', function () {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.scale(5, 6)
-        expect(spy).toHaveBeenCalledWith({ scale: [ 5, 6 ], ox: undefined, oy: undefined }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { scale: [5, 6], ox: undefined, oy: undefined },
+          true
+        )
       })
 
       it('redirects to transform() with three arguments', function () {
@@ -231,7 +256,7 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.scale(5, 6, 7, 8)
-        expect(spy).toHaveBeenCalledWith({ scale: [ 5, 6 ], ox: 7, oy: 8 }, true)
+        expect(spy).toHaveBeenCalledWith({ scale: [5, 6], ox: 7, oy: 8 }, true)
       })
     })
 
@@ -240,7 +265,7 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.translate(1, 2)
-        expect(spy).toHaveBeenCalledWith({ translate: [ 1, 2 ] }, true)
+        expect(spy).toHaveBeenCalledWith({ translate: [1, 2] }, true)
       })
     })
 
@@ -249,7 +274,7 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.relative(1, 2)
-        expect(spy).toHaveBeenCalledWith({ relative: [ 1, 2 ] }, true)
+        expect(spy).toHaveBeenCalledWith({ relative: [1, 2] }, true)
       })
     })
 
@@ -265,7 +290,10 @@ describe('sugar.js', () => {
         const rect = new Rect()
         const spy = spyOn(rect, 'transform')
         rect.flip()
-        expect(spy).toHaveBeenCalledWith({ flip: 'both', origin: 'center' }, true)
+        expect(spy).toHaveBeenCalledWith(
+          { flip: 'both', origin: 'center' },
+          true
+        )
       })
 
       // this works because only x and y are valid flip values. Everything else flips on both axis
@@ -347,7 +375,6 @@ describe('sugar.js', () => {
         expect(spy).toHaveBeenCalledWith('font-size', undefined)
       })
     })
-
   })
 
   describe('radius()', () => {
@@ -395,7 +422,8 @@ describe('sugar.js', () => {
   })
 
   describe('events', () => {
-    [ 'click',
+    ;[
+      'click',
       'dblclick',
       'mousedown',
       'mouseup',
@@ -408,7 +436,8 @@ describe('sugar.js', () => {
       'touchmove',
       'touchleave',
       'touchend',
-      'touchcancel' ].forEach(ev => {
+      'touchcancel'
+    ].forEach((ev) => {
       describe(ev, () => {
         it('calls on() with the eventname set to ' + ev, () => {
           const rect = new Rect()
@@ -418,12 +447,17 @@ describe('sugar.js', () => {
           expect(spy).toHaveBeenCalledWith(ev, fn)
         })
 
-        it('calls off() with the eventname set to ' + ev + ' when null is passed as second argument', () => {
-          const rect = new Rect()
-          const spy = spyOn(rect, 'off')
-          rect[ev](null)
-          expect(spy).toHaveBeenCalledWith(ev)
-        })
+        it(
+          'calls off() with the eventname set to ' +
+            ev +
+            ' when null is passed as second argument',
+          () => {
+            const rect = new Rect()
+            const spy = spyOn(rect, 'off')
+            rect[ev](null)
+            expect(spy).toHaveBeenCalledWith(ev)
+          }
+        )
       })
     })
   })
index db59784a96228e002adc321654a86706838a472a..41d403ca0ed3f0bfe70a01b17d3fc3b30e09fd8f 100644 (file)
@@ -23,12 +23,19 @@ describe('transform.js', () => {
 
     it('reduces all transformations of the transform list into one matrix - 2', () => {
       const rect = new Rect().attr('transform', 'translate(10, 20) rotate(45)')
-      expect(rect.matrixify()).toEqual(new Matrix().rotate(45).translate(10, 20))
+      expect(rect.matrixify()).toEqual(
+        new Matrix().rotate(45).translate(10, 20)
+      )
     })
 
     it('reduces all transformations of the transform list into one matrix - 3', () => {
-      const rect = new Rect().attr('transform', 'translate(10, 20) rotate(45) skew(1,2) skewX(10) skewY(20)')
-      expect(rect.matrixify()).toEqual(new Matrix().skewY(20).skewX(10).skew(1, 2).rotate(45).translate(10, 20))
+      const rect = new Rect().attr(
+        'transform',
+        'translate(10, 20) rotate(45) skew(1,2) skewX(10) skewY(20)'
+      )
+      expect(rect.matrixify()).toEqual(
+        new Matrix().skewY(20).skewX(10).skew(1, 2).rotate(45).translate(10, 20)
+      )
     })
   })
 
@@ -69,7 +76,9 @@ describe('transform.js', () => {
       const expected = new Matrix().translate(10, 20).rotate(-10)
 
       // funny enough the dom seems to shorten the floats and precision gets lost
-      ;[ ...'abcdef' ].forEach(prop => expect(actual[prop]).toBeCloseTo(expected[prop], 5))
+      ;[...'abcdef'].forEach((prop) =>
+        expect(actual[prop]).toBeCloseTo(expected[prop], 5)
+      )
     })
 
     it('inserts the element at the specified position', () => {
@@ -110,21 +119,25 @@ describe('transform.js', () => {
     })
 
     it('sets the transformation with an object', () => {
-      const rect = new Rect().transform({ rotate: 45, translate: [ 10, 20 ] })
+      const rect = new Rect().transform({ rotate: 45, translate: [10, 20] })
       expect(rect.transform('rotate')).toBe(45)
       expect(rect.transform('translateX')).toBe(10)
       expect(rect.transform('translateY')).toBe(20)
     })
 
     it('performs a relative transformation with flag=true', () => {
-      const rect = new Rect().transform({ rotate: 45, translate: [ 10, 20 ] }).transform({ rotate: 10 }, true)
+      const rect = new Rect()
+        .transform({ rotate: 45, translate: [10, 20] })
+        .transform({ rotate: 10 }, true)
       expect(rect.transform('rotate')).toBeCloseTo(55, 5) // rounding errors
       expect(rect.transform('translateX')).toBe(10)
       expect(rect.transform('translateY')).toBe(20)
     })
 
     it('performs a relative transformation with flag=other matrix', () => {
-      const rect = new Rect().transform({ rotate: 45, translate: [ 10, 20 ] }).transform({ rotate: 10 }, new Matrix().rotate(30))
+      const rect = new Rect()
+        .transform({ rotate: 45, translate: [10, 20] })
+        .transform({ rotate: 10 }, new Matrix().rotate(30))
       expect(rect.transform('rotate')).toBeCloseTo(40, 5) // rounding errors
       expect(rect.transform('translateX')).toBe(0)
       expect(rect.transform('translateY')).toBe(0)
@@ -132,7 +145,9 @@ describe('transform.js', () => {
 
     it('performs a relative transformation with flag=other element', () => {
       const referenceElement = new Rect().transform({ rotate: 30 })
-      const rect = new Rect().transform({ rotate: 45, translate: [ 10, 20 ] }).transform({ rotate: 10 }, referenceElement)
+      const rect = new Rect()
+        .transform({ rotate: 45, translate: [10, 20] })
+        .transform({ rotate: 10 }, referenceElement)
       expect(rect.transform('rotate')).toBeCloseTo(40, 5) // rounding errors
       expect(rect.transform('translateX')).toBe(0)
       expect(rect.transform('translateY')).toBe(0)
index e220cea9f0fa57378764099d9c18589aeb7a0d0b..e0f13e1100f8a0f6af1e624a624c2c9b057b43b5 100644 (file)
@@ -1,12 +1,6 @@
 /* globals describe, expect, it, beforeEach, afterEach, spyOn, jasmine, container */
 
-import {
-  Box,
-  Matrix,
-  Rect,
-  G,
-  makeInstance as SVG
-} from '../../../src/main.js'
+import { Box, Matrix, Rect, G, makeInstance as SVG } from '../../../src/main.js'
 import { withWindow, getWindow } from '../../../src/utils/window.js'
 import { isNulledBox, domContains } from '../../../src/types/Box.js'
 
@@ -70,48 +64,69 @@ describe('Box.js', () => {
       it('creates a new Box with default attributes', () => {
         const box = new Box()
         expect(box).toEqual(any(Box))
-        expect(box).toEqual(objectContaining({
-          width: 0, height: 0, x: 0, y: 0, w: 0, h: 0, cx: 0, cy: 0, x2: 0, y2: 0
-        }))
+        expect(box).toEqual(
+          objectContaining({
+            width: 0,
+            height: 0,
+            x: 0,
+            y: 0,
+            w: 0,
+            h: 0,
+            cx: 0,
+            cy: 0,
+            x2: 0,
+            y2: 0
+          })
+        )
       })
     })
 
     describe('init()', () => {
       it('inits or reinits the box according to input', () => {
-        expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([ 1, 2, 3, 4 ])
+        expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4])
       })
 
       it('works with array input', () => {
-        expect(new Box().init([ 1, 2, 3, 4 ]).toArray()).toEqual([ 1, 2, 3, 4 ])
+        expect(new Box().init([1, 2, 3, 4]).toArray()).toEqual([1, 2, 3, 4])
       })
 
       it('works with 3 arguments as input', () => {
-        expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([ 1, 2, 3, 4 ])
+        expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4])
       })
 
       it('works with string input', () => {
-        expect(new Box().init('1,2,3,4').toArray()).toEqual([ 1, 2, 3, 4 ])
+        expect(new Box().init('1,2,3,4').toArray()).toEqual([1, 2, 3, 4])
       })
 
       it('creates a new box from parsed string with exponential values', function () {
-        expect(new Box().init('-1.12e1 1e-2 +2e2 +.3e+4').toArray())
-          .toEqual([ -11.2, 0.01, 200, 3000 ])
+        expect(new Box().init('-1.12e1 1e-2 +2e2 +.3e+4').toArray()).toEqual([
+          -11.2, 0.01, 200, 3000
+        ])
       })
 
       it('works with object input', () => {
-        expect(new Box().init({ x: 1, y: 2, width: 3, height: 4 }).toArray())
-          .toEqual([ 1, 2, 3, 4 ])
+        expect(
+          new Box().init({ x: 1, y: 2, width: 3, height: 4 }).toArray()
+        ).toEqual([1, 2, 3, 4])
       })
 
       it('calculates all derived values correctly', () => {
-        expect(new Box().init(2, 4, 6, 8)).toEqual(objectContaining({
-          cx: 5, cy: 8, x2: 8, y2: 12, w: 6, h: 8
-        }))
+        expect(new Box().init(2, 4, 6, 8)).toEqual(
+          objectContaining({
+            cx: 5,
+            cy: 8,
+            x2: 8,
+            y2: 12,
+            w: 6,
+            h: 8
+          })
+        )
       })
 
       it('can handle input with left instead of x and top instead of y', () => {
-        expect(new Box().init({ left: 1, top: 2, width: 3, height: 4 }).toArray())
-          .toEqual([ 1, 2, 3, 4 ])
+        expect(
+          new Box().init({ left: 1, top: 2, width: 3, height: 4 }).toArray()
+        ).toEqual([1, 2, 3, 4])
       })
     })
 
@@ -122,7 +137,7 @@ describe('Box.js', () => {
         var box3 = new Box(500, 100, 100, 100)
         var merged = box1.merge(box2).merge(box3)
 
-        expect(merged.toArray()).toEqual([ 50, 50, 550, 450 ])
+        expect(merged.toArray()).toEqual([50, 50, 550, 450])
       })
 
       it('returns a new instance', () => {
@@ -136,23 +151,35 @@ describe('Box.js', () => {
 
     describe('transform()', () => {
       it('transforms the box with given matrix', () => {
-        var box1 = new Box(50, 50, 100, 100).transform(new Matrix(1, 0, 0, 1, 20, 20))
-        var box2 = new Box(50, 50, 100, 100).transform(new Matrix(2, 0, 0, 2, 0, 0))
-        var box3 = new Box(-200, -200, 100, 100).transform(new Matrix(1, 0, 0, 1, -20, -20))
+        var box1 = new Box(50, 50, 100, 100).transform(
+          new Matrix(1, 0, 0, 1, 20, 20)
+        )
+        var box2 = new Box(50, 50, 100, 100).transform(
+          new Matrix(2, 0, 0, 2, 0, 0)
+        )
+        var box3 = new Box(-200, -200, 100, 100).transform(
+          new Matrix(1, 0, 0, 1, -20, -20)
+        )
 
-        expect(box1.toArray()).toEqual([ 70, 70, 100, 100 ])
-        expect(box2.toArray()).toEqual([ 100, 100, 200, 200 ])
-        expect(box3.toArray()).toEqual([ -220, -220, 100, 100 ])
+        expect(box1.toArray()).toEqual([70, 70, 100, 100])
+        expect(box2.toArray()).toEqual([100, 100, 200, 200])
+        expect(box3.toArray()).toEqual([-220, -220, 100, 100])
       })
 
       it('also works with matrix like input', () => {
-        var box1 = new Box(50, 50, 100, 100).transform(new Matrix(1, 0, 0, 1, 20, 20).toArray())
-        var box2 = new Box(50, 50, 100, 100).transform(new Matrix(2, 0, 0, 2, 0, 0).toArray())
-        var box3 = new Box(-200, -200, 100, 100).transform(new Matrix(1, 0, 0, 1, -20, -20).toArray())
-
-        expect(box1.toArray()).toEqual([ 70, 70, 100, 100 ])
-        expect(box2.toArray()).toEqual([ 100, 100, 200, 200 ])
-        expect(box3.toArray()).toEqual([ -220, -220, 100, 100 ])
+        var box1 = new Box(50, 50, 100, 100).transform(
+          new Matrix(1, 0, 0, 1, 20, 20).toArray()
+        )
+        var box2 = new Box(50, 50, 100, 100).transform(
+          new Matrix(2, 0, 0, 2, 0, 0).toArray()
+        )
+        var box3 = new Box(-200, -200, 100, 100).transform(
+          new Matrix(1, 0, 0, 1, -20, -20).toArray()
+        )
+
+        expect(box1.toArray()).toEqual([70, 70, 100, 100])
+        expect(box2.toArray()).toEqual([100, 100, 200, 200])
+        expect(box3.toArray()).toEqual([-220, -220, 100, 100])
       })
     })
 
@@ -171,7 +198,7 @@ describe('Box.js', () => {
         withWindow({ pageXOffset: 50, pageYOffset: 25 }, () => {
           const box = new Box(100, 100, 100, 100).addOffset()
 
-          expect(box.toArray()).toEqual([ 150, 125, 100, 100 ])
+          expect(box.toArray()).toEqual([150, 125, 100, 100])
         })
       })
     })
@@ -184,7 +211,7 @@ describe('Box.js', () => {
 
     describe('toArray()', () => {
       it('returns an array representation of the box', () => {
-        expect(new Box(1, 2, 3, 4).toArray()).toEqual([ 1, 2, 3, 4 ])
+        expect(new Box(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4])
       })
     })
 
@@ -203,17 +230,21 @@ describe('Box.js', () => {
         const rect = new Rect().size(100, 200).move(20, 30).addTo(canvas)
 
         expect(rect.bbox()).toEqual(any(Box))
-        expect(rect.bbox().toArray()).toEqual([ 20, 30, 100, 200 ])
+        expect(rect.bbox().toArray()).toEqual([20, 30, 100, 200])
       })
 
       it('returns the bounding box of the element even if the node is not in the dom', () => {
         const rect = new Rect().size(100, 200).move(20, 30)
-        expect(rect.bbox().toArray()).toEqual([ 20, 30, 100, 200 ])
+        expect(rect.bbox().toArray()).toEqual([20, 30, 100, 200])
       })
 
       it('throws when it is not possible to get a bbox', () => {
-        const spy = spyOn(getWindow().SVGGraphicsElement.prototype, 'getBBox')
-          .and.callFake(() => { throw new Error('No BBox for you') })
+        const spy = spyOn(
+          getWindow().SVGGraphicsElement.prototype,
+          'getBBox'
+        ).and.callFake(() => {
+          throw new Error('No BBox for you')
+        })
         const rect = new Rect()
         expect(() => rect.bbox()).toThrow()
         expect(spy).toHaveBeenCalled()
@@ -223,21 +254,27 @@ describe('Box.js', () => {
     describe('rbox()', () => {
       it('returns the BoundingClientRect of the element', () => {
         const canvas = SVG().addTo(container)
-        const rect = new Rect().size(100, 200).move(20, 30).addTo(canvas)
-          .attr('transform', new Matrix({ scale: 2, translate: [ 40, 50 ] }))
+        const rect = new Rect()
+          .size(100, 200)
+          .move(20, 30)
+          .addTo(canvas)
+          .attr('transform', new Matrix({ scale: 2, translate: [40, 50] }))
 
         expect(rect.rbox()).toEqual(any(Box))
-        expect(rect.rbox().toArray()).toEqual([ 80, 110, 200, 400 ])
+        expect(rect.rbox().toArray()).toEqual([80, 110, 200, 400])
       })
 
       it('returns the rbox box of the element in the coordinate system of the passed element', () => {
         const canvas = SVG().addTo(container)
         const group = canvas.group().translate(1, 1)
-        const rect = new Rect().size(100, 200).move(20, 30).addTo(canvas)
-          .attr('transform', new Matrix({ scale: 2, translate: [ 40, 50 ] }))
+        const rect = new Rect()
+          .size(100, 200)
+          .move(20, 30)
+          .addTo(canvas)
+          .attr('transform', new Matrix({ scale: 2, translate: [40, 50] }))
 
         expect(rect.rbox(group)).toEqual(any(Box))
-        expect(rect.rbox(group).toArray()).toEqual([ 79, 109, 200, 400 ])
+        expect(rect.rbox(group).toArray()).toEqual([79, 109, 200, 400])
       })
 
       // svgdom actually only throws here because a new Rect without dimensions has no bounding box
@@ -267,30 +304,47 @@ describe('Box.js', () => {
       it('gets the viewbox of the element', () => {
         const canvas = SVG().addTo(container).viewbox(10, 10, 200, 200)
         expect(canvas.viewbox()).toEqual(any(Box))
-        expect(canvas.viewbox().toArray()).toEqual([ 10, 10, 200, 200 ])
+        expect(canvas.viewbox().toArray()).toEqual([10, 10, 200, 200])
       })
     })
 
     describe('zoom()', () => {
       it('zooms around the center by default', () => {
-        const canvas = SVG().size(100, 50).viewbox(0, 0, 100, 50).addTo(container).zoom(2)
+        const canvas = SVG()
+          .size(100, 50)
+          .viewbox(0, 0, 100, 50)
+          .addTo(container)
+          .zoom(2)
         expect(canvas.attr('viewBox')).toEqual('25 12.5 50 25')
       })
 
       it('zooms around a point', () => {
-        const canvas = SVG().size(100, 50).viewbox(0, 0, 100, 50).addTo(container).zoom(2, [ 0, 0 ])
+        const canvas = SVG()
+          .size(100, 50)
+          .viewbox(0, 0, 100, 50)
+          .addTo(container)
+          .zoom(2, [0, 0])
         expect(canvas.attr('viewBox')).toEqual('0 0 50 25')
       })
 
       it('gets the zoom', () => {
         // We use a nested here because its actually harder to get a width and height for a nested svg because clientHeight
         // is not available
-        const svg = SVG().size(100, 50).addTo(container).nested().size(100, 50).viewbox(0, 0, 100, 50).zoom(2)
+        const svg = SVG()
+          .size(100, 50)
+          .addTo(container)
+          .nested()
+          .size(100, 50)
+          .viewbox(0, 0, 100, 50)
+          .zoom(2)
         expect(svg.zoom()).toEqual(2)
       })
 
       it('gets the zoom with clientHeight', () => {
-        const svg = SVG().css({ width: '100px', height: '50px' }).addTo(container).viewbox(25, 12.5, 50, 25)
+        const svg = SVG()
+          .css({ width: '100px', height: '50px' })
+          .addTo(container)
+          .viewbox(25, 12.5, 50, 25)
 
         const node = svg.node
 
@@ -305,17 +359,32 @@ describe('Box.js', () => {
       })
 
       it('throws an error if it is impossible to get an absolute value', () => {
-        const svg = SVG().size(100, 50).addTo(container).nested().viewbox(0, 0, 100, 50)
-        expect(() => svg.zoom()).toThrowError('Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element')
+        const svg = SVG()
+          .size(100, 50)
+          .addTo(container)
+          .nested()
+          .viewbox(0, 0, 100, 50)
+        expect(() => svg.zoom()).toThrowError(
+          'Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element'
+        )
       })
 
       it('handles zoom level 0 which is - which basically sets the viewbox to a very high value', () => {
-        const svg = SVG().size(100, 50).viewbox(0, 0, 100, 50).addTo(container).zoom(0)
+        const svg = SVG()
+          .size(100, 50)
+          .viewbox(0, 0, 100, 50)
+          .addTo(container)
+          .zoom(0)
         expect(svg.zoom()).toBeCloseTo(0, 10)
       })
 
       it('handles zoom level 0 and can recover from it', () => {
-        const svg = SVG().size(100, 50).viewbox(0, 0, 100, 50).addTo(container).zoom(0).zoom(1)
+        const svg = SVG()
+          .size(100, 50)
+          .viewbox(0, 0, 100, 50)
+          .addTo(container)
+          .zoom(0)
+          .zoom(1)
         expect(svg.zoom()).toBe(1)
       })
     })
index 64161eb7fa515d31b271946d17ec47f133f636b3..4bbd626da361b6718651ef3428940ede358ebe53 100644 (file)
@@ -12,7 +12,6 @@ describe('Color.js', () => {
   })
 
   describe('()', () => {
-
     describe('constructs a color from an object in the correct color space', () => {
       it('rgb', () => {
         const color = new Color({ r: 255, g: 0, b: 128 })
@@ -73,7 +72,7 @@ describe('Color.js', () => {
     })
 
     it('constructs a color from an array', () => {
-      const color = new Color([ 30, 24, 50 ])
+      const color = new Color([30, 24, 50])
       expect(color.r).toBe(30)
       expect(color.g).toBe(24)
       expect(color.b).toBe(50)
@@ -81,7 +80,7 @@ describe('Color.js', () => {
     })
 
     it('constructs a color from an array with space in array', () => {
-      const color = new Color([ 50, 50, 5, 'lab' ])
+      const color = new Color([50, 50, 5, 'lab'])
       expect(color.l).toBe(50)
       expect(color.a).toBe(50)
       expect(color.b).toBe(5)
@@ -89,7 +88,7 @@ describe('Color.js', () => {
     })
 
     it('constructs a color from an array with space given', () => {
-      const color = new Color([ 50, 50, 5 ], 'lab')
+      const color = new Color([50, 50, 5], 'lab')
       expect(color.l).toBe(50)
       expect(color.a).toBe(50)
       expect(color.b).toBe(5)
@@ -118,7 +117,9 @@ describe('Color.js', () => {
     })
 
     it('throws an error if unsupported string format was given', () => {
-      expect(() => new Color('#0066')).toThrowError('Unsupported string format, can\'t construct Color')
+      expect(() => new Color('#0066')).toThrowError(
+        "Unsupported string format, can't construct Color"
+      )
     })
   })
 
@@ -137,7 +138,6 @@ describe('Color.js', () => {
   })
 
   describe('color spaces: The color spaces supported by our library', () => {
-
     describe('lab()', () => {
       it('can convert rgb to lab', () => {
         const color = new Color(255, 0, 128)
@@ -225,7 +225,6 @@ describe('Color.js', () => {
     })
 
     describe('hsl()', () => {
-
       it('can convert from rgb to hsl', () => {
         const color = new Color(255, 0, 128)
         const hsl = color.hsl()
@@ -315,7 +314,6 @@ describe('Color.js', () => {
     // })
 
     describe('cmyk()', () => {
-
       it('can convert from rgb to cmyk', () => {
         const color = new Color(255, 0, 128)
         const cmyk = color.cmyk()
@@ -357,9 +355,7 @@ describe('Color.js', () => {
         expect(color.b).toBeCloseTo(255, 0)
         expect(color.toHex()).toBe('#ffffff')
       })
-
     })
-
   })
 
   describe('static methods', () => {
@@ -397,7 +393,9 @@ describe('Color.js', () => {
       })
 
       it('throws an error if mode is unknown', () => {
-        expect(() => Color.random('foo')).toThrowError('Unsupported random color mode')
+        expect(() => Color.random('foo')).toThrowError(
+          'Unsupported random color mode'
+        )
       })
     })
 
@@ -446,5 +444,4 @@ describe('Color.js', () => {
       })
     })
   })
-
 })
index 82e5a9478fa4f8f6b1c166d07db57f1b59b626e4..f19fe11cba63564a9cd3319bdbf7f82092bc482d 100644 (file)
@@ -32,7 +32,9 @@ describe('EventTarget.js', () => {
       const options = { cancelable: false }
       const event = target.dispatch('bla', 'foo', options)
       expect(spy).toHaveBeenCalledWith(event)
-      expect(event).toEqual(objectContaining({ type: 'bla', detail: 'foo', cancelable: false }))
+      expect(event).toEqual(
+        objectContaining({ type: 'bla', detail: 'foo', cancelable: false })
+      )
     })
   })
 
index eb0b40b233e69c6fa9212826785c45883ad842ff..a6cab094b382eccb845199784c15933d74f1bb42 100644 (file)
@@ -7,7 +7,7 @@ const { any, createSpy, objectContaining } = jasmine
 describe('List.js', () => {
   describe('()', () => {
     it('creates a new List from Array', () => {
-      const list = new List([ 1, 2, 3 ])
+      const list = new List([1, 2, 3])
       expect(list).toEqual(any(List))
     })
 
@@ -17,55 +17,57 @@ describe('List.js', () => {
     })
 
     it('is instance of Array', () => {
-      const list = new List([ 1, 2, 3 ])
+      const list = new List([1, 2, 3])
       expect(list).toEqual(any(Array))
     })
 
     it('allows index access', () => {
-      const list = new List([ 1, 2, 3 ])
+      const list = new List([1, 2, 3])
       expect(list[1]).toBe(2)
     })
   })
 
   describe('each()', () => {
     it('works like map but with context set to the element when a function is passed', () => {
-      const list = new List([ 1, 2, 3 ]).each((el) => el * 2)
+      const list = new List([1, 2, 3]).each((el) => el * 2)
       expect(list).toEqual(any(List))
-      expect(list).toEqual([ 2, 4, 6 ])
+      expect(list).toEqual([2, 4, 6])
 
       const spy = createSpy()
       const obj = {}
-      const list2 = new List([ obj ])
+      const list2 = new List([obj])
       list2.each(spy)
-      expect(spy.calls.first()).toEqual(objectContaining({
-        object: obj,
-        args: [ obj, 0, list2 ]
-      }))
+      expect(spy.calls.first()).toEqual(
+        objectContaining({
+          object: obj,
+          args: [obj, 0, list2]
+        })
+      )
     })
 
     it('calls a method on every element in the list and passes arguments when a string is passed', () => {
-      const list = new List([ 10, 11, 12 ])
-      expect(list.each('toString', 16)).toEqual([ 'a', 'b', 'c' ])
+      const list = new List([10, 11, 12])
+      expect(list.each('toString', 16)).toEqual(['a', 'b', 'c'])
     })
   })
 
   describe('toArray()', () => {
     it('returns a plain array from the contents of the list', () => {
-      const list = new List([ 1, 2, 3 ])
+      const list = new List([1, 2, 3])
       const arr = list.toArray()
       expect(arr).toEqual(any(Array))
       expect(arr).not.toEqual(any(List))
-      expect(arr).toEqual([ 1, 2, 3 ])
+      expect(arr).toEqual([1, 2, 3])
     })
   })
 
   describe('static extend()', () => {
     it('adds new method names to the List', () => {
-      List.extend([ 'fooBar' ])
+      List.extend(['fooBar'])
       expect(new List().fooBar).toEqual(any(Function))
 
       const obj = { fooBar: createSpy() }
-      new List([ obj ]).fooBar()
+      new List([obj]).fooBar()
       expect(obj.fooBar).toHaveBeenCalled()
 
       delete List.prototype.fooBar
@@ -73,12 +75,14 @@ describe('List.js', () => {
 
     it('skips reserved names', () => {
       const { constructor, each, toArray } = List.prototype
-      List.extend([ 'constructor', 'each', 'toArray' ])
-      expect(List.prototype).toEqual(objectContaining({ constructor, each, toArray }))
+      List.extend(['constructor', 'each', 'toArray'])
+      expect(List.prototype).toEqual(
+        objectContaining({ constructor, each, toArray })
+      )
     })
 
     it('skips private methods starting with an underscore', () => {
-      List.extend([ '_private' ])
+      List.extend(['_private'])
       expect(new List()._private).toBe(undefined)
     })
   })
index bddf6fd72fe0eb973e0ee052f6787eba69ccce48..f395c43c1e09e5fa87e2fdde3c9d6f90d87ca713 100644 (file)
@@ -9,12 +9,11 @@ describe('Matrix.js', () => {
   const comp = { a: 2, b: 0, c: 0, d: 2, e: 100, f: 50 }
 
   describe('initialization', () => {
-
     it('creates a new matrix with default values', () => {
       const matrix = new Matrix()
-      expect(matrix).toEqual(objectContaining(
-        { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }
-      ))
+      expect(matrix).toEqual(
+        objectContaining({ a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 })
+      )
     })
 
     it('parses the current transform matrix from an element', () => {
@@ -29,7 +28,7 @@ describe('Matrix.js', () => {
     })
 
     it('parses an array correctly', () => {
-      const matrix = new Matrix([ 2, 0, 0, 2, 100, 50 ])
+      const matrix = new Matrix([2, 0, 0, 2, 100, 50])
       expect(matrix).toEqual(objectContaining(comp))
     })
 
@@ -39,7 +38,7 @@ describe('Matrix.js', () => {
     })
 
     it('parses a transform object correctly', () => {
-      const matrix = new Matrix({ scale: 2, translate: [ 100, 50 ] })
+      const matrix = new Matrix({ scale: 2, translate: [100, 50] })
       expect(matrix).toEqual(objectContaining(comp))
     })
 
@@ -79,7 +78,11 @@ describe('Matrix.js', () => {
 
   describe('decompose()', () => {
     it('decomposes a matrix properly', () => {
-      var matrix = new Matrix().scale(3, 2.5).shear(4).rotate(30).translate(20, 30)
+      var matrix = new Matrix()
+        .scale(3, 2.5)
+        .shear(4)
+        .rotate(30)
+        .translate(20, 30)
       var decomposed = matrix.decompose()
       expect(decomposed.scaleX).toBeCloseTo(3)
       expect(decomposed.scaleY).toBeCloseTo(2.5)
@@ -90,7 +93,11 @@ describe('Matrix.js', () => {
     })
 
     it('can be recomposed to the same matrix', () => {
-      var matrix = new Matrix().scale(3, 2.5).shear(4).rotate(30).translate(20, 30)
+      var matrix = new Matrix()
+        .scale(3, 2.5)
+        .shear(4)
+        .rotate(30)
+        .translate(20, 30)
       var decomposed = matrix.decompose()
 
       // Get rid of the matrix values before recomposing with the matrix constructor
@@ -141,7 +148,7 @@ describe('Matrix.js', () => {
     it('inverses matrix', () => {
       var matrix1 = new Matrix(2, 0, 0, 5, 4, 3)
       var matrix2 = matrix1.inverse()
-      var abcdef = [ 0.5, 0, 0, 0.2, -2, -0.6 ]
+      var abcdef = [0.5, 0, 0, 0.2, -2, -0.6]
 
       for (var i in 'abcdef') {
         expect(matrix2['abcdef'[i]]).toBeCloseTo(abcdef[i])
@@ -150,7 +157,9 @@ describe('Matrix.js', () => {
 
     it('throws if matrix is not invertible', () => {
       const matrix = new Matrix(0, 0, 0, 0, 0, 0)
-      expect(() => matrix.inverse()).toThrowError('Cannot invert matrix(0,0,0,0,0,0)')
+      expect(() => matrix.inverse()).toThrowError(
+        'Cannot invert matrix(0,0,0,0,0,0)'
+      )
     })
   })
 
@@ -411,13 +420,21 @@ describe('Matrix.js', () => {
 
   describe('around()', () => {
     it('performs a matrix operation around an origin by shifting the origin to 0,0', () => {
-      const matrix = new Matrix(1, 0, 0, 1, 0, 0).around(10, 10, new Matrix().scale(2))
+      const matrix = new Matrix(1, 0, 0, 1, 0, 0).around(
+        10,
+        10,
+        new Matrix().scale(2)
+      )
 
       expect(matrix).toEqual(new Matrix(2, 0, 0, 2, -10, -10))
     })
 
     it('defaults to around center of 0,0', () => {
-      const matrix = new Matrix(1, 0, 0, 1, 0, 0).around(0, 0, new Matrix().scale(2))
+      const matrix = new Matrix(1, 0, 0, 1, 0, 0).around(
+        0,
+        0,
+        new Matrix().scale(2)
+      )
 
       expect(matrix).toEqual(new Matrix(2, 0, 0, 2, 0, 0))
     })
@@ -451,14 +468,14 @@ describe('Matrix.js', () => {
   describe('toArray', () => {
     it('converts matrix to array', () => {
       const arr = new Matrix().toArray()
-      expect(arr).toEqual([ 1, 0, 0, 1, 0, 0 ])
+      expect(arr).toEqual([1, 0, 0, 1, 0, 0])
     })
   })
 
   describe('static', () => {
     describe('fromArray()', () => {
       it('creates a matrix like object from an array', () => {
-        const matrix = Matrix.fromArray([ 1, 2, 3, 4, 5, 6 ])
+        const matrix = Matrix.fromArray([1, 2, 3, 4, 5, 6])
         expect(matrix).not.toEqual(any(Matrix))
         expect(matrix).toEqual(new Matrix(1, 2, 3, 4, 5, 6).valueOf())
       })
@@ -478,47 +495,74 @@ describe('Matrix.js', () => {
 
     describe('formatTransforms()', () => {
       it('formats all transform input varieties to a canonical form', () => {
-        expect(Matrix.formatTransforms({
-          flip: true,
-          skew: 5,
-          scale: 5,
-          originX: 5,
-          originY: 5,
-          positionX: 5,
-          positionY: 5,
-          translateX: 5,
-          translateY: 5,
-          relativeX: 5,
-          relativeY: 5
-        })).toEqual({ scaleX: -5, scaleY: -5, skewX: 5, skewY: 5, shear: 0, theta: 0, rx: 5, ry: 5, tx: 5, ty: 5, ox: 5, oy: 5, px: 5, py: 5 })
+        expect(
+          Matrix.formatTransforms({
+            flip: true,
+            skew: 5,
+            scale: 5,
+            originX: 5,
+            originY: 5,
+            positionX: 5,
+            positionY: 5,
+            translateX: 5,
+            translateY: 5,
+            relativeX: 5,
+            relativeY: 5
+          })
+        ).toEqual({
+          scaleX: -5,
+          scaleY: -5,
+          skewX: 5,
+          skewY: 5,
+          shear: 0,
+          theta: 0,
+          rx: 5,
+          ry: 5,
+          tx: 5,
+          ty: 5,
+          ox: 5,
+          oy: 5,
+          px: 5,
+          py: 5
+        })
       })
 
       it('respects flip=x', () => {
-        expect(Matrix.formatTransforms({
-          flip: 'x',
-          scale: [ 1, 2 ],
-          skew: [ 1, 2 ]
-        })).toEqual(objectContaining({ scaleX: -1, scaleY: 2, skewX: 1, skewY: 2 }))
+        expect(
+          Matrix.formatTransforms({
+            flip: 'x',
+            scale: [1, 2],
+            skew: [1, 2]
+          })
+        ).toEqual(
+          objectContaining({ scaleX: -1, scaleY: 2, skewX: 1, skewY: 2 })
+        )
       })
 
       it('respects flip=y', () => {
-        expect(Matrix.formatTransforms({
-          flip: 'y',
-          scaleX: 1,
-          scaleY: 2,
-          skewX: 1,
-          skewY: 2
-        })).toEqual(objectContaining({ scaleX: 1, scaleY: -2, skewX: 1, skewY: 2 }))
+        expect(
+          Matrix.formatTransforms({
+            flip: 'y',
+            scaleX: 1,
+            scaleY: 2,
+            skewX: 1,
+            skewY: 2
+          })
+        ).toEqual(
+          objectContaining({ scaleX: 1, scaleY: -2, skewX: 1, skewY: 2 })
+        )
       })
 
       it('makes position NaN if not passed', () => {
-        expect(Matrix.formatTransforms({
-          flip: 'y',
-          scaleX: 1,
-          scaleY: 2,
-          skewX: 1,
-          skewY: 2
-        })).toEqual(objectContaining({ px: NaN, py: NaN }))
+        expect(
+          Matrix.formatTransforms({
+            flip: 'y',
+            scaleX: 1,
+            scaleY: 2,
+            skewX: 1,
+            skewY: 2
+          })
+        ).toEqual(objectContaining({ px: NaN, py: NaN }))
       })
     })
   })
@@ -542,7 +586,10 @@ describe('Matrix.js', () => {
       })
 
       it('does extra work for nested svgs because firefox needs it', () => {
-        const spy = spyOn(getWindow().SVGGraphicsElement.prototype, 'getScreenCTM')
+        const spy = spyOn(
+          getWindow().SVGGraphicsElement.prototype,
+          'getScreenCTM'
+        )
         const svg = SVG().nested()
         svg.screenCTM()
         expect(spy).toHaveBeenCalled()
index 454252a5342aa3bbcec0e4acaf6632962123b388..5c3991c6722e4da3cdf2daad63a45112cb65c79b 100644 (file)
@@ -7,17 +7,19 @@ describe('PathArray.js', () => {
 
   beforeEach(() => {
     p1 = new PathArray('m10 10 h 80 v 80 h -80 l 300 400 z')
-    p2 = new PathArray('m10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z')
+    p2 = new PathArray(
+      'm10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z'
+    )
     p3 = new PathArray('m80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 z')
   })
 
   it('parses flat arrays correctly', () => {
-    const arr = new PathArray([ 'M', 0, 0, 'L', 100, 100, 'z' ])
+    const arr = new PathArray(['M', 0, 0, 'L', 100, 100, 'z'])
     expect(arr.toString()).toBe('M0 0L100 100Z ')
   })
 
   it('parses nested arrays correctly', () => {
-    const arr = new PathArray([ [ 'M', 0, 0 ], [ 'L', 100, 100 ], [ 'z' ] ])
+    const arr = new PathArray([['M', 0, 0], ['L', 100, 100], ['z']])
     expect(arr.toString()).toBe('M0 0L100 100Z ')
   })
 
@@ -25,20 +27,26 @@ describe('PathArray.js', () => {
   it('returns the valueOf when PathArray is given', () => {
     const p = new PathArray('m10 10 h 80 v 80 h -80 l 300 400 z')
 
-    expect((new PathArray(p))).toEqual(p)
+    expect(new PathArray(p)).toEqual(p)
   })
 
   describe('move()', () => {
     it('moves all points in a straight path', () => {
-      expect(p1.move(100, 200).toString()).toBe('M100 200H180V280H100L400 680Z ')
+      expect(p1.move(100, 200).toString()).toBe(
+        'M100 200H180V280H100L400 680Z '
+      )
     })
 
     it('moves all points in a curved path', () => {
-      expect(p2.move(100, 200).toString()).toBe('M100 200C140 210 165 210 195 280S345 430 375 360T675 660Q727 670 770 740Z ')
+      expect(p2.move(100, 200).toString()).toBe(
+        'M100 200C140 210 165 210 195 280S345 430 375 360T675 660Q727 670 770 740Z '
+      )
     })
 
     it('moves all points in a arc path', () => {
-      expect(p3.move(100, 200).toString()).toBe('M100 200A45 45 0 0 0 145 245L145 200Z ')
+      expect(p3.move(100, 200).toString()).toBe(
+        'M100 200A45 45 0 0 0 145 245L145 200Z '
+      )
     })
 
     it('does nothing if passed number is not a number', () => {
@@ -48,26 +56,32 @@ describe('PathArray.js', () => {
 
   describe('size()', () => {
     it('resizes all points in a straight path', () => {
-      expect(p1.size(600, 200).toString()).toBe('M10 10H170V43.333333333333336H10L610 210Z ')
+      expect(p1.size(600, 200).toString()).toBe(
+        'M10 10H170V43.333333333333336H10L610 210Z '
+      )
     })
 
     it('resizes all points in a curved path', () => {
-      expect(p2.size(600, 200).toString()).toBe('M10 80C45.82089552238806 83.70370370370371 68.2089552238806 83.70370370370371 95.07462686567165 109.62962962962963S229.40298507462686 165.1851851851852 256.2686567164179 139.25925925925927T524.9253731343283 250.37037037037038Q571.4925373134329 254.07407407407408 610 280Z ')
+      expect(p2.size(600, 200).toString()).toBe(
+        'M10 80C45.82089552238806 83.70370370370371 68.2089552238806 83.70370370370371 95.07462686567165 109.62962962962963S229.40298507462686 165.1851851851852 256.2686567164179 139.25925925925927T524.9253731343283 250.37037037037038Q571.4925373134329 254.07407407407408 610 280Z '
+      )
     })
 
     it('resizes all points in a arc path', () => {
       const expected = [
-        [ 'M', 80, 80 ],
-        [ 'A', 600, 200, 0, 0, 0, 680, 280 ],
-        [ 'L', 680, 80 ],
-        [ 'Z' ]
+        ['M', 80, 80],
+        ['A', 600, 200, 0, 0, 0, 680, 280],
+        ['L', 680, 80],
+        ['Z']
       ]
 
       const toBeTested = p3.size(600, 200)
 
-      for (let i = toBeTested.length; i--;) {
-        expect(toBeTested[i].shift().toUpperCase()).toBe(expected[i].shift().toUpperCase())
-        for (let j = toBeTested[i].length; j--;) {
+      for (let i = toBeTested.length; i--; ) {
+        expect(toBeTested[i].shift().toUpperCase()).toBe(
+          expected[i].shift().toUpperCase()
+        )
+        for (let j = toBeTested[i].length; j--; ) {
           expect(toBeTested[i][j]).toBeCloseTo(expected[i][j])
         }
       }
index ef0b6f61b4780935975b6ee3c13aad6a01265d56..ff167b3adb9748fe0db6cd08340ba5122f2d5d70 100644 (file)
@@ -6,9 +6,7 @@ describe('Point.js', () => {
   var point
 
   describe('initialization', () => {
-
     describe('without a source', () => {
-
       beforeEach(() => {
         point = new Point()
       })
@@ -17,7 +15,6 @@ describe('Point.js', () => {
         expect(point.x).toBe(0)
         expect(point.y).toBe(0)
       })
-
     })
 
     describe('with x and y given', () => {
@@ -40,7 +37,7 @@ describe('Point.js', () => {
 
     describe('with array given', () => {
       it('creates a point from array', () => {
-        var point = new Point([ 2, 4 ])
+        var point = new Point([2, 4])
 
         expect(point.x).toBe(2)
         expect(point.y).toBe(4)
@@ -68,11 +65,15 @@ describe('Point.js', () => {
 
   describe('transform()', () => {
     it('transforms a point with a matrix', () => {
-      expect(new Point().transform(new Matrix({ translate: [ 10, 10 ] }))).toEqual(new Point(10, 10))
+      expect(
+        new Point().transform(new Matrix({ translate: [10, 10] }))
+      ).toEqual(new Point(10, 10))
     })
 
     it('transforms a point with a transformation object', () => {
-      expect(new Point().transform({ translate: [ 10, 10 ] })).toEqual(new Point(10, 10))
+      expect(new Point().transform({ translate: [10, 10] })).toEqual(
+        new Point(10, 10)
+      )
     })
   })
 
@@ -89,7 +90,7 @@ describe('Point.js', () => {
   describe('toArray()', () => {
     it('creates an array representation of Point', () => {
       const p = new Point(1, 2)
-      expect(p.toArray()).toEqual([ 1, 2 ])
+      expect(p.toArray()).toEqual([1, 2])
     })
   })
 
@@ -97,7 +98,9 @@ describe('Point.js', () => {
     describe('point()', () => {
       it('transforms a screen point into the coordinate system of the element', () => {
         const rect = new Rect()
-        spyOn(rect, 'screenCTM').and.callFake(() => new Matrix(1, 0, 0, 1, 20, 20))
+        spyOn(rect, 'screenCTM').and.callFake(
+          () => new Matrix(1, 0, 0, 1, 20, 20)
+        )
         expect(rect.point({ x: 10, y: 10 })).toEqual(new Point(-10, -10))
       })
     })
index cbcc3c1ad2b4dd195300fda0bed67818736d4770..74cc21fb9c071414492200a48ca37a3cd4b37da2 100644 (file)
@@ -6,45 +6,76 @@ describe('PointArray.js', () => {
   const squareString = '0,0 1,0 1,1 0,1'
 
   describe('()', () => {
-
     it('parses a string to a point array', () => {
       var array = new PointArray('0,1 -.05,7.95 1000.0001,-200.222')
-      expect(array.valueOf()).toEqual([ [ 0, 1 ], [ -0.05, 7.95 ], [ 1000.0001, -200.222 ] ])
+      expect(array.valueOf()).toEqual([
+        [0, 1],
+        [-0.05, 7.95],
+        [1000.0001, -200.222]
+      ])
     })
 
     it('parses a points array correctly to string', () => {
-      var array = new PointArray([ [ 0, 0.15 ], [ -100, -3.141592654 ], [ 50, 100 ] ])
+      var array = new PointArray([
+        [0, 0.15],
+        [-100, -3.141592654],
+        [50, 100]
+      ])
       expect(array + '').toBe('0,0.15 -100,-3.141592654 50,100')
     })
 
     it('parses a flat array of x/y coordinates to a point array', () => {
-      var array = new PointArray([ 1, 4, 5, 68, 12, 24 ])
-      expect(array.valueOf()).toEqual([ [ 1, 4 ], [ 5, 68 ], [ 12, 24 ] ])
+      var array = new PointArray([1, 4, 5, 68, 12, 24])
+      expect(array.valueOf()).toEqual([
+        [1, 4],
+        [5, 68],
+        [12, 24]
+      ])
     })
 
     it('parses points with space delimitered x/y coordinates', () => {
-      var array = new PointArray('221.08 191.79 0.46 191.79 0.46 63.92 63.8 0.46 284.46 0.46 284.46 128.37 221.08 191.79')
-      expect(array + '').toBe('221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79')
+      var array = new PointArray(
+        '221.08 191.79 0.46 191.79 0.46 63.92 63.8 0.46 284.46 0.46 284.46 128.37 221.08 191.79'
+      )
+      expect(array + '').toBe(
+        '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79'
+      )
     })
 
     it('parses points with comma delimitered x/y coordinates', () => {
-      var array = new PointArray('221.08,191.79,0.46,191.79,0.46,63.92,63.8,0.46,284.46,0.46,284.46,128.37,221.08,191.79')
-      expect(array + '').toBe('221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79')
+      var array = new PointArray(
+        '221.08,191.79,0.46,191.79,0.46,63.92,63.8,0.46,284.46,0.46,284.46,128.37,221.08,191.79'
+      )
+      expect(array + '').toBe(
+        '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79'
+      )
     })
 
     it('parses points with comma and space delimitered x/y coordinates', () => {
-      var array = new PointArray('221.08, 191.79, 0.46, 191.79, 0.46, 63.92, 63.8, 0.46, 284.46, 0.46, 284.46, 128.37, 221.08, 191.79')
-      expect(array + '').toBe('221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79')
+      var array = new PointArray(
+        '221.08, 191.79, 0.46, 191.79, 0.46, 63.92, 63.8, 0.46, 284.46, 0.46, 284.46, 128.37, 221.08, 191.79'
+      )
+      expect(array + '').toBe(
+        '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79'
+      )
     })
 
     it('parses points with space and comma delimitered x/y coordinates', () => {
-      var array = new PointArray('221.08 ,191.79 ,0.46 ,191.79 ,0.46 ,63.92 ,63.8 ,0.46 ,284.46 ,0.46 ,284.46 ,128.37 ,221.08 ,191.79')
-      expect(array + '').toBe('221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79')
+      var array = new PointArray(
+        '221.08 ,191.79 ,0.46 ,191.79 ,0.46 ,63.92 ,63.8 ,0.46 ,284.46 ,0.46 ,284.46 ,128.37 ,221.08 ,191.79'
+      )
+      expect(array + '').toBe(
+        '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79'
+      )
     })
 
     it('parses points with redundant spaces at the end', () => {
-      var array = new PointArray('2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8  ')
-      expect(array + '').toBe('2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8')
+      var array = new PointArray(
+        '2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8  '
+      )
+      expect(array + '').toBe(
+        '2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8'
+      )
     })
 
     it('parses points with space delimitered x/y coordinates - even with leading or trailing space', () => {
@@ -60,38 +91,48 @@ describe('PointArray.js', () => {
 
     it('parses odd number of points in a flat array of x/y coordinates and silently remove the odd point', () => {
       // this  is according to spec: https://svgwg.org/svg2-draft/shapes.html#DataTypePoints
-      var array = new PointArray([ 1, 2, 3 ])
-      expect(array.valueOf()).toEqual([ [ 1, 2 ] ])
+      var array = new PointArray([1, 2, 3])
+      expect(array.valueOf()).toEqual([[1, 2]])
     })
-
   })
 
   describe('move()', () => {
     it('moves the whole array by the passed value', () => {
-      const arr = new PointArray([ 1, 2, 3, 4 ]).move(10, 10)
-      expect(arr.toArray()).toEqual([ 10, 10, 12, 12 ])
+      const arr = new PointArray([1, 2, 3, 4]).move(10, 10)
+      expect(arr.toArray()).toEqual([10, 10, 12, 12])
     })
 
     it('does nothing if values not numbers', () => {
-      const arr = new PointArray([ 1, 2, 3, 4 ]).move()
-      expect(arr.toArray()).toEqual([ 1, 2, 3, 4 ])
+      const arr = new PointArray([1, 2, 3, 4]).move()
+      expect(arr.toArray()).toEqual([1, 2, 3, 4])
     })
   })
 
   describe('size()', () => {
     it('correctly sizes the points over the whole area', () => {
-      var array = new PointArray([ 10, 10, 20, 20, 30, 30 ])
-      expect(array.size(60, 60).valueOf()).toEqual([ [ 10, 10 ], [ 40, 40 ], [ 70, 70 ] ])
+      var array = new PointArray([10, 10, 20, 20, 30, 30])
+      expect(array.size(60, 60).valueOf()).toEqual([
+        [10, 10],
+        [40, 40],
+        [70, 70]
+      ])
     })
 
     it('let coordinates untouched when width/height is zero', () => {
-      var array = new PointArray([ 10, 10, 10, 20, 10, 30 ])
-      expect(array.size(60, 60).valueOf()).toEqual([ [ 10, 10 ], [ 10, 40 ], [ 10, 70 ] ])
-
-      array = new PointArray([ 10, 10, 20, 10, 30, 10 ])
-      expect(array.size(60, 60).valueOf()).toEqual([ [ 10, 10 ], [ 40, 10 ], [ 70, 10 ] ])
+      var array = new PointArray([10, 10, 10, 20, 10, 30])
+      expect(array.size(60, 60).valueOf()).toEqual([
+        [10, 10],
+        [10, 40],
+        [10, 70]
+      ])
+
+      array = new PointArray([10, 10, 20, 10, 30, 10])
+      expect(array.size(60, 60).valueOf()).toEqual([
+        [10, 10],
+        [40, 10],
+        [70, 10]
+      ])
     })
-
   })
 
   describe('toString()', () => {
@@ -103,7 +144,7 @@ describe('PointArray.js', () => {
 
   describe('toLine', () => {
     it('returns an object which can be passed to a line as point attributes', () => {
-      const arr = new PointArray([ 1, 2, 3, 4 ])
+      const arr = new PointArray([1, 2, 3, 4])
       expect(arr.toLine()).toEqual({ x1: 1, y1: 2, x2: 3, y2: 4 })
     })
   })
@@ -111,7 +152,7 @@ describe('PointArray.js', () => {
   describe('transform()', () => {
     it('translates correctly', () => {
       const square = new PointArray(squareString)
-      const translation = new Matrix({ translate: [ 2, 1 ] })
+      const translation = new Matrix({ translate: [2, 1] })
       const newSquare = square.transform(translation)
       expect(newSquare.toString()).toEqual('2,1 3,1 3,2 2,2')
     })
@@ -129,7 +170,7 @@ describe('PointArray.js', () => {
 
     it('works with transform object instead of matrix', () => {
       const square = new PointArray(squareString)
-      const newSquare = square.transform({ translate: [ 2, 1 ] })
+      const newSquare = square.transform({ translate: [2, 1] })
       expect(newSquare.toString()).toEqual('2,1 3,1 3,2 2,2')
     })
   })
index dc58a892fe0aaa0ff7a5a15c5d087258878d9c12..35c4b8561a0177ccee8d6088162c37d48f38641c 100644 (file)
@@ -6,7 +6,6 @@ const { any } = jasmine
 
 describe('SVGArray.js', () => {
   describe('()', () => {
-
     it('preallocates memory if only number is passed', () => {
       const arr = new SVGArray(1)
       expect(arr.length).toBe(1)
@@ -14,29 +13,28 @@ describe('SVGArray.js', () => {
 
     it('parses a matrix array correctly to string', () => {
       const array = new SVGArray([
-        0.343, 0.669, 0.119, 0, 0,
-        0.249, -0.626, 0.130, 0, 0,
-        0.172, 0.334, 0.111, 0, 0,
-        0.000, 0.000, 0.000, 1, -0
+        0.343, 0.669, 0.119, 0, 0, 0.249, -0.626, 0.13, 0, 0, 0.172, 0.334,
+        0.111, 0, 0, 0.0, 0.0, 0.0, 1, -0
       ])
 
-      expect(array + '').toBe('0.343 0.669 0.119 0 0 0.249 -0.626 0.13 0 0 0.172 0.334 0.111 0 0 0 0 0 1 0')
+      expect(array + '').toBe(
+        '0.343 0.669 0.119 0 0 0.249 -0.626 0.13 0 0 0.172 0.334 0.111 0 0 0 0 0 1 0'
+      )
     })
 
     it('parses space separated string and converts it to array', () => {
-      expect((new SVGArray('1 2 3 4')).valueOf()).toEqual([ 1, 2, 3, 4 ])
+      expect(new SVGArray('1 2 3 4').valueOf()).toEqual([1, 2, 3, 4])
     })
 
     it('parses comma separated string and converts it to array', () => {
-      expect((new SVGArray('1,2,3,4')).valueOf()).toEqual([ 1, 2, 3, 4 ])
+      expect(new SVGArray('1,2,3,4').valueOf()).toEqual([1, 2, 3, 4])
     })
-
   })
 
   describe('reverse()', () => {
     it('reverses the array', () => {
-      const array = new SVGArray([ 1, 2, 3, 4, 5 ]).reverse()
-      expect(array.valueOf()).toEqual([ 5, 4, 3, 2, 1 ])
+      const array = new SVGArray([1, 2, 3, 4, 5]).reverse()
+      expect(array.valueOf()).toEqual([5, 4, 3, 2, 1])
     })
 
     it('returns itself', () => {
@@ -47,7 +45,7 @@ describe('SVGArray.js', () => {
 
   describe('clone()', () => {
     it('creates a shallow clone of the array', () => {
-      const array = new SVGArray([ 1, 2, 3, 4, 5 ])
+      const array = new SVGArray([1, 2, 3, 4, 5])
       const clone = array.clone()
 
       expect(array).toEqual(clone)
@@ -55,25 +53,33 @@ describe('SVGArray.js', () => {
     })
 
     it('also works with PointArray (one depths clone)', () => {
-      const array = new PointArray([ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ])
+      const array = new PointArray([
+        [1, 2],
+        [3, 4],
+        [5, 6]
+      ])
       const clone = array.clone()
 
       expect(array).toEqual(clone)
       expect(array).not.toBe(clone)
 
-      for (let i = array.length; i--;) {
+      for (let i = array.length; i--; ) {
         expect(array[i]).not.toBe(clone[i])
       }
     })
 
     it('also works with PathArray (one depths clone)', () => {
-      const array = new PathArray([ [ 'M', 1, 2 ], [ 'L', 3, 4 ], [ 'L', 5, 6 ] ])
+      const array = new PathArray([
+        ['M', 1, 2],
+        ['L', 3, 4],
+        ['L', 5, 6]
+      ])
       const clone = array.clone()
 
       expect(array).toEqual(clone)
       expect(array).not.toBe(clone)
 
-      for (let i = array.length; i--;) {
+      for (let i = array.length; i--; ) {
         expect(array[i]).not.toBe(clone[i])
       }
     })
@@ -81,9 +87,9 @@ describe('SVGArray.js', () => {
 
   describe('toSet()', () => {
     it('creates a Set from the Array', () => {
-      const set = new SVGArray([ 1, 1, 2, 3 ]).toSet()
+      const set = new SVGArray([1, 1, 2, 3]).toSet()
       expect(set).toEqual(any(Set))
-      expect(set).toEqual(new Set([ 1, 2, 3 ]))
+      expect(set).toEqual(new Set([1, 2, 3]))
     })
   })
 })
index 1660724f9783879c10b2708f0721cab675b2327b..200283356949c0a334873e4b0f5a410958df7ae9 100644 (file)
@@ -56,13 +56,15 @@ describe('Number.js', () => {
     })
 
     it('falls back to maximum value if given number is positive infinite', () => {
-      number = new SVGNumber(1.7976931348623157E+10308)
-      expect(number.value).toBe(3.4e+38)
+      // eslint-disable-next-line no-loss-of-precision
+      number = new SVGNumber(1.7976931348623157e10308)
+      expect(number.value).toBe(3.4e38)
     })
 
     it('falls back to minimum value if given number is negative infinite', () => {
-      number = new SVGNumber(-1.7976931348623157E+10308)
-      expect(number.value).toBe(-3.4e+38)
+      // eslint-disable-next-line no-loss-of-precision
+      number = new SVGNumber(-1.7976931348623157e10308)
+      expect(number.value).toBe(-3.4e38)
     })
   })
 
index 60c1642cf0d27a34f60d0173d7824f4e2e431827..3c12790fdf9219fa71a34aabbde17020b63acec4 100644 (file)
@@ -69,7 +69,9 @@ describe('adopter.js', () => {
       const rect = makeInstance('<rect width="200px" />')
 
       expect(adoptSpy).toHaveBeenCalledWith(any(Node))
-      expect(adoptSpy).toHaveBeenCalledWith(objectContaining({ nodeName: 'rect' }))
+      expect(adoptSpy).toHaveBeenCalledWith(
+        objectContaining({ nodeName: 'rect' })
+      )
       expect(rect).toEqual(any(Rect))
       expect(rect.parent()).toBe(null)
     })
@@ -78,7 +80,12 @@ describe('adopter.js', () => {
       const div = makeInstance('<div />', true)
 
       expect(adoptSpy).toHaveBeenCalledWith(any(Node))
-      expect(adoptSpy).toHaveBeenCalledWith(objectContaining({ nodeName: 'DIV', namespaceURI: 'http://www.w3.org/1999/xhtml' }))
+      expect(adoptSpy).toHaveBeenCalledWith(
+        objectContaining({
+          nodeName: 'DIV',
+          namespaceURI: 'http://www.w3.org/1999/xhtml'
+        })
+      )
       expect(div).toEqual(any(Dom))
       expect(div.parent()).toBe(null)
     })
@@ -106,7 +113,9 @@ describe('adopter.js', () => {
       const rect = makeInstance(create('rect'))
 
       expect(adoptSpy).toHaveBeenCalledWith(any(Node))
-      expect(adoptSpy).toHaveBeenCalledWith(objectContaining({ nodeName: 'rect' }))
+      expect(adoptSpy).toHaveBeenCalledWith(
+        objectContaining({ nodeName: 'rect' })
+      )
       expect(rect).toEqual(any(Rect))
     })
   })
@@ -206,7 +215,10 @@ describe('adopter.js', () => {
       const A = class {}
 
       extend(A, {
-        test () { this.prop = 'test'; return this }
+        test() {
+          this.prop = 'test'
+          return this
+        }
       })
 
       expect(typeof A.prototype.test).toBe('function')
@@ -218,8 +230,11 @@ describe('adopter.js', () => {
       const B = class {}
       const C = class {}
 
-      extend([ A, B, C ], {
-        test () { this.prop = 'test'; return this }
+      extend([A, B, C], {
+        test() {
+          this.prop = 'test'
+          return this
+        }
       })
 
       expect(typeof A.prototype.test).toBe('function')
@@ -238,7 +253,8 @@ describe('adopter.js', () => {
       const A = class {}
       extend(A, {
         test: wrapWithAttrCheck(function () {
-          this.prop = 'test'; return this
+          this.prop = 'test'
+          return this
         }),
         attr: attrSpy
       })
index 10d50d8c1fb790d0e8f8b792cce4d99c213ffc4c..457a078411f28c36717b66e854ea3d7933b41c8f 100644 (file)
@@ -1,6 +1,10 @@
 /* globals describe, expect, it */
 
-import { registerMethods, getMethodsFor, getMethodNames } from '../../../src/utils/methods.js'
+import {
+  registerMethods,
+  getMethodsFor,
+  getMethodNames
+} from '../../../src/utils/methods.js'
 
 describe('methods.js', () => {
   describe('registerMethods() / getMethodsFor() / addMethodNames / getMethodNames()', () => {
index 09cfa4a7c61c7bfacfc3e89eade722e8b1f5481f..15d04538d283976845c5136d554a30a92b2abe25 100644 (file)
@@ -5,136 +5,159 @@ import { pathParser } from '../../../src/utils/pathParser.js'
 describe('pathParser.js', () => {
   describe('pathParser()', () => {
     it('parses all paths correctly', () => {
-      expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 011 0z')).toEqual([
-        [ 'M', 2, 0 ],
-        [ 'A', 2, 2, 0, 0, 0, 0, 2 ],
-        [ 'A', 2, 2, 0, 0, 0, 2, 4 ],
-        [ 'A', 0.5, 0.5, 0, 0, 1, 3, 4 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 111 0z')).toEqual([
-        [ 'M', 2, 0 ],
-        [ 'A', 2, 2, 0, 0, 0, 0, 2 ],
-        [ 'A', 2, 2, 0, 0, 0, 2, 4 ],
-        [ 'A', 0.5, 0.5, 0, 1, 1, 3, 4 ],
-        [ 'Z' ]
-      ])
+      expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 011 0z')).toEqual(
+        [
+          ['M', 2, 0],
+          ['A', 2, 2, 0, 0, 0, 0, 2],
+          ['A', 2, 2, 0, 0, 0, 2, 4],
+          ['A', 0.5, 0.5, 0, 0, 1, 3, 4],
+          ['Z']
+        ]
+      )
+
+      expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 111 0z')).toEqual(
+        [
+          ['M', 2, 0],
+          ['A', 2, 2, 0, 0, 0, 0, 2],
+          ['A', 2, 2, 0, 0, 0, 2, 4],
+          ['A', 0.5, 0.5, 0, 1, 1, 3, 4],
+          ['Z']
+        ]
+      )
 
       expect(pathParser('m10 10 h 80 v 80 h -80 l 300 400 z')).toEqual([
-        [ 'M', 10, 10 ],
-        [ 'H', 90 ],
-        [ 'V', 90 ],
-        [ 'H', 10 ],
-        [ 'L', 310, 490 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('m10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z')).toEqual([
-        [ 'M', 10, 80 ],
-        [ 'C', 50, 90, 75, 90, 105, 160 ],
-        [ 'S', 255, 310, 285, 240 ],
-        [ 'T', 585, 540 ],
-        [ 'Q', 637, 550, 680, 620 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('m80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 z')).toEqual([
-        [ 'M', 80, 80 ],
-        [ 'A', 45, 45, 0, 0, 0, 125, 125 ],
-        [ 'L', 125, 80 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('M215.458,245.23c0,0,77.403,0,94.274,0S405,216.451,405,138.054S329.581,15,287.9,15c-41.68,0-139.924,0-170.688,0C86.45,15,15,60.65,15,134.084c0,73.434,96.259,112.137,114.122,112.137C146.984,246.221,215.458,245.23,215.458,245.23z')).toEqual([
-        [ 'M', 215.458, 245.23 ],
-        [ 'C', 215.458, 245.23, 292.861, 245.23, 309.73199999999997, 245.23 ],
-        [ 'S', 405, 216.451, 405, 138.054 ],
-        [ 'S', 329.581, 15, 287.9, 15 ],
-        [ 'C', 246.21999999999997, 15, 147.97599999999997, 15, 117.21199999999999, 15 ],
-        [ 'C', 86.45, 15, 15, 60.65, 15, 134.084 ],
-        [ 'C', 15, 207.518, 111.259, 246.221, 129.122, 246.221 ],
-        [ 'C', 146.984, 246.221, 215.458, 245.23, 215.458, 245.23 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('M10 10-45-30.5.5 .89L2e-2.5.5-.5C.5.5.5.5.5.5L-3-4z')).toEqual([
-        [ 'M', 10, 10 ],
-        [ 'L', -45, -30.5 ],
-        [ 'L', 0.5, 0.89 ],
-        [ 'L', 0.02, 0.5 ],
-        [ 'L', 0.5, -0.5 ],
-        [ 'C', 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ],
-        [ 'L', -3, -4 ],
-        [ 'Z' ]
-      ])
-
-      expect(pathParser('m 0,0 0,3189 2209,0 0,-3189 -2209,0 z m 154,154 1901,0 0,2881 -1901,0 0,-2881 z')).toEqual([
-        [ 'M', 0, 0 ],
-        [ 'L', 0, 3189 ],
-        [ 'L', 2209, 3189 ],
-        [ 'L', 2209, 0 ],
-        [ 'L', 0, 0 ],
-        [ 'Z' ],
-        [ 'M', 154, 154 ],
-        [ 'L', 2055, 154 ],
-        [ 'L', 2055, 3035 ],
-        [ 'L', 154, 3035 ],
-        [ 'L', 154, 154 ],
-        [ 'Z' ]
+        ['M', 10, 10],
+        ['H', 90],
+        ['V', 90],
+        ['H', 10],
+        ['L', 310, 490],
+        ['Z']
+      ])
+
+      expect(
+        pathParser(
+          'm10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z'
+        )
+      ).toEqual([
+        ['M', 10, 80],
+        ['C', 50, 90, 75, 90, 105, 160],
+        ['S', 255, 310, 285, 240],
+        ['T', 585, 540],
+        ['Q', 637, 550, 680, 620],
+        ['Z']
+      ])
+
+      expect(pathParser('m80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 z')).toEqual(
+        [['M', 80, 80], ['A', 45, 45, 0, 0, 0, 125, 125], ['L', 125, 80], ['Z']]
+      )
+
+      expect(
+        pathParser(
+          'M215.458,245.23c0,0,77.403,0,94.274,0S405,216.451,405,138.054S329.581,15,287.9,15c-41.68,0-139.924,0-170.688,0C86.45,15,15,60.65,15,134.084c0,73.434,96.259,112.137,114.122,112.137C146.984,246.221,215.458,245.23,215.458,245.23z'
+        )
+      ).toEqual([
+        ['M', 215.458, 245.23],
+        ['C', 215.458, 245.23, 292.861, 245.23, 309.73199999999997, 245.23],
+        ['S', 405, 216.451, 405, 138.054],
+        ['S', 329.581, 15, 287.9, 15],
+        [
+          'C',
+          246.21999999999997,
+          15,
+          147.97599999999997,
+          15,
+          117.21199999999999,
+          15
+        ],
+        ['C', 86.45, 15, 15, 60.65, 15, 134.084],
+        ['C', 15, 207.518, 111.259, 246.221, 129.122, 246.221],
+        ['C', 146.984, 246.221, 215.458, 245.23, 215.458, 245.23],
+        ['Z']
+      ])
+
+      expect(
+        pathParser('M10 10-45-30.5.5 .89L2e-2.5.5-.5C.5.5.5.5.5.5L-3-4z')
+      ).toEqual([
+        ['M', 10, 10],
+        ['L', -45, -30.5],
+        ['L', 0.5, 0.89],
+        ['L', 0.02, 0.5],
+        ['L', 0.5, -0.5],
+        ['C', 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
+        ['L', -3, -4],
+        ['Z']
+      ])
+
+      expect(
+        pathParser(
+          'm 0,0 0,3189 2209,0 0,-3189 -2209,0 z m 154,154 1901,0 0,2881 -1901,0 0,-2881 z'
+        )
+      ).toEqual([
+        ['M', 0, 0],
+        ['L', 0, 3189],
+        ['L', 2209, 3189],
+        ['L', 2209, 0],
+        ['L', 0, 0],
+        ['Z'],
+        ['M', 154, 154],
+        ['L', 2055, 154],
+        ['L', 2055, 3035],
+        ['L', 154, 3035],
+        ['L', 154, 154],
+        ['Z']
       ])
 
       expect(pathParser('m 0,0 a 45 45, 0, 0, 0, 125 125')).toEqual([
-        [ 'M', 0, 0 ],
-        [ 'A', 45, 45, 0, 0, 0, 125, 125 ]
+        ['M', 0, 0],
+        ['A', 45, 45, 0, 0, 0, 125, 125]
       ])
 
       expect(pathParser('M10 10 80 80 30 30 Z')).toEqual([
-        [ 'M', 10, 10 ],
-        [ 'L', 80, 80 ],
-        [ 'L', 30, 30 ],
-        [ 'Z' ]
+        ['M', 10, 10],
+        ['L', 80, 80],
+        ['L', 30, 30],
+        ['Z']
       ])
 
       expect(pathParser('M10 10L.5.5.3.3Z')).toEqual([
-        [ 'M', 10, 10 ],
-        [ 'L', 0.5, 0.5 ],
-        [ 'L', 0.3, 0.3 ],
-        [ 'Z' ]
+        ['M', 10, 10],
+        ['L', 0.5, 0.5],
+        ['L', 0.3, 0.3],
+        ['Z']
       ])
 
       // "a" commands without optional whitespace around the flag params and ending coordinate pair
       expect(pathParser('a32 32 0 00.03-45.22', false)).toEqual([
-        [ 'a', 32.0, 32.0, 0.0, 0.0, 0.0, 0.03, -45.22 ],
+        ['a', 32.0, 32.0, 0.0, 0.0, 0.0, 0.03, -45.22]
       ])
 
       expect(pathParser('a48 48 0 1148-48', false)).toEqual([
-        [ 'a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0],
+        ['a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0]
       ])
 
       expect(pathParser('a82.6 82.6 0 0033.48-20.25', false)).toEqual([
-        [ 'a', 82.6, 82.6, 0.0, 0.0, 0.0, 33.48, -20.25 ],
+        ['a', 82.6, 82.6, 0.0, 0.0, 0.0, 33.48, -20.25]
       ])
 
       expect(pathParser('a82.45 82.45 0 00-20.24 33.47', false)).toEqual([
-        [ 'a', 82.45, 82.45, 0.0, 0.0, 0.0, -20.24, 33.47 ],
+        ['a', 82.45, 82.45, 0.0, 0.0, 0.0, -20.24, 33.47]
       ])
 
       expect(pathParser('a2.51 2.51 0 01.25.32', false)).toEqual([
-        [ 'a', 2.51, 2.51, 0, 0, 1, 0.25, 0.32 ],
+        ['a', 2.51, 2.51, 0, 0, 1, 0.25, 0.32]
       ])
 
       expect(pathParser('a2.51 2.51 0 00.25.32', false)).toEqual([
-        [ 'a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32 ],
+        ['a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32]
       ])
 
       expect(pathParser('a2.51 2.51 0 000.25.32', false)).toEqual([
-        [ 'a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32 ],
+        ['a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32]
       ])
 
       expect(pathParser('a48 48 0 1148-48 48 48 0 01-48 48', false)).toEqual([
-        [ 'a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0 ],
-        [ 'a', 48.0, 48.0, 0.0, 0.0, 1.0, -48.0, 48.0 ]
+        ['a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0],
+        ['a', 48.0, 48.0, 0.0, 0.0, 1.0, -48.0, 48.0]
       ])
     })
   })
index 5a2ae97443f43d81b32c59070635bd60eaf0ec86..0b3015e5bb250ef6f317c875e199d04c6efa8cb5 100644 (file)
@@ -20,7 +20,7 @@ describe('utils.js', function () {
     var arr2
 
     beforeEach(function () {
-      arr1 = [ 1, 2, 3, 4 ]
+      arr1 = [1, 2, 3, 4]
       arr2 = map(arr1, function (el) {
         return el * 2
       })
@@ -32,7 +32,7 @@ describe('utils.js', function () {
     })
 
     it('executes a function on every element and returns the result in a new array', function () {
-      expect(arr2).toEqual([ 2, 4, 6, 8 ])
+      expect(arr2).toEqual([2, 4, 6, 8])
     })
   })
 
@@ -41,7 +41,7 @@ describe('utils.js', function () {
     var arr2
 
     beforeEach(function () {
-      arr1 = [ 1, 2, 3, 4 ]
+      arr1 = [1, 2, 3, 4]
       arr2 = filter(arr1, function (el) {
         return el % 2 === 0
       })
@@ -53,7 +53,7 @@ describe('utils.js', function () {
     })
 
     it('filters elements by function', function () {
-      expect(arr2).toEqual([ 2, 4 ])
+      expect(arr2).toEqual([2, 4])
     })
   })
 
@@ -130,16 +130,28 @@ describe('utils.js', function () {
     var el = { bbox: () => ({ width: 200, height: 100 }) }
 
     it('calculates height proportionally', function () {
-      expect(proportionalSize(el, 400, null)).toEqual({ width: 400, height: 200 })
+      expect(proportionalSize(el, 400, null)).toEqual({
+        width: 400,
+        height: 200
+      })
     })
 
     it('calculates width proportionally', function () {
-      expect(proportionalSize(el, null, 200)).toEqual({ width: 400, height: 200 })
+      expect(proportionalSize(el, null, 200)).toEqual({
+        width: 400,
+        height: 200
+      })
     })
 
     it('prefers passed box over element', function () {
-      expect(proportionalSize(el, 300, null, box)).toEqual({ width: 300, height: 200 })
-      expect(proportionalSize(el, null, 200, box)).toEqual({ width: 300, height: 200 })
+      expect(proportionalSize(el, 300, null, box)).toEqual({
+        width: 300,
+        height: 200
+      })
+      expect(proportionalSize(el, null, 200, box)).toEqual({
+        width: 300,
+        height: 200
+      })
     })
   })
 
@@ -147,48 +159,48 @@ describe('utils.js', function () {
     var el = { bbox: () => ({ width: 200, height: 100, x: 300, y: 400 }) }
 
     it('gets the origin from [ox, oy]', function () {
-      var origin = { origin: [ 10, 20 ] }
-      expect(getOrigin(origin, el)).toEqual([ 10, 20 ])
+      var origin = { origin: [10, 20] }
+      expect(getOrigin(origin, el)).toEqual([10, 20])
     })
 
     it('gets the origin from [ox, oy] as strings', function () {
-      var origin = { origin: [ 'center', 'top' ] }
-      expect(getOrigin(origin, el)).toEqual([ 400, 400 ])
+      var origin = { origin: ['center', 'top'] }
+      expect(getOrigin(origin, el)).toEqual([400, 400])
     })
 
     it('gets the origin from {x, y}', function () {
       var origin = { origin: { x: 10, y: 20 } }
-      expect(getOrigin(origin, el)).toEqual([ 10, 20 ])
+      expect(getOrigin(origin, el)).toEqual([10, 20])
     })
 
     it('gets the origin from {ox, oy}', function () {
       var origin = { ox: 10, oy: 20 }
-      expect(getOrigin(origin, el)).toEqual([ 10, 20 ])
+      expect(getOrigin(origin, el)).toEqual([10, 20])
     })
 
     it('gets the origin from {ox, oy} as strings', function () {
       var origin = { ox: 'center', oy: 'top' }
-      expect(getOrigin(origin, el)).toEqual([ 400, 400 ])
+      expect(getOrigin(origin, el)).toEqual([400, 400])
     })
 
     it('gets the origin from {originX, originY}', function () {
       var origin = { originX: 10, originY: 20 }
-      expect(getOrigin(origin, el)).toEqual([ 10, 20 ])
+      expect(getOrigin(origin, el)).toEqual([10, 20])
     })
 
     it('gets the origin from {originX, originY} as strings', function () {
       var origin = { originX: 'center', originY: 'top' }
-      expect(getOrigin(origin, el)).toEqual([ 400, 400 ])
+      expect(getOrigin(origin, el)).toEqual([400, 400])
     })
 
     it('gets the origin from string', function () {
       var origin = { origin: 'center top' }
-      expect(getOrigin(origin, el)).toEqual([ 400, 400 ])
+      expect(getOrigin(origin, el)).toEqual([400, 400])
     })
 
     it('gets the origin from number', function () {
       var origin = { origin: 5 }
-      expect(getOrigin(origin, el)).toEqual([ 5, 5 ])
+      expect(getOrigin(origin, el)).toEqual([5, 5])
     })
   })
 })
index 65fbcabaad700a68cef42a1ac2acc6eb746a9944..e68149189d42766cf6f4eef5de65a19c0d80949d 100644 (file)
@@ -1,6 +1,13 @@
 /* globals describe, expect, it */
 
-import { registerWindow, globals, withWindow, getWindow, saveWindow, restoreWindow } from '../../../src/utils/window.js'
+import {
+  registerWindow,
+  globals,
+  withWindow,
+  getWindow,
+  saveWindow,
+  restoreWindow
+} from '../../../src/utils/window.js'
 
 describe('window.js', () => {
   describe('registerWindow()', () => {
index fc3df10f676de6577c744319751965bc2c842b68..11cca546f3730de3d43a5224cf34dca6fbe3214f 100644 (file)
@@ -9,7 +9,7 @@ const Animator = {
   timer: () => globals.window.performance || globals.window.Date,
   transforms: [],
 
-  frame (fn) {
+  frame(fn) {
     // Store the node
     const node = Animator.frames.push({ run: fn })
 
@@ -22,7 +22,7 @@ const Animator = {
     return node
   },
 
-  timeout (fn, delay) {
+  timeout(fn, delay) {
     delay = delay || 0
 
     // Work out when the event should fire
@@ -39,7 +39,7 @@ const Animator = {
     return node
   },
 
-  immediate (fn) {
+  immediate(fn) {
     // Add the immediate fn to the end of the queue
     const node = Animator.immediates.push(fn)
     // Request another animation frame if we need one
@@ -50,19 +50,19 @@ const Animator = {
     return node
   },
 
-  cancelFrame (node) {
+  cancelFrame(node) {
     node != null && Animator.frames.remove(node)
   },
 
-  clearTimeout (node) {
+  clearTimeout(node) {
     node != null && Animator.timeouts.remove(node)
   },
 
-  cancelImmediate (node) {
+  cancelImmediate(node) {
     node != null && Animator.immediates.remove(node)
   },
 
-  _draw (now) {
+  _draw(now) {
     // Run all the timeouts we can run, if they are not ready yet, add them
     // to the end of the queue immediately! (bad timeouts!!! [sarcasm])
     let nextTimeout = null
@@ -82,7 +82,7 @@ const Animator = {
     // Run all of the animation frames
     let nextFrame = null
     const lastFrame = Animator.frames.last()
-    while ((nextFrame !== lastFrame) && (nextFrame = Animator.frames.shift())) {
+    while (nextFrame !== lastFrame && (nextFrame = Animator.frames.shift())) {
       nextFrame.run(now)
     }
 
@@ -92,9 +92,10 @@ const Animator = {
     }
 
     // If we have remaining timeouts or frames, draw until we don't anymore
-    Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first()
-      ? globals.window.requestAnimationFrame(Animator._draw)
-      : null
+    Animator.nextDraw =
+      Animator.timeouts.first() || Animator.frames.first()
+        ? globals.window.requestAnimationFrame(Animator._draw)
+        : null
   }
 }
 
index 303fb7192063744cf5c779efcf4e35d181e45008..1cf879d8aa2ee0e3662240a59b55cc055445ef25 100644 (file)
@@ -7,7 +7,7 @@ Base Class
 The base stepper class that will be
 ***/
 
-function makeSetterGetter (k, f) {
+function makeSetterGetter(k, f) {
   return function (v) {
     if (v == null) return this[k]
     this[k] = v
@@ -24,27 +24,27 @@ export const easing = {
     return -Math.cos(pos * Math.PI) / 2 + 0.5
   },
   '>': function (pos) {
-    return Math.sin(pos * Math.PI / 2)
+    return Math.sin((pos * Math.PI) / 2)
   },
   '<': function (pos) {
-    return -Math.cos(pos * Math.PI / 2) + 1
+    return -Math.cos((pos * Math.PI) / 2) + 1
   },
   bezier: function (x1, y1, x2, y2) {
     // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo
     return function (t) {
       if (t < 0) {
         if (x1 > 0) {
-          return y1 / x1 * t
+          return (y1 / x1) * t
         } else if (x2 > 0) {
-          return y2 / x2 * t
+          return (y2 / x2) * t
         } else {
           return 0
         }
       } else if (t > 1) {
         if (x2 < 1) {
-          return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2)
+          return ((1 - y2) / (1 - x2)) * t + (y2 - x2) / (1 - x2)
         } else if (x1 < 1) {
-          return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1)
+          return ((1 - y1) / (1 - x1)) * t + (y1 - x1) / (1 - x1)
         } else {
           return 1
         }
@@ -93,7 +93,7 @@ export const easing = {
 }
 
 export class Stepper {
-  done () {
+  done() {
     return false
   }
 }
@@ -104,12 +104,12 @@ Easing Functions
 ***/
 
 export class Ease extends Stepper {
-  constructor (fn = timeline.ease) {
+  constructor(fn = timeline.ease) {
     super()
     this.ease = easing[fn] || fn
   }
 
-  step (from, to, pos) {
+  step(from, to, pos) {
     if (typeof from !== 'number') {
       return pos < 1 ? from : to
     }
@@ -123,22 +123,21 @@ Controller Types
 ***/
 
 export class Controller extends Stepper {
-  constructor (fn) {
+  constructor(fn) {
     super()
     this.stepper = fn
   }
 
-  done (c) {
+  done(c) {
     return c.done
   }
 
-  step (current, target, dt, c) {
+  step(current, target, dt, c) {
     return this.stepper(current, target, dt, c)
   }
-
 }
 
-function recalculate () {
+function recalculate() {
   // Apply the default parameters
   const duration = (this._duration || 500) / 1000
   const overshoot = this._overshoot || 0
@@ -156,13 +155,12 @@ function recalculate () {
 }
 
 export class Spring extends Controller {
-  constructor (duration = 500, overshoot = 0) {
+  constructor(duration = 500, overshoot = 0) {
     super()
-    this.duration(duration)
-      .overshoot(overshoot)
+    this.duration(duration).overshoot(overshoot)
   }
 
-  step (current, target, dt, c) {
+  step(current, target, dt, c) {
     if (typeof current === 'string') return current
     c.done = dt === Infinity
     if (dt === Infinity) return target
@@ -177,9 +175,7 @@ export class Spring extends Controller {
 
     // Apply the control to get the new position and store it
     const acceleration = -this.d * velocity - this.k * (current - target)
-    const newPosition = current
-      + velocity * dt
-      + acceleration * dt * dt / 2
+    const newPosition = current + velocity * dt + (acceleration * dt * dt) / 2
 
     // Store the velocity
     c.velocity = velocity + acceleration * dt
@@ -196,12 +192,12 @@ extend(Spring, {
 })
 
 export class PID extends Controller {
-  constructor (p = 0.1, i = 0.01, d = 0, windup = 1000) {
+  constructor(p = 0.1, i = 0.01, d = 0, windup = 1000) {
     super()
     this.p(p).i(i).d(d).windup(windup)
   }
 
-  step (current, target, dt, c) {
+  step(current, target, dt, c) {
     if (typeof current === 'string') return current
     c.done = dt === Infinity
 
index e9b3ff849649911708ac733a4f2ca38957874d69..240ca7bd7e87726f5f4b6a49854900d5ad7994cd 100644 (file)
@@ -19,9 +19,7 @@ const getClassForType = (value) => {
     if (Color.isColor(value)) {
       return Color
     } else if (delimiter.test(value)) {
-      return isPathLetter.test(value)
-        ? PathArray
-        : SVGArray
+      return isPathLetter.test(value) ? PathArray : SVGArray
     } else if (numberAndUnit.test(value)) {
       return SVGNumber
     } else {
@@ -39,7 +37,7 @@ const getClassForType = (value) => {
 }
 
 export default class Morphable {
-  constructor (stepper) {
+  constructor(stepper) {
     this._stepper = stepper || new Ease('-')
 
     this._from = null
@@ -49,12 +47,17 @@ export default class Morphable {
     this._morphObj = null
   }
 
-  at (pos) {
-    return this._morphObj.morph(this._from, this._to, pos, this._stepper, this._context)
-
+  at(pos) {
+    return this._morphObj.morph(
+      this._from,
+      this._to,
+      pos,
+      this._stepper,
+      this._context
+    )
   }
 
-  done () {
+  done() {
     const complete = this._context
       .map(this._stepper.done)
       .reduce(function (last, curr) {
@@ -63,7 +66,7 @@ export default class Morphable {
     return complete
   }
 
-  from (val) {
+  from(val) {
     if (val == null) {
       return this._from
     }
@@ -72,13 +75,13 @@ export default class Morphable {
     return this
   }
 
-  stepper (stepper) {
+  stepper(stepper) {
     if (stepper == null) return this._stepper
     this._stepper = stepper
     return this
   }
 
-  to (val) {
+  to(val) {
     if (val == null) {
       return this._to
     }
@@ -87,7 +90,7 @@ export default class Morphable {
     return this
   }
 
-  type (type) {
+  type(type) {
     // getter
     if (type == null) {
       return this._type
@@ -98,33 +101,34 @@ export default class Morphable {
     return this
   }
 
-  _set (value) {
+  _set(value) {
     if (!this._type) {
       this.type(getClassForType(value))
     }
 
-    let result = (new this._type(value))
+    let result = new this._type(value)
     if (this._type === Color) {
       result = this._to
         ? result[this._to[4]]()
         : this._from
-          ? result[this._from[4]]()
-          : result
+        ? result[this._from[4]]()
+        : result
     }
 
     if (this._type === ObjectBag) {
       result = this._to
         ? result.align(this._to)
         : this._from
-          ? result.align(this._from)
-          : result
+        ? result.align(this._from)
+        : result
     }
 
     result = result.toConsumable()
 
     this._morphObj = this._morphObj || new this._type()
-    this._context = this._context
-      || Array.apply(null, Array(result.length))
+    this._context =
+      this._context ||
+      Array.apply(null, Array(result.length))
         .map(Object)
         .map(function (o) {
           o.done = true
@@ -132,36 +136,34 @@ export default class Morphable {
         })
     return result
   }
-
 }
 
 export class NonMorphable {
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  init (val) {
+  init(val) {
     val = Array.isArray(val) ? val[0] : val
     this.value = val
     return this
   }
 
-  toArray () {
-    return [ this.value ]
+  toArray() {
+    return [this.value]
   }
 
-  valueOf () {
+  valueOf() {
     return this.value
   }
-
 }
 
 export class TransformBag {
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  init (obj) {
+  init(obj) {
     if (Array.isArray(obj)) {
       obj = {
         scaleX: obj[0],
@@ -179,7 +181,7 @@ export class TransformBag {
     return this
   }
 
-  toArray () {
+  toArray() {
     const v = this
 
     return [
@@ -207,23 +209,24 @@ TransformBag.defaults = {
 }
 
 const sortByKey = (a, b) => {
-  return (a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0))
+  return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0
 }
 
 export class ObjectBag {
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  align (other) {
+  align(other) {
     const values = this.values
     for (let i = 0, il = values.length; i < il; ++i) {
-
       // If the type is the same we only need to check if the color is in the correct format
       if (values[i + 1] === other[i + 1]) {
         if (values[i + 1] === Color && other[i + 7] !== values[i + 7]) {
           const space = other[i + 7]
-          const color = new Color(this.values.splice(i + 3, 5))[space]().toArray()
+          const color = new Color(this.values.splice(i + 3, 5))
+            [space]()
+            .toArray()
           this.values.splice(i + 3, 0, ...color)
         }
 
@@ -237,19 +240,26 @@ export class ObjectBag {
 
       // The types differ, so we overwrite the new type with the old one
       // And initialize it with the types default (e.g. black for color or 0 for number)
-      const defaultObject = new (other[i + 1])().toArray()
+      const defaultObject = new other[i + 1]().toArray()
 
       // Than we fix the values array
-      const toDelete = (values[i + 2]) + 3
+      const toDelete = values[i + 2] + 3
 
-      values.splice(i, toDelete, other[i], other[i + 1], other[i + 2], ...defaultObject)
+      values.splice(
+        i,
+        toDelete,
+        other[i],
+        other[i + 1],
+        other[i + 2],
+        ...defaultObject
+      )
 
       i += values[i + 2] + 2
     }
     return this
   }
 
-  init (objOrArr) {
+  init(objOrArr) {
     this.values = []
 
     if (Array.isArray(objOrArr)) {
@@ -263,7 +273,7 @@ export class ObjectBag {
     for (const i in objOrArr) {
       const Type = getClassForType(objOrArr[i])
       const val = new Type(objOrArr[i]).toArray()
-      entries.push([ i, Type, val.length, ...val ])
+      entries.push([i, Type, val.length, ...val])
     }
 
     entries.sort(sortByKey)
@@ -272,11 +282,11 @@ export class ObjectBag {
     return this
   }
 
-  toArray () {
+  toArray() {
     return this.values
   }
 
-  valueOf () {
+  valueOf() {
     const obj = {}
     const arr = this.values
 
@@ -286,40 +296,35 @@ export class ObjectBag {
       const Type = arr.shift()
       const num = arr.shift()
       const values = arr.splice(0, num)
-      obj[key] = new Type(values)// .valueOf()
+      obj[key] = new Type(values) // .valueOf()
     }
 
     return obj
   }
-
 }
 
-const morphableTypes = [
-  NonMorphable,
-  TransformBag,
-  ObjectBag
-]
+const morphableTypes = [NonMorphable, TransformBag, ObjectBag]
 
-export function registerMorphableType (type = []) {
+export function registerMorphableType(type = []) {
   morphableTypes.push(...[].concat(type))
 }
 
-export function makeMorphable () {
+export function makeMorphable() {
   extend(morphableTypes, {
-    to (val) {
+    to(val) {
       return new Morphable()
         .type(this.constructor)
-        .from(this.toArray())// this.valueOf())
+        .from(this.toArray()) // this.valueOf())
         .to(val)
     },
-    fromArray (arr) {
+    fromArray(arr) {
       this.init(arr)
       return this
     },
-    toConsumable () {
+    toConsumable() {
       return this.toArray()
     },
-    morph (from, to, pos, stepper, context) {
+    morph(from, to, pos, stepper, context) {
       const mapper = function (i, index) {
         return stepper.step(i, to[index], pos, context[index], context)
       }
index ba484dcfb8899afe7abd62aa9741047402376b98..65108f3f668320a4af4ec031c965b06e540bfef5 100644 (file)
@@ -1,22 +1,25 @@
 export default class Queue {
-  constructor () {
+  constructor() {
     this._first = null
     this._last = null
   }
 
   // Shows us the first item in the list
-  first () {
+  first() {
     return this._first && this._first.value
   }
 
   // Shows us the last item in the list
-  last () {
+  last() {
     return this._last && this._last.value
   }
 
-  push (value) {
+  push(value) {
     // An item stores an id and the provided value
-    const item = typeof value.next !== 'undefined' ? value : { value: value, next: null, prev: null }
+    const item =
+      typeof value.next !== 'undefined'
+        ? value
+        : { value: value, next: null, prev: null }
 
     // Deal with the queue being empty or populated
     if (this._last) {
@@ -33,7 +36,7 @@ export default class Queue {
   }
 
   // Removes the item that was returned from the push
-  remove (item) {
+  remove(item) {
     // Relink the previous item
     if (item.prev) item.prev.next = item.next
     if (item.next) item.next.prev = item.prev
@@ -45,7 +48,7 @@ export default class Queue {
     item.next = null
   }
 
-  shift () {
+  shift() {
     // Check if we have a value
     const remove = this._first
     if (!remove) return null
@@ -56,5 +59,4 @@ export default class Queue {
     this._last = this._first ? this._last : null
     return remove.value
   }
-
 }
index 9d50042b470397d2af859fcf753349c65223517f..a83a02f3859dad9b86d9703bed8e6f00dff8f20b 100644 (file)
@@ -15,21 +15,17 @@ import SVGNumber from '../types/SVGNumber.js'
 import Timeline from './Timeline.js'
 
 export default class Runner extends EventTarget {
-  constructor (options) {
+  constructor(options) {
     super()
 
     // Store a unique id on the runner, so that we can identify it later
     this.id = Runner.id++
 
     // Ensure a default value
-    options = options == null
-      ? timeline.duration
-      : options
+    options = options == null ? timeline.duration : options
 
     // Ensure that we get a controller
-    options = typeof options === 'function'
-      ? new Controller(options)
-      : options
+    options = typeof options === 'function' ? new Controller(options) : options
 
     // Declare all of the variables
     this._element = null
@@ -71,7 +67,7 @@ export default class Runner extends EventTarget {
     this._persist = this._isDeclarative ? true : null
   }
 
-  static sanitise (duration, delay, when) {
+  static sanitise(duration, delay, when) {
     // Initialise the default parameters
     let times = 1
     let swing = false
@@ -100,7 +96,7 @@ export default class Runner extends EventTarget {
     }
   }
 
-  active (enabled) {
+  active(enabled) {
     if (enabled == null) return this.enabled
     this.enabled = enabled
     return this
@@ -111,16 +107,16 @@ export default class Runner extends EventTarget {
   ===============
   Methods that shouldn't be used externally
   */
-  addTransform (transform, index) {
+  addTransform(transform) {
     this.transforms.lmultiplyO(transform)
     return this
   }
 
-  after (fn) {
+  after(fn) {
     return this.on('finished', fn)
   }
 
-  animate (duration, delay, when) {
+  animate(duration, delay, when) {
     const o = Runner.sanitise(duration, delay, when)
     const runner = new Runner(o.duration)
     if (this._timeline) runner.timeline(this._timeline)
@@ -128,33 +124,37 @@ export default class Runner extends EventTarget {
     return runner.loop(o).schedule(o.delay, o.when)
   }
 
-  clearTransform () {
+  clearTransform() {
     this.transforms = new Matrix()
     return this
   }
 
   // TODO: Keep track of all transformations so that deletion is faster
-  clearTransformsFromQueue () {
-    if (!this.done || !this._timeline || !this._timeline._runnerIds.includes(this.id)) {
+  clearTransformsFromQueue() {
+    if (
+      !this.done ||
+      !this._timeline ||
+      !this._timeline._runnerIds.includes(this.id)
+    ) {
       this._queue = this._queue.filter((item) => {
         return !item.isTransform
       })
     }
   }
 
-  delay (delay) {
+  delay(delay) {
     return this.animate(0, delay)
   }
 
-  duration () {
+  duration() {
     return this._times * (this._wait + this._duration) - this._wait
   }
 
-  during (fn) {
+  during(fn) {
     return this.queue(null, fn)
   }
 
-  ease (fn) {
+  ease(fn) {
     this._stepper = new Ease(fn)
     return this
   }
@@ -165,18 +165,18 @@ export default class Runner extends EventTarget {
   help us make new runners from the current runner
   */
 
-  element (element) {
+  element(element) {
     if (element == null) return this._element
     this._element = element
     element._prepareRunner()
     return this
   }
 
-  finish () {
+  finish() {
     return this.step(Infinity)
   }
 
-  loop (times, swing, wait) {
+  loop(times, swing, wait) {
     // Deal with the user passing in an object
     if (typeof times === 'object') {
       swing = times.swing
@@ -190,16 +190,18 @@ export default class Runner extends EventTarget {
     this._wait = wait || 0
 
     // Allow true to be passed
-    if (this._times === true) { this._times = Infinity }
+    if (this._times === true) {
+      this._times = Infinity
+    }
 
     return this
   }
 
-  loops (p) {
+  loops(p) {
     const loopDuration = this._duration + this._wait
     if (p == null) {
       const loopsDone = Math.floor(this._time / loopDuration)
-      const relativeTime = (this._time - loopsDone * loopDuration)
+      const relativeTime = this._time - loopsDone * loopDuration
       const position = relativeTime / this._duration
       return Math.min(loopsDone + position, this._times)
     }
@@ -209,13 +211,13 @@ export default class Runner extends EventTarget {
     return this.time(time)
   }
 
-  persist (dtOrForever) {
+  persist(dtOrForever) {
     if (dtOrForever == null) return this._persist
     this._persist = dtOrForever
     return this
   }
 
-  position (p) {
+  position(p) {
     // Get all of the variables we need
     const x = this._time
     const d = this._duration
@@ -235,18 +237,20 @@ export default class Runner extends EventTarget {
 
       // Figure out the value without thinking about the start or end time
       const f = function (x) {
-        const swinging = s * Math.floor(x % (2 * (w + d)) / (w + d))
+        const swinging = s * Math.floor((x % (2 * (w + d))) / (w + d))
         const backwards = (swinging && !r) || (!swinging && r)
-        const uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards
+        const uncliped =
+          (Math.pow(-1, backwards) * (x % (w + d))) / d + backwards
         const clipped = Math.max(Math.min(uncliped, 1), 0)
         return clipped
       }
 
       // Figure out the value by incorporating the start time
       const endTime = t * (w + d) - w
-      position = x <= 0
-        ? Math.round(f(1e-5))
-        : x < endTime
+      position =
+        x <= 0
+          ? Math.round(f(1e-5))
+          : x < endTime
           ? f(x)
           : Math.round(f(endTime - 1e-5))
       return position
@@ -254,13 +258,13 @@ export default class Runner extends EventTarget {
 
     // Work out the loops done and add the position to the loops done
     const loopsDone = Math.floor(this.loops())
-    const swingForward = s && (loopsDone % 2 === 0)
+    const swingForward = s && loopsDone % 2 === 0
     const forwards = (swingForward && !r) || (r && swingForward)
     position = loopsDone + (forwards ? p : 1 - p)
     return this.loops(position)
   }
 
-  progress (p) {
+  progress(p) {
     if (p == null) {
       return Math.min(1, this._time / this.duration())
     }
@@ -272,7 +276,7 @@ export default class Runner extends EventTarget {
   ===================
   These methods allow us to attach basic functions to the runner directly
   */
-  queue (initFn, runFn, retargetFn, isTransform) {
+  queue(initFn, runFn, retargetFn, isTransform) {
     this._queue.push({
       initialiser: initFn || noop,
       runner: runFn || noop,
@@ -286,19 +290,19 @@ export default class Runner extends EventTarget {
     return this
   }
 
-  reset () {
+  reset() {
     if (this._reseted) return this
     this.time(0)
     this._reseted = true
     return this
   }
 
-  reverse (reverse) {
+  reverse(reverse) {
     this._reverse = reverse == null ? !this._reverse : reverse
     return this
   }
 
-  schedule (timeline, delay, when) {
+  schedule(timeline, delay, when) {
     // The user doesn't need to pass a timeline if we already have one
     if (!(timeline instanceof Timeline)) {
       when = delay
@@ -316,7 +320,7 @@ export default class Runner extends EventTarget {
     return this
   }
 
-  step (dt) {
+  step(dt) {
     // If we are inactive, this stepper just gets skipped
     if (!this.enabled) return this
 
@@ -373,7 +377,7 @@ export default class Runner extends EventTarget {
   ========================
   Control how the animation plays
   */
-  time (time) {
+  time(time) {
     if (time == null) {
       return this._time
     }
@@ -382,21 +386,21 @@ export default class Runner extends EventTarget {
     return this
   }
 
-  timeline (timeline) {
+  timeline(timeline) {
     // check explicitly for undefined so we can set the timeline to null
     if (typeof timeline === 'undefined') return this._timeline
     this._timeline = timeline
     return this
   }
 
-  unschedule () {
+  unschedule() {
     const timeline = this.timeline()
     timeline && timeline.unschedule(this)
     return this
   }
 
   // Run each initialise function in the runner if required
-  _initialise (running) {
+  _initialise(running) {
     // If we aren't running, we shouldn't initialise when not declarative
     if (!running && !this._isDeclarative) return
 
@@ -418,7 +422,7 @@ export default class Runner extends EventTarget {
   }
 
   // Save a morpher to the morpher list so that we can retarget it later
-  _rememberMorpher (method, morpher) {
+  _rememberMorpher(method, morpher) {
     this._history[method] = {
       morpher: morpher,
       caller: this._queue[this._queue.length - 1]
@@ -438,7 +442,7 @@ export default class Runner extends EventTarget {
 
   // Try to set the target for a morpher if the morpher exists, otherwise
   // Run each run function for the position or dt given
-  _run (positionOrDt) {
+  _run(positionOrDt) {
     // Run all of the _queue directly
     let allfinished = true
     for (let i = 0, len = this._queue.length; i < len; ++i) {
@@ -448,7 +452,7 @@ export default class Runner extends EventTarget {
       // Run the function if its not finished, we keep track of the finished
       // flag for the sake of declarative _queue
       const converged = current.runner.call(this, positionOrDt)
-      current.finished = current.finished || (converged === true)
+      current.finished = current.finished || converged === true
       allfinished = allfinished && current.finished
     }
 
@@ -457,7 +461,7 @@ export default class Runner extends EventTarget {
   }
 
   // do nothing and return false
-  _tryRetarget (method, target, extra) {
+  _tryRetarget(method, target, extra) {
     if (this._history[method]) {
       // if the last method wasn't even initialised, throw it away
       if (!this._history[method].caller.initialised) {
@@ -482,23 +486,22 @@ export default class Runner extends EventTarget {
     }
     return false
   }
-
 }
 
 Runner.id = 0
 
 export class FakeRunner {
-  constructor (transforms = new Matrix(), id = -1, done = true) {
+  constructor(transforms = new Matrix(), id = -1, done = true) {
     this.transforms = transforms
     this.id = id
     this.done = done
   }
 
-  clearTransformsFromQueue () { }
+  clearTransformsFromQueue() {}
 }
 
-extend([ Runner, FakeRunner ], {
-  mergeWith (runner) {
+extend([Runner, FakeRunner], {
+  mergeWith(runner) {
     return new FakeRunner(
       runner.transforms.lmultiply(this.transforms),
       runner.id
@@ -511,7 +514,7 @@ extend([ Runner, FakeRunner ], {
 const lmultiply = (last, curr) => last.lmultiplyO(curr)
 const getRunnerTransform = (runner) => runner.transforms
 
-function mergeTransforms () {
+function mergeTransforms() {
   // Find the matrix to apply to the element and apply it
   const runners = this._transformationRunners.runners
   const netTransform = runners
@@ -528,12 +531,12 @@ function mergeTransforms () {
 }
 
 export class RunnerArray {
-  constructor () {
+  constructor() {
     this.runners = []
     this.ids = []
   }
 
-  add (runner) {
+  add(runner) {
     if (this.runners.includes(runner)) return
     const id = runner.id + 1
 
@@ -543,39 +546,44 @@ export class RunnerArray {
     return this
   }
 
-  clearBefore (id) {
+  clearBefore(id) {
     const deleteCnt = this.ids.indexOf(id + 1) || 1
     this.ids.splice(0, deleteCnt, 0)
-    this.runners.splice(0, deleteCnt, new FakeRunner())
+    this.runners
+      .splice(0, deleteCnt, new FakeRunner())
       .forEach((r) => r.clearTransformsFromQueue())
     return this
   }
 
-  edit (id, newRunner) {
+  edit(id, newRunner) {
     const index = this.ids.indexOf(id + 1)
     this.ids.splice(index, 1, id + 1)
     this.runners.splice(index, 1, newRunner)
     return this
   }
 
-  getByID (id) {
+  getByID(id) {
     return this.runners[this.ids.indexOf(id + 1)]
   }
 
-  length () {
+  length() {
     return this.ids.length
   }
 
-  merge () {
+  merge() {
     let lastRunner = null
     for (let i = 0; i < this.runners.length; ++i) {
       const runner = this.runners[i]
 
-      const condition = lastRunner
-        && runner.done && lastRunner.done
+      const condition =
+        lastRunner &&
+        runner.done &&
+        lastRunner.done &&
         // don't merge runner when persisted on timeline
-        && (!runner._timeline || !runner._timeline._runnerIds.includes(runner.id))
-        && (!lastRunner._timeline || !lastRunner._timeline._runnerIds.includes(lastRunner.id))
+        (!runner._timeline ||
+          !runner._timeline._runnerIds.includes(runner.id)) &&
+        (!lastRunner._timeline ||
+          !lastRunner._timeline._runnerIds.includes(lastRunner.id))
 
       if (condition) {
         // the +1 happens in the function
@@ -592,18 +600,17 @@ export class RunnerArray {
     return this
   }
 
-  remove (id) {
+  remove(id) {
     const index = this.ids.indexOf(id + 1)
     this.ids.splice(index, 1)
     this.runners.splice(index, 1)
     return this
   }
-
 }
 
 registerMethods({
   Element: {
-    animate (duration, delay, when) {
+    animate(duration, delay, when) {
       const o = Runner.sanitise(duration, delay, when)
       const timeline = this.timeline()
       return new Runner(o.duration)
@@ -613,7 +620,7 @@ registerMethods({
         .schedule(o.delay, o.when)
     },
 
-    delay (by, when) {
+    delay(by, when) {
       return this.animate(0, by, when)
     },
 
@@ -621,21 +628,23 @@ registerMethods({
     // which run before the current one. This is because absolute transformations
     // overwrite anything anyway so there is no need to waste time computing
     // other runners
-    _clearTransformRunnersBefore (currentRunner) {
+    _clearTransformRunnersBefore(currentRunner) {
       this._transformationRunners.clearBefore(currentRunner.id)
     },
 
-    _currentTransform (current) {
-      return this._transformationRunners.runners
-        // we need the equal sign here to make sure, that also transformations
-        // on the same runner which execute before the current transformation are
-        // taken into account
-        .filter((runner) => runner.id <= current.id)
-        .map(getRunnerTransform)
-        .reduce(lmultiply, new Matrix())
+    _currentTransform(current) {
+      return (
+        this._transformationRunners.runners
+          // we need the equal sign here to make sure, that also transformations
+          // on the same runner which execute before the current transformation are
+          // taken into account
+          .filter((runner) => runner.id <= current.id)
+          .map(getRunnerTransform)
+          .reduce(lmultiply, new Matrix())
+      )
     },
 
-    _addRunner (runner) {
+    _addRunner(runner) {
       this._transformationRunners.add(runner)
 
       // Make sure that the runner merge is executed at the very end of
@@ -645,29 +654,30 @@ registerMethods({
       this._frameId = Animator.immediate(mergeTransforms.bind(this))
     },
 
-    _prepareRunner () {
+    _prepareRunner() {
       if (this._frameId == null) {
-        this._transformationRunners = new RunnerArray()
-          .add(new FakeRunner(new Matrix(this)))
+        this._transformationRunners = new RunnerArray().add(
+          new FakeRunner(new Matrix(this))
+        )
       }
     }
   }
 })
 
 // Will output the elements from array A that are not in the array B
-const difference = (a, b) => a.filter(x => !b.includes(x))
+const difference = (a, b) => a.filter((x) => !b.includes(x))
 
 extend(Runner, {
-  attr (a, v) {
+  attr(a, v) {
     return this.styleAttr('attr', a, v)
   },
 
   // Add animatable styles
-  css (s, v) {
+  css(s, v) {
     return this.styleAttr('css', s, v)
   },
 
-  styleAttr (type, nameOrAttrs, val) {
+  styleAttr(type, nameOrAttrs, val) {
     if (typeof nameOrAttrs === 'string') {
       return this.styleAttr(type, { [nameOrAttrs]: val })
     }
@@ -678,62 +688,69 @@ extend(Runner, {
     let morpher = new Morphable(this._stepper).to(attrs)
     let keys = Object.keys(attrs)
 
-    this.queue(function () {
-      morpher = morpher.from(this.element()[type](keys))
-    }, function (pos) {
-      this.element()[type](morpher.at(pos).valueOf())
-      return morpher.done()
-    }, function (newToAttrs) {
+    this.queue(
+      function () {
+        morpher = morpher.from(this.element()[type](keys))
+      },
+      function (pos) {
+        this.element()[type](morpher.at(pos).valueOf())
+        return morpher.done()
+      },
+      function (newToAttrs) {
+        // Check if any new keys were added
+        const newKeys = Object.keys(newToAttrs)
+        const differences = difference(newKeys, keys)
+
+        // If their are new keys, initialize them and add them to morpher
+        if (differences.length) {
+          // Get the values
+          const addedFromAttrs = this.element()[type](differences)
+
+          // Get the already initialized values
+          const oldFromAttrs = new ObjectBag(morpher.from()).valueOf()
+
+          // Merge old and new
+          Object.assign(oldFromAttrs, addedFromAttrs)
+          morpher.from(oldFromAttrs)
+        }
 
-      // Check if any new keys were added
-      const newKeys = Object.keys(newToAttrs)
-      const differences = difference(newKeys, keys)
+        // Get the object from the morpher
+        const oldToAttrs = new ObjectBag(morpher.to()).valueOf()
 
-      // If their are new keys, initialize them and add them to morpher
-      if (differences.length) {
-        // Get the values
-        const addedFromAttrs = this.element()[type](differences)
+        // Merge in new attributes
+        Object.assign(oldToAttrs, newToAttrs)
 
-        // Get the already initialized values
-        const oldFromAttrs = new ObjectBag(morpher.from()).valueOf()
+        // Change morpher target
+        morpher.to(oldToAttrs)
 
-        // Merge old and new
-        Object.assign(oldFromAttrs, addedFromAttrs)
-        morpher.from(oldFromAttrs)
+        // Make sure that we save the work we did so we don't need it to do again
+        keys = newKeys
+        attrs = newToAttrs
       }
-
-      // Get the object from the morpher
-      const oldToAttrs = new ObjectBag(morpher.to()).valueOf()
-
-      // Merge in new attributes
-      Object.assign(oldToAttrs, newToAttrs)
-
-      // Change morpher target
-      morpher.to(oldToAttrs)
-
-      // Make sure that we save the work we did so we don't need it to do again
-      keys = newKeys
-      attrs = newToAttrs
-    })
+    )
 
     this._rememberMorpher(type, morpher)
     return this
   },
 
-  zoom (level, point) {
+  zoom(level, point) {
     if (this._tryRetarget('zoom', level, point)) return this
 
     let morpher = new Morphable(this._stepper).to(new SVGNumber(level))
 
-    this.queue(function () {
-      morpher = morpher.from(this.element().zoom())
-    }, function (pos) {
-      this.element().zoom(morpher.at(pos), point)
-      return morpher.done()
-    }, function (newLevel, newPoint) {
-      point = newPoint
-      morpher.to(newLevel)
-    })
+    this.queue(
+      function () {
+        morpher = morpher.from(this.element().zoom())
+      },
+      function (pos) {
+        this.element().zoom(morpher.at(pos), point)
+        return morpher.done()
+      },
+      function (newLevel, newPoint) {
+        point = newPoint
+        morpher.to(newLevel)
+      }
+    )
 
     this._rememberMorpher('zoom', morpher)
     return this
@@ -756,22 +773,30 @@ extend(Runner, {
   //   - Note F(1) = T
   // 4. Now you get the delta matrix as a result: D = F * inv(M)
 
-  transform (transforms, relative, affine) {
+  transform(transforms, relative, affine) {
     // If we have a declarative function, we should retarget it if possible
     relative = transforms.relative || relative
-    if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) {
+    if (
+      this._isDeclarative &&
+      !relative &&
+      this._tryRetarget('transform', transforms)
+    ) {
       return this
     }
 
     // Parse the parameters
     const isMatrix = Matrix.isMatrixLike(transforms)
-    affine = transforms.affine != null
-      ? transforms.affine
-      : (affine != null ? affine : !isMatrix)
+    affine =
+      transforms.affine != null
+        ? transforms.affine
+        : affine != null
+        ? affine
+        : !isMatrix
 
     // Create a morpher and set its type
-    const morpher = new Morphable(this._stepper)
-      .type(affine ? TransformBag : Matrix)
+    const morpher = new Morphable(this._stepper).type(
+      affine ? TransformBag : Matrix
+    )
 
     let origin
     let element
@@ -779,7 +804,7 @@ extend(Runner, {
     let currentAngle
     let startTransform
 
-    function setup () {
+    function setup() {
       // make sure element and origin is defined
       element = element || this.element()
       origin = origin || getOrigin(transforms, element)
@@ -795,17 +820,17 @@ extend(Runner, {
       }
     }
 
-    function run (pos) {
+    function run(pos) {
       // clear all other transforms before this in case something is saved
       // on this runner. We are absolute. We dont need these!
       if (!relative) this.clearTransform()
 
-      const { x, y } = new Point(origin).transform(element._currentTransform(this))
+      const { x, y } = new Point(origin).transform(
+        element._currentTransform(this)
+      )
 
-      let target = new Matrix({ ...transforms, origin: [ x, y ] })
-      let start = this._isDeclarative && current
-        ? current
-        : startTransform
+      let target = new Matrix({ ...transforms, origin: [x, y] })
+      let start = this._isDeclarative && current ? current : startTransform
 
       if (affine) {
         target = target.decompose(x, y)
@@ -816,8 +841,8 @@ extend(Runner, {
         const rCurrent = start.rotate
 
         // Figure out the shortest path to rotate directly
-        const possibilities = [ rTarget - 360, rTarget, rTarget + 360 ]
-        const distances = possibilities.map(a => Math.abs(a - rCurrent))
+        const possibilities = [rTarget - 360, rTarget, rTarget + 360]
+        const distances = possibilities.map((a) => Math.abs(a - rCurrent))
         const shortest = Math.min(...distances)
         const index = distances.indexOf(shortest)
         target.rotate = possibilities[index]
@@ -846,11 +871,11 @@ extend(Runner, {
       return morpher.done()
     }
 
-    function retarget (newTransforms) {
+    function retarget(newTransforms) {
       // only get a new origin if it changed since the last call
       if (
-        (newTransforms.origin || 'center').toString()
-        !== (transforms.origin || 'center').toString()
+        (newTransforms.origin || 'center').toString() !==
+        (transforms.origin || 'center').toString()
       ) {
         origin = getOrigin(newTransforms, element)
       }
@@ -865,28 +890,28 @@ extend(Runner, {
   },
 
   // Animatable x-axis
-  x (x, relative) {
+  x(x) {
     return this._queueNumber('x', x)
   },
 
   // Animatable y-axis
-  y (y) {
+  y(y) {
     return this._queueNumber('y', y)
   },
 
-  dx (x = 0) {
+  dx(x = 0) {
     return this._queueNumberDelta('x', x)
   },
 
-  dy (y = 0) {
+  dy(y = 0) {
     return this._queueNumberDelta('y', y)
   },
 
-  dmove (x, y) {
+  dmove(x, y) {
     return this.dx(x).dy(y)
   },
 
-  _queueNumberDelta (method, to) {
+  _queueNumberDelta(method, to) {
     to = new SVGNumber(to)
 
     // Try to change the target if we have this method already registered
@@ -895,66 +920,73 @@ extend(Runner, {
     // Make a morpher and queue the animation
     const morpher = new Morphable(this._stepper).to(to)
     let from = null
-    this.queue(function () {
-      from = this.element()[method]()
-      morpher.from(from)
-      morpher.to(from + to)
-    }, function (pos) {
-      this.element()[method](morpher.at(pos))
-      return morpher.done()
-    }, function (newTo) {
-      morpher.to(from + new SVGNumber(newTo))
-    })
+    this.queue(
+      function () {
+        from = this.element()[method]()
+        morpher.from(from)
+        morpher.to(from + to)
+      },
+      function (pos) {
+        this.element()[method](morpher.at(pos))
+        return morpher.done()
+      },
+      function (newTo) {
+        morpher.to(from + new SVGNumber(newTo))
+      }
+    )
 
     // Register the morpher so that if it is changed again, we can retarget it
     this._rememberMorpher(method, morpher)
     return this
   },
 
-  _queueObject (method, to) {
+  _queueObject(method, to) {
     // Try to change the target if we have this method already registered
     if (this._tryRetarget(method, to)) return this
 
     // Make a morpher and queue the animation
     const morpher = new Morphable(this._stepper).to(to)
-    this.queue(function () {
-      morpher.from(this.element()[method]())
-    }, function (pos) {
-      this.element()[method](morpher.at(pos))
-      return morpher.done()
-    })
+    this.queue(
+      function () {
+        morpher.from(this.element()[method]())
+      },
+      function (pos) {
+        this.element()[method](morpher.at(pos))
+        return morpher.done()
+      }
+    )
 
     // Register the morpher so that if it is changed again, we can retarget it
     this._rememberMorpher(method, morpher)
     return this
   },
 
-  _queueNumber (method, value) {
+  _queueNumber(method, value) {
     return this._queueObject(method, new SVGNumber(value))
   },
 
   // Animatable center x-axis
-  cx (x) {
+  cx(x) {
     return this._queueNumber('cx', x)
   },
 
   // Animatable center y-axis
-  cy (y) {
+  cy(y) {
     return this._queueNumber('cy', y)
   },
 
   // Add animatable move
-  move (x, y) {
+  move(x, y) {
     return this.x(x).y(y)
   },
 
   // Add animatable center
-  center (x, y) {
+  center(x, y) {
     return this.cx(x).cy(y)
   },
 
   // Add animatable size
-  size (width, height) {
+  size(width, height) {
     // animate bbox based size for all other elements
     let box
 
@@ -963,62 +995,64 @@ extend(Runner, {
     }
 
     if (!width) {
-      width = box.width / box.height * height
+      width = (box.width / box.height) * height
     }
 
     if (!height) {
-      height = box.height / box.width * width
+      height = (box.height / box.width) * width
     }
 
-    return this
-      .width(width)
-      .height(height)
+    return this.width(width).height(height)
   },
 
   // Add animatable width
-  width (width) {
+  width(width) {
     return this._queueNumber('width', width)
   },
 
   // Add animatable height
-  height (height) {
+  height(height) {
     return this._queueNumber('height', height)
   },
 
   // Add animatable plot
-  plot (a, b, c, d) {
+  plot(a, b, c, d) {
     // Lines can be plotted with 4 arguments
     if (arguments.length === 4) {
-      return this.plot([ a, b, c, d ])
+      return this.plot([a, b, c, d])
     }
 
     if (this._tryRetarget('plot', a)) return this
 
     const morpher = new Morphable(this._stepper)
-      .type(this._element.MorphArray).to(a)
-
-    this.queue(function () {
-      morpher.from(this._element.array())
-    }, function (pos) {
-      this._element.plot(morpher.at(pos))
-      return morpher.done()
-    })
+      .type(this._element.MorphArray)
+      .to(a)
+
+    this.queue(
+      function () {
+        morpher.from(this._element.array())
+      },
+      function (pos) {
+        this._element.plot(morpher.at(pos))
+        return morpher.done()
+      }
+    )
 
     this._rememberMorpher('plot', morpher)
     return this
   },
 
   // Add leading method
-  leading (value) {
+  leading(value) {
     return this._queueNumber('leading', value)
   },
 
   // Add animatable viewbox
-  viewbox (x, y, width, height) {
+  viewbox(x, y, width, height) {
     return this._queueObject('viewbox', new Box(x, y, width, height))
   },
 
-  update (o) {
+  update(o) {
     if (typeof o !== 'object') {
       return this.update({
         offset: arguments[0],
index 3f81b6685a89730bcdc98ac97c55e0eeb0b22e60..39e0f1acd9797caa7b17d8667b3a1f9baf339234 100644 (file)
@@ -7,7 +7,12 @@ const makeSchedule = function (runnerInfo) {
   const start = runnerInfo.start
   const duration = runnerInfo.runner.duration()
   const end = start + duration
-  return { start: start, duration: duration, end: end, runner: runnerInfo.runner }
+  return {
+    start: start,
+    duration: duration,
+    end: end,
+    runner: runnerInfo.runner
+  }
 }
 
 const defaultSource = function () {
@@ -17,7 +22,7 @@ const defaultSource = function () {
 
 export default class Timeline extends EventTarget {
   // Construct a new timeline on the given element
-  constructor (timeSource = defaultSource) {
+  constructor(timeSource = defaultSource) {
     super()
 
     this._timeSource = timeSource
@@ -44,55 +49,55 @@ export default class Timeline extends EventTarget {
     this._stepImmediate = this._stepFn.bind(this, true)
   }
 
-  active () {
+  active() {
     return !!this._nextFrame
   }
 
-  finish () {
+  finish() {
     // Go to end and pause
     this.time(this.getEndTimeOfTimeline() + 1)
     return this.pause()
   }
 
   // Calculates the end of the timeline
-  getEndTime () {
+  getEndTime() {
     const lastRunnerInfo = this.getLastRunnerInfo()
     const lastDuration = lastRunnerInfo ? lastRunnerInfo.runner.duration() : 0
     const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time
     return lastStartTime + lastDuration
   }
 
-  getEndTimeOfTimeline () {
+  getEndTimeOfTimeline() {
     const endTimes = this._runners.map((i) => i.start + i.runner.duration())
     return Math.max(0, ...endTimes)
   }
 
-  getLastRunnerInfo () {
+  getLastRunnerInfo() {
     return this.getRunnerInfoById(this._lastRunnerId)
   }
 
-  getRunnerInfoById (id) {
+  getRunnerInfoById(id) {
     return this._runners[this._runnerIds.indexOf(id)] || null
   }
 
-  pause () {
+  pause() {
     this._paused = true
     return this._continue()
   }
 
-  persist (dtOrForever) {
+  persist(dtOrForever) {
     if (dtOrForever == null) return this._persist
     this._persist = dtOrForever
     return this
   }
 
-  play () {
+  play() {
     // Now make sure we are not paused and continue the animation
     this._paused = false
     return this.updateTime()._continue()
   }
 
-  reverse (yes) {
+  reverse(yes) {
     const currentSpeed = this.speed()
     if (yes == null) return this.speed(-currentSpeed)
 
@@ -101,7 +106,7 @@ export default class Timeline extends EventTarget {
   }
 
   // schedules a runner on the timeline
-  schedule (runner, delay, when) {
+  schedule(runner, delay, when) {
     if (runner == null) {
       return this._runners.map(makeSchedule)
     }
@@ -152,42 +157,42 @@ export default class Timeline extends EventTarget {
 
     this._runners.push(runnerInfo)
     this._runners.sort((a, b) => a.start - b.start)
-    this._runnerIds = this._runners.map(info => info.runner.id)
+    this._runnerIds = this._runners.map((info) => info.runner.id)
 
     this.updateTime()._continue()
     return this
   }
 
-  seek (dt) {
+  seek(dt) {
     return this.time(this._time + dt)
   }
 
-  source (fn) {
+  source(fn) {
     if (fn == null) return this._timeSource
     this._timeSource = fn
     return this
   }
 
-  speed (speed) {
+  speed(speed) {
     if (speed == null) return this._speed
     this._speed = speed
     return this
   }
 
-  stop () {
+  stop() {
     // Go to start and pause
     this.time(0)
     return this.pause()
   }
 
-  time (time) {
+  time(time) {
     if (time == null) return this._time
     this._time = time
     return this._continue(true)
   }
 
   // Remove the runner from this timeline
-  unschedule (runner) {
+  unschedule(runner) {
     const index = this._runnerIds.indexOf(runner.id)
     if (index < 0) return this
 
@@ -199,7 +204,7 @@ export default class Timeline extends EventTarget {
   }
 
   // Makes sure, that after pausing the time doesn't jump
-  updateTime () {
+  updateTime() {
     if (!this.active()) {
       this._lastSourceTime = this._timeSource()
     }
@@ -207,7 +212,7 @@ export default class Timeline extends EventTarget {
   }
 
   // Checks if we are running and continues the animation
-  _continue (immediateStep = false) {
+  _continue(immediateStep = false) {
     Animator.cancelFrame(this._nextFrame)
     this._nextFrame = null
 
@@ -218,7 +223,7 @@ export default class Timeline extends EventTarget {
     return this
   }
 
-  _stepFn (immediateStep = false) {
+  _stepFn(immediateStep = false) {
     // Get the time delta from the last time and update the time
     const time = this._timeSource()
     let dtSource = time - this._lastSourceTime
@@ -249,7 +254,7 @@ export default class Timeline extends EventTarget {
     // runner always wins the reset even if the other runner started earlier
     // and therefore should win the attribute battle
     // this can be solved by resetting them backwards
-    for (let k = this._runners.length; k--;) {
+    for (let k = this._runners.length; k--; ) {
       // Get and run the current runner and ignore it if its inactive
       const runnerInfo = this._runners[k]
       const runner = runnerInfo.runner
@@ -309,7 +314,10 @@ export default class Timeline extends EventTarget {
 
     // Basically: we continue when there are runners right from us in time
     // when -->, and when runners are left from us when <--
-    if ((runnersLeft && !(this._speed < 0 && this._time === 0)) || (this._runnerIds.length && this._speed < 0 && this._time > 0)) {
+    if (
+      (runnersLeft && !(this._speed < 0 && this._time === 0)) ||
+      (this._runnerIds.length && this._speed < 0 && this._time > 0)
+    ) {
       this._continue()
     } else {
       this.pause()
@@ -318,14 +326,13 @@ export default class Timeline extends EventTarget {
 
     return this
   }
-
 }
 
 registerMethods({
   Element: {
     timeline: function (timeline) {
       if (timeline == null) {
-        this._timeline = (this._timeline || new Timeline())
+        this._timeline = this._timeline || new Timeline()
         return this._timeline
       } else {
         this._timeline = timeline
index 173fc92ed841e3957532ace32e5db03771c4d2fc..231954fcc9c87b803c62ce4b6dbfcd8cee9aa73a 100644 (file)
@@ -1,24 +1,28 @@
-import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js'
+import {
+  nodeOrNew,
+  register,
+  wrapWithAttrCheck,
+  extend
+} from '../utils/adopter.js'
 import { registerMethods } from '../utils/methods.js'
 import { xlink } from '../modules/core/namespaces.js'
 import Container from './Container.js'
 import * as containerGeometry from '../modules/core/containerGeometry.js'
 
 export default class A extends Container {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('a', node), attrs)
   }
 
   // Link target attribute
-  target (target) {
+  target(target) {
     return this.attr('target', target)
   }
 
   // Link url
-  to (url) {
+  to(url) {
     return this.attr('href', url, xlink)
   }
-
 }
 
 extend(A, containerGeometry)
@@ -31,7 +35,7 @@ registerMethods({
     })
   },
   Element: {
-    unlink () {
+    unlink() {
       const link = this.linker()
 
       if (!link) return this
@@ -48,7 +52,7 @@ registerMethods({
       link.remove()
       return this
     },
-    linkTo (url) {
+    linkTo(url) {
       // reuse old link if possible
       let link = this.linker()
 
@@ -65,7 +69,7 @@ registerMethods({
 
       return this
     },
-    linker () {
+    linker() {
       const link = this.parent()
       if (link && link.node.nodeName.toLowerCase() === 'a') {
         return link
index 6981b0542f7ebd87e9124d95266e1672d00c0539..5dae51e5b374f077a1a6b2fbd28bc3f9deb68c9e 100644 (file)
@@ -10,25 +10,25 @@ import SVGNumber from '../types/SVGNumber.js'
 import Shape from './Shape.js'
 
 export default class Circle extends Shape {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('circle', node), attrs)
   }
 
-  radius (r) {
+  radius(r) {
     return this.attr('r', r)
   }
 
   // Radius x value
-  rx (rx) {
+  rx(rx) {
     return this.attr('r', rx)
   }
 
   // Alias radius x value
-  ry (ry) {
+  ry(ry) {
     return this.rx(ry)
   }
 
-  size (size) {
+  size(size) {
     return this.radius(new SVGNumber(size).divide(2))
   }
 }
@@ -39,9 +39,7 @@ registerMethods({
   Container: {
     // Create circle element
     circle: wrapWithAttrCheck(function (size = 0) {
-      return this.put(new Circle())
-        .size(size)
-        .move(0, 0)
+      return this.put(new Circle()).size(size).move(0, 0)
     })
   }
 })
index f17428fec33fb540adef932c19cad26d51b6b01f..747059dd107e91eae3d7d86395e0c10b2076f7d2 100644 (file)
@@ -4,12 +4,12 @@ import Container from './Container.js'
 import baseFind from '../modules/core/selector.js'
 
 export default class ClipPath extends Container {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('clipPath', node), attrs)
   }
 
   // Unclip all clipped elements and remove itself
-  remove () {
+  remove() {
     // unclip all targets
     this.targets().forEach(function (el) {
       el.unclip()
@@ -19,7 +19,7 @@ export default class ClipPath extends Container {
     return super.remove()
   }
 
-  targets () {
+  targets() {
     return baseFind('svg [clip-path*=' + this.id() + ']')
   }
 }
@@ -33,22 +33,23 @@ registerMethods({
   },
   Element: {
     // Distribute clipPath to svg element
-    clipper () {
+    clipper() {
       return this.reference('clip-path')
     },
 
-    clipWith (element) {
+    clipWith(element) {
       // use given clip or create a new one
-      const clipper = element instanceof ClipPath
-        ? element
-        : this.parent().clip().add(element)
+      const clipper =
+        element instanceof ClipPath
+          ? element
+          : this.parent().clip().add(element)
 
       // apply mask
       return this.attr('clip-path', 'url(#' + clipper.id() + ')')
     },
 
     // Unclip element
-    unclip () {
+    unclip() {
       return this.attr('clip-path', null)
     }
   }
index 9278435004ad318c653f18243f665108e6e2988d..0f45b6dd57f95085065cb1669f2875905a03a17e 100644 (file)
@@ -2,7 +2,7 @@ import { register } from '../utils/adopter.js'
 import Element from './Element.js'
 
 export default class Container extends Element {
-  flatten (parent = this, index) {
+  flatten() {
     this.each(function () {
       if (this instanceof Container) {
         return this.flatten().ungroup()
@@ -12,7 +12,7 @@ export default class Container extends Element {
     return this
   }
 
-  ungroup (parent = this.parent(), index = parent.index(this)) {
+  ungroup(parent = this.parent(), index = parent.index(this)) {
     // when parent != this, we want append all elements to the end
     index = index === -1 ? parent.children().length : index
 
index 7491ba0005bba895e86a3dcd04a42e9cdfd8dfd2..6d9f725cd675caec1141a8f5c734dcca04e9d1be 100644 (file)
@@ -2,15 +2,15 @@ import { nodeOrNew, register } from '../utils/adopter.js'
 import Container from './Container.js'
 
 export default class Defs extends Container {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('defs', node), attrs)
   }
 
-  flatten () {
+  flatten() {
     return this
   }
 
-  ungroup () {
+  ungroup() {
     return this
   }
 }
index 2584a432a35ef35a2911a413822acf948686bc37..604a1eeed3887095b615d1378b9571fb96e0dad4 100644 (file)
@@ -16,7 +16,7 @@ import List from '../types/List.js'
 import attr from '../modules/core/attr.js'
 
 export default class Dom extends EventTarget {
-  constructor (node, attrs) {
+  constructor(node, attrs) {
     super()
     this.node = node
     this.type = node.nodeName
@@ -27,11 +27,14 @@ export default class Dom extends EventTarget {
   }
 
   // Add given element at a position
-  add (element, i) {
+  add(element, i) {
     element = makeInstance(element)
 
     // If non-root svg nodes are added we have to remove their namespaces
-    if (element.removeNamespace && this.node instanceof globals.window.SVGElement) {
+    if (
+      element.removeNamespace &&
+      this.node instanceof globals.window.SVGElement
+    ) {
       element.removeNamespace()
     }
 
@@ -45,19 +48,21 @@ export default class Dom extends EventTarget {
   }
 
   // Add element to given container and return self
-  addTo (parent, i) {
+  addTo(parent, i) {
     return makeInstance(parent).put(this, i)
   }
 
   // Returns all child elements
-  children () {
-    return new List(map(this.node.children, function (node) {
-      return adopt(node)
-    }))
+  children() {
+    return new List(
+      map(this.node.children, function (node) {
+        return adopt(node)
+      })
+    )
   }
 
   // Remove all elements in this container
-  clear () {
+  clear() {
     // remove children
     while (this.node.hasChildNodes()) {
       this.node.removeChild(this.node.lastChild)
@@ -67,7 +72,7 @@ export default class Dom extends EventTarget {
   }
 
   // Clone element
-  clone (deep = true, assignNewIds = true) {
+  clone(deep = true, assignNewIds = true) {
     // write dom data to the dom so the clone can pickup the data
     this.writeDataToDom()
 
@@ -81,12 +86,12 @@ export default class Dom extends EventTarget {
   }
 
   // Iterates over all children and invokes a given block
-  each (block, deep) {
+  each(block, deep) {
     const children = this.children()
     let i, il
 
     for (i = 0, il = children.length; i < il; i++) {
-      block.apply(children[i], [ i, children ])
+      block.apply(children[i], [i, children])
 
       if (deep) {
         children[i].each(block, deep)
@@ -96,39 +101,39 @@ export default class Dom extends EventTarget {
     return this
   }
 
-  element (nodeName, attrs) {
+  element(nodeName, attrs) {
     return this.put(new Dom(create(nodeName), attrs))
   }
 
   // Get first child
-  first () {
+  first() {
     return adopt(this.node.firstChild)
   }
 
   // Get a element at the given index
-  get (i) {
+  get(i) {
     return adopt(this.node.childNodes[i])
   }
 
-  getEventHolder () {
+  getEventHolder() {
     return this.node
   }
 
-  getEventTarget () {
+  getEventTarget() {
     return this.node
   }
 
   // Checks if the given element is a child
-  has (element) {
+  has(element) {
     return this.index(element) >= 0
   }
 
-  html (htmlOrFn, outerHTML) {
+  html(htmlOrFn, outerHTML) {
     return this.xml(htmlOrFn, outerHTML, html)
   }
 
   // Get / set id
-  id (id) {
+  id(id) {
     // generate new id if no id set
     if (typeof id === 'undefined' && !this.node.id) {
       this.node.id = eid(this.type)
@@ -139,24 +144,31 @@ export default class Dom extends EventTarget {
   }
 
   // Gets index of given element
-  index (element) {
+  index(element) {
     return [].slice.call(this.node.childNodes).indexOf(element.node)
   }
 
   // Get the last child
-  last () {
+  last() {
     return adopt(this.node.lastChild)
   }
 
   // matches the element vs a css selector
-  matches (selector) {
+  matches(selector) {
     const el = this.node
-    const matcher = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector || null
+    const matcher =
+      el.matches ||
+      el.matchesSelector ||
+      el.msMatchesSelector ||
+      el.mozMatchesSelector ||
+      el.webkitMatchesSelector ||
+      el.oMatchesSelector ||
+      null
     return matcher && matcher.call(el, selector)
   }
 
   // Returns the parent element instance
-  parent (type) {
+  parent(type) {
     let parent = this
 
     // check for parent
@@ -169,26 +181,29 @@ export default class Dom extends EventTarget {
 
     // loop through ancestors if type is given
     do {
-      if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent
+      if (
+        typeof type === 'string' ? parent.matches(type) : parent instanceof type
+      )
+        return parent
     } while ((parent = adopt(parent.node.parentNode)))
 
     return parent
   }
 
   // Basically does the same as `add()` but returns the added element instead
-  put (element, i) {
+  put(element, i) {
     element = makeInstance(element)
     this.add(element, i)
     return element
   }
 
   // Add element to given container and return container
-  putIn (parent, i) {
+  putIn(parent, i) {
     return makeInstance(parent).add(this, i)
   }
 
   // Remove element
-  remove () {
+  remove() {
     if (this.parent()) {
       this.parent().removeElement(this)
     }
@@ -197,14 +212,14 @@ export default class Dom extends EventTarget {
   }
 
   // Remove a given child
-  removeElement (element) {
+  removeElement(element) {
     this.node.removeChild(element.node)
 
     return this
   }
 
   // Replace this with element
-  replace (element) {
+  replace(element) {
     element = makeInstance(element)
 
     if (this.node.parentNode) {
@@ -214,7 +229,7 @@ export default class Dom extends EventTarget {
     return element
   }
 
-  round (precision = 2, map = null) {
+  round(precision = 2, map = null) {
     const factor = 10 ** precision
     const attrs = this.attr(map)
 
@@ -229,22 +244,22 @@ export default class Dom extends EventTarget {
   }
 
   // Import / Export raw svg
-  svg (svgOrFn, outerSVG) {
+  svg(svgOrFn, outerSVG) {
     return this.xml(svgOrFn, outerSVG, svg)
   }
 
   // Return id on string conversion
-  toString () {
+  toString() {
     return this.id()
   }
 
-  words (text) {
+  words(text) {
     // This is faster than removing all children and adding a new one
     this.node.textContent = text
     return this
   }
 
-  wrap (node) {
+  wrap(node) {
     const parent = this.parent()
 
     if (!parent) {
@@ -256,7 +271,7 @@ export default class Dom extends EventTarget {
   }
 
   // write svgjs data to the dom
-  writeDataToDom () {
+  writeDataToDom() {
     // dump variables recursively
     this.each(function () {
       this.writeDataToDom()
@@ -266,7 +281,7 @@ export default class Dom extends EventTarget {
   }
 
   // Import / Export raw svg
-  xml (xmlOrFn, outerXML, ns) {
+  xml(xmlOrFn, outerXML, ns) {
     if (typeof xmlOrFn === 'boolean') {
       ns = outerXML
       outerXML = xmlOrFn
@@ -312,9 +327,7 @@ export default class Dom extends EventTarget {
       }
 
       // Return outer or inner content
-      return outerXML
-        ? current.node.outerHTML
-        : current.node.innerHTML
+      return outerXML ? current.node.outerHTML : current.node.innerHTML
     }
 
     // Act as setter if we got a string
@@ -330,16 +343,14 @@ export default class Dom extends EventTarget {
     well.innerHTML = xmlOrFn
 
     // Transplant nodes into the fragment
-    for (let len = well.children.length; len--;) {
+    for (let len = well.children.length; len--; ) {
       fragment.appendChild(well.firstElementChild)
     }
 
     const parent = this.parent()
 
     // Add the whole fragment at once
-    return outerXML
-      ? this.replace(fragment) && parent
-      : this.add(fragment)
+    return outerXML ? this.replace(fragment) && parent : this.add(fragment)
   }
 }
 
index 2aaeab516cf9b3ca3c7271b9957206ade57bef1f..61db7b74678ad836f12d7c328f17da6b3c01839c 100644 (file)
@@ -16,7 +16,7 @@ import List from '../types/List.js'
 import SVGNumber from '../types/SVGNumber.js'
 
 export default class Element extends Dom {
-  constructor (node, attrs) {
+  constructor(node, attrs) {
     super(node, attrs)
 
     // initialize data object
@@ -32,61 +32,61 @@ export default class Element extends Dom {
   }
 
   // Move element by its center
-  center (x, y) {
+  center(x, y) {
     return this.cx(x).cy(y)
   }
 
   // Move by center over x-axis
-  cx (x) {
+  cx(x) {
     return x == null
       ? this.x() + this.width() / 2
       : this.x(x - this.width() / 2)
   }
 
   // Move by center over y-axis
-  cy (y) {
+  cy(y) {
     return y == null
       ? this.y() + this.height() / 2
       : this.y(y - this.height() / 2)
   }
 
   // Get defs
-  defs () {
+  defs() {
     const root = this.root()
     return root && root.defs()
   }
 
   // Relative move over x and y axes
-  dmove (x, y) {
+  dmove(x, y) {
     return this.dx(x).dy(y)
   }
 
   // Relative move over x axis
-  dx (x = 0) {
+  dx(x = 0) {
     return this.x(new SVGNumber(x).plus(this.x()))
   }
 
   // Relative move over y axis
-  dy (y = 0) {
+  dy(y = 0) {
     return this.y(new SVGNumber(y).plus(this.y()))
   }
 
-  getEventHolder () {
+  getEventHolder() {
     return this
   }
 
   // Set height of element
-  height (height) {
+  height(height) {
     return this.attr('height', height)
   }
 
   // Move element to given x and y values
-  move (x, y) {
+  move(x, y) {
     return this.x(x).y(y)
   }
 
   // return array of all ancestors of given type up to the root svg
-  parents (until = this.root()) {
+  parents(until = this.root()) {
     const isSelector = typeof until === 'string'
     if (!isSelector) {
       until = makeInstance(until)
@@ -95,13 +95,13 @@ export default class Element extends Dom {
     let parent = this
 
     while (
-      (parent = parent.parent())
-      && parent.node !== globals.document
-      && parent.nodeName !== '#document-fragment') {
-
+      (parent = parent.parent()) &&
+      parent.node !== globals.document &&
+      parent.nodeName !== '#document-fragment'
+    ) {
       parents.push(parent)
 
-      if (!isSelector && (parent.node === until.node)) {
+      if (!isSelector && parent.node === until.node) {
         break
       }
       if (isSelector && parent.matches(until)) {
@@ -117,7 +117,7 @@ export default class Element extends Dom {
   }
 
   // Get referenced element form attribute value
-  reference (attr) {
+  reference(attr) {
     attr = this.attr(attr)
     if (!attr) return null
 
@@ -126,33 +126,31 @@ export default class Element extends Dom {
   }
 
   // Get parent document
-  root () {
+  root() {
     const p = this.parent(getClass(root))
     return p && p.root()
   }
 
   // set given data to the elements data property
-  setData (o) {
+  setData(o) {
     this.dom = o
     return this
   }
 
   // Set element size to given width and height
-  size (width, height) {
+  size(width, height) {
     const p = proportionalSize(this, width, height)
 
-    return this
-      .width(new SVGNumber(p.width))
-      .height(new SVGNumber(p.height))
+    return this.width(new SVGNumber(p.width)).height(new SVGNumber(p.height))
   }
 
   // Set width of element
-  width (width) {
+  width(width) {
     return this.attr('width', width)
   }
 
   // write svgjs data to the dom
-  writeDataToDom () {
+  writeDataToDom() {
     // remove previously set data
     this.node.removeAttribute('svgjs:data')
 
@@ -164,18 +162,23 @@ export default class Element extends Dom {
   }
 
   // Move over x-axis
-  x (x) {
+  x(x) {
     return this.attr('x', x)
   }
 
   // Move over y-axis
-  y (y) {
+  y(y) {
     return this.attr('y', y)
   }
 }
 
 extend(Element, {
-  bbox, rbox, inside, point, ctm, screenCTM
+  bbox,
+  rbox,
+  inside,
+  point,
+  ctm,
+  screenCTM
 })
 
 register(Element, 'Element')
index 7f4e85386af2d00dafc94e0daf55c8be583f79e4..3f8b04b1970d4d62c944fe160bf240ad858daf33 100644 (file)
@@ -11,16 +11,16 @@ import Shape from './Shape.js'
 import * as circled from '../modules/core/circled.js'
 
 export default class Ellipse extends Shape {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('ellipse', node), attrs)
   }
 
-  size (width, height) {
+  size(width, height) {
     const p = proportionalSize(this, width, height)
 
-    return this
-      .rx(new SVGNumber(p.width).divide(2))
-      .ry(new SVGNumber(p.height).divide(2))
+    return this.rx(new SVGNumber(p.width).divide(2)).ry(
+      new SVGNumber(p.height).divide(2)
+    )
   }
 }
 
index 0a417b0550e12bc1eeaaf6053ab8b9c61cb517bc..a4148d5363400ebfbf2219fc7791019720af8163 100644 (file)
@@ -3,7 +3,7 @@ import { registerMethods } from '../utils/methods.js'
 import Element from './Element.js'
 
 export default class ForeignObject extends Element {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('foreignObject', node), attrs)
   }
 }
index d2c47641f61398d4865814c9a087e9d5abb115ef..ece3046d08c62bba0b8784d2cacce330e1effb29 100644 (file)
@@ -3,12 +3,12 @@ import { globals } from '../utils/window.js'
 import { register, create } from '../utils/adopter.js'
 
 class Fragment extends Dom {
-  constructor (node = globals.document.createDocumentFragment()) {
+  constructor(node = globals.document.createDocumentFragment()) {
     super(node)
   }
 
   // Import / Export raw xml
-  xml (xmlOrFn, outerXML, ns) {
+  xml(xmlOrFn, outerXML, ns) {
     if (typeof xmlOrFn === 'boolean') {
       ns = outerXML
       outerXML = xmlOrFn
@@ -27,7 +27,6 @@ class Fragment extends Dom {
     // Act as setter if we got a string
     return super.xml(xmlOrFn, false, ns)
   }
-
 }
 
 register(Fragment, 'Fragment')
index b3a999e746d1ae12f53ab62cc2d2accc5c6dec6d..4d3b03c2991e91af9303448b507e4494d5967bce 100644 (file)
@@ -1,10 +1,15 @@
-import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js'
+import {
+  nodeOrNew,
+  register,
+  wrapWithAttrCheck,
+  extend
+} from '../utils/adopter.js'
 import { registerMethods } from '../utils/methods.js'
 import Container from './Container.js'
 import * as containerGeometry from '../modules/core/containerGeometry.js'
 
 export default class G extends Container {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('g', node), attrs)
   }
 }
index d3fa15b9034455bbbee402cd2172f5031997653b..1631c14723018857b5a63e99d20a6086f77e086a 100644 (file)
@@ -11,7 +11,7 @@ import baseFind from '../modules/core/selector.js'
 import * as gradiented from '../modules/core/gradiented.js'
 
 export default class Gradient extends Container {
-  constructor (type, attrs) {
+  constructor(type, attrs) {
     super(
       nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type),
       attrs
@@ -19,26 +19,26 @@ export default class Gradient extends Container {
   }
 
   // custom attr to handle transform
-  attr (a, b, c) {
+  attr(a, b, c) {
     if (a === 'transform') a = 'gradientTransform'
     return super.attr(a, b, c)
   }
 
-  bbox () {
+  bbox() {
     return new Box()
   }
 
-  targets () {
+  targets() {
     return baseFind('svg [fill*=' + this.id() + ']')
   }
 
   // Alias string conversion to fill
-  toString () {
+  toString() {
     return this.url()
   }
 
   // Update gradient
-  update (block) {
+  update(block) {
     // remove all stops
     this.clear()
 
@@ -51,7 +51,7 @@ export default class Gradient extends Container {
   }
 
   // Return the fill id
-  url () {
+  url() {
     return 'url(#' + this.id() + ')'
   }
 }
@@ -61,7 +61,7 @@ extend(Gradient, gradiented)
 registerMethods({
   Container: {
     // Create gradient element in defs
-    gradient (...args) {
+    gradient(...args) {
       return this.defs().gradient(...args)
     }
   },
index c51bc9a9c1e39c82621f7551658fe82df1821e1c..080da16c5194c2cd965b3cc2c4e608b82e9370a0 100644 (file)
@@ -9,35 +9,40 @@ import Shape from './Shape.js'
 import { globals } from '../utils/window.js'
 
 export default class Image extends Shape {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('image', node), attrs)
   }
 
   // (re)load image
-  load (url, callback) {
+  load(url, callback) {
     if (!url) return this
 
     const img = new globals.window.Image()
 
-    on(img, 'load', function (e) {
-      const p = this.parent(Pattern)
+    on(
+      img,
+      'load',
+      function (e) {
+        const p = this.parent(Pattern)
 
-      // ensure image size
-      if (this.width() === 0 && this.height() === 0) {
-        this.size(img.width, img.height)
-      }
+        // ensure image size
+        if (this.width() === 0 && this.height() === 0) {
+          this.size(img.width, img.height)
+        }
 
-      if (p instanceof Pattern) {
-        // ensure pattern size if not set
-        if (p.width() === 0 && p.height() === 0) {
-          p.size(this.width(), this.height())
+        if (p instanceof Pattern) {
+          // ensure pattern size if not set
+          if (p.width() === 0 && p.height() === 0) {
+            p.size(this.width(), this.height())
+          }
         }
-      }
 
-      if (typeof callback === 'function') {
-        callback.call(this, e)
-      }
-    }, this)
+        if (typeof callback === 'function') {
+          callback.call(this, e)
+        }
+      },
+      this
+    )
 
     on(img, 'load error', function () {
       // dont forget to unbind memory leaking events
@@ -57,9 +62,12 @@ registerAttrHook(function (attr, val, _this) {
   }
 
   if (val instanceof Image) {
-    val = _this.root().defs().pattern(0, 0, (pattern) => {
-      pattern.add(val)
-    })
+    val = _this
+      .root()
+      .defs()
+      .pattern(0, 0, (pattern) => {
+        pattern.add(val)
+      })
   }
 
   return val
index 9350a23f7ca759d627c1b5201f336cc79798fdc2..0dab35ddd7a03b4e22eb7584ae328fba9823f550 100644 (file)
@@ -12,25 +12,25 @@ import * as pointed from '../modules/core/pointed.js'
 
 export default class Line extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('line', node), attrs)
   }
 
   // Get array
-  array () {
+  array() {
     return new PointArray([
-      [ this.attr('x1'), this.attr('y1') ],
-      [ this.attr('x2'), this.attr('y2') ]
+      [this.attr('x1'), this.attr('y1')],
+      [this.attr('x2'), this.attr('y2')]
     ])
   }
 
   // Move by left top corner
-  move (x, y) {
+  move(x, y) {
     return this.attr(this.array().move(x, y).toLine())
   }
 
   // Overwrite native plot() method
-  plot (x1, y1, x2, y2) {
+  plot(x1, y1, x2, y2) {
     if (x1 == null) {
       return this.array()
     } else if (typeof y1 !== 'undefined') {
@@ -43,7 +43,7 @@ export default class Line extends Shape {
   }
 
   // Set element size to given width and height
-  size (width, height) {
+  size(width, height) {
     const p = proportionalSize(this, width, height)
     return this.attr(this.array().size(p.width, p.height).toLine())
   }
@@ -58,8 +58,8 @@ registerMethods({
       // make sure plot is called as a setter
       // x1 is not necessarily a number, it can also be an array, a string and a PointArray
       return Line.prototype.plot.apply(
-        this.put(new Line())
-        , args[0] != null ? args : [ 0, 0, 0, 0 ]
+        this.put(new Line()),
+        args[0] != null ? args : [0, 0, 0, 0]
       )
     })
   }
index d6f98c860c5285a4bbbf1eaea90f2499e70b2208..5ddf80272d31593c0a5ccfa6993250ac4990bff2 100644 (file)
@@ -4,31 +4,31 @@ import Container from './Container.js'
 
 export default class Marker extends Container {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('marker', node), attrs)
   }
 
   // Set height of element
-  height (height) {
+  height(height) {
     return this.attr('markerHeight', height)
   }
 
-  orient (orient) {
+  orient(orient) {
     return this.attr('orient', orient)
   }
 
   // Set marker refX and refY
-  ref (x, y) {
+  ref(x, y) {
     return this.attr('refX', x).attr('refY', y)
   }
 
   // Return the fill id
-  toString () {
+  toString() {
     return 'url(#' + this.id() + ')'
   }
 
   // Update marker
-  update (block) {
+  update(block) {
     // remove all content
     this.clear()
 
@@ -41,15 +41,14 @@ export default class Marker extends Container {
   }
 
   // Set width of element
-  width (width) {
+  width(width) {
     return this.attr('markerWidth', width)
   }
-
 }
 
 registerMethods({
   Container: {
-    marker (...args) {
+    marker(...args) {
       // Create marker element in defs
       return this.defs().marker(...args)
     }
@@ -68,17 +67,18 @@ registerMethods({
   },
   marker: {
     // Create and attach markers
-    marker (marker, width, height, block) {
-      let attr = [ 'marker' ]
+    marker(marker, width, height, block) {
+      let attr = ['marker']
 
       // Build attribute name
       if (marker !== 'all') attr.push(marker)
       attr = attr.join('-')
 
       // Set marker attribute
-      marker = arguments[1] instanceof Marker
-        ? arguments[1]
-        : this.defs().marker(width, height, block)
+      marker =
+        arguments[1] instanceof Marker
+          ? arguments[1]
+          : this.defs().marker(width, height, block)
 
       return this.attr(attr, marker)
     }
index 5b462f7185ccb150ae1dee1cc040fc761df97eff..b8a2c9978051a81c7dfb208fb10b6f3acf16c83e 100644 (file)
@@ -5,12 +5,12 @@ import baseFind from '../modules/core/selector.js'
 
 export default class Mask extends Container {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('mask', node), attrs)
   }
 
   // Unmask all masked elements and remove itself
-  remove () {
+  remove() {
     // unmask all targets
     this.targets().forEach(function (el) {
       el.unmask()
@@ -20,7 +20,7 @@ export default class Mask extends Container {
     return super.remove()
   }
 
-  targets () {
+  targets() {
     return baseFind('svg [mask*=' + this.id() + ']')
   }
 }
@@ -33,22 +33,21 @@ registerMethods({
   },
   Element: {
     // Distribute mask to svg element
-    masker () {
+    masker() {
       return this.reference('mask')
     },
 
-    maskWith (element) {
+    maskWith(element) {
       // use given mask or create a new one
-      const masker = element instanceof Mask
-        ? element
-        : this.parent().mask().add(element)
+      const masker =
+        element instanceof Mask ? element : this.parent().mask().add(element)
 
       // apply mask
       return this.attr('mask', 'url(#' + masker.id() + ')')
     },
 
     // Unmask element
-    unmask () {
+    unmask() {
       return this.attr('mask', null)
     }
   }
index 2aa0a510d705094dfbfb5b15bd07a3784a4f2a6d..ec9a19f1f9a4b7868739fe193753856d1bebbacc 100644 (file)
@@ -6,59 +6,65 @@ import Shape from './Shape.js'
 
 export default class Path extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('path', node), attrs)
   }
 
   // Get array
-  array () {
+  array() {
     return this._array || (this._array = new PathArray(this.attr('d')))
   }
 
   // Clear array cache
-  clear () {
+  clear() {
     delete this._array
     return this
   }
 
   // Set height of element
-  height (height) {
-    return height == null ? this.bbox().height : this.size(this.bbox().width, height)
+  height(height) {
+    return height == null
+      ? this.bbox().height
+      : this.size(this.bbox().width, height)
   }
 
   // Move by left top corner
-  move (x, y) {
+  move(x, y) {
     return this.attr('d', this.array().move(x, y))
   }
 
   // Plot new path
-  plot (d) {
-    return (d == null)
+  plot(d) {
+    return d == null
       ? this.array()
-      : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new PathArray(d)))
+      : this.clear().attr(
+          'd',
+          typeof d === 'string' ? d : (this._array = new PathArray(d))
+        )
   }
 
   // Set element size to given width and height
-  size (width, height) {
+  size(width, height) {
     const p = proportionalSize(this, width, height)
     return this.attr('d', this.array().size(p.width, p.height))
   }
 
   // Set width of element
-  width (width) {
-    return width == null ? this.bbox().width : this.size(width, this.bbox().height)
+  width(width) {
+    return width == null
+      ? this.bbox().width
+      : this.size(width, this.bbox().height)
   }
 
   // Move by left top corner over x-axis
-  x (x) {
+  x(x) {
     return x == null ? this.bbox().x : this.move(x, this.bbox().y)
   }
 
   // Move by left top corner over y-axis
-  y (y) {
+  y(y) {
     return y == null ? this.bbox().y : this.move(this.bbox().x, y)
   }
-
 }
 
 // Define morphable array
index 18a75e8aa021029a6fafb6350497aaca79ffc130..b42a83ab2b31463ade1d22f9f711bafc3948fee9 100644 (file)
@@ -6,31 +6,31 @@ import baseFind from '../modules/core/selector.js'
 
 export default class Pattern extends Container {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('pattern', node), attrs)
   }
 
   // custom attr to handle transform
-  attr (a, b, c) {
+  attr(a, b, c) {
     if (a === 'transform') a = 'patternTransform'
     return super.attr(a, b, c)
   }
 
-  bbox () {
+  bbox() {
     return new Box()
   }
 
-  targets () {
+  targets() {
     return baseFind('svg [fill*=' + this.id() + ']')
   }
 
   // Alias string conversion to fill
-  toString () {
+  toString() {
     return this.url()
   }
 
   // Update pattern by rebuilding
-  update (block) {
+  update(block) {
     // remove content
     this.clear()
 
@@ -43,16 +43,15 @@ export default class Pattern extends Container {
   }
 
   // Return the fill id
-  url () {
+  url() {
     return 'url(#' + this.id() + ')'
   }
-
 }
 
 registerMethods({
   Container: {
     // Create pattern element in defs
-    pattern (...args) {
+    pattern(...args) {
       return this.defs().pattern(...args)
     }
   },
index 0c99aa76a01284434e46e02cb7991939c3b076c1..d64dcb35f4ac16ce52cc4d180be53f3f2d42d5ab 100644 (file)
@@ -12,7 +12,7 @@ import * as poly from '../modules/core/poly.js'
 
 export default class Polygon extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('polygon', node), attrs)
   }
 }
index e390da33bf86b845ef12f3062fb3461b21df7673..2f063f24942770eab583e87f74fe3249c8c8299c 100644 (file)
@@ -12,7 +12,7 @@ import * as poly from '../modules/core/poly.js'
 
 export default class Polyline extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('polyline', node), attrs)
   }
 }
index 0ed85fc6226e959b01c224eedd91863065af2159..749cf6dc97ed11a06b128061860db0635e0acbc8 100644 (file)
@@ -10,7 +10,7 @@ import Shape from './Shape.js'
 
 export default class Rect extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('rect', node), attrs)
   }
 }
index d29090ce09192b5bd9d8a3ae184118965f39705d..193256ef0c7be22980eb9fc2eaa36913c2290a37 100644 (file)
@@ -4,12 +4,12 @@ import SVGNumber from '../types/SVGNumber.js'
 import { registerMethods } from '../utils/methods.js'
 
 export default class Stop extends Element {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('stop', node), attrs)
   }
 
   // add color stops
-  update (o) {
+  update(o) {
     if (typeof o === 'number' || o instanceof SVGNumber) {
       o = {
         offset: arguments[0],
index f7c3c57cd93b3be8f9051dbe1098187a977c5251..fc1a27eed34c839c6a73045b90873c410b901e85 100644 (file)
@@ -3,7 +3,7 @@ import { registerMethods } from '../utils/methods.js'
 import { unCamelCase } from '../utils/utils.js'
 import Element from './Element.js'
 
-function cssRule (selector, rule) {
+function cssRule(selector, rule) {
   if (!selector) return ''
   if (!rule) return selector
 
@@ -19,16 +19,16 @@ function cssRule (selector, rule) {
 }
 
 export default class Style extends Element {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('style', node), attrs)
   }
 
-  addText (w = '') {
+  addText(w = '') {
     this.node.textContent += w
     return this
   }
 
-  font (name, src, params = {}) {
+  font(name, src, params = {}) {
     return this.rule('@font-face', {
       fontFamily: name,
       src: src,
@@ -36,16 +36,16 @@ export default class Style extends Element {
     })
   }
 
-  rule (selector, obj) {
+  rule(selector, obj) {
     return this.addText(cssRule(selector, obj))
   }
 }
 
 registerMethods('Dom', {
-  style (selector, obj) {
+  style(selector, obj) {
     return this.put(new Style()).rule(selector, obj)
   },
-  fontface  (name, src, params) {
+  fontface(name, src, params) {
     return this.put(new Style()).font(name, src, params)
   }
 })
index acddf3461f4b215767a77b5216b65c496e410bf5..7b36daaf8be25f5c6cac441e3c75644a4197cacb 100644 (file)
@@ -11,34 +11,35 @@ import Defs from './Defs.js'
 import { globals } from '../utils/window.js'
 
 export default class Svg extends Container {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('svg', node), attrs)
     this.namespace()
   }
 
   // Creates and returns defs element
-  defs () {
+  defs() {
     if (!this.isRoot()) return this.root().defs()
 
-    return adopt(this.node.querySelector('defs'))
-      || this.put(new Defs())
+    return adopt(this.node.querySelector('defs')) || this.put(new Defs())
   }
 
-  isRoot () {
-    return !this.node.parentNode
-      || (!(this.node.parentNode instanceof globals.window.SVGElement) && this.node.parentNode.nodeName !== '#document-fragment')
+  isRoot() {
+    return (
+      !this.node.parentNode ||
+      (!(this.node.parentNode instanceof globals.window.SVGElement) &&
+        this.node.parentNode.nodeName !== '#document-fragment')
+    )
   }
 
   // Add namespaces
-  namespace () {
+  namespace() {
     if (!this.isRoot()) return this.root().namespace()
-    return this
-      .attr({ xmlns: svg, version: '1.1' })
+    return this.attr({ xmlns: svg, version: '1.1' })
       .attr('xmlns:xlink', xlink, xmlns)
       .attr('xmlns:svgjs', svgjs, xmlns)
   }
 
-  removeNamespace () {
+  removeNamespace() {
     return this.attr({ xmlns: null, version: null })
       .attr('xmlns:xlink', null, xmlns)
       .attr('xmlns:svgjs', null, xmlns)
@@ -46,11 +47,10 @@ export default class Svg extends Container {
 
   // Check if this is a root svg
   // If not, call root() from this element
-  root () {
+  root() {
     if (this.isRoot()) return this
     return super.root()
   }
-
 }
 
 registerMethods({
index d2a98acb7ad9a760756411bb92467eddc79ad312..28ad20678920536b60d416e53bd3928bde2ff386 100644 (file)
@@ -4,7 +4,7 @@ import Container from './Container.js'
 
 export default class Symbol extends Container {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('symbol', node), attrs)
   }
 }
index f716f837b37251bf32b67c8ef71dfdd7928df7a0..39371f6688d7dfc7674796875d45c9d0b246da05 100644 (file)
@@ -13,7 +13,7 @@ import * as textable from '../modules/core/textable.js'
 
 export default class Text extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('text', node), attrs)
 
     this.dom.leading = new SVGNumber(1.3) // store leading value for rebuilding
@@ -22,7 +22,7 @@ export default class Text extends Shape {
   }
 
   // Set / get leading
-  leading (value) {
+  leading(value) {
     // act as getter
     if (value == null) {
       return this.dom.leading
@@ -35,7 +35,7 @@ export default class Text extends Shape {
   }
 
   // Rebuild appearance type
-  rebuild (rebuild) {
+  rebuild(rebuild) {
     // store new rebuild flag if given
     if (typeof rebuild === 'boolean') {
       this._rebuild = rebuild
@@ -48,7 +48,8 @@ export default class Text extends Shape {
       const leading = this.dom.leading
 
       this.each(function (i) {
-        const fontSize = globals.window.getComputedStyle(this.node)
+        const fontSize = globals.window
+          .getComputedStyle(this.node)
           .getPropertyValue('font-size')
 
         const dy = leading * new SVGNumber(fontSize)
@@ -72,14 +73,14 @@ export default class Text extends Shape {
   }
 
   // overwrite method from parent to set data properly
-  setData (o) {
+  setData(o) {
     this.dom = o
     this.dom.leading = new SVGNumber(o.leading || 1.3)
     return this
   }
 
   // Set the text content
-  text (text) {
+  text(text) {
     // act as getter
     if (text === undefined) {
       const children = this.node.childNodes
@@ -94,7 +95,11 @@ export default class Text extends Shape {
         }
 
         // add newline if its not the first child and newLined is set to true
-        if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) {
+        if (
+          i !== firstLine &&
+          children[i].nodeType !== 3 &&
+          adopt(children[i]).dom.newLined === true
+        ) {
           text += '\n'
         }
 
@@ -124,7 +129,6 @@ export default class Text extends Shape {
     // disable build mode and rebuild lines
     return this.build(false).rebuild()
   }
-
 }
 
 extend(Text, textable)
index 2af73e7e7630dcd5ef1ff2df83a9c9b70ab0db9d..89c6c426f8773a07b1e7aadd348d45c3c7f1bf97 100644 (file)
@@ -8,19 +8,19 @@ import baseFind from '../modules/core/selector.js'
 
 export default class TextPath extends Text {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('textPath', node), attrs)
   }
 
   // return the array of the path track element
-  array () {
+  array() {
     const track = this.track()
 
     return track ? track.array() : null
   }
 
   // Plot path if any
-  plot (d) {
+  plot(d) {
     const track = this.track()
     let pathArray = null
 
@@ -28,11 +28,11 @@ export default class TextPath extends Text {
       pathArray = track.plot(d)
     }
 
-    return (d == null) ? pathArray : this
+    return d == null ? pathArray : this
   }
 
   // Get the path element
-  track () {
+  track() {
     return this.reference('href')
   }
 }
@@ -75,7 +75,7 @@ registerMethods({
     }),
 
     // Get the textPath children
-    textPath () {
+    textPath() {
       return this.findOne('textPath')
     }
   },
@@ -91,7 +91,7 @@ registerMethods({
       return text.path(this)
     }),
 
-    targets () {
+    targets() {
       return baseFind('svg textPath').filter((node) => {
         return (node.attr('href') || '').includes(this.id())
       })
index 73cd52d646d76debce2c5aaba13bfd74b1be796c..12b49f89257090c545e7a8ef35ad31740f505659 100644 (file)
@@ -13,23 +13,23 @@ import * as textable from '../modules/core/textable.js'
 
 export default class Tspan extends Shape {
   // Initialize node
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('tspan', node), attrs)
     this._build = false // disable build mode for adding multiple lines
   }
 
   // Shortcut dx
-  dx (dx) {
+  dx(dx) {
     return this.attr('dx', dx)
   }
 
   // Shortcut dy
-  dy (dy) {
+  dy(dy) {
     return this.attr('dy', dy)
   }
 
   // Create new line
-  newLine () {
+  newLine() {
     // mark new line
     this.dom.newLined = true
 
@@ -43,7 +43,8 @@ export default class Tspan extends Shape {
 
     const i = text.index(this)
 
-    const fontSize = globals.window.getComputedStyle(this.node)
+    const fontSize = globals.window
+      .getComputedStyle(this.node)
       .getPropertyValue('font-size')
     const dy = text.dom.leading * new SVGNumber(fontSize)
 
@@ -52,8 +53,9 @@ export default class Tspan extends Shape {
   }
 
   // Set text content
-  text (text) {
-    if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '')
+  text(text) {
+    if (text == null)
+      return this.node.textContent + (this.dom.newLined ? '\n' : '')
 
     if (typeof text === 'function') {
       this.clear().build(true)
@@ -65,7 +67,6 @@ export default class Tspan extends Shape {
 
     return this
   }
-
 }
 
 extend(Tspan, textable)
index 30d943631b21662bd43be33be4d37bb3e34ac615..e92dd480614eac31a091712d8295469eebb7899c 100644 (file)
@@ -4,12 +4,12 @@ import { xlink } from '../modules/core/namespaces.js'
 import Shape from './Shape.js'
 
 export default class Use extends Shape {
-  constructor (node, attrs = node) {
+  constructor(node, attrs = node) {
     super(nodeOrNew('use', node), attrs)
   }
 
   // Use element as a reference
-  use (element, file) {
+  use(element, file) {
     // Set lined element
     return this.attr('href', (file || '') + '#' + element, xlink)
   }
index 1ef1f27b6d39a5ff60488fe8e958a1fcecd56bc8..5b652c448963b1b22c4fbe048bfef80aac5f1ed0 100644 (file)
@@ -77,7 +77,13 @@ export {
 
 /* Animation Modules */
 export { default as Animator } from './animation/Animator.js'
-export { Controller, Ease, PID, Spring, easing } from './animation/Controller.js'
+export {
+  Controller,
+  Ease,
+  PID,
+  Spring,
+  easing
+} from './animation/Controller.js'
 export { default as Queue } from './animation/Queue.js'
 export { default as Runner } from './animation/Runner.js'
 export { default as Timeline } from './animation/Timeline.js'
@@ -126,43 +132,24 @@ export { default as TextPath } from './elements/TextPath.js'
 export { default as Tspan } from './elements/Tspan.js'
 export { default as Use } from './elements/Use.js'
 
-extend([
-  Svg,
-  Symbol,
-  Image,
-  Pattern,
-  Marker
-], getMethodsFor('viewbox'))
-
-extend([
-  Line,
-  Polyline,
-  Polygon,
-  Path
-], getMethodsFor('marker'))
+extend([Svg, Symbol, Image, Pattern, Marker], getMethodsFor('viewbox'))
+
+extend([Line, Polyline, Polygon, Path], getMethodsFor('marker'))
 
 extend(Text, getMethodsFor('Text'))
 extend(Path, getMethodsFor('Path'))
 
 extend(Defs, getMethodsFor('Defs'))
 
-extend([
-  Text,
-  Tspan
-], getMethodsFor('Tspan'))
+extend([Text, Tspan], getMethodsFor('Tspan'))
 
-extend([
-  Rect,
-  Ellipse,
-  Gradient,
-  Runner
-], getMethodsFor('radius'))
+extend([Rect, Ellipse, Gradient, Runner], getMethodsFor('radius'))
 
 extend(EventTarget, getMethodsFor('EventTarget'))
 extend(Dom, getMethodsFor('Dom'))
 extend(Element, getMethodsFor('Element'))
 extend(Shape, getMethodsFor('Shape'))
-extend([ Container, Fragment ], getMethodsFor('Container'))
+extend([Container, Fragment], getMethodsFor('Container'))
 extend(Gradient, getMethodsFor('Gradient'))
 
 extend(Runner, getMethodsFor('Runner'))
index d54b235020a5a5a49b08c79bb4e1d7c3577c2fa9..a96f7064ac08b057e62fbb3319a4eaf7a8d692b2 100644 (file)
@@ -5,12 +5,12 @@ import SVGArray from '../../types/SVGArray.js'
 import SVGNumber from '../../types/SVGNumber.js'
 
 const hooks = []
-export function registerAttrHook (fn) {
+export function registerAttrHook(fn) {
   hooks.push(fn)
 }
 
 // Set svg element attribute
-export default function attr (attr, val, ns) {
+export default function attr(attr, val, ns) {
   // act as full getter
   if (attr == null) {
     // get an object of attributes
@@ -42,8 +42,8 @@ export default function attr (attr, val, ns) {
     return val == null
       ? defaults[attr]
       : isNumber.test(val)
-        ? parseFloat(val)
-        : val
+      ? parseFloat(val)
+      : val
   } else {
     // Loop through hooks and execute them to convert value
     val = hooks.reduce((_val, hook) => {
index a03e29b0c3fbbc4a0f29ec4973f211b94e361364..3c3a65fa99a06fb7c1324967196f2ba276778d59 100644 (file)
@@ -1,48 +1,42 @@
 import SVGNumber from '../../types/SVGNumber.js'
 
 // Radius x value
-export function rx (rx) {
+export function rx(rx) {
   return this.attr('rx', rx)
 }
 
 // Radius y value
-export function ry (ry) {
+export function ry(ry) {
   return this.attr('ry', ry)
 }
 
 // Move over x-axis
-export function x (x) {
-  return x == null
-    ? this.cx() - this.rx()
-    : this.cx(x + this.rx())
+export function x(x) {
+  return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())
 }
 
 // Move over y-axis
-export function y (y) {
-  return y == null
-    ? this.cy() - this.ry()
-    : this.cy(y + this.ry())
+export function y(y) {
+  return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())
 }
 
 // Move by center over x-axis
-export function cx (x) {
+export function cx(x) {
   return this.attr('cx', x)
 }
 
 // Move by center over y-axis
-export function cy (y) {
+export function cy(y) {
   return this.attr('cy', y)
 }
 
 // Set width of element
-export function width (width) {
-  return width == null
-    ? this.rx() * 2
-    : this.rx(new SVGNumber(width).divide(2))
+export function width(width) {
+  return width == null ? this.rx() * 2 : this.rx(new SVGNumber(width).divide(2))
 }
 
 // Set height of element
-export function height (height) {
+export function height(height) {
   return height == null
     ? this.ry() * 2
     : this.ry(new SVGNumber(height).divide(2))
index 908bb278f3c0181a0cadc505f0750b797d037467..21139e8f1f47c12fcbeda31dc5cf270f9e9a0b89 100644 (file)
@@ -2,9 +2,8 @@ import Matrix from '../../types/Matrix.js'
 import Point from '../../types/Point.js'
 import { proportionalSize } from '../../utils/utils.js'
 
-export function dmove (dx, dy) {
-  this.children().forEach((child, i) => {
-
+export function dmove(dx, dy) {
+  this.children().forEach((child) => {
     let bbox
 
     // We have to wrap this for elements that dont have a bbox
@@ -30,32 +29,32 @@ export function dmove (dx, dy) {
   return this
 }
 
-export function dx (dx) {
+export function dx(dx) {
   return this.dmove(dx, 0)
 }
 
-export function dy (dy) {
+export function dy(dy) {
   return this.dmove(0, dy)
 }
 
-export function height (height, box = this.bbox()) {
+export function height(height, box = this.bbox()) {
   if (height == null) return box.height
   return this.size(box.width, height, box)
 }
 
-export function move (x = 0, y = 0, box = this.bbox()) {
+export function move(x = 0, y = 0, box = this.bbox()) {
   const dx = x - box.x
   const dy = y - box.y
 
   return this.dmove(dx, dy)
 }
 
-export function size (width, height, box = this.bbox()) {
+export function size(width, height, box = this.bbox()) {
   const p = proportionalSize(this, width, height, box)
   const scaleX = p.width / box.width
   const scaleY = p.height / box.height
 
-  this.children().forEach((child, i) => {
+  this.children().forEach((child) => {
     const o = new Point(box).transform(new Matrix(child).inverse())
     child.scale(scaleX, scaleY, o.x, o.y)
   })
@@ -63,17 +62,17 @@ export function size (width, height, box = this.bbox()) {
   return this
 }
 
-export function width (width, box = this.bbox()) {
+export function width(width, box = this.bbox()) {
   if (width == null) return box.width
   return this.size(width, box.height, box)
 }
 
-export function x (x, box = this.bbox()) {
+export function x(x, box = this.bbox()) {
   if (x == null) return box.x
   return this.move(x, box.y, box)
 }
 
-export function y (y, box = this.bbox()) {
+export function y(y, box = this.bbox()) {
   if (y == null) return box.y
   return this.move(box.x, y, box)
 }
index e8e65b60e6b7d92a75cc2a3bf601c008e201e265..2c346a7681aa4cf4d03ec15ea10a7283477044f7 100644 (file)
@@ -1,5 +1,4 @@
-
-export function noop () {}
+export function noop() {}
 
 // Default animation values
 export const timeline = {
@@ -10,7 +9,6 @@ export const timeline = {
 
 // Default attribute values
 export const attrs = {
-
   // fill and stroke
   'fill-opacity': 1,
   'stroke-opacity': 1,
index 3594fc45c10418950342aa9fb6d49505603296b2..8e0871643e3e3bcae307f328a6216412a3a3a2c9 100644 (file)
@@ -5,7 +5,7 @@ import { globals } from '../../utils/window.js'
 let listenerId = 0
 export const windowEvents = {}
 
-export function getEvents (instance) {
+export function getEvents(instance) {
   let n = instance.getEventHolder()
 
   // We dont want to save events in global space
@@ -14,18 +14,18 @@ export function getEvents (instance) {
   return n.events
 }
 
-export function getEventTarget (instance) {
+export function getEventTarget(instance) {
   return instance.getEventTarget()
 }
 
-export function clearEvents (instance) {
+export function clearEvents(instance) {
   let n = instance.getEventHolder()
   if (n === globals.window) n = windowEvents
   if (n.events) n.events = {}
 }
 
 // Add event binder in the SVG namespace
-export function on (node, events, listener, binding, options) {
+export function on(node, events, listener, binding, options) {
   const l = listener.bind(binding || node)
   const instance = makeInstance(node)
   const bag = getEvents(instance)
@@ -56,7 +56,7 @@ export function on (node, events, listener, binding, options) {
 }
 
 // Add event unbinder in the SVG namespace
-export function off (node, events, listener, options) {
+export function off(node, events, listener, options) {
   const instance = makeInstance(node)
   const bag = getEvents(instance)
   const n = getEventTarget(instance)
@@ -79,7 +79,11 @@ export function off (node, events, listener, options) {
       // remove listener reference
       if (bag[ev] && bag[ev][ns || '*']) {
         // removeListener
-        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)
+        n.removeEventListener(
+          ev,
+          bag[ev][ns || '*'][listener],
+          options || false
+        )
 
         delete bag[ev][ns || '*'][listener]
       }
@@ -87,7 +91,7 @@ export function off (node, events, listener, options) {
       // remove all listeners for a namespaced event
       if (bag[ev] && bag[ev][ns]) {
         for (l in bag[ev][ns]) {
-          off(n, [ ev, ns ].join('.'), l)
+          off(n, [ev, ns].join('.'), l)
         }
 
         delete bag[ev][ns]
@@ -97,7 +101,7 @@ export function off (node, events, listener, options) {
       for (event in bag) {
         for (namespace in bag[event]) {
           if (ns === namespace) {
-            off(n, [ event, ns ].join('.'))
+            off(n, [event, ns].join('.'))
           }
         }
       }
@@ -105,7 +109,7 @@ export function off (node, events, listener, options) {
       // remove all listeners for the event
       if (bag[ev]) {
         for (namespace in bag[ev]) {
-          off(n, [ ev, namespace ].join('.'))
+          off(n, [ev, namespace].join('.'))
         }
 
         delete bag[ev]
@@ -121,14 +125,18 @@ export function off (node, events, listener, options) {
   })
 }
 
-export function dispatch (node, event, data, options) {
+export function dispatch(node, event, data, options) {
   const n = getEventTarget(node)
 
   // Dispatch event
   if (event instanceof globals.window.Event) {
     n.dispatchEvent(event)
   } else {
-    event = new globals.window.CustomEvent(event, { detail: data, cancelable: true, ...options })
+    event = new globals.window.CustomEvent(event, {
+      detail: data,
+      cancelable: true,
+      ...options
+    })
     n.dispatchEvent(event)
   }
   return event
index 6c744e43c96186e5b391157d7d0f6977136fc814..cd0a512dc4107dca3df9e9b1858c10290cd6a9bc 100644 (file)
@@ -1,12 +1,12 @@
 import SVGNumber from '../../types/SVGNumber.js'
 
-export function from (x, y) {
+export function from(x, y) {
   return (this._element || this).type === 'radialGradient'
     ? this.attr({ fx: new SVGNumber(x), fy: new SVGNumber(y) })
     : this.attr({ x1: new SVGNumber(x), y1: new SVGNumber(y) })
 }
 
-export function to (x, y) {
+export function to(x, y) {
   return (this._element || this).type === 'radialGradient'
     ? this.attr({ cx: new SVGNumber(x), cy: new SVGNumber(y) })
     : this.attr({ x2: new SVGNumber(x), y2: new SVGNumber(y) })
index 4f92657ffa42cf95df61e62c707a385d9a8d2110..fc48c3b3360ef0ab141708508962e27824b4548f 100644 (file)
@@ -1,7 +1,7 @@
 import { globals } from '../../utils/window.js'
 import { makeInstance } from '../../utils/adopter.js'
 
-export default function parser () {
+export default function parser() {
   // Reuse cached element if possible
   if (!parser.nodes) {
     const svg = makeInstance().size(2, 0)
index 540e5f8815346784aa27c28a60bf7df83d496401..0d4ef7a6c08b1eaa3be09bfe6e9d6bf82c84957e 100644 (file)
@@ -3,23 +3,23 @@ import PointArray from '../../types/PointArray.js'
 export const MorphArray = PointArray
 
 // Move by left top corner over x-axis
-export function x (x) {
+export function x(x) {
   return x == null ? this.bbox().x : this.move(x, this.bbox().y)
 }
 
 // Move by left top corner over y-axis
-export function y (y) {
+export function y(y) {
   return y == null ? this.bbox().y : this.move(this.bbox().x, y)
 }
 
 // Set width of element
-export function width (width) {
+export function width(width) {
   const b = this.bbox()
   return width == null ? b.width : this.size(width, b.height)
 }
 
 // Set height of element
-export function height (height) {
+export function height(height) {
   const b = this.bbox()
   return height == null ? b.height : this.size(b.width, height)
 }
index d4220280671cd906463d25ae5bb7993fd855b54d..0640735a109f74d869ccfbac091cc6e1cf575204 100644 (file)
@@ -2,32 +2,33 @@ import { proportionalSize } from '../../utils/utils.js'
 import PointArray from '../../types/PointArray.js'
 
 // Get array
-export function array () {
+export function array() {
   return this._array || (this._array = new PointArray(this.attr('points')))
 }
 
 // Clear array cache
-export function clear () {
+export function clear() {
   delete this._array
   return this
 }
 
 // Move by left top corner
-export function move (x, y) {
+export function move(x, y) {
   return this.attr('points', this.array().move(x, y))
 }
 
 // Plot new path
-export function plot (p) {
-  return (p == null)
+export function plot(p) {
+  return p == null
     ? this.array()
-    : this.clear().attr('points', typeof p === 'string'
-      ? p
-      : (this._array = new PointArray(p)))
+    : this.clear().attr(
+        'points',
+        typeof p === 'string' ? p : (this._array = new PointArray(p))
+      )
 }
 
 // Set element size to given width and height
-export function size (width, height) {
+export function size(width, height) {
   const p = proportionalSize(this, width, height)
   return this.attr('points', this.array().size(p.width, p.height))
 }
index a18c69216551cae9312aeeca9161767977bf5af0..03d1fa3f55e4568dbda8be814cb94319a0371876 100644 (file)
@@ -1,5 +1,6 @@
 // Parse unit value
-export const numberAndUnit = /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i
+export const numberAndUnit =
+  /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i
 
 // Parse hex value
 export const hex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i
index 1667d4d35014236085c4ee127454ab8032dc43ec..7dec4e44d3dc335c19e30d27a0b31b64d893f558 100644 (file)
@@ -3,17 +3,19 @@ import { globals } from '../../utils/window.js'
 import { map } from '../../utils/utils.js'
 import List from '../../types/List.js'
 
-export default function baseFind (query, parent) {
-  return new List(map((parent || globals.document).querySelectorAll(query), function (node) {
-    return adopt(node)
-  }))
+export default function baseFind(query, parent) {
+  return new List(
+    map((parent || globals.document).querySelectorAll(query), function (node) {
+      return adopt(node)
+    })
+  )
 }
 
 // Scoped find method
-export function find (query) {
+export function find(query) {
   return baseFind(query, this.node)
 }
 
-export function findOne (query) {
+export function findOne(query) {
   return adopt(this.node.querySelector(query))
 }
index 28b13cb00b16d8b1446239f03d3c4cbb040c4957..44a1ee5814d534e6b1b7a50f2160f44568c0b86e 100644 (file)
@@ -1,7 +1,7 @@
 import { globals } from '../../utils/window.js'
 
 // Create plain text node
-export function plain (text) {
+export function plain(text) {
   // clear if build mode is disabled
   if (this._build === false) {
     this.clear()
@@ -14,14 +14,14 @@ export function plain (text) {
 }
 
 // Get length of text element
-export function length () {
+export function length() {
   return this.node.getComputedTextLength()
 }
 
 // Move over x-axis
 // Text is moved by its bounding box
 // text-anchor does NOT matter
-export function x (x, box = this.bbox()) {
+export function x(x, box = this.bbox()) {
   if (x == null) {
     return box.x
   }
@@ -30,7 +30,7 @@ export function x (x, box = this.bbox()) {
 }
 
 // Move over y-axis
-export function y (y, box = this.bbox()) {
+export function y(y, box = this.bbox()) {
   if (y == null) {
     return box.y
   }
@@ -38,12 +38,12 @@ export function y (y, box = this.bbox()) {
   return this.attr('y', this.attr('y') + y - box.y)
 }
 
-export function move (x, y, box = this.bbox()) {
+export function move(x, y, box = this.bbox()) {
   return this.x(x, box).y(y, box)
 }
 
 // Move center over x-axis
-export function cx (x, box = this.bbox()) {
+export function cx(x, box = this.bbox()) {
   if (x == null) {
     return box.cx
   }
@@ -52,7 +52,7 @@ export function cx (x, box = this.bbox()) {
 }
 
 // Move center over y-axis
-export function cy (y, box = this.bbox()) {
+export function cy(y, box = this.bbox()) {
   if (y == null) {
     return box.cy
   }
@@ -60,24 +60,24 @@ export function cy (y, box = this.bbox()) {
   return this.attr('y', this.attr('y') + y - box.cy)
 }
 
-export function center (x, y, box = this.bbox()) {
+export function center(x, y, box = this.bbox()) {
   return this.cx(x, box).cy(y, box)
 }
 
-export function ax (x) {
+export function ax(x) {
   return this.attr('x', x)
 }
 
-export function ay (y) {
+export function ay(y) {
   return this.attr('y', y)
 }
 
-export function amove (x, y) {
+export function amove(x, y) {
   return this.ax(x).ay(y)
 }
 
 // Enable / disable build mode
-export function build (build) {
+export function build(build) {
   this._build = !!build
   return this
 }
index 9aaeef1c52102242028318d5ea3ad9b176f0f400..292cd79945d7dd4198b3b2d53120feb656e00cde 100644 (file)
@@ -2,27 +2,27 @@ import { makeInstance } from '../../utils/adopter.js'
 import { registerMethods } from '../../utils/methods.js'
 
 // Get all siblings, including myself
-export function siblings () {
+export function siblings() {
   return this.parent().children()
 }
 
 // Get the current position siblings
-export function position () {
+export function position() {
   return this.parent().index(this)
 }
 
 // Get the next element (will return null if there is none)
-export function next () {
+export function next() {
   return this.siblings()[this.position() + 1]
 }
 
 // Get the next element (will return null if there is none)
-export function prev () {
+export function prev() {
   return this.siblings()[this.position() - 1]
 }
 
 // Send given element one step forward
-export function forward () {
+export function forward() {
   const i = this.position()
   const p = this.parent()
 
@@ -33,7 +33,7 @@ export function forward () {
 }
 
 // Send given element one step backward
-export function backward () {
+export function backward() {
   const i = this.position()
   const p = this.parent()
 
@@ -43,7 +43,7 @@ export function backward () {
 }
 
 // Send given element all the way to the front
-export function front () {
+export function front() {
   const p = this.parent()
 
   // Move node forward
@@ -53,7 +53,7 @@ export function front () {
 }
 
 // Send given element all the way to the back
-export function back () {
+export function back() {
   const p = this.parent()
 
   // Move node back
@@ -63,7 +63,7 @@ export function back () {
 }
 
 // Inserts a given element before the targeted element
-export function before (element) {
+export function before(element) {
   element = makeInstance(element)
   element.remove()
 
@@ -75,7 +75,7 @@ export function before (element) {
 }
 
 // Inserts a given element after the targeted element
-export function after (element) {
+export function after(element) {
   element = makeInstance(element)
   element.remove()
 
@@ -86,13 +86,13 @@ export function after (element) {
   return this
 }
 
-export function insertBefore (element) {
+export function insertBefore(element) {
   element = makeInstance(element)
   element.before(this)
   return this
 }
 
-export function insertAfter (element) {
+export function insertAfter(element) {
   element = makeInstance(element)
   element.after(this)
   return this
index 4e544bea81886f25d36dd891b01b3a0c8a0392f0..3141644891cd85c9c2f1d7a393af7f39b3ed3237 100644 (file)
@@ -2,18 +2,18 @@ import { delimiter } from '../core/regex.js'
 import { registerMethods } from '../../utils/methods.js'
 
 // Return array of classes on the node
-export function classes () {
+export function classes() {
   const attr = this.attr('class')
   return attr == null ? [] : attr.trim().split(delimiter)
 }
 
 // Return true if class exists on the node, false otherwise
-export function hasClass (name) {
+export function hasClass(name) {
   return this.classes().indexOf(name) !== -1
 }
 
 // Add class to the node
-export function addClass (name) {
+export function addClass(name) {
   if (!this.hasClass(name)) {
     const array = this.classes()
     array.push(name)
@@ -24,21 +24,30 @@ export function addClass (name) {
 }
 
 // Remove class from the node
-export function removeClass (name) {
+export function removeClass(name) {
   if (this.hasClass(name)) {
-    this.attr('class', this.classes().filter(function (c) {
-      return c !== name
-    }).join(' '))
+    this.attr(
+      'class',
+      this.classes()
+        .filter(function (c) {
+          return c !== name
+        })
+        .join(' ')
+    )
   }
 
   return this
 }
 
 // Toggle the presence of a class on the node
-export function toggleClass (name) {
+export function toggleClass(name) {
   return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)
 }
 
 registerMethods('Dom', {
-  classes, hasClass, addClass, removeClass, toggleClass
+  classes,
+  hasClass,
+  addClass,
+  removeClass,
+  toggleClass
 })
index ee9386991cbb855c45831fc8ea48fa32ec7fb436..92f8c21723cc1019772fc8db6437436690030cec 100644 (file)
@@ -3,11 +3,12 @@ import { isBlank } from '../core/regex.js'
 import { registerMethods } from '../../utils/methods.js'
 
 // Dynamic style generator
-export function css (style, val) {
+export function css(style, val) {
   const ret = {}
   if (arguments.length === 0) {
     // get full style as object
-    this.node.style.cssText.split(/\s*;\s*/)
+    this.node.style.cssText
+      .split(/\s*;\s*/)
       .filter(function (el) {
         return !!el.length
       })
@@ -37,36 +38,39 @@ export function css (style, val) {
     if (typeof style === 'object') {
       for (const name in style) {
         // set empty string if null/undefined/'' was given
-        this.node.style[camelCase(name)]
-          = (style[name] == null || isBlank.test(style[name])) ? '' : style[name]
+        this.node.style[camelCase(name)] =
+          style[name] == null || isBlank.test(style[name]) ? '' : style[name]
       }
     }
   }
 
   // set style for property
   if (arguments.length === 2) {
-    this.node.style[camelCase(style)]
-      = (val == null || isBlank.test(val)) ? '' : val
+    this.node.style[camelCase(style)] =
+      val == null || isBlank.test(val) ? '' : val
   }
 
   return this
 }
 
 // Show element
-export function show () {
+export function show() {
   return this.css('display', '')
 }
 
 // Hide element
-export function hide () {
+export function hide() {
   return this.css('display', 'none')
 }
 
 // Is element visible?
-export function visible () {
+export function visible() {
   return this.css('display') !== 'none'
 }
 
 registerMethods('Dom', {
-  css, show, hide, visible
+  css,
+  show,
+  hide,
+  visible
 })
index 00bb8ea8f35cb8d87dc3c8755d8c0e2293d9e51f..965504822fb08d1405a715842bca333c905c5f88 100644 (file)
@@ -2,10 +2,18 @@ import { registerMethods } from '../../utils/methods.js'
 import { filter, map } from '../../utils/utils.js'
 
 // Store data values on svg nodes
-export function data (a, v, r) {
+export function data(a, v, r) {
   if (a == null) {
     // get an object of attributes
-    return this.data(map(filter(this.node.attributes, (el) => el.nodeName.indexOf('data-') === 0), (el) => el.nodeName.slice(5)))
+    return this.data(
+      map(
+        filter(
+          this.node.attributes,
+          (el) => el.nodeName.indexOf('data-') === 0
+        ),
+        (el) => el.nodeName.slice(5)
+      )
+    )
   } else if (a instanceof Array) {
     const data = {}
     for (const key of a) {
@@ -23,12 +31,13 @@ export function data (a, v, r) {
       return this.attr('data-' + a)
     }
   } else {
-    this.attr('data-' + a,
+    this.attr(
+      'data-' + a,
       v === null
         ? null
         : r === true || typeof v === 'string' || typeof v === 'number'
-          ? v
-          : JSON.stringify(v)
+        ? v
+        : JSON.stringify(v)
     )
   }
 
index 459dcf1b4d6ce16f6e4deee02beb82b1129dca6d..31058c3a5d21d10a8c5846edeec6d7157edd4d47 100644 (file)
@@ -1,7 +1,7 @@
 import { registerMethods } from '../../utils/methods.js'
 
 // Remember arbitrary data
-export function remember (k, v) {
+export function remember(k, v) {
   // remember every item in an object individually
   if (typeof arguments[0] === 'object') {
     for (const key in k) {
@@ -19,7 +19,7 @@ export function remember (k, v) {
 }
 
 // Erase a given memory
-export function forget () {
+export function forget() {
   if (arguments.length === 0) {
     this._memory = {}
   } else {
@@ -33,7 +33,7 @@ export function forget () {
 // This triggers creation of a new hidden class which is not performant
 // However, this function is not rarely used so it will not happen frequently
 // Return local memory object
-export function memory () {
+export function memory() {
   return (this._memory = this._memory || {})
 }
 
index d4c3da5ae2ca38e4d16dc20a8ff978083b351eec..aa5fb8273c4fd509544405c98a87d5170f034564 100644 (file)
@@ -7,15 +7,24 @@ import SVGNumber from '../../types/SVGNumber.js'
 
 // Define list of available attributes for stroke and fill
 const sugar = {
-  stroke: [ 'color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset' ],
-  fill: [ 'color', 'opacity', 'rule' ],
+  stroke: [
+    'color',
+    'width',
+    'opacity',
+    'linecap',
+    'linejoin',
+    'miterlimit',
+    'dasharray',
+    'dashoffset'
+  ],
+  fill: ['color', 'opacity', 'rule'],
   prefix: function (t, a) {
     return a === 'color' ? t : t + '-' + a
   }
 }
 
 // Add sugar for fill and stroke
-;[ 'fill', 'stroke' ].forEach(function (m) {
+;['fill', 'stroke'].forEach(function (m) {
   const extension = {}
   let i
 
@@ -23,7 +32,12 @@ const sugar = {
     if (typeof o === 'undefined') {
       return this.attr(m)
     }
-    if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || (o instanceof Element)) {
+    if (
+      typeof o === 'string' ||
+      o instanceof Color ||
+      Color.isRgb(o) ||
+      o instanceof Element
+    ) {
       this.attr(m, o)
     } else {
       // set all attributes from sugar.fill and sugar.stroke list
@@ -37,10 +51,10 @@ const sugar = {
     return this
   }
 
-  registerMethods([ 'Element', 'Runner' ], extension)
+  registerMethods(['Element', 'Runner'], extension)
 })
 
-registerMethods([ 'Element', 'Runner' ], {
+registerMethods(['Element', 'Runner'], {
   // Let the user set the matrix directly
   matrix: function (mat, b, c, d, e, f) {
     // Act as a getter
@@ -61,7 +75,7 @@ registerMethods([ 'Element', 'Runner' ], {
   skew: function (x, y, cx, cy) {
     return arguments.length === 1 || arguments.length === 3
       ? this.transform({ skew: x, ox: y, oy: cx }, true)
-      : this.transform({ skew: [ x, y ], ox: cx, oy: cy }, true)
+      : this.transform({ skew: [x, y], ox: cx, oy: cy }, true)
   },
 
   shear: function (lam, cx, cy) {
@@ -72,17 +86,17 @@ registerMethods([ 'Element', 'Runner' ], {
   scale: function (x, y, cx, cy) {
     return arguments.length === 1 || arguments.length === 3
       ? this.transform({ scale: x, ox: y, oy: cx }, true)
-      : this.transform({ scale: [ x, y ], ox: cx, oy: cy }, true)
+      : this.transform({ scale: [x, y], ox: cx, oy: cy }, true)
   },
 
   // Map translate to transform
   translate: function (x, y) {
-    return this.transform({ translate: [ x, y ] }, true)
+    return this.transform({ translate: [x, y] }, true)
   },
 
   // Map relative translations to transform
   relative: function (x, y) {
-    return this.transform({ relative: [ x, y ] }, true)
+    return this.transform({ relative: [x, y] }, true)
   },
 
   // Map flip to transform
@@ -122,7 +136,7 @@ registerMethods('Path', {
   }
 })
 
-registerMethods([ 'Element', 'Runner' ], {
+registerMethods(['Element', 'Runner'], {
   // Set font
   font: function (a, v) {
     if (typeof a === 'object') {
@@ -133,15 +147,21 @@ registerMethods([ 'Element', 'Runner' ], {
     return a === 'leading'
       ? this.leading(v)
       : a === 'anchor'
-        ? this.attr('text-anchor', v)
-        : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style'
-          ? this.attr('font-' + a, v)
-          : this.attr(a, v)
+      ? this.attr('text-anchor', v)
+      : a === 'size' ||
+        a === 'family' ||
+        a === 'weight' ||
+        a === 'stretch' ||
+        a === 'variant' ||
+        a === 'style'
+      ? this.attr('font-' + a, v)
+      : this.attr(a, v)
   }
 })
 
 // Add events to elements
-const methods = [ 'click',
+const methods = [
+  'click',
   'dblclick',
   'mousedown',
   'mouseup',
@@ -154,7 +174,8 @@ const methods = [ 'click',
   'touchmove',
   'touchleave',
   'touchend',
-  'touchcancel' ].reduce(function (last, event) {
+  'touchcancel'
+].reduce(function (last, event) {
   // add event to Element
   const fn = function (f) {
     if (f === null) {
index d8e738174af86865175b08246a6c7ed210011284..7f950b398bc9f1e21adc5193a185675c7e08751f 100644 (file)
@@ -4,22 +4,24 @@ import { registerMethods } from '../../utils/methods.js'
 import Matrix from '../../types/Matrix.js'
 
 // Reset all transformations
-export function untransform () {
+export function untransform() {
   return this.attr('transform', null)
 }
 
 // merge the whole transformation chain into one matrix and returns it
-export function matrixify () {
+export function matrixify() {
   const matrix = (this.attr('transform') || '')
     // split transformations
-    .split(transforms).slice(0, -1).map(function (str) {
+    .split(transforms)
+    .slice(0, -1)
+    .map(function (str) {
       // generate key => value pairs
       const kv = str.trim().split('(')
-      return [ kv[0],
-        kv[1].split(delimiter)
-          .map(function (str) {
-            return parseFloat(str)
-          })
+      return [
+        kv[0],
+        kv[1].split(delimiter).map(function (str) {
+          return parseFloat(str)
+        })
       ]
     })
     .reverse()
@@ -35,7 +37,7 @@ export function matrixify () {
 }
 
 // add an element to another parent without changing the visual representation on the screen
-export function toParent (parent, i) {
+export function toParent(parent, i) {
   if (this === parent) return this
   const ctm = this.screenCTM()
   const pCtm = parent.screenCTM().inverse()
@@ -46,12 +48,12 @@ export function toParent (parent, i) {
 }
 
 // same as above with parent equals root-svg
-export function toRoot (i) {
+export function toRoot(i) {
   return this.toParent(this.root(), i)
 }
 
 // Add transformations
-export function transform (o, relative) {
+export function transform(o, relative) {
   // Act as a getter if no object was passed
   if (o == null || typeof o === 'string') {
     const decomposed = new Matrix(this).decompose()
@@ -64,11 +66,15 @@ export function transform (o, relative) {
   }
 
   // The user can pass a boolean, an Element or an Matrix or nothing
-  const cleanRelative = relative === true ? this : (relative || false)
+  const cleanRelative = relative === true ? this : relative || false
   const result = new Matrix(cleanRelative).transform(o)
   return this.attr('transform', result)
 }
 
 registerMethods('Element', {
-  untransform, matrixify, toParent, toRoot, transform
+  untransform,
+  matrixify,
+  toParent,
+  toRoot,
+  transform
 })
index 98e914306a8f79be37222141f3bb70a16de2fa52..690e23ad1d071154aac7ccfa00b9d32d34bc3e4a 100644 (file)
@@ -1,7 +1,7 @@
 import { filter } from '../utils/utils.js'
 
 // IE11: children does not work for svg nodes
-export default function children (node) {
+export default function children(node) {
   return filter(node.childNodes, function (child) {
     return child.nodeType === 1
   })
index 4f4140baf716be9bd1349c911b85de6b340401a7..51632afe8dad328816693339611aab34bd39bfbf 100644 (file)
@@ -1,24 +1,29 @@
-/* globals SVGElement, DOMParser */
-
-(function () {
+;(function () {
   try {
     if (SVGElement.prototype.innerHTML) return
-  } catch (e) { return }
+  } catch (e) {
+    return
+  }
 
   const serializeXML = function (node, output) {
     const nodeType = node.nodeType
     if (nodeType === 3) {
-      output.push(node.textContent.replace(/&/, '&amp;').replace(/</, '&lt;').replace('>', '&gt;'))
+      output.push(
+        node.textContent
+          .replace(/&/, '&amp;')
+          .replace(/</, '&lt;')
+          .replace('>', '&gt;')
+      )
     } else if (nodeType === 1) {
       output.push('<', node.tagName)
       if (node.hasAttributes()) {
-        [].forEach.call(node.attributes, function (attrNode) {
+        ;[].forEach.call(node.attributes, function (attrNode) {
           output.push(' ', attrNode.name, '="', attrNode.value, '"')
         })
       }
       output.push('>')
       if (node.hasChildNodes()) {
-        [].forEach.call(node.childNodes, function (childNode) {
+        ;[].forEach.call(node.childNodes, function (childNode) {
           serializeXML(childNode, output)
         })
       } else {
         const dXML = new DOMParser()
         dXML.async = false
 
-        const sXML = '<svg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\'>' + markupText + '</svg>'
-        const svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement
+        const sXML =
+          "<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>" +
+          markupText +
+          '</svg>'
+        const svgDocElement = dXML.parseFromString(
+          sXML,
+          'text/xml'
+        ).documentElement
 
         let childNode = svgDocElement.firstChild
         while (childNode) {
@@ -59,7 +70,7 @@
         }
       } catch (e) {
         throw new Error('Can not set innerHTML on node')
-      };
+      }
     }
   })
 
         const dXML = new DOMParser()
         dXML.async = false
 
-        const sXML = '<svg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\'>' + markupText + '</svg>'
-        const svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement
+        const sXML =
+          "<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>" +
+          markupText +
+          '</svg>'
+        const svgDocElement = dXML.parseFromString(
+          sXML,
+          'text/xml'
+        ).documentElement
 
         let childNode = svgDocElement.firstChild
         while (childNode) {
-          this.parentNode.insertBefore(this.ownerDocument.importNode(childNode, true), this)
+          this.parentNode.insertBefore(
+            this.ownerDocument.importNode(childNode, true),
+            this
+          )
           // this.appendChild(this.ownerDocument.importNode(childNode, true));
           childNode = childNode.nextSibling
         }
       } catch (e) {
         throw new Error('Can not set outerHTML on node')
-      };
+      }
     }
   })
 })()
index 85f2518d362a8870bf32e4fc494b79f5800a4f3f..69e4161a7d48899f26d21b3cff2061b86ded49ce 100644 (file)
@@ -2,7 +2,7 @@ import * as svgMembers from './main.js'
 import { makeInstance } from './utils/adopter.js'
 
 // The main wrapping element
-export default function SVG (element, isHTML) {
+export default function SVG(element, isHTML) {
   return makeInstance(element, isHTML)
 }
 
index ab19732a95cbd5e521d72667c03a20ba907c4b15..cd441ac769db4a055a35cbc0f007c0cbdc9d4104 100644 (file)
@@ -6,46 +6,55 @@ import Matrix from './Matrix.js'
 import Point from './Point.js'
 import parser from '../modules/core/parser.js'
 
-export function isNulledBox (box) {
+export function isNulledBox(box) {
   return !box.width && !box.height && !box.x && !box.y
 }
 
-export function domContains (node) {
-  return node === globals.document
-    || (globals.document.documentElement.contains || function (node) {
-      // This is IE - it does not support contains() for top-level SVGs
-      while (node.parentNode) {
-        node = node.parentNode
+export function domContains(node) {
+  return (
+    node === globals.document ||
+    (
+      globals.document.documentElement.contains ||
+      function (node) {
+        // This is IE - it does not support contains() for top-level SVGs
+        while (node.parentNode) {
+          node = node.parentNode
+        }
+        return node === globals.document
       }
-      return node === globals.document
-    }).call(globals.document.documentElement, node)
+    ).call(globals.document.documentElement, node)
+  )
 }
 
 export default class Box {
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  addOffset () {
+  addOffset() {
     // offset by window scroll position, because getBoundingClientRect changes when window is scrolled
     this.x += globals.window.pageXOffset
     this.y += globals.window.pageYOffset
     return new Box(this)
   }
 
-  init (source) {
-    const base = [ 0, 0, 0, 0 ]
-    source = typeof source === 'string'
-      ? source.split(delimiter).map(parseFloat)
-      : Array.isArray(source)
+  init(source) {
+    const base = [0, 0, 0, 0]
+    source =
+      typeof source === 'string'
+        ? source.split(delimiter).map(parseFloat)
+        : Array.isArray(source)
         ? source
         : typeof source === 'object'
-          ? [ source.left != null
-            ? source.left
-            : source.x, source.top != null ? source.top : source.y, source.width, source.height ]
-          : arguments.length === 4
-            ? [].slice.call(arguments)
-            : base
+        ? [
+            source.left != null ? source.left : source.x,
+            source.top != null ? source.top : source.y,
+            source.width,
+            source.height
+          ]
+        : arguments.length === 4
+        ? [].slice.call(arguments)
+        : base
 
     this.x = source[0] || 0
     this.y = source[1] || 0
@@ -61,12 +70,12 @@ export default class Box {
     return this
   }
 
-  isNulled () {
+  isNulled() {
     return isNulledBox(this)
   }
 
   // Merge rect box with another, return a new instance
-  merge (box) {
+  merge(box) {
     const x = Math.min(this.x, box.x)
     const y = Math.min(this.y, box.y)
     const width = Math.max(this.x + this.width, box.x + box.width) - x
@@ -75,15 +84,15 @@ export default class Box {
     return new Box(x, y, width, height)
   }
 
-  toArray () {
-    return [ this.x, this.y, this.width, this.height ]
+  toArray() {
+    return [this.x, this.y, this.width, this.height]
   }
 
-  toString () {
+  toString() {
     return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height
   }
 
-  transform (m) {
+  transform(m) {
     if (!(m instanceof Matrix)) {
       m = new Matrix(m)
     }
@@ -108,16 +117,11 @@ export default class Box {
       yMax = Math.max(yMax, p.y)
     })
 
-    return new Box(
-      xMin, yMin,
-      xMax - xMin,
-      yMax - yMin
-    )
+    return new Box(xMin, yMin, xMax - xMin, yMax - yMin)
   }
-
 }
 
-function getBox (el, getBBoxFn, retry) {
+function getBox(el, getBBoxFn, retry) {
   let box
 
   try {
@@ -137,7 +141,7 @@ function getBox (el, getBBoxFn, retry) {
   return box
 }
 
-export function bbox () {
+export function bbox() {
   // Function to get bbox is getBBox()
   const getBBox = (node) => node.getBBox()
 
@@ -151,7 +155,11 @@ export function bbox () {
       return box
     } catch (e) {
       // We give up...
-      throw new Error(`Getting bbox of element "${el.node.nodeName}" is not possible: ${e.toString()}`)
+      throw new Error(
+        `Getting bbox of element "${
+          el.node.nodeName
+        }" is not possible: ${e.toString()}`
+      )
     }
   }
 
@@ -161,12 +169,14 @@ export function bbox () {
   return bbox
 }
 
-export function rbox (el) {
+export function rbox(el) {
   const getRBox = (node) => node.getBoundingClientRect()
   const retry = (el) => {
     // There is no point in trying tricks here because if we insert the element into the dom ourselves
     // it obviously will be at the wrong position
-    throw new Error(`Getting rbox of element "${el.node.nodeName}" is not possible`)
+    throw new Error(
+      `Getting rbox of element "${el.node.nodeName}" is not possible`
+    )
   }
 
   const box = getBox(this, getRBox, retry)
@@ -183,18 +193,17 @@ export function rbox (el) {
 }
 
 // Checks whether the given point is inside the bounding box
-export function inside (x, y) {
+export function inside(x, y) {
   const box = this.bbox()
 
-  return x > box.x
-    && y > box.y
-    && x < box.x + box.width
-    && y < box.y + box.height
+  return (
+    x > box.x && y > box.y && x < box.x + box.width && y < box.y + box.height
+  )
 }
 
 registerMethods({
   viewbox: {
-    viewbox (x, y, width, height) {
+    viewbox(x, y, width, height) {
       // act as getter
       if (x == null) return new Box(this.attr('viewBox'))
 
@@ -202,7 +211,7 @@ registerMethods({
       return this.attr('viewBox', new Box(x, y, width, height))
     },
 
-    zoom (level, point) {
+    zoom(level, point) {
       // Its best to rely on the attributes here and here is why:
       // clientXYZ: Doesn't work on non-root svgs because they dont have a CSSBox (silly!)
       // getBoundingClientRect: Doesn't work because Chrome just ignores width and height of nested svgs completely
@@ -210,18 +219,24 @@ registerMethods({
       //                        Furthermore this size is incorrect if the element is further transformed by its parents
       // computedStyle: Only returns meaningful values if css was used with px. We dont go this route here!
       // getBBox: returns the bounding box of its content - that doesn't help!
-      let { width, height } = this.attr([ 'width', 'height' ])
+      let { width, height } = this.attr(['width', 'height'])
 
       // Width and height is a string when a number with a unit is present which we can't use
       // So we try clientXYZ
-      if ((!width && !height) || (typeof width === 'string' || typeof height === 'string')) {
+      if (
+        (!width && !height) ||
+        typeof width === 'string' ||
+        typeof height === 'string'
+      ) {
         width = this.node.clientWidth
         height = this.node.clientHeight
       }
 
       // Giving up...
       if (!width || !height) {
-        throw new Error('Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element')
+        throw new Error(
+          'Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element'
+        )
       }
 
       const v = this.viewbox()
@@ -240,7 +255,8 @@ registerMethods({
       // The * 100 is a bit of wiggle room for the matrix transformation
       if (zoomAmount === Infinity) zoomAmount = Number.MAX_SAFE_INTEGER / 100
 
-      point = point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y)
+      point =
+        point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y)
 
       const box = new Box(v).transform(
         new Matrix({ scale: zoomAmount, origin: point })
index c050ecc6aea3dcc21b67744235be0616af8c096d..79fa24e56b018f48c8598b129a8c26d9aaee74af 100644 (file)
@@ -1,25 +1,28 @@
-
 import { hex, isHex, isRgb, rgb, whitespace } from '../modules/core/regex.js'
 
-function sixDigitHex (hex) {
+function sixDigitHex(hex) {
   return hex.length === 4
-    ? [ '#',
-      hex.substring(1, 2), hex.substring(1, 2),
-      hex.substring(2, 3), hex.substring(2, 3),
-      hex.substring(3, 4), hex.substring(3, 4)
-    ].join('')
+    ? [
+        '#',
+        hex.substring(1, 2),
+        hex.substring(1, 2),
+        hex.substring(2, 3),
+        hex.substring(2, 3),
+        hex.substring(3, 4),
+        hex.substring(3, 4)
+      ].join('')
     : hex
 }
 
-function componentHex (component) {
+function componentHex(component) {
   const integer = Math.round(component)
   const bounded = Math.max(0, Math.min(255, integer))
   const hex = bounded.toString(16)
   return hex.length === 1 ? '0' + hex : hex
 }
 
-function is (object, space) {
-  for (let i = space.length; i--;) {
+function is(object, space) {
+  for (let i = space.length; i--; ) {
     if (object[space[i]] == null) {
       return false
     }
@@ -27,26 +30,26 @@ function is (object, space) {
   return true
 }
 
-function getParameters (a, b) {
+function getParameters(a, b) {
   const params = is(a, 'rgb')
     ? { _a: a.r, _b: a.g, _c: a.b, _d: 0, space: 'rgb' }
     : is(a, 'xyz')
-      ? { _a: a.x, _b: a.y, _c: a.z, _d: 0, space: 'xyz' }
-      : is(a, 'hsl')
-        ? { _a: a.h, _b: a.s, _c: a.l, _d: 0, space: 'hsl' }
-        : is(a, 'lab')
-          ? { _a: a.l, _b: a.a, _c: a.b, _d: 0, space: 'lab' }
-          : is(a, 'lch')
-            ? { _a: a.l, _b: a.c, _c: a.h, _d: 0, space: 'lch' }
-            : is(a, 'cmyk')
-              ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' }
-              : { _a: 0, _b: 0, _c: 0, space: 'rgb' }
+    ? { _a: a.x, _b: a.y, _c: a.z, _d: 0, space: 'xyz' }
+    : is(a, 'hsl')
+    ? { _a: a.h, _b: a.s, _c: a.l, _d: 0, space: 'hsl' }
+    : is(a, 'lab')
+    ? { _a: a.l, _b: a.a, _c: a.b, _d: 0, space: 'lab' }
+    : is(a, 'lch')
+    ? { _a: a.l, _b: a.c, _c: a.h, _d: 0, space: 'lch' }
+    : is(a, 'cmyk')
+    ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' }
+    : { _a: 0, _b: 0, _c: 0, space: 'rgb' }
 
   params.space = b || params.space
   return params
 }
 
-function cieSpace (space) {
+function cieSpace(space) {
   if (space === 'lab' || space === 'xyz' || space === 'lch') {
     return true
   } else {
@@ -54,7 +57,7 @@ function cieSpace (space) {
   }
 }
 
-function hueToRgb (p, q, t) {
+function hueToRgb(p, q, t) {
   if (t < 0) t += 1
   if (t > 1) t -= 1
   if (t < 1 / 6) return p + (q - p) * 6 * t
@@ -64,108 +67,90 @@ function hueToRgb (p, q, t) {
 }
 
 export default class Color {
-  constructor (...inputs) {
+  constructor(...inputs) {
     this.init(...inputs)
   }
 
   // Test if given value is a color
-  static isColor (color) {
-    return color && (
-      color instanceof Color
-      || this.isRgb(color)
-      || this.test(color)
+  static isColor(color) {
+    return (
+      color && (color instanceof Color || this.isRgb(color) || this.test(color))
     )
   }
 
   // Test if given value is an rgb object
-  static isRgb (color) {
-    return color && typeof color.r === 'number'
-      && typeof color.g === 'number'
-      && typeof color.b === 'number'
+  static isRgb(color) {
+    return (
+      color &&
+      typeof color.r === 'number' &&
+      typeof color.g === 'number' &&
+      typeof color.b === 'number'
+    )
   }
 
   /*
   Generating random colors
   */
-  static random (mode = 'vibrant', t, u) {
-
+  static random(mode = 'vibrant', t) {
     // Get the math modules
     const { random, round, sin, PI: pi } = Math
 
     // Run the correct generator
     if (mode === 'vibrant') {
-
       const l = (81 - 57) * random() + 57
       const c = (83 - 45) * random() + 45
       const h = 360 * random()
       const color = new Color(l, c, h, 'lch')
       return color
-
     } else if (mode === 'sine') {
-
       t = t == null ? random() : t
-      const r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150)
-      const g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200)
-      const b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150)
+      const r = round(80 * sin((2 * pi * t) / 0.5 + 0.01) + 150)
+      const g = round(50 * sin((2 * pi * t) / 0.5 + 4.6) + 200)
+      const b = round(100 * sin((2 * pi * t) / 0.5 + 2.3) + 150)
       const color = new Color(r, g, b)
       return color
-
     } else if (mode === 'pastel') {
-
       const l = (94 - 86) * random() + 86
       const c = (26 - 9) * random() + 9
       const h = 360 * random()
       const color = new Color(l, c, h, 'lch')
       return color
-
     } else if (mode === 'dark') {
-
       const l = 10 + 10 * random()
       const c = (125 - 75) * random() + 86
       const h = 360 * random()
       const color = new Color(l, c, h, 'lch')
       return color
-
     } else if (mode === 'rgb') {
-
       const r = 255 * random()
       const g = 255 * random()
       const b = 255 * random()
       const color = new Color(r, g, b)
       return color
-
     } else if (mode === 'lab') {
-
       const l = 100 * random()
       const a = 256 * random() - 128
       const b = 256 * random() - 128
       const color = new Color(l, a, b, 'lab')
       return color
-
     } else if (mode === 'grey') {
-
       const grey = 255 * random()
       const color = new Color(grey, grey, grey)
       return color
-
     } else {
-
       throw new Error('Unsupported random color mode')
-
     }
   }
 
   // Test if given value is a color string
-  static test (color) {
-    return (typeof color === 'string')
-      && (isHex.test(color) || isRgb.test(color))
+  static test(color) {
+    return typeof color === 'string' && (isHex.test(color) || isRgb.test(color))
   }
 
-  cmyk () {
-
+  cmyk() {
     // Get the rgb values for the current color
     const { _a, _b, _c } = this.rgb()
-    const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255)
+    const [r, g, b] = [_a, _b, _c].map((v) => v / 255)
 
     // Get the cmyk values in an unbounded format
     const k = Math.min(1 - r, 1 - g, 1 - b)
@@ -184,11 +169,10 @@ export default class Color {
     return color
   }
 
-  hsl () {
-
+  hsl() {
     // Get the rgb values
     const { _a, _b, _c } = this.rgb()
-    const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255)
+    const [r, g, b] = [_a, _b, _c].map((v) => v / 255)
 
     // Find the maximum and minimum values to get the lightness
     const max = Math.max(r, g, b)
@@ -203,24 +187,24 @@ export default class Color {
     const s = isGrey
       ? 0
       : l > 0.5
-        ? delta / (2 - max - min)
-        : delta / (max + min)
+      ? delta / (2 - max - min)
+      : delta / (max + min)
     const h = isGrey
       ? 0
       : max === r
-        ? ((g - b) / delta + (g < b ? 6 : 0)) / 6
-        : max === g
-          ? ((b - r) / delta + 2) / 6
-          : max === b
-            ? ((r - g) / delta + 4) / 6
-            : 0
+      ? ((g - b) / delta + (g < b ? 6 : 0)) / 6
+      : max === g
+      ? ((b - r) / delta + 2) / 6
+      : max === b
+      ? ((r - g) / delta + 4) / 6
+      : 0
 
     // Construct and return the new color
     const color = new Color(360 * h, 100 * s, 100 * l, 'hsl')
     return color
   }
 
-  init (a = 0, b = 0, c = 0, d = 0, space = 'rgb') {
+  init(a = 0, b = 0, c = 0, d = 0, space = 'rgb') {
     // This catches the case when a falsy value is passed like ''
     a = !a ? 0 : a
 
@@ -238,7 +222,7 @@ export default class Color {
 
       // Assign the values straight to the color
       Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space })
-    // If the user gave us an array, make the color from it
+      // If the user gave us an array, make the color from it
     } else if (a instanceof Array) {
       this.space = b || (typeof a[3] === 'string' ? a[3] : a[4]) || 'rgb'
       Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] || 0 })
@@ -249,40 +233,43 @@ export default class Color {
     } else if (typeof a === 'string') {
       if (isRgb.test(a)) {
         const noWhitespace = a.replace(whitespace, '')
-        const [ _a, _b, _c ] = rgb.exec(noWhitespace)
-          .slice(1, 4).map(v => parseInt(v))
+        const [_a, _b, _c] = rgb
+          .exec(noWhitespace)
+          .slice(1, 4)
+          .map((v) => parseInt(v))
         Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' })
       } else if (isHex.test(a)) {
-        const hexParse = v => parseInt(v, 16)
-        const [ , _a, _b, _c ] = hex.exec(sixDigitHex(a)).map(hexParse)
+        const hexParse = (v) => parseInt(v, 16)
+        const [, _a, _b, _c] = hex.exec(sixDigitHex(a)).map(hexParse)
         Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' })
-      } else throw Error('Unsupported string format, can\'t construct Color')
+      } else throw Error("Unsupported string format, can't construct Color")
     }
 
     // Now add the components as a convenience
     const { _a, _b, _c, _d } = this
-    const components = this.space === 'rgb'
-      ? { r: _a, g: _b, b: _c }
-      : this.space === 'xyz'
+    const components =
+      this.space === 'rgb'
+        ? { r: _a, g: _b, b: _c }
+        : this.space === 'xyz'
         ? { x: _a, y: _b, z: _c }
         : this.space === 'hsl'
-          ? { h: _a, s: _b, l: _c }
-          : this.space === 'lab'
-            ? { l: _a, a: _b, b: _c }
-            : this.space === 'lch'
-              ? { l: _a, c: _b, h: _c }
-              : this.space === 'cmyk'
-                ? { c: _a, m: _b, y: _c, k: _d }
-                : {}
+        ? { h: _a, s: _b, l: _c }
+        : this.space === 'lab'
+        ? { l: _a, a: _b, b: _c }
+        : this.space === 'lch'
+        ? { l: _a, c: _b, h: _c }
+        : this.space === 'cmyk'
+        ? { c: _a, m: _b, y: _c, k: _d }
+        : {}
     Object.assign(this, components)
   }
 
-  lab () {
+  lab() {
     // Get the xyz color
     const { x, y, z } = this.xyz()
 
     // Get the lab components
-    const l = (116 * y) - 16
+    const l = 116 * y - 16
     const a = 500 * (x - y)
     const b = 200 * (y - z)
 
@@ -291,14 +278,13 @@ export default class Color {
     return color
   }
 
-  lch () {
-
+  lch() {
     // Get the lab color directly
     const { l, a, b } = this.lab()
 
     // Get the chromaticity and the hue using polar coordinates
     const c = Math.sqrt(a ** 2 + b ** 2)
-    let h = 180 * Math.atan2(b, a) / Math.PI
+    let h = (180 * Math.atan2(b, a)) / Math.PI
     if (h < 0) {
       h *= -1
       h = 360 - h
@@ -312,7 +298,7 @@ export default class Color {
   Conversion Methods
   */
 
-  rgb () {
+  rgb() {
     if (this.space === 'rgb') {
       return this
     } else if (cieSpace(this.space)) {
@@ -337,22 +323,22 @@ export default class Color {
         const ct = 16 / 116
         const mx = 0.008856
         const nm = 7.787
-        x = 0.95047 * ((xL ** 3 > mx) ? xL ** 3 : (xL - ct) / nm)
-        y = 1.00000 * ((yL ** 3 > mx) ? yL ** 3 : (yL - ct) / nm)
-        z = 1.08883 * ((zL ** 3 > mx) ? zL ** 3 : (zL - ct) / nm)
+        x = 0.95047 * (xL ** 3 > mx ? xL ** 3 : (xL - ct) / nm)
+        y = 1.0 * (yL ** 3 > mx ? yL ** 3 : (yL - ct) / nm)
+        z = 1.08883 * (zL ** 3 > mx ? zL ** 3 : (zL - ct) / nm)
       }
 
       // Convert xyz to unbounded rgb values
       const rU = x * 3.2406 + y * -1.5372 + z * -0.4986
       const gU = x * -0.9689 + y * 1.8758 + z * 0.0415
-      const bU = x * 0.0557 + y * -0.2040 + z * 1.0570
+      const bU = x * 0.0557 + y * -0.204 + z * 1.057
 
       // Convert the values to true rgb values
       const pow = Math.pow
       const bd = 0.0031308
-      const r = (rU > bd) ? (1.055 * pow(rU, 1 / 2.4) - 0.055) : 12.92 * rU
-      const g = (gU > bd) ? (1.055 * pow(gU, 1 / 2.4) - 0.055) : 12.92 * gU
-      const b = (bU > bd) ? (1.055 * pow(bU, 1 / 2.4) - 0.055) : 12.92 * bU
+      const r = rU > bd ? 1.055 * pow(rU, 1 / 2.4) - 0.055 : 12.92 * rU
+      const g = gU > bd ? 1.055 * pow(gU, 1 / 2.4) - 0.055 : 12.92 * gU
+      const b = bU > bd ? 1.055 * pow(bU, 1 / 2.4) - 0.055 : 12.92 * bU
 
       // Make and return the color
       const color = new Color(255 * r, 255 * g, 255 * b)
@@ -402,46 +388,45 @@ export default class Color {
     }
   }
 
-  toArray () {
+  toArray() {
     const { _a, _b, _c, _d, space } = this
-    return [ _a, _b, _c, _d, space ]
+    return [_a, _b, _c, _d, space]
   }
 
-  toHex () {
-    const [ r, g, b ] = this._clamped().map(componentHex)
+  toHex() {
+    const [r, g, b] = this._clamped().map(componentHex)
     return `#${r}${g}${b}`
   }
 
-  toRgb () {
-    const [ rV, gV, bV ] = this._clamped()
+  toRgb() {
+    const [rV, gV, bV] = this._clamped()
     const string = `rgb(${rV},${gV},${bV})`
     return string
   }
 
-  toString () {
+  toString() {
     return this.toHex()
   }
 
-  xyz () {
-
+  xyz() {
     // Normalise the red, green and blue values
     const { _a: r255, _b: g255, _c: b255 } = this.rgb()
-    const [ r, g, b ] = [ r255, g255, b255 ].map(v => v / 255)
+    const [r, g, b] = [r255, g255, b255].map((v) => v / 255)
 
     // Convert to the lab rgb space
-    const rL = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92
-    const gL = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92
-    const bL = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92
+    const rL = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92
+    const gL = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92
+    const bL = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92
 
     // Convert to the xyz color space without bounding the values
     const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047
-    const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.00000
+    const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.0
     const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883
 
     // Get the proper xyz values by applying the bounding
-    const x = (xU > 0.008856) ? Math.pow(xU, 1 / 3) : (7.787 * xU) + 16 / 116
-    const y = (yU > 0.008856) ? Math.pow(yU, 1 / 3) : (7.787 * yU) + 16 / 116
-    const z = (zU > 0.008856) ? Math.pow(zU, 1 / 3) : (7.787 * zU) + 16 / 116
+    const x = xU > 0.008856 ? Math.pow(xU, 1 / 3) : 7.787 * xU + 16 / 116
+    const y = yU > 0.008856 ? Math.pow(yU, 1 / 3) : 7.787 * yU + 16 / 116
+    const z = zU > 0.008856 ? Math.pow(zU, 1 / 3) : 7.787 * zU + 16 / 116
 
     // Make and return the color
     const color = new Color(x, y, z, 'xyz')
@@ -452,15 +437,14 @@ export default class Color {
   Input and Output methods
   */
 
-  _clamped () {
+  _clamped() {
     const { _a, _b, _c } = this.rgb()
     const { max, min, round } = Math
-    const format = v => max(0, min(round(v), 255))
-    return [ _a, _b, _c ].map(format)
+    const format = (v) => max(0, min(round(v), 255))
+    return [_a, _b, _c].map(format)
   }
 
   /*
   Constructing colors
   */
-
 }
index 58f5d5ca1dd83ead325af8bbd861b458d99b0349..de13a5f16b62b215dc1eaf3e642f7a7ef3019ae8 100644 (file)
@@ -3,13 +3,13 @@ import { register } from '../utils/adopter.js'
 import Base from './Base.js'
 
 export default class EventTarget extends Base {
-  addEventListener () {}
+  addEventListener() {}
 
-  dispatch (event, data, options) {
+  dispatch(event, data, options) {
     return dispatch(this, event, data, options)
   }
 
-  dispatchEvent (event) {
+  dispatchEvent(event) {
     const bag = this.getEventHolder().events
     if (!bag) return true
 
@@ -25,32 +25,32 @@ export default class EventTarget extends Base {
   }
 
   // Fire given event
-  fire (event, data, options) {
+  fire(event, data, options) {
     this.dispatch(event, data, options)
     return this
   }
 
-  getEventHolder () {
+  getEventHolder() {
     return this
   }
 
-  getEventTarget () {
+  getEventTarget() {
     return this
   }
 
   // Unbind event from listener
-  off (event, listener, options) {
+  off(event, listener, options) {
     off(this, event, listener, options)
     return this
   }
 
   // Bind given event to listener
-  on (event, listener, binding, options) {
+  on(event, listener, binding, options) {
     on(this, event, listener, binding, options)
     return this
   }
 
-  removeEventListener () {}
+  removeEventListener() {}
 }
 
 register(EventTarget, 'EventTarget')
index 197a155610224ee9a4c5ddc454ee088bf70db6a4..bdeb7664c2811b5a4e3d62d64dcfe2a32d643e7d 100644 (file)
@@ -2,7 +2,7 @@ import { extend } from '../utils/adopter.js'
 // import { subClassArray } from './ArrayPolyfill.js'
 
 class List extends Array {
-  constructor (arr = [], ...args) {
+  constructor(arr = [], ...args) {
     super(arr, ...args)
     if (typeof arr === 'number') return this
     this.length = 0
@@ -19,25 +19,25 @@ class List extends Array {
 
 export default List
 
-extend([ List ], {
-  each (fnOrMethodName, ...args) {
+extend([List], {
+  each(fnOrMethodName, ...args) {
     if (typeof fnOrMethodName === 'function') {
       return this.map((el, i, arr) => {
         return fnOrMethodName.call(el, el, i, arr)
       })
     } else {
-      return this.map(el => {
+      return this.map((el) => {
         return el[fnOrMethodName](...args)
       })
     }
   },
 
-  toArray () {
+  toArray() {
     return Array.prototype.concat.apply([], this)
   }
 })
 
-const reserved = [ 'toArray', 'constructor', 'each' ]
+const reserved = ['toArray', 'constructor', 'each']
 
 List.extend = function (methods) {
   methods = methods.reduce((obj, name) => {
@@ -54,5 +54,5 @@ List.extend = function (methods) {
     return obj
   }, {})
 
-  extend([ List ], methods)
+  extend([List], methods)
 }
index c329df429afd59491cd5e144ec20fafdcb99a592..760f002ac0fcac09fbec35ef16ae9d16e7c93eda 100644 (file)
@@ -4,87 +4,116 @@ import { register } from '../utils/adopter.js'
 import Element from '../elements/Element.js'
 import Point from './Point.js'
 
-function closeEnough (a, b, threshold) {
+function closeEnough(a, b, threshold) {
   return Math.abs(b - a) < (threshold || 1e-6)
 }
 
 export default class Matrix {
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  static formatTransforms (o) {
+  static formatTransforms(o) {
     // Get all of the parameters required to form the matrix
     const flipBoth = o.flip === 'both' || o.flip === true
     const flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1
     const flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1
-    const skewX = o.skew && o.skew.length
-      ? o.skew[0]
-      : isFinite(o.skew)
+    const skewX =
+      o.skew && o.skew.length
+        ? o.skew[0]
+        : isFinite(o.skew)
         ? o.skew
         : isFinite(o.skewX)
-          ? o.skewX
-          : 0
-    const skewY = o.skew && o.skew.length
-      ? o.skew[1]
-      : isFinite(o.skew)
+        ? o.skewX
+        : 0
+    const skewY =
+      o.skew && o.skew.length
+        ? o.skew[1]
+        : isFinite(o.skew)
         ? o.skew
         : isFinite(o.skewY)
-          ? o.skewY
-          : 0
-    const scaleX = o.scale && o.scale.length
-      ? o.scale[0] * flipX
-      : isFinite(o.scale)
+        ? o.skewY
+        : 0
+    const scaleX =
+      o.scale && o.scale.length
+        ? o.scale[0] * flipX
+        : isFinite(o.scale)
         ? o.scale * flipX
         : isFinite(o.scaleX)
-          ? o.scaleX * flipX
-          : flipX
-    const scaleY = o.scale && o.scale.length
-      ? o.scale[1] * flipY
-      : isFinite(o.scale)
+        ? o.scaleX * flipX
+        : flipX
+    const scaleY =
+      o.scale && o.scale.length
+        ? o.scale[1] * flipY
+        : isFinite(o.scale)
         ? o.scale * flipY
         : isFinite(o.scaleY)
-          ? o.scaleY * flipY
-          : flipY
+        ? o.scaleY * flipY
+        : flipY
     const shear = o.shear || 0
     const theta = o.rotate || o.theta || 0
-    const origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY)
+    const origin = new Point(
+      o.origin || o.around || o.ox || o.originX,
+      o.oy || o.originY
+    )
     const ox = origin.x
     const oy = origin.y
     // We need Point to be invalid if nothing was passed because we cannot default to 0 here. That is why NaN
-    const position = new Point(o.position || o.px || o.positionX || NaN, o.py || o.positionY || NaN)
+    const position = new Point(
+      o.position || o.px || o.positionX || NaN,
+      o.py || o.positionY || NaN
+    )
     const px = position.x
     const py = position.y
-    const translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY)
+    const translate = new Point(
+      o.translate || o.tx || o.translateX,
+      o.ty || o.translateY
+    )
     const tx = translate.x
     const ty = translate.y
-    const relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY)
+    const relative = new Point(
+      o.relative || o.rx || o.relativeX,
+      o.ry || o.relativeY
+    )
     const rx = relative.x
     const ry = relative.y
 
     // Populate all of the values
     return {
-      scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py
+      scaleX,
+      scaleY,
+      skewX,
+      skewY,
+      shear,
+      theta,
+      rx,
+      ry,
+      tx,
+      ty,
+      ox,
+      oy,
+      px,
+      py
     }
   }
 
-  static fromArray (a) {
+  static fromArray(a) {
     return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }
   }
 
-  static isMatrixLike (o) {
+  static isMatrixLike(o) {
     return (
-      o.a != null
-      || o.b != null
-      || o.c != null
-      || o.d != null
-      || o.e != null
-      || o.f != null
+      o.a != null ||
+      o.b != null ||
+      o.c != null ||
+      o.d != null ||
+      o.e != null ||
+      o.f != null
     )
   }
 
   // left matrix, right matrix, target matrix which is overwritten
-  static matrixMultiply (l, r, o) {
+  static matrixMultiply(l, r, o) {
     // Work out the product directly
     const a = l.a * r.a + l.c * r.b
     const b = l.b * r.a + l.d * r.b
@@ -104,24 +133,24 @@ export default class Matrix {
     return o
   }
 
-  around (cx, cy, matrix) {
+  around(cx, cy, matrix) {
     return this.clone().aroundO(cx, cy, matrix)
   }
 
   // Transform around a center point
-  aroundO (cx, cy, matrix) {
+  aroundO(cx, cy, matrix) {
     const dx = cx || 0
     const dy = cy || 0
     return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy)
   }
 
   // Clones this matrix
-  clone () {
+  clone() {
     return new Matrix(this)
   }
 
   // Decomposes this matrix into its affine parameters
-  decompose (cx = 0, cy = 0) {
+  decompose(cx = 0, cy = 0) {
     // Get the parameters from the matrix
     const a = this.a
     const b = this.b
@@ -138,14 +167,14 @@ export default class Matrix {
     // and the rotation of the resulting matrix
     const sx = ccw * Math.sqrt(a * a + b * b)
     const thetaRad = Math.atan2(ccw * b, ccw * a)
-    const theta = 180 / Math.PI * thetaRad
+    const theta = (180 / Math.PI) * thetaRad
     const ct = Math.cos(thetaRad)
     const st = Math.sin(thetaRad)
 
     // We can then solve the y basis vector simultaneously to get the other
     // two affine parameters directly from these parameters
     const lam = (a * c + b * d) / determinant
-    const sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))
+    const sy = (c * sx) / (lam * a - b) || (d * sx) / (lam * b + a)
 
     // Use the translations
     const tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy)
@@ -174,45 +203,51 @@ export default class Matrix {
   }
 
   // Check if two matrices are equal
-  equals (other) {
+  equals(other) {
     if (other === this) return true
     const comp = new Matrix(other)
-    return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b)
-      && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d)
-      && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f)
+    return (
+      closeEnough(this.a, comp.a) &&
+      closeEnough(this.b, comp.b) &&
+      closeEnough(this.c, comp.c) &&
+      closeEnough(this.d, comp.d) &&
+      closeEnough(this.e, comp.e) &&
+      closeEnough(this.f, comp.f)
+    )
   }
 
   // Flip matrix on x or y, at a given offset
-  flip (axis, around) {
+  flip(axis, around) {
     return this.clone().flipO(axis, around)
   }
 
-  flipO (axis, around) {
+  flipO(axis, around) {
     return axis === 'x'
       ? this.scaleO(-1, 1, around, 0)
       : axis === 'y'
-        ? this.scaleO(1, -1, 0, around)
-        : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point
+      ? this.scaleO(1, -1, 0, around)
+      : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point
   }
 
   // Initialize
-  init (source) {
-    const base = Matrix.fromArray([ 1, 0, 0, 1, 0, 0 ])
+  init(source) {
+    const base = Matrix.fromArray([1, 0, 0, 1, 0, 0])
 
     // ensure source as object
-    source = source instanceof Element
-      ? source.matrixify()
-      : typeof source === 'string'
+    source =
+      source instanceof Element
+        ? source.matrixify()
+        : typeof source === 'string'
         ? Matrix.fromArray(source.split(delimiter).map(parseFloat))
         : Array.isArray(source)
-          ? Matrix.fromArray(source)
-          : (typeof source === 'object' && Matrix.isMatrixLike(source))
-            ? source
-            : (typeof source === 'object')
-              ? new Matrix().transform(source)
-              : arguments.length === 6
-                ? Matrix.fromArray([].slice.call(arguments))
-                : base
+        ? Matrix.fromArray(source)
+        : typeof source === 'object' && Matrix.isMatrixLike(source)
+        ? source
+        : typeof source === 'object'
+        ? new Matrix().transform(source)
+        : arguments.length === 6
+        ? Matrix.fromArray([].slice.call(arguments))
+        : base
 
     // Merge the source matrix with the base matrix
     this.a = source.a != null ? source.a : base.a
@@ -225,12 +260,12 @@ export default class Matrix {
     return this
   }
 
-  inverse () {
+  inverse() {
     return this.clone().inverseO()
   }
 
   // Inverses matrix
-  inverseO () {
+  inverseO() {
     // Get the current parameters out of the matrix
     const a = this.a
     const b = this.b
@@ -264,40 +299,36 @@ export default class Matrix {
     return this
   }
 
-  lmultiply (matrix) {
+  lmultiply(matrix) {
     return this.clone().lmultiplyO(matrix)
   }
 
-  lmultiplyO (matrix) {
+  lmultiplyO(matrix) {
     const r = this
-    const l = matrix instanceof Matrix
-      ? matrix
-      : new Matrix(matrix)
+    const l = matrix instanceof Matrix ? matrix : new Matrix(matrix)
 
     return Matrix.matrixMultiply(l, r, this)
   }
 
   // Left multiplies by the given matrix
-  multiply (matrix) {
+  multiply(matrix) {
     return this.clone().multiplyO(matrix)
   }
 
-  multiplyO (matrix) {
+  multiplyO(matrix) {
     // Get the matrices
     const l = this
-    const r = matrix instanceof Matrix
-      ? matrix
-      : new Matrix(matrix)
+    const r = matrix instanceof Matrix ? matrix : new Matrix(matrix)
 
     return Matrix.matrixMultiply(l, r, this)
   }
 
   // Rotate matrix
-  rotate (r, cx, cy) {
+  rotate(r, cx, cy) {
     return this.clone().rotateO(r, cx, cy)
   }
 
-  rotateO (r, cx = 0, cy = 0) {
+  rotateO(r, cx = 0, cy = 0) {
     // Convert degrees to radians
     r = radians(r)
 
@@ -317,11 +348,11 @@ export default class Matrix {
   }
 
   // Scale matrix
-  scale (x, y, cx, cy) {
+  scale() {
     return this.clone().scaleO(...arguments)
   }
 
-  scaleO (x, y = x, cx = 0, cy = 0) {
+  scaleO(x, y = x, cx = 0, cy = 0) {
     // Support uniform scaling
     if (arguments.length === 3) {
       cy = cx
@@ -342,11 +373,12 @@ export default class Matrix {
   }
 
   // Shear matrix
-  shear (a, cx, cy) {
+  shear(a, cx, cy) {
     return this.clone().shearO(a, cx, cy)
   }
 
-  shearO (lx, cx = 0, cy = 0) {
+  // eslint-disable-next-line no-unused-vars
+  shearO(lx, cx = 0, cy = 0) {
     const { a, b, c, d, e, f } = this
 
     this.a = a + b * lx
@@ -357,11 +389,11 @@ export default class Matrix {
   }
 
   // Skew Matrix
-  skew (x, y, cx, cy) {
+  skew() {
     return this.clone().skewO(...arguments)
   }
 
-  skewO (x, y = x, cx = 0, cy = 0) {
+  skewO(x, y = x, cx = 0, cy = 0) {
     // support uniformal skew
     if (arguments.length === 3) {
       cy = cx
@@ -389,26 +421,40 @@ export default class Matrix {
   }
 
   // SkewX
-  skewX (x, cx, cy) {
+  skewX(x, cx, cy) {
     return this.skew(x, 0, cx, cy)
   }
 
   // SkewY
-  skewY (y, cx, cy) {
+  skewY(y, cx, cy) {
     return this.skew(0, y, cx, cy)
   }
 
-  toArray () {
-    return [ this.a, this.b, this.c, this.d, this.e, this.f ]
+  toArray() {
+    return [this.a, this.b, this.c, this.d, this.e, this.f]
   }
 
   // Convert matrix to string
-  toString () {
-    return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')'
+  toString() {
+    return (
+      'matrix(' +
+      this.a +
+      ',' +
+      this.b +
+      ',' +
+      this.c +
+      ',' +
+      this.d +
+      ',' +
+      this.e +
+      ',' +
+      this.f +
+      ')'
+    )
   }
 
   // Transform a matrix into another matrix by manipulating the space
-  transform (o) {
+  transform(o) {
     // Check if o is a matrix and then left multiply it directly
     if (Matrix.isMatrixLike(o)) {
       const matrix = new Matrix(o)
@@ -447,17 +493,17 @@ export default class Matrix {
   }
 
   // Translate matrix
-  translate (x, y) {
+  translate(x, y) {
     return this.clone().translateO(x, y)
   }
 
-  translateO (x, y) {
+  translateO(x, y) {
     this.e += x || 0
     this.f += y || 0
     return this
   }
 
-  valueOf () {
+  valueOf() {
     return {
       a: this.a,
       b: this.b,
@@ -467,14 +513,13 @@ export default class Matrix {
       f: this.f
     }
   }
-
 }
 
-export function ctm () {
+export function ctm() {
   return new Matrix(this.node.getCTM())
 }
 
-export function screenCTM () {
+export function screenCTM() {
   /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
      This is needed because FF does not return the transformation matrix
      for the inner coordinate system when getScreenCTM() is called on nested svgs.
index 8a37ac411dd314c24f09f37be93c7d4bbfeb607c..9e59ed7050dc30425ae7a0f10643d1554f2a651a 100644 (file)
@@ -3,7 +3,7 @@ import parser from '../modules/core/parser.js'
 import Box from './Box.js'
 import { pathParser } from '../utils/pathParser.js'
 
-function arrayToString (a) {
+function arrayToString(a) {
   let s = ''
   for (let i = 0, il = a.length; i < il; i++) {
     s += a[i][0]
@@ -42,13 +42,13 @@ function arrayToString (a) {
 
 export default class PathArray extends SVGArray {
   // Get bounding box of path
-  bbox () {
+  bbox() {
     parser().path.setAttribute('d', this.toString())
     return new Box(parser.nodes.path.getBBox())
   }
 
   // Move path string
-  move (x, y) {
+  move(x, y) {
     // get bounding box of current situation
     const box = this.bbox()
 
@@ -89,7 +89,7 @@ export default class PathArray extends SVGArray {
   }
 
   // Absolutize and parse path to array
-  parse (d = 'M0 0') {
+  parse(d = 'M0 0') {
     if (Array.isArray(d)) {
       d = Array.prototype.concat.apply([], d).toString()
     }
@@ -98,7 +98,7 @@ export default class PathArray extends SVGArray {
   }
 
   // Resize path string
-  size (width, height) {
+  size(width, height) {
     // get bounding box of current situation
     const box = this.bbox()
     let i, l
@@ -144,8 +144,7 @@ export default class PathArray extends SVGArray {
   }
 
   // Convert array to string
-  toString () {
+  toString() {
     return arrayToString(this)
   }
-
 }
index 76fd98517f63f4394b3fce2d786654aac2941cce..5d447332bd3bdb4ebfc288d409743af96f552a59 100644 (file)
@@ -2,24 +2,24 @@ import Matrix from './Matrix.js'
 
 export default class Point {
   // Initialize
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
   // Clone point
-  clone () {
+  clone() {
     return new Point(this)
   }
 
-  init (x, y) {
+  init(x, y) {
     const base = { x: 0, y: 0 }
 
     // ensure source as object
     const source = Array.isArray(x)
       ? { x: x[0], y: x[1] }
       : typeof x === 'object'
-        ? { x: x.x, y: x.y }
-        : { x: x, y: y }
+      ? { x: x.x, y: x.y }
+      : { x: x, y: y }
 
     // merge source
     this.x = source.x == null ? base.x : source.x
@@ -28,16 +28,16 @@ export default class Point {
     return this
   }
 
-  toArray () {
-    return [ this.x, this.y ]
+  toArray() {
+    return [this.x, this.y]
   }
 
-  transform (m) {
+  transform(m) {
     return this.clone().transformO(m)
   }
 
   // Transform point with matrix
-  transformO (m) {
+  transformO(m) {
     if (!Matrix.isMatrixLike(m)) {
       m = new Matrix(m)
     }
@@ -50,9 +50,8 @@ export default class Point {
 
     return this
   }
-
 }
 
-export function point (x, y) {
+export function point(x, y) {
   return new Point(x, y).transformO(this.screenCTM().inverseO())
 }
index 69d0cd6fbf9d934cdb3ee99a5694214231fcabbe..f72c2bc8df0683af736dd7e39e06343eb7915dab 100644 (file)
@@ -5,7 +5,7 @@ import Matrix from './Matrix.js'
 
 export default class PointArray extends SVGArray {
   // Get bounding box of points
-  bbox () {
+  bbox() {
     let maxX = -Infinity
     let maxY = -Infinity
     let minX = Infinity
@@ -20,7 +20,7 @@ export default class PointArray extends SVGArray {
   }
 
   // Move point string
-  move (x, y) {
+  move(x, y) {
     const box = this.bbox()
 
     // get relative offset
@@ -30,7 +30,7 @@ export default class PointArray extends SVGArray {
     // move every point
     if (!isNaN(x) && !isNaN(y)) {
       for (let i = this.length - 1; i >= 0; i--) {
-        this[i] = [ this[i][0] + x, this[i][1] + y ]
+        this[i] = [this[i][0] + x, this[i][1] + y]
       }
     }
 
@@ -38,13 +38,14 @@ export default class PointArray extends SVGArray {
   }
 
   // Parse point string and flat array
-  parse (array = [ 0, 0 ]) {
+  parse(array = [0, 0]) {
     const points = []
 
     // if it is an array, we flatten it and therefore clone it to 1 depths
     if (array instanceof Array) {
       array = Array.prototype.concat.apply([], array)
-    } else { // Else, it is considered as a string
+    } else {
+      // Else, it is considered as a string
       // parse points
       array = array.trim().split(delimiter).map(parseFloat)
     }
@@ -55,28 +56,30 @@ export default class PointArray extends SVGArray {
 
     // wrap points in two-tuples
     for (let i = 0, len = array.length; i < len; i = i + 2) {
-      points.push([ array[i], array[i + 1] ])
+      points.push([array[i], array[i + 1]])
     }
 
     return points
   }
 
   // Resize poly string
-  size (width, height) {
+  size(width, height) {
     let i
     const box = this.bbox()
 
     // recalculate position of all points according to new size
     for (i = this.length - 1; i >= 0; i--) {
-      if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x
-      if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y
+      if (box.width)
+        this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x
+      if (box.height)
+        this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y
     }
 
     return this
   }
 
   // Convert array to line object
-  toLine () {
+  toLine() {
     return {
       x1: this[0][0],
       y1: this[0][1],
@@ -86,7 +89,7 @@ export default class PointArray extends SVGArray {
   }
 
   // Convert array to string
-  toString () {
+  toString() {
     const array = []
     // convert to a poly point string
     for (let i = 0, il = this.length; i < il; i++) {
@@ -96,24 +99,23 @@ export default class PointArray extends SVGArray {
     return array.join(' ')
   }
 
-  transform (m) {
+  transform(m) {
     return this.clone().transformO(m)
   }
 
   // transform points with matrix (similar to Point.transform)
-  transformO (m) {
+  transformO(m) {
     if (!Matrix.isMatrixLike(m)) {
       m = new Matrix(m)
     }
 
-    for (let i = this.length; i--;) {
+    for (let i = this.length; i--; ) {
       // Perform the matrix multiplication
-      const [ x, y ] = this[i]
+      const [x, y] = this[i]
       this[i][0] = m.a * x + m.c * y + m.e
       this[i][1] = m.b * x + m.d * y + m.f
     }
 
     return this
   }
-
 }
index 6ce024a3709d0242c5fa29f99418c4d631abd93f..5826406529376667154109c452c805325bd5acfa 100644 (file)
@@ -1,16 +1,16 @@
 import { delimiter } from '../modules/core/regex.js'
 
 export default class SVGArray extends Array {
-  constructor (...args) {
+  constructor(...args) {
     super(...args)
     this.init(...args)
   }
 
-  clone () {
+  clone() {
     return new this.constructor(this)
   }
 
-  init (arr) {
+  init(arr) {
     // This catches the case, that native map tries to create an array with new Array(1)
     if (typeof arr === 'number') return this
     this.length = 0
@@ -19,30 +19,29 @@ export default class SVGArray extends Array {
   }
 
   // Parse whitespace separated string
-  parse (array = []) {
+  parse(array = []) {
     // If already is an array, no need to parse it
     if (array instanceof Array) return array
 
     return array.trim().split(delimiter).map(parseFloat)
   }
 
-  toArray () {
+  toArray() {
     return Array.prototype.concat.apply([], this)
   }
 
-  toSet () {
+  toSet() {
     return new Set(this)
   }
 
-  toString () {
+  toString() {
     return this.join(' ')
   }
 
   // Flattens the array if needed
-  valueOf () {
+  valueOf() {
     const ret = []
     ret.push(...this)
     return ret
   }
-
 }
index 25c87c19d24c5beb942a5681661646c0453c57f3..5945341bdd8f7c9f75c882e63f1035627ff94119 100644 (file)
@@ -3,21 +3,21 @@ import { numberAndUnit } from '../modules/core/regex.js'
 // Module for unit conversions
 export default class SVGNumber {
   // Initialize
-  constructor (...args) {
+  constructor(...args) {
     this.init(...args)
   }
 
-  convert (unit) {
+  convert(unit) {
     return new SVGNumber(this.value, unit)
   }
 
   // Divide number
-  divide (number) {
+  divide(number) {
     number = new SVGNumber(number)
     return new SVGNumber(this / number, this.unit || number.unit)
   }
 
-  init (value, unit) {
+  init(value, unit) {
     unit = Array.isArray(value) ? value[1] : unit
     value = Array.isArray(value) ? value[0] : value
 
@@ -28,7 +28,13 @@ export default class SVGNumber {
     // parse value
     if (typeof value === 'number') {
       // ensure a valid numeric value
-      this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value
+      this.value = isNaN(value)
+        ? 0
+        : !isFinite(value)
+        ? value < 0
+          ? -3.4e38
+          : +3.4e38
+        : value
     } else if (typeof value === 'string') {
       unit = value.match(numberAndUnit)
 
@@ -57,42 +63,42 @@ export default class SVGNumber {
   }
 
   // Subtract number
-  minus (number) {
+  minus(number) {
     number = new SVGNumber(number)
     return new SVGNumber(this - number, this.unit || number.unit)
   }
 
   // Add number
-  plus (number) {
+  plus(number) {
     number = new SVGNumber(number)
     return new SVGNumber(this + number, this.unit || number.unit)
   }
 
   // Multiply number
-  times (number) {
+  times(number) {
     number = new SVGNumber(number)
     return new SVGNumber(this * number, this.unit || number.unit)
   }
 
-  toArray () {
-    return [ this.value, this.unit ]
+  toArray() {
+    return [this.value, this.unit]
   }
 
-  toJSON () {
+  toJSON() {
     return this.toString()
   }
 
-  toString () {
-    return (this.unit === '%'
-      ? ~~(this.value * 1e8) / 1e6
-      : this.unit === 's'
+  toString() {
+    return (
+      (this.unit === '%'
+        ? ~~(this.value * 1e8) / 1e6
+        : this.unit === 's'
         ? this.value / 1e3
-        : this.value
-    ) + this.unit
+        : this.value) + this.unit
+    )
   }
 
-  valueOf () {
+  valueOf() {
     return this.value
   }
-
 }
index 7e1c85ed5d24ba0fa190ceb80adbbc267b323c62..48814ec66fdb05204bb05ecc77d33527137eb01b 100644 (file)
@@ -8,12 +8,12 @@ const elements = {}
 export const root = '___SYMBOL___ROOT___'
 
 // Method for element creation
-export function create (name, ns = svg) {
+export function create(name, ns = svg) {
   // create element
   return globals.document.createElementNS(ns, name)
 }
 
-export function makeInstance (element, isHTML = false) {
+export function makeInstance(element, isHTML = false) {
   if (element instanceof Base) return element
 
   if (typeof element === 'object') {
@@ -41,12 +41,16 @@ export function makeInstance (element, isHTML = false) {
   return element
 }
 
-export function nodeOrNew (name, node) {
-  return (node && node.ownerDocument && node instanceof node.ownerDocument.defaultView.Node) ? node : create(name)
+export function nodeOrNew(name, node) {
+  return node &&
+    node.ownerDocument &&
+    node instanceof node.ownerDocument.defaultView.Node
+    ? node
+    : create(name)
 }
 
 // Adopt existing svg elements
-export function adopt (node) {
+export function adopt(node) {
   // check for presence of node
   if (!node) return null
 
@@ -64,7 +68,7 @@ export function adopt (node) {
   if (className === 'LinearGradient' || className === 'RadialGradient') {
     className = 'Gradient'
 
-  // Fallback to Dom if element is not known
+    // Fallback to Dom if element is not known
   } else if (!elements[className]) {
     className = 'Dom'
   }
@@ -74,11 +78,11 @@ export function adopt (node) {
 
 let adopter = adopt
 
-export function mockAdopt (mock = adopt) {
+export function mockAdopt(mock = adopt) {
   adopter = mock
 }
 
-export function register (element, name = element.name, asRoot = false) {
+export function register(element, name = element.name, asRoot = false) {
   elements[name] = element
   if (asRoot) elements[root] = element
 
@@ -87,7 +91,7 @@ export function register (element, name = element.name, asRoot = false) {
   return element
 }
 
-export function getClass (name) {
+export function getClass(name) {
   return elements[name]
 }
 
@@ -95,12 +99,12 @@ export function getClass (name) {
 let did = 1000
 
 // Get next named element id
-export function eid (name) {
-  return 'Svgjs' + capitalize(name) + (did++)
+export function eid(name) {
+  return 'Svgjs' + capitalize(name) + did++
 }
 
 // Deep new id assignment
-export function assignNewId (node) {
+export function assignNewId(node) {
   // do the same for SVG child nodes as well
   for (let i = node.children.length - 1; i >= 0; i--) {
     assignNewId(node.children[i])
@@ -115,10 +119,10 @@ export function assignNewId (node) {
 }
 
 // Method for extending objects
-export function extend (modules, methods) {
+export function extend(modules, methods) {
   let key, i
 
-  modules = Array.isArray(modules) ? modules : [ modules ]
+  modules = Array.isArray(modules) ? modules : [modules]
 
   for (i = modules.length - 1; i >= 0; i--) {
     for (key in methods) {
@@ -127,7 +131,7 @@ export function extend (modules, methods) {
   }
 }
 
-export function wrapWithAttrCheck (fn) {
+export function wrapWithAttrCheck(fn) {
   return function (...args) {
     const o = args[args.length - 1]
 
index 45525e39d7c99dd00d01d7d733ef35061ca1850e..9f61f916e7f5cc2a002119fab2f20e578c791d6e 100644 (file)
@@ -1,7 +1,7 @@
 const methods = {}
 const names = []
 
-export function registerMethods (name, m) {
+export function registerMethods(name, m) {
   if (Array.isArray(name)) {
     for (const _name of name) {
       registerMethods(_name, m)
@@ -20,14 +20,14 @@ export function registerMethods (name, m) {
   methods[name] = Object.assign(methods[name] || {}, m)
 }
 
-export function getMethodsFor (name) {
+export function getMethodsFor(name) {
   return methods[name] || {}
 }
 
-export function getMethodNames () {
-  return [ ...new Set(names) ]
+export function getMethodNames() {
+  return [...new Set(names)]
 }
 
-export function addMethodNames (_names) {
+export function addMethodNames(_names) {
   names.push(..._names)
 }
index 1d0ee8682bb5140d5284c544ce3e8a9bde49e96c..6d3f4e25ab930d91ae3f6c110f391ba0bd5da7b1 100644 (file)
@@ -1,57 +1,68 @@
 import { isPathLetter } from '../modules/core/regex.js'
 import Point from '../types/Point.js'
 
-const segmentParameters = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 }
+const segmentParameters = {
+  M: 2,
+  L: 2,
+  H: 1,
+  V: 1,
+  C: 6,
+  S: 4,
+  Q: 4,
+  T: 2,
+  A: 7,
+  Z: 0
+}
 
 const pathHandlers = {
   M: function (c, p, p0) {
     p.x = p0.x = c[0]
     p.y = p0.y = c[1]
 
-    return [ 'M', p.x, p.y ]
+    return ['M', p.x, p.y]
   },
   L: function (c, p) {
     p.x = c[0]
     p.y = c[1]
-    return [ 'L', c[0], c[1] ]
+    return ['L', c[0], c[1]]
   },
   H: function (c, p) {
     p.x = c[0]
-    return [ 'H', c[0] ]
+    return ['H', c[0]]
   },
   V: function (c, p) {
     p.y = c[0]
-    return [ 'V', c[0] ]
+    return ['V', c[0]]
   },
   C: function (c, p) {
     p.x = c[4]
     p.y = c[5]
-    return [ 'C', c[0], c[1], c[2], c[3], c[4], c[5] ]
+    return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]
   },
   S: function (c, p) {
     p.x = c[2]
     p.y = c[3]
-    return [ 'S', c[0], c[1], c[2], c[3] ]
+    return ['S', c[0], c[1], c[2], c[3]]
   },
   Q: function (c, p) {
     p.x = c[2]
     p.y = c[3]
-    return [ 'Q', c[0], c[1], c[2], c[3] ]
+    return ['Q', c[0], c[1], c[2], c[3]]
   },
   T: function (c, p) {
     p.x = c[0]
     p.y = c[1]
-    return [ 'T', c[0], c[1] ]
+    return ['T', c[0], c[1]]
   },
   Z: function (c, p, p0) {
     p.x = p0.x
     p.y = p0.y
-    return [ 'Z' ]
+    return ['Z']
   },
   A: function (c, p) {
     p.x = c[5]
     p.y = c[6]
-    return [ 'A', c[0], c[1], c[2], c[3], c[4], c[5], c[6] ]
+    return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]
   }
 }
 
@@ -76,26 +87,30 @@ for (let i = 0, il = mlhvqtcsaz.length; i < il; ++i) {
   })(mlhvqtcsaz[i].toUpperCase())
 }
 
-function makeAbsolut (parser) {
+function makeAbsolut(parser) {
   const command = parser.segment[0]
   return pathHandlers[command](parser.segment.slice(1), parser.p, parser.p0)
 }
 
-function segmentComplete (parser) {
-  return parser.segment.length && parser.segment.length - 1 === segmentParameters[parser.segment[0].toUpperCase()]
+function segmentComplete(parser) {
+  return (
+    parser.segment.length &&
+    parser.segment.length - 1 ===
+      segmentParameters[parser.segment[0].toUpperCase()]
+  )
 }
 
-function startNewSegment (parser, token) {
+function startNewSegment(parser, token) {
   parser.inNumber && finalizeNumber(parser, false)
   const pathLetter = isPathLetter.test(token)
 
   if (pathLetter) {
-    parser.segment = [ token ]
+    parser.segment = [token]
   } else {
     const lastCommand = parser.lastCommand
     const small = lastCommand.toLowerCase()
     const isSmall = lastCommand === small
-    parser.segment = [ small === 'm' ? (isSmall ? 'l' : 'L') : lastCommand ]
+    parser.segment = [small === 'm' ? (isSmall ? 'l' : 'L') : lastCommand]
   }
 
   parser.inSegment = true
@@ -104,7 +119,7 @@ function startNewSegment (parser, token) {
   return pathLetter
 }
 
-function finalizeNumber (parser, inNumber) {
+function finalizeNumber(parser, inNumber) {
   if (!parser.inNumber) throw new Error('Parser Error')
   parser.number && parser.segment.push(parseFloat(parser.number))
   parser.inNumber = inNumber
@@ -117,7 +132,7 @@ function finalizeNumber (parser, inNumber) {
   }
 }
 
-function finalizeSegment (parser) {
+function finalizeSegment(parser) {
   parser.inSegment = false
   if (parser.absolute) {
     parser.segment = makeAbsolut(parser)
@@ -125,7 +140,7 @@ function finalizeSegment (parser) {
   parser.segments.push(parser.segment)
 }
 
-function isArcFlag (parser) {
+function isArcFlag(parser) {
   if (!parser.segment.length) return false
   const isArc = parser.segment[0].toUpperCase() === 'A'
   const length = parser.segment.length
@@ -133,12 +148,11 @@ function isArcFlag (parser) {
   return isArc && (length === 4 || length === 5)
 }
 
-function isExponential (parser) {
+function isExponential(parser) {
   return parser.lastToken.toUpperCase() === 'E'
 }
 
-export function pathParser (d, toAbsolute = true) {
-
+export function pathParser(d, toAbsolute = true) {
   let index = 0
   let token = ''
   const parser = {
@@ -155,7 +169,7 @@ export function pathParser (d, toAbsolute = true) {
     p: new Point()
   }
 
-  while ((parser.lastToken = token, token = d.charAt(index++))) {
+  while (((parser.lastToken = token), (token = d.charAt(index++)))) {
     if (!parser.inSegment) {
       if (startNewSegment(parser, token)) {
         continue
@@ -175,7 +189,6 @@ export function pathParser (d, toAbsolute = true) {
     }
 
     if (!isNaN(parseInt(token))) {
-
       if (parser.number === '0' || isArcFlag(parser)) {
         parser.inNumber = true
         parser.number = token
@@ -233,5 +246,4 @@ export function pathParser (d, toAbsolute = true) {
   }
 
   return parser.segments
-
 }
index 7d08e22a51d97ea3cb4d5ef0964fa356bb81572a..c6e6d3b3fd32eb17361ca0ff99a2e53cb0539fb4 100644 (file)
@@ -1,5 +1,5 @@
 // Map function
-export function map (array, block) {
+export function map(array, block) {
   let i
   const il = array.length
   const result = []
@@ -12,7 +12,7 @@ export function map (array, block) {
 }
 
 // Filter function
-export function filter (array, block) {
+export function filter(array, block) {
   let i
   const il = array.length
   const result = []
@@ -27,43 +27,43 @@ export function filter (array, block) {
 }
 
 // Degrees to radians
-export function radians (d) {
-  return d % 360 * Math.PI / 180
+export function radians(d) {
+  return ((d % 360) * Math.PI) / 180
 }
 
 // Radians to degrees
-export function degrees (r) {
-  return r * 180 / Math.PI % 360
+export function degrees(r) {
+  return ((r * 180) / Math.PI) % 360
 }
 
 // Convert dash-separated-string to camelCase
-export function camelCase (s) {
+export function camelCase(s) {
   return s.toLowerCase().replace(/-(.)/g, function (m, g) {
     return g.toUpperCase()
   })
 }
 
 // Convert camel cased string to dash separated
-export function unCamelCase (s) {
+export function unCamelCase(s) {
   return s.replace(/([A-Z])/g, function (m, g) {
     return '-' + g.toLowerCase()
   })
 }
 
 // Capitalize first letter of a string
-export function capitalize (s) {
+export function capitalize(s) {
   return s.charAt(0).toUpperCase() + s.slice(1)
 }
 
 // Calculate proportional width and height values when necessary
-export function proportionalSize (element, width, height, box) {
+export function proportionalSize(element, width, height, box) {
   if (width == null || height == null) {
     box = box || element.bbox()
 
     if (width == null) {
-      width = box.width / box.height * height
+      width = (box.width / box.height) * height
     } else if (height == null) {
-      height = box.height / box.width * width
+      height = (box.height / box.width) * width
     }
   }
 
@@ -77,28 +77,20 @@ export function proportionalSize (element, width, height, box) {
  * This function adds support for string origins.
  * It searches for an origin in o.origin o.ox and o.originX.
  * This way, origin: {x: 'center', y: 50} can be passed as well as ox: 'center', oy: 50
-**/
-export function getOrigin (o, element) {
+ **/
+export function getOrigin(o, element) {
   const origin = o.origin
   // First check if origin is in ox or originX
-  let ox = o.ox != null
-    ? o.ox
-    : o.originX != null
-      ? o.originX
-      : 'center'
-  let oy = o.oy != null
-    ? o.oy
-    : o.originY != null
-      ? o.originY
-      : 'center'
+  let ox = o.ox != null ? o.ox : o.originX != null ? o.originX : 'center'
+  let oy = o.oy != null ? o.oy : o.originY != null ? o.originY : 'center'
 
   // Then check if origin was used and overwrite in that case
   if (origin != null) {
-    [ ox, oy ] = Array.isArray(origin)
+    ;[ox, oy] = Array.isArray(origin)
       ? origin
       : typeof origin === 'object'
-        ? [ origin.x, origin.y ]
-        : [ origin, origin ]
+      ? [origin.x, origin.y]
+      : [origin, origin]
   }
 
   // Make sure to only call bbox when actually needed
@@ -112,19 +104,19 @@ export function getOrigin (o, element) {
       ox = ox.includes('left')
         ? x
         : ox.includes('right')
-          ? x + width
-          : x + width / 2
+        ? x + width
+        : x + width / 2
     }
 
     if (condY) {
       oy = oy.includes('top')
         ? y
         : oy.includes('bottom')
-          ? y + height
-          : y + height / 2
+        ? y + height
+        : y + height / 2
     }
   }
 
   // Return the origin as it is if it wasn't a string
-  return [ ox, oy ]
+  return [ox, oy]
 }
index 626fde35665b5766ce8b3696f0390e5e79f0c381..5009c77fa88d8d1e1475c959947e36710f438931 100644 (file)
@@ -3,30 +3,30 @@ export const globals = {
   document: typeof document === 'undefined' ? null : document
 }
 
-export function registerWindow (win = null, doc = null) {
+export function registerWindow(win = null, doc = null) {
   globals.window = win
   globals.document = doc
 }
 
 const save = {}
 
-export function saveWindow () {
+export function saveWindow() {
   save.window = globals.window
   save.document = globals.document
 }
 
-export function restoreWindow () {
+export function restoreWindow() {
   globals.window = save.window
   globals.document = save.document
 }
 
-export function withWindow (win, fn) {
+export function withWindow(win, fn) {
   saveWindow()
   registerWindow(win, win.document)
   fn(win, win.document)
   restoreWindow()
 }
 
-export function getWindow () {
+export function getWindow() {
   return globals.window
 }
index a0c44c2a0b3854adcf3d6933826fd6c15315c848..dc61beebaefb89e591e6dfb47642a8f426b28321 100644 (file)
-// Type definitions for @svgdotjs version 3.x\r
-// Project: @svgdotjs/svg.js\r
-\r
-// trick to keep reference to Array build-in type\r
-declare class BuiltInArray<T> extends Array<T> { }\r
-\r
-// trick to have nice attribute list for CSS\r
-declare type CSSStyleName = Exclude<keyof CSSStyleDeclaration, "parentRule" | "length">\r
-\r
-declare module "@svgdotjs/svg.js" {\r
-\r
-    function SVG(): Svg;\r
-    function SVG(selector: QuerySelector): Element;\r
-    function SVG<T>(el: T): SVGTypeMapping<T>\r
-    function SVG(domElement: HTMLElement): Element;\r
-\r
-    function eid(name: string): string;\r
-    function get(id: string): Element;\r
-\r
-    function create(name: string): any;\r
-    function extend(parent: object, obj: object): void;\r
-    function invent(config: object): any;\r
-    function adopt(node: HTMLElement): Element;\r
-    function prepare(element: HTMLElement): void;\r
-    function getClass(name: string): Element;\r
-\r
-    function on(el: Node | Window, events: string, cb: EventListener, binbind?: any, options?: AddEventListenerOptions): void;\r
-    function on(el: Node | Window, events: Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions): void;\r
-\r
-    function off(el: Node | Window, events?: string, cb?: EventListener | number, options?: AddEventListenerOptions): void;\r
-    function off(el: Node | Window, events?: Event[], cb?: EventListener | number, options?: AddEventListenerOptions): void;\r
-\r
-    function dispatch(node: Node | Window, event: Event, data?: object, options?: object): Event\r
-\r
-    function find(query: QuerySelector): List<Element>\r
-    function findOne(query: QuerySelector): Element | null\r
-\r
-    function getWindow(): Window;\r
-    function registerWindow(win: Window, doc: Document): void;\r
-    function restoreWindow(): void;\r
-    function saveWindow(): void;\r
-    function withWindow(win: Window, fn: (win: Window, doc: Document) => void): void;\r
-\r
-    let utils: {\r
-        map(array: any[], block: Function): any;\r
-        filter(array: any[], block: Function): any;\r
-        radians(d: number): number;\r
-        degrees(r: number): number;\r
-        camelCase(s: string): string;\r
-        unCamelCase(s: string): string;\r
-        capitalize(s: string): string;\r
-        // proportionalSize\r
-        // getOrigin\r
-    }\r
-\r
-    let defaults: {\r
-        attrs: {\r
-            'fill-opacity': number;\r
-            'stroke-opacity': number;\r
-            'stroke-width': number;\r
-            'stroke-linejoin': string;\r
-            'stroke-linecap': string;\r
-            'fill': string;\r
-            'stroke': string;\r
-            'opacity': number;\r
-            'x': number;\r
-            'y': number;\r
-            'cx': number;\r
-            'cy': number;\r
-            'width': number;\r
-            'height': number;\r
-            'r': number;\r
-            'rx': number;\r
-            'ry': number;\r
-            'offset': number;\r
-            'stop-opacity': number;\r
-            'stop-color': string;\r
-            'font-size': number;\r
-            'font-family': string;\r
-            'text-anchor': string;\r
-        },\r
-        timeline: {\r
-            duration: number;\r
-            ease: string;\r
-            delay: number;\r
-        }\r
-\r
-    }\r
-\r
-    // let easing: {\r
-    //     '-'(pos: number): number;\r
-    //     '<>'(pos: number): number;\r
-    //     '>'(pos: number): number;\r
-    //     '<'(pos: number): number;\r
-    //     bezier(x1: number, y1: number, x2: number, y2: number): (t: number) => number;\r
-    //     steps(steps: number, stepPosition?: "jump-start"|"jump-end"|"jump-none"|"jump-both"|"start"|"end"): (t: number, beforeFlag?: boolean) => number;\r
-    // }\r
-\r
-    let regex: {\r
-        delimiter: RegExp;\r
-        dots: RegExp;\r
-        hex: RegExp;\r
-        hyphen: RegExp;\r
-        isBlank: RegExp;\r
-        isHex: RegExp;\r
-        isImage: RegExp;\r
-        isNumber: RegExp;\r
-        isPathLetter: RegExp;\r
-        isRgb: RegExp;\r
-        numberAndUnit: RegExp;\r
-        numbersWithDots: RegExp;\r
-        pathLetters: RegExp;\r
-        reference: RegExp;\r
-        rgb: RegExp;\r
-        transforms: RegExp;\r
-        whitespace: RegExp;\r
-    }\r
-\r
-    let namespaces: {\r
-        ns: string;\r
-        xmlns: string;\r
-        xlink: string;\r
-        svgjs: string;\r
-    }\r
-\r
-    interface LinkedHTMLElement extends HTMLElement {\r
-        instance: Element;\r
-    }\r
-\r
-    // ************ Standard object/option/properties declaration ************\r
-\r
-    type AttrNumberValue = number | "auto";\r
-\r
-    /**\r
-     * The SVG core attributes are all the common attributes that can be specified on any SVG element.\r
-     * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Core\r
-     */\r
-    interface CoreAttr {\r
-        id?: string\r
-        lang?: string\r
-        tabindex?: number\r
-        "xml:lang"?: string\r
-    }\r
-\r
-    /**\r
-     * The SVG styling attributes are all the attributes that can be specified on any SVG element to apply CSS styling effects.\r
-     * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Styling\r
-     */\r
-    interface StylingAttr {\r
-        /**\r
-         * a valid HTML class name\r
-         */\r
-        class?: string\r
-        /**\r
-         * SVG css style string format. It all can be find here https://www.w3.org/TR/SVG/styling.html#StyleAttribute\r
-         */\r
-        style?: string\r
-    }\r
-\r
-    /**\r
-     * A global attribute that can be use with any svg element\r
-     */\r
-    interface GlobalAttr extends CoreAttr, StylingAttr { }\r
-\r
-    // TODO: implement SVG Presentation Attributes. See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation\r
-\r
-    interface PathBaseAttr {\r
-        pathLength?: number\r
-    }\r
-\r
-    interface RadiusAxisAttr {\r
-        rx?: AttrNumberValue\r
-        ry?: AttrNumberValue\r
-    }\r
-\r
-    /**\r
-     * SVG Rectangle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect\r
-     */\r
-    interface RectAttr extends RadiusAxisAttr, PathBaseAttr, GlobalAttr {\r
-        x?: number\r
-        y?: number\r
-        width: AttrNumberValue\r
-        height: AttrNumberValue\r
-    }\r
-\r
-    /**\r
-     * SVG Line attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line\r
-     */\r
-    interface LineAttr extends PathBaseAttr, GlobalAttr {\r
-        x1?: number\r
-        y1?: number\r
-        x2?: number\r
-        y2?: number\r
-    }\r
-\r
-    /**\r
-     * SVG Circle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle\r
-     */\r
-    interface CircleAttr extends PathBaseAttr, GlobalAttr {\r
-        cx?: number | string\r
-        cy?: number | string\r
-        r?: number | string\r
-    }\r
-\r
-    /**\r
-     * SVG Ellipse attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse\r
-     */\r
-    interface EllipseAttr extends PathBaseAttr, GlobalAttr {\r
-        cx?: number | string\r
-        cy?: number | string\r
-        rx?: number | string\r
-        ry?: number | string\r
-    }\r
-\r
-    /**\r
-     * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path\r
-     */\r
-    interface PathAttr extends PathBaseAttr, GlobalAttr {\r
-        d?: string\r
-    }\r
-\r
-    /**\r
-     * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon\r
-     * or https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline\r
-     */\r
-    interface PolyAttr extends PathBaseAttr, GlobalAttr {\r
-        points?: string\r
-    }\r
-\r
-    /**\r
-     * SVG Text attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/text\r
-     */\r
-    interface TextAttr extends GlobalAttr {\r
-        x?: number | string\r
-        y?: number | string\r
-        dx?: number | string\r
-        dy?: number | string\r
-        lengthAdjust?: "spacing" | "spacingAndGlyphs"\r
-        textLength?: number | string\r
-        // see https://developer.mozilla.org/en-US/docs/Web/API/SVGNumberList\r
-        // or https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#List-of-Ts\r
-        // TODO: tbd\r
-        // rotate?: string\r
-    }\r
-\r
-    /**\r
-     * SVG TextPath attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath\r
-     */\r
-    interface TextPathAttr extends GlobalAttr {\r
-        href?: string\r
-        lengthAdjust?: "spacing" | "spacingAndGlyphs"\r
-        method?: "align" | "stretch"\r
-        side?: "left" | "right"\r
-        spacing?: "auto" | "exact"\r
-        startOffset?: number | string\r
-        textLength?: number | string\r
-        // See https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath\r
-        // TODO: tbd as there is no reference to see the detail of how it would look like\r
-        // path?: string\r
-    }\r
-\r
-    /**\r
-     * A generic Dom Box object.\r
-     * Notice: DOMRect is still in experiment state and document is not complete (Draft)\r
-     * See https://developer.mozilla.org/en-US/docs/Web/API/DOMRect\r
-     */\r
-    interface DOMRect {\r
-        x?: number\r
-        y?: number\r
-        width?: number\r
-        height?: number\r
-        top?: number\r
-        right?: number\r
-        bottom?: number\r
-        left?: number\r
-    }\r
-\r
-    // ************ SVG.JS generic Conditional Types declaration ************\r
-\r
-    type SVGTypeMapping<T> =\r
-        T extends HTMLElement ? Dom :\r
-        T extends SVGSVGElement ? Svg :\r
-        T extends SVGRectElement ? Rect :\r
-        T extends SVGCircleElement ? Circle :\r
-        T extends SVGPathElement ? Path :\r
-        T extends SVGTextElement ? Text :\r
-        T extends SVGTextPathElement ? TextPath :\r
-        T extends SVGGElement ? G :\r
-        T extends SVGLineElement ? Line :\r
-        T extends SVGPolylineElement ? Polyline :\r
-        T extends SVGPolygonElement ? Polygon :\r
-        T extends SVGGradientElement ? Gradient :\r
-        T extends SVGImageElement ? Image :\r
-        T extends SVGEllipseElement ? Ellipse :\r
-        T extends SVGMaskElement ? Mask :\r
-        T extends SVGMarkerElement ? Marker :\r
-        T extends SVGClipPathElement ? ClipPath :\r
-        T extends SVGTSpanElement ? Tspan :\r
-        T extends SVGSymbolElement ? Symbol :\r
-        T extends SVGUseElement ? Use : Element\r
-\r
-    // element type as string\r
-    type SvgType = "svg"\r
-    type ClipPathType = "clipPath"\r
-    type TextType = "text"\r
-    type GType = "g"\r
-    type AType = "a"\r
-\r
-    type ParentElement = SvgType | GType | AType\r
-\r
-    type AttrTypeMapping<T> =\r
-        T extends Rect ? RectAttr : GlobalAttr\r
-\r
-    type ElementAlias = Dom | Svg | Rect | Line | Polygon | Polyline | Ellipse | ClipPath | Use |\r
-        Text | Path | TextPath | Circle | G | Gradient | Image | Element\r
-\r
-    type ElementTypeAlias = typeof Dom | typeof Svg | typeof Rect | typeof Line | typeof Polygon |\r
-        typeof Polyline | typeof Ellipse | typeof ClipPath | typeof Use | typeof Text | typeof Path |\r
-        typeof TextPath | typeof Circle | typeof G | typeof Gradient | typeof Image | typeof Element\r
-\r
-    type AttributeReference = "href" | "marker-start" | "marker-mid" | "marker-end" | "mask" |\r
-        "clip-path" | "filter" | "fill"\r
-\r
-    // ************* SVG.JS Type Declaration *************\r
-    // ********** Locate in directory src/types **********\r
-\r
-    // SVGArray.js\r
-    // Notice: below class is defined the name as `Array` rather than `SVGArray`.\r
-    // The purpose of giving the name as `Array` is to allow it to be aligned with SVG.JS export type\r
-    // as SVG.JS export it as `Array` (to be precise `SVG.Array`) so reading through JS documentation\r
-    // should be more straightforward.\r
-    /**\r
-     * Type alias to native array.\r
-     *\r
-     * **Caution**: If argument is a string, generic type must be a number or array of number and\r
-     * the string is format as a concatenate of number separate by comma.\r
-     * This is expensive to build runtime type check for such as case so please use it carefully.\r
-     */\r
-    type ArrayAlias<T> = BuiltInArray<T> | T[] | string\r
-\r
-    class Array<T> extends BuiltInArray<T> {\r
-        constructor(array?: ArrayAlias<T>);\r
-\r
-        /**\r
-         * Return array of generic T however it's flatten array by 1 level as it using `apply` function.\r
-         * For example: if T is a `number[]` which is the number of 2 dimension `Array<number[]>` the result will be `number[]`\r
-         */\r
-        toArray(): any[]\r
-        /**\r
-         * return a concatenated string of each element separated by space\r
-         */\r
-        toString(): string\r
-        valueOf(): T[]\r
-        clone(): Array<T>\r
-        toSet(): Set<T>\r
-        parse(a?: ArrayAlias<T>): T[]\r
-        to(a: any): Morphable;\r
-    }\r
-\r
-    // point.js\r
-    class Point {\r
-        x: number;\r
-        y: number;\r
-        constructor();\r
-        constructor(position: CoordinateXY);\r
-        constructor(point: Point);\r
-        constructor(x: number, y?: number);\r
-        clone(): Point;\r
-        transform(matrix: Matrix): this;\r
-        transformO(matrix: Matrix): this;\r
-        toArray(): ArrayXY;\r
-    }\r
-\r
-    // pointArray.js\r
-    class PointArray extends Array<ArrayXY> {\r
-        constructor();\r
-        constructor(array?: ArrayAlias<ArrayXY> | number[]);\r
-\r
-        toLine(): LineAttr;\r
-        transform(m: Matrix | MatrixLike): PointArray\r
-        move(x: number, y: number): this;\r
-        size(width: number, height: number): this;\r
-        bbox(): Box;\r
-        to(a: any): Morphable;\r
-        toString(): string;\r
-    }\r
-\r
-    // SVGNumber.js\r
-    type NumberUnit = [number, string]\r
-\r
-    class Number {\r
-        constructor();\r
-        constructor(value: Number);\r
-        constructor(value: string);\r
-        constructor(value: number, unit?: any);\r
-        constructor(n: NumberUnit);\r
-\r
-        value: number\r
-        unit: any\r
-\r
-        toString(): string;\r
-        toJSON(): object;  // same as toString\r
-        toArray(): NumberUnit\r
-        valueOf(): number;\r
-        plus(number: NumberAlias): Number;\r
-        minus(number: NumberAlias): Number;\r
-        times(number: NumberAlias): Number;\r
-        divide(number: NumberAlias): Number;\r
-        convert(unit: string): Number;\r
-        to(a: any): Morphable\r
-    }\r
-\r
-    type NumberAlias = Number | number | string;\r
-\r
-    // PathArray.js\r
-\r
-    type LineCommand = ['M' | 'm' | 'L' | 'l', number, number] | ['H' | 'h' | 'V' | 'v', number] | ['Z' | 'z']\r
-\r
-    type CurveCommand =\r
-        // Bezier Curves\r
-        ['C' | 'c', number, number, number, number, number, number] |\r
-        ['S' | 's' | 'Q' | 'q', number, number, number, number] | ['T' | 't', number, number] |\r
-        // Arcs\r
-        ['A' | 'a', number, number, number, number, number, number, number]\r
-\r
-    type PathCommand = LineCommand | CurveCommand\r
-\r
-    type PathArrayAlias = PathArray | PathCommand[] | (string | number)[] | string;\r
-\r
-    class PathArray extends Array<PathCommand> {\r
-        constructor();\r
-        constructor(d: ArrayAlias<PathCommand> | PathArrayAlias);\r
-\r
-        move(x: number, y: number): this;\r
-        size(width: number, height: number): this;\r
-        equalCommands(other: PathArray): boolean\r
-        morph(pa: PathArray): this\r
-        parse(array?: ArrayAlias<PathCommand> | PathArrayAlias): PathCommand[];\r
-        bbox(): Box;\r
-        to(a: any): Morphable\r
-    }\r
-\r
-    // Matrix.js\r
-    interface TransformData {\r
-        origin?: number[];\r
-        scaleX?: number;\r
-        scaleY?: number;\r
-        shear?: number;\r
-        rotate?: number;\r
-        translateX?: number;\r
-        translateY?: number;\r
-        originX?: number;\r
-        originY?: number;\r
-    }\r
-\r
-    interface MatrixLike {\r
-        a?: number;\r
-        b?: number;\r
-        c?: number;\r
-        d?: number;\r
-        e?: number;\r
-        f?: number;\r
-    }\r
-\r
-    interface MatrixExtract extends TransformData, MatrixLike { }\r
-\r
-    type FlipType = 'both' | 'x' | 'y' | boolean\r
-    type ArrayXY = [number, number]\r
-    type CoordinateXY = ArrayXY | { x: number, y: number }\r
-\r
-    interface MatrixTransformParam {\r
-        rotate?: number\r
-        flip?: FlipType\r
-        skew?: ArrayXY | number\r
-        skewX?: number\r
-        skewY?: number\r
-        scale?: ArrayXY | number\r
-        scaleX?: number\r
-        scaleY?: number\r
-        shear?: number\r
-        theta?: number\r
-        origin?: CoordinateXY | string\r
-        around?: CoordinateXY\r
-        ox?: number\r
-        originX?: number\r
-        oy?: number\r
-        originY?: number\r
-        position?: CoordinateXY\r
-        px?: number\r
-        positionX?: number\r
-        py?: number\r
-        positionY?: number\r
-        translate?: CoordinateXY\r
-        tx?: number\r
-        translateX?: number\r
-        ty?: number\r
-        translateY?: number\r
-        relative?: CoordinateXY\r
-        rx?: number\r
-        relativeX?: number\r
-        ry?: number\r
-        relativeY?: number\r
-    }\r
-\r
-    type MatrixAlias = MatrixLike | TransformData | MatrixTransformParam | number[] | Element | string;\r
-\r
-    class Matrix implements MatrixLike {\r
-        constructor();\r
-        constructor(source: MatrixAlias);\r
-        constructor(a: number, b: number, c: number, d: number, e: number, f: number);\r
-\r
-        a: number;\r
-        b: number;\r
-        c: number;\r
-        d: number;\r
-        e: number;\r
-        f: number;\r
-\r
-        // *** To Be use by Test Only in restrict mode ***\r
-        [key: string]: any\r
-\r
-        clone(): Matrix;\r
-        transform(o: MatrixLike | MatrixTransformParam): Matrix\r
-        compose(o: MatrixExtract): Matrix\r
-        decompose(cx?: number, cy?: number): MatrixExtract\r
-        multiply(m: MatrixAlias | Matrix): Matrix;\r
-        multiplyO(m: MatrixAlias | Matrix): this;\r
-        lmultiply(m: MatrixAlias | Matrix): Matrix;\r
-        lmultiplyO(m: MatrixAlias | Matrix): this;\r
-        inverse(): Matrix;\r
-        inverseO(): this;\r
-        translate(x?: number, y?: number): Matrix;\r
-        translateO(x?: number, y?: number): this;\r
-        scale(x: number, y?: number, cx?: number, cy?: number): Matrix;\r
-        scaleO(x: number, y?: number, cx?: number, cy?: number): this;\r
-        rotate(r: number, cx?: number, cy?: number): Matrix;\r
-        rotateO(r: number, cx?: number, cy?: number): this;\r
-        flip(a: NumberAlias, offset?: number): Matrix;\r
-        flipO(a: NumberAlias, offset?: number): this;\r
-        flip(offset?: number): Matrix;\r
-        shear(a: number, cx?: number, cy?: number): Matrix;\r
-        shearO(a: number, cx?: number, cy?: number): this;\r
-        skew(y?: number, cx?: number, cy?: number): Matrix;\r
-        skewO(y?: number, cx?: number, cy?: number): this;\r
-        skew(x: number, y?: number, cx?: number, cy?: number): Matrix;\r
-        skewX(x: number, cx?: number, cy?: number): Matrix;\r
-        skewY(y: number, cx?: number, cy?: number): Matrix;\r
-        around(cx?: number, cy?: number, matrix?: Matrix): Matrix;\r
-        aroundO(cx?: number, cy?: number, matrix?: Matrix): this;\r
-        equals(m: Matrix): boolean\r
-        toString(): string;\r
-        toArray(): number[];\r
-        valueOf(): MatrixLike;\r
-        to(a: any): Morphable;\r
-    }\r
-\r
-    type ListEachCallback<T> = (el: T, index: number, list: List<T>) => any;\r
-\r
-    // List.js\r
-    class List<T> extends BuiltInArray<T> {\r
-        each(fn: ListEachCallback<T>): List<any>;\r
-        each(name: string, ...args: any[]): List<any>;\r
-        toArray(): T[];\r
-    }\r
-\r
-    class Eventobject {\r
-        [key: string]: Eventobject;\r
-    }\r
-\r
-    // EventTarget.js\r
-    class EventTarget {\r
-        events: Eventobject\r
-\r
-        addEventListener(): void\r
-        dispatch(event: Event | string, data?: object): Event\r
-        dispatchEvent(event: Event): boolean\r
-        fire(event: Event | string, data?: object): this\r
-        getEventHolder(): this | Node\r
-        getEventTarget(): this | Node\r
-\r
-        on(events: string | Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions): this;\r
-        off(events?: string | Event[], cb?: EventListener | number, options?: AddEventListenerOptions): this;\r
-\r
-        removeEventListener(): void\r
-    }\r
-\r
-    // Color.js\r
-    interface ColorLike {\r
-        r: number;\r
-        g: number;\r
-        b: number;\r
-\r
-        x: number;\r
-        y: number;\r
-        z: number;\r
-\r
-        h: number;\r
-        s: number;\r
-        l: number;\r
-        a: number;\r
-        c: number;\r
-\r
-        m: number;\r
-        k: number;\r
-\r
-        space: string;\r
-    }\r
-\r
-    type ColorAlias = string | ColorLike;\r
-\r
-    class Color implements ColorLike {\r
-        r: number;\r
-        g: number;\r
-        b: number;\r
-\r
-        x: number;\r
-        y: number;\r
-        z: number;\r
-\r
-        h: number;\r
-        s: number;\r
-        l: number;\r
-        a: number;\r
-        c: number;\r
-\r
-        m: number;\r
-        k: number;\r
-\r
-        space: string;\r
-        constructor()\r
-        constructor(color: ColorAlias, space?: string);\r
-        constructor(a: number, b: number, c: number, space?: string)\r
-        constructor(a: number, b: number, c: number, d: number, space?: string)\r
-        constructor(a: number[], space?: string)\r
-\r
-        rgb(): Color\r
-        lab(): Color\r
-        xyz(): Color\r
-        lch(): Color\r
-        hsl(): Color\r
-        cmyk(): Color\r
-        toHex(): string\r
-        toString(): string\r
-        toRgb(): string\r
-        toArray(): any[]\r
-\r
-        to(a: any): Morphable\r
-        fromArray(a: any): this\r
-\r
-        static random(mode: 'sine', time?: number): Color\r
-        static random(mode?: string): Color\r
-    }\r
-\r
-    // Box.js\r
-    interface BoxLike {\r
-        height: number;\r
-        width: number;\r
-        y: number;\r
-        x: number;\r
-        cx?: number;\r
-        cy?: number;\r
-        w?: number;\r
-        h?: number;\r
-        x2?: number;\r
-        y2?: number;\r
-    }\r
-\r
-    class Box implements BoxLike {\r
-        height: number;\r
-        width: number;\r
-        y: number;\r
-        x: number;\r
-        cx: number;\r
-        cy: number;\r
-        w: number;\r
-        h: number;\r
-        x2: number;\r
-        y2: number;\r
-\r
-        constructor();\r
-        constructor(source: string);\r
-        constructor(source: number[]);\r
-        constructor(source: DOMRect);\r
-        constructor(x: number, y: number, width: number, height: number);\r
-\r
-        merge(box: BoxLike): Box;\r
-        transform(m: Matrix): Box\r
-        addOffset(): this;\r
-        toString(): string;\r
-        toArray(): number[];\r
-        isNulled(): boolean;\r
-        to(v: MorphValueLike): Morphable;\r
-    }\r
-\r
-    // Morphable.js\r
-    type MorphValueLike = string | number | objectBag | NonMorphable | MatrixExtract | Array<any> | any[]\r
-\r
-    class Morphable {\r
-        constructor();\r
-        constructor(st: Stepper);\r
-\r
-        from(): MorphValueLike\r
-        from(v: MorphValueLike): this\r
-        to(): MorphValueLike\r
-        to(v: MorphValueLike): this\r
-        type(): any\r
-        type(t: any): this\r
-        stepper(): Stepper\r
-        stepper(st: Stepper): this\r
-        done(): boolean\r
-        at(pos: number): any\r
-    }\r
-\r
-    class objectBag {\r
-        constructor();\r
-        constructor(a: object);\r
-        valueOf(): object\r
-        toArray(): object[]\r
-\r
-        to(a: object): Morphable\r
-        fromArray(a: any[]): this\r
-    }\r
-\r
-    class NonMorphable {\r
-        constructor(a: object)\r
-        valueOf(): object\r
-        toArray(): object[]\r
-\r
-        to(a: object): Morphable\r
-        fromArray(a: object): this\r
-    }\r
-\r
-    class TransformBag {\r
-        constructor()\r
-        constructor(a: number[])\r
-        constructor(a: TransformData)\r
-        defaults: TransformData\r
-        toArray(): number[]\r
-        to(t: TransformData): Morphable\r
-        fromArray(t: number[]): this\r
-    }\r
-\r
-    interface Stepper {\r
-        done(c?: object): boolean\r
-    }\r
-\r
-    class Ease implements Stepper {\r
-        constructor()\r
-        constructor(fn: string)\r
-        constructor(fn: Function)\r
-\r
-        step(from: number, to: number, pos: number): number\r
-        done(): boolean\r
-    }\r
-\r
-    class Controller implements Stepper {\r
-        constructor(fn?: Function)\r
-        step(current: number, target: number, dt: number, c: number): number\r
-        done(c?: object): boolean\r
-    }\r
-\r
-    // Queue.js\r
-    interface QueueParam {\r
-        value: any\r
-        next?: any\r
-        prev?: any\r
-    }\r
-\r
-    class Queue {\r
-        constructor();\r
-\r
-        push(value: any): QueueParam\r
-        shift(): any\r
-        first(): number\r
-        last(): number\r
-        remove(item: QueueParam): void\r
-    }\r
-\r
-    // Timeline.js\r
-    interface ScheduledRunnerInfo {\r
-        start: number\r
-        duration: number\r
-        end: number\r
-        runner: Runner\r
-    }\r
-\r
-    class Timeline extends EventTarget {\r
-        constructor()\r
-        constructor(fn: Function)\r
-\r
-        active(): boolean\r
-        schedule(runner: Runner, delay?: number, when?: string): this\r
-        schedule(): ScheduledRunnerInfo[]\r
-        unschedule(runner: Runner): this\r
-        getEndTime(): number\r
-        updateTime(): this\r
-        persist(dtOrForever?: number | boolean): this\r
-        play(): this\r
-        pause(): this\r
-        stop(): this\r
-        finish(): this\r
-        speed(speed: number): this\r
-        reverse(yes: boolean): this\r
-        seek(dt: number): this\r
-        time(): number\r
-        time(time: number): this\r
-        source(): Function\r
-        source(fn: Function): this\r
-    }\r
-\r
-    // Runner.js\r
-    interface TimesParam {\r
-        duration: number\r
-        delay: number\r
-        when: number | string\r
-        swing: boolean\r
-        wait: number\r
-        times: number\r
-    }\r
-\r
-    type TimeLike = number | TimesParam | Stepper\r
-\r
-    type EasingCallback = (...any: any) => number\r
-    type EasingLiteral = "<>" | "-" | "<" | ">"\r
-\r
-    class Runner {\r
-        constructor();\r
-        constructor(options: Function);\r
-        constructor(options: number);\r
-        constructor(options: Controller);\r
-\r
-        static sanitise: (duration?: TimeLike, delay?: number, when?: string) => object\r
-\r
-        element(): Element\r
-        element(el: Element): this\r
-        timeline(): Timeline\r
-        timeline(timeline: Timeline): this\r
-        animate(duration: TimeLike, delay?: number, when?: string): this\r
-        schedule(delay: number, when?: string): this\r
-        schedule(timeline: Timeline, delay?: number, when?: string): this\r
-        unschedule(): this\r
-        loop(times?: number, swing?: boolean, wait?: number): this\r
-        loop(times: TimesParam): this\r
-        delay(delay: number): this\r
-\r
-\r
-\r
-        during(fn: Function): this\r
-        queue(initFn: Function, runFn: Function, retargetFn?: boolean | Function, isTransform?: boolean): this\r
-        after(fn: EventListener): this\r
-        time(): number\r
-        time(time: number): this\r
-        duration(): number\r
-        loops(): number\r
-        loops(p: number): this\r
-        persist(dtOrForever?: number | boolean): this\r
-        position(): number\r
-        position(p: number): this\r
-        progress(): number\r
-        progress(p: number): this\r
-        step(deta?: number): this\r
-        reset(): this\r
-        finish(): this\r
-        reverse(r?: boolean): this\r
-        ease(fn: EasingCallback): this\r
-        ease(kind: EasingLiteral): this\r
-        active(): boolean\r
-        active(a: boolean): this\r
-        addTransform(m: Matrix): this\r
-        clearTransform(): this\r
-        clearTransformsFromQueue(): void\r
-\r
-        // extends prototypes\r
-        attr(a: string | object, v?: string): this\r
-        css(s: string | object, v?: string): this\r
-        styleAttr(type: string, name: string | object, val?: string): this\r
-        zoom(level: NumberAlias, point?: Point): this\r
-        transform(transforms: MatrixTransformParam, relative?: boolean, affine?: boolean): this\r
-        x(x: number): this\r
-        y(y: number): this\r
-        dx(dx: number): this\r
-        dy(dy: number): this\r
-        cx(x: number): this\r
-        cy(y: number): this\r
-        dmove(dx: number, dy: number): this\r
-        move(x: number, y: number): this\r
-        center(x: number, y: number): this\r
-        size(width: number, height: number): this\r
-        width(width: number): this\r
-        height(height: number): this\r
-        plot(a: object): this\r
-        plot(a: number, b: number, c: number, d: number): this\r
-        leading(value: number): this\r
-        viewbox(x: number, y: number, width: number, height: number): this\r
-        update(offset: number, color: number, opacity: number): this\r
-        update(o: StopProperties): this\r
-        rx(): number\r
-        rx(rx: number): this\r
-        ry(): number\r
-        ry(ry: number): this\r
-        from(x: NumberAlias, y: NumberAlias): this\r
-        to(x: NumberAlias, y: NumberAlias): this\r
-    }\r
-\r
-    // Animator.js\r
-    let Animator: {\r
-        nextDraw: any\r
-        frames: Queue\r
-        timeouts: Queue\r
-        immediates: Queue\r
-\r
-        timer(): boolean\r
-        frame(fn: Function): object\r
-        timeout(fn: Function, delay?: number): object\r
-        immediate(fn: Function): object\r
-        cancelFrame(o: object): void\r
-        clearTimeout(o: object): void\r
-        cancelImmediate(o: object): void\r
-    }\r
-\r
-    /**\r
-     * Just fancy type alias to refer to css query selector.\r
-     */\r
-    type QuerySelector = string\r
-\r
-    class Dom extends EventTarget {\r
-        node: HTMLElement | SVGElement;\r
-        type: string;\r
-\r
-        constructor(node?: HTMLElement, attr?: object);\r
-        constructor(att: object);\r
-        add(element: Element, i?: number): this;\r
-        addTo(parent: Dom | HTMLElement | string, i?: number): this\r
-        children(): List<Element>;\r
-        clear(): this;\r
-        clone(deep?: boolean, assignNewIds?: boolean): this;\r
-        each(block: (index: number, children: Element[]) => void, deep?: boolean): this;\r
-        element(element: string, inherit?: object): this;\r
-        first(): Element;\r
-        get(i: number): Element;\r
-        getEventHolder(): LinkedHTMLElement;\r
-        getEventTarget(): LinkedHTMLElement;\r
-        has(element: Element): boolean;\r
-        id(): string\r
-        id(id: string): this\r
-        index(element: Element): number;\r
-        last(): Element;\r
-        matches(selector: string): boolean;\r
-        /**\r
-         * Finds the closest ancestor which matches the string or is of passed type. If nothing is passed, the parent is returned\r
-         * @param type can be either string, svg.js object or undefined.\r
-         */\r
-        parent(type?: ElementTypeAlias | QuerySelector): Dom | null;\r
-        put(element: Element, i?: number): Element;\r
-        /**\r
-         * Put the element into the given parent element and returns the parent element\r
-         * @param parent The parent in which the current element is inserted\r
-         */\r
-        putIn(parent: ElementAlias | Node | QuerySelector): Dom;\r
-\r
-        remove(): this;\r
-        removeElement(element: Element): this;\r
-        replace<T extends Dom>(element: T): T;\r
-        round(precision?: number, map?: string[]): this\r
-        svg(): string;\r
-        svg(a: string, outer: true): Element;\r
-        svg(a: string, outer?: false): this;\r
-        svg(a: boolean, outer?: boolean): string;\r
-        svg(a: null | Function, outer?: boolean): string;\r
-\r
-        toString(): string;\r
-        words(text: string): this;\r
-        writeDataToDom(): this;\r
-\r
-        // prototype extend Attribute in attr.js\r
-        /**\r
-         * Get the attribute object of SVG Element. The return object will be vary based on\r
-         * the instance itself. For example, G element will only return GlobalAttr where Rect\r
-         * will return RectAttr instead.\r
-         */\r
-        attr(): any;\r
-        /**\r
-         * Add or update the attribute from the SVG Element. To remove the attribute from the element set value to null\r
-         * @param name name of attribute\r
-         * @param value value of attribute can be string or number or null\r
-         * @param namespace optional string that define namespace\r
-         */\r
-        attr(name: string, value: any, namespace?: string): this;\r
-        attr(name: string): any;\r
-        attr(obj: object): this;\r
-        attr(obj: string[]): object;\r
-\r
-        // prototype extend Selector in selector.js\r
-        find(query: string): List<Element>\r
-        findOne(query: string): Dom | null\r
-\r
-        // prototype method register in data.js\r
-        data(a: string): object | string | number\r
-        data(a: string, v: object, substain?: boolean): this\r
-        data(a: object): this\r
-\r
-        // prototype method register in arrange.js\r
-        siblings(): List<Element>\r
-        position(): number\r
-        next(): Element\r
-        prev(): Element\r
-        forward(): this\r
-        backward(): this\r
-        front(): this\r
-        back(): this\r
-        before(el: Element): Element\r
-        after(el: Element): Element\r
-        insertBefore(el: Element): this\r
-        insertAfter(el: Element): this\r
-\r
-        // prototype method register in class.js\r
-        classes(): string[]\r
-        hasClass(name: string): boolean\r
-        addClass(name: string): this\r
-        removeClass(name: string): this\r
-        toggleClass(name: string): this\r
-\r
-        // prototype method register in css.js\r
-        css(): Partial<CSSStyleDeclaration>\r
-        css<T extends CSSStyleName>(style: T): CSSStyleDeclaration[T]\r
-        css<T extends CSSStyleName[]>(style: T): Partial<CSSStyleDeclaration>\r
-        css<T extends CSSStyleName>(style: T, val: CSSStyleDeclaration[T]): this\r
-        css(style: Partial<CSSStyleDeclaration>): this\r
-        show(): this\r
-        hide(): this\r
-        visible(): boolean\r
-\r
-        // memory.js\r
-        remember(name: string, value: any): this;\r
-        remember(name: string): any;\r
-        remember(obj: object): this;\r
-        forget(...keys: string[]): this;\r
-        forget(): this;\r
-        memory(): object;\r
-\r
-        addEventListener(): void\r
-        dispatch(event: Event | string, data?: object): Event\r
-        dispatchEvent(event: Event): boolean\r
-        fire(event: Event | string, data?: object): this\r
-        getEventHolder(): this | Node\r
-        getEventTarget(): this | Node\r
-\r
-        // on(events: string | Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions): this;\r
-        // off(events?: string | Event[], cb?: EventListener | number): this;\r
-        removeEventListener(): void\r
-    }\r
-\r
-    // clip.js\r
-    class ClipPath extends Container {\r
-        constructor();\r
-        constructor(node?: SVGClipPathElement);\r
-        constructor(attr: object);\r
-        node: SVGClipPathElement;\r
-\r
-        targets(): List<Element>;\r
-        remove(): this;\r
-    }\r
-\r
-    // container.js\r
-    interface ViewBoxLike {\r
-        x: number;\r
-        y: number;\r
-        width: number;\r
-        height: number;\r
-    }\r
-\r
-    class Container extends Element {\r
-        circle(size?: NumberAlias): Circle;\r
-        circle(size: number, unit: number): Circle;\r
-        clip(): ClipPath;\r
-        ellipse(width?: number, height?: number): Ellipse;\r
-        flatten(parent: Dom, depth?: number): this;\r
-        foreignObject(width: number, height: number): ForeignObject\r
-        gradient(type: string, block?: (stop: Gradient) => void): Gradient;\r
-        group(): G;\r
-\r
-        image(): Image;\r
-        image(href?: string, callback?: (e: Event) => void): Image;\r
-        line(points?: PointArrayAlias): Line;\r
-        line(x1: number, y1: number, x2: number, y2: number): Line;\r
-        link(url: string): A;\r
-        marker(width?: number, height?: number, block?: (marker: Marker) => void): Marker\r
-        mask(): Mask;\r
-        nested(): Svg;\r
-        path(): Path;\r
-        path(d: PathArrayAlias): Path;\r
-        pattern(width?: number, height?: number, block?: (pattern: Pattern) => void): Pattern\r
-        plain(text: string): Text;\r
-        polygon(points?: PointArrayAlias): Polygon;\r
-        polyline(points?: PointArrayAlias): Polyline;\r
-        rect(width?: number, height?: number): Rect;\r
-        style(): Style;\r
-        text(block: (tspan: Tspan) => void): Text;\r
-        text(text: string): Text;\r
-        ungroup(parent: Dom, depth?: number): this;\r
-        use(element: Element | string, file?: string): Use;\r
-        viewbox(): Box;\r
-        viewbox(viewbox: ViewBoxLike | string): this;\r
-        viewbox(x: number, y: number, width: number, height: number): this;\r
-        textPath(text: string | Text, path: string | Path): TextPath\r
-        symbol(): Symbol\r
-        zoom(): number\r
-        zoom(level: NumberAlias, point?: Point): this;\r
-    }\r
-\r
-    class Defs extends Container {\r
-        constructor(node?: SVGDefsElement);\r
-        node: SVGDefsElement;\r
-        marker(width?: number, height?: number, block?: (marker: Marker) => void): Marker\r
-    }\r
-\r
-    class Svg extends Container {\r
-        constructor(svgElement?: SVGSVGElement);\r
-        constructor(id: string);\r
-        node: SVGSVGElement;\r
-        namespace(): this;\r
-        defs(): Defs;\r
-        remove(): this;\r
-        isRoot(): boolean;\r
-    }\r
-\r
-    interface Sugar {\r
-        fill(): any\r
-        fill(fill: FillData): this;\r
-        fill(color: string): this;\r
-        fill(pattern: Element): this;\r
-        fill(image: Image): this;\r
-        stroke(): any;\r
-        stroke(stroke: StrokeData): this;\r
-        stroke(color: string): this;\r
-        matrix(a?: number, b?: number, c?: number, d?: number, e?: number, f?: number): this;\r
-        matrix(mat: MatrixAlias, b?: number, c?: number, d?: number, e?: number, f?: number): this;\r
-        rotate(degrees: number, cx?: number, cy?: number): this;\r
-        skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this;\r
-        scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this;\r
-        translate(x: number, y: number): this;\r
-        shear(lam: Matrix, cx: number, cy: number): this\r
-        relative(x: number, y: number): this\r
-        flip(direction?: string, around?: number): this\r
-        flip(around: number): this\r
-        opacity(): number\r
-        opacity(value: number): this\r
-        font(a: string): string\r
-        font(a: string, v: string | number): this\r
-        font(a: object): this\r
-    }\r
-\r
-    // Symbol.js\r
-    class Symbol extends Container {\r
-        constructor(svgElement?: SVGSymbolElement);\r
-        constructor(attr: object)\r
-        node: SVGSymbolElement;\r
-    }\r
-\r
-    class Element extends Dom implements Sugar {\r
-        constructor(node?: SVGElement);\r
-        constructor(attr: object);\r
-        node: SVGElement;\r
-        type: string;\r
-        dom: any\r
-\r
-        addClass(name: string): this;\r
-        after(element: Element): Element;\r
-        animate(duration?: TimeLike, delay?: number, when?: string): Runner;\r
-        delay(by: number, when?: string): Runner\r
-        attr(): any;\r
-        attr(name: string, value: any, namespace?: string): this;\r
-        attr(name: string): any;\r
-        attr(obj: string[]): object;\r
-        attr(obj: object): this;\r
-        back(): this;\r
-        backward(): this;\r
-        bbox(): Box;\r
-        before(element: Element): Element;\r
-        center(x: number, y: number): this;\r
-        classes(): string[];\r
-        click(cb: Function | null): this;\r
-        clipper(): ClipPath;\r
-        clipWith(element: Element): this;\r
-        clone(deep?: boolean, assignNewIds?: boolean): this;\r
-        ctm(): Matrix;\r
-        cx(): number;\r
-        cx(x: number): this;\r
-        cy(): number;\r
-        cy(y: number): this;\r
-        data(name: string, value: any, sustain?: boolean): this;\r
-        data(name: string): any;\r
-        data(val: object): this;\r
-        dblclick(cb: Function | null): this;\r
-        defs(): Defs;\r
-        dmove(x: NumberAlias, y: NumberAlias): this;\r
-        dx(x: NumberAlias): this;\r
-        dy(y: NumberAlias): this;\r
-        event(): Event | CustomEvent;\r
-        fill(): any;\r
-        fill(color: string): this;\r
-        fill(color: Color | ColorLike): this;\r
-        fill(color: FillData): this;\r
-        fill(pattern: Element): this;\r
-        fire(event: Event): this;\r
-        fire(event: string, data?: any): this;\r
-        flip(a: string, offset?: number): this;\r
-        flip(offset?: number): this;\r
-        font(a: object): this\r
-        font(a: string, v: string | number): this\r
-        font(a: string): string\r
-        forget(...keys: string[]): this;\r
-        forget(): this;\r
-        forward(): this;\r
-        front(): this;\r
-        hasClass(name: string): boolean;\r
-        height(): NumberAlias;\r
-        height(height: NumberAlias): this;\r
-        hide(): this;\r
-        hide(): this;\r
-        id(): string;\r
-        id(id: string): this;\r
-        inside(x: number, y: number): boolean;\r
-        is(cls: any): boolean;\r
-        linkTo(url: (link: A) => void): A;\r
-        linkTo(url: string): A;\r
-        masker(): Mask\r
-        maskWith(element: Element): this;\r
-        maskWith(mask: Mask): this;\r
-        matches(selector: string): boolean;\r
-        matrix(): Matrix;\r
-        matrix(a?: number, b?: number, c?: number, d?: number, e?: number, f?: number): this;\r
-        matrix(mat: MatrixAlias, b?: number, c?: number, d?: number, e?: number, f?: number): this;\r
-        matrixify(): Matrix;\r
-        memory(): object;\r
-        mousedown(cb: Function | null): this;\r
-        mousemove(cb: Function | null): this;\r
-        mouseout(cb: Function | null): this;\r
-        mouseover(cb: Function | null): this;\r
-        mouseup(cb: Function | null): this;\r
-        mouseenter(cb: Function | null): this;\r
-        mouseleave(cb: Function | null): this;\r
-        move(x: NumberAlias, y: NumberAlias): this;\r
-        native(): LinkedHTMLElement;\r
-        next(): Element;\r
-        // off(events?: string | Event[], cb?: EventListener | number): this;\r
-        // on(event: string, cb: Function, context?: object): this;\r
-        opacity(): number;\r
-        opacity(o: number): this;\r
-        relative(x: number, y: number): this\r
-        shear(lam: Matrix, cx: number, cy: number): this\r
-        toRoot(): Svg;\r
-        /**\r
-         * By default parents will return a list of elements up until the root svg.\r
-         */\r
-        parents(): List<Element>\r
-        /**\r
-         * List the parent by hierarchy until the given parent type or matcher. If the given value is null\r
-         * then the result is only provided the list up until Svg root element which mean no Dom parent element is included.\r
-         * @param util a parent type\r
-         */\r
-        parents<T extends Dom>(util: QuerySelector | T | null): List<Element>\r
-        /**\r
-         * Get reference svg element based on the given attribute.\r
-         * @param attr a svg attribute\r
-         */\r
-        reference<R extends Dom>(attr: AttributeReference): R | null\r
-\r
-        point(): Point;\r
-        point(position: CoordinateXY): Point;\r
-        point(point: Point): Point;\r
-        point(x: number, y: number): Point;\r
-        position(): number;\r
-        prev(): Element;\r
-        rbox(element?: Element): Box;\r
-        reference(type: string): Element;\r
-        remember(name: string, value: any): this;\r
-        remember(name: string): any;\r
-        remember(obj: object): this;\r
-        remove(): this;\r
-        removeClass(name: string): this;\r
-        root(): Svg;\r
-        rotate(d: number, cx?: number, cy?: number): this;\r
-        scale(x?: number, y?: number, cx?: number, cy?: number): this;\r
-        screenCTM(): Matrix;\r
-        setData(data: object): this;\r
-        show(): this;\r
-        show(): this;\r
-        size(width?: NumberAlias, height?: NumberAlias): this;\r
-        skew(x?: number, y?: number, cx?: number, cy?: number): this;\r
-        stop(jumpToEnd: boolean, clearQueue: boolean): Animation;\r
-        stop(offset?: NumberAlias | string, color?: NumberAlias, opacity?: NumberAlias): Stop;\r
-        stop(val: { offset?: NumberAlias | string, color?: NumberAlias, opacity?: NumberAlias }): Stop;\r
-        stroke(): any;\r
-        stroke(color: string): this;\r
-        stroke(stroke: StrokeData): this;\r
-        timeline(): Timeline\r
-        timeline(tl: Timeline): this\r
-        toggleClass(name: string): this;\r
-        toParent(parent: Dom): this;\r
-        toParent(parent: Dom, i: number): this;\r
-        toSvg(): this;\r
-        touchcancel(cb: Function | null): this;\r
-        touchend(cb: Function | null): this;\r
-        touchleave(cb: Function | null): this;\r
-        touchmove(cb: Function | null): this;\r
-        touchstart(cb: Function | null): this;\r
-        transform(): MatrixExtract;\r
-        transform(t: MatrixAlias, relative?: boolean): this;\r
-        translate(x: number, y: number): this;\r
-        unclip(): this;\r
-        unmask(): this;\r
-        untransform(): this;\r
-        visible(): boolean;\r
-        width(): NumberAlias;\r
-        width(width: NumberAlias): this;\r
-        x(): NumberAlias;\r
-        x(x: NumberAlias): this;\r
-        y(): NumberAlias;\r
-        y(y: NumberAlias): this;\r
-    }\r
-\r
-    // ellipse.js\r
-    interface CircleMethods extends Shape {\r
-        rx(rx: number): this;\r
-        rx(): this;\r
-        ry(ry: number): this;\r
-        ry(): this;\r
-        radius(x: number, y?: number): this;\r
-    }\r
-    class Circle extends Shape implements CircleMethods {\r
-        constructor(node?: SVGCircleElement);\r
-        constructor(attr: CircleAttr)\r
-\r
-        node: SVGCircleElement;\r
-\r
-        rx(rx: number): this;\r
-        rx(): this;\r
-        ry(ry: number): this;\r
-        ry(): this;\r
-        radius(x: number, y?: number): this;\r
-    }\r
-    class Ellipse extends Shape implements CircleMethods {\r
-        node: SVGEllipseElement;\r
-        constructor(attr: EllipseAttr)\r
-        constructor(node?: SVGEllipseElement);\r
-\r
-        rx(rx: number): this;\r
-        rx(): this;\r
-        ry(ry: number): this;\r
-        ry(): this;\r
-        radius(x: number, y?: number): this;\r
-    }\r
-\r
-    interface StopProperties {\r
-        color?: ColorAlias;\r
-        offset?: number | string;\r
-        opacity?: number;\r
-    }\r
-\r
-    // gradient.js\r
-    class Stop extends Element {\r
-        update(offset?: number, color?: ColorAlias, opacity?: number): this;\r
-        update(opts: StopProperties): this;\r
-    }\r
-    class Gradient extends Container {\r
-        constructor(node?: SVGGradientElement);\r
-        constructor(attr: object);\r
-        constructor(type: string);\r
-        node: SVGGradientElement;\r
-\r
-        at(offset?: number, color?: ColorAlias, opacity?: number): Stop;\r
-        at(opts: StopProperties): Stop;\r
-        url(): string;\r
-        toString(): string;\r
-        targets(): List<Element>\r
-        bbox(): Box\r
-\r
-        // gradiented.js\r
-        from(x: number, y: number): this;\r
-        to(x: number, y: number): this;\r
-\r
-        // TODO: check with main.js\r
-        radius(x: number, y?: number): this;\r
-        targets(): List<Element>\r
-        bbox(): Box\r
-        update(block?: (gradient: Gradient) => void): this;\r
-    }\r
-\r
-    // group.js\r
-    class G extends Container {\r
-        constructor(node?: SVGGElement);\r
-        constructor(attr: object);\r
-        node: SVGGElement;\r
-        gbox(): Box;\r
-    }\r
-\r
-    // hyperlink.js\r
-    class A extends Container {\r
-        constructor(node?: SVGAElement);\r
-        constructor(attr: object);\r
-        node: SVGAElement;\r
-        to(url: string): this;\r
-        to(): string;\r
-        target(target: string): this;\r
-        target(): string;\r
-    }\r
-\r
-\r
-    // ForeignObject.js\r
-    class ForeignObject extends Element {\r
-        constructor(node?: SVGForeignObjectElement, attrs?: object);\r
-        constructor(attrs?: object);\r
-        add(element: Dom, i?: number): this;\r
-    }\r
-\r
-    // image.js\r
-    class Image extends Shape {\r
-        constructor(node?: SVGImageElement);\r
-        constructor(attr: object);\r
-        node: SVGImageElement;\r
-        load(url?: string, callback?: (event: Event) => void): this;\r
-    }\r
-\r
-    // line.js\r
-    type PointArrayAlias = number[] | ArrayXY[] | PointArray | string;\r
-\r
-    class Line extends Shape {\r
-        constructor(attr: LineAttr)\r
-        constructor(node?: SVGLineElement);\r
-\r
-        node: SVGLineElement;\r
-\r
-        array(): PointArray;\r
-        plot(): PointArray\r
-        plot(points?: PointArrayAlias): this;\r
-        plot(x1: number, y1: number, x2: number, y2: number): this;\r
-        move(x: number, y: number): this;\r
-        size(width?: number, height?: number): this;\r
-        marker(position: string, width?: number, height?: number, block?: (marker: Marker) => void): Marker;\r
-        marker(position: string, marker: Marker): Marker;\r
-    }\r
-\r
-    // marker.js\r
-    // TODO: check register method marker\r
-    class Marker extends Container {\r
-        constructor();\r
-\r
-        node: SVGMarkerElement;\r
-\r
-        ref(x: string | number, y: string | number): this;\r
-        update(block: (marker: Marker) => void): this;\r
-        toString(): string;\r
-        orient(orientation: 'auto' | 'auto-start-reverse' | number | Number): this;\r
-        orient(): string;\r
-    }\r
-    // mask.js\r
-    class Mask extends Container {\r
-        constructor(node?: SVGMaskElement);\r
-        constructor(attr: object);\r
-        node: SVGMaskElement;\r
-        remove(): this\r
-        targets(): List<Element>;\r
-    }\r
-\r
-    // path.js\r
-    class Path extends Shape {\r
-        constructor(attr: PathAttr)\r
-        constructor(node?: SVGPathElement);\r
-\r
-        node: SVGPathElement;\r
-\r
-        morphArray: PathArray;\r
-        array(): PathArray;\r
-        plot(): PathArray;\r
-        plot(d: PathArrayAlias): this;\r
-        marker(position: string, width?: number, height?: number, block?: (marker: Marker) => void): this;\r
-        marker(position: string, marker: Marker): this;\r
-\r
-        // sugar.js\r
-        length(): number;\r
-        pointAt(length: number): { x: number, y: number };\r
-        text(text: string): TextPath\r
-        text(text: Text): TextPath\r
-        targets(): List<Element>\r
-\r
-    }\r
-\r
-\r
-    // pattern.js\r
-    class Pattern extends Container {\r
-        url(): string;\r
-        url(...rest: any[]): never;\r
-        update(block: (pattern: Pattern) => void): this;\r
-        toString(): string;\r
-    }\r
-\r
-    // poly.js\r
-    interface poly {\r
-        array(): PointArray;\r
-        plot(): PointArray\r
-        plot(p: PointArrayAlias): this;\r
-        clear(): this;\r
-        move(x: number, y: number): this;\r
-        size(width: number, height?: number): this;\r
-    }\r
-\r
-    // pointed.js\r
-    interface pointed {\r
-        x(): number\r
-        x(x: number): this\r
-        y(): number\r
-        y(y: number): this\r
-        height(): number\r
-        height(h: number): this\r
-        width(): number\r
-        width(w: number): this\r
-    }\r
-\r
-    class Polyline extends Shape implements poly, pointed {\r
-        constructor(node?: SVGPolylineElement);\r
-        constructor(attr: PolyAttr);\r
-\r
-        node: SVGPolylineElement;\r
-\r
-        array(): PointArray;\r
-        plot(): PointArray\r
-        plot(p: PointArrayAlias): this;\r
-        x(): number;\r
-        x(x: number): this\r
-        y(): number;\r
-        y(y: number): this\r
-        height(): number\r
-        height(h: number): this\r
-        width(): number\r
-        width(w: number): this\r
-        move(x: number, y: number): this;\r
-        size(width: number, height?: number): this;\r
-        marker(position: string, width?: number, height?: number, block?: (marker: Marker) => void): Marker;\r
-        marker(position: string, marker: Marker): Marker;\r
-    }\r
-\r
-    class Polygon extends Shape implements poly, pointed {\r
-        constructor(node?: SVGPolygonElement);\r
-        constructor(attr: PolyAttr)\r
-\r
-        node: SVGPolygonElement;\r
-        array(): PointArray;\r
-        plot(): PointArray;\r
-        plot(p: PointArrayAlias): this;\r
-        x(): number;\r
-        x(x: number): this\r
-        y(): number;\r
-        y(y: number): this\r
-        height(): number\r
-        height(h: number): this\r
-        width(): number\r
-        width(w: number): this\r
-        move(x: number, y: number): this;\r
-        size(width: number, height?: number): this;\r
-        marker(position: string, width?: number, height?: number, block?: (marker: Marker) => void): Marker;\r
-        marker(position: string, marker: Marker): Marker;\r
-    }\r
-\r
-    class Rect extends Shape {\r
-        constructor(node?: SVGRectElement);\r
-        constructor(attr: RectAttr)\r
-        node: SVGRectElement;\r
-        radius(x: number, y?: number): this;\r
-    }\r
-\r
-    // shape.js\r
-    class Shape extends Element {\r
-    }\r
-\r
-    // sugar.js\r
-    interface StrokeData {\r
-        color?: string;\r
-        width?: number;\r
-        opacity?: number;\r
-        linecap?: string;\r
-        linejoin?: string;\r
-        miterlimit?: number;\r
-        dasharray?: string;\r
-        dashoffset?: number;\r
-    }\r
-\r
-    interface FillData {\r
-        color?: string\r
-        opacity?: number\r
-        rule?: string\r
-    }\r
-\r
-    interface FontData {\r
-        family?: string;\r
-        size?: NumberAlias;\r
-        anchor?: string;\r
-        leading?: NumberAlias;\r
-        weight?: string;\r
-        style?: string\r
-    }\r
-    // textable.js\r
-    interface Textable {\r
-        plain(text: string): this;\r
-        length(): number;\r
-    }\r
-\r
-    // text.js\r
-    class Text extends Shape implements Textable {\r
-        constructor(node?: SVGElement);\r
-        constructor(attr: TextAttr)\r
-\r
-        clone(): this;\r
-        text(): string;\r
-        text(text: string): this;\r
-        text(block: (text: this) => void): this;\r
-        leading(): Number;\r
-        leading(leading: NumberAlias): this;\r
-        rebuild(enabled: boolean): this;\r
-        build(enabled: boolean): this;\r
-        clear(): this;\r
-        plain(text: string): this;\r
-        length(): number;\r
-        get(i: number): Tspan;\r
-        path(): TextPath\r
-        path(d: PathArrayAlias | Path): TextPath;\r
-        track(): Element;\r
-        ax(): string\r
-        ax(x: string): this\r
-        ay(): string\r
-        ay(y: string): this\r
-        amove(x: number, y: number): this\r
-        textPath(): TextPath\r
-\r
-        // main.js, from extend/copy prototypes from Tspan\r
-        tspan(text: string): Tspan;\r
-        tspan(block: (tspan: Tspan) => void): this;\r
-    }\r
-\r
-    class Tspan extends Text implements Textable {\r
-        constructor(node?: SVGElement);\r
-        constructor(attr: TextAttr);\r
-        dx(): number;\r
-        dx(x: NumberAlias): this;\r
-        dy(): number;\r
-        dy(y: NumberAlias): this;\r
-        newLine(): this;\r
-        tspan(text: string): Tspan;\r
-        tspan(block: (tspan: Tspan) => void): this;\r
-        length(): number;\r
-        text(): string;\r
-        text(text: string): this;\r
-        text(block: (text: this) => void): this;\r
-        plain(text: string): this;\r
-    }\r
-\r
-    // textpath.js\r
-    class TextPath extends Text {\r
-        constructor();\r
-        constructor(attr: TextPathAttr)\r
-\r
-        array(): Array<any>\r
-        plot(): PathArray\r
-        plot(d: string): this\r
-        track(): Path\r
-    }\r
-\r
-    // style.js\r
-    class Style extends Element {\r
-        constructor(node: SVGElement, attr?: StylingAttr);\r
-        addText(text: string): this;\r
-        font(a: object): this\r
-        font(a: string, v: string | number): this\r
-        font(a: string): string\r
-        rule(selector: string, obj: any): this;\r
-    }\r
-\r
-    // use.js\r
-    class Use extends Shape {\r
-        use(element: string, file?: string): this;\r
-    }\r
-\r
-    // viewbox.js\r
-    type ViewBoxAlias = ViewBoxLike | number[] | string | Element;\r
-\r
-    interface ViewBox {\r
-        x: number;\r
-        y: number;\r
-        width: number;\r
-        height: number;\r
-        toString(): string;\r
-        at(pos: number): ViewBox;\r
-    }\r
-}\r
+// Type definitions for @svgdotjs version 3.x
+// Project: @svgdotjs/svg.js
+
+// trick to keep reference to Array build-in type
+declare class BuiltInArray<T> extends Array<T> {}
+
+// trick to have nice attribute list for CSS
+declare type CSSStyleName = Exclude<
+  keyof CSSStyleDeclaration,
+  'parentRule' | 'length'
+>
+
+declare module '@svgdotjs/svg.js' {
+  function SVG(): Svg
+  function SVG(selector: QuerySelector): Element
+  function SVG<T>(el: T): SVGTypeMapping<T>
+  function SVG(domElement: HTMLElement): Element
+
+  function eid(name: string): string
+  function get(id: string): Element
+
+  function create(name: string): any
+  function extend(parent: object, obj: object): void
+  function invent(config: object): any
+  function adopt(node: HTMLElement): Element
+  function prepare(element: HTMLElement): void
+  function getClass(name: string): Element
+
+  function on(
+    el: Node | Window,
+    events: string,
+    cb: EventListener,
+    binbind?: any,
+    options?: AddEventListenerOptions
+  ): void
+  function on(
+    el: Node | Window,
+    events: Event[],
+    cb: EventListener,
+    binbind?: any,
+    options?: AddEventListenerOptions
+  ): void
+
+  function off(
+    el: Node | Window,
+    events?: string,
+    cb?: EventListener | number,
+    options?: AddEventListenerOptions
+  ): void
+  function off(
+    el: Node | Window,
+    events?: Event[],
+    cb?: EventListener | number,
+    options?: AddEventListenerOptions
+  ): void
+
+  function dispatch(
+    node: Node | Window,
+    event: Event,
+    data?: object,
+    options?: object
+  ): Event
+
+  function find(query: QuerySelector): List<Element>
+  function findOne(query: QuerySelector): Element | null
+
+  function getWindow(): Window
+  function registerWindow(win: Window, doc: Document): void
+  function restoreWindow(): void
+  function saveWindow(): void
+  function withWindow(
+    win: Window,
+    fn: (win: Window, doc: Document) => void
+  ): void
+
+  let utils: {
+    map(array: any[], block: Function): any
+    filter(array: any[], block: Function): any
+    radians(d: number): number
+    degrees(r: number): number
+    camelCase(s: string): string
+    unCamelCase(s: string): string
+    capitalize(s: string): string
+    // proportionalSize
+    // getOrigin
+  }
+
+  let defaults: {
+    attrs: {
+      'fill-opacity': number
+      'stroke-opacity': number
+      'stroke-width': number
+      'stroke-linejoin': string
+      'stroke-linecap': string
+      fill: string
+      stroke: string
+      opacity: number
+      x: number
+      y: number
+      cx: number
+      cy: number
+      width: number
+      height: number
+      r: number
+      rx: number
+      ry: number
+      offset: number
+      'stop-opacity': number
+      'stop-color': string
+      'font-size': number
+      'font-family': string
+      'text-anchor': string
+    }
+    timeline: {
+      duration: number
+      ease: string
+      delay: number
+    }
+  }
+
+  // let easing: {
+  //     '-'(pos: number): number;
+  //     '<>'(pos: number): number;
+  //     '>'(pos: number): number;
+  //     '<'(pos: number): number;
+  //     bezier(x1: number, y1: number, x2: number, y2: number): (t: number) => number;
+  //     steps(steps: number, stepPosition?: "jump-start"|"jump-end"|"jump-none"|"jump-both"|"start"|"end"): (t: number, beforeFlag?: boolean) => number;
+  // }
+
+  let regex: {
+    delimiter: RegExp
+    dots: RegExp
+    hex: RegExp
+    hyphen: RegExp
+    isBlank: RegExp
+    isHex: RegExp
+    isImage: RegExp
+    isNumber: RegExp
+    isPathLetter: RegExp
+    isRgb: RegExp
+    numberAndUnit: RegExp
+    numbersWithDots: RegExp
+    pathLetters: RegExp
+    reference: RegExp
+    rgb: RegExp
+    transforms: RegExp
+    whitespace: RegExp
+  }
+
+  let namespaces: {
+    ns: string
+    xmlns: string
+    xlink: string
+    svgjs: string
+  }
+
+  interface LinkedHTMLElement extends HTMLElement {
+    instance: Element
+  }
+
+  // ************ Standard object/option/properties declaration ************
+
+  type AttrNumberValue = number | 'auto'
+
+  /**
+   * The SVG core attributes are all the common attributes that can be specified on any SVG element.
+   * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Core
+   */
+  interface CoreAttr {
+    id?: string
+    lang?: string
+    tabindex?: number
+    'xml:lang'?: string
+  }
+
+  /**
+   * The SVG styling attributes are all the attributes that can be specified on any SVG element to apply CSS styling effects.
+   * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Styling
+   */
+  interface StylingAttr {
+    /**
+     * a valid HTML class name
+     */
+    class?: string
+    /**
+     * SVG css style string format. It all can be find here https://www.w3.org/TR/SVG/styling.html#StyleAttribute
+     */
+    style?: string
+  }
+
+  /**
+   * A global attribute that can be use with any svg element
+   */
+  interface GlobalAttr extends CoreAttr, StylingAttr {}
+
+  // TODO: implement SVG Presentation Attributes. See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation
+
+  interface PathBaseAttr {
+    pathLength?: number
+  }
+
+  interface RadiusAxisAttr {
+    rx?: AttrNumberValue
+    ry?: AttrNumberValue
+  }
+
+  /**
+   * SVG Rectangle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect
+   */
+  interface RectAttr extends RadiusAxisAttr, PathBaseAttr, GlobalAttr {
+    x?: number
+    y?: number
+    width: AttrNumberValue
+    height: AttrNumberValue
+  }
+
+  /**
+   * SVG Line attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line
+   */
+  interface LineAttr extends PathBaseAttr, GlobalAttr {
+    x1?: number
+    y1?: number
+    x2?: number
+    y2?: number
+  }
+
+  /**
+   * SVG Circle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle
+   */
+  interface CircleAttr extends PathBaseAttr, GlobalAttr {
+    cx?: number | string
+    cy?: number | string
+    r?: number | string
+  }
+
+  /**
+   * SVG Ellipse attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse
+   */
+  interface EllipseAttr extends PathBaseAttr, GlobalAttr {
+    cx?: number | string
+    cy?: number | string
+    rx?: number | string
+    ry?: number | string
+  }
+
+  /**
+   * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path
+   */
+  interface PathAttr extends PathBaseAttr, GlobalAttr {
+    d?: string
+  }
+
+  /**
+   * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon
+   * or https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline
+   */
+  interface PolyAttr extends PathBaseAttr, GlobalAttr {
+    points?: string
+  }
+
+  /**
+   * SVG Text attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/text
+   */
+  interface TextAttr extends GlobalAttr {
+    x?: number | string
+    y?: number | string
+    dx?: number | string
+    dy?: number | string
+    lengthAdjust?: 'spacing' | 'spacingAndGlyphs'
+    textLength?: number | string
+    // see https://developer.mozilla.org/en-US/docs/Web/API/SVGNumberList
+    // or https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#List-of-Ts
+    // TODO: tbd
+    // rotate?: string
+  }
+
+  /**
+   * SVG TextPath attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath
+   */
+  interface TextPathAttr extends GlobalAttr {
+    href?: string
+    lengthAdjust?: 'spacing' | 'spacingAndGlyphs'
+    method?: 'align' | 'stretch'
+    side?: 'left' | 'right'
+    spacing?: 'auto' | 'exact'
+    startOffset?: number | string
+    textLength?: number | string
+    // See https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath
+    // TODO: tbd as there is no reference to see the detail of how it would look like
+    // path?: string
+  }
+
+  /**
+   * A generic Dom Box object.
+   * Notice: DOMRect is still in experiment state and document is not complete (Draft)
+   * See https://developer.mozilla.org/en-US/docs/Web/API/DOMRect
+   */
+  interface DOMRect {
+    x?: number
+    y?: number
+    width?: number
+    height?: number
+    top?: number
+    right?: number
+    bottom?: number
+    left?: number
+  }
+
+  // ************ SVG.JS generic Conditional Types declaration ************
+
+  type SVGTypeMapping<T> = T extends HTMLElement
+    ? Dom
+    : T extends SVGSVGElement
+    ? Svg
+    : T extends SVGRectElement
+    ? Rect
+    : T extends SVGCircleElement
+    ? Circle
+    : T extends SVGPathElement
+    ? Path
+    : T extends SVGTextElement
+    ? Text
+    : T extends SVGTextPathElement
+    ? TextPath
+    : T extends SVGGElement
+    ? G
+    : T extends SVGLineElement
+    ? Line
+    : T extends SVGPolylineElement
+    ? Polyline
+    : T extends SVGPolygonElement
+    ? Polygon
+    : T extends SVGGradientElement
+    ? Gradient
+    : T extends SVGImageElement
+    ? Image
+    : T extends SVGEllipseElement
+    ? Ellipse
+    : T extends SVGMaskElement
+    ? Mask
+    : T extends SVGMarkerElement
+    ? Marker
+    : T extends SVGClipPathElement
+    ? ClipPath
+    : T extends SVGTSpanElement
+    ? Tspan
+    : T extends SVGSymbolElement
+    ? Symbol
+    : T extends SVGUseElement
+    ? Use
+    : Element
+
+  // element type as string
+  type SvgType = 'svg'
+  type ClipPathType = 'clipPath'
+  type TextType = 'text'
+  type GType = 'g'
+  type AType = 'a'
+
+  type ParentElement = SvgType | GType | AType
+
+  type AttrTypeMapping<T> = T extends Rect ? RectAttr : GlobalAttr
+
+  type ElementAlias =
+    | Dom
+    | Svg
+    | Rect
+    | Line
+    | Polygon
+    | Polyline
+    | Ellipse
+    | ClipPath
+    | Use
+    | Text
+    | Path
+    | TextPath
+    | Circle
+    | G
+    | Gradient
+    | Image
+    | Element
+
+  type ElementTypeAlias =
+    | typeof Dom
+    | typeof Svg
+    | typeof Rect
+    | typeof Line
+    | typeof Polygon
+    | typeof Polyline
+    | typeof Ellipse
+    | typeof ClipPath
+    | typeof Use
+    | typeof Text
+    | typeof Path
+    | typeof TextPath
+    | typeof Circle
+    | typeof G
+    | typeof Gradient
+    | typeof Image
+    | typeof Element
+
+  type AttributeReference =
+    | 'href'
+    | 'marker-start'
+    | 'marker-mid'
+    | 'marker-end'
+    | 'mask'
+    | 'clip-path'
+    | 'filter'
+    | 'fill'
+
+  // ************* SVG.JS Type Declaration *************
+  // ********** Locate in directory src/types **********
+
+  // SVGArray.js
+  // Notice: below class is defined the name as `Array` rather than `SVGArray`.
+  // The purpose of giving the name as `Array` is to allow it to be aligned with SVG.JS export type
+  // as SVG.JS export it as `Array` (to be precise `SVG.Array`) so reading through JS documentation
+  // should be more straightforward.
+  /**
+   * Type alias to native array.
+   *
+   * **Caution**: If argument is a string, generic type must be a number or array of number and
+   * the string is format as a concatenate of number separate by comma.
+   * This is expensive to build runtime type check for such as case so please use it carefully.
+   */
+  type ArrayAlias<T> = BuiltInArray<T> | T[] | string
+
+  class Array<T> extends BuiltInArray<T> {
+    constructor(array?: ArrayAlias<T>)
+
+    /**
+     * Return array of generic T however it's flatten array by 1 level as it using `apply` function.
+     * For example: if T is a `number[]` which is the number of 2 dimension `Array<number[]>` the result will be `number[]`
+     */
+    toArray(): any[]
+    /**
+     * return a concatenated string of each element separated by space
+     */
+    toString(): string
+    valueOf(): T[]
+    clone(): Array<T>
+    toSet(): Set<T>
+    parse(a?: ArrayAlias<T>): T[]
+    to(a: any): Morphable
+  }
+
+  // point.js
+  class Point {
+    x: number
+    y: number
+    constructor()
+    constructor(position: CoordinateXY)
+    constructor(point: Point)
+    constructor(x: number, y?: number)
+    clone(): Point
+    transform(matrix: Matrix): this
+    transformO(matrix: Matrix): this
+    toArray(): ArrayXY
+  }
+
+  // pointArray.js
+  class PointArray extends Array<ArrayXY> {
+    constructor()
+    constructor(array?: ArrayAlias<ArrayXY> | number[])
+
+    toLine(): LineAttr
+    transform(m: Matrix | MatrixLike): PointArray
+    move(x: number, y: number): this
+    size(width: number, height: number): this
+    bbox(): Box
+    to(a: any): Morphable
+    toString(): string
+  }
+
+  // SVGNumber.js
+  type NumberUnit = [number, string]
+
+  class Number {
+    constructor()
+    constructor(value: Number)
+    constructor(value: string)
+    constructor(value: number, unit?: any)
+    constructor(n: NumberUnit)
+
+    value: number
+    unit: any
+
+    toString(): string
+    toJSON(): object // same as toString
+    toArray(): NumberUnit
+    valueOf(): number
+    plus(number: NumberAlias): Number
+    minus(number: NumberAlias): Number
+    times(number: NumberAlias): Number
+    divide(number: NumberAlias): Number
+    convert(unit: string): Number
+    to(a: any): Morphable
+  }
+
+  type NumberAlias = Number | number | string
+
+  // PathArray.js
+
+  type LineCommand =
+    | ['M' | 'm' | 'L' | 'l', number, number]
+    | ['H' | 'h' | 'V' | 'v', number]
+    | ['Z' | 'z']
+
+  type CurveCommand =
+    // Bezier Curves
+    | ['C' | 'c', number, number, number, number, number, number]
+    | ['S' | 's' | 'Q' | 'q', number, number, number, number]
+    | ['T' | 't', number, number]
+    // Arcs
+    | ['A' | 'a', number, number, number, number, number, number, number]
+
+  type PathCommand = LineCommand | CurveCommand
+
+  type PathArrayAlias = PathArray | PathCommand[] | (string | number)[] | string
+
+  class PathArray extends Array<PathCommand> {
+    constructor()
+    constructor(d: ArrayAlias<PathCommand> | PathArrayAlias)
+
+    move(x: number, y: number): this
+    size(width: number, height: number): this
+    equalCommands(other: PathArray): boolean
+    morph(pa: PathArray): this
+    parse(array?: ArrayAlias<PathCommand> | PathArrayAlias): PathCommand[]
+    bbox(): Box
+    to(a: any): Morphable
+  }
+
+  // Matrix.js
+  interface TransformData {
+    origin?: number[]
+    scaleX?: number
+    scaleY?: number
+    shear?: number
+    rotate?: number
+    translateX?: number
+    translateY?: number
+    originX?: number
+    originY?: number
+  }
+
+  interface MatrixLike {
+    a?: number
+    b?: number
+    c?: number
+    d?: number
+    e?: number
+    f?: number
+  }
+
+  interface MatrixExtract extends TransformData, MatrixLike {}
+
+  type FlipType = 'both' | 'x' | 'y' | boolean
+  type ArrayXY = [number, number]
+  type CoordinateXY = ArrayXY | { x: number; y: number }
+
+  interface MatrixTransformParam {
+    rotate?: number
+    flip?: FlipType
+    skew?: ArrayXY | number
+    skewX?: number
+    skewY?: number
+    scale?: ArrayXY | number
+    scaleX?: number
+    scaleY?: number
+    shear?: number
+    theta?: number
+    origin?: CoordinateXY | string
+    around?: CoordinateXY
+    ox?: number
+    originX?: number
+    oy?: number
+    originY?: number
+    position?: CoordinateXY
+    px?: number
+    positionX?: number
+    py?: number
+    positionY?: number
+    translate?: CoordinateXY
+    tx?: number
+    translateX?: number
+    ty?: number
+    translateY?: number
+    relative?: CoordinateXY
+    rx?: number
+    relativeX?: number
+    ry?: number
+    relativeY?: number
+  }
+
+  type MatrixAlias =
+    | MatrixLike
+    | TransformData
+    | MatrixTransformParam
+    | number[]
+    | Element
+    | string
+
+  class Matrix implements MatrixLike {
+    constructor()
+    constructor(source: MatrixAlias)
+    constructor(
+      a: number,
+      b: number,
+      c: number,
+      d: number,
+      e: number,
+      f: number
+    )
+
+    a: number
+    b: number
+    c: number
+    d: number
+    e: number
+    f: number;
+
+    // *** To Be use by Test Only in restrict mode ***
+    [key: string]: any
+
+    clone(): Matrix
+    transform(o: MatrixLike | MatrixTransformParam): Matrix
+    compose(o: MatrixExtract): Matrix
+    decompose(cx?: number, cy?: number): MatrixExtract
+    multiply(m: MatrixAlias | Matrix): Matrix
+    multiplyO(m: MatrixAlias | Matrix): this
+    lmultiply(m: MatrixAlias | Matrix): Matrix
+    lmultiplyO(m: MatrixAlias | Matrix): this
+    inverse(): Matrix
+    inverseO(): this
+    translate(x?: number, y?: number): Matrix
+    translateO(x?: number, y?: number): this
+    scale(x: number, y?: number, cx?: number, cy?: number): Matrix
+    scaleO(x: number, y?: number, cx?: number, cy?: number): this
+    rotate(r: number, cx?: number, cy?: number): Matrix
+    rotateO(r: number, cx?: number, cy?: number): this
+    flip(a: NumberAlias, offset?: number): Matrix
+    flipO(a: NumberAlias, offset?: number): this
+    flip(offset?: number): Matrix
+    shear(a: number, cx?: number, cy?: number): Matrix
+    shearO(a: number, cx?: number, cy?: number): this
+    skew(y?: number, cx?: number, cy?: number): Matrix
+    skewO(y?: number, cx?: number, cy?: number): this
+    skew(x: number, y?: number, cx?: number, cy?: number): Matrix
+    skewX(x: number, cx?: number, cy?: number): Matrix
+    skewY(y: number, cx?: number, cy?: number): Matrix
+    around(cx?: number, cy?: number, matrix?: Matrix): Matrix
+    aroundO(cx?: number, cy?: number, matrix?: Matrix): this
+    equals(m: Matrix): boolean
+    toString(): string
+    toArray(): number[]
+    valueOf(): MatrixLike
+    to(a: any): Morphable
+  }
+
+  type ListEachCallback<T> = (el: T, index: number, list: List<T>) => any
+
+  // List.js
+  class List<T> extends BuiltInArray<T> {
+    each(fn: ListEachCallback<T>): List<any>
+    each(name: string, ...args: any[]): List<any>
+    toArray(): T[]
+  }
+
+  class Eventobject {
+    [key: string]: Eventobject
+  }
+
+  // EventTarget.js
+  class EventTarget {
+    events: Eventobject
+
+    addEventListener(): void
+    dispatch(event: Event | string, data?: object): Event
+    dispatchEvent(event: Event): boolean
+    fire(event: Event | string, data?: object): this
+    getEventHolder(): this | Node
+    getEventTarget(): this | Node
+
+    on(
+      events: string | Event[],
+      cb: EventListener,
+      binbind?: any,
+      options?: AddEventListenerOptions
+    ): this
+    off(
+      events?: string | Event[],
+      cb?: EventListener | number,
+      options?: AddEventListenerOptions
+    ): this
+
+    removeEventListener(): void
+  }
+
+  // Color.js
+  interface ColorLike {
+    r: number
+    g: number
+    b: number
+
+    x: number
+    y: number
+    z: number
+
+    h: number
+    s: number
+    l: number
+    a: number
+    c: number
+
+    m: number
+    k: number
+
+    space: string
+  }
+
+  type ColorAlias = string | ColorLike
+
+  class Color implements ColorLike {
+    r: number
+    g: number
+    b: number
+
+    x: number
+    y: number
+    z: number
+
+    h: number
+    s: number
+    l: number
+    a: number
+    c: number
+
+    m: number
+    k: number
+
+    space: string
+    constructor()
+    constructor(color: ColorAlias, space?: string)
+    constructor(a: number, b: number, c: number, space?: string)
+    constructor(a: number, b: number, c: number, d: number, space?: string)
+    constructor(a: number[], space?: string)
+
+    rgb(): Color
+    lab(): Color
+    xyz(): Color
+    lch(): Color
+    hsl(): Color
+    cmyk(): Color
+    toHex(): string
+    toString(): string
+    toRgb(): string
+    toArray(): any[]
+
+    to(a: any): Morphable
+    fromArray(a: any): this
+
+    static random(mode: 'sine', time?: number): Color
+    static random(mode?: string): Color
+  }
+
+  // Box.js
+  interface BoxLike {
+    height: number
+    width: number
+    y: number
+    x: number
+    cx?: number
+    cy?: number
+    w?: number
+    h?: number
+    x2?: number
+    y2?: number
+  }
+
+  class Box implements BoxLike {
+    height: number
+    width: number
+    y: number
+    x: number
+    cx: number
+    cy: number
+    w: number
+    h: number
+    x2: number
+    y2: number
+
+    constructor()
+    constructor(source: string)
+    constructor(source: number[])
+    constructor(source: DOMRect)
+    constructor(x: number, y: number, width: number, height: number)
+
+    merge(box: BoxLike): Box
+    transform(m: Matrix): Box
+    addOffset(): this
+    toString(): string
+    toArray(): number[]
+    isNulled(): boolean
+    to(v: MorphValueLike): Morphable
+  }
+
+  // Morphable.js
+  type MorphValueLike =
+    | string
+    | number
+    | objectBag
+    | NonMorphable
+    | MatrixExtract
+    | Array<any>
+    | any[]
+
+  class Morphable {
+    constructor()
+    constructor(st: Stepper)
+
+    from(): MorphValueLike
+    from(v: MorphValueLike): this
+    to(): MorphValueLike
+    to(v: MorphValueLike): this
+    type(): any
+    type(t: any): this
+    stepper(): Stepper
+    stepper(st: Stepper): this
+    done(): boolean
+    at(pos: number): any
+  }
+
+  class objectBag {
+    constructor()
+    constructor(a: object)
+    valueOf(): object
+    toArray(): object[]
+
+    to(a: object): Morphable
+    fromArray(a: any[]): this
+  }
+
+  class NonMorphable {
+    constructor(a: object)
+    valueOf(): object
+    toArray(): object[]
+
+    to(a: object): Morphable
+    fromArray(a: object): this
+  }
+
+  class TransformBag {
+    constructor()
+    constructor(a: number[])
+    constructor(a: TransformData)
+    defaults: TransformData
+    toArray(): number[]
+    to(t: TransformData): Morphable
+    fromArray(t: number[]): this
+  }
+
+  interface Stepper {
+    done(c?: object): boolean
+  }
+
+  class Ease implements Stepper {
+    constructor()
+    constructor(fn: string)
+    constructor(fn: Function)
+
+    step(from: number, to: number, pos: number): number
+    done(): boolean
+  }
+
+  class Controller implements Stepper {
+    constructor(fn?: Function)
+    step(current: number, target: number, dt: number, c: number): number
+    done(c?: object): boolean
+  }
+
+  // Queue.js
+  interface QueueParam {
+    value: any
+    next?: any
+    prev?: any
+  }
+
+  class Queue {
+    constructor()
+
+    push(value: any): QueueParam
+    shift(): any
+    first(): number
+    last(): number
+    remove(item: QueueParam): void
+  }
+
+  // Timeline.js
+  interface ScheduledRunnerInfo {
+    start: number
+    duration: number
+    end: number
+    runner: Runner
+  }
+
+  class Timeline extends EventTarget {
+    constructor()
+    constructor(fn: Function)
+
+    active(): boolean
+    schedule(runner: Runner, delay?: number, when?: string): this
+    schedule(): ScheduledRunnerInfo[]
+    unschedule(runner: Runner): this
+    getEndTime(): number
+    updateTime(): this
+    persist(dtOrForever?: number | boolean): this
+    play(): this
+    pause(): this
+    stop(): this
+    finish(): this
+    speed(speed: number): this
+    reverse(yes: boolean): this
+    seek(dt: number): this
+    time(): number
+    time(time: number): this
+    source(): Function
+    source(fn: Function): this
+  }
+
+  // Runner.js
+  interface TimesParam {
+    duration: number
+    delay: number
+    when: number | string
+    swing: boolean
+    wait: number
+    times: number
+  }
+
+  type TimeLike = number | TimesParam | Stepper
+
+  type EasingCallback = (...any: any) => number
+  type EasingLiteral = '<>' | '-' | '<' | '>'
+
+  class Runner {
+    constructor()
+    constructor(options: Function)
+    constructor(options: number)
+    constructor(options: Controller)
+
+    static sanitise: (
+      duration?: TimeLike,
+      delay?: number,
+      when?: string
+    ) => object
+
+    element(): Element
+    element(el: Element): this
+    timeline(): Timeline
+    timeline(timeline: Timeline): this
+    animate(duration: TimeLike, delay?: number, when?: string): this
+    schedule(delay: number, when?: string): this
+    schedule(timeline: Timeline, delay?: number, when?: string): this
+    unschedule(): this
+    loop(times?: number, swing?: boolean, wait?: number): this
+    loop(times: TimesParam): this
+    delay(delay: number): this
+
+    during(fn: Function): this
+    queue(
+      initFn: Function,
+      runFn: Function,
+      retargetFn?: boolean | Function,
+      isTransform?: boolean
+    ): this
+    after(fn: EventListener): this
+    time(): number
+    time(time: number): this
+    duration(): number
+    loops(): number
+    loops(p: number): this
+    persist(dtOrForever?: number | boolean): this
+    position(): number
+    position(p: number): this
+    progress(): number
+    progress(p: number): this
+    step(deta?: number): this
+    reset(): this
+    finish(): this
+    reverse(r?: boolean): this
+    ease(fn: EasingCallback): this
+    ease(kind: EasingLiteral): this
+    active(): boolean
+    active(a: boolean): this
+    addTransform(m: Matrix): this
+    clearTransform(): this
+    clearTransformsFromQueue(): void
+
+    // extends prototypes
+    attr(a: string | object, v?: string): this
+    css(s: string | object, v?: string): this
+    styleAttr(type: string, name: string | object, val?: string): this
+    zoom(level: NumberAlias, point?: Point): this
+    transform(
+      transforms: MatrixTransformParam,
+      relative?: boolean,
+      affine?: boolean
+    ): this
+    x(x: number): this
+    y(y: number): this
+    dx(dx: number): this
+    dy(dy: number): this
+    cx(x: number): this
+    cy(y: number): this
+    dmove(dx: number, dy: number): this
+    move(x: number, y: number): this
+    center(x: number, y: number): this
+    size(width: number, height: number): this
+    width(width: number): this
+    height(height: number): this
+    plot(a: object): this
+    plot(a: number, b: number, c: number, d: number): this
+    leading(value: number): this
+    viewbox(x: number, y: number, width: number, height: number): this
+    update(offset: number, color: number, opacity: number): this
+    update(o: StopProperties): this
+    rx(): number
+    rx(rx: number): this
+    ry(): number
+    ry(ry: number): this
+    from(x: NumberAlias, y: NumberAlias): this
+    to(x: NumberAlias, y: NumberAlias): this
+  }
+
+  // Animator.js
+  let Animator: {
+    nextDraw: any
+    frames: Queue
+    timeouts: Queue
+    immediates: Queue
+
+    timer(): boolean
+    frame(fn: Function): object
+    timeout(fn: Function, delay?: number): object
+    immediate(fn: Function): object
+    cancelFrame(o: object): void
+    clearTimeout(o: object): void
+    cancelImmediate(o: object): void
+  }
+
+  /**
+   * Just fancy type alias to refer to css query selector.
+   */
+  type QuerySelector = string
+
+  class Dom extends EventTarget {
+    node: HTMLElement | SVGElement
+    type: string
+
+    constructor(node?: HTMLElement, attr?: object)
+    constructor(att: object)
+    add(element: Element, i?: number): this
+    addTo(parent: Dom | HTMLElement | string, i?: number): this
+    children(): List<Element>
+    clear(): this
+    clone(deep?: boolean, assignNewIds?: boolean): this
+    each(
+      block: (index: number, children: Element[]) => void,
+      deep?: boolean
+    ): this
+    element(element: string, inherit?: object): this
+    first(): Element
+    get(i: number): Element
+    getEventHolder(): LinkedHTMLElement
+    getEventTarget(): LinkedHTMLElement
+    has(element: Element): boolean
+    id(): string
+    id(id: string): this
+    index(element: Element): number
+    last(): Element
+    matches(selector: string): boolean
+    /**
+     * Finds the closest ancestor which matches the string or is of passed type. If nothing is passed, the parent is returned
+     * @param type can be either string, svg.js object or undefined.
+     */
+    parent(type?: ElementTypeAlias | QuerySelector): Dom | null
+    put(element: Element, i?: number): Element
+    /**
+     * Put the element into the given parent element and returns the parent element
+     * @param parent The parent in which the current element is inserted
+     */
+    putIn(parent: ElementAlias | Node | QuerySelector): Dom
+
+    remove(): this
+    removeElement(element: Element): this
+    replace<T extends Dom>(element: T): T
+    round(precision?: number, map?: string[]): this
+    svg(): string
+    svg(a: string, outer: true): Element
+    svg(a: string, outer?: false): this
+    svg(a: boolean, outer?: boolean): string
+    svg(a: null | Function, outer?: boolean): string
+
+    toString(): string
+    words(text: string): this
+    writeDataToDom(): this
+
+    // prototype extend Attribute in attr.js
+    /**
+     * Get the attribute object of SVG Element. The return object will be vary based on
+     * the instance itself. For example, G element will only return GlobalAttr where Rect
+     * will return RectAttr instead.
+     */
+    attr(): any
+    /**
+     * Add or update the attribute from the SVG Element. To remove the attribute from the element set value to null
+     * @param name name of attribute
+     * @param value value of attribute can be string or number or null
+     * @param namespace optional string that define namespace
+     */
+    attr(name: string, value: any, namespace?: string): this
+    attr(name: string): any
+    attr(obj: object): this
+    attr(obj: string[]): object
+
+    // prototype extend Selector in selector.js
+    find(query: string): List<Element>
+    findOne(query: string): Dom | null
+
+    // prototype method register in data.js
+    data(a: string): object | string | number
+    data(a: string, v: object, substain?: boolean): this
+    data(a: object): this
+
+    // prototype method register in arrange.js
+    siblings(): List<Element>
+    position(): number
+    next(): Element
+    prev(): Element
+    forward(): this
+    backward(): this
+    front(): this
+    back(): this
+    before(el: Element): Element
+    after(el: Element): Element
+    insertBefore(el: Element): this
+    insertAfter(el: Element): this
+
+    // prototype method register in class.js
+    classes(): string[]
+    hasClass(name: string): boolean
+    addClass(name: string): this
+    removeClass(name: string): this
+    toggleClass(name: string): this
+
+    // prototype method register in css.js
+    css(): Partial<CSSStyleDeclaration>
+    css<T extends CSSStyleName>(style: T): CSSStyleDeclaration[T]
+    css<T extends CSSStyleName[]>(style: T): Partial<CSSStyleDeclaration>
+    css<T extends CSSStyleName>(style: T, val: CSSStyleDeclaration[T]): this
+    css(style: Partial<CSSStyleDeclaration>): this
+    show(): this
+    hide(): this
+    visible(): boolean
+
+    // memory.js
+    remember(name: string, value: any): this
+    remember(name: string): any
+    remember(obj: object): this
+    forget(...keys: string[]): this
+    forget(): this
+    memory(): object
+
+    addEventListener(): void
+    dispatch(event: Event | string, data?: object): Event
+    dispatchEvent(event: Event): boolean
+    fire(event: Event | string, data?: object): this
+    getEventHolder(): this | Node
+    getEventTarget(): this | Node
+
+    // on(events: string | Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions): this;
+    // off(events?: string | Event[], cb?: EventListener | number): this;
+    removeEventListener(): void
+  }
+
+  // clip.js
+  class ClipPath extends Container {
+    constructor()
+    constructor(node?: SVGClipPathElement)
+    constructor(attr: object)
+    node: SVGClipPathElement
+
+    targets(): List<Element>
+    remove(): this
+  }
+
+  // container.js
+  interface ViewBoxLike {
+    x: number
+    y: number
+    width: number
+    height: number
+  }
+
+  class Container extends Element {
+    circle(size?: NumberAlias): Circle
+    circle(size: number, unit: number): Circle
+    clip(): ClipPath
+    ellipse(width?: number, height?: number): Ellipse
+    flatten(parent: Dom, depth?: number): this
+    foreignObject(width: number, height: number): ForeignObject
+    gradient(type: string, block?: (stop: Gradient) => void): Gradient
+    group(): G
+
+    image(): Image
+    image(href?: string, callback?: (e: Event) => void): Image
+    line(points?: PointArrayAlias): Line
+    line(x1: number, y1: number, x2: number, y2: number): Line
+    link(url: string): A
+    marker(
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): Marker
+    mask(): Mask
+    nested(): Svg
+    path(): Path
+    path(d: PathArrayAlias): Path
+    pattern(
+      width?: number,
+      height?: number,
+      block?: (pattern: Pattern) => void
+    ): Pattern
+    plain(text: string): Text
+    polygon(points?: PointArrayAlias): Polygon
+    polyline(points?: PointArrayAlias): Polyline
+    rect(width?: number, height?: number): Rect
+    style(): Style
+    text(block: (tspan: Tspan) => void): Text
+    text(text: string): Text
+    ungroup(parent: Dom, depth?: number): this
+    use(element: Element | string, file?: string): Use
+    viewbox(): Box
+    viewbox(viewbox: ViewBoxLike | string): this
+    viewbox(x: number, y: number, width: number, height: number): this
+    textPath(text: string | Text, path: string | Path): TextPath
+    symbol(): Symbol
+    zoom(): number
+    zoom(level: NumberAlias, point?: Point): this
+  }
+
+  class Defs extends Container {
+    constructor(node?: SVGDefsElement)
+    node: SVGDefsElement
+    marker(
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): Marker
+  }
+
+  class Svg extends Container {
+    constructor(svgElement?: SVGSVGElement)
+    constructor(id: string)
+    node: SVGSVGElement
+    namespace(): this
+    defs(): Defs
+    remove(): this
+    isRoot(): boolean
+  }
+
+  interface Sugar {
+    fill(): any
+    fill(fill: FillData): this
+    fill(color: string): this
+    fill(pattern: Element): this
+    fill(image: Image): this
+    stroke(): any
+    stroke(stroke: StrokeData): this
+    stroke(color: string): this
+    matrix(
+      a?: number,
+      b?: number,
+      c?: number,
+      d?: number,
+      e?: number,
+      f?: number
+    ): this
+    matrix(
+      mat: MatrixAlias,
+      b?: number,
+      c?: number,
+      d?: number,
+      e?: number,
+      f?: number
+    ): this
+    rotate(degrees: number, cx?: number, cy?: number): this
+    skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this
+    scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this
+    translate(x: number, y: number): this
+    shear(lam: Matrix, cx: number, cy: number): this
+    relative(x: number, y: number): this
+    flip(direction?: string, around?: number): this
+    flip(around: number): this
+    opacity(): number
+    opacity(value: number): this
+    font(a: string): string
+    font(a: string, v: string | number): this
+    font(a: object): this
+  }
+
+  // Symbol.js
+  class Symbol extends Container {
+    constructor(svgElement?: SVGSymbolElement)
+    constructor(attr: object)
+    node: SVGSymbolElement
+  }
+
+  class Element extends Dom implements Sugar {
+    constructor(node?: SVGElement)
+    constructor(attr: object)
+    node: SVGElement
+    type: string
+    dom: any
+
+    addClass(name: string): this
+    after(element: Element): Element
+    animate(duration?: TimeLike, delay?: number, when?: string): Runner
+    delay(by: number, when?: string): Runner
+    attr(): any
+    attr(name: string, value: any, namespace?: string): this
+    attr(name: string): any
+    attr(obj: string[]): object
+    attr(obj: object): this
+    back(): this
+    backward(): this
+    bbox(): Box
+    before(element: Element): Element
+    center(x: number, y: number): this
+    classes(): string[]
+    click(cb: Function | null): this
+    clipper(): ClipPath
+    clipWith(element: Element): this
+    clone(deep?: boolean, assignNewIds?: boolean): this
+    ctm(): Matrix
+    cx(): number
+    cx(x: number): this
+    cy(): number
+    cy(y: number): this
+    data(name: string, value: any, sustain?: boolean): this
+    data(name: string): any
+    data(val: object): this
+    dblclick(cb: Function | null): this
+    defs(): Defs
+    dmove(x: NumberAlias, y: NumberAlias): this
+    dx(x: NumberAlias): this
+    dy(y: NumberAlias): this
+    event(): Event | CustomEvent
+    fill(): any
+    fill(color: string): this
+    fill(color: Color | ColorLike): this
+    fill(color: FillData): this
+    fill(pattern: Element): this
+    fire(event: Event): this
+    fire(event: string, data?: any): this
+    flip(a: string, offset?: number): this
+    flip(offset?: number): this
+    font(a: object): this
+    font(a: string, v: string | number): this
+    font(a: string): string
+    forget(...keys: string[]): this
+    forget(): this
+    forward(): this
+    front(): this
+    hasClass(name: string): boolean
+    height(): NumberAlias
+    height(height: NumberAlias): this
+    hide(): this
+    hide(): this
+    id(): string
+    id(id: string): this
+    inside(x: number, y: number): boolean
+    is(cls: any): boolean
+    linkTo(url: (link: A) => void): A
+    linkTo(url: string): A
+    masker(): Mask
+    maskWith(element: Element): this
+    maskWith(mask: Mask): this
+    matches(selector: string): boolean
+    matrix(): Matrix
+    matrix(
+      a?: number,
+      b?: number,
+      c?: number,
+      d?: number,
+      e?: number,
+      f?: number
+    ): this
+    matrix(
+      mat: MatrixAlias,
+      b?: number,
+      c?: number,
+      d?: number,
+      e?: number,
+      f?: number
+    ): this
+    matrixify(): Matrix
+    memory(): object
+    mousedown(cb: Function | null): this
+    mousemove(cb: Function | null): this
+    mouseout(cb: Function | null): this
+    mouseover(cb: Function | null): this
+    mouseup(cb: Function | null): this
+    mouseenter(cb: Function | null): this
+    mouseleave(cb: Function | null): this
+    move(x: NumberAlias, y: NumberAlias): this
+    native(): LinkedHTMLElement
+    next(): Element
+    // off(events?: string | Event[], cb?: EventListener | number): this;
+    // on(event: string, cb: Function, context?: object): this;
+    opacity(): number
+    opacity(o: number): this
+    relative(x: number, y: number): this
+    shear(lam: Matrix, cx: number, cy: number): this
+    toRoot(): Svg
+    /**
+     * By default parents will return a list of elements up until the root svg.
+     */
+    parents(): List<Element>
+    /**
+     * List the parent by hierarchy until the given parent type or matcher. If the given value is null
+     * then the result is only provided the list up until Svg root element which mean no Dom parent element is included.
+     * @param util a parent type
+     */
+    parents<T extends Dom>(util: QuerySelector | T | null): List<Element>
+    /**
+     * Get reference svg element based on the given attribute.
+     * @param attr a svg attribute
+     */
+    reference<R extends Dom>(attr: AttributeReference): R | null
+
+    point(): Point
+    point(position: CoordinateXY): Point
+    point(point: Point): Point
+    point(x: number, y: number): Point
+    position(): number
+    prev(): Element
+    rbox(element?: Element): Box
+    reference(type: string): Element
+    remember(name: string, value: any): this
+    remember(name: string): any
+    remember(obj: object): this
+    remove(): this
+    removeClass(name: string): this
+    root(): Svg
+    rotate(d: number, cx?: number, cy?: number): this
+    scale(x?: number, y?: number, cx?: number, cy?: number): this
+    screenCTM(): Matrix
+    setData(data: object): this
+    show(): this
+    show(): this
+    size(width?: NumberAlias, height?: NumberAlias): this
+    skew(x?: number, y?: number, cx?: number, cy?: number): this
+    stop(jumpToEnd: boolean, clearQueue: boolean): Animation
+    stop(
+      offset?: NumberAlias | string,
+      color?: NumberAlias,
+      opacity?: NumberAlias
+    ): Stop
+    stop(val: {
+      offset?: NumberAlias | string
+      color?: NumberAlias
+      opacity?: NumberAlias
+    }): Stop
+    stroke(): any
+    stroke(color: string): this
+    stroke(stroke: StrokeData): this
+    timeline(): Timeline
+    timeline(tl: Timeline): this
+    toggleClass(name: string): this
+    toParent(parent: Dom): this
+    toParent(parent: Dom, i: number): this
+    toSvg(): this
+    touchcancel(cb: Function | null): this
+    touchend(cb: Function | null): this
+    touchleave(cb: Function | null): this
+    touchmove(cb: Function | null): this
+    touchstart(cb: Function | null): this
+    transform(): MatrixExtract
+    transform(t: MatrixAlias, relative?: boolean): this
+    translate(x: number, y: number): this
+    unclip(): this
+    unmask(): this
+    untransform(): this
+    visible(): boolean
+    width(): NumberAlias
+    width(width: NumberAlias): this
+    x(): NumberAlias
+    x(x: NumberAlias): this
+    y(): NumberAlias
+    y(y: NumberAlias): this
+  }
+
+  // ellipse.js
+  interface CircleMethods extends Shape {
+    rx(rx: number): this
+    rx(): this
+    ry(ry: number): this
+    ry(): this
+    radius(x: number, y?: number): this
+  }
+  class Circle extends Shape implements CircleMethods {
+    constructor(node?: SVGCircleElement)
+    constructor(attr: CircleAttr)
+
+    node: SVGCircleElement
+
+    rx(rx: number): this
+    rx(): this
+    ry(ry: number): this
+    ry(): this
+    radius(x: number, y?: number): this
+  }
+  class Ellipse extends Shape implements CircleMethods {
+    node: SVGEllipseElement
+    constructor(attr: EllipseAttr)
+    constructor(node?: SVGEllipseElement)
+
+    rx(rx: number): this
+    rx(): this
+    ry(ry: number): this
+    ry(): this
+    radius(x: number, y?: number): this
+  }
+
+  interface StopProperties {
+    color?: ColorAlias
+    offset?: number | string
+    opacity?: number
+  }
+
+  // gradient.js
+  class Stop extends Element {
+    update(offset?: number, color?: ColorAlias, opacity?: number): this
+    update(opts: StopProperties): this
+  }
+  class Gradient extends Container {
+    constructor(node?: SVGGradientElement)
+    constructor(attr: object)
+    constructor(type: string)
+    node: SVGGradientElement
+
+    at(offset?: number, color?: ColorAlias, opacity?: number): Stop
+    at(opts: StopProperties): Stop
+    url(): string
+    toString(): string
+    targets(): List<Element>
+    bbox(): Box
+
+    // gradiented.js
+    from(x: number, y: number): this
+    to(x: number, y: number): this
+
+    // TODO: check with main.js
+    radius(x: number, y?: number): this
+    targets(): List<Element>
+    bbox(): Box
+    update(block?: (gradient: Gradient) => void): this
+  }
+
+  // group.js
+  class G extends Container {
+    constructor(node?: SVGGElement)
+    constructor(attr: object)
+    node: SVGGElement
+    gbox(): Box
+  }
+
+  // hyperlink.js
+  class A extends Container {
+    constructor(node?: SVGAElement)
+    constructor(attr: object)
+    node: SVGAElement
+    to(url: string): this
+    to(): string
+    target(target: string): this
+    target(): string
+  }
+
+  // ForeignObject.js
+  class ForeignObject extends Element {
+    constructor(node?: SVGForeignObjectElement, attrs?: object)
+    constructor(attrs?: object)
+    add(element: Dom, i?: number): this
+  }
+
+  // image.js
+  class Image extends Shape {
+    constructor(node?: SVGImageElement)
+    constructor(attr: object)
+    node: SVGImageElement
+    load(url?: string, callback?: (event: Event) => void): this
+  }
+
+  // line.js
+  type PointArrayAlias = number[] | ArrayXY[] | PointArray | string
+
+  class Line extends Shape {
+    constructor(attr: LineAttr)
+    constructor(node?: SVGLineElement)
+
+    node: SVGLineElement
+
+    array(): PointArray
+    plot(): PointArray
+    plot(points?: PointArrayAlias): this
+    plot(x1: number, y1: number, x2: number, y2: number): this
+    move(x: number, y: number): this
+    size(width?: number, height?: number): this
+    marker(
+      position: string,
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): Marker
+    marker(position: string, marker: Marker): Marker
+  }
+
+  // marker.js
+  // TODO: check register method marker
+  class Marker extends Container {
+    constructor()
+
+    node: SVGMarkerElement
+
+    ref(x: string | number, y: string | number): this
+    update(block: (marker: Marker) => void): this
+    toString(): string
+    orient(orientation: 'auto' | 'auto-start-reverse' | number | Number): this
+    orient(): string
+  }
+  // mask.js
+  class Mask extends Container {
+    constructor(node?: SVGMaskElement)
+    constructor(attr: object)
+    node: SVGMaskElement
+    remove(): this
+    targets(): List<Element>
+  }
+
+  // path.js
+  class Path extends Shape {
+    constructor(attr: PathAttr)
+    constructor(node?: SVGPathElement)
+
+    node: SVGPathElement
+
+    morphArray: PathArray
+    array(): PathArray
+    plot(): PathArray
+    plot(d: PathArrayAlias): this
+    marker(
+      position: string,
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): this
+    marker(position: string, marker: Marker): this
+
+    // sugar.js
+    length(): number
+    pointAt(length: number): { x: number; y: number }
+    text(text: string): TextPath
+    text(text: Text): TextPath
+    targets(): List<Element>
+  }
+
+  // pattern.js
+  class Pattern extends Container {
+    url(): string
+    url(...rest: any[]): never
+    update(block: (pattern: Pattern) => void): this
+    toString(): string
+  }
+
+  // poly.js
+  interface poly {
+    array(): PointArray
+    plot(): PointArray
+    plot(p: PointArrayAlias): this
+    clear(): this
+    move(x: number, y: number): this
+    size(width: number, height?: number): this
+  }
+
+  // pointed.js
+  interface pointed {
+    x(): number
+    x(x: number): this
+    y(): number
+    y(y: number): this
+    height(): number
+    height(h: number): this
+    width(): number
+    width(w: number): this
+  }
+
+  class Polyline extends Shape implements poly, pointed {
+    constructor(node?: SVGPolylineElement)
+    constructor(attr: PolyAttr)
+
+    node: SVGPolylineElement
+
+    array(): PointArray
+    plot(): PointArray
+    plot(p: PointArrayAlias): this
+    x(): number
+    x(x: number): this
+    y(): number
+    y(y: number): this
+    height(): number
+    height(h: number): this
+    width(): number
+    width(w: number): this
+    move(x: number, y: number): this
+    size(width: number, height?: number): this
+    marker(
+      position: string,
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): Marker
+    marker(position: string, marker: Marker): Marker
+  }
+
+  class Polygon extends Shape implements poly, pointed {
+    constructor(node?: SVGPolygonElement)
+    constructor(attr: PolyAttr)
+
+    node: SVGPolygonElement
+    array(): PointArray
+    plot(): PointArray
+    plot(p: PointArrayAlias): this
+    x(): number
+    x(x: number): this
+    y(): number
+    y(y: number): this
+    height(): number
+    height(h: number): this
+    width(): number
+    width(w: number): this
+    move(x: number, y: number): this
+    size(width: number, height?: number): this
+    marker(
+      position: string,
+      width?: number,
+      height?: number,
+      block?: (marker: Marker) => void
+    ): Marker
+    marker(position: string, marker: Marker): Marker
+  }
+
+  class Rect extends Shape {
+    constructor(node?: SVGRectElement)
+    constructor(attr: RectAttr)
+    node: SVGRectElement
+    radius(x: number, y?: number): this
+  }
+
+  // shape.js
+  class Shape extends Element {}
+
+  // sugar.js
+  interface StrokeData {
+    color?: string
+    width?: number
+    opacity?: number
+    linecap?: string
+    linejoin?: string
+    miterlimit?: number
+    dasharray?: string
+    dashoffset?: number
+  }
+
+  interface FillData {
+    color?: string
+    opacity?: number
+    rule?: string
+  }
+
+  interface FontData {
+    family?: string
+    size?: NumberAlias
+    anchor?: string
+    leading?: NumberAlias
+    weight?: string
+    style?: string
+  }
+  // textable.js
+  interface Textable {
+    plain(text: string): this
+    length(): number
+  }
+
+  // text.js
+  class Text extends Shape implements Textable {
+    constructor(node?: SVGElement)
+    constructor(attr: TextAttr)
+
+    clone(): this
+    text(): string
+    text(text: string): this
+    text(block: (text: this) => void): this
+    leading(): Number
+    leading(leading: NumberAlias): this
+    rebuild(enabled: boolean): this
+    build(enabled: boolean): this
+    clear(): this
+    plain(text: string): this
+    length(): number
+    get(i: number): Tspan
+    path(): TextPath
+    path(d: PathArrayAlias | Path): TextPath
+    track(): Element
+    ax(): string
+    ax(x: string): this
+    ay(): string
+    ay(y: string): this
+    amove(x: number, y: number): this
+    textPath(): TextPath
+
+    // main.js, from extend/copy prototypes from Tspan
+    tspan(text: string): Tspan
+    tspan(block: (tspan: Tspan) => void): this
+  }
+
+  class Tspan extends Text implements Textable {
+    constructor(node?: SVGElement)
+    constructor(attr: TextAttr)
+    dx(): number
+    dx(x: NumberAlias): this
+    dy(): number
+    dy(y: NumberAlias): this
+    newLine(): this
+    tspan(text: string): Tspan
+    tspan(block: (tspan: Tspan) => void): this
+    length(): number
+    text(): string
+    text(text: string): this
+    text(block: (text: this) => void): this
+    plain(text: string): this
+  }
+
+  // textpath.js
+  class TextPath extends Text {
+    constructor()
+    constructor(attr: TextPathAttr)
+
+    array(): Array<any>
+    plot(): PathArray
+    plot(d: string): this
+    track(): Path
+  }
+
+  // style.js
+  class Style extends Element {
+    constructor(node: SVGElement, attr?: StylingAttr)
+    addText(text: string): this
+    font(a: object): this
+    font(a: string, v: string | number): this
+    font(a: string): string
+    rule(selector: string, obj: any): this
+  }
+
+  // use.js
+  class Use extends Shape {
+    use(element: string, file?: string): this
+  }
+
+  // viewbox.js
+  type ViewBoxAlias = ViewBoxLike | number[] | string | Element
+
+  interface ViewBox {
+    x: number
+    y: number
+    width: number
+    height: number
+    toString(): string
+    at(pos: number): ViewBox
+  }
+}