diff --git a/.babelrc.js b/.babelrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..189fb2552a16237e7ff7929e89c4a36030a25a72
--- /dev/null
+++ b/.babelrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+  presets: [
+    '@babel/preset-env',
+    '@babel/preset-typescript',
+    '@babel/preset-react',
+  ],
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..0b5af7129e7c75da6bb7e63de458d6cb97468264
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,8 @@
+root = true
+
+[*.{js,ts,tsx}]
+indent_style = space
+indent_size = 2
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/.eslintrc.js b/.eslintrc.js
index c115fa7958874a63bed8477b9cf85344c13d7829..373bce7499fafc7e20a61643b9ef7fcfe3d3d902 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -23,6 +23,8 @@ module.exports = {
     'no-underscore-dangle': 0,
     'no-nested-ternary': 0,
     'import/newline-after-import': 0,
+    'no-use-before-define': 0,
+    'import/prefer-default-export': 0,
   },
   globals: {
     process: true,
diff --git a/.gitignore b/.gitignore
index 00813b5c31da451561d91b9223b12e4efdfc8a79..e0dbb1783357774e6d05141f536ccd7fa3abf045 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 /build
 /build-debug
 /.buildconfig
+/theme
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000000000000000000000000000000000000..2007037e2885c52788089c8a656b53ae7ae800b7
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+  "endOfLine": "lf",
+  "semi": false,
+  "singleQuote": true,
+  "trailingComma": "all"
+}
diff --git a/index.js b/index.js
index 82b7cdabb7719a177c066128d79bb6a08b63eeac..9453fdc86d23c5bb67a835f712bddb97d655336c 100755
--- a/index.js
+++ b/index.js
@@ -1,9 +1,31 @@
 #!/usr/bin/env node
-const { spawnSync } = require('child_process')
+const { spawnSync, spawn } = require('child_process')
 const config = require('./sitegin/config')
 
+function onBabelExit(code) {
+  setTimeout(() => {
+    runBabel({ watch: true })
+  }, 500)
+}
+
+function runBabel({ watch = false }) {
+  const babel = spawn(
+    './node_modules/.bin/babel',
+    [
+      'theme-source',
+      '-d',
+      'theme',
+      '--delete-dir-on-start',
+      watch ? '--watch' : null,
+    ].filter(a => a),
+    { stdio: 'inherit', cwd: __dirname },
+  )
+  if (watch) babel.on('exit', onBabelExit)
+}
+
 ;(async () => {
   const opts = await config()
+  runBabel({ watch: !opts.nowatch })
   if (opts.config.options.nowatch) {
     require('./sitegin/index.js')
   } else {
@@ -11,6 +33,8 @@ const config = require('./sitegin/config')
       process.argv[0],
       [
         './node_modules/.bin/nodemon',
+        '--ignore',
+        'build-debug',
         'sitegin/index.js',
         ...process.argv.slice(2),
       ],
diff --git a/package-lock.json b/package-lock.json
index 3ab3e03215b39bb81ed39120b368a83665d4d9bf..f26d5dfdd123c76c4d585dad933b164765d02d7c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,103 +4,1996 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@babel/cli": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.7.7.tgz",
+      "integrity": "sha512-XQw5KyCZyu/M8/0rYiZyuwbgIQNzOrJzs9dDLX+MieSgBwTLvTj4QVbLmxJACAIvQIDT7PtyHN2sC48EOWTgaA==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.1.8",
+        "commander": "^4.0.1",
+        "convert-source-map": "^1.1.0",
+        "fs-readdir-recursive": "^1.1.0",
+        "glob": "^7.0.0",
+        "lodash": "^4.17.13",
+        "make-dir": "^2.1.0",
+        "slash": "^2.0.0",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "commander": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz",
+          "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        }
+      }
+    },
     "@babel/code-frame": {
       "version": "7.5.5",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
       "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
       "dev": true,
       "requires": {
-        "@babel/highlight": "^7.0.0"
+        "@babel/highlight": "^7.0.0"
+      }
+    },
+    "@babel/core": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz",
+      "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "@babel/generator": "^7.7.7",
+        "@babel/helpers": "^7.7.4",
+        "@babel/parser": "^7.7.7",
+        "@babel/template": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "json5": "^2.1.0",
+        "lodash": "^4.17.13",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.0.tgz",
+      "integrity": "sha512-1wdJ6UxHyL1XoJQ119JmvuRX27LRih7iYStMPZOWAjQqeAabFg3dYXKMpgihma+to+0ADsTVVt6oRyUxWZw6Mw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.0",
+        "jsesc": "^2.5.1",
+        "lodash": "^4.17.13",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz",
+      "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz",
+      "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-builder-react-jsx": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz",
+      "integrity": "sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4",
+        "esutils": "^2.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-call-delegate": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz",
+      "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz",
+      "integrity": "sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.7.4",
+        "@babel/helper-member-expression-to-functions": "^7.7.4",
+        "@babel/helper-optimise-call-expression": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.7.4",
+        "@babel/helper-split-export-declaration": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz",
+      "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-regex": "^7.4.4",
+        "regexpu-core": "^4.6.0"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz",
+      "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.7.4",
+        "@babel/types": "^7.7.4",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz",
+      "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+      "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.7.0",
+        "@babel/template": "^7.7.0",
+        "@babel/types": "^7.7.0"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+      "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.0"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz",
+      "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz",
+      "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz",
+      "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.7.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz",
+      "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.7.4",
+        "@babel/helper-simple-access": "^7.7.4",
+        "@babel/helper-split-export-declaration": "^7.7.4",
+        "@babel/template": "^7.7.4",
+        "@babel/types": "^7.7.4",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz",
+      "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
+      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
+      "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.13"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz",
+      "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.7.4",
+        "@babel/helper-wrap-function": "^7.7.4",
+        "@babel/template": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz",
+      "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.7.4",
+        "@babel/helper-optimise-call-expression": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz",
+      "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+      "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.7.0"
+      }
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz",
+      "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.7.4",
+        "@babel/template": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz",
+      "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.7.4",
+        "@babel/traverse": "^7.7.4",
+        "@babel/types": "^7.7.4"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz",
+          "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+          "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.4",
+            "@babel/helper-function-name": "^7.7.4",
+            "@babel/helper-split-export-declaration": "^7.7.4",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "@babel/parser": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.0.tgz",
+      "integrity": "sha512-GqL+Z0d7B7ADlQBMXlJgvXEbtt5qlqd1YQ5fr12hTSfh7O/vgrEIvJxU2e7aSVrEUn75zTZ6Nd0s8tthrlZnrQ==",
+      "dev": true
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz",
+      "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.7.4",
+        "@babel/plugin-syntax-async-generators": "^7.7.4"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz",
+      "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.7.4"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz",
+      "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-json-strings": "^7.7.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz",
+      "integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.7.4"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz",
+      "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.7.4"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz",
+      "integrity": "sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz",
+      "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz",
+      "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz",
+      "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz",
+      "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz",
+      "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz",
+      "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz",
+      "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-typescript": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz",
+      "integrity": "sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz",
+      "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz",
+      "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz",
+      "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz",
+      "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "lodash": "^4.17.13"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz",
+      "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.7.4",
+        "@babel/helper-define-map": "^7.7.4",
+        "@babel/helper-function-name": "^7.7.4",
+        "@babel/helper-optimise-call-expression": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.7.4",
+        "@babel/helper-split-export-declaration": "^7.7.4",
+        "globals": "^11.1.0"
+      },
+      "dependencies": {
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+          "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz",
+      "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz",
+      "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz",
+      "integrity": "sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz",
+      "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz",
+      "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz",
+      "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz",
+      "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/helper-function-name": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+          "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.4",
+            "@babel/template": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.7",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz",
+          "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+          "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.4",
+            "@babel/types": "^7.7.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz",
+      "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz",
+      "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
-    "@babel/generator": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.0.tgz",
-      "integrity": "sha512-1wdJ6UxHyL1XoJQ119JmvuRX27LRih7iYStMPZOWAjQqeAabFg3dYXKMpgihma+to+0ADsTVVt6oRyUxWZw6Mw==",
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.7.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz",
+      "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.0",
-        "jsesc": "^2.5.1",
-        "lodash": "^4.17.13",
-        "source-map": "^0.5.0"
+        "@babel/helper-module-transforms": "^7.7.5",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
-    "@babel/helper-function-name": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
-      "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.7.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz",
+      "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.7.0",
-        "@babel/template": "^7.7.0",
-        "@babel/types": "^7.7.0"
+        "@babel/helper-module-transforms": "^7.7.5",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-simple-access": "^7.7.4",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
-    "@babel/helper-get-function-arity": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
-      "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz",
+      "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.0"
+        "@babel/helper-hoist-variables": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
       }
     },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
-      "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz",
+      "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.0"
+        "@babel/helper-module-transforms": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
-    "@babel/highlight": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
-      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz",
+      "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==",
       "dev": true,
       "requires": {
-        "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
-        "js-tokens": "^4.0.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz",
+      "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz",
+      "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz",
+      "integrity": "sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-call-delegate": "^7.7.4",
+        "@babel/helper-get-function-arity": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+          "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
           "dev": true,
           "requires": {
-            "color-convert": "^1.9.0"
+            "@babel/types": "^7.7.4"
           }
         },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
           }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+        }
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz",
+      "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-react-display-name": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz",
+      "integrity": "sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-react-jsx": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.7.tgz",
+      "integrity": "sha512-SlPjWPbva2+7/ZJbGcoqjl4LsQaLpKEzxW9hcxU7675s24JmdotJOSJ4cgAbV82W3FcZpHIGmRZIlUL8ayMvjw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-react-jsx": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-react-jsx-self": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.7.4.tgz",
+      "integrity": "sha512-PWYjSfqrO273mc1pKCRTIJXyqfc9vWYBax88yIhQb+bpw3XChVC7VWS4VwRVs63wFHKxizvGSd00XEr+YB9Q2A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-react-jsx-source": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.7.4.tgz",
+      "integrity": "sha512-5ZU9FnPhqtHsOXxutRtXZAzoEJwDaP32QcobbMP1/qt7NYcsCNK8XgzJcJfoEr/ZnzVvUNInNjIW22Z6I8p9mg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.7.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz",
+      "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.14.0"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz",
+      "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz",
+      "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz",
+      "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz",
+      "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz",
+      "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz",
+      "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-typescript": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz",
+      "integrity": "sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-typescript": "^7.7.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz",
+      "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz",
+      "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.7.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-async-generator-functions": "^7.7.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.7.4",
+        "@babel/plugin-proposal-json-strings": "^7.7.4",
+        "@babel/plugin-proposal-object-rest-spread": "^7.7.7",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.7.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.7.7",
+        "@babel/plugin-syntax-async-generators": "^7.7.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.7.4",
+        "@babel/plugin-syntax-json-strings": "^7.7.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.7.4",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.7.4",
+        "@babel/plugin-syntax-top-level-await": "^7.7.4",
+        "@babel/plugin-transform-arrow-functions": "^7.7.4",
+        "@babel/plugin-transform-async-to-generator": "^7.7.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.7.4",
+        "@babel/plugin-transform-block-scoping": "^7.7.4",
+        "@babel/plugin-transform-classes": "^7.7.4",
+        "@babel/plugin-transform-computed-properties": "^7.7.4",
+        "@babel/plugin-transform-destructuring": "^7.7.4",
+        "@babel/plugin-transform-dotall-regex": "^7.7.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.7.4",
+        "@babel/plugin-transform-exponentiation-operator": "^7.7.4",
+        "@babel/plugin-transform-for-of": "^7.7.4",
+        "@babel/plugin-transform-function-name": "^7.7.4",
+        "@babel/plugin-transform-literals": "^7.7.4",
+        "@babel/plugin-transform-member-expression-literals": "^7.7.4",
+        "@babel/plugin-transform-modules-amd": "^7.7.5",
+        "@babel/plugin-transform-modules-commonjs": "^7.7.5",
+        "@babel/plugin-transform-modules-systemjs": "^7.7.4",
+        "@babel/plugin-transform-modules-umd": "^7.7.4",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4",
+        "@babel/plugin-transform-new-target": "^7.7.4",
+        "@babel/plugin-transform-object-super": "^7.7.4",
+        "@babel/plugin-transform-parameters": "^7.7.7",
+        "@babel/plugin-transform-property-literals": "^7.7.4",
+        "@babel/plugin-transform-regenerator": "^7.7.5",
+        "@babel/plugin-transform-reserved-words": "^7.7.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.7.4",
+        "@babel/plugin-transform-spread": "^7.7.4",
+        "@babel/plugin-transform-sticky-regex": "^7.7.4",
+        "@babel/plugin-transform-template-literals": "^7.7.4",
+        "@babel/plugin-transform-typeof-symbol": "^7.7.4",
+        "@babel/plugin-transform-unicode-regex": "^7.7.4",
+        "@babel/types": "^7.7.4",
+        "browserslist": "^4.6.0",
+        "core-js-compat": "^3.6.0",
+        "invariant": "^2.2.2",
+        "js-levenshtein": "^1.1.3",
+        "semver": "^5.5.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+          "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
           }
         }
       }
     },
-    "@babel/parser": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.0.tgz",
-      "integrity": "sha512-GqL+Z0d7B7ADlQBMXlJgvXEbtt5qlqd1YQ5fr12hTSfh7O/vgrEIvJxU2e7aSVrEUn75zTZ6Nd0s8tthrlZnrQ==",
-      "dev": true
+    "@babel/preset-react": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.4.tgz",
+      "integrity": "sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-transform-react-display-name": "^7.7.4",
+        "@babel/plugin-transform-react-jsx": "^7.7.4",
+        "@babel/plugin-transform-react-jsx-self": "^7.7.4",
+        "@babel/plugin-transform-react-jsx-source": "^7.7.4"
+      }
+    },
+    "@babel/preset-typescript": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.7.tgz",
+      "integrity": "sha512-Apg0sCTovsSA+pEaI8efnA44b9x4X/7z4P8vsWMiN8rSUaM4y4+Shl5NMWnMl6njvt96+CEb6jwpXAKYAVCSQA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-transform-typescript": "^7.7.4"
+      }
     },
     "@babel/template": {
       "version": "7.7.0",
@@ -781,6 +2674,15 @@
         "resolve": "^1.12.0"
       }
     },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+      "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
     "backo2": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
@@ -1113,6 +3015,17 @@
         "stream-throttle": "^0.1.3"
       }
     },
+    "browserslist": {
+      "version": "4.8.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz",
+      "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001017",
+        "electron-to-chromium": "^1.3.322",
+        "node-releases": "^1.1.44"
+      }
+    },
     "bs-recipes": {
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
@@ -1209,6 +3122,12 @@
         }
       }
     },
+    "caniuse-lite": {
+      "version": "1.0.30001019",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz",
+      "integrity": "sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g==",
+      "dev": true
+    },
     "capture-stack-trace": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
@@ -1518,6 +3437,15 @@
       "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
       "dev": true
     },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
     "cookie": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
@@ -1539,6 +3467,24 @@
       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
       "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA=="
     },
+    "core-js-compat": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.2.tgz",
+      "integrity": "sha512-+G28dzfYGtAM+XGvB1C5AS1ZPKfQ47HLhcdeIQdZgQnJVdp7/D0m+W/TErwhgsX6CujRUk/LebB6dCrKrtJrvQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.8.3",
+        "semver": "7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+          "dev": true
+        }
+      }
+    },
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -1758,6 +3704,12 @@
         "kindof": ">= 2.0.0 < 3"
       }
     },
+    "electron-to-chromium": {
+      "version": "1.3.328",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.328.tgz",
+      "integrity": "sha512-x4XefnFxDxFwaQ01d/pppJP9meWhOIJ/gtI6/4jqkpsadq79uL7NYSaX64naLmJqvzUBjSrO3IM2+1b/W9KdPg==",
+      "dev": true
+    },
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2781,6 +4733,12 @@
         "minipass": "^2.6.0"
       }
     },
+    "fs-readdir-recursive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+      "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+      "dev": true
+    },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -3782,6 +5740,15 @@
         }
       }
     },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
     "invert-kv": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
@@ -4145,11 +6112,16 @@
       "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
       "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="
     },
+    "js-levenshtein": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+      "dev": true
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
       "version": "3.13.1",
@@ -4437,6 +6409,14 @@
       "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==",
       "dev": true
     },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
     "loud-rejection": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
@@ -5123,6 +7103,23 @@
         }
       }
     },
+    "node-releases": {
+      "version": "1.1.44",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.44.tgz",
+      "integrity": "sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw==",
+      "dev": true,
+      "requires": {
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
     "node-sass": {
       "version": "4.13.0",
       "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz",
@@ -5930,6 +7927,12 @@
         "fast-diff": "^1.1.2"
       }
     },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
+    },
     "process": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
@@ -5954,6 +7957,16 @@
         "nodegit-promise": "~4.0.0"
       }
     },
+    "prop-types": {
+      "version": "15.7.2",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.8.1"
+      }
+    },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -6027,6 +8040,32 @@
         }
       }
     },
+    "react": {
+      "version": "16.12.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz",
+      "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "prop-types": "^15.6.2"
+      }
+    },
+    "react-dom": {
+      "version": "16.12.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz",
+      "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "prop-types": "^15.6.2",
+        "scheduler": "^0.18.0"
+      }
+    },
+    "react-is": {
+      "version": "16.12.0",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
+      "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q=="
+    },
     "read-pkg": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -6086,11 +8125,35 @@
         "strip-indent": "^1.0.1"
       }
     },
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
+      "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
     "regenerator-runtime": {
       "version": "0.13.3",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
       "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
     },
+    "regenerator-transform": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
+      "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
+      "dev": true,
+      "requires": {
+        "private": "^0.1.6"
+      }
+    },
     "regex-not": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@@ -6106,6 +8169,20 @@
       "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
       "dev": true
     },
+    "regexpu-core": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
+      "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.1.0",
+        "regjsgen": "^0.5.0",
+        "regjsparser": "^0.6.0",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.1.0"
+      }
+    },
     "registry-auth-token": {
       "version": "3.4.0",
       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
@@ -6123,6 +8200,29 @@
         "rc": "^1.0.1"
       }
     },
+    "regjsgen": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz",
+      "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -6362,6 +8462,15 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
+    "scheduler": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz",
+      "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -6661,6 +8770,12 @@
       "integrity": "sha512-oQnO02I7JDbtrSKN8Qs3upobCQRythJCBn3DzPmv4m/SoPvhZJDVqHDFkRZ1lZhN2GkBqOR3m7WT79190z9kEg==",
       "dev": true
     },
+    "slash": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+      "dev": true
+    },
     "slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -7567,6 +9682,34 @@
         }
       }
     },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
+      "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
+      "dev": true
+    },
     "union-value": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
diff --git a/package.json b/package.json
index ceb5a3174992a9836d7534b38e4b05d54a565cac..63fc4d8390885c0de8f39ec3117165460d5892e4 100644
--- a/package.json
+++ b/package.json
@@ -26,12 +26,19 @@
     "nodemon": "^1.19.4",
     "nunjucks": "^3.2.0",
     "nunjucks-date-filter": "^0.1.1",
+    "react": "^16.12.0",
+    "react-dom": "^16.12.0",
     "syntax-error": "^1.4.0",
     "toml": "^3.0.0",
     "toml-js": "0.0.8",
     "walk": "^2.3.14"
   },
   "devDependencies": {
+    "@babel/cli": "^7.7.7",
+    "@babel/core": "^7.7.7",
+    "@babel/preset-env": "^7.7.7",
+    "@babel/preset-react": "^7.7.4",
+    "@babel/preset-typescript": "^7.7.7",
     "babel-eslint": "^10.0.3",
     "eslint": "^6.6.0",
     "eslint-config-airbnb-base": "^14.0.0",
diff --git a/sitegin/config.js b/sitegin/config.js
index 216577f466fca5d21a010602accfbcb113868d8b..716ae58960f48d90847a75f3478e2f19cc0f05c6 100644
--- a/sitegin/config.js
+++ b/sitegin/config.js
@@ -26,6 +26,12 @@ const options = cli.parse({
     'string',
     'theme',
   ],
+  themesourcedir: [
+    null,
+    'Allows to specify arbitrary theme source directory',
+    'string',
+    'theme-source',
+  ],
   builddir: [
     null,
     'Allows to specify arbitrary content directory.',
@@ -63,6 +69,7 @@ module.exports = () => {
     const config = {
       options,
       builddir,
+      themeSourceDir: options.themesourcedir,
       sourceDir: options.contentdir,
       staticDir: options.staticdir,
       themeDir: options.themedir,
diff --git a/sitegin/index.js b/sitegin/index.js
index 2923490f0e788af199997841af1858f03f5b8fe8..e1ea9df37094cb435f0d2543c12bbe141d740561 100755
--- a/sitegin/index.js
+++ b/sitegin/index.js
@@ -57,7 +57,7 @@ function sitegin(config) {
         doSync()
         if (!first) {
           first = true
-          copyStaticFiles(config.builddir, config.staticDir, config.themeDir)
+          copyStaticFiles(config.builddir, config.staticDir)
         }
         if (runAgain) run()
       })
@@ -78,7 +78,7 @@ function sitegin(config) {
   console.log('Sitegin successfully loaded')
   run()
 
-  rendersass(config.builddir, config.themeDir)
+  rendersass(config.builddir, config.themeSourceDir)
 
   if (!options.noserver) {
     const sync = require('browser-sync').create()
@@ -86,6 +86,7 @@ function sitegin(config) {
       sync.reload('*')
     }
     sync.init({
+      open: false,
       server: {
         baseDir: config.builddir,
       },
@@ -111,7 +112,7 @@ function sitegin(config) {
   }
 }
 
-function copyStaticFiles(builddir, staticdir, themedir) {
+function copyStaticFiles(builddir, staticdir) {
   // STATIC FILES
   const fsextra = require('node-fs-extra')
   fsextra.copy(
@@ -127,25 +128,18 @@ function copyStaticFiles(builddir, staticdir, themedir) {
   fsextra.copy(`${staticdir}/articles`, `${builddir}/clanek`, function() {
     console.log('copy static/articles done')
   })
-  fsextra.copy(
-    `${themedir}/static`,
-    builddir,
-    function(file) {
-      return !file.match('\\.git')
-    },
-    function() {
-      console.log(`copy ${themedir}/static done`)
-    },
-  )
 }
 
-function rendersass(builddir, themedir) {
+function rendersass(builddir, themesourcedir) {
   // SASS
   const sass = require('node-sass')
   const fs = require('fs')
   const mkdirp = require('mkdirp')
 
-  sass.render({ file: `${themedir}/sass/style.scss` }, function(err, result) {
+  sass.render({ file: `${themesourcedir}/sass/style.scss` }, function(
+    err,
+    result,
+  ) {
     if (err === null) {
       console.log('compiled sass')
       mkdirp(`${builddir}/theme`, () => {
diff --git a/sitegin/nunjucks.js b/sitegin/nunjucks.js
deleted file mode 100644
index 38f9f09d5f95c8546b432c0e1ef9e45ce27879ea..0000000000000000000000000000000000000000
--- a/sitegin/nunjucks.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * This job renders `data` using nunjucks template `type`
- */
-
-const nunjucks = require('nunjucks')
-const fs = require('fs')
-const dateFilter = require('nunjucks-date-filter')
-const util = require('util')
-const url = require('url')
-
-const config = require('./config')
-
-console.log(`watch: ${config.watch}`)
-const env = new nunjucks.Environment(
-  new nunjucks.FileSystemLoader(`${config.themeDir}/templates`, {
-    watch: config.watch,
-  }),
-)
-
-env.addFilter('date', dateFilter)
-
-env.addFilter('paginationList', (page, count) => {
-  let curPage = page
-  const pages = []
-  pages.push(curPage)
-  for (let i = 0; i < count; i += 1) {
-    curPage = curPage.metadata.prevpage
-    if (curPage === undefined) break
-    pages.unshift(curPage)
-  }
-
-  curPage = page
-  for (let i = 0; i < count; i += 1) {
-    curPage = curPage.metadata.nextpage
-    if (curPage === undefined) break
-    pages.push(curPage)
-  }
-  return pages
-})
-
-env.addFilter('inspect', obj => util.inspect(obj))
-
-env.addFilter('log', obj => console.log(obj))
-
-env.addFilter('relURL', (filename, dir_) => {
-  let dir = dir_
-  if (filename.substr(0, 1) === '/' || filename.match('://')) return filename
-  if (dir.substr(0, 1) !== '/') dir = `/${dir}`
-  if (filename.match(/\/$/)) return dir + filename
-  if (dir.match(/\/$/)) return dir + filename
-  return `${dir}/${filename}`
-})
-
-env.addFilter('absURL', (rel, base) => url.resolve(base, rel))
-
-let formats = {}
-
-module.exports = (data, type_) =>
-  new Promise((resolve, reject) => {
-    if (formats[type_]) resolve(formats[type_])
-    else {
-      fs.readdir(`${config.themeDir}/templates`, (err, files_) => {
-        if (err) {
-          console.log(config)
-          reject(
-            new Error(`Error listing files in ${config.themeDir}/templates`),
-          )
-          return
-        }
-
-        const files = files_.filter(file => file.match(`${type_}..*.nunj`))
-
-        const filteredFiles = []
-        let todo = 0
-        files.forEach(file => {
-          fs.stat(`${config.themeDir}/templates/${file}`, (err2, stat) => {
-            if (err2)
-              reject(
-                new Error(`Error stating ${config.themeDir}/templates${file}`),
-              )
-            if (stat.isFile()) filteredFiles.push(file)
-            todo -= 1
-            if (todo <= 0) {
-              formats[type_] = filteredFiles
-              resolve(filteredFiles)
-            }
-          })
-          todo += 1
-        })
-      })
-    }
-  })
-    .then(filelist => {
-      const promises = []
-      filelist.forEach(file => {
-        const type = file.replace(/^.*\.([a-z]+)\.nunj/, '$1')
-        promises.push(
-          new Promise((resolve, reject) => {
-            env.getTemplate(file, (err, tmpl) => {
-              if (err)
-                reject(new Error(`Failed to load template ${type}.html.nunj`))
-              resolve({ tmpl, type, file })
-            })
-          }),
-        )
-      })
-      return Promise.all(promises)
-    })
-    .then(tmpls => {
-      const promises = []
-      tmpls.forEach(o => {
-        promises.push(
-          new Promise((resolve, reject) => {
-            const param = {
-              ...data,
-              config: {
-                ...data.config,
-                baseurl: config ? config.options.baseurl : '',
-              },
-            }
-            o.tmpl.render(param, (err, val) => {
-              if (err) {
-                // reject(new Error('Error rendering template '+o.file));
-                reject(err)
-              }
-              resolve({ content: val, type: o.type })
-            })
-          }),
-        )
-      })
-      return Promise.all(promises)
-    })
-
-module.exports.reset = () => {
-  formats = {}
-}
diff --git a/sitegin/templates.js b/sitegin/templates.js
new file mode 100644
index 0000000000000000000000000000000000000000..564ccba6e1208f9b3b170670d5fd007f4437cce8
--- /dev/null
+++ b/sitegin/templates.js
@@ -0,0 +1,40 @@
+/*
+ * This job renders `data` using nunjucks template `type`
+ */
+const React = require('react')
+const ReactDOM = require('react-dom/server')
+const path = require('path')
+
+const config = require('./config')
+
+module.exports = async (data, type_) => {
+  try {
+    // eslint-disable-next-line import/no-dynamic-require,global-require
+    const Template = require(path.join(
+      process.cwd(),
+      config.themeDir,
+      'templates',
+      `${type_}.js`,
+    )).default
+    return [
+      {
+        content: ReactDOM.renderToStaticMarkup(
+          React.createElement(Template, {
+            ...data,
+            config: {
+              ...data.config,
+              baseurl: config ? config.options.baseurl : '',
+            },
+          }),
+        ),
+        type: 'html',
+      },
+    ]
+  } catch (e) {
+    // temporary until I implement all templates
+    if (e.code === 'MODULE_NOT_FOUND') return []
+    throw e
+  }
+}
+
+module.exports.reset = () => {}
diff --git a/sitegin/theme.js b/sitegin/theme.js
index 2bdbb1557e61122644fae1ca9b0804bc503362a5..b2cc45e39b2b1ecd137b58d2444aeaba9bab518c 100644
--- a/sitegin/theme.js
+++ b/sitegin/theme.js
@@ -1,4 +1,4 @@
-const nunjucks = require('./nunjucks')
+const templates = require('./templates')
 
 module.exports = function theme(_obj) {
   console.log('Build step: Theme')
@@ -11,7 +11,7 @@ module.exports = function theme(_obj) {
 
     const runJob = (obj, type) => {
       todo += 1
-      nunjucks(obj, type, _obj.config)
+      templates(obj, type, _obj.config)
         .then(data => {
           // eslint-disable-next-line no-param-reassign
           if (!obj.rendered) obj.rendered = []
diff --git a/old-theme/static/theme/favicons/android-chrome-144x144.png b/static/theme/favicons/android-chrome-144x144.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-144x144.png
rename to static/theme/favicons/android-chrome-144x144.png
diff --git a/old-theme/static/theme/favicons/android-chrome-192x192.png b/static/theme/favicons/android-chrome-192x192.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-192x192.png
rename to static/theme/favicons/android-chrome-192x192.png
diff --git a/old-theme/static/theme/favicons/android-chrome-36x36.png b/static/theme/favicons/android-chrome-36x36.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-36x36.png
rename to static/theme/favicons/android-chrome-36x36.png
diff --git a/old-theme/static/theme/favicons/android-chrome-48x48.png b/static/theme/favicons/android-chrome-48x48.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-48x48.png
rename to static/theme/favicons/android-chrome-48x48.png
diff --git a/old-theme/static/theme/favicons/android-chrome-72x72.png b/static/theme/favicons/android-chrome-72x72.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-72x72.png
rename to static/theme/favicons/android-chrome-72x72.png
diff --git a/old-theme/static/theme/favicons/android-chrome-96x96.png b/static/theme/favicons/android-chrome-96x96.png
similarity index 100%
rename from old-theme/static/theme/favicons/android-chrome-96x96.png
rename to static/theme/favicons/android-chrome-96x96.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-114x114.png b/static/theme/favicons/apple-touch-icon-114x114.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-114x114.png
rename to static/theme/favicons/apple-touch-icon-114x114.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-120x120.png b/static/theme/favicons/apple-touch-icon-120x120.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-120x120.png
rename to static/theme/favicons/apple-touch-icon-120x120.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-144x144.png b/static/theme/favicons/apple-touch-icon-144x144.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-144x144.png
rename to static/theme/favicons/apple-touch-icon-144x144.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-152x152.png b/static/theme/favicons/apple-touch-icon-152x152.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-152x152.png
rename to static/theme/favicons/apple-touch-icon-152x152.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-180x180.png b/static/theme/favicons/apple-touch-icon-180x180.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-180x180.png
rename to static/theme/favicons/apple-touch-icon-180x180.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-57x57.png b/static/theme/favicons/apple-touch-icon-57x57.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-57x57.png
rename to static/theme/favicons/apple-touch-icon-57x57.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-60x60.png b/static/theme/favicons/apple-touch-icon-60x60.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-60x60.png
rename to static/theme/favicons/apple-touch-icon-60x60.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-72x72.png b/static/theme/favicons/apple-touch-icon-72x72.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-72x72.png
rename to static/theme/favicons/apple-touch-icon-72x72.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-76x76.png b/static/theme/favicons/apple-touch-icon-76x76.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-76x76.png
rename to static/theme/favicons/apple-touch-icon-76x76.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon-precomposed.png b/static/theme/favicons/apple-touch-icon-precomposed.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon-precomposed.png
rename to static/theme/favicons/apple-touch-icon-precomposed.png
diff --git a/old-theme/static/theme/favicons/apple-touch-icon.png b/static/theme/favicons/apple-touch-icon.png
similarity index 100%
rename from old-theme/static/theme/favicons/apple-touch-icon.png
rename to static/theme/favicons/apple-touch-icon.png
diff --git a/old-theme/static/theme/favicons/browserconfig.xml b/static/theme/favicons/browserconfig.xml
similarity index 100%
rename from old-theme/static/theme/favicons/browserconfig.xml
rename to static/theme/favicons/browserconfig.xml
diff --git a/old-theme/static/theme/favicons/favicon-16x16.png b/static/theme/favicons/favicon-16x16.png
similarity index 100%
rename from old-theme/static/theme/favicons/favicon-16x16.png
rename to static/theme/favicons/favicon-16x16.png
diff --git a/old-theme/static/theme/favicons/favicon-194x194.png b/static/theme/favicons/favicon-194x194.png
similarity index 100%
rename from old-theme/static/theme/favicons/favicon-194x194.png
rename to static/theme/favicons/favicon-194x194.png
diff --git a/old-theme/static/theme/favicons/favicon-32x32.png b/static/theme/favicons/favicon-32x32.png
similarity index 100%
rename from old-theme/static/theme/favicons/favicon-32x32.png
rename to static/theme/favicons/favicon-32x32.png
diff --git a/old-theme/static/theme/favicons/favicon-96x96.png b/static/theme/favicons/favicon-96x96.png
similarity index 100%
rename from old-theme/static/theme/favicons/favicon-96x96.png
rename to static/theme/favicons/favicon-96x96.png
diff --git a/old-theme/static/theme/favicons/favicon.ico b/static/theme/favicons/favicon.ico
similarity index 100%
rename from old-theme/static/theme/favicons/favicon.ico
rename to static/theme/favicons/favicon.ico
diff --git a/old-theme/static/theme/favicons/manifest.json b/static/theme/favicons/manifest.json
similarity index 100%
rename from old-theme/static/theme/favicons/manifest.json
rename to static/theme/favicons/manifest.json
diff --git a/old-theme/static/theme/favicons/mstile-144x144.png b/static/theme/favicons/mstile-144x144.png
similarity index 100%
rename from old-theme/static/theme/favicons/mstile-144x144.png
rename to static/theme/favicons/mstile-144x144.png
diff --git a/old-theme/static/theme/favicons/mstile-150x150.png b/static/theme/favicons/mstile-150x150.png
similarity index 100%
rename from old-theme/static/theme/favicons/mstile-150x150.png
rename to static/theme/favicons/mstile-150x150.png
diff --git a/old-theme/static/theme/favicons/mstile-310x150.png b/static/theme/favicons/mstile-310x150.png
similarity index 100%
rename from old-theme/static/theme/favicons/mstile-310x150.png
rename to static/theme/favicons/mstile-310x150.png
diff --git a/old-theme/static/theme/favicons/mstile-310x310.png b/static/theme/favicons/mstile-310x310.png
similarity index 100%
rename from old-theme/static/theme/favicons/mstile-310x310.png
rename to static/theme/favicons/mstile-310x310.png
diff --git a/old-theme/static/theme/favicons/mstile-70x70.png b/static/theme/favicons/mstile-70x70.png
similarity index 100%
rename from old-theme/static/theme/favicons/mstile-70x70.png
rename to static/theme/favicons/mstile-70x70.png
diff --git a/old-theme/static/theme/favicons/safari-pinned-tab.svg b/static/theme/favicons/safari-pinned-tab.svg
similarity index 100%
rename from old-theme/static/theme/favicons/safari-pinned-tab.svg
rename to static/theme/favicons/safari-pinned-tab.svg
diff --git a/old-theme/static/theme/highlight.css b/static/theme/highlight.css
similarity index 100%
rename from old-theme/static/theme/highlight.css
rename to static/theme/highlight.css
diff --git a/old-theme/static/theme/icon.png b/static/theme/icon.png
similarity index 100%
rename from old-theme/static/theme/icon.png
rename to static/theme/icon.png
diff --git a/old-theme/static/theme/icon.svg b/static/theme/icon.svg
similarity index 100%
rename from old-theme/static/theme/icon.svg
rename to static/theme/icon.svg
diff --git a/old-theme/static/theme/icon56.png b/static/theme/icon56.png
similarity index 100%
rename from old-theme/static/theme/icon56.png
rename to static/theme/icon56.png
diff --git a/old-theme/static/theme/icon64.png b/static/theme/icon64.png
similarity index 100%
rename from old-theme/static/theme/icon64.png
rename to static/theme/icon64.png
diff --git a/old-theme/static/theme/icon_blackbg.png b/static/theme/icon_blackbg.png
similarity index 100%
rename from old-theme/static/theme/icon_blackbg.png
rename to static/theme/icon_blackbg.png
diff --git a/old-theme/static/theme/icon_borderless.png b/static/theme/icon_borderless.png
similarity index 100%
rename from old-theme/static/theme/icon_borderless.png
rename to static/theme/icon_borderless.png
diff --git a/old-theme/static/theme/icon_borderless.svg b/static/theme/icon_borderless.svg
similarity index 100%
rename from old-theme/static/theme/icon_borderless.svg
rename to static/theme/icon_borderless.svg
diff --git a/old-theme/static/theme/icon_circle.png b/static/theme/icon_circle.png
similarity index 100%
rename from old-theme/static/theme/icon_circle.png
rename to static/theme/icon_circle.png
diff --git a/old-theme/static/theme/js/init.js b/static/theme/js/init.js
similarity index 100%
rename from old-theme/static/theme/js/init.js
rename to static/theme/js/init.js
diff --git a/old-theme/static/theme/js/jquery-1.12.0.min.js b/static/theme/js/jquery-1.12.0.min.js
similarity index 100%
rename from old-theme/static/theme/js/jquery-1.12.0.min.js
rename to static/theme/js/jquery-1.12.0.min.js
diff --git a/old-theme/static/theme/js/materialize.js b/static/theme/js/materialize.js
similarity index 100%
rename from old-theme/static/theme/js/materialize.js
rename to static/theme/js/materialize.js
diff --git a/old-theme/static/theme/js/materialize.min.js b/static/theme/js/materialize.min.js
similarity index 100%
rename from old-theme/static/theme/js/materialize.min.js
rename to static/theme/js/materialize.min.js
diff --git a/old-theme/static/theme/js/socket.io-1.4.5.js b/static/theme/js/socket.io-1.4.5.js
similarity index 100%
rename from old-theme/static/theme/js/socket.io-1.4.5.js
rename to static/theme/js/socket.io-1.4.5.js
diff --git a/old-theme/static/theme/lightbox2/.gitignore b/static/theme/lightbox2/.gitignore
similarity index 100%
rename from old-theme/static/theme/lightbox2/.gitignore
rename to static/theme/lightbox2/.gitignore
diff --git a/old-theme/static/theme/lightbox2/.jscsrc b/static/theme/lightbox2/.jscsrc
similarity index 100%
rename from old-theme/static/theme/lightbox2/.jscsrc
rename to static/theme/lightbox2/.jscsrc
diff --git a/old-theme/static/theme/lightbox2/.jshintrc b/static/theme/lightbox2/.jshintrc
similarity index 100%
rename from old-theme/static/theme/lightbox2/.jshintrc
rename to static/theme/lightbox2/.jshintrc
diff --git a/old-theme/static/theme/lightbox2/dist/css/lightbox.min.css b/static/theme/lightbox2/dist/css/lightbox.min.css
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/css/lightbox.min.css
rename to static/theme/lightbox2/dist/css/lightbox.min.css
diff --git a/old-theme/static/theme/lightbox2/dist/images/close.png b/static/theme/lightbox2/dist/images/close.png
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/images/close.png
rename to static/theme/lightbox2/dist/images/close.png
diff --git a/old-theme/static/theme/lightbox2/dist/images/loading.gif b/static/theme/lightbox2/dist/images/loading.gif
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/images/loading.gif
rename to static/theme/lightbox2/dist/images/loading.gif
diff --git a/old-theme/static/theme/lightbox2/dist/images/next.png b/static/theme/lightbox2/dist/images/next.png
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/images/next.png
rename to static/theme/lightbox2/dist/images/next.png
diff --git a/old-theme/static/theme/lightbox2/dist/images/prev.png b/static/theme/lightbox2/dist/images/prev.png
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/images/prev.png
rename to static/theme/lightbox2/dist/images/prev.png
diff --git a/old-theme/static/theme/lightbox2/dist/js/lightbox.min.js b/static/theme/lightbox2/dist/js/lightbox.min.js
similarity index 100%
rename from old-theme/static/theme/lightbox2/dist/js/lightbox.min.js
rename to static/theme/lightbox2/dist/js/lightbox.min.js
diff --git a/old-theme/static/theme/logo56.png b/static/theme/logo56.png
similarity index 100%
rename from old-theme/static/theme/logo56.png
rename to static/theme/logo56.png
diff --git a/old-theme/static/theme/logo64.png b/static/theme/logo64.png
similarity index 100%
rename from old-theme/static/theme/logo64.png
rename to static/theme/logo64.png
diff --git a/theme-source/partials/base.js b/theme-source/partials/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..2826a8be1a0777586be31f14a91d659abb7187fb
--- /dev/null
+++ b/theme-source/partials/base.js
@@ -0,0 +1,527 @@
+import React from 'react'
+import { SymbolSearch, SymbolMenu, SymbolFacebook } from './svgs'
+import { Search } from './search'
+
+export function Base({
+  head = null,
+  metadata = {},
+  canonicalURL,
+  config,
+  children,
+  footerlink = null,
+}) {
+  return (
+    <html lang="en">
+      <head>
+        <meta httpEquiv="Content-Type" content="text/html; charset=UTF-8" />
+        <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1.0"
+        />
+        <title>{metadata.title || 'Radioklub OK1KVK'}</title>
+
+        <link rel="canonical" href={canonicalURL} />
+        <meta
+          property="og:title"
+          content={metadata.title || 'Radioklub OK1KVK'}
+        />
+        <meta property="og:locale" content="cs_CZ" />
+        <meta property="og:url" content={canonicalURL} />
+        <meta property="og:site_name" content="ok1kvk.cz" />
+        <meta property="fb:app_id" content="1419886504744454" />
+
+        <link
+          href="https://fonts.googleapis.com/css?family=Roboto&subset=latin,latin-ext"
+          rel="stylesheet"
+          type="text/css"
+        />
+        <link
+          href={`${config.baseurl}/theme/style.css?v=2`}
+          type="text/css"
+          rel="stylesheet"
+          media="screen,projection"
+        />
+        <link
+          href={`${config.baseurl}/theme/highlight.css`}
+          type="text/css"
+          rel="stylesheet"
+          media="screen,projection"
+        />
+        <link
+          href={`${config.baseurl}/theme/lightbox2/dist/css/lightbox.min.css`}
+          type="text/css"
+          rel="stylesheet"
+          media="screen,projection"
+        />
+
+        <script
+          src={`${config.baseurl}/theme/js/jquery-1.12.0.min.js`}
+        ></script>
+
+        <link
+          rel="apple-touch-icon"
+          sizes="57x57"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-57x57.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="60x60"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-60x60.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="72x72"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-72x72.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="76x76"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-76x76.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="114x114"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-114x114.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="120x120"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-120x120.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="144x144"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-144x144.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="152x152"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-152x152.png?v=3`}
+        />
+        <link
+          rel="apple-touch-icon"
+          sizes="180x180"
+          href={`${config.baseurl}/theme/favicons/apple-touch-icon-180x180.png?v=3`}
+        />
+        <link
+          rel="icon"
+          type="image/png"
+          href={`${config.baseurl}/theme/favicons/favicon-32x32.png?v=3`}
+          sizes="32x32"
+        />
+        <link
+          rel="icon"
+          type="image/png"
+          href={`${config.baseurl}/theme/favicons/android-chrome-192x192.png?v=3`}
+          sizes="192x192"
+        />
+        <link
+          rel="icon"
+          type="image/png"
+          href={`${config.baseurl}/theme/favicons/favicon-96x96.png?v=3`}
+          sizes="96x96"
+        />
+        <link
+          rel="icon"
+          type="image/png"
+          href={`${config.baseurl}/theme/favicons/favicon-16x16.png?v=3`}
+          sizes="16x16"
+        />
+        <link
+          rel="manifest"
+          href={`${config.baseurl}/theme/favicons/manifest.json?v=3`}
+        />
+        <link
+          rel="mask-icon"
+          href={`${config.baseurl}/theme/favicons/safari-pinned-tab.svg?v=3`}
+          color="#0288d1"
+        />
+        <link
+          rel="shortcut icon"
+          href={`${config.baseurl}/theme/favicons/favicon.ico?v=3`}
+        />
+        <meta name="msapplication-TileColor" content="#2d89ef" />
+        <meta
+          name="msapplication-TileImage"
+          content={`${config.baseurl}/theme/favicons/mstile-144x144.png?v=3`}
+        />
+        <meta
+          name="msapplication-config"
+          content={`${config.baseurl}/theme/favicons/browserconfig.xml?v=3`}
+        />
+        <meta name="theme-color" content="#0288d1" />
+        {config.devel ? (
+          <script
+            src={`${config.baseurl}/theme/js/socket.io-1.4.5.js`}
+          ></script>
+        ) : null}
+        {head}
+      </head>
+      <body>
+        {/* % block bodyattr %}{% endblock % */}
+        <div id="all">
+          {/* Top nav */}
+          <nav
+            className="supernav"
+            role="navigation"
+            style={{ zIndex: 5, position: 'absolute' }}
+          >
+            <div className="nav-wrapper container">
+              <a
+                data-activates="nav-mobile"
+                className="menu-icon hide-on-med-and-up"
+                style={{ float: 'left' }}
+              >
+                <SymbolMenu color="#fff" size={false} />
+              </a>
+              <div style={{ zIndex: 2 }} className="brand-logo">
+                <a id="logo-container" href={`${config.baseurl}/tag/vse/1/`}>
+                  <img
+                    className="hide-on-small-and-up"
+                    src={`${config.baseurl}/theme/icon56.png`}
+                  />
+                  <img
+                    className="hide-on-med-and-up hide-on-ultra-small"
+                    src={`${config.baseurl}/theme/logo56.png`}
+                  />
+                  <img
+                    className="hide-on-small-only"
+                    src={`${config.baseurl}/theme/logo64.png`}
+                  />
+                </a>
+              </div>
+              <div className="toplinks">
+                <a className="hide-on-small-only left" id="aktuality">
+                  Aktuality
+                </a>
+                <a className="hide-on-small-only left" id="clanky">
+                  Články
+                </a>
+                <a className="hide-on-small-only left" id="o-nas">
+                  O nás
+                </a>
+                <a className="search-icon left">
+                  <SymbolSearch color="#fff" size={false} />
+                </a>
+              </div>
+            </div>
+          </nav>
+          <script
+            dangerouslySetInnerHTML={{
+              __html: `
+      $(document).ready(function() {
+        $(".menu-icon").sideNav();
+        $("#o-nas").click(function() {
+          var body = $("body");
+          body.removeClass("show-subnav2");
+          body.removeClass("show-subnav3");
+          if(body.hasClass("show-subnav1"))
+            body.removeClass("show-subnav1");
+          else
+            body.addClass("show-subnav1");
+        });
+        $("#aktuality").click(function() {
+          var body = $("body");
+          body.removeClass("show-subnav1");
+          body.removeClass("show-subnav3");
+          if(body.hasClass("show-subnav2"))
+            body.removeClass("show-subnav2");
+          else
+            body.addClass("show-subnav2");
+        });
+        $("#clanky").click(function() {
+          var body = $("body");
+          body.removeClass("show-subnav1");
+          body.removeClass("show-subnav2");
+          if(body.hasClass("show-subnav3"))
+            body.removeClass("show-subnav3");
+          else
+            body.addClass("show-subnav3");
+        })
+        $("body").click(function(e) {
+          if(!($(e.target).parents("a").length || $(e.target).is("a"))) {
+            $("body").removeClass("show-subnav2").removeClass("show-subnav1");
+          }
+        });
+      });
+    `,
+            }}
+          />
+          {/* Side nav */}
+          <ul id="nav-mobile" className="side-nav collapsible">
+            <li className="no-padding">
+              <a className="collapsible-header waves-effect waves-teal">
+                Aktuality
+              </a>
+              <div className="collapsible-body">
+                <ul>
+                  <li>
+                    <a href={`${config.baseurl}/tag/aktuality`}>
+                      VÅ¡echny aktuality
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/pozvanky`}>Pozvánky</a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/stalo-se`}>Stalo se</a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/zavody`}>Závody</a>
+                  </li>
+                </ul>
+              </div>
+            </li>
+            <li className="no-padding">
+              <a className="collapsible-header waves-effect waves-teal">
+                Články
+              </a>
+              <div className="collapsible-body">
+                <ul>
+                  <li>
+                    <a href={`${config.baseurl}/tag/clanky`}>Všechny články</a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/programovani`}>
+                      Programování
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/mikroprocesory`}>
+                      Mikroprocesory
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/konstrukce`}>Konstrukce</a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/technicke-clanky`}>
+                      Technické články
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/tag/zajimavosti`}>
+                      Zajímavosti
+                    </a>
+                  </li>
+                </ul>
+              </div>
+            </li>
+            <li className="no-padding">
+              <a className="collapsible-header waves-effect waves-teal">
+                O nás
+              </a>
+              <div className="collapsible-body">
+                <ul>
+                  <li>
+                    <a href={`${config.baseurl}/clanek/o-radioklubu`}>
+                      O Radioklubu
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/clanek/kontakt`}>Kontakt</a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/clanek/krouzek-mladeze`}>
+                      Kroužek mládeže
+                    </a>
+                  </li>
+                  <li>
+                    <a href={`${config.baseurl}/clanek/pro-cleny-rk`}>
+                      Pro členy RK
+                    </a>
+                  </li>
+                </ul>
+              </div>
+            </li>
+          </ul>
+
+          {/* Lower nav */}
+          <nav
+            className="subnav subnav1 hide-on-small-and-down"
+            role="navigation"
+          >
+            <div className="nav-wrapper container">
+              <ul className="right">
+                <li>
+                  <a href={`${config.baseurl}/clanek/o-radioklubu`}>
+                    O Radioklubu
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/clanek/kontakt`}>Kontakt</a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/clanek/krouzek-mladeze`}>
+                    Kroužek mládeže
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/clanek/pro-cleny-rk`}>
+                    Pro členy RK
+                  </a>
+                </li>
+              </ul>
+            </div>
+          </nav>
+          {/* Lower nav 2 - Aktuality */}
+          <nav
+            className="subnav subnav2 hide-on-small-and-down"
+            role="navigation"
+          >
+            <div className="nav-wrapper container">
+              <ul className="right">
+                <li>
+                  <a href={`${config.baseurl}/tag/aktuality`}>
+                    VÅ¡echny aktuality
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/pozvanky`}>Pozvánky</a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/stalo-se`}>Stalo se</a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/zavody`}>Závody</a>
+                </li>
+              </ul>
+            </div>
+          </nav>
+          {/* Lower nav 3 - Články */}
+          <nav
+            className="subnav subnav3 hide-on-small-and-down"
+            role="navigation"
+          >
+            <div className="nav-wrapper container">
+              <ul className="right">
+                <li>
+                  <a href={`${config.baseurl}/tag/clanky`}>Všechny články</a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/programovani`}>
+                    Programování
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/mikroprocesory`}>
+                    Mikroprocesory
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/konstrukce`}>Konstrukce</a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/technicke-clanky`}>
+                    Technické články
+                  </a>
+                </li>
+                <li>
+                  <a href={`${config.baseurl}/tag/zajimavosti`}>Zajímavosti</a>
+                </li>
+              </ul>
+            </div>
+          </nav>
+          <Search />
+
+          {children}
+
+          <footer className="page-footer blue">
+            <div className="container s6">
+              <a
+                className="orange-text text-lighten-3"
+                target="_blank"
+                href="https://git.ok1kvk.cz/"
+              >
+                Gitlab
+              </a>{' '}
+              |
+              <a
+                className="orange-text text-lighten-3"
+                target="_blank"
+                href="http://forum.ok1kvk.cz/"
+              >
+                Fórum
+              </a>{' '}
+              |
+              <a
+                className="orange-text text-lighten-3"
+                href="/clanek/webkamera/"
+              >
+                Webkamera
+              </a>{' '}
+              |
+              <a
+                className="orange-text text-lighten-3"
+                href="/clanek/jak-nahlasit-chybu/"
+              >
+                Jak nahlásit chybu
+              </a>
+              {footerlink}
+              <div style={{ display: 'inline-block', height: '1em' }}>
+                <a
+                  style={{
+                    display: 'block',
+                    float: 'left',
+                    marginTop: '-.5em',
+                  }}
+                  target="_blank"
+                  href="https://www.facebook.com/ok1kvk"
+                >
+                  <SymbolFacebook color="white" size="2em" />
+                </a>
+              </div>
+            </div>
+            <div className="container s6">
+              Stránky pro OK1KVK vytvořila{' '}
+              <a
+                className="orange-text text-lighten-3"
+                target="_blank"
+                href="https://codewitchbella.com"
+              >
+                Isabella Skořepová
+              </a>{' '}
+              2015-2020
+            </div>
+          </footer>
+
+          <script src={`${config.baseurl}/theme/js/materialize.js`}></script>
+          <script src={`${config.baseurl}/theme/js/init.js`}></script>
+
+          <script
+            dangerouslySetInnerHTML={{
+              __html: `
+      (function($) {
+      var onresize = function(){
+        $("footer").height("auto");
+        $("#content").css("margin-bottom",$("footer").height());
+      };
+      $(window).resize(onresize);
+      $(document).load(onresize);
+      $(document).ready(onresize);
+    })(jQuery);`,
+            }}
+          />
+          {config.debug ? null : (
+            <script
+              dangerouslySetInnerHTML={{
+                __html: `
+        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+        ga('create', 'UA-74646565-1', 'auto');
+        ga('send', 'pageview');
+      `,
+              }}
+            />
+          )}
+          <script
+            src={`${config.baseurl}/theme/lightbox2/dist/js/lightbox.min.js`}
+          ></script>
+        </div>
+      </body>
+    </html>
+  )
+}
diff --git a/theme-source/partials/list.js b/theme-source/partials/list.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ef1cc6b4313c1b2469eab8098933133c8f82cc8
--- /dev/null
+++ b/theme-source/partials/list.js
@@ -0,0 +1,239 @@
+import React from 'react'
+import moment from 'moment'
+import { Paginator } from './paginator'
+import { SymbolBackward, SymbolForward } from './svgs'
+
+function normalize(value, defaultValue) {
+  if (value === null || value === undefined || value === false) {
+    return defaultValue
+  }
+  return value
+}
+
+function truncate(input_, length_, killwords, end) {
+  let input = normalize(input_, '')
+  const length = length_ || 255
+
+  if (input.length <= length) {
+    return input
+  }
+
+  if (killwords) {
+    input = input.substring(0, length)
+  } else {
+    let idx = input.lastIndexOf(' ', length)
+    if (idx === -1) {
+      idx = length
+    }
+
+    input = input.substring(0, idx)
+  }
+
+  input += end !== undefined && end !== null ? end : '...'
+  return input
+}
+
+function trim(str) {
+  return str.replace(/^\s*|\s*$/g, '')
+}
+
+function striptags(input_, preserveLinebreaks) {
+  const input = normalize(input_, '')
+  const tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>|<!--[\s\S]*?-->/gi
+  const trimmedInput = trim(input.replace(tags, ''))
+  let res = ''
+  if (preserveLinebreaks) {
+    res = trimmedInput
+      .replace(/^ +| +$/gm, '') // remove leading and trailing spaces
+      .replace(/ +/g, ' ') // squash adjacent spaces
+      .replace(/(\r\n)/g, '\n') // normalize linebreaks (CRLF -> LF)
+      .replace(/\n\n\n+/g, '\n\n') // squash abnormal adjacent linebreaks
+  } else {
+    res = trimmedInput.replace(/\s+/gi, ' ')
+  }
+  return res
+}
+
+function dateFilter(date, format) {
+  let result
+  const errs = []
+  const args = []
+  let obj
+  Array.prototype.push.apply(args, arguments)
+  try {
+    obj = moment.utc(date)
+  } catch (err) {
+    errs.push(err)
+  }
+  if (obj) {
+    try {
+      if (obj[format] && typeof obj[format] === 'function') {
+        result = obj[format].apply(obj, args.slice(2))
+      } else {
+        result = obj.format(format)
+      }
+    } catch (err) {
+      errs.push(err)
+    }
+  }
+
+  if (errs.length) {
+    return errs.join('\n')
+  }
+  return result
+}
+
+export function List({ subtags, tag, content, metadata, file, config }) {
+  return (
+    <div id="content" class="container">
+      <div class="section">
+        <div class="row">
+          <div class="col">
+            <a class="breadcrumb">{tag.text}</a>
+            {subtags &&
+              subtags.map(subtag => (
+                <a
+                  href="{{ config.baseurl }}/{{ subtag.url }}"
+                  class="chip"
+                  key={subtag.url}
+                >
+                  {subtag.text}
+                </a>
+              ))}
+          </div>
+        </div>
+        <div class="row">
+          {content.map(page => (
+            <div class="col s12 m6 l4" key={page.file}>
+              <div class="block article">
+                <a href="{{ config.baseurl }}/{{ page.file }}">
+                  <div
+                    style={{
+                      height: 120,
+                      backgroundImage: page.metadata.image
+                        ? `url('{{ config.baseurl }}{{ page.metadata.image | relURL(page.file) }}')`
+                        : undefined,
+                    }}
+                    className="leadimage light-blue darken-2"
+                  ></div>
+                </a>
+                <div class="head-title">
+                  <a href="{{ config.baseurl }}/{{ page.file }}">
+                    <h5 class="center">{page.metadata.title}</h5>
+                  </a>
+                </div>
+                <div style={{ padding: '0px 10px' }} className="head-perex">
+                  {page.metadata.perex
+                    ? page.metadata.perex
+                    : page.metadata.perex_e
+                    ? truncate(page.metadata.perex_e)
+                    : page.content
+                    ? truncate(striptags(page.content))
+                    : null}
+                </div>
+                <div class="clear"></div>
+                <div style={{ padding: 10 }} className="head-info">
+                  <span
+                    style={{
+                      color: '#a2a2a2',
+                      textAlign: 'left',
+                      display: 'inline-block',
+                      width: '75%',
+                    }}
+                  >
+                    {dateFilter(page.metadata.published, 'D. M. YYYY')}} napsal
+                    {page.metadata.author.gender === 'F' ? 'a' : ''}{' '}
+                    {page.metadata.author.name}
+                  </span>
+                  <a
+                    style={{
+                      textAlign: 'right',
+                      display: 'inline-block',
+                      width: '25%',
+                    }}
+                    href="{{ config.baseurl }}/{{ page.file }}"
+                  >
+                    Číst&nbsp;dál
+                  </a>
+                </div>
+              </div>
+            </div>
+          ))}
+        </div>
+        <Paginator metadata={metadata} file={file} config={config} />
+      </div>
+
+      <div class="hide-on-small-only">
+        {metadata.prevurl && (
+          <div style={{ left: 0 }} class="sidelink sidelink-l">
+            <a href={`${config.baseurl}/${metadata.prevurl}`}>
+              <div>
+                <SymbolBackward />
+              </div>
+            </a>
+          </div>
+        )}
+        {metadata.nexturl && (
+          <div style={{ right: 0 }} class="sidelink sidelink-r">
+            <a href={`${config.baseurl}/${metadata.nexturl}`}>
+              <div>
+                <SymbolForward />
+              </div>
+            </a>
+          </div>
+        )}
+      </div>
+
+      <script
+        dangerouslySetInnerHTML={{
+          __html: `
+    (function($) {
+      var onresize = function(){
+        // equalize article sizes
+        $(".head-perex").height("auto");
+        var maxHeight = 0;
+        $(".head-perex").each(function(){
+          if ($(this).height() > maxHeight) { maxHeight = $(this).height(); }
+        });
+        $(".head-perex").height(maxHeight);
+
+        $(".head-title").height("auto");
+        maxHeight = 0;
+        $(".head-title").each(function(){
+          if ($(this).height() > maxHeight) { maxHeight = $(this).height(); }
+        });
+        $(".head-title").height(maxHeight);
+
+        $(".head-info").height("auto");
+        maxHeight = 0;
+        $(".head-info").each(function(){
+          if ($(this).height() > maxHeight) { maxHeight = $(this).height(); }
+        });
+        $(".head-info").height(maxHeight);
+
+        // Sidelink icons of same size
+        $(".sidelink-icon").css("top",$(window).height()/2);
+      };
+      $(window).resize(onresize);
+      $(document).load(onresize);
+      $(document).ready(onresize);
+      $(document).keyup(function(e) {
+        if($("#search-overlay").hasClass("shown")) return;
+        ${
+          metadata.nexturl
+            ? `if(e.key == "ArrowRight") window.location = "${config.baseurl}/${metadata.nexturl}";`
+            : ''
+        }
+        ${
+          metadata.prevurl
+            ? `if(e.key == "ArrowLeft") window.location = "${config.baseurl}/${metadata.prevurl}"`
+            : ''
+        }
+      });
+    })(jQuery);
+    `,
+        }}
+      />
+    </div>
+  )
+}
diff --git a/theme-source/partials/paginator.js b/theme-source/partials/paginator.js
new file mode 100644
index 0000000000000000000000000000000000000000..8dd2ed4a9366a10e92afb357014286fa52f6515c
--- /dev/null
+++ b/theme-source/partials/paginator.js
@@ -0,0 +1,102 @@
+import React from 'react'
+import {
+  SymbolDoubleChevronLeft,
+  SymbolChevronLeft,
+  SymbolChevronRight,
+  SymbolDoubleChevronRight,
+} from './svgs'
+
+function paginationList(page, count) {
+  let curPage = page
+  const pages = []
+  pages.push(curPage)
+  for (let i = 0; i < count; i += 1) {
+    curPage = curPage.metadata.prevpage
+    if (curPage === undefined) break
+    pages.unshift(curPage)
+  }
+
+  curPage = page
+  for (let i = 0; i < count; i += 1) {
+    curPage = curPage.metadata.nextpage
+    if (curPage === undefined) break
+    pages.push(curPage)
+  }
+  return pages
+}
+
+export function Paginator({ metadata, file, config }) {
+  return (
+    <ul class="pagination">
+      <li>
+        <a
+          href={
+            metadata.firstpage
+              ? `${config.baseurl}/${metadata.firstpage.file}`
+              : undefined
+          }
+        >
+          <SymbolDoubleChevronLeft
+            color={metadata.firstpage.file === file ? '#999' : '#000'}
+            size="1em"
+          />
+        </a>
+      </li>
+      <li>
+        <a
+          href={
+            metadata.prevpage
+              ? `${config.baseurl}/${metadata.prevpage.file}`
+              : undefined
+          }
+        >
+          <SymbolChevronLeft
+            color={metadata.prevpage ? '#000' : '#999'}
+            size="1em"
+          />
+        </a>
+      </li>
+      {paginationList(metadata.thispage, 4).map(page =>
+        page === metadata.thispage ? (
+          <li class="active" key={page.pagenumber}>
+            <a>{page.metadata.pagenumber}</a>
+          </li>
+        ) : (
+          <li class="waves-effect" key={page.pagenumber}>
+            <a href="{{ config.baseurl }}/{{ page.file }}">
+              {page.metadata.pagenumber}
+            </a>
+          </li>
+        ),
+      )}
+      <li>
+        <a
+          href={
+            metadata.nextpage
+              ? `${config.baseurl}/${metadata.nextpage.file}`
+              : undefined
+          }
+        >
+          <SymbolChevronRight
+            color={metadata.nextpage ? '#000' : '#999'}
+            size="1em"
+          />
+        </a>
+      </li>
+      <li>
+        <a
+          href={
+            metadata.lastpage
+              ? `${config.baseurl}/${metadata.lastpage.file}`
+              : undefined
+          }
+        >
+          <SymbolDoubleChevronRight
+            color={metadata.lastpage.file === file ? '#999' : '#000'}
+            size="1em"
+          />
+        </a>
+      </li>
+    </ul>
+  )
+}
diff --git a/theme-source/partials/search.js b/theme-source/partials/search.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab96710056c47f2e4db5ceaaa2a9ac76c475becd
--- /dev/null
+++ b/theme-source/partials/search.js
@@ -0,0 +1,170 @@
+import React from 'react'
+import { SymbolClose } from './svgs'
+
+export function Search() {
+  return (
+    <>
+      <div class="hidden" id="search" style={{ display: 'none' }}>
+        <div>
+          <div>
+            <div>
+              <div style={{ backgroundColor: 'white' }}>
+                <div id="searchbox" style={{ padding: '0 60px 0 10px' }}>
+                  <form>
+                    <input
+                      style={{
+                        padding: '0 60px 0 10px',
+                        margin: '0 -10px',
+                        width: '100%',
+                      }}
+                      placeholder="Vyhledávejte psaním..."
+                    />
+                  </form>
+                  <div
+                    style={{
+                      cursor: 'pointer',
+                      right: 0,
+                      position: 'absolute',
+                      top: 0,
+                      width: 50,
+                      height: 50,
+                      lineHeight: 50,
+                    }}
+                    class="close-search"
+                  >
+                    <div
+                      style={{
+                        height: '2em',
+                        margin: 'auto 0',
+                        position: 'relative',
+                        top: '50%',
+                        marginTop: '-1em',
+                      }}
+                    >
+                      <SymbolClose color="gray" size="2em" />
+                    </div>
+                  </div>
+                </div>
+                <div id="searchresults"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div id="search-overlay" style={{ display: 'none' }}></div>
+      <script
+        dangerouslySetInnerHTML={{
+          __html: `
+  function debounce(func, wait, immediate) {
+    var timeout;
+    return function() {
+      var context = this, args = arguments;
+      var later = function() {
+        timeout = null;
+        if (!immediate) func.apply(context, args);
+      };
+      var callNow = immediate && !timeout;
+      clearTimeout(timeout);
+      timeout = setTimeout(later, wait);
+      if (callNow) func.apply(context, args);
+    };
+  };
+
+  var csc;
+
+  var myCallback = function() {
+    var doRender = function() {
+      var options = {};
+      options[google.search.Search.RESTRICT_EXTENDED_ARGS] = {
+        'as_sitesearch': 'ok1kvk.cz'
+      };
+
+      csc = new google.search.CustomSearchControl('003089460452505374651:q5prtsadbio', options);
+      csc.setLinkTarget (google.search.Search.LINK_TARGET_SELF);
+
+      var drawOptions = new google.search.DrawOptions();
+      drawOptions.enableSearchResultsOnly();
+      csc.draw("searchresults", drawOptions);
+
+      var s = $("#searchbox input").val()
+      if(s != "")
+        csc.execute(s);
+    }
+    if (document.readyState == 'complete') {
+      doRender();
+    } else {
+      google.setOnLoadCallback(doRender, true);
+    }
+  };
+
+  window.__gcse = {
+    parsetags: 'explicit',
+    callback: myCallback
+  };
+
+  (function() {
+    var cx = '003089460452505374651:q5prtsadbio';
+    var gcse = document.createElement('script'); gcse.type = 'text/javascript';
+    gcse.async = true;
+    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
+  })();
+
+  $("#searchbox form").submit(function(e) {
+    e.preventDefault();
+  });
+
+  $("#searchbox form").on("input", debounce(function(e) {
+    var s = $("#searchbox input").val()
+    if(s == "") {
+      $("#searchresults").html("");
+      myCallback();
+    } else
+      csc.execute(s);
+  },250));
+
+  (function() {
+    var searchHeight = $('#search').height();
+    var adjustHeight = function() {
+      var newh = $('#search').height();
+      if(newh != searchHeight) {
+        searchHeight = newh;
+        $("#all").height("auto");
+        if(!$("#search").hasClass("hidden") && $("#all").height() < searchHeight+20+194) {
+          $("#all").height(searchHeight+20+194);
+        }
+      }
+    }
+    // Resize page on searching
+    $("#search > div").bind('DOMSubtreeModified', adjustHeight);
+
+    // Search showing
+    $(".search-icon").on("click", function() {
+      $("#search").show();
+      setTimeout(function() {
+        $("#search").removeClass("hidden");
+        $("body").append('');
+        $("#search-overlay").show().addClass("shown");
+        adjustHeight();
+        setTimeout(function() {
+          $("#searchbox input").focus();
+        }, 320);
+      },0);
+    });
+
+    // Search hiding on search overlay click
+    $("#search-overlay, .close-search").click(function() {
+      $("#search-overlay").removeClass("shown");
+      $("#search").addClass("hidden");
+      setTimeout(function() {
+        adjustHeight();
+        $("#search").hide();
+      },320);
+    });
+  })();
+  `,
+        }}
+      />
+    </>
+  )
+}
diff --git a/theme-source/partials/svgs.js b/theme-source/partials/svgs.js
new file mode 100644
index 0000000000000000000000000000000000000000..6a06003405c0beeebf41e3c2e1b1fee2fd566625
--- /dev/null
+++ b/theme-source/partials/svgs.js
@@ -0,0 +1,104 @@
+import React from 'react'
+
+function SVGSymbol({ color, size = '24px', d }) {
+  return (
+    <svg
+      style={{
+        marginTop: 'auto',
+        marginBottom: 'auto',
+        display: 'inline-block',
+        width: size,
+        height: size,
+      }}
+      viewBox="0 0 24 24"
+    >
+      <path fill={color || undefined} d={d} />
+    </svg>
+  )
+}
+
+export function SymbolChevronLeft(props) {
+  return (
+    <SVGSymbol
+      d="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolDoubleChevronLeft(props) {
+  return (
+    <SVGSymbol
+      d="M18.41,7.41L17,6L11,12L17,18L18.41,16.59L13.83,12L18.41,7.41M12.41,7.41L11,6L5,12L11,18L12.41,16.59L7.83,12L12.41,7.41Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolChevronRight(props) {
+  return (
+    <SVGSymbol
+      d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolDoubleChevronRight(props) {
+  return (
+    <SVGSymbol
+      d="M5.59,7.41L7,6L13,12L7,18L5.59,16.59L10.17,12L5.59,7.41M11.59,7.41L13,6L19,12L13,18L11.59,16.59L16.17,12L11.59,7.41Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolForward(props) {
+  return <SVGSymbol d="M12,8V4L20,12L12,20V16H4V8H12Z" {...props} />
+}
+
+export function SymbolBackward(props) {
+  return <SVGSymbol d="m 12,16 0,4 -8,-8 8,-8 0,4 8,0 0,8 -8,0 z" {...props} />
+}
+
+export function SymbolMenu(props) {
+  return (
+    <SVGSymbol d="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" {...props} />
+  )
+}
+
+export function SymbolSearch(props) {
+  return (
+    <SVGSymbol
+      d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolFacebook(props) {
+  return (
+    <SVGSymbol
+      d="M19,4V7H17A1,1 0 0,0 16,8V10H19V13H16V20H13V13H11V10H13V7.5C13,5.56 14.57,4 16.5,4M20,2H4A2,2 0 0,0 2,4V20A2,2 0 0,0 4,22H20A2,2 0 0,0 22,20V4C22,2.89 21.1,2 20,2Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolGplus(props) {
+  return (
+    <SVGSymbol
+      d="M20,2A2,2 0 0,1 22,4V20A2,2 0 0,1 20,22H4A2,2 0 0,1 2,20V4C2,2.89 2.9,2 4,2H20M20,12H18V10H17V12H15V13H17V15H18V13H20V12M9,11.29V13H11.86C11.71,13.71 11,15.14 9,15.14C7.29,15.14 5.93,13.71 5.93,12C5.93,10.29 7.29,8.86 9,8.86C10,8.86 10.64,9.29 11,9.64L12.36,8.36C11.5,7.5 10.36,7 9,7C6.21,7 4,9.21 4,12C4,14.79 6.21,17 9,17C11.86,17 13.79,15 13.79,12.14C13.79,11.79 13.79,11.57 13.71,11.29H9Z"
+      {...props}
+    />
+  )
+}
+
+export function SymbolClose(props) {
+  return (
+    <SVGSymbol
+      d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"
+      {...props}
+    />
+  )
+}
diff --git a/old-theme/sass/components/_buttons.scss b/theme-source/sass/components/_buttons.scss
similarity index 100%
rename from old-theme/sass/components/_buttons.scss
rename to theme-source/sass/components/_buttons.scss
diff --git a/old-theme/sass/components/_cards.scss b/theme-source/sass/components/_cards.scss
similarity index 100%
rename from old-theme/sass/components/_cards.scss
rename to theme-source/sass/components/_cards.scss
diff --git a/old-theme/sass/components/_carousel.scss b/theme-source/sass/components/_carousel.scss
similarity index 100%
rename from old-theme/sass/components/_carousel.scss
rename to theme-source/sass/components/_carousel.scss
diff --git a/old-theme/sass/components/_chips.scss b/theme-source/sass/components/_chips.scss
similarity index 100%
rename from old-theme/sass/components/_chips.scss
rename to theme-source/sass/components/_chips.scss
diff --git a/old-theme/sass/components/_collapsible.scss b/theme-source/sass/components/_collapsible.scss
similarity index 100%
rename from old-theme/sass/components/_collapsible.scss
rename to theme-source/sass/components/_collapsible.scss
diff --git a/old-theme/sass/components/_color.scss b/theme-source/sass/components/_color.scss
similarity index 100%
rename from old-theme/sass/components/_color.scss
rename to theme-source/sass/components/_color.scss
diff --git a/old-theme/sass/components/_dropdown.scss b/theme-source/sass/components/_dropdown.scss
similarity index 100%
rename from old-theme/sass/components/_dropdown.scss
rename to theme-source/sass/components/_dropdown.scss
diff --git a/old-theme/sass/components/_form.scss b/theme-source/sass/components/_form.scss
similarity index 100%
rename from old-theme/sass/components/_form.scss
rename to theme-source/sass/components/_form.scss
diff --git a/old-theme/sass/components/_global.scss b/theme-source/sass/components/_global.scss
similarity index 100%
rename from old-theme/sass/components/_global.scss
rename to theme-source/sass/components/_global.scss
diff --git a/old-theme/sass/components/_grid.scss b/theme-source/sass/components/_grid.scss
similarity index 100%
rename from old-theme/sass/components/_grid.scss
rename to theme-source/sass/components/_grid.scss
diff --git a/old-theme/sass/components/_icons-material-design.scss b/theme-source/sass/components/_icons-material-design.scss
similarity index 100%
rename from old-theme/sass/components/_icons-material-design.scss
rename to theme-source/sass/components/_icons-material-design.scss
diff --git a/old-theme/sass/components/_materialbox.scss b/theme-source/sass/components/_materialbox.scss
similarity index 100%
rename from old-theme/sass/components/_materialbox.scss
rename to theme-source/sass/components/_materialbox.scss
diff --git a/old-theme/sass/components/_mixins.scss b/theme-source/sass/components/_mixins.scss
similarity index 100%
rename from old-theme/sass/components/_mixins.scss
rename to theme-source/sass/components/_mixins.scss
diff --git a/old-theme/sass/components/_modal.scss b/theme-source/sass/components/_modal.scss
similarity index 100%
rename from old-theme/sass/components/_modal.scss
rename to theme-source/sass/components/_modal.scss
diff --git a/old-theme/sass/components/_navbar.scss b/theme-source/sass/components/_navbar.scss
similarity index 100%
rename from old-theme/sass/components/_navbar.scss
rename to theme-source/sass/components/_navbar.scss
diff --git a/old-theme/sass/components/_normalize.scss b/theme-source/sass/components/_normalize.scss
similarity index 100%
rename from old-theme/sass/components/_normalize.scss
rename to theme-source/sass/components/_normalize.scss
diff --git a/old-theme/sass/components/_prefixer.scss b/theme-source/sass/components/_prefixer.scss
similarity index 100%
rename from old-theme/sass/components/_prefixer.scss
rename to theme-source/sass/components/_prefixer.scss
diff --git a/old-theme/sass/components/_preloader.scss b/theme-source/sass/components/_preloader.scss
similarity index 100%
rename from old-theme/sass/components/_preloader.scss
rename to theme-source/sass/components/_preloader.scss
diff --git a/old-theme/sass/components/_roboto.scss b/theme-source/sass/components/_roboto.scss
similarity index 100%
rename from old-theme/sass/components/_roboto.scss
rename to theme-source/sass/components/_roboto.scss
diff --git a/old-theme/sass/components/_sideNav.scss b/theme-source/sass/components/_sideNav.scss
similarity index 100%
rename from old-theme/sass/components/_sideNav.scss
rename to theme-source/sass/components/_sideNav.scss
diff --git a/old-theme/sass/components/_slider.scss b/theme-source/sass/components/_slider.scss
similarity index 100%
rename from old-theme/sass/components/_slider.scss
rename to theme-source/sass/components/_slider.scss
diff --git a/old-theme/sass/components/_table_of_contents.scss b/theme-source/sass/components/_table_of_contents.scss
similarity index 100%
rename from old-theme/sass/components/_table_of_contents.scss
rename to theme-source/sass/components/_table_of_contents.scss
diff --git a/old-theme/sass/components/_tabs.scss b/theme-source/sass/components/_tabs.scss
similarity index 100%
rename from old-theme/sass/components/_tabs.scss
rename to theme-source/sass/components/_tabs.scss
diff --git a/old-theme/sass/components/_toast.scss b/theme-source/sass/components/_toast.scss
similarity index 100%
rename from old-theme/sass/components/_toast.scss
rename to theme-source/sass/components/_toast.scss
diff --git a/old-theme/sass/components/_tooltip.scss b/theme-source/sass/components/_tooltip.scss
similarity index 100%
rename from old-theme/sass/components/_tooltip.scss
rename to theme-source/sass/components/_tooltip.scss
diff --git a/old-theme/sass/components/_typography.scss b/theme-source/sass/components/_typography.scss
similarity index 100%
rename from old-theme/sass/components/_typography.scss
rename to theme-source/sass/components/_typography.scss
diff --git a/old-theme/sass/components/_variables.scss b/theme-source/sass/components/_variables.scss
similarity index 100%
rename from old-theme/sass/components/_variables.scss
rename to theme-source/sass/components/_variables.scss
diff --git a/old-theme/sass/components/_waves.scss b/theme-source/sass/components/_waves.scss
similarity index 100%
rename from old-theme/sass/components/_waves.scss
rename to theme-source/sass/components/_waves.scss
diff --git a/old-theme/sass/components/date_picker/_default.date.scss b/theme-source/sass/components/date_picker/_default.date.scss
similarity index 100%
rename from old-theme/sass/components/date_picker/_default.date.scss
rename to theme-source/sass/components/date_picker/_default.date.scss
diff --git a/old-theme/sass/components/date_picker/_default.scss b/theme-source/sass/components/date_picker/_default.scss
similarity index 100%
rename from old-theme/sass/components/date_picker/_default.scss
rename to theme-source/sass/components/date_picker/_default.scss
diff --git a/old-theme/sass/components/date_picker/_default.time.scss b/theme-source/sass/components/date_picker/_default.time.scss
similarity index 100%
rename from old-theme/sass/components/date_picker/_default.time.scss
rename to theme-source/sass/components/date_picker/_default.time.scss
diff --git a/old-theme/sass/materialize.scss b/theme-source/sass/materialize.scss
similarity index 100%
rename from old-theme/sass/materialize.scss
rename to theme-source/sass/materialize.scss
diff --git a/old-theme/sass/search.scss b/theme-source/sass/search.scss
similarity index 100%
rename from old-theme/sass/search.scss
rename to theme-source/sass/search.scss
diff --git a/old-theme/sass/style.scss b/theme-source/sass/style.scss
similarity index 100%
rename from old-theme/sass/style.scss
rename to theme-source/sass/style.scss
diff --git a/theme-source/templates/tag.js b/theme-source/templates/tag.js
new file mode 100644
index 0000000000000000000000000000000000000000..8628c1765786c3ae91bd3039270181ba3d2e0f5f
--- /dev/null
+++ b/theme-source/templates/tag.js
@@ -0,0 +1,14 @@
+import React from 'react'
+import { Base } from '../partials/base'
+import { List as ListPartial } from '../partials/list'
+
+export default function List(props) {
+  return (
+    <Base
+      head={<meta property="og:type" content="website" />}
+      config={props.config}
+    >
+      <ListPartial {...props} />
+    </Base>
+  )
+}