[TOB-245] feat: Add statement editor

 * Add pipe for extracting form arrays
 * Add value observable to abstract form component
 * Add standard projector functions to store util
 * Add rxjs operator to catch specific HttpErrorResponses
 * Add injection token for global URL object
 * Add action and effect for opening files in new tab
 * Add directive for toggling global css class on body
 * Reorganize statement config data in store
 * Add back end model and API calls for statement editor
 * Extend statement store for statement editor
 * Add components for statement editor form
 * Integrate store in statement editor form

[TOB-314] feat: Add attachment functionality to statement editor

 * Add tagging functionality to already existing attachment components
 * Reorganize attachment store module
 * Add attachment component to statement editor

[TOB-292] test: Increase test coverage to 80%

 * Add test cases for attachment effects
 * Add test cases for contact effects
 * Add test cases for process effects

[TOB-291] chore: Update dependencies

 * Update several dependencies in package.json
 * Add webpack plugin to generate license file

Signed-off-by: Christopher Keim <keim@develop-group.de>
diff --git a/.gitignore b/.gitignore
index bfbf828..b5f44f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,8 @@
 /out-tsc
 /coverage
 /.scannerwork
+/lint.styles.report.json
+/lint.ts.report.json
 
 # Only exists if Bazel was run
 /bazel-out
@@ -21,7 +23,6 @@
 speed-measure-plugin*.json
 
 # IDEs and editors
-/.idea
 .project
 .classpath
 .c9/
@@ -29,6 +30,18 @@
 .settings/
 *.sublime-workspace
 
+# IDE - Jetbrains
+# See: https://www.gitignore.io/api/jetbrains to share code style, etc.
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+.idea/modules.xml
+.idea/*.iml
+.idea/modules
+
 # IDE - VSCode
 .vscode/*
 !.vscode/settings.json
@@ -40,7 +53,6 @@
 # misc
 /.sass-cache
 /connect.lock
-/coverage
 /libpeerconnection.log
 npm-debug.log
 yarn-error.log
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..b58b603
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..f298c29
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,54 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <ScssCodeStyleSettings>
+      <option name="HEX_COLOR_LOWER_CASE" value="true" />
+      <option name="HEX_COLOR_LONG_FORMAT" value="true" />
+    </ScssCodeStyleSettings>
+    <TypeScriptCodeStyleSettings version="1">
+      <option name="FORCE_SEMICOLON_STYLE" value="true" />
+      <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
+      <option name="FORCE_QUOTE_STYlE" value="true" />
+      <option name="SPACE_WITHIN_TYPE_ASSERTION" value="true" />
+      <option name="IMPORT_SORT_MODULE_NAME" value="true" />
+      <option name="BLACKLIST_IMPORTS" value="rxjs/Rx,primeng,primeng/public_api" />
+    </TypeScriptCodeStyleSettings>
+    <codeStyleSettings language="CSS">
+      <indentOptions>
+        <option name="INDENT_SIZE" value="2" />
+        <option name="CONTINUATION_INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
+    </codeStyleSettings>
+    <codeStyleSettings language="LESS">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
+    </codeStyleSettings>
+    <codeStyleSettings language="SASS">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
+    </codeStyleSettings>
+    <codeStyleSettings language="SCSS">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
+    </codeStyleSettings>
+    <codeStyleSettings language="Stylus">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
+    </codeStyleSettings>
+    <codeStyleSettings language="TypeScript">
+      <option name="RIGHT_MARGIN" value="140" />
+      <option name="IF_BRACE_FORCE" value="3" />
+      <option name="DOWHILE_BRACE_FORCE" value="3" />
+      <option name="WHILE_BRACE_FORCE" value="3" />
+      <option name="FOR_BRACE_FORCE" value="3" />
+    </codeStyleSettings>
+  </code_scheme>
+</component>
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..79ee123
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+  </state>
+</component>
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..3a43fc2
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,7 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="Stylelint" enabled="true" level="ERROR" enabled_by_default="true" />
+    <inspection_tool class="TsLint" enabled="true" level="WARNING" enabled_by_default="true" />
+  </profile>
+</component>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..029a1a8
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CommitMessageInspectionProfile">
+    <profile version="1.0">
+      <inspection_tool class="BodyLimit" enabled="true" level="WARNING" enabled_by_default="true" />
+      <inspection_tool class="SubjectBodySeparation" enabled="true" level="WARNING" enabled_by_default="true" />
+      <inspection_tool class="SubjectLimit" enabled="true" level="WARNING" enabled_by_default="true" />
+    </profile>
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.storybook/preview-body.html b/.storybook/preview-body.html
index 11db4b0..b93a3c7 100644
--- a/.storybook/preview-body.html
+++ b/.storybook/preview-body.html
@@ -14,5 +14,6 @@
 <style>
   .sb-show-main > *:nth-child(4) {
     height: 100%;
+    overflow: auto;
   }
 </style>
diff --git a/.stylelintrc.json b/.stylelintrc.json
index d0910b1..5b53952 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -3,21 +3,7 @@
     "stylelint-config-sass-guidelines"
   ],
   "rules": {
-    "indentation": [
-      2,
-      {
-        "ignore": [
-          "inside-parens"
-        ]
-      }
-    ],
-    "shorthand-property-no-redundant-values": null,
-    "string-quotes": "double",
-    "value-keyword-case": null,
-    "color-hex-length": "long",
-    "property-no-vendor-prefix": null,
-    "function-parentheses-space-inside": null,
-    "block-opening-brace-space-before": "always",
+    "at-rule-name-space-after": "always",
     "block-closing-brace-newline-after": [
       "always",
       {
@@ -27,16 +13,29 @@
         ]
       }
     ],
+    "block-opening-brace-space-before": "always",
+    "color-hex-length": "long",
     "function-parentheses-newline-inside": null,
-    "at-rule-name-space-after": "always",
-    "rule-empty-line-before": "always",
+    "function-parentheses-space-inside": null,
+    "indentation": [
+      2,
+      {
+        "ignore": [
+          "inside-parens"
+        ]
+      }
+    ],
+    "max-nesting-depth": 3,
+    "no-duplicate-selectors": true,
     "order/properties-alphabetical-order": null,
-    "scss/selector-no-redundant-nesting-selector": null,
+    "property-no-vendor-prefix": null,
+    "rule-empty-line-before": "always",
     "scss/at-else-closing-brace-newline-after": "always-last-in-chain",
     "scss/at-else-closing-brace-space-after": "always-intermediate",
     "scss/at-else-empty-line-before": "never",
     "scss/at-if-closing-brace-newline-after": "always-last-in-chain",
     "scss/at-if-closing-brace-space-after": "always-intermediate",
+    "scss/selector-no-redundant-nesting-selector": null,
     "selector-type-no-unknown": [
       true,
       {
@@ -46,6 +45,9 @@
           "mat-checkbox"
         ]
       }
-    ]
+    ],
+    "shorthand-property-no-redundant-values": null,
+    "string-quotes": "double",
+    "value-keyword-case": null
   }
 }
diff --git a/NOTICE.md b/NOTICE.md
index b9981c0..4f620ac 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -47,101 +47,113 @@
 
 ## Third-party Content
 
-@angular/animations (9.1.0)
+@angular-devkit/build-angular (0.901.11)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular-cli
 
-@angular/cdk (9.2.0)
+@angular/animations (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/components
+ * Homepage: https://github.com/angular/angular#readme
 
-@angular/common (9.1.0)
+@angular/cdk (9.2.4)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/components#readme
 
-@angular/compiler (9.1.0)
+@angular/common (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular#readme
 
-@angular/core (9.1.0)
+@angular/core (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular#readme
 
-@angular/forms (9.1.0)
+@angular/forms (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular#readme
 
-@angular/material (9.2.0)
+@angular/material (9.2.4)
  * License: MIT
- * Source: https://github.com/angular/components
+ * Homepage: https://github.com/angular/components#readme
 
-@angular/platform-browser-dynamic (9.1.0)
+@angular/platform-browser (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular#readme
+ 
+@angular/platform-browser-dynamic (9.1.12)
+ * License: MIT
+ * Homepage: https://github.com/angular/angular#readme
 
-@angular/platform-browser (9.1.0)
+@angular/router (9.1.12)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular/tree/master/packages/router
 
-@angular/router (9.1.0)
+@ngrx/effects (9.2.0)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/ngrx/platform#readme
 
-@ngrx/effects (9.0.0)
+@ngrx/store (9.2.0)
  * License: MIT
- * Source: https://github.com/ngrx/platform
-
-@ngrx/store (9.0.0)
- * License: MIT
- * Source: https://github.com/ngrx/platform
+ * Homepage: https://github.com/ngrx/platform#readme
 
 @ngx-translate/core (12.1.2)
  * License: MIT
- * Source: https://github.com/ngx-translate/core
+ * Homepage: https://github.com/ngx-translate/core
 
-@ngx-translate/http-loader (4.0.0)
+@ngx-translate/http-loader (5.0.0)
  * License: MIT
- * Source: https://github.com/ngx-translate/http-loader
+ * Homepage: https://github.com/ngx-translate/http-loader
 
 bpmn-js (6.5.1)
  * License: bpmn.io License (https://bpmn.io/license)
- * Source: https://github.com/bpmn-io/bpmn-js
+ * Homepage: https://github.com/bpmn-io/bpmn-js#readme
+
+core-js (3.6.4)
+ * License: MIT
+ * Homepage: https://github.com/zloirock/core-js#readme
+
+css-loader (3.5.1)
+ * License: MIT
+ * Homepage: https://github.com/webpack-contrib/css-loader
 
 leaflet (1.6.0)
  * License: BSD-2-Clause
- * Source: https://github.com/Leaflet/Leaflet
+ * Homepage: https://leafletjs.com/
 
 material-design-icons (3.0.1)
  * License: Apache-2.0
- * Source: https://github.com/google/material-design-icons
+ * Homepage: https://github.com/google/material-design-icons
 
-moment (2.24.0)
+moment (2.27.0)
  * License: MIT
- * Source: https://github.com/moment/moment
+ * Homepage: https://momentjs.com
 
-primeng (9.0.6)
+primeng (9.1.3)
  * License: MIT
- * Source: https://github.com/primefaces/primeng
+ * Homepage: https://github.com/primefaces/primeng#readme
 
-proj4 (2.6.1)
+regenerator-runtime (0.13.5)
  * License: MIT
- * Source: https://github.com/proj4js/proj4js
+ * Repository: https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
 
-rxjs (6.5.4)
+rxjs (6.5.5)
  * License: Apache-2.0
- * Source: https://github.com/reactivex/rxjs
+ * Homepage: https://github.com/ReactiveX/RxJS
 
 source-sans-pro (3.6.0)
  * License: OFL-1.1
- * Source: https://github.com/adobe-fonts/source-sans-pro.git#release
+ * Homepage: https://adobe-fonts.github.io/source-sans-pro
 
-tslib (1.11.1)
- * License: Apache-2.0
- * Source: https://github.com/Microsoft/tslib
+tslib (1.13.0)
+ * License: 0BSD
+ * Homepage: https://www.typescriptlang.org/
+
+webpack (4.42.0)
+ * License: MIT
+ * Homepage: https://github.com/webpack/webpack
 
 zone.js (0.10.3)
  * License: MIT
- * Source: https://github.com/angular/angular
+ * Homepage: https://github.com/angular/angular#readme
 
 ## Cryptography
 
diff --git a/angular.json b/angular.json
index a094e44..2e8b24a 100644
--- a/angular.json
+++ b/angular.json
@@ -15,8 +15,11 @@
       "prefix": "app",
       "architect": {
         "build": {
-          "builder": "@angular-devkit/build-angular:browser",
+          "builder": "@angular-builders/custom-webpack:browser",
           "options": {
+            "customWebpackConfig": {
+              "path": "./webpack.config.js"
+            },
             "outputPath": "dist/statement-public-affairs",
             "index": "src/index.html",
             "main": "src/main.ts",
diff --git a/package-lock.json b/package-lock.json
index 3e6d27f..565e02f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,51 +1,92 @@
 {
   "name": "openkonsequenz-statement-public-affairs",
-  "version": "0.3.0",
+  "version": "0.6.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
-    "@angular-devkit/architect": {
-      "version": "0.901.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0.tgz",
-      "integrity": "sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ==",
+    "@angular-builders/custom-webpack": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-9.2.0.tgz",
+      "integrity": "sha512-0ivkjENONFm0oNy6hdCod4YaT4dUk80KuP9+eDliWuZIA70yKQgIYMLul0bz6/i+Cm24PaZ2tq4w7kW7AuSMoA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.0",
+        "@angular-devkit/architect": ">=0.900.0 < 0.1000.0",
+        "@angular-devkit/build-angular": ">=0.900.0 < 0.1000.0",
+        "@angular-devkit/core": "^9.0.0",
+        "lodash": "^4.17.10",
+        "ts-node": "^8.5.2",
+        "webpack-merge": "^4.2.1"
+      },
+      "dependencies": {
+        "ts-node": {
+          "version": "8.10.2",
+          "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+          "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
+          "dev": true,
+          "requires": {
+            "arg": "^4.1.0",
+            "diff": "^4.0.1",
+            "make-error": "^1.1.1",
+            "source-map-support": "^0.5.17",
+            "yn": "3.1.1"
+          }
+        }
+      }
+    },
+    "@angular-devkit/architect": {
+      "version": "0.901.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.12.tgz",
+      "integrity": "sha512-gLlsxa+3JPV1m1gRvRMujOs4xKox6I5BkYmOD1zfu+dB6y3LuBAvHfXA6FaTDVOMBrmSlWnE4PmOmB6xd7wxMA==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "9.1.12",
         "rxjs": "6.5.4"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.901.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0.tgz",
-      "integrity": "sha512-ftJVNlKvIomqRfr5jFVraPqlLSUJu8YyVbFv/aCsvhNpuZGkYpTOMoJDwyywdslSTH608BIoU63IAnIz9PwUdw==",
+      "version": "0.901.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.12.tgz",
+      "integrity": "sha512-enK+u1Lg1a/KWUs3r8Tc7Igduu5ph9fgziV8bjQeVrswrqFb0m0eEhxe/zV8rvE92H3NBZp5Z+uzOYIcg4eirw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.901.0",
-        "@angular-devkit/build-optimizer": "0.901.0",
-        "@angular-devkit/build-webpack": "0.901.0",
-        "@angular-devkit/core": "9.1.0",
+        "@angular-devkit/architect": "0.901.12",
+        "@angular-devkit/build-optimizer": "0.901.12",
+        "@angular-devkit/build-webpack": "0.901.12",
+        "@angular-devkit/core": "9.1.12",
         "@babel/core": "7.9.0",
         "@babel/generator": "7.9.3",
         "@babel/preset-env": "7.9.0",
         "@babel/template": "7.8.6",
         "@jsdevtools/coverage-istanbul-loader": "3.0.3",
-        "@ngtools/webpack": "9.1.0",
-        "ajv": "6.12.0",
+        "@ngtools/webpack": "9.1.12",
+        "ajv": "6.12.3",
         "autoprefixer": "9.7.4",
         "babel-loader": "8.0.6",
         "browserslist": "^4.9.1",
         "cacache": "15.0.0",
         "caniuse-lite": "^1.0.30001032",
         "circular-dependency-plugin": "5.2.0",
-        "copy-webpack-plugin": "5.1.1",
+        "copy-webpack-plugin": "6.0.3",
         "core-js": "3.6.4",
+        "css-loader": "3.5.1",
         "cssnano": "4.1.10",
         "file-loader": "6.0.0",
         "find-cache-dir": "3.3.1",
         "glob": "7.1.6",
         "jest-worker": "25.1.0",
         "karma-source-map-support": "1.4.0",
-        "less": "3.11.1",
+        "less": "3.11.3",
         "less-loader": "5.0.0",
         "license-webpack-plugin": "2.1.4",
         "loader-utils": "2.0.0",
@@ -66,23 +107,60 @@
         "semver": "7.1.3",
         "source-map": "0.7.3",
         "source-map-loader": "0.2.4",
-        "source-map-support": "0.5.16",
         "speed-measure-webpack-plugin": "1.3.1",
         "style-loader": "1.1.3",
         "stylus": "0.54.7",
         "stylus-loader": "3.0.2",
-        "terser": "4.6.7",
-        "terser-webpack-plugin": "2.3.5",
+        "terser": "4.6.10",
+        "terser-webpack-plugin": "3.0.3",
         "tree-kill": "1.2.2",
         "webpack": "4.42.0",
         "webpack-dev-middleware": "3.7.2",
-        "webpack-dev-server": "3.10.3",
+        "webpack-dev-server": "3.11.0",
         "webpack-merge": "4.2.2",
         "webpack-sources": "1.4.3",
         "webpack-subresource-integrity": "1.4.0",
-        "worker-plugin": "4.0.2"
+        "worker-plugin": "4.0.3"
       },
       "dependencies": {
+        "@babel/core": {
+          "version": "7.9.0",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
+          "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.9.0",
+            "@babel/helper-module-transforms": "^7.9.0",
+            "@babel/helpers": "^7.9.0",
+            "@babel/parser": "^7.9.0",
+            "@babel/template": "^7.8.6",
+            "@babel/traverse": "^7.9.0",
+            "@babel/types": "^7.9.0",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.13",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+              "dev": true
+            },
+            "source-map": {
+              "version": "0.5.7",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
+            }
+          }
+        },
         "autoprefixer": {
           "version": "9.7.4",
           "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz",
@@ -121,6 +199,15 @@
                 "pkg-dir": "^3.0.0"
               }
             },
+            "json5": {
+              "version": "1.0.1",
+              "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+              "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+              "dev": true,
+              "requires": {
+                "minimist": "^1.2.0"
+              }
+            },
             "loader-utils": {
               "version": "1.4.0",
               "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
@@ -134,97 +221,152 @@
             }
           }
         },
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+        "license-webpack-plugin": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz",
+          "integrity": "sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ==",
           "dev": true,
           "requires": {
-            "minimist": "^1.2.0"
+            "@types/webpack-sources": "^0.1.5",
+            "webpack-sources": "^1.2.0"
+          }
+        },
+        "parse5": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+          "dev": true
+        },
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
           }
         }
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.901.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0.tgz",
-      "integrity": "sha512-Y9sz8uf2zjilhPUVYb0K9Mio6c1d5c+csuDc15CCKzELXJwyyDxilIFgn6Eu+edM0HNQGzbIwkjy4DkR9mtuTQ==",
+      "version": "0.901.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.12.tgz",
+      "integrity": "sha512-XuXA+6y9QkIAwSVZhWmne4r7qugUUWaXobgRefbn9heiRlY8/7XkZmmvbSrxc1fgQfQar52W9fAa19fAIeNvnw==",
       "dev": true,
       "requires": {
         "loader-utils": "2.0.0",
         "source-map": "0.7.3",
         "tslib": "1.11.1",
-        "typescript": "3.8.3",
+        "typescript": "3.6.5",
         "webpack-sources": "1.4.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.11.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+          "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
+          "dev": true
+        },
+        "typescript": {
+          "version": "3.6.5",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.5.tgz",
+          "integrity": "sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ==",
+          "dev": true
+        }
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.901.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0.tgz",
-      "integrity": "sha512-Oze0VzIvHnoW12C80fiNH4HBu/GWmhJPXdNA7nRkU/tBQlIKnfngf8rQ0QbgecN2qdEXQpZJsP/XclTi3zugsg==",
+      "version": "0.901.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.12.tgz",
+      "integrity": "sha512-zrhZV2LhQ4uFl9at9i2jiedIu932HsaFN4OMMsTFlV+6CZxtEUBI85hhnPa5KQtIYQr2OMQSQf/FyhnBGs0riQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.901.0",
-        "@angular-devkit/core": "9.1.0",
+        "@angular-devkit/architect": "0.901.12",
+        "@angular-devkit/core": "9.1.12",
         "rxjs": "6.5.4"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/core": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0.tgz",
-      "integrity": "sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg==",
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz",
+      "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==",
       "dev": true,
       "requires": {
-        "ajv": "6.12.0",
+        "ajv": "6.12.3",
         "fast-json-stable-stringify": "2.1.0",
         "magic-string": "0.25.7",
         "rxjs": "6.5.4",
         "source-map": "0.7.3"
-      }
-    },
-    "@angular-devkit/schematics": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0.tgz",
-      "integrity": "sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "9.1.0",
-        "ora": "4.0.3",
-        "rxjs": "6.5.4"
-      }
-    },
-    "@angular/animations": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz",
-      "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag=="
-    },
-    "@angular/cdk": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz",
-      "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==",
-      "requires": {
-        "parse5": "^5.0.0"
       },
       "dependencies": {
-        "parse5": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
-          "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
-          "optional": true
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
         }
       }
     },
-    "@angular/cli": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0.tgz",
-      "integrity": "sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg==",
+    "@angular-devkit/schematics": {
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.12.tgz",
+      "integrity": "sha512-+GYnUzmIy1/QpYitCC8mI7jcrViGHTtOKvvDPEFjU2nggjNEQaMmsHcdIsjrqggEc23ZZyebNAIewT8CMkJyrQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.901.0",
-        "@angular-devkit/core": "9.1.0",
-        "@angular-devkit/schematics": "9.1.0",
-        "@schematics/angular": "9.1.0",
-        "@schematics/update": "0.901.0",
+        "@angular-devkit/core": "9.1.12",
+        "ora": "4.0.3",
+        "rxjs": "6.5.4"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
+      }
+    },
+    "@angular/animations": {
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.12.tgz",
+      "integrity": "sha512-tphpf9QHnOPoL2Jl7KpR+R5aHNW3oifLEmRUTajJYJGvo1uzdUDE82+V9OGOinxJsYseCth9gYJhN24aYTB9NA=="
+    },
+    "@angular/cdk": {
+      "version": "9.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.4.tgz",
+      "integrity": "sha512-iw2+qHMXHYVC6K/fttHeNHIieSKiTEodVutZoOEcBu9rmRTGbLB26V/CRsfIRmA1RBk+uFYWc6UQZnMC3RdnJQ==",
+      "requires": {
+        "parse5": "^5.0.0"
+      }
+    },
+    "@angular/cli": {
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.12.tgz",
+      "integrity": "sha512-B0yOab5WbD84bIRRUKOPAJnpka8Qj+CRt61wJfjsqpd/Rj7pD/3ubmdCNoBH7Xa6UlOb0tdYqRPsqfK7uEL0sw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.901.12",
+        "@angular-devkit/core": "9.1.12",
+        "@angular-devkit/schematics": "9.1.12",
+        "@schematics/angular": "9.1.12",
+        "@schematics/update": "0.901.12",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
         "debug": "4.1.1",
@@ -233,7 +375,7 @@
         "npm-package-arg": "8.0.1",
         "npm-pick-manifest": "6.0.0",
         "open": "7.0.3",
-        "pacote": "11.1.4",
+        "pacote": "9.5.12",
         "read-package-tree": "5.3.1",
         "rimraf": "3.0.2",
         "semver": "7.1.3",
@@ -257,19 +399,19 @@
       }
     },
     "@angular/common": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz",
-      "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.12.tgz",
+      "integrity": "sha512-XSIqkbM6VV1yixF9zuzeE5eqN1VsiXS517K2VU0XgCRSAzhVhLOeKsdYjeLf7PdSu/HgW/Tr81H+isi9A9I0YA=="
     },
     "@angular/compiler": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz",
-      "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.12.tgz",
+      "integrity": "sha512-suefk0OFkaJpUUKnV+phbL4T8fmVGHvzkereY5eqybQlumOez8NPL1PJcygAylh/E6OIAYm8SWookYwM6ZY9dg=="
     },
     "@angular/compiler-cli": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz",
-      "integrity": "sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g==",
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.12.tgz",
+      "integrity": "sha512-bbqJ+fbY+aQejSYuHUjE1qYJCXkZBM5Hru9eN7m/j376u83MQ5jWdC290uYx+ipsXcPTa/YRZ44jpL+5cCzIrg==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -328,6 +470,12 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
         "find-up": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -338,12 +486,6 @@
             "path-exists": "^4.0.0"
           }
         },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-          "dev": true
-        },
         "is-fullwidth-code-point": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -359,15 +501,6 @@
             "p-locate": "^4.1.0"
           }
         },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -377,24 +510,12 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
           "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
-        "require-main-filename": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-          "dev": true
-        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -458,9 +579,9 @@
           }
         },
         "yargs-parser": {
-          "version": "18.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
-          "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
           "dev": true,
           "requires": {
             "camelcase": "^5.0.0",
@@ -470,57 +591,57 @@
       }
     },
     "@angular/core": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz",
-      "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.12.tgz",
+      "integrity": "sha512-WVA/eh3fzjx0apOzkKot4YRRUsGkHj50zFQWrAOMgivGaj1YVrvhf+m3hpglj5fn/BkLiFDl8RT0wAE8z9X+gQ=="
     },
     "@angular/forms": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz",
-      "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.12.tgz",
+      "integrity": "sha512-LhjnZlC4WEsEsAJfOZLte+Lks3WBAFVeRv2lzoQNFVr/IMzBNDVfjEaaSqKF1cei3cjY39Df2nYDMJM7HfqbJA=="
     },
     "@angular/language-service": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.0.tgz",
-      "integrity": "sha512-2f8ECoXrj40oS1rtIfi+F8T4WPzundcZDs8WMFNBuWYbk14v1S9sTgMEmZyePHGkPjt6IfYiLJKJCvVgrt1nxQ==",
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.12.tgz",
+      "integrity": "sha512-0qfIAn5fP5lD+JW6il5HBHGS89rv+idRv5aooDkHqBhuBo4V2VuB1wNy5eP49GZbHKMW1xPAzv1MqeMdk+zwQA==",
       "dev": true
     },
     "@angular/material": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz",
-      "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q=="
+      "version": "9.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.4.tgz",
+      "integrity": "sha512-LkoTXE6B0slvMhvfZDdPWaz4yaYLkaAp5VSPunI9pxGsPxzqEV9e210wC1/sjG/76Nk8Ep7/2z9XKac8Q9bMwA=="
     },
     "@angular/platform-browser": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz",
-      "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.12.tgz",
+      "integrity": "sha512-rPa/hJcLfdId6bYB0b6pFUo3QIgjZlvUlmtKMGdrLNLYR8XQxPa2Y/UdN/5YeZ12htGw6GXrX9U8U7nTbUSpkw=="
     },
     "@angular/platform-browser-dynamic": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz",
-      "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.12.tgz",
+      "integrity": "sha512-NmwUZaQeMnA6f+vP9Fp9P+qjL72H8dKlxLS76ujlKHVf75pP5oahWS8wfl7KXel1tKW3FQWMMffmKf5/NHRiSw=="
     },
     "@angular/router": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz",
-      "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ=="
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.12.tgz",
+      "integrity": "sha512-+qCaXa9y0nsRhzjAYBqmGoQ2YkrdXgftZwuFDf6t4qEi30EXa0oS97KrlFq0M5GKdLIDGrbUm9PcdHSTOI+ZhA=="
     },
     "@babel/code-frame": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
-      "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
       "dev": true,
       "requires": {
-        "@babel/highlight": "^7.8.3"
+        "@babel/highlight": "^7.10.4"
       }
     },
     "@babel/compat-data": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz",
-      "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
+      "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.9.1",
+        "browserslist": "^4.12.0",
         "invariant": "^2.2.4",
         "semver": "^5.5.0"
       },
@@ -534,29 +655,51 @@
       }
     },
     "@babel/core": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
-      "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz",
+      "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@babel/generator": "^7.9.0",
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helpers": "^7.9.0",
-        "@babel/parser": "^7.9.0",
-        "@babel/template": "^7.8.6",
-        "@babel/traverse": "^7.9.0",
-        "@babel/types": "^7.9.0",
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-module-transforms": "^7.11.0",
+        "@babel/helpers": "^7.10.4",
+        "@babel/parser": "^7.11.1",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.11.0",
+        "@babel/types": "^7.11.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.1",
         "json5": "^2.1.2",
-        "lodash": "^4.17.13",
+        "lodash": "^4.17.19",
         "resolve": "^1.3.2",
         "semver": "^5.4.1",
         "source-map": "^0.5.0"
       },
       "dependencies": {
+        "@babel/generator": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+          "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0",
+            "jsesc": "^2.5.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -592,32 +735,32 @@
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
-      "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+      "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
-      "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
       "dev": true,
       "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-explode-assignable-expression": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-compilation-targets": {
-      "version": "7.8.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz",
-      "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
+      "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
       "dev": true,
       "requires": {
-        "@babel/compat-data": "^7.8.6",
-        "browserslist": "^4.9.1",
+        "@babel/compat-data": "^7.10.4",
+        "browserslist": "^4.12.0",
         "invariant": "^2.2.4",
         "levenary": "^1.1.1",
         "semver": "^5.5.0"
@@ -632,326 +775,415 @@
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.8.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz",
-      "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+      "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/helper-member-expression-to-functions": "^7.8.3",
-        "@babel/helper-optimise-call-expression": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-replace-supers": "^7.8.6",
-        "@babel/helper-split-export-declaration": "^7.8.3"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.10.5",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4"
       }
     },
     "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.8.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz",
-      "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
+      "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.8.3",
-        "@babel/helper-regex": "^7.8.3",
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4",
         "regexpu-core": "^4.7.0"
       }
     },
     "@babel/helper-define-map": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
-      "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/types": "^7.8.3",
-        "lodash": "^4.17.13"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/types": "^7.10.5",
+        "lodash": "^4.17.19"
       }
     },
     "@babel/helper-explode-assignable-expression": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
-      "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz",
+      "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
-      "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/helper-get-function-arity": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
-      "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-hoist-variables": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
-      "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
-      "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.11.0"
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
-      "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
-      "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.8.3",
-        "@babel/helper-replace-supers": "^7.8.6",
-        "@babel/helper-simple-access": "^7.8.3",
-        "@babel/helper-split-export-declaration": "^7.8.3",
-        "@babel/template": "^7.8.6",
-        "@babel/types": "^7.9.0",
-        "lodash": "^4.17.13"
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.11.0",
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
-      "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
-      "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
       "dev": true
     },
     "@babel/helper-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
-      "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
       "dev": true,
       "requires": {
-        "lodash": "^4.17.13"
+        "lodash": "^4.17.19"
       }
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
-      "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz",
+      "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.8.3",
-        "@babel/helper-wrap-function": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-wrap-function": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.8.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
-      "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.8.3",
-        "@babel/helper-optimise-call-expression": "^7.8.3",
-        "@babel/traverse": "^7.8.6",
-        "@babel/types": "^7.8.6"
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
-      "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
+      "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
-      "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.8.3"
+        "@babel/types": "^7.11.0"
       }
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz",
-      "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
       "dev": true
     },
     "@babel/helper-wrap-function": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
-      "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/helpers": {
-      "version": "7.9.2",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
-      "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.9.0",
-        "@babel/types": "^7.9.0"
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        }
       }
     },
     "@babel/highlight": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
-      "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
       "dev": true,
       "requires": {
-        "@babel/helper-validator-identifier": "^7.9.0",
+        "@babel/helper-validator-identifier": "^7.10.4",
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       }
     },
     "@babel/parser": {
-      "version": "7.9.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
-      "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+      "version": "7.11.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz",
+      "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==",
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
-      "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-remap-async-to-generator": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4",
         "@babel/plugin-syntax-async-generators": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-class-properties": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz",
-      "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+      "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-dynamic-import": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
-      "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+      "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz",
-      "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz",
-      "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
+      "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-transform-parameters": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
+      "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
-      "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
+      "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
         "@babel/plugin-syntax-optional-chaining": "^7.8.0"
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.8.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz",
-      "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
+      "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.8.8",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-async-generators": {
@@ -991,12 +1223,12 @@
       }
     },
     "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz",
-      "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-object-rest-spread": {
@@ -1027,327 +1259,327 @@
       }
     },
     "@babel/plugin-syntax-top-level-await": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz",
-      "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
+      "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
-      "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
+      "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
-      "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
+      "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-remap-async-to-generator": "^7.8.3"
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4"
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
-      "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
+      "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
-      "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz",
+      "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "lodash": "^4.17.13"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.9.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz",
-      "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
+      "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.8.3",
-        "@babel/helper-define-map": "^7.8.3",
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/helper-optimise-call-expression": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-replace-supers": "^7.8.6",
-        "@babel/helper-split-export-declaration": "^7.8.3",
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-define-map": "^7.10.4",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4",
         "globals": "^11.1.0"
       }
     },
     "@babel/plugin-transform-computed-properties": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
-      "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
+      "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.8.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz",
-      "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
+      "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
-      "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
+      "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
-      "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
+      "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
-      "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
+      "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
       "dev": true,
       "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz",
-      "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
+      "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-function-name": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
-      "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
+      "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-literals": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
-      "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
+      "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
-      "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+      "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
-      "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+      "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz",
-      "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+      "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-simple-access": "^7.8.3",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
-      "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
+      "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.8.3",
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-hoist-variables": "^7.10.4",
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz",
-      "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
+      "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.9.0",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
-      "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
+      "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.8.3"
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4"
       }
     },
     "@babel/plugin-transform-new-target": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
-      "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
+      "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-object-super": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
-      "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
+      "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-replace-supers": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4"
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.9.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz",
-      "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
+      "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-property-literals": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
-      "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
+      "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-react-constant-elements": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz",
-      "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz",
+      "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.8.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
-      "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
+      "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
       "dev": true,
       "requires": {
         "regenerator-transform": "^0.14.2"
       }
     },
     "@babel/plugin-transform-reserved-words": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
-      "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
+      "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
-      "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
+      "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
-      "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
+      "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
-      "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
+      "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3",
-        "@babel/helper-regex": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4"
       }
     },
     "@babel/plugin-transform-template-literals": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
-      "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
+      "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
-      "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
+      "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
-      "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
+      "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.8.3",
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/preset-env": {
@@ -1440,9 +1672,9 @@
       }
     },
     "@babel/runtime": {
-      "version": "7.9.2",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
-      "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+      "version": "7.11.2",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+      "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
       "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.4"
@@ -1460,30 +1692,49 @@
       }
     },
     "@babel/traverse": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
-      "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
+      "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@babel/generator": "^7.9.0",
-        "@babel/helper-function-name": "^7.8.3",
-        "@babel/helper-split-export-declaration": "^7.8.3",
-        "@babel/parser": "^7.9.0",
-        "@babel/types": "^7.9.0",
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.11.0",
+        "@babel/types": "^7.11.0",
         "debug": "^4.1.0",
         "globals": "^11.1.0",
-        "lodash": "^4.17.13"
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+          "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0",
+            "jsesc": "^2.5.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
       }
     },
     "@babel/types": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
-      "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
+      "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
       "dev": true,
       "requires": {
-        "@babel/helper-validator-identifier": "^7.9.0",
-        "lodash": "^4.17.13",
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
         "to-fast-properties": "^2.0.0"
       }
     },
@@ -1556,6 +1807,14 @@
         "@emotion/unitless": "0.7.5",
         "@emotion/utils": "0.11.3",
         "csstype": "^2.5.7"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "2.6.13",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz",
+          "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==",
+          "dev": true
+        }
       }
     },
     "@emotion/sheet": {
@@ -1668,31 +1927,42 @@
       }
     },
     "@ngrx/effects": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.0.0.tgz",
-      "integrity": "sha512-6Rq7FsNZK26HqYlpOGCglKLenIkVOOKE0y6D/8KXjEJ1JlZWi00fdI7poclBGjm9pvMBGXfJA8a9MKuxb/t9cA=="
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.2.0.tgz",
+      "integrity": "sha512-8V09zDIPehGpzgfcgyczelovsVYJvDQhN9wHt37K5A+YCG0CI8nj8FmKokHATwv/S62YqFrOVnr/TZacxpDhBw=="
     },
     "@ngrx/store": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.0.0.tgz",
-      "integrity": "sha512-QnmfXJ4G2jp+vFaqT5Qfp6h0J9OHxfDKI2RbnMU93Tq1Xd/WVPzXnOQGjILBjwwWI6RFkSdIpUoQONr7VOW63g=="
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.2.0.tgz",
+      "integrity": "sha512-V8AI3mxbMztVpbZpALkLZYlGkofKcu9GaOCY5e+sZ1VcJ90oxhFjBpnmd6MuVdmhep1XAHALb1B8ZbBFn+xsgQ=="
     },
     "@ngrx/store-devtools": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.0.0.tgz",
-      "integrity": "sha512-Vj8sj8GclbSbnYCS8eqZXTOYDdip1nnjKhkYClUg2oFPh67haaCmvh7TXITnX8PpgDtj5akF84Xw9/1HRiG8mg==",
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.2.0.tgz",
+      "integrity": "sha512-/FvgcpjO4IvwNFnRVoHGikAvckr6fxKf4NgYoTQ9giI8xavolLvuQUHxzH20legi5dgZz34ii2m2g1Q7OxEV8w==",
       "dev": true
     },
     "@ngtools/webpack": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0.tgz",
-      "integrity": "sha512-kQ+1N/F+5tuUXiiaoqJwhcOIM0I93EEvF3xwpTLRm91wl2i8R1261LvsD/uQPrgLrZNGR6eFhFF1Izn2PnIjQA==",
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.12.tgz",
+      "integrity": "sha512-lypMXIq5oxBMsoDu/VOa1yUmmXthhxkCJa8LG0ZohfnbwhmZvz3SAW7omBGuVrb5cVIfLCkaRCSnQ1MNc6ULXw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.0",
+        "@angular-devkit/core": "9.1.12",
         "enhanced-resolve": "4.1.1",
         "rxjs": "6.5.4",
         "webpack-sources": "1.4.3"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@ngx-translate/core": {
@@ -1701,12 +1971,9 @@
       "integrity": "sha512-ZudJsqIxTKlLmPoqK8gJY3UpMGujR0Xm7HfXL6AR79yGRS23QqpjAhMfx4v5qUCcHMmQ9/78bW8QJLfp31c7vQ=="
     },
     "@ngx-translate/http-loader": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-4.0.0.tgz",
-      "integrity": "sha512-x8LumqydWD7eX9yQTAVeoCM9gFUIGVTUjZqbxdAUavAA3qVnk9wCQux7iHLPXpydl8vyQmLoPQR+fFU+DUDOMA==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-5.0.0.tgz",
+      "integrity": "sha512-8+aV7N52qed+6t4LIu4Yru/PkeBX4TR2ioXGwXzQE5syqSLTj/8TgKQIi3i2Z61ZhPxQG1qrGbapUoGQzUDVeg=="
     },
     "@nodelib/fs.scandir": {
       "version": "2.1.3",
@@ -1716,20 +1983,12 @@
       "requires": {
         "@nodelib/fs.stat": "2.0.3",
         "run-parallel": "^1.1.9"
-      },
-      "dependencies": {
-        "@nodelib/fs.stat": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-          "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
-          "dev": true
-        }
       }
     },
     "@nodelib/fs.stat": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
-      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
       "dev": true
     },
     "@nodelib/fs.walk": {
@@ -1742,69 +2001,27 @@
         "fastq": "^1.6.0"
       }
     },
-    "@npmcli/ci-detect": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz",
-      "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==",
-      "dev": true
-    },
-    "@npmcli/git": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.1.tgz",
-      "integrity": "sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw==",
+    "@npmcli/move-file": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
+      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
       "dev": true,
       "requires": {
-        "@npmcli/promise-spawn": "^1.1.0",
-        "mkdirp": "^1.0.3",
-        "npm-pick-manifest": "^6.0.0",
-        "promise-inflight": "^1.0.1",
-        "promise-retry": "^1.1.1",
-        "unique-filename": "^1.1.1",
-        "which": "^2.0.2"
+        "mkdirp": "^1.0.4"
       },
       "dependencies": {
         "mkdirp": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz",
-          "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==",
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
         }
       }
     },
-    "@npmcli/installed-package-contents": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz",
-      "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==",
-      "dev": true,
-      "requires": {
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1",
-        "read-package-json-fast": "^1.1.1",
-        "readdir-scoped-modules": "^1.1.0"
-      }
-    },
-    "@npmcli/promise-spawn": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz",
-      "integrity": "sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA==",
-      "dev": true,
-      "requires": {
-        "infer-owner": "^1.0.4"
-      }
-    },
     "@reach/router": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.3.tgz",
-      "integrity": "sha512-gOIAiFhWdiVGSVjukKeNKkCRBLmnORoTPyBihI/jLunICPgxdP30DroAvPQuf1eVfQbfGJQDJkwhJXsNPMnVWw==",
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz",
+      "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==",
       "dev": true,
       "requires": {
         "create-react-context": "0.3.0",
@@ -1814,44 +2031,55 @@
       }
     },
     "@schematics/angular": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0.tgz",
-      "integrity": "sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA==",
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.12.tgz",
+      "integrity": "sha512-r4+aPAGhstsKFMwW/kOen1ACnzuLpz+vMxEpndXOqqVXLkAMsuAbQUFYjIlMy6fH4zdhpI90EJZ1PbOrAXvKxA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.0",
-        "@angular-devkit/schematics": "9.1.0"
+        "@angular-devkit/core": "9.1.12",
+        "@angular-devkit/schematics": "9.1.12"
       }
     },
     "@schematics/update": {
-      "version": "0.901.0",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0.tgz",
-      "integrity": "sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w==",
+      "version": "0.901.12",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.12.tgz",
+      "integrity": "sha512-SxGVYLTHhBC0rSF0OWSWPuJUB1Jhfqkl3o5bBgCC9//DutWiN6WoCCBTrCxR7F5vR2iiD7WqOe9CuvWYfvV8oQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "9.1.0",
-        "@angular-devkit/schematics": "9.1.0",
+        "@angular-devkit/core": "9.1.12",
+        "@angular-devkit/schematics": "9.1.12",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "npm-package-arg": "^8.0.0",
-        "pacote": "11.1.4",
+        "pacote": "9.5.12",
         "rxjs": "6.5.4",
         "semver": "7.1.3",
         "semver-intersect": "1.4.0"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+          "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
       }
     },
     "@storybook/addon-actions": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.3.18.tgz",
-      "integrity": "sha512-jdBVCcfyWin274Lkwg5cL+1fJ651NCuIWxuJVsmHQtIl2xTjf2MyoMoKQZNdt4xtE+W9w+rS4bYt04elrizThg==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.3.19.tgz",
+      "integrity": "sha512-gXF29FFUgYlUoFf1DcVCmH1chg2ElaHWMmCi5h7aZe+g6fXBQw0UtEdJnYLMOqZCIiWoZyuf1ETD0RbNHPhRIw==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/api": "5.3.18",
-        "@storybook/client-api": "5.3.18",
-        "@storybook/components": "5.3.18",
-        "@storybook/core-events": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/api": "5.3.19",
+        "@storybook/client-api": "5.3.19",
+        "@storybook/components": "5.3.19",
+        "@storybook/core-events": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "core-js": "^3.0.1",
         "fast-deep-equal": "^2.0.1",
         "global": "^4.3.2",
@@ -1871,17 +2099,17 @@
       }
     },
     "@storybook/addon-knobs": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-5.3.18.tgz",
-      "integrity": "sha512-X0WxGKoso3j5mS4c4enM8BvCjbO6Wwfxc++swQTqtANpBZ8k+w0piiEF1fiJf+ssgEAWe5brgIqnQ9kiBGLqKA==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-5.3.19.tgz",
+      "integrity": "sha512-e7z6KhvVOUGjygK4VL5Un1U3t0XG0jkb/BOHVWQMtH5dWNn3zofD3LrZZy24eAsyre/ej/LGo/BzwDSXkKLTog==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/api": "5.3.18",
-        "@storybook/client-api": "5.3.18",
-        "@storybook/components": "5.3.18",
-        "@storybook/core-events": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/api": "5.3.19",
+        "@storybook/client-api": "5.3.19",
+        "@storybook/components": "5.3.19",
+        "@storybook/core-events": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "@types/react-color": "^3.0.1",
         "copy-to-clipboard": "^3.0.8",
         "core-js": "^3.0.1",
@@ -1903,24 +2131,24 @@
           "dev": true
         },
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         }
       }
     },
     "@storybook/addon-links": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.3.18.tgz",
-      "integrity": "sha512-rDpsAQUr60BEM83TBh7mwKjaZvqTR+CAAMLAxXN+J8DMoOjymjd2sjq4UVJsOQVTnw3wjIc4+xpAL/eYqkJAIQ==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.3.19.tgz",
+      "integrity": "sha512-gn9u8lebREfRsyzxoDPG0O+kOf5aJ0BhzcCJGZZdqha0F6OWHhh8vJYZZvjJ/Qwze+Qt2zjrgWm+Q6+JLD8ugQ==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/core-events": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/core-events": "5.3.19",
         "@storybook/csf": "0.0.1",
-        "@storybook/router": "5.3.18",
+        "@storybook/router": "5.3.19",
         "core-js": "^3.0.1",
         "global": "^4.3.2",
         "prop-types": "^15.7.2",
@@ -1929,26 +2157,26 @@
       },
       "dependencies": {
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         }
       }
     },
     "@storybook/addon-notes": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/addon-notes/-/addon-notes-5.3.18.tgz",
-      "integrity": "sha512-P8d5P6+MErodRz2whP1f33ovhGMcOc/g4a+8qatiUotsPbg/2LKNRlY1QSfHWtm26NIGsgOTqSb0z1q6cyMNvQ==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-notes/-/addon-notes-5.3.19.tgz",
+      "integrity": "sha512-9dkUY5bPO/nux6zIXtE4h27AXgqz1Pogrbg7x0BwYWFdoMh7A8AWcnREfkjiPtrB/XGInlNRPqkU0KKk6tMi/w==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/api": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/components": "5.3.18",
-        "@storybook/core-events": "5.3.18",
-        "@storybook/router": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/api": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/components": "5.3.19",
+        "@storybook/core-events": "5.3.19",
+        "@storybook/router": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "core-js": "^3.0.1",
         "global": "^4.3.2",
         "markdown-to-jsx": "^6.10.3",
@@ -1958,29 +2186,29 @@
       }
     },
     "@storybook/addons": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.3.18.tgz",
-      "integrity": "sha512-ZQjDgTUDFRLvAiBg2d8FgPgghfQ+9uFyXQbtiGlTBLinrPCeQd7J86qiUES0fcGoohCCw0wWKtvB0WF2z1XNDg==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.3.19.tgz",
+      "integrity": "sha512-Ky/k22p6i6FVNvs1VhuFyGvYJdcp+FgXqFgnPyY/OXJW/vPDapdElpTpHJZLFI9I2FQBDcygBPU5RXkumQ+KUQ==",
       "dev": true,
       "requires": {
-        "@storybook/api": "5.3.18",
-        "@storybook/channels": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/core-events": "5.3.18",
+        "@storybook/api": "5.3.19",
+        "@storybook/channels": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/core-events": "5.3.19",
         "core-js": "^3.0.1",
         "global": "^4.3.2",
         "util-deprecate": "^1.0.2"
       }
     },
     "@storybook/angular": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-5.3.18.tgz",
-      "integrity": "sha512-vp1K9Rt7Zz/QuQTvAF+mDUMrtrb1peMw/xK0DNQGdYv8hfDtOkqFPdQK6rFlpO53oen9XAVMr6AE5778XoluoA==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-5.3.19.tgz",
+      "integrity": "sha512-ZRb/Gn/pWoZnIMSs4bxAdBiKzdcMJnkgkWiNS3TDerrgcNQbQzEgaPDSe2y3C7CAPmIEMSnBnT/o45rJIP6ZkQ==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/core": "5.3.18",
-        "@storybook/node-logger": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/core": "5.3.19",
+        "@storybook/node-logger": "5.3.19",
         "@types/webpack-env": "^1.15.0",
         "core-js": "^3.0.1",
         "fork-ts-checker-webpack-plugin": "^3.0.1",
@@ -1993,18 +2221,18 @@
       }
     },
     "@storybook/api": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.3.18.tgz",
-      "integrity": "sha512-QXaccNCARHzPWOuxYndiebGWBZmwiUvRgB9ji0XTJBS3y8K0ZPb5QyuqiKPaEWUj8dBA8rzdDtkW3Yt95Namaw==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.3.19.tgz",
+      "integrity": "sha512-U/VzDvhNCPmw2igvJYNNM+uwJCL+3teiL6JmuoL4/cmcqhI6IqqG9dZmMP1egoCd19wXEP7rnAfB/VcYVg41dQ==",
       "dev": true,
       "requires": {
         "@reach/router": "^1.2.1",
-        "@storybook/channels": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/core-events": "5.3.18",
+        "@storybook/channels": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/core-events": "5.3.19",
         "@storybook/csf": "0.0.1",
-        "@storybook/router": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/router": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "@types/reach__router": "^1.2.3",
         "core-js": "^3.0.1",
         "fast-deep-equal": "^2.0.1",
@@ -2035,38 +2263,38 @@
       }
     },
     "@storybook/channel-postmessage": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.3.18.tgz",
-      "integrity": "sha512-awxBW/aVfNtY9QvYZgsPaMXgUpC2+W3vEyQcl/w4ce0YVH+7yWx3wt3Ku49lQwxZwDrxP3QoC0U+mkPc9hBJwA==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.3.19.tgz",
+      "integrity": "sha512-Iq0f4NPHR0UVVFCWt0cI7Myadk4/SATXYJPT6sv95KhnLjKEeYw571WBlThfp8a9FM80887xG+eIRe93c8dleA==",
       "dev": true,
       "requires": {
-        "@storybook/channels": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
+        "@storybook/channels": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
         "core-js": "^3.0.1",
         "global": "^4.3.2",
         "telejson": "^3.2.0"
       }
     },
     "@storybook/channels": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.3.18.tgz",
-      "integrity": "sha512-scP/6td/BJSEOgfN+qaYGDf3E793xye7tIw6W+sYqwg+xdMFO39wVXgVZNpQL6sLEwpJZTaPywCjC6p6ksErqQ==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.3.19.tgz",
+      "integrity": "sha512-38seaeyshRGotTEZJppyYMg/Vx2zRKgFv1L6uGqkJT0LYoNSYtJhsiNFCJ2/KUJu2chAJ/j8h80bpVBVLQ/+WA==",
       "dev": true,
       "requires": {
         "core-js": "^3.0.1"
       }
     },
     "@storybook/client-api": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.3.18.tgz",
-      "integrity": "sha512-QiXTDUpjdyW19BlocLw07DrkOnEzVaWGJcRze2nSs29IKKuq1Ncv2LOAZt6ySSq0PmIKsjBou3bmS1/aXmDMdw==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.3.19.tgz",
+      "integrity": "sha512-Dh8ZLrLH91j9Fa28Gmp0KFUvvgK348aNMrDNAUdj4m4witz/BWQ2pxz6qq9/xFVErk/GanVC05kazGElqgYCRQ==",
       "dev": true,
       "requires": {
-        "@storybook/addons": "5.3.18",
-        "@storybook/channel-postmessage": "5.3.18",
-        "@storybook/channels": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/core-events": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/channel-postmessage": "5.3.19",
+        "@storybook/channels": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/core-events": "5.3.19",
         "@storybook/csf": "0.0.1",
         "@types/webpack-env": "^1.15.0",
         "core-js": "^3.0.1",
@@ -2082,51 +2310,42 @@
       },
       "dependencies": {
         "is-plain-object": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz",
-          "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==",
-          "dev": true,
-          "requires": {
-            "isobject": "^4.0.0"
-          }
-        },
-        "isobject": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz",
-          "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==",
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz",
+          "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==",
           "dev": true
         },
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         }
       }
     },
     "@storybook/client-logger": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.3.18.tgz",
-      "integrity": "sha512-RZjxw4uqZX3Yk27IirbB/pQG+wRsQSSRlKqYa8KQ5bSanm4IrcV9VA1OQbuySW9njE+CexAnakQJ/fENdmurNg==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.3.19.tgz",
+      "integrity": "sha512-nHftT9Ow71YgAd2/tsu79kwKk30mPuE0sGRRUHZVyCRciGFQweKNOS/6xi2Aq+WwBNNjPKNlbgxwRt1yKe1Vkg==",
       "dev": true,
       "requires": {
         "core-js": "^3.0.1"
       }
     },
     "@storybook/components": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.3.18.tgz",
-      "integrity": "sha512-LIN4aVCCDY7klOwtuqQhfYz4tHaMADhXEzZpij+3r8N68Inck6IJ1oo9A9umXQPsTioQi8e6FLobH1im90j/2A==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.3.19.tgz",
+      "integrity": "sha512-3g23/+ktlocaHLJKISu9Neu3XKa6aYP2ctDYkRtGchSB0Q55hQsUVGO+BEVuT7Pk2D59mVCxboBjxcRoPUY4pw==",
       "dev": true,
       "requires": {
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "@types/react-syntax-highlighter": "11.0.4",
         "@types/react-textarea-autosize": "^4.3.3",
         "core-js": "^3.0.1",
         "global": "^4.3.2",
         "lodash": "^4.17.15",
-        "markdown-to-jsx": "^6.9.1",
+        "markdown-to-jsx": "^6.11.4",
         "memoizerific": "^1.11.3",
         "polished": "^3.3.1",
         "popper.js": "^1.14.7",
@@ -2143,9 +2362,9 @@
       }
     },
     "@storybook/core": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.3.18.tgz",
-      "integrity": "sha512-XQb/UQb+Ohuaw0GhKKYzvmuuh5Tit93f2cLZD9QCSWUPvDGmLG5g91Y9NbUr4Ap3mANT3NksMNhkAV0GxExEkg==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.3.19.tgz",
+      "integrity": "sha512-4EYzglqb1iD6x9gxtAYpRGwGP6qJGiU2UW4GiYrErEmeu6y6tkyaqW5AwGlIo9+6jAfwD0HjaK8afvjKTtmmMQ==",
       "dev": true,
       "requires": {
         "@babel/plugin-proposal-class-properties": "^7.7.0",
@@ -2153,16 +2372,16 @@
         "@babel/plugin-syntax-dynamic-import": "^7.2.0",
         "@babel/plugin-transform-react-constant-elements": "^7.2.0",
         "@babel/preset-env": "^7.4.5",
-        "@storybook/addons": "5.3.18",
-        "@storybook/channel-postmessage": "5.3.18",
-        "@storybook/client-api": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/core-events": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/channel-postmessage": "5.3.19",
+        "@storybook/client-api": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/core-events": "5.3.19",
         "@storybook/csf": "0.0.1",
-        "@storybook/node-logger": "5.3.18",
-        "@storybook/router": "5.3.18",
-        "@storybook/theming": "5.3.18",
-        "@storybook/ui": "5.3.18",
+        "@storybook/node-logger": "5.3.19",
+        "@storybook/router": "5.3.19",
+        "@storybook/theming": "5.3.19",
+        "@storybook/ui": "5.3.19",
         "airbnb-js-shims": "^2.2.1",
         "ansi-to-html": "^0.6.11",
         "autoprefixer": "^9.7.2",
@@ -2223,81 +2442,45 @@
         "webpack-virtual-modules": "^0.2.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
         "autoprefixer": {
-          "version": "9.7.5",
-          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz",
-          "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==",
+          "version": "9.8.6",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+          "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
           "dev": true,
           "requires": {
-            "browserslist": "^4.11.0",
-            "caniuse-lite": "^1.0.30001036",
-            "chalk": "^2.4.2",
+            "browserslist": "^4.12.0",
+            "caniuse-lite": "^1.0.30001109",
+            "colorette": "^1.2.1",
             "normalize-range": "^0.1.2",
             "num2fraction": "^1.2.2",
-            "postcss": "^7.0.27",
-            "postcss-value-parser": "^4.0.3"
-          },
-          "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"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-              "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-              "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-              "dev": true
-            },
-            "has-flag": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-              "dev": true
-            },
-            "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"
-              }
-            }
+            "postcss": "^7.0.32",
+            "postcss-value-parser": "^4.1.0"
+          }
+        },
+        "cacache": {
+          "version": "13.0.1",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
+          "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.2",
+            "figgy-pudding": "^3.5.1",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.2.2",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^5.1.1",
+            "minipass": "^3.0.0",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "p-map": "^3.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.7.1",
+            "ssri": "^7.0.0",
+            "unique-filename": "^1.1.1"
           }
         },
         "chalk": {
@@ -2308,6 +2491,33 @@
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+              "dev": true,
+              "requires": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+              }
+            },
+            "has-flag": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+              "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+              "dev": true
+            },
+            "supports-color": {
+              "version": "7.1.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+              "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
           }
         },
         "color-convert": {
@@ -2362,11 +2572,32 @@
             "universalify": "^0.1.0"
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+        "jest-worker": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
+          "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
+          "dev": true,
+          "requires": {
+            "merge-stream": "^2.0.0",
+            "supports-color": "^7.0.0"
+          },
+          "dependencies": {
+            "has-flag": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+              "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+              "dev": true
+            },
+            "supports-color": {
+              "version": "7.1.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+              "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
         },
         "loader-utils": {
           "version": "1.4.0",
@@ -2399,25 +2630,6 @@
             "p-locate": "^4.1.0"
           }
         },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -2427,22 +2639,51 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
           "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          },
+          "dependencies": {
+            "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"
+              },
+              "dependencies": {
+                "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"
+                  }
+                }
+              }
+            }
+          }
+        },
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         },
         "raw-loader": {
@@ -2461,27 +2702,97 @@
           "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
         },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
           "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "randombytes": "^2.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
+          "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1",
+            "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "terser": {
+          "version": "4.8.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+          "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+          "dev": true,
+          "requires": {
+            "commander": "^2.20.0",
+            "source-map": "~0.6.1",
+            "source-map-support": "~0.5.12"
+          },
+          "dependencies": {
+            "commander": {
+              "version": "2.20.3",
+              "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+              "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+              "dev": true
+            }
+          }
+        },
+        "terser-webpack-plugin": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz",
+          "integrity": "sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg==",
+          "dev": true,
+          "requires": {
+            "cacache": "^13.0.1",
+            "find-cache-dir": "^3.3.1",
+            "jest-worker": "^25.4.0",
+            "p-limit": "^2.3.0",
+            "schema-utils": "^2.6.6",
+            "serialize-javascript": "^3.1.0",
+            "source-map": "^0.6.1",
+            "terser": "^4.6.12",
+            "webpack-sources": "^1.4.3"
           }
         }
       }
     },
     "@storybook/core-events": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.3.18.tgz",
-      "integrity": "sha512-uQ6NYJ5WODXK8DJ7m8y3yUAtWB3n+6XtYztjY+tdkCsLYvTYDXNS+epV+f5Hu9+gB+/Dm+b5Su4jDD+LZB2QWA==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.3.19.tgz",
+      "integrity": "sha512-lh78ySqMS7pDdMJAQAe35d1I/I4yPTqp09Cq0YIYOxx9BQZhah4DZTV1QIZt22H5p2lPb5MWLkWSxBaexZnz8A==",
       "dev": true,
       "requires": {
         "core-js": "^3.0.1"
@@ -2497,9 +2808,9 @@
       }
     },
     "@storybook/node-logger": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.3.18.tgz",
-      "integrity": "sha512-Go/hdtaPTtjgJP+GYk8VXcOmecrdG7cXm0yyTlatd6s8xXI0txHme1/0MOZmEPows1Ec7KAQ20+NnaCGUPZUUg==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.3.19.tgz",
+      "integrity": "sha512-hKshig/u5Nj9fWy0OsyU04yqCxr0A9pydOHIassr4fpLAaePIN2YvqCqE2V+TxQHjZUnowSSIhbXrGt0DI5q2A==",
       "dev": true,
       "requires": {
         "@types/npmlog": "^4.1.2",
@@ -2563,9 +2874,9 @@
       }
     },
     "@storybook/router": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.3.18.tgz",
-      "integrity": "sha512-6B2U2C75KTSVaCuYYgcubeJGcCSnwsXuEf50hEd5mGqWgHZfojCtGvB7Ko4X+0h8rEC+eNA4p7YBOhlUv9WNrQ==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.3.19.tgz",
+      "integrity": "sha512-yNClpuP7BXQlBTRf6Ggle3/R349/k6kvI5Aim4jf6X/2cFVg2pzBXDAF41imNm9PcvdxwabQLm6I48p7OvKr/w==",
       "dev": true,
       "requires": {
         "@reach/router": "^1.2.1",
@@ -2580,22 +2891,22 @@
       },
       "dependencies": {
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         }
       }
     },
     "@storybook/theming": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.3.18.tgz",
-      "integrity": "sha512-lfFTeLoYwLMKg96N3gn0umghMdAHgJBGuk2OM8Ll84yWtdl9RGnzfiI1Fl7Cr5k95dCF7drLJlJCao1VxUkFSA==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.3.19.tgz",
+      "integrity": "sha512-ecG+Rq3hc1GOzKHamYnD4wZ0PEP9nNg0mXbC3RhbxfHj+pMMCWWmx9B2Uu75SL1PTT8WcfkFO0hU/0IO84Pzlg==",
       "dev": true,
       "requires": {
         "@emotion/core": "^10.0.20",
         "@emotion/styled": "^10.0.17",
-        "@storybook/client-logger": "5.3.18",
+        "@storybook/client-logger": "5.3.19",
         "core-js": "^3.0.1",
         "deep-object-diff": "^1.1.0",
         "emotion-theming": "^10.0.19",
@@ -2616,20 +2927,20 @@
       }
     },
     "@storybook/ui": {
-      "version": "5.3.18",
-      "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.3.18.tgz",
-      "integrity": "sha512-xyXK53fNe9lkGPmXf3Nk+n0gz9gOgXI+fDxetyDLpX79k3DIN/jCKEnv45vXof7OQ45mTmyBvUNTKrNLqKTt5Q==",
+      "version": "5.3.19",
+      "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.3.19.tgz",
+      "integrity": "sha512-r0VxdWab49nm5tzwvveVDnsHIZHMR76veYOu/NHKDUZ5hnQl1LMG1YyMCFFa7KiwD/OrZxRWr6/Ma7ep9kR4Gw==",
       "dev": true,
       "requires": {
         "@emotion/core": "^10.0.20",
-        "@storybook/addons": "5.3.18",
-        "@storybook/api": "5.3.18",
-        "@storybook/channels": "5.3.18",
-        "@storybook/client-logger": "5.3.18",
-        "@storybook/components": "5.3.18",
-        "@storybook/core-events": "5.3.18",
-        "@storybook/router": "5.3.18",
-        "@storybook/theming": "5.3.18",
+        "@storybook/addons": "5.3.19",
+        "@storybook/api": "5.3.19",
+        "@storybook/channels": "5.3.19",
+        "@storybook/client-logger": "5.3.19",
+        "@storybook/components": "5.3.19",
+        "@storybook/core-events": "5.3.19",
+        "@storybook/router": "5.3.19",
+        "@storybook/theming": "5.3.19",
         "copy-to-clipboard": "^3.0.8",
         "core-js": "^3.0.1",
         "core-js-pure": "^3.0.1",
@@ -2638,7 +2949,7 @@
         "fuse.js": "^3.4.6",
         "global": "^4.3.2",
         "lodash": "^4.17.15",
-        "markdown-to-jsx": "^6.9.3",
+        "markdown-to-jsx": "^6.11.4",
         "memoizerific": "^1.11.3",
         "polished": "^3.3.1",
         "prop-types": "^15.7.2",
@@ -2664,9 +2975,9 @@
           "dev": true
         },
         "qs": {
-          "version": "6.9.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
-          "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+          "version": "6.9.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+          "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
           "dev": true
         },
         "resolve-from": {
@@ -2683,11 +2994,24 @@
         }
       }
     },
-    "@tootallnate/once": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz",
-      "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==",
-      "dev": true
+    "@stylelint/postcss-css-in-js": {
+      "version": "0.37.2",
+      "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+      "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
+      "dev": true,
+      "requires": {
+        "@babel/core": ">=7.9.0"
+      }
+    },
+    "@stylelint/postcss-markdown": {
+      "version": "0.36.1",
+      "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
+      "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+      "dev": true,
+      "requires": {
+        "remark": "^12.0.0",
+        "unist-util-find-all-after": "^3.0.1"
+      }
     },
     "@types/anymatch": {
       "version": "1.3.1",
@@ -2701,33 +3025,32 @@
       "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
       "dev": true
     },
-    "@types/events": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
-      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+    "@types/geojson": {
+      "version": "7946.0.7",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
+      "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==",
       "dev": true
     },
     "@types/glob": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
-      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
       "dev": true,
       "requires": {
-        "@types/events": "*",
         "@types/minimatch": "*",
         "@types/node": "*"
       }
     },
     "@types/history": {
-      "version": "4.7.5",
-      "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz",
-      "integrity": "sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw==",
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.7.tgz",
+      "integrity": "sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg==",
       "dev": true
     },
     "@types/html-minifier-terser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz",
-      "integrity": "sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz",
+      "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==",
       "dev": true
     },
     "@types/is-function": {
@@ -2737,9 +3060,9 @@
       "dev": true
     },
     "@types/jasmine": {
-      "version": "3.5.10",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz",
-      "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==",
+      "version": "3.5.12",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.12.tgz",
+      "integrity": "sha512-vJaQ58oceFao+NzpKNqLOWwHPsqA7YEhKv+mOXvYU4/qh+BfVWIxaBtL0Ck5iCS67yOkNwGkDCrzepnzIWF+7g==",
       "dev": true
     },
     "@types/jasminewd2": {
@@ -2751,6 +3074,12 @@
         "@types/jasmine": "*"
       }
     },
+    "@types/json-schema": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
+      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "dev": true
+    },
     "@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -2766,6 +3095,15 @@
         "@types/node": "*"
       }
     },
+    "@types/leaflet": {
+      "version": "1.5.17",
+      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.5.17.tgz",
+      "integrity": "sha512-2XYq9k6kNjhNI7PaTz8Rdxcc8Vzwu97OaS9CtcrTxnTSxFUGwjlGjTDvhTLJU+JRSfZ4lBwGcl0SjZHALdVr6g==",
+      "dev": true,
+      "requires": {
+        "@types/geojson": "*"
+      }
+    },
     "@types/minimatch": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -2779,9 +3117,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "12.12.34",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz",
-      "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==",
+      "version": "12.12.54",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz",
+      "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -2815,15 +3153,15 @@
       "dev": true
     },
     "@types/q": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
-      "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
       "dev": true
     },
     "@types/reach__router": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.3.tgz",
-      "integrity": "sha512-HTHMGJLdH3czgPP1nHF82y+TYLV1KSh1qYeezqHNDNuESBy55ij1LCn8jDYFeKCuAxm0gd9J25zyYy7mhOcgOw==",
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.5.tgz",
+      "integrity": "sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ==",
       "dev": true,
       "requires": {
         "@types/history": "*",
@@ -2831,22 +3169,23 @@
       }
     },
     "@types/react": {
-      "version": "16.9.31",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.31.tgz",
-      "integrity": "sha512-NpYJpNMWScFXtx3A2BJMeew2G3+9SEslVWMdxNJ6DLvxIuxWjY1bizK9q5Y1ujhln31vtjmhjOAYDr9Xx3k9FQ==",
+      "version": "16.9.44",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.44.tgz",
+      "integrity": "sha512-BtLoJrXdW8DVZauKP+bY4Kmiq7ubcJq+H/aCpRfvPF7RAT3RwR73Sg8szdc2YasbAlWBDrQ6Q+AFM0KwtQY+WQ==",
       "dev": true,
       "requires": {
         "@types/prop-types": "*",
-        "csstype": "^2.2.0"
+        "csstype": "^3.0.2"
       }
     },
     "@types/react-color": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.1.tgz",
-      "integrity": "sha512-J6mYm43Sid9y+OjZ7NDfJ2VVkeeuTPNVImNFITgQNXodHteKfl/t/5pAR5Z9buodZ2tCctsZjgiMlQOpfntakw==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.4.tgz",
+      "integrity": "sha512-EswbYJDF1kkrx93/YU+BbBtb46CCtDMvTiGmcOa/c5PETnwTiSWoseJ1oSWeRl/4rUXkhME9bVURvvPg0W5YQw==",
       "dev": true,
       "requires": {
-        "@types/react": "*"
+        "@types/react": "*",
+        "@types/reactcss": "*"
       }
     },
     "@types/react-syntax-highlighter": {
@@ -2867,6 +3206,15 @@
         "@types/react": "*"
       }
     },
+    "@types/reactcss": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.3.tgz",
+      "integrity": "sha512-d2gQQ0IL6hXLnoRfVYZukQNWHuVsE75DzFTLPUuyyEhJS8G2VvlE+qfQQ91SJjaMqlURRCNIsX7Jcsw6cEuJlA==",
+      "dev": true,
+      "requires": {
+        "@types/react": "*"
+      }
+    },
     "@types/selenium-webdriver": {
       "version": "3.0.17",
       "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz",
@@ -2880,15 +3228,15 @@
       "dev": true
     },
     "@types/tapable": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz",
-      "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz",
+      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
       "dev": true
     },
     "@types/uglify-js": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.5.tgz",
-      "integrity": "sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw==",
+      "version": "3.9.3",
+      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz",
+      "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==",
       "dev": true,
       "requires": {
         "source-map": "^0.6.1"
@@ -2908,30 +3256,10 @@
       "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
       "dev": true
     },
-    "@types/vfile": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz",
-      "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "@types/unist": "*",
-        "@types/vfile-message": "*"
-      }
-    },
-    "@types/vfile-message": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz",
-      "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==",
-      "dev": true,
-      "requires": {
-        "vfile-message": "*"
-      }
-    },
     "@types/webpack": {
-      "version": "4.41.10",
-      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.10.tgz",
-      "integrity": "sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA==",
+      "version": "4.41.21",
+      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz",
+      "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==",
       "dev": true,
       "requires": {
         "@types/anymatch": "*",
@@ -2951,15 +3279,15 @@
       }
     },
     "@types/webpack-env": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.15.1.tgz",
-      "integrity": "sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==",
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.15.2.tgz",
+      "integrity": "sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ==",
       "dev": true
     },
     "@types/webpack-sources": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz",
-      "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==",
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz",
+      "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==",
       "dev": true,
       "requires": {
         "@types/node": "*",
@@ -3179,6 +3507,16 @@
       "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
       "dev": true
     },
+    "JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+      "dev": true,
+      "requires": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      }
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -3202,9 +3540,9 @@
       "dev": true
     },
     "acorn-walk": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
-      "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
       "dev": true
     },
     "address": {
@@ -3214,9 +3552,9 @@
       "dev": true
     },
     "adm-zip": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz",
-      "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==",
+      "version": "0.4.16",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
+      "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
       "dev": true
     },
     "after": {
@@ -3226,22 +3564,20 @@
       "dev": true
     },
     "agent-base": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz",
-      "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+      "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
       "dev": true,
       "requires": {
-        "debug": "4"
+        "es6-promisify": "^5.0.0"
       }
     },
     "agentkeepalive": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz",
-      "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
+      "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
       "dev": true,
       "requires": {
-        "debug": "^4.1.0",
-        "depd": "^1.1.2",
         "humanize-ms": "^1.2.1"
       }
     },
@@ -3281,9 +3617,9 @@
       }
     },
     "ajv": {
-      "version": "6.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
-      "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+      "version": "6.12.3",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+      "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
@@ -3299,9 +3635,9 @@
       "dev": true
     },
     "ajv-keywords": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
-      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true
     },
     "alphanum-sort": {
@@ -3317,40 +3653,6 @@
       "dev": true,
       "requires": {
         "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "ansi-colors": {
@@ -3428,15 +3730,6 @@
       "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==",
       "dev": true
     },
-    "append-transform": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
-      "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
-      "dev": true,
-      "requires": {
-        "default-require-extensions": "^2.0.0"
-      }
-    },
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
@@ -3520,13 +3813,10 @@
       }
     },
     "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
     },
     "array-uniq": {
       "version": "1.0.3",
@@ -3609,6 +3899,14 @@
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "assert": {
@@ -3751,9 +4049,9 @@
       "dev": true
     },
     "aws4": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
-      "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+      "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
       "dev": true
     },
     "axobject-query": {
@@ -3904,18 +4202,18 @@
       "dev": true
     },
     "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==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
       "dev": true,
       "requires": {
         "object.assign": "^4.1.0"
       }
     },
     "babel-plugin-emotion": {
-      "version": "10.0.29",
-      "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz",
-      "integrity": "sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw==",
+      "version": "10.0.33",
+      "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz",
+      "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==",
       "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.0.0",
@@ -3973,9 +4271,9 @@
           }
         },
         "parse-json": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
-          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -3984,12 +4282,6 @@
             "lines-and-columns": "^1.1.6"
           }
         },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        },
         "resolve-from": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -4287,9 +4579,9 @@
       "dev": true
     },
     "base64id": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
-      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
       "dev": true
     },
     "batch": {
@@ -4341,9 +4633,9 @@
       "dev": true
     },
     "binary-extensions": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
-      "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
       "dev": true
     },
     "bindings": {
@@ -4412,9 +4704,9 @@
       "dev": true
     },
     "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
+      "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==",
       "dev": true
     },
     "body-parser": {
@@ -4541,6 +4833,12 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -4687,21 +4985,50 @@
       "requires": {
         "bn.js": "^4.1.0",
         "randombytes": "^2.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
       "dev": true,
       "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
       }
     },
     "browserify-zlib": {
@@ -4714,54 +5041,24 @@
       }
     },
     "browserslist": {
-      "version": "4.11.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
-      "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
+      "version": "4.13.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz",
+      "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001038",
-        "electron-to-chromium": "^1.3.390",
-        "node-releases": "^1.1.53",
-        "pkg-up": "^2.0.0"
+        "caniuse-lite": "^1.0.30001093",
+        "electron-to-chromium": "^1.3.488",
+        "escalade": "^3.0.1",
+        "node-releases": "^1.1.58"
       }
     },
     "browserstack": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz",
-      "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz",
+      "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==",
       "dev": true,
       "requires": {
         "https-proxy-agent": "^2.2.1"
-      },
-      "dependencies": {
-        "agent-base": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
-          "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
-          "dev": true,
-          "requires": {
-            "es6-promisify": "^5.0.0"
-          }
-        },
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "https-proxy-agent": {
-          "version": "2.2.4",
-          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
-          "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
-          "dev": true,
-          "requires": {
-            "agent-base": "^4.3.0",
-            "debug": "^3.1.0"
-          }
-        }
       }
     },
     "buffer": {
@@ -4775,34 +5072,12 @@
         "isarray": "^1.0.0"
       }
     },
-    "buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
-      "requires": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
-      }
-    },
-    "buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true
-    },
     "buffer-crc32": {
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
       "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
       "dev": true
     },
-    "buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true
-    },
     "buffer-from": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -4871,9 +5146,9 @@
       },
       "dependencies": {
         "mkdirp": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz",
-          "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==",
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
         },
         "rimraf": {
@@ -4986,9 +5261,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001038",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
-      "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==",
+      "version": "1.0.30001111",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001111.tgz",
+      "integrity": "sha512-xnDje2wchd/8mlJu8sXvWxOGvMgv+uT3iZ3bkIAynKOzToCssWCmkz/ZIkQBs/2pUB4uwnJKVORWQ31UkbVjOg==",
       "dev": true
     },
     "canonical-path": {
@@ -5063,9 +5338,9 @@
       "dev": true
     },
     "chokidar": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
-      "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
+      "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
       "dev": true,
       "requires": {
         "anymatch": "~3.1.1",
@@ -5075,18 +5350,7 @@
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.3.0"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        }
+        "readdirp": "~3.4.0"
       }
     },
     "chownr": {
@@ -5194,9 +5458,9 @@
       }
     },
     "cli-spinners": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz",
-      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
+      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
       "dev": true
     },
     "cli-table3": {
@@ -5208,12 +5472,39 @@
         "colors": "^1.1.2",
         "object-assign": "^4.1.0",
         "string-width": "^2.1.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
       }
     },
     "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+      "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
       "dev": true
     },
     "clipboard": {
@@ -5229,29 +5520,29 @@
       }
     },
     "cliui": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-      "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
       "dev": true,
       "requires": {
-        "string-width": "^2.1.1",
-        "strip-ansi": "^4.0.0",
-        "wrap-ansi": "^2.0.0"
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
         "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^3.0.0"
+            "ansi-regex": "^4.1.0"
           }
         }
       }
@@ -5381,10 +5672,16 @@
         "simple-swizzle": "^0.2.2"
       }
     },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+      "dev": true
+    },
     "colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
       "dev": true
     },
     "combined-stream": {
@@ -5632,121 +5929,86 @@
       }
     },
     "copy-webpack-plugin": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz",
-      "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz",
+      "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==",
       "dev": true,
       "requires": {
-        "cacache": "^12.0.3",
-        "find-cache-dir": "^2.1.0",
-        "glob-parent": "^3.1.0",
-        "globby": "^7.1.1",
-        "is-glob": "^4.0.1",
-        "loader-utils": "^1.2.3",
-        "minimatch": "^3.0.4",
+        "cacache": "^15.0.4",
+        "fast-glob": "^3.2.4",
+        "find-cache-dir": "^3.3.1",
+        "glob-parent": "^5.1.1",
+        "globby": "^11.0.1",
+        "loader-utils": "^2.0.0",
         "normalize-path": "^3.0.0",
-        "p-limit": "^2.2.1",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^2.1.2",
-        "webpack-log": "^2.0.0"
+        "p-limit": "^3.0.1",
+        "schema-utils": "^2.7.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-sources": "^1.4.3"
       },
       "dependencies": {
         "cacache": {
-          "version": "12.0.4",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "version": "15.0.5",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
           "dev": true,
           "requires": {
-            "bluebird": "^3.5.5",
-            "chownr": "^1.1.1",
-            "figgy-pudding": "^3.5.1",
+            "@npmcli/move-file": "^1.0.1",
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
             "glob": "^7.1.4",
-            "graceful-fs": "^4.1.15",
-            "infer-owner": "^1.0.3",
-            "lru-cache": "^5.1.1",
-            "mississippi": "^3.0.0",
-            "mkdirp": "^0.5.1",
-            "move-concurrently": "^1.0.1",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^6.0.0",
+            "minipass": "^3.1.1",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^1.0.3",
+            "p-map": "^4.0.0",
             "promise-inflight": "^1.0.1",
-            "rimraf": "^2.6.3",
-            "ssri": "^6.0.1",
-            "unique-filename": "^1.1.1",
-            "y18n": "^4.0.0"
+            "rimraf": "^3.0.2",
+            "ssri": "^8.0.0",
+            "tar": "^6.0.2",
+            "unique-filename": "^1.1.1"
           }
         },
-        "find-cache-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^2.0.0",
-            "pkg-dir": "^3.0.0"
+            "yallist": "^4.0.0"
           }
         },
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
         },
         "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
           "dev": true,
           "requires": {
             "p-try": "^2.0.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+        "p-map": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+          "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
           "dev": true,
           "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "ssri": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
-          "dev": true,
-          "requires": {
-            "figgy-pudding": "^3.5.1"
+            "aggregate-error": "^3.0.0"
           }
         }
       }
@@ -5758,12 +6020,12 @@
       "dev": true
     },
     "core-js-compat": {
-      "version": "3.6.4",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz",
-      "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==",
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+      "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.8.3",
+        "browserslist": "^4.8.5",
         "semver": "7.0.0"
       },
       "dependencies": {
@@ -5776,9 +6038,9 @@
       }
     },
     "core-js-pure": {
-      "version": "3.6.4",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz",
-      "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==",
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
+      "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==",
       "dev": true
     },
     "core-util-is": {
@@ -5818,13 +6080,21 @@
       }
     },
     "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
       "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
+        "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "create-hash": {
@@ -5941,9 +6211,9 @@
       }
     },
     "css-loader": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
-      "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz",
+      "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==",
       "dev": true,
       "requires": {
         "camelcase": "^5.3.1",
@@ -5951,13 +6221,14 @@
         "icss-utils": "^4.1.1",
         "loader-utils": "^1.2.3",
         "normalize-path": "^3.0.0",
-        "postcss": "^7.0.23",
+        "postcss": "^7.0.27",
         "postcss-modules-extract-imports": "^2.0.0",
         "postcss-modules-local-by-default": "^3.0.2",
-        "postcss-modules-scope": "^2.1.1",
+        "postcss-modules-scope": "^2.2.0",
         "postcss-modules-values": "^3.0.0",
-        "postcss-value-parser": "^4.0.2",
-        "schema-utils": "^2.6.0"
+        "postcss-value-parser": "^4.0.3",
+        "schema-utils": "^2.6.5",
+        "semver": "^6.3.0"
       },
       "dependencies": {
         "json5": {
@@ -5979,6 +6250,12 @@
             "emojis-list": "^3.0.0",
             "json5": "^1.0.1"
           }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
         }
       }
     },
@@ -6010,14 +6287,13 @@
       "dev": true
     },
     "css-selector-tokenizer": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz",
-      "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==",
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+      "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
       "dev": true,
       "requires": {
         "cssesc": "^3.0.0",
-        "fastparse": "^1.1.2",
-        "regexpu-core": "^4.6.0"
+        "fastparse": "^1.1.2"
       }
     },
     "css-tree": {
@@ -6039,9 +6315,9 @@
       }
     },
     "css-what": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
-      "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
+      "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
       "dev": true
     },
     "css.escape": {
@@ -6175,9 +6451,9 @@
       }
     },
     "csstype": {
-      "version": "2.6.10",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz",
-      "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz",
+      "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==",
       "dev": true
     },
     "custom-event": {
@@ -6208,9 +6484,9 @@
       }
     },
     "date-format": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
-      "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz",
+      "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==",
       "dev": true
     },
     "debug": {
@@ -6288,15 +6564,6 @@
         "ip-regex": "^2.1.0"
       }
     },
-    "default-require-extensions": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
-      "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
-      "dev": true,
-      "requires": {
-        "strip-bom": "^3.0.0"
-      }
-    },
     "defaults": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -6379,6 +6646,15 @@
         "rimraf": "^2.6.3"
       },
       "dependencies": {
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
         "globby": {
           "version": "6.1.0",
           "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
@@ -6470,6 +6746,12 @@
       "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
       "dev": true
     },
+    "detect-node-es": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.0.0.tgz",
+      "integrity": "sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg==",
+      "dev": true
+    },
     "detect-port": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz",
@@ -6514,9 +6796,9 @@
       "dev": true
     },
     "diagram-js": {
-      "version": "6.6.1",
-      "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-6.6.1.tgz",
-      "integrity": "sha512-3SlXwT2ieXCZkQn8dVZWfNry9+6d4R+0Q57Oz9t/SfIyNIrRPg0c9IlsaTHpGUhPE3fossXPDjmvqjJD0lmBLw==",
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-6.7.0.tgz",
+      "integrity": "sha512-kkY6fFUgNA/Teju776wSg3/zPmmcedLVlX48agyfEa0oJGfzsneJtwYkNSTZfBmHO5g8MKIJ6AThdwvooIMUWw==",
       "requires": {
         "css.escape": "^1.5.1",
         "didi": "^4.0.0",
@@ -6558,15 +6840,23 @@
         "bn.js": "^4.1.0",
         "miller-rabin": "^4.0.0",
         "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "dir-glob": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
-      "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
       "requires": {
-        "path-type": "^3.0.0"
+        "path-type": "^4.0.0"
       }
     },
     "dns-equal": {
@@ -6604,13 +6894,13 @@
       }
     },
     "dom-helpers": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz",
-      "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz",
+      "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.8.7",
-        "csstype": "^2.6.7"
+        "csstype": "^3.0.2"
       }
     },
     "dom-serialize": {
@@ -6644,9 +6934,9 @@
       }
     },
     "dom-walk": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
-      "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=",
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==",
       "dev": true
     },
     "domain-browser": {
@@ -6726,9 +7016,9 @@
       "dev": true
     },
     "dotenv-webpack": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz",
-      "integrity": "sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz",
+      "integrity": "sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg==",
       "dev": true,
       "requires": {
         "dotenv-defaults": "^1.0.2"
@@ -6775,9 +7065,9 @@
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.3.392",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.392.tgz",
-      "integrity": "sha512-/hsgeVdReDsyTBE0aU9FRdh1wnNPrX3xlz3t61F+CJPOT+Umfi9DXHsCX85TEgWZQqlow0Rw44/4/jbU2Sqgkg==",
+      "version": "1.3.523",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.523.tgz",
+      "integrity": "sha512-D4/3l5DpciddD92IDRtpLearQSGzly8FwBJv+nITvLH8YJrFabpDFe4yuiOJh2MS4/EsXqyQTXyw1toeYPtshQ==",
       "dev": true
     },
     "element-resize-detector": {
@@ -6790,9 +7080,9 @@
       }
     },
     "elliptic": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
-      "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
       "dev": true,
       "requires": {
         "bn.js": "^4.4.0",
@@ -6802,12 +7092,20 @@
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0",
         "minimalistic-crypto-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
       "dev": true
     },
     "emojis-list": {
@@ -6834,13 +7132,23 @@
       "dev": true
     },
     "encoding": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
-      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "iconv-lite": "~0.4.13"
+        "iconv-lite": "^0.6.2"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+          "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        }
       }
     },
     "end-of-stream": {
@@ -6853,17 +7161,17 @@
       }
     },
     "engine.io": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
-      "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==",
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz",
+      "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==",
       "dev": true,
       "requires": {
         "accepts": "~1.3.4",
-        "base64id": "1.0.0",
+        "base64id": "2.0.0",
         "cookie": "0.3.1",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.0",
-        "ws": "~3.3.1"
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
+        "ws": "^7.1.2"
       },
       "dependencies": {
         "cookie": {
@@ -6872,91 +7180,48 @@
           "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
           "dev": true
         },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
         "ws": {
-          "version": "3.3.3",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
-          "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
-          "dev": true,
-          "requires": {
-            "async-limiter": "~1.0.0",
-            "safe-buffer": "~5.1.0",
-            "ultron": "~1.1.0"
-          }
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+          "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+          "dev": true
         }
       }
     },
     "engine.io-client": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
-      "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz",
+      "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==",
       "dev": true,
       "requires": {
-        "component-emitter": "1.2.1",
+        "component-emitter": "~1.3.0",
         "component-inherit": "0.0.3",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.1",
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
         "has-cors": "1.1.0",
         "indexof": "0.0.1",
         "parseqs": "0.0.5",
         "parseuri": "0.0.5",
-        "ws": "~3.3.1",
+        "ws": "~6.1.0",
         "xmlhttprequest-ssl": "~1.5.4",
         "yeast": "0.1.2"
       },
       "dependencies": {
-        "component-emitter": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-          "dev": true
-        },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        },
         "ws": {
-          "version": "3.3.3",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
-          "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+          "version": "6.1.4",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
+          "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
           "dev": true,
           "requires": {
-            "async-limiter": "~1.0.0",
-            "safe-buffer": "~5.1.0",
-            "ultron": "~1.1.0"
+            "async-limiter": "~1.0.0"
           }
         }
       }
     },
     "engine.io-parser": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
-      "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
+      "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
       "dev": true,
       "requires": {
         "after": "0.8.2",
@@ -6984,9 +7249,9 @@
       "dev": true
     },
     "entities": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
-      "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
       "dev": true
     },
     "err-code": {
@@ -7014,22 +7279,22 @@
       }
     },
     "es-abstract": {
-      "version": "1.17.5",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
-      "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+      "version": "1.17.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
       "dev": true,
       "requires": {
         "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
         "has-symbols": "^1.0.1",
-        "is-callable": "^1.1.5",
-        "is-regex": "^1.0.5",
+        "is-callable": "^1.2.0",
+        "is-regex": "^1.1.0",
         "object-inspect": "^1.7.0",
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.0",
-        "string.prototype.trimleft": "^2.1.1",
-        "string.prototype.trimright": "^2.1.1"
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
       }
     },
     "es-array-method-boxes-properly": {
@@ -7099,6 +7364,12 @@
       "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==",
       "dev": true
     },
+    "escalade": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
+      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+      "dev": true
+    },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -7155,15 +7426,15 @@
       "dev": true
     },
     "eventemitter3": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
-      "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+      "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
       "dev": true
     },
     "events": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
-      "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
       "dev": true
     },
     "eventsource": {
@@ -7436,9 +7707,9 @@
       }
     },
     "extract-zip": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz",
-      "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
       "dev": true,
       "requires": {
         "@types/yauzl": "^2.9.1",
@@ -7465,23 +7736,23 @@
       "dev": true
     },
     "fast-deep-equal": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
-      "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
     },
     "fast-glob": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
-      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
       "dev": true,
       "requires": {
-        "@mrmlnc/readdir-enhanced": "^2.2.1",
-        "@nodelib/fs.stat": "^1.1.2",
-        "glob-parent": "^3.1.0",
-        "is-glob": "^4.0.0",
-        "merge2": "^1.2.3",
-        "micromatch": "^3.1.10"
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2",
+        "picomatch": "^2.2.1"
       }
     },
     "fast-json-stable-stringify": {
@@ -7497,9 +7768,9 @@
       "dev": true
     },
     "fastq": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
-      "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+      "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
       "dev": true,
       "requires": {
         "reusify": "^1.0.4"
@@ -7617,16 +7888,6 @@
       "dev": true,
       "optional": true
     },
-    "fileset": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
-      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.3",
-        "minimatch": "^3.0.3"
-      }
-    },
     "filesize": {
       "version": "3.6.1",
       "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
@@ -7705,23 +7966,14 @@
           }
         },
         "make-dir": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
-          "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
           "dev": true,
           "requires": {
             "semver": "^6.0.0"
           }
         },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -7731,12 +7983,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -7767,12 +8013,12 @@
       "dev": true
     },
     "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
       "dev": true,
       "requires": {
-        "locate-path": "^2.0.0"
+        "locate-path": "^3.0.0"
       }
     },
     "find-versions": {
@@ -7823,30 +8069,16 @@
       }
     },
     "focus-lock": {
-      "version": "0.6.6",
-      "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.6.6.tgz",
-      "integrity": "sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.7.0.tgz",
+      "integrity": "sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw==",
       "dev": true
     },
     "follow-redirects": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz",
-      "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
-      }
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz",
+      "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==",
+      "dev": true
     },
     "for-in": {
       "version": "1.0.2",
@@ -7876,11 +8108,114 @@
         "worker-rpc": "^0.1.0"
       },
       "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
         }
       }
     },
@@ -7977,9 +8312,9 @@
       "dev": true
     },
     "fsevents": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
-      "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
       "dev": true,
       "optional": true
     },
@@ -8050,6 +8385,12 @@
         }
       }
     },
+    "genfun": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
+      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
+      "dev": true
+    },
     "gensync": {
       "version": "1.0.0-beta.1",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
@@ -8057,15 +8398,15 @@
       "dev": true
     },
     "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true
     },
     "get-stdin": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
-      "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+      "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
       "dev": true
     },
     "get-stream": {
@@ -8143,24 +8484,12 @@
       }
     },
     "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
       "dev": true,
       "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
+        "is-glob": "^4.0.1"
       }
     },
     "glob-to-regexp": {
@@ -8215,25 +8544,17 @@
       }
     },
     "globby": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
-      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
       "dev": true,
       "requires": {
-        "array-union": "^1.0.1",
-        "dir-glob": "^2.0.0",
-        "glob": "^7.1.2",
-        "ignore": "^3.3.5",
-        "pify": "^3.0.0",
-        "slash": "^1.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
       }
     },
     "globjoin": {
@@ -8262,9 +8583,9 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
       "dev": true
     },
     "gud": {
@@ -8301,12 +8622,12 @@
       "dev": true
     },
     "har-validator": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
       "dev": true,
       "requires": {
-        "ajv": "^6.5.5",
+        "ajv": "^6.12.3",
         "har-schema": "^2.0.0"
       }
     },
@@ -8428,13 +8749,33 @@
       }
     },
     "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
       }
     },
     "hash.js": {
@@ -8510,12 +8851,23 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz",
-      "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
+      "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
       "dev": true,
       "requires": {
-        "lru-cache": "^5.1.1"
+        "lru-cache": "^6.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        }
       }
     },
     "hpack.js": {
@@ -8549,9 +8901,9 @@
       "dev": true
     },
     "html-entities": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
-      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+      "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
       "dev": true
     },
     "html-escaper": {
@@ -8561,9 +8913,9 @@
       "dev": true
     },
     "html-minifier-terser": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz",
-      "integrity": "sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
       "dev": true,
       "requires": {
         "camel-case": "^4.1.1",
@@ -8590,9 +8942,9 @@
       "dev": true
     },
     "html-webpack-plugin": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.4.tgz",
-      "integrity": "sha512-BREQzUbFfIQS39KqxkT2L1Ot0tuu1isako1CaCQLrgEQ43zi2ScHAe3SMTnVBWsStnIsGtl8jprDdxwZkNhrwQ==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz",
+      "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==",
       "dev": true,
       "requires": {
         "@types/html-minifier-terser": "^5.0.0",
@@ -8672,9 +9024,9 @@
       }
     },
     "http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
       "dev": true
     },
     "http-deceiver": {
@@ -8704,16 +9056,10 @@
         }
       }
     },
-    "http-parser-js": {
-      "version": "0.4.10",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
-      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
-      "dev": true
-    },
     "http-proxy": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
-      "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
       "requires": {
         "eventemitter3": "^4.0.0",
@@ -8722,14 +9068,30 @@
       }
     },
     "http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
+      "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
       "dev": true,
       "requires": {
-        "@tootallnate/once": "1",
-        "agent-base": "6",
-        "debug": "4"
+        "agent-base": "4",
+        "debug": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
       }
     },
     "http-proxy-middleware": {
@@ -8742,6 +9104,111 @@
         "is-glob": "^4.0.0",
         "lodash": "^4.17.11",
         "micromatch": "^3.1.10"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
       }
     },
     "http-signature": {
@@ -8762,13 +9229,24 @@
       "dev": true
     },
     "https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+      "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
       "dev": true,
       "requires": {
-        "agent-base": "6",
-        "debug": "4"
+        "agent-base": "^4.3.0",
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
       }
     },
     "humanize-ms": {
@@ -8781,14 +9259,14 @@
       }
     },
     "husky": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz",
-      "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==",
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
+      "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
       "dev": true,
       "requires": {
-        "chalk": "^3.0.0",
+        "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
-        "compare-versions": "^3.5.1",
+        "compare-versions": "^3.6.0",
         "cosmiconfig": "^6.0.0",
         "find-versions": "^3.2.0",
         "opencollective-postinstall": "^2.0.2",
@@ -8809,9 +9287,9 @@
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
@@ -8881,15 +9359,6 @@
             "p-locate": "^4.1.0"
           }
         },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -8899,16 +9368,10 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "parse-json": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
-          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -8923,12 +9386,6 @@
           "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        },
         "pkg-dir": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -8944,12 +9401,6 @@
           "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
           "dev": true
         },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
         "supports-color": {
           "version": "7.1.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
@@ -8997,9 +9448,9 @@
       "dev": true
     },
     "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+      "version": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
       "dev": true
     },
     "ignore-walk": {
@@ -9186,6 +9637,12 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -9251,9 +9708,9 @@
       }
     },
     "interpret": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.0.0.tgz",
-      "integrity": "sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
       "dev": true
     },
     "invariant": {
@@ -9265,12 +9722,6 @@
         "loose-envify": "^1.0.0"
       }
     },
-    "invert-kv": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-      "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-      "dev": true
-    },
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -9365,9 +9816,9 @@
       "dev": true
     },
     "is-callable": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
-      "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
       "dev": true
     },
     "is-color-stop": {
@@ -9442,9 +9893,9 @@
       "dev": true
     },
     "is-docker": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
-      "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
       "dev": true
     },
     "is-dom": {
@@ -9476,9 +9927,9 @@
       "dev": true
     },
     "is-function": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
-      "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+      "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
       "dev": true
     },
     "is-glob": {
@@ -9502,12 +9953,6 @@
       "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
       "dev": true
     },
-    "is-lambda": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
-      "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
-      "dev": true
-    },
     "is-map": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
@@ -9571,19 +10016,13 @@
         "isobject": "^3.0.1"
       }
     },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
-      "dev": true
-    },
     "is-regex": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
-      "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
       "dev": true,
       "requires": {
-        "has": "^1.0.3"
+        "has-symbols": "^1.0.1"
       }
     },
     "is-regexp": {
@@ -9671,10 +10110,13 @@
       "dev": true
     },
     "is-wsl": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
-      "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==",
-      "dev": true
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
     },
     "isarray": {
       "version": "1.0.0",
@@ -9683,13 +10125,10 @@
       "dev": true
     },
     "isbinaryfile": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
-      "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
-      "dev": true,
-      "requires": {
-        "buffer-alloc": "^1.2.0"
-      }
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+      "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+      "dev": true
     },
     "isexe": {
       "version": "2.0.0",
@@ -9709,81 +10148,19 @@
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
     },
-    "istanbul-api": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz",
-      "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.2",
-        "compare-versions": "^3.4.0",
-        "fileset": "^2.0.3",
-        "istanbul-lib-coverage": "^2.0.5",
-        "istanbul-lib-hook": "^2.0.7",
-        "istanbul-lib-instrument": "^3.3.0",
-        "istanbul-lib-report": "^2.0.8",
-        "istanbul-lib-source-maps": "^3.0.6",
-        "istanbul-reports": "^2.2.4",
-        "js-yaml": "^3.13.1",
-        "make-dir": "^2.1.0",
-        "minimatch": "^3.0.4",
-        "once": "^1.4.0"
-      },
-      "dependencies": {
-        "istanbul-lib-coverage": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
-          "dev": true
-        },
-        "istanbul-lib-instrument": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
-          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
-          "dev": true,
-          "requires": {
-            "@babel/generator": "^7.4.0",
-            "@babel/parser": "^7.4.3",
-            "@babel/template": "^7.4.0",
-            "@babel/traverse": "^7.4.3",
-            "@babel/types": "^7.4.0",
-            "istanbul-lib-coverage": "^2.0.5",
-            "semver": "^6.0.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
     "istanbul-lib-coverage": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
       "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
       "dev": true
     },
-    "istanbul-lib-hook": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz",
-      "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==",
-      "dev": true,
-      "requires": {
-        "append-transform": "^1.0.0"
-      }
-    },
     "istanbul-lib-instrument": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz",
-      "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
       "dev": true,
       "requires": {
         "@babel/core": "^7.7.5",
-        "@babel/parser": "^7.7.5",
-        "@babel/template": "^7.7.4",
-        "@babel/traverse": "^7.7.4",
         "@istanbuljs/schema": "^0.1.2",
         "istanbul-lib-coverage": "^3.0.0",
         "semver": "^6.3.0"
@@ -9798,29 +10175,44 @@
       }
     },
     "istanbul-lib-report": {
-      "version": "2.0.8",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
-      "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
       "dev": true,
       "requires": {
-        "istanbul-lib-coverage": "^2.0.5",
-        "make-dir": "^2.1.0",
-        "supports-color": "^6.1.0"
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
       },
       "dependencies": {
-        "istanbul-lib-coverage": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
         "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "has-flag": "^4.0.0"
           }
         }
       }
@@ -9862,12 +10254,13 @@
       }
     },
     "istanbul-reports": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
-      "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
       "dev": true,
       "requires": {
-        "html-escaper": "^2.0.0"
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
       }
     },
     "iterate-iterator": {
@@ -9918,6 +10311,14 @@
       "dev": true,
       "requires": {
         "colors": "1.1.2"
+      },
+      "dependencies": {
+        "colors": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+          "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+          "dev": true
+        }
       }
     },
     "jasminewd2": {
@@ -9960,9 +10361,9 @@
       "dev": true
     },
     "js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
       "dev": true,
       "requires": {
         "argparse": "^1.0.7",
@@ -9987,12 +10388,6 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
-    "json-parse-even-better-errors": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz",
-      "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==",
-      "dev": true
-    },
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -10018,9 +10413,9 @@
       "dev": true
     },
     "json5": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
-      "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5"
@@ -10054,9 +10449,9 @@
       }
     },
     "jszip": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz",
-      "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz",
+      "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==",
       "dev": true,
       "requires": {
         "lie": "~3.3.0",
@@ -10066,59 +10461,205 @@
       }
     },
     "karma": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz",
-      "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-5.1.1.tgz",
+      "integrity": "sha512-xAlOr5PMqUbiKXSv5PCniHWV3aiwj6wIZ0gUVcwpTCPVQm/qH2WAMFWxtnpM6KJqhkRWrIpovR4Rb0rn8GtJzQ==",
       "dev": true,
       "requires": {
-        "bluebird": "^3.3.0",
-        "body-parser": "^1.16.1",
+        "body-parser": "^1.19.0",
         "braces": "^3.0.2",
         "chokidar": "^3.0.0",
-        "colors": "^1.1.0",
-        "connect": "^3.6.0",
+        "colors": "^1.4.0",
+        "connect": "^3.7.0",
         "di": "^0.0.1",
-        "dom-serialize": "^2.2.0",
-        "flatted": "^2.0.0",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.1.2",
-        "http-proxy": "^1.13.0",
-        "isbinaryfile": "^3.0.0",
-        "lodash": "^4.17.14",
-        "log4js": "^4.0.0",
-        "mime": "^2.3.1",
-        "minimatch": "^3.0.2",
-        "optimist": "^0.6.1",
-        "qjobs": "^1.1.4",
-        "range-parser": "^1.2.0",
-        "rimraf": "^2.6.0",
-        "safe-buffer": "^5.0.1",
-        "socket.io": "2.1.1",
+        "dom-serialize": "^2.2.1",
+        "flatted": "^2.0.2",
+        "glob": "^7.1.6",
+        "graceful-fs": "^4.2.4",
+        "http-proxy": "^1.18.1",
+        "isbinaryfile": "^4.0.6",
+        "lodash": "^4.17.15",
+        "log4js": "^6.2.1",
+        "mime": "^2.4.5",
+        "minimatch": "^3.0.4",
+        "qjobs": "^1.2.0",
+        "range-parser": "^1.2.1",
+        "rimraf": "^3.0.2",
+        "socket.io": "^2.3.0",
         "source-map": "^0.6.1",
-        "tmp": "0.0.33",
-        "useragent": "2.3.0"
+        "tmp": "0.2.1",
+        "ua-parser-js": "0.7.21",
+        "yargs": "^15.3.1"
       },
       "dependencies": {
-        "mime": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
-          "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
           "dev": true,
           "requires": {
-            "glob": "^7.1.3"
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
           }
         },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "mime": {
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+          "dev": true
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "tmp": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+          "dev": true,
+          "requires": {
+            "rimraf": "^3.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -10132,28 +10673,31 @@
       }
     },
     "karma-coverage-istanbul-reporter": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz",
-      "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz",
+      "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==",
       "dev": true,
       "requires": {
-        "istanbul-api": "^2.1.6",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^3.0.6",
+        "istanbul-reports": "^3.0.2",
         "minimatch": "^3.0.4"
       }
     },
     "karma-jasmine": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.0.3.tgz",
-      "integrity": "sha512-80iBR8/hLFY2Uw3S2GG6EndWtMCGMJjrCYNwYROWsJFVTjWrRSsLqcA2ye+U3ygW5sjOQo8f+78L8cGUxjC/+A==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.3.1.tgz",
+      "integrity": "sha512-Nxh7eX9mOQMyK0VSsMxdod+bcqrR/ikrmEiWj5M6fwuQ7oI+YEF1FckaDsWfs6TIpULm9f0fTKMjF7XcrvWyqQ==",
       "dev": true,
       "requires": {
         "jasmine-core": "^3.5.0"
       }
     },
     "karma-jasmine-html-reporter": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz",
-      "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==",
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz",
+      "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==",
       "dev": true
     },
     "karma-source-map-support": {
@@ -10187,9 +10731,9 @@
       }
     },
     "known-css-properties": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz",
-      "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==",
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz",
+      "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==",
       "dev": true
     },
     "lazy-universal-dotenv": {
@@ -10213,32 +10757,23 @@
         }
       }
     },
-    "lcid": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^2.0.0"
-      }
-    },
     "leaflet": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.6.0.tgz",
       "integrity": "sha512-CPkhyqWUKZKFJ6K8umN5/D2wrJ2+/8UIpXppY7QDnUZW5bZL5+SEI2J7GBpwh4LIupOKqbNSQXgqmrEJopHVNQ=="
     },
     "less": {
-      "version": "3.11.1",
-      "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz",
-      "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==",
+      "version": "3.11.3",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz",
+      "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==",
       "dev": true,
       "requires": {
         "clone": "^2.1.2",
         "errno": "^0.1.1",
         "graceful-fs": "^4.1.2",
         "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
         "mime": "^1.4.1",
-        "mkdirp": "^0.5.0",
         "promise": "^7.1.1",
         "request": "^2.83.0",
         "source-map": "~0.6.0",
@@ -10338,9 +10873,9 @@
       }
     },
     "license-webpack-plugin": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz",
-      "integrity": "sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz",
+      "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==",
       "dev": true,
       "requires": {
         "@types/webpack-sources": "^0.1.5",
@@ -10380,19 +10915,19 @@
       }
     },
     "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
       "dev": true,
       "requires": {
-        "p-locate": "^2.0.0",
+        "p-locate": "^3.0.0",
         "path-exists": "^3.0.0"
       }
     },
     "lodash": {
-      "version": "4.17.15",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+      "version": "4.17.19",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+      "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
       "dev": true
     },
     "lodash.clonedeep": {
@@ -10435,22 +10970,22 @@
       }
     },
     "log4js": {
-      "version": "4.5.1",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz",
-      "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz",
+      "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==",
       "dev": true,
       "requires": {
-        "date-format": "^2.0.0",
+        "date-format": "^3.0.0",
         "debug": "^4.1.1",
-        "flatted": "^2.0.0",
+        "flatted": "^2.0.1",
         "rfdc": "^1.1.4",
-        "streamroller": "^1.0.6"
+        "streamroller": "^2.2.4"
       }
     },
     "loglevel": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz",
-      "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==",
+      "version": "1.6.8",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
+      "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
       "dev": true
     },
     "longest-streak": {
@@ -10538,26 +11073,65 @@
       "dev": true
     },
     "make-fetch-happen": {
-      "version": "8.0.4",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz",
-      "integrity": "sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz",
+      "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==",
       "dev": true,
       "requires": {
-        "agentkeepalive": "^4.1.0",
-        "cacache": "^15.0.0",
-        "http-cache-semantics": "^4.0.4",
-        "http-proxy-agent": "^4.0.1",
-        "https-proxy-agent": "^5.0.0",
-        "is-lambda": "^1.0.1",
+        "agentkeepalive": "^3.4.1",
+        "cacache": "^12.0.0",
+        "http-cache-semantics": "^3.8.1",
+        "http-proxy-agent": "^2.1.0",
+        "https-proxy-agent": "^2.2.3",
         "lru-cache": "^5.1.1",
-        "minipass": "^3.0.0",
-        "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^1.1.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.2",
+        "mississippi": "^3.0.0",
+        "node-fetch-npm": "^2.0.2",
         "promise-retry": "^1.1.1",
-        "socks-proxy-agent": "^5.0.0",
-        "ssri": "^8.0.0"
+        "socks-proxy-agent": "^4.0.0",
+        "ssri": "^6.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        }
       }
     },
     "mamacro": {
@@ -10566,15 +11140,6 @@
       "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
       "dev": true
     },
-    "map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "requires": {
-        "p-defer": "^1.0.0"
-      }
-    },
     "map-cache": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
@@ -10609,15 +11174,18 @@
       "dev": true
     },
     "markdown-table": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
-      "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
-      "dev": true
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+      "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+      "dev": true,
+      "requires": {
+        "repeat-string": "^1.0.0"
+      }
     },
     "markdown-to-jsx": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz",
-      "integrity": "sha512-RH7LCJQ4RFmPqVeZEesKaO1biRzB/k4utoofmTCp3Eiw6D7qfvK8fzZq/2bjEJAtVkfPrM5SMt5APGf2rnaKMg==",
+      "version": "6.11.4",
+      "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz",
+      "integrity": "sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw==",
       "dev": true,
       "requires": {
         "prop-types": "^15.6.2",
@@ -10658,12 +11226,12 @@
       }
     },
     "mdast-util-compact": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
-      "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
+      "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
       "dev": true,
       "requires": {
-        "unist-util-visit": "^1.1.0"
+        "unist-util-visit": "^2.0.0"
       }
     },
     "mdn-data": {
@@ -10678,17 +11246,6 @@
       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true
     },
-    "mem": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-      "dev": true,
-      "requires": {
-        "map-age-cleaner": "^0.1.1",
-        "mimic-fn": "^2.0.0",
-        "p-is-promise": "^2.0.0"
-      }
-    },
     "memoize-one": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz",
@@ -10715,38 +11272,60 @@
       }
     },
     "meow": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
-      "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz",
+      "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==",
       "dev": true,
       "requires": {
         "@types/minimist": "^1.2.0",
-        "camelcase-keys": "^6.1.1",
+        "arrify": "^2.0.1",
+        "camelcase": "^6.0.0",
+        "camelcase-keys": "^6.2.2",
         "decamelize-keys": "^1.1.0",
-        "hard-rejection": "^2.0.0",
-        "minimist-options": "^4.0.1",
+        "hard-rejection": "^2.1.0",
+        "minimist-options": "^4.0.2",
         "normalize-package-data": "^2.5.0",
-        "read-pkg-up": "^7.0.0",
+        "read-pkg-up": "^7.0.1",
         "redent": "^3.0.0",
         "trim-newlines": "^3.0.0",
-        "type-fest": "^0.8.1",
-        "yargs-parser": "^18.1.1"
+        "type-fest": "^0.13.1",
+        "yargs-parser": "^18.1.3"
       },
       "dependencies": {
+        "arrify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+          "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
+          "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
+          "dev": true
+        },
         "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "version": "0.13.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+          "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
           "dev": true
         },
         "yargs-parser": {
-          "version": "18.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
-          "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
           "dev": true,
           "requires": {
             "camelcase": "^5.0.0",
             "decamelize": "^1.2.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "5.3.1",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+              "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+              "dev": true
+            }
           }
         }
       }
@@ -10781,9 +11360,9 @@
       "dev": true
     },
     "merge2": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
-      "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true
     },
     "methods": {
@@ -10792,11 +11371,6 @@
       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
       "dev": true
     },
-    "mgrs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz",
-      "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk="
-    },
     "microevent.ts": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
@@ -10804,108 +11378,13 @@
       "dev": true
     },
     "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
       "dev": true,
       "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        }
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
       }
     },
     "miller-rabin": {
@@ -10916,6 +11395,14 @@
       "requires": {
         "bn.js": "^4.0.0",
         "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "mime": {
@@ -10925,18 +11412,18 @@
       "dev": true
     },
     "mime-db": {
-      "version": "1.43.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
-      "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.26",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
-      "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
       "dev": true,
       "requires": {
-        "mime-db": "1.43.0"
+        "mime-db": "1.44.0"
       }
     },
     "mimic-fn": {
@@ -10971,9 +11458,9 @@
       }
     },
     "min-indent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
-      "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
       "dev": true
     },
     "mini-css-extract-plugin": {
@@ -11061,19 +11548,20 @@
       "dev": true
     },
     "minimist-options": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
-      "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
       "dev": true,
       "requires": {
         "arrify": "^1.0.1",
-        "is-plain-obj": "^1.1.0"
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
       }
     },
     "minipass": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz",
-      "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
       "dev": true,
       "requires": {
         "yallist": "^4.0.0"
@@ -11088,19 +11576,6 @@
         "minipass": "^3.0.0"
       }
     },
-    "minipass-fetch": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz",
-      "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==",
-      "dev": true,
-      "requires": {
-        "encoding": "^0.1.12",
-        "minipass": "^3.1.0",
-        "minipass-pipeline": "^1.2.2",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.0.0"
-      }
-    },
     "minipass-flush": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
@@ -11110,29 +11585,10 @@
         "minipass": "^3.0.0"
       }
     },
-    "minipass-json-stream": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
-      "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
-      "dev": true,
-      "requires": {
-        "jsonparse": "^1.3.1",
-        "minipass": "^3.0.0"
-      }
-    },
     "minipass-pipeline": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz",
-      "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-sized": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
       "dev": true,
       "requires": {
         "minipass": "^3.0.0"
@@ -11188,9 +11644,9 @@
       }
     },
     "mkdirp": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
-      "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5"
@@ -11221,9 +11677,9 @@
       }
     },
     "moment": {
-      "version": "2.24.0",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
-      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+      "version": "2.27.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+      "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
     },
     "move-concurrently": {
       "version": "1.0.1",
@@ -11279,9 +11735,9 @@
       "dev": true
     },
     "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
-      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+      "version": "2.14.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
+      "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
       "dev": true,
       "optional": true
     },
@@ -11311,9 +11767,9 @@
       "dev": true
     },
     "neo-async": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
-      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
       "dev": true
     },
     "nice-try": {
@@ -11338,6 +11794,17 @@
       "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
       "dev": true
     },
+    "node-fetch-npm": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz",
+      "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==",
+      "dev": true,
+      "requires": {
+        "encoding": "^0.1.11",
+        "json-parse-better-errors": "^1.0.0",
+        "safe-buffer": "^5.1.1"
+      }
+    },
     "node-forge": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
@@ -11384,9 +11851,9 @@
       }
     },
     "node-releases": {
-      "version": "1.1.53",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
-      "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
+      "version": "1.1.60",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
+      "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
       "dev": true
     },
     "nopt": {
@@ -11485,14 +11952,13 @@
       }
     },
     "npm-packlist": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz",
-      "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==",
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
+      "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
       "dev": true,
       "requires": {
-        "glob": "^7.1.6",
-        "ignore-walk": "^3.0.3",
-        "npm-bundled": "^1.1.1",
+        "ignore-walk": "^3.0.1",
+        "npm-bundled": "^1.0.1",
         "npm-normalize-package-bin": "^1.0.1"
       }
     },
@@ -11508,19 +11974,50 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz",
-      "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz",
+      "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==",
       "dev": true,
       "requires": {
-        "@npmcli/ci-detect": "^1.0.0",
+        "JSONStream": "^1.3.4",
+        "bluebird": "^3.5.1",
+        "figgy-pudding": "^3.4.1",
         "lru-cache": "^5.1.1",
-        "make-fetch-happen": "^8.0.2",
-        "minipass": "^3.0.0",
-        "minipass-fetch": "^1.1.2",
-        "minipass-json-stream": "^1.0.1",
-        "minizlib": "^2.0.0",
-        "npm-package-arg": "^8.0.0"
+        "make-fetch-happen": "^5.0.0",
+        "npm-package-arg": "^6.1.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "npm-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
       }
     },
     "npm-run-path": {
@@ -11615,16 +12112,20 @@
       }
     },
     "object-inspect": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
-      "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
       "dev": true
     },
     "object-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
-      "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==",
-      "dev": true
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+      "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
     },
     "object-keys": {
       "version": "1.1.1",
@@ -11659,14 +12160,13 @@
       }
     },
     "object.entries": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
-      "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
+      "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1",
-        "function-bind": "^1.1.1",
+        "es-abstract": "^1.17.5",
         "has": "^1.0.3"
       }
     },
@@ -11744,9 +12244,9 @@
       }
     },
     "onetime": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
-      "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.1.tgz",
+      "integrity": "sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg==",
       "dev": true,
       "requires": {
         "mimic-fn": "^2.1.0"
@@ -11763,9 +12263,9 @@
       }
     },
     "opencollective-postinstall": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz",
-      "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
       "dev": true
     },
     "opener": {
@@ -11791,24 +12291,6 @@
         }
       }
     },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "dev": true,
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.10",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
-          "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
-          "dev": true
-        }
-      }
-    },
     "ora": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz",
@@ -11913,17 +12395,6 @@
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
       "dev": true
     },
-    "os-locale": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-      "dev": true,
-      "requires": {
-        "execa": "^1.0.0",
-        "lcid": "^2.0.0",
-        "mem": "^4.0.0"
-      }
-    },
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -11940,40 +12411,28 @@
         "os-tmpdir": "^1.0.0"
       }
     },
-    "p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
-      "dev": true
-    },
     "p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
       "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
       "dev": true
     },
-    "p-is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
-      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
-      "dev": true
-    },
     "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
       "requires": {
-        "p-try": "^1.0.0"
+        "p-try": "^2.0.0"
       }
     },
     "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
       "dev": true,
       "requires": {
-        "p-limit": "^1.1.0"
+        "p-limit": "^2.0.0"
       }
     },
     "p-map": {
@@ -11995,48 +12454,129 @@
       }
     },
     "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true
     },
     "pacote": {
-      "version": "11.1.4",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz",
-      "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==",
+      "version": "9.5.12",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz",
+      "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==",
       "dev": true,
       "requires": {
-        "@npmcli/git": "^2.0.1",
-        "@npmcli/installed-package-contents": "^1.0.5",
-        "@npmcli/promise-spawn": "^1.1.0",
-        "cacache": "^15.0.0",
-        "chownr": "^1.1.4",
-        "fs-minipass": "^2.1.0",
+        "bluebird": "^3.5.3",
+        "cacache": "^12.0.2",
+        "chownr": "^1.1.2",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.1.0",
+        "glob": "^7.1.3",
         "infer-owner": "^1.0.4",
         "lru-cache": "^5.1.1",
-        "minipass": "^3.0.1",
-        "minipass-fetch": "^1.2.1",
-        "mkdirp": "^1.0.3",
-        "npm-package-arg": "^8.0.1",
-        "npm-packlist": "^2.1.0",
-        "npm-pick-manifest": "^6.0.0",
-        "npm-registry-fetch": "^8.0.0",
+        "make-fetch-happen": "^5.0.0",
+        "minimatch": "^3.0.4",
+        "minipass": "^2.3.5",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "normalize-package-data": "^2.4.0",
+        "npm-normalize-package-bin": "^1.0.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.1.12",
+        "npm-pick-manifest": "^3.0.0",
+        "npm-registry-fetch": "^4.0.0",
+        "osenv": "^0.1.5",
         "promise-inflight": "^1.0.1",
         "promise-retry": "^1.1.1",
-        "read-package-json-fast": "^1.1.3",
-        "rimraf": "^2.7.1",
-        "semver": "^7.1.3",
-        "ssri": "^8.0.0",
-        "tar": "^6.0.1",
-        "which": "^2.0.2"
+        "protoduck": "^5.0.1",
+        "rimraf": "^2.6.2",
+        "safe-buffer": "^5.1.2",
+        "semver": "^5.6.0",
+        "ssri": "^6.0.1",
+        "tar": "^4.4.10",
+        "unique-filename": "^1.1.1",
+        "which": "^1.3.1"
       },
       "dependencies": {
-        "mkdirp": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz",
-          "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==",
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "fs-minipass": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "dev": true,
+          "requires": {
+            "minipass": "^2.6.0"
+          }
+        },
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
           "dev": true
         },
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+          "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+          "dev": true,
+          "requires": {
+            "minipass": "^2.9.0"
+          }
+        },
+        "npm-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "npm-pick-manifest": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz",
+          "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1",
+            "npm-package-arg": "^6.0.0",
+            "semver": "^5.4.1"
+          }
+        },
         "rimraf": {
           "version": "2.7.1",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
@@ -12046,14 +12586,41 @@
             "glob": "^7.1.3"
           }
         },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
           "dev": true,
           "requires": {
-            "isexe": "^2.0.0"
+            "figgy-pudding": "^3.5.1"
           }
+        },
+        "tar": {
+          "version": "4.4.13",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+          "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.8.6",
+            "minizlib": "^1.2.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.3"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -12140,10 +12707,10 @@
       }
     },
     "parse5": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
-      "dev": true
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "optional": true
     },
     "parseqs": {
       "version": "0.0.5",
@@ -12239,26 +12806,15 @@
       "dev": true
     },
     "path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
-      }
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
     },
     "pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
       "dev": true,
       "requires": {
         "create-hash": "^1.1.2",
@@ -12314,51 +12870,6 @@
       "dev": true,
       "requires": {
         "find-up": "^3.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        }
       }
     },
     "pkg-up": {
@@ -12368,6 +12879,51 @@
       "dev": true,
       "requires": {
         "find-up": "^2.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        }
       }
     },
     "please-upgrade-node": {
@@ -12389,12 +12945,12 @@
       }
     },
     "polished": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/polished/-/polished-3.5.1.tgz",
-      "integrity": "sha512-GVbvskpBiDV5TknurGL6OyFfLHsCknxbU8w5iMppT8rW0tLEoQHrIRfrPNPqGXNj3HGhkjRvhmg59Fy7HSnCAw==",
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/polished/-/polished-3.6.5.tgz",
+      "integrity": "sha512-VwhC9MlhW7O5dg/z7k32dabcAFW1VI2+7fSe8cE/kXcfL7mVdoa5UxciYGW2sJU78ldDLT6+ROEKIZKFNTnUXQ==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.8.7"
+        "@babel/runtime": "^7.9.2"
       }
     },
     "popper.js": {
@@ -12404,14 +12960,14 @@
       "dev": true
     },
     "portfinder": {
-      "version": "1.0.25",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
-      "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
       "dev": true,
       "requires": {
         "async": "^2.6.2",
         "debug": "^3.1.1",
-        "mkdirp": "^0.5.1"
+        "mkdirp": "^0.5.5"
       },
       "dependencies": {
         "debug": {
@@ -12546,9 +13102,9 @@
       }
     },
     "postcss-flexbugs-fixes": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz",
-      "integrity": "sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz",
+      "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==",
       "dev": true,
       "requires": {
         "postcss": "^7.0.26"
@@ -12583,15 +13139,6 @@
         }
       }
     },
-    "postcss-jsx": {
-      "version": "0.36.4",
-      "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.4.tgz",
-      "integrity": "sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA==",
-      "dev": true,
-      "requires": {
-        "@babel/core": ">=7.2.2"
-      }
-    },
     "postcss-less": {
       "version": "3.1.4",
       "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
@@ -12656,16 +13203,6 @@
         }
       }
     },
-    "postcss-markdown": {
-      "version": "0.36.0",
-      "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz",
-      "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==",
-      "dev": true,
-      "requires": {
-        "remark": "^10.0.1",
-        "unist-util-find-all-after": "^1.0.2"
-      }
-    },
     "postcss-media-query-parser": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
@@ -12814,15 +13351,43 @@
       }
     },
     "postcss-modules-local-by-default": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz",
-      "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
       "dev": true,
       "requires": {
         "icss-utils": "^4.1.1",
-        "postcss": "^7.0.16",
+        "postcss": "^7.0.32",
         "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.0.0"
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-modules-scope": {
@@ -13108,12 +13673,12 @@
       }
     },
     "postcss-scss": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
-      "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+      "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
       "dev": true,
       "requires": {
-        "postcss": "^7.0.0"
+        "postcss": "^7.0.6"
       }
     },
     "postcss-selector-parser": {
@@ -13175,9 +13740,9 @@
       }
     },
     "postcss-value-parser": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
-      "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
       "dev": true
     },
     "prepend-http": {
@@ -13203,25 +13768,19 @@
       "dev": true
     },
     "primeng": {
-      "version": "9.0.6",
-      "resolved": "https://registry.npmjs.org/primeng/-/primeng-9.0.6.tgz",
-      "integrity": "sha512-RGVTkXwHTb7609zTU/uJFYdbJV124kOwrMiwnHjFn6UkwmS3yTX0Kkr21v8KOTJqsKLq3OWVYhkOwvUklipAAg=="
+      "version": "9.1.3",
+      "resolved": "https://registry.npmjs.org/primeng/-/primeng-9.1.3.tgz",
+      "integrity": "sha512-5+XGWrLNYToMIXR/r+sMcGAgz/rSYjo6Ms8rygV5uuLmHNB+mXpaRxMCajKSnmVFLZPeyATtVRm9RcA4Y/VizQ=="
     },
     "prismjs": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz",
-      "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==",
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz",
+      "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==",
       "dev": true,
       "requires": {
         "clipboard": "^2.0.0"
       }
     },
-    "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.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -13240,15 +13799,6 @@
       "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "dev": true
     },
-    "proj4": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.1.tgz",
-      "integrity": "sha512-RP5EcrfrLcARy+Zjjz1wIeqZzZdPtQNl685asHcwdU/MQ/dvydmf1XWM4mgok6wPaNsXZ8IFrM4qadO3g46PiQ==",
-      "requires": {
-        "mgrs": "1.0.0",
-        "wkt-parser": "^1.2.4"
-      }
-    },
     "promise": {
       "version": "7.3.1",
       "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
@@ -13319,18 +13869,27 @@
       }
     },
     "property-information": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz",
-      "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==",
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz",
+      "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==",
       "dev": true,
       "requires": {
         "xtend": "^4.0.0"
       }
     },
+    "protoduck": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
+      "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==",
+      "dev": true,
+      "requires": {
+        "genfun": "^5.0.0"
+      }
+    },
     "protractor": {
-      "version": "5.4.3",
-      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz",
-      "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz",
+      "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==",
       "dev": true,
       "requires": {
         "@types/q": "^0.0.32",
@@ -13341,13 +13900,13 @@
         "glob": "^7.0.3",
         "jasmine": "2.8.0",
         "jasminewd2": "^2.1.0",
-        "optimist": "~0.6.0",
         "q": "1.4.1",
         "saucelabs": "^1.5.0",
         "selenium-webdriver": "3.6.0",
         "source-map-support": "~0.4.0",
         "webdriver-js-extender": "2.1.0",
-        "webdriver-manager": "^12.0.6"
+        "webdriver-manager": "^12.1.7",
+        "yargs": "^15.3.1"
       },
       "dependencies": {
         "@types/q": {
@@ -13356,12 +13915,27 @@
           "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
           "dev": true
         },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
         "ansi-styles": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
           "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
           "dev": true
         },
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
         "chalk": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
@@ -13375,6 +13949,43 @@
             "supports-color": "^2.0.0"
           }
         },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
         "del": {
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
@@ -13390,6 +14001,22 @@
             "rimraf": "^2.2.8"
           }
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
         "globby": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
@@ -13404,6 +14031,12 @@
             "pinkie-promise": "^2.0.0"
           }
         },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
         "is-path-cwd": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
@@ -13428,6 +14061,30 @@
             "path-is-inside": "^1.0.1"
           }
         },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
         "pify": {
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
@@ -13470,6 +14127,28 @@
             "source-map": "^0.5.6"
           }
         },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
         "supports-color": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -13494,6 +14173,67 @@
             "semver": "^5.3.0",
             "xml2js": "^0.4.17"
           }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+              "dev": true,
+              "requires": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+              }
+            },
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -13519,12 +14259,6 @@
       "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
       "dev": true
     },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
     "psl": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
@@ -13543,6 +14277,14 @@
         "parse-asn1": "^5.0.0",
         "randombytes": "^2.0.1",
         "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "pump": {
@@ -13585,9 +14327,9 @@
       "dev": true
     },
     "puppeteer": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.1.0.tgz",
-      "integrity": "sha512-jLa9sqdVx0tPnr2FcwAq+8DSjGhSM4YpkwOf3JE22Ycyqm71SW7B5uGfTyMGFoLCmbCozbLZclCjasPb0flTRw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.3.0.tgz",
+      "integrity": "sha512-23zNqRltZ1PPoK28uRefWJ/zKb5Jhnzbbwbpcna2o5+QMn17F0khq5s1bdH3vPlyj+J36pubccR8wiNA/VE0Vw==",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
@@ -13625,9 +14367,9 @@
           "dev": true
         },
         "ws": {
-          "version": "7.3.0",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
-          "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==",
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+          "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
           "dev": true
         }
       }
@@ -13788,9 +14530,9 @@
       }
     },
     "react-color": {
-      "version": "2.18.0",
-      "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.18.0.tgz",
-      "integrity": "sha512-FyVeU1kQiSokWc8NPz22azl1ezLpJdUyTbWL0LPUpcuuYDrZ/Y1veOk9rRK5B3pMlyDGvTk4f4KJhlkIQNRjEA==",
+      "version": "2.18.1",
+      "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.18.1.tgz",
+      "integrity": "sha512-X5XpyJS6ncplZs74ak0JJoqPi+33Nzpv5RYWWxn17bslih+X7OlgmfpmGC1fNvdkK7/SGWYf1JJdn7D2n5gSuQ==",
       "dev": true,
       "requires": {
         "@icons/material": "^0.2.4",
@@ -13843,6 +14585,12 @@
             "@babel/highlight": "^7.0.0"
           }
         },
+        "@nodelib/fs.stat": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+          "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+          "dev": true
+        },
         "ansi-escapes": {
           "version": "3.2.0",
           "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
@@ -13850,9 +14598,9 @@
           "dev": true
         },
         "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
           "dev": true
         },
         "anymatch": {
@@ -13876,6 +14624,15 @@
             }
           }
         },
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
         "binary-extensions": {
           "version": "1.13.1",
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
@@ -13898,6 +14655,17 @@
             "snapdragon-node": "^2.0.1",
             "split-string": "^3.0.2",
             "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "browserslist": {
@@ -13975,13 +14743,18 @@
           "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
           "dev": true
         },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+        "fast-glob": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+          "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
           "dev": true,
           "requires": {
-            "is-extendable": "^0.1.0"
+            "@mrmlnc/readdir-enhanced": "^2.2.1",
+            "@nodelib/fs.stat": "^1.1.2",
+            "glob-parent": "^3.1.0",
+            "is-glob": "^4.0.0",
+            "merge2": "^1.2.3",
+            "micromatch": "^3.1.10"
           }
         },
         "figures": {
@@ -14003,15 +14776,17 @@
             "is-number": "^3.0.0",
             "repeat-string": "^1.6.1",
             "to-regex-range": "^2.1.0"
-          }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "fork-ts-checker-webpack-plugin": {
@@ -14031,553 +14806,34 @@
           }
         },
         "fsevents": {
-          "version": "1.2.12",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
-          "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
           "dev": true,
           "optional": true,
           "requires": {
             "bindings": "^1.5.0",
-            "nan": "^2.12.1",
-            "node-pre-gyp": "*"
+            "nan": "^2.12.1"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "dependencies": {
-            "abbrev": {
-              "version": "1.1.1",
-              "bundled": true,
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
               "dev": true,
-              "optional": true
-            },
-            "ansi-regex": {
-              "version": "2.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "aproba": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "are-we-there-yet": {
-              "version": "1.1.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
               "requires": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^2.0.6"
+                "is-extglob": "^2.1.0"
               }
-            },
-            "balanced-match": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "brace-expansion": {
-              "version": "1.1.11",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-              }
-            },
-            "chownr": {
-              "version": "1.1.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "code-point-at": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "concat-map": {
-              "version": "0.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "console-control-strings": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "core-util-is": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "debug": {
-              "version": "3.2.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ms": "^2.1.1"
-              }
-            },
-            "deep-extend": {
-              "version": "0.6.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "delegates": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "detect-libc": {
-              "version": "1.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "fs-minipass": {
-              "version": "1.2.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.6.0"
-              }
-            },
-            "fs.realpath": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "gauge": {
-              "version": "2.7.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "aproba": "^1.0.3",
-                "console-control-strings": "^1.0.0",
-                "has-unicode": "^2.0.0",
-                "object-assign": "^4.1.0",
-                "signal-exit": "^3.0.0",
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wide-align": "^1.1.0"
-              }
-            },
-            "glob": {
-              "version": "7.1.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-              }
-            },
-            "has-unicode": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "iconv-lite": {
-              "version": "0.4.24",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safer-buffer": ">= 2.1.2 < 3"
-              }
-            },
-            "ignore-walk": {
-              "version": "3.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimatch": "^3.0.4"
-              }
-            },
-            "inflight": {
-              "version": "1.0.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "once": "^1.3.0",
-                "wrappy": "1"
-              }
-            },
-            "inherits": {
-              "version": "2.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "ini": {
-              "version": "1.3.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "isarray": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minimatch": {
-              "version": "3.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "brace-expansion": "^1.1.7"
-              }
-            },
-            "minimist": {
-              "version": "1.2.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minipass": {
-              "version": "2.9.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.0"
-              }
-            },
-            "minizlib": {
-              "version": "1.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.9.0"
-              }
-            },
-            "mkdirp": {
-              "version": "0.5.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimist": "^1.2.5"
-              }
-            },
-            "ms": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "needle": {
-              "version": "2.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "debug": "^3.2.6",
-                "iconv-lite": "^0.4.4",
-                "sax": "^1.2.4"
-              }
-            },
-            "node-pre-gyp": {
-              "version": "0.14.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "detect-libc": "^1.0.2",
-                "mkdirp": "^0.5.1",
-                "needle": "^2.2.1",
-                "nopt": "^4.0.1",
-                "npm-packlist": "^1.1.6",
-                "npmlog": "^4.0.2",
-                "rc": "^1.2.7",
-                "rimraf": "^2.6.1",
-                "semver": "^5.3.0",
-                "tar": "^4.4.2"
-              }
-            },
-            "nopt": {
-              "version": "4.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "abbrev": "1",
-                "osenv": "^0.1.4"
-              }
-            },
-            "npm-bundled": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npm-normalize-package-bin": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "npm-packlist": {
-              "version": "1.4.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ignore-walk": "^3.0.1",
-                "npm-bundled": "^1.0.1",
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npmlog": {
-              "version": "4.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "are-we-there-yet": "~1.1.2",
-                "console-control-strings": "~1.1.0",
-                "gauge": "~2.7.3",
-                "set-blocking": "~2.0.0"
-              }
-            },
-            "number-is-nan": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "object-assign": {
-              "version": "4.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "once": {
-              "version": "1.4.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "wrappy": "1"
-              }
-            },
-            "os-homedir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "os-tmpdir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "osenv": {
-              "version": "0.1.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "os-homedir": "^1.0.0",
-                "os-tmpdir": "^1.0.0"
-              }
-            },
-            "path-is-absolute": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "process-nextick-args": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "rc": {
-              "version": "1.2.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "deep-extend": "^0.6.0",
-                "ini": "~1.3.0",
-                "minimist": "^1.2.0",
-                "strip-json-comments": "~2.0.1"
-              }
-            },
-            "readable-stream": {
-              "version": "2.3.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
-              }
-            },
-            "rimraf": {
-              "version": "2.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "safer-buffer": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "sax": {
-              "version": "1.2.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "semver": {
-              "version": "5.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "set-blocking": {
-              "version": "2.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "signal-exit": {
-              "version": "3.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "string_decoder": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "~5.1.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            },
-            "strip-json-comments": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "tar": {
-              "version": "4.4.13",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "chownr": "^1.1.1",
-                "fs-minipass": "^1.2.5",
-                "minipass": "^2.8.6",
-                "minizlib": "^1.2.1",
-                "mkdirp": "^0.5.0",
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.3"
-              }
-            },
-            "util-deprecate": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "wide-align": {
-              "version": "1.1.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "string-width": "^1.0.2 || 2"
-              }
-            },
-            "wrappy": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "yallist": {
-              "version": "3.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
             }
           }
         },
@@ -14596,6 +14852,12 @@
             "slash": "^1.0.0"
           }
         },
+        "ignore": {
+          "version": "3.3.10",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+          "dev": true
+        },
         "inquirer": {
           "version": "6.5.0",
           "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz",
@@ -14633,6 +14895,17 @@
           "dev": true,
           "requires": {
             "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
           }
         },
         "is-wsl": {
@@ -14650,15 +14923,6 @@
             "minimist": "^1.2.0"
           }
         },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
@@ -14670,14 +14934,25 @@
             "json5": "^1.0.1"
           }
         },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
           "dev": true,
           "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
           }
         },
         "mimic-fn": {
@@ -14716,30 +14991,15 @@
             "is-wsl": "^1.1.0"
           }
         },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
+        "path-type": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
           "dev": true,
           "requires": {
-            "p-limit": "^2.0.0"
+            "pify": "^3.0.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "pify": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
@@ -14773,6 +15033,33 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
+        "slash": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
+          }
+        },
         "strip-ansi": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -14780,6 +15067,14 @@
           "dev": true,
           "requires": {
             "ansi-regex": "^4.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+              "dev": true
+            }
           }
         },
         "to-regex-range": {
@@ -14807,9 +15102,9 @@
       }
     },
     "react-draggable": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.2.0.tgz",
-      "integrity": "sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==",
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.3.tgz",
+      "integrity": "sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w==",
       "dev": true,
       "requires": {
         "classnames": "^2.2.5",
@@ -14823,19 +15118,19 @@
       "dev": true
     },
     "react-fast-compare": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
-      "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
+      "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==",
       "dev": true
     },
     "react-focus-lock": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.2.1.tgz",
-      "integrity": "sha512-47g0xYcCTZccdzKRGufepY8oZ3W1Qg+2hn6u9SHZ0zUB6uz/4K4xJe7yYFNZ1qT6m+2JDm82F6QgKeBTbjW4PQ==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.4.1.tgz",
+      "integrity": "sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.0.0",
-        "focus-lock": "^0.6.6",
+        "focus-lock": "^0.7.0",
         "prop-types": "^15.6.2",
         "react-clientside-effect": "^1.2.2",
         "use-callback-ref": "^1.2.1",
@@ -14843,15 +15138,15 @@
       }
     },
     "react-helmet-async": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.0.4.tgz",
-      "integrity": "sha512-KTGHE9sz8N7+fCkZ2a3vzXH9eIkiTNhL2NhKR7XzzQl3WsGlCHh76arauJUIiGdfhjeMp7DY7PkASAmYFXeJYg==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.0.6.tgz",
+      "integrity": "sha512-t+bhAI4NgxfEv8ez4r77cLfR4O4Z55E/FH2DT+uiE4U7yfWgAk7OAOi7IxHxuYEVLI26bqjZvlVCkpC5/5AoNA==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.3.4",
+        "@babel/runtime": "^7.9.2",
         "invariant": "^2.2.4",
         "prop-types": "^15.7.2",
-        "react-fast-compare": "^2.0.4",
+        "react-fast-compare": "^3.0.1",
         "shallowequal": "^1.1.0"
       }
     },
@@ -14973,9 +15268,9 @@
       }
     },
     "react-transition-group": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz",
-      "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==",
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
+      "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.5.5",
@@ -15046,16 +15341,6 @@
         "npm-normalize-package-bin": "^1.0.0"
       }
     },
-    "read-package-json-fast": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz",
-      "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==",
-      "dev": true,
-      "requires": {
-        "json-parse-even-better-errors": "^2.0.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
     "read-package-tree": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz",
@@ -15080,9 +15365,9 @@
       },
       "dependencies": {
         "parse-json": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
-          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -15129,15 +15414,6 @@
             "p-locate": "^4.1.0"
           }
         },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
         "p-locate": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -15147,12 +15423,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
         "path-exists": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -15195,12 +15465,12 @@
       }
     },
     "readdirp": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
-      "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
       "dev": true,
       "requires": {
-        "picomatch": "^2.0.7"
+        "picomatch": "^2.2.1"
       }
     },
     "rechoir": {
@@ -15260,9 +15530,9 @@
       }
     },
     "regenerate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+      "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
       "dev": true
     },
     "regenerate-unicode-properties": {
@@ -15281,13 +15551,12 @@
       "dev": true
     },
     "regenerator-transform": {
-      "version": "0.14.4",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz",
-      "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==",
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.8.4",
-        "private": "^0.1.8"
+        "@babel/runtime": "^7.8.4"
       }
     },
     "regex-not": {
@@ -15325,9 +15594,9 @@
       }
     },
     "regjsgen": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
       "dev": true
     },
     "regjsparser": {
@@ -15354,43 +15623,60 @@
       "dev": true
     },
     "remark": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
-      "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz",
+      "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==",
       "dev": true,
       "requires": {
-        "remark-parse": "^6.0.0",
-        "remark-stringify": "^6.0.0",
-        "unified": "^7.0.0"
+        "remark-parse": "^8.0.0",
+        "remark-stringify": "^8.0.0",
+        "unified": "^9.0.0"
       }
     },
     "remark-parse": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
-      "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz",
+      "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
       "dev": true,
       "requires": {
+        "ccount": "^1.0.0",
         "collapse-white-space": "^1.0.2",
         "is-alphabetical": "^1.0.0",
         "is-decimal": "^1.0.0",
         "is-whitespace-character": "^1.0.0",
         "is-word-character": "^1.0.0",
         "markdown-escapes": "^1.0.0",
-        "parse-entities": "^1.1.0",
+        "parse-entities": "^2.0.0",
         "repeat-string": "^1.5.4",
         "state-toggle": "^1.0.0",
         "trim": "0.0.1",
         "trim-trailing-lines": "^1.0.0",
         "unherit": "^1.0.4",
-        "unist-util-remove-position": "^1.0.0",
-        "vfile-location": "^2.0.0",
+        "unist-util-remove-position": "^2.0.0",
+        "vfile-location": "^3.0.0",
         "xtend": "^4.0.1"
+      },
+      "dependencies": {
+        "parse-entities": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+          "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+          "dev": true,
+          "requires": {
+            "character-entities": "^1.0.0",
+            "character-entities-legacy": "^1.0.0",
+            "character-reference-invalid": "^1.0.0",
+            "is-alphanumerical": "^1.0.0",
+            "is-decimal": "^1.0.0",
+            "is-hexadecimal": "^1.0.0"
+          }
+        }
       }
     },
     "remark-stringify": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz",
-      "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz",
+      "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==",
       "dev": true,
       "requires": {
         "ccount": "^1.0.0",
@@ -15399,14 +15685,30 @@
         "is-whitespace-character": "^1.0.0",
         "longest-streak": "^2.0.1",
         "markdown-escapes": "^1.0.0",
-        "markdown-table": "^1.1.0",
-        "mdast-util-compact": "^1.0.0",
-        "parse-entities": "^1.0.2",
+        "markdown-table": "^2.0.0",
+        "mdast-util-compact": "^2.0.0",
+        "parse-entities": "^2.0.0",
         "repeat-string": "^1.5.4",
         "state-toggle": "^1.0.0",
-        "stringify-entities": "^1.0.1",
+        "stringify-entities": "^3.0.0",
         "unherit": "^1.0.4",
         "xtend": "^4.0.1"
+      },
+      "dependencies": {
+        "parse-entities": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+          "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+          "dev": true,
+          "requires": {
+            "character-entities": "^1.0.0",
+            "character-entities-legacy": "^1.0.0",
+            "character-reference-invalid": "^1.0.0",
+            "is-alphanumerical": "^1.0.0",
+            "is-decimal": "^1.0.0",
+            "is-hexadecimal": "^1.0.0"
+          }
+        }
       }
     },
     "remove-trailing-separator": {
@@ -15511,9 +15813,9 @@
       "dev": true
     },
     "require-main-filename": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
       "dev": true
     },
     "requires-port": {
@@ -15529,9 +15831,9 @@
       "dev": true
     },
     "resolve": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
-      "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
       "dev": true,
       "requires": {
         "path-parse": "^1.0.6"
@@ -15633,13 +15935,10 @@
       }
     },
     "run-async": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
-      "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
-      "dev": true,
-      "requires": {
-        "is-promise": "^2.1.0"
-      }
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
     },
     "run-parallel": {
       "version": "1.1.9",
@@ -15657,9 +15956,9 @@
       }
     },
     "rxjs": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
-      "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+      "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -15742,36 +16041,6 @@
       "dev": true,
       "requires": {
         "https-proxy-agent": "^2.2.1"
-      },
-      "dependencies": {
-        "agent-base": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
-          "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
-          "dev": true,
-          "requires": {
-            "es6-promisify": "^5.0.0"
-          }
-        },
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "https-proxy-agent": {
-          "version": "2.2.4",
-          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
-          "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
-          "dev": true,
-          "requires": {
-            "agent-base": "^4.3.0",
-            "debug": "^3.1.0"
-          }
-        }
       }
     },
     "sax": {
@@ -15796,12 +16065,13 @@
       }
     },
     "schema-utils": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
-      "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
       "dev": true,
       "requires": {
-        "ajv": "^6.12.0",
+        "@types/json-schema": "^7.0.4",
+        "ajv": "^6.12.2",
         "ajv-keywords": "^3.4.1"
       }
     },
@@ -15958,10 +16228,13 @@
       }
     },
     "serialize-javascript": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
-      "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
-      "dev": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
     },
     "serve-favicon": {
       "version": "2.5.0",
@@ -16158,9 +16431,9 @@
       "dev": true
     },
     "shelljs": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
-      "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==",
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
+      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
       "dev": true,
       "requires": {
         "glob": "^7.0.0",
@@ -16169,9 +16442,9 @@
       },
       "dependencies": {
         "interpret": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
-          "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+          "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
           "dev": true
         }
       }
@@ -16234,9 +16507,9 @@
       }
     },
     "slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true
     },
     "slice-ansi": {
@@ -16391,34 +16664,17 @@
       }
     },
     "socket.io": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
-      "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
+      "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
       "dev": true,
       "requires": {
-        "debug": "~3.1.0",
-        "engine.io": "~3.2.0",
+        "debug": "~4.1.0",
+        "engine.io": "~3.4.0",
         "has-binary2": "~1.0.2",
         "socket.io-adapter": "~1.1.0",
-        "socket.io-client": "2.1.1",
-        "socket.io-parser": "~3.2.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
+        "socket.io-client": "2.3.0",
+        "socket.io-parser": "~3.4.0"
       }
     },
     "socket.io-adapter": {
@@ -16428,24 +16684,24 @@
       "dev": true
     },
     "socket.io-client": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
-      "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
+      "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
       "dev": true,
       "requires": {
         "backo2": "1.0.2",
         "base64-arraybuffer": "0.1.5",
         "component-bind": "1.0.0",
         "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "engine.io-client": "~3.2.0",
+        "debug": "~4.1.0",
+        "engine.io-client": "~3.4.0",
         "has-binary2": "~1.0.2",
         "has-cors": "1.1.0",
         "indexof": "0.0.1",
         "object-component": "0.0.3",
         "parseqs": "0.0.5",
         "parseuri": "0.0.5",
-        "socket.io-parser": "~3.2.0",
+        "socket.io-parser": "~3.3.0",
         "to-array": "0.1.4"
       },
       "dependencies": {
@@ -16455,49 +16711,6 @@
           "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
           "dev": true
         },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "socket.io-parser": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
-      "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
-      "dev": true,
-      "requires": {
-        "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "isarray": "2.0.1"
-      },
-      "dependencies": {
-        "component-emitter": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-          "dev": true
-        },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
         "isarray": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
@@ -16509,17 +16722,65 @@
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
+        },
+        "socket.io-parser": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
+          "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
+          "dev": true,
+          "requires": {
+            "component-emitter": "1.2.1",
+            "debug": "~3.1.0",
+            "isarray": "2.0.1"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+              "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+              "dev": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            }
+          }
+        }
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
+      "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "debug": "~4.1.0",
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "component-emitter": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+          "dev": true
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
         }
       }
     },
     "sockjs": {
-      "version": "0.3.19",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
-      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "version": "0.3.20",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+      "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
       "dev": true,
       "requires": {
         "faye-websocket": "^0.10.0",
-        "uuid": "^3.0.1"
+        "uuid": "^3.4.0",
+        "websocket-driver": "0.6.5"
       }
     },
     "sockjs-client": {
@@ -16567,14 +16828,24 @@
       }
     },
     "socks-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz",
+      "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==",
       "dev": true,
       "requires": {
-        "agent-base": "6",
-        "debug": "4",
-        "socks": "^2.3.3"
+        "agent-base": "~4.2.1",
+        "socks": "~2.3.2"
+      },
+      "dependencies": {
+        "agent-base": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+          "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+          "dev": true,
+          "requires": {
+            "es6-promisify": "^5.0.0"
+          }
+        }
       }
     },
     "sonar-scanner": {
@@ -16650,9 +16921,9 @@
       }
     },
     "source-map-support": {
-      "version": "0.5.16",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
-      "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
+      "version": "0.5.19",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
       "dev": true,
       "requires": {
         "buffer-from": "^1.0.0",
@@ -16702,9 +16973,9 @@
       }
     },
     "spdx-correct": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
-      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
       "dev": true,
       "requires": {
         "spdx-expression-parse": "^3.0.0",
@@ -16712,15 +16983,15 @@
       }
     },
     "spdx-exceptions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
-      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
       "dev": true
     },
     "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
       "requires": {
         "spdx-exceptions": "^2.1.0",
@@ -16751,9 +17022,9 @@
       }
     },
     "spdy": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
-      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
@@ -16886,9 +17157,9 @@
       "dev": true
     },
     "store2": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/store2/-/store2-2.11.0.tgz",
-      "integrity": "sha512-WeIZ5+c/KzBSutSqOjUCAkk1qTLVBcYUuvrhNx8ndjLZKdZRfP6Vv7AOxlynuL6tVU/6zt6e2CTHwWI5KE+fKg==",
+      "version": "2.11.2",
+      "resolved": "https://registry.npmjs.org/store2/-/store2-2.11.2.tgz",
+      "integrity": "sha512-TQMKs+C6n9idtzLpxluikmDCYiDJrTbbIGn9LFxMg0BVTu+8JZKSlXTWYRpOFKlfKD5HlDWLVpJJyNGZ2e9l1A==",
       "dev": true
     },
     "stream-browserify": {
@@ -16931,34 +17202,29 @@
       "dev": true
     },
     "streamroller": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz",
-      "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz",
+      "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==",
       "dev": true,
       "requires": {
-        "async": "^2.6.2",
-        "date-format": "^2.0.0",
-        "debug": "^3.2.6",
-        "fs-extra": "^7.0.1",
-        "lodash": "^4.17.14"
+        "date-format": "^2.1.0",
+        "debug": "^4.1.1",
+        "fs-extra": "^8.1.0"
       },
       "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
+        "date-format": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
+          "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
+          "dev": true
         },
         "fs-extra": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-          "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.2",
+            "graceful-fs": "^4.2.0",
             "jsonfile": "^4.0.0",
             "universalify": "^0.1.0"
           }
@@ -16972,28 +17238,29 @@
       "dev": true
     },
     "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
       "dev": true,
       "requires": {
+        "emoji-regex": "^7.0.1",
         "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
+        "strip-ansi": "^5.1.0"
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
         "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^3.0.0"
+            "ansi-regex": "^4.1.0"
           }
         }
       }
@@ -17033,41 +17300,19 @@
       }
     },
     "string.prototype.trimend": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz",
-      "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
       }
     },
-    "string.prototype.trimleft": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
-      "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5",
-        "string.prototype.trimstart": "^1.0.0"
-      }
-    },
-    "string.prototype.trimright": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
-      "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5",
-        "string.prototype.trimend": "^1.0.0"
-      }
-    },
     "string.prototype.trimstart": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz",
-      "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
@@ -17084,14 +17329,15 @@
       }
     },
     "stringify-entities": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
-      "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz",
+      "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==",
       "dev": true,
       "requires": {
         "character-entities-html4": "^1.0.0",
         "character-entities-legacy": "^1.0.0",
         "is-alphanumerical": "^1.0.0",
+        "is-decimal": "^1.0.2",
         "is-hexadecimal": "^1.0.0"
       }
     },
@@ -17126,9 +17372,9 @@
       }
     },
     "strip-json-comments": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
-      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true
     },
     "style-loader": {
@@ -17194,48 +17440,48 @@
       }
     },
     "stylelint": {
-      "version": "13.3.0",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.3.0.tgz",
-      "integrity": "sha512-ehNzQu9JAbxuiNhUhmoyPgMjIdz7Fg1AxC5urPVhKotto/faF5GxwljSoLvQa6pB6yd+BVuofApWjWT/6/rBMQ==",
+      "version": "13.6.1",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.1.tgz",
+      "integrity": "sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw==",
       "dev": true,
       "requires": {
-        "autoprefixer": "^9.7.5",
+        "@stylelint/postcss-css-in-js": "^0.37.1",
+        "@stylelint/postcss-markdown": "^0.36.1",
+        "autoprefixer": "^9.8.0",
         "balanced-match": "^1.0.0",
-        "chalk": "^3.0.0",
+        "chalk": "^4.1.0",
         "cosmiconfig": "^6.0.0",
         "debug": "^4.1.1",
         "execall": "^2.0.0",
         "file-entry-cache": "^5.0.1",
-        "get-stdin": "^7.0.0",
+        "get-stdin": "^8.0.0",
         "global-modules": "^2.0.0",
-        "globby": "^11.0.0",
+        "globby": "^11.0.1",
         "globjoin": "^0.1.4",
         "html-tags": "^3.1.0",
-        "ignore": "^5.1.4",
+        "ignore": "^5.1.8",
         "import-lazy": "^4.0.0",
         "imurmurhash": "^0.1.4",
-        "known-css-properties": "^0.18.0",
+        "known-css-properties": "^0.19.0",
         "leven": "^3.1.0",
         "lodash": "^4.17.15",
-        "log-symbols": "^3.0.0",
+        "log-symbols": "^4.0.0",
         "mathml-tag-names": "^2.1.3",
-        "meow": "^6.1.0",
+        "meow": "^7.0.1",
         "micromatch": "^4.0.2",
         "normalize-selector": "^0.2.0",
-        "postcss": "^7.0.27",
+        "postcss": "^7.0.32",
         "postcss-html": "^0.36.0",
-        "postcss-jsx": "^0.36.4",
         "postcss-less": "^3.1.4",
-        "postcss-markdown": "^0.36.0",
         "postcss-media-query-parser": "^0.2.3",
         "postcss-reporter": "^6.0.1",
         "postcss-resolve-nested-selector": "^0.1.1",
         "postcss-safe-parser": "^4.0.2",
-        "postcss-sass": "^0.4.2",
-        "postcss-scss": "^2.0.0",
+        "postcss-sass": "^0.4.4",
+        "postcss-scss": "^2.1.1",
         "postcss-selector-parser": "^6.0.2",
         "postcss-syntax": "^0.36.2",
-        "postcss-value-parser": "^4.0.3",
+        "postcss-value-parser": "^4.1.0",
         "resolve-from": "^5.0.0",
         "slash": "^3.0.0",
         "specificity": "^0.4.1",
@@ -17245,60 +17491,35 @@
         "sugarss": "^2.0.0",
         "svg-tags": "^1.0.0",
         "table": "^5.4.6",
-        "v8-compile-cache": "^2.1.0",
+        "v8-compile-cache": "^2.1.1",
         "write-file-atomic": "^3.0.3"
       },
       "dependencies": {
-        "@nodelib/fs.stat": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-          "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
-          "dev": true
-        },
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
           "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
-        "array-union": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-          "dev": true
-        },
         "autoprefixer": {
-          "version": "9.7.5",
-          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz",
-          "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==",
+          "version": "9.8.6",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+          "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
           "dev": true,
           "requires": {
-            "browserslist": "^4.11.0",
-            "caniuse-lite": "^1.0.30001036",
-            "chalk": "^2.4.2",
+            "browserslist": "^4.12.0",
+            "caniuse-lite": "^1.0.30001109",
+            "colorette": "^1.2.1",
             "normalize-range": "^0.1.2",
             "num2fraction": "^1.2.2",
-            "postcss": "^7.0.27",
-            "postcss-value-parser": "^4.0.3"
-          },
-          "dependencies": {
-            "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"
-              }
-            }
+            "postcss": "^7.0.32",
+            "postcss-value-parser": "^4.1.0"
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
@@ -17315,6 +17536,12 @@
                 "color-convert": "^2.0.1"
               }
             },
+            "has-flag": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+              "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+              "dev": true
+            },
             "supports-color": {
               "version": "7.1.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
@@ -17354,62 +17581,10 @@
             "yaml": "^1.7.2"
           }
         },
-        "dir-glob": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-          "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-          "dev": true,
-          "requires": {
-            "path-type": "^4.0.0"
-          }
-        },
-        "fast-glob": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
-          "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
-          "dev": true,
-          "requires": {
-            "@nodelib/fs.stat": "^2.0.2",
-            "@nodelib/fs.walk": "^1.2.3",
-            "glob-parent": "^5.1.0",
-            "merge2": "^1.3.0",
-            "micromatch": "^4.0.2",
-            "picomatch": "^2.2.1"
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "globby": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
-          "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
-          "dev": true,
-          "requires": {
-            "array-union": "^2.1.0",
-            "dir-glob": "^3.0.1",
-            "fast-glob": "^3.1.1",
-            "ignore": "^5.1.4",
-            "merge2": "^1.3.0",
-            "slash": "^3.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "ignore": {
-          "version": "5.1.4",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
-          "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
           "dev": true
         },
         "import-fresh": {
@@ -17436,20 +17611,19 @@
           "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
           "dev": true
         },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+        "log-symbols": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+          "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
           "dev": true,
           "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
+            "chalk": "^4.0.0"
           }
         },
         "parse-json": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
-          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -17458,11 +17632,40 @@
             "lines-and-columns": "^1.1.6"
           }
         },
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          },
+          "dependencies": {
+            "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"
+              },
+              "dependencies": {
+                "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"
+                  }
+                }
+              }
+            }
+          }
         },
         "resolve-from": {
           "version": "5.0.0",
@@ -17470,10 +17673,10 @@
           "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
         },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
         "string-width": {
@@ -17495,6 +17698,15 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -17509,27 +17721,55 @@
       }
     },
     "stylelint-order": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.0.0.tgz",
-      "integrity": "sha512-bXV0v+jfB0+JKsqIn3mLglg1Dj2QCYkFHNfL1c+rVMEmruZmW5LUqT/ARBERfBm8SFtCuXpEdatidw/3IkcoiA==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz",
+      "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==",
       "dev": true,
       "requires": {
         "lodash": "^4.17.15",
-        "postcss": "^7.0.26",
+        "postcss": "^7.0.31",
         "postcss-sorting": "^5.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "stylelint-scss": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.16.0.tgz",
-      "integrity": "sha512-dAWs/gagdPYO3VDdvgRv5drRBMcWI4E//z3AXPAY1qYkSdXCEVJtEW+R9JtinG0U2rcJIu5XWaVddPQeaaufzw==",
+      "version": "3.18.0",
+      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.18.0.tgz",
+      "integrity": "sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==",
       "dev": true,
       "requires": {
         "lodash": "^4.17.15",
         "postcss-media-query-parser": "^0.2.3",
         "postcss-resolve-nested-selector": "^0.1.1",
         "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.0.2"
+        "postcss-value-parser": "^4.1.0"
       }
     },
     "stylus": {
@@ -17675,40 +17915,6 @@
         "lodash": "^4.17.14",
         "slice-ansi": "^2.1.0",
         "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "tapable": {
@@ -17718,12 +17924,12 @@
       "dev": true
     },
     "tar": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz",
-      "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
+      "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
       "dev": true,
       "requires": {
-        "chownr": "^1.1.3",
+        "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "minipass": "^3.0.0",
         "minizlib": "^2.1.0",
@@ -17731,10 +17937,16 @@
         "yallist": "^4.0.0"
       },
       "dependencies": {
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
         "mkdirp": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz",
-          "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==",
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
         }
       }
@@ -17752,9 +17964,9 @@
       }
     },
     "tar-stream": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz",
-      "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz",
+      "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==",
       "dev": true,
       "requires": {
         "bl": "^4.0.1",
@@ -17808,9 +18020,9 @@
       "dev": true
     },
     "terser": {
-      "version": "4.6.7",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz",
-      "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==",
+      "version": "4.6.10",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz",
+      "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
@@ -17827,70 +18039,101 @@
       }
     },
     "terser-webpack-plugin": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz",
-      "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz",
+      "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==",
       "dev": true,
       "requires": {
-        "cacache": "^13.0.1",
-        "find-cache-dir": "^3.2.0",
-        "jest-worker": "^25.1.0",
-        "p-limit": "^2.2.2",
-        "schema-utils": "^2.6.4",
-        "serialize-javascript": "^2.1.2",
+        "cacache": "^15.0.4",
+        "find-cache-dir": "^3.3.1",
+        "jest-worker": "^26.0.0",
+        "p-limit": "^2.3.0",
+        "schema-utils": "^2.6.6",
+        "serialize-javascript": "^3.1.0",
         "source-map": "^0.6.1",
-        "terser": "^4.4.3",
+        "terser": "^4.6.13",
         "webpack-sources": "^1.4.3"
       },
       "dependencies": {
         "cacache": {
-          "version": "13.0.1",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
-          "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
+          "version": "15.0.5",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
           "dev": true,
           "requires": {
-            "chownr": "^1.1.2",
-            "figgy-pudding": "^3.5.1",
+            "@npmcli/move-file": "^1.0.1",
+            "chownr": "^2.0.0",
             "fs-minipass": "^2.0.0",
             "glob": "^7.1.4",
-            "graceful-fs": "^4.2.2",
             "infer-owner": "^1.0.4",
-            "lru-cache": "^5.1.1",
-            "minipass": "^3.0.0",
+            "lru-cache": "^6.0.0",
+            "minipass": "^3.1.1",
             "minipass-collect": "^1.0.2",
             "minipass-flush": "^1.0.5",
             "minipass-pipeline": "^1.2.2",
-            "mkdirp": "^0.5.1",
-            "move-concurrently": "^1.0.1",
-            "p-map": "^3.0.0",
+            "mkdirp": "^1.0.3",
+            "p-map": "^4.0.0",
             "promise-inflight": "^1.0.1",
-            "rimraf": "^2.7.1",
-            "ssri": "^7.0.0",
+            "rimraf": "^3.0.2",
+            "ssri": "^8.0.0",
+            "tar": "^6.0.2",
             "unique-filename": "^1.1.1"
           }
         },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
           "dev": true
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-worker": {
+          "version": "26.2.1",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.2.1.tgz",
+          "integrity": "sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A==",
           "dev": true,
           "requires": {
-            "glob": "^7.1.3"
+            "@types/node": "*",
+            "merge-stream": "^2.0.0",
+            "supports-color": "^7.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "p-map": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+          "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
           }
         },
         "source-map": {
@@ -17899,14 +18142,24 @@
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "ssri": {
+        "supports-color": {
           "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
-          "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
           "dev": true,
           "requires": {
-            "figgy-pudding": "^3.5.1",
-            "minipass": "^3.1.1"
+            "has-flag": "^4.0.0"
+          }
+        },
+        "terser": {
+          "version": "4.8.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+          "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+          "dev": true,
+          "requires": {
+            "commander": "^2.20.0",
+            "source-map": "~0.6.1",
+            "source-map-support": "~0.5.12"
           }
         }
       }
@@ -17918,9 +18171,9 @@
       "dev": true
     },
     "throttle-debounce": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz",
-      "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.2.1.tgz",
+      "integrity": "sha512-i9hAVld1f+woAiyNGqWelpDD5W1tpMroL3NofTz9xzwq6acWBlO2dC8k5EFSZepU6oOINtV5Q3aSPoRg7o4+fA==",
       "dev": true
     },
     "through": {
@@ -18149,16 +18402,6 @@
             "json5": "^1.0.1"
           }
         },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
-          }
-        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -18210,9 +18453,9 @@
       }
     },
     "tsconfig-paths-webpack-plugin": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz",
-      "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.3.0.tgz",
+      "integrity": "sha512-MpQeZpwPY4gYASCUjY4yt2Zj8yv86O8f++3Ai4o0yI0fUC6G1syvnL9VuY71PBgimRYDQU47f12BEmJq9wRaSw==",
       "dev": true,
       "requires": {
         "chalk": "^2.3.0",
@@ -18221,14 +18464,14 @@
       }
     },
     "tslib": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
-      "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA=="
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+      "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
     },
     "tslint": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz",
-      "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==",
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
+      "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -18239,10 +18482,10 @@
         "glob": "^7.1.1",
         "js-yaml": "^3.13.1",
         "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
+        "mkdirp": "^0.5.3",
         "resolve": "^1.3.2",
         "semver": "^5.3.0",
-        "tslib": "^1.10.0",
+        "tslib": "^1.13.0",
         "tsutils": "^2.29.0"
       },
       "dependencies": {
@@ -18327,10 +18570,10 @@
       "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
       "dev": true
     },
-    "ultron": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
-      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+    "ua-parser-js": {
+      "version": "0.7.21",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
+      "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
       "dev": true
     },
     "unbzip2-stream": {
@@ -18400,19 +18643,31 @@
       "dev": true
     },
     "unified": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz",
-      "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz",
+      "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==",
       "dev": true,
       "requires": {
-        "@types/unist": "^2.0.0",
-        "@types/vfile": "^3.0.0",
         "bail": "^1.0.0",
         "extend": "^3.0.0",
-        "is-plain-obj": "^1.1.0",
+        "is-buffer": "^2.0.0",
+        "is-plain-obj": "^2.0.0",
         "trough": "^1.0.0",
-        "vfile": "^3.0.0",
-        "x-is-string": "^0.1.0"
+        "vfile": "^4.0.0"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "dev": true
+        },
+        "is-plain-obj": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+          "dev": true
+        }
       }
     },
     "union-value": {
@@ -18458,27 +18713,27 @@
       }
     },
     "unist-util-find-all-after": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz",
-      "integrity": "sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
+      "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
       "dev": true,
       "requires": {
-        "unist-util-is": "^3.0.0"
+        "unist-util-is": "^4.0.0"
       }
     },
     "unist-util-is": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
-      "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
+      "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
       "dev": true
     },
     "unist-util-remove-position": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
-      "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
+      "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
       "dev": true,
       "requires": {
-        "unist-util-visit": "^1.1.0"
+        "unist-util-visit": "^2.0.0"
       }
     },
     "unist-util-stringify-position": {
@@ -18491,21 +18746,24 @@
       }
     },
     "unist-util-visit": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
-      "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+      "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
       "dev": true,
       "requires": {
-        "unist-util-visit-parents": "^2.0.0"
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0",
+        "unist-util-visit-parents": "^3.0.0"
       }
     },
     "unist-util-visit-parents": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
-      "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz",
+      "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==",
       "dev": true,
       "requires": {
-        "unist-util-is": "^3.0.0"
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0"
       }
     },
     "universal-analytics": {
@@ -18659,9 +18917,9 @@
           }
         },
         "mime": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
-          "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
           "dev": true
         }
       }
@@ -18683,49 +18941,21 @@
       "dev": true
     },
     "use-callback-ref": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.1.tgz",
-      "integrity": "sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.4.tgz",
+      "integrity": "sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ==",
       "dev": true
     },
     "use-sidecar": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.2.tgz",
-      "integrity": "sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.3.tgz",
+      "integrity": "sha512-ygJwGUBeQfWgDls7uTrlEDzJUUR67L8Rm14v/KfFtYCdHhtjHZx1Krb3DIQl3/Q5dJGfXLEQ02RY8BdNBv87SQ==",
       "dev": true,
       "requires": {
-        "detect-node": "^2.0.4",
+        "detect-node-es": "^1.0.0",
         "tslib": "^1.9.3"
       }
     },
-    "useragent": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
-      "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
-      "dev": true,
-      "requires": {
-        "lru-cache": "4.1.x",
-        "tmp": "0.0.x"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "4.1.5",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-          "dev": true,
-          "requires": {
-            "pseudomap": "^1.0.2",
-            "yallist": "^2.1.2"
-          }
-        },
-        "yallist": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-          "dev": true
-        }
-      }
-    },
     "util": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@@ -18795,9 +19025,9 @@
       "dev": true
     },
     "v8-compile-cache": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
-      "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
       "dev": true
     },
     "validate-npm-package-license": {
@@ -18843,15 +19073,16 @@
       }
     },
     "vfile": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
-      "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
+      "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
       "dev": true,
       "requires": {
+        "@types/unist": "^2.0.0",
         "is-buffer": "^2.0.0",
         "replace-ext": "1.0.0",
-        "unist-util-stringify-position": "^1.0.0",
-        "vfile-message": "^1.0.0"
+        "unist-util-stringify-position": "^2.0.0",
+        "vfile-message": "^2.0.0"
       },
       "dependencies": {
         "is-buffer": {
@@ -18859,28 +19090,13 @@
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
           "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
           "dev": true
-        },
-        "unist-util-stringify-position": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
-          "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
-          "dev": true
-        },
-        "vfile-message": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
-          "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
-          "dev": true,
-          "requires": {
-            "unist-util-stringify-position": "^1.1.1"
-          }
         }
       }
     },
     "vfile-location": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
-      "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
+      "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
       "dev": true
     },
     "vfile-message": {
@@ -18915,14 +19131,25 @@
       }
     },
     "watchpack": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz",
-      "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==",
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
       "dev": true,
       "requires": {
-        "chokidar": "^2.1.8",
+        "chokidar": "^3.4.1",
         "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.0"
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
       },
       "dependencies": {
         "anymatch": {
@@ -18930,6 +19157,7 @@
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
           "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
           "dev": true,
+          "optional": true,
           "requires": {
             "micromatch": "^3.1.4",
             "normalize-path": "^2.1.1"
@@ -18940,6 +19168,7 @@
               "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
               "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
               "dev": true,
+              "optional": true,
               "requires": {
                 "remove-trailing-separator": "^1.0.1"
               }
@@ -18950,13 +19179,15 @@
           "version": "1.13.1",
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
           "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "braces": {
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
           "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
+          "optional": true,
           "requires": {
             "arr-flatten": "^1.1.0",
             "array-unique": "^0.3.2",
@@ -18968,6 +19199,18 @@
             "snapdragon-node": "^2.0.1",
             "split-string": "^3.0.2",
             "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "chokidar": {
@@ -18975,6 +19218,7 @@
           "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",
@@ -18990,575 +19234,62 @@
             "upath": "^1.1.1"
           }
         },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
         "fill-range": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
           "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
           "dev": true,
+          "optional": true,
           "requires": {
             "extend-shallow": "^2.0.1",
             "is-number": "^3.0.0",
             "repeat-string": "^1.6.1",
             "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "fsevents": {
-          "version": "1.2.12",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
-          "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
           "dev": true,
           "optional": true,
           "requires": {
             "bindings": "^1.5.0",
-            "nan": "^2.12.1",
-            "node-pre-gyp": "*"
+            "nan": "^2.12.1"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "dependencies": {
-            "abbrev": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "ansi-regex": {
-              "version": "2.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "aproba": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "are-we-there-yet": {
-              "version": "1.1.5",
-              "bundled": true,
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
               "dev": true,
               "optional": true,
               "requires": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^2.0.6"
+                "is-extglob": "^2.1.0"
               }
-            },
-            "balanced-match": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "brace-expansion": {
-              "version": "1.1.11",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-              }
-            },
-            "chownr": {
-              "version": "1.1.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "code-point-at": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "concat-map": {
-              "version": "0.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "console-control-strings": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "core-util-is": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "debug": {
-              "version": "3.2.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ms": "^2.1.1"
-              }
-            },
-            "deep-extend": {
-              "version": "0.6.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "delegates": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "detect-libc": {
-              "version": "1.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "fs-minipass": {
-              "version": "1.2.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.6.0"
-              }
-            },
-            "fs.realpath": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "gauge": {
-              "version": "2.7.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "aproba": "^1.0.3",
-                "console-control-strings": "^1.0.0",
-                "has-unicode": "^2.0.0",
-                "object-assign": "^4.1.0",
-                "signal-exit": "^3.0.0",
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wide-align": "^1.1.0"
-              }
-            },
-            "glob": {
-              "version": "7.1.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-              }
-            },
-            "has-unicode": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "iconv-lite": {
-              "version": "0.4.24",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safer-buffer": ">= 2.1.2 < 3"
-              }
-            },
-            "ignore-walk": {
-              "version": "3.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimatch": "^3.0.4"
-              }
-            },
-            "inflight": {
-              "version": "1.0.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "once": "^1.3.0",
-                "wrappy": "1"
-              }
-            },
-            "inherits": {
-              "version": "2.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "ini": {
-              "version": "1.3.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "isarray": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minimatch": {
-              "version": "3.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "brace-expansion": "^1.1.7"
-              }
-            },
-            "minimist": {
-              "version": "1.2.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minipass": {
-              "version": "2.9.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.0"
-              }
-            },
-            "minizlib": {
-              "version": "1.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.9.0"
-              }
-            },
-            "mkdirp": {
-              "version": "0.5.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimist": "^1.2.5"
-              }
-            },
-            "ms": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "needle": {
-              "version": "2.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "debug": "^3.2.6",
-                "iconv-lite": "^0.4.4",
-                "sax": "^1.2.4"
-              }
-            },
-            "node-pre-gyp": {
-              "version": "0.14.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "detect-libc": "^1.0.2",
-                "mkdirp": "^0.5.1",
-                "needle": "^2.2.1",
-                "nopt": "^4.0.1",
-                "npm-packlist": "^1.1.6",
-                "npmlog": "^4.0.2",
-                "rc": "^1.2.7",
-                "rimraf": "^2.6.1",
-                "semver": "^5.3.0",
-                "tar": "^4.4.2"
-              }
-            },
-            "nopt": {
-              "version": "4.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "abbrev": "1",
-                "osenv": "^0.1.4"
-              }
-            },
-            "npm-bundled": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npm-normalize-package-bin": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "npm-packlist": {
-              "version": "1.4.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ignore-walk": "^3.0.1",
-                "npm-bundled": "^1.0.1",
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npmlog": {
-              "version": "4.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "are-we-there-yet": "~1.1.2",
-                "console-control-strings": "~1.1.0",
-                "gauge": "~2.7.3",
-                "set-blocking": "~2.0.0"
-              }
-            },
-            "number-is-nan": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "object-assign": {
-              "version": "4.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "once": {
-              "version": "1.4.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "wrappy": "1"
-              }
-            },
-            "os-homedir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "os-tmpdir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "osenv": {
-              "version": "0.1.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "os-homedir": "^1.0.0",
-                "os-tmpdir": "^1.0.0"
-              }
-            },
-            "path-is-absolute": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "process-nextick-args": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "rc": {
-              "version": "1.2.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "deep-extend": "^0.6.0",
-                "ini": "~1.3.0",
-                "minimist": "^1.2.0",
-                "strip-json-comments": "~2.0.1"
-              }
-            },
-            "readable-stream": {
-              "version": "2.3.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
-              }
-            },
-            "rimraf": {
-              "version": "2.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "safer-buffer": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "sax": {
-              "version": "1.2.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "semver": {
-              "version": "5.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "set-blocking": {
-              "version": "2.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "signal-exit": {
-              "version": "3.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "string_decoder": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "~5.1.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            },
-            "strip-json-comments": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "tar": {
-              "version": "4.4.13",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "chownr": "^1.1.1",
-                "fs-minipass": "^1.2.5",
-                "minipass": "^2.8.6",
-                "minizlib": "^1.2.1",
-                "mkdirp": "^0.5.0",
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.3"
-              }
-            },
-            "util-deprecate": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "wide-align": {
-              "version": "1.1.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "string-width": "^1.0.2 || 2"
-              }
-            },
-            "wrappy": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "yallist": {
-              "version": "3.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
             }
           }
         },
@@ -19567,6 +19298,7 @@
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
           "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
           "dev": true,
+          "optional": true,
           "requires": {
             "binary-extensions": "^1.0.0"
           }
@@ -19576,17 +19308,43 @@
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "dev": true,
+          "optional": true,
           "requires": {
             "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
           }
         },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
           "dev": true,
+          "optional": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
           }
         },
         "readdirp": {
@@ -19594,6 +19352,7 @@
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
           "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
           "dev": true,
+          "optional": true,
           "requires": {
             "graceful-fs": "^4.1.11",
             "micromatch": "^3.1.10",
@@ -19605,6 +19364,7 @@
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
           "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
           "dev": true,
+          "optional": true,
           "requires": {
             "is-number": "^3.0.0",
             "repeat-string": "^1.6.1"
@@ -19671,6 +19431,35 @@
         "webpack-sources": "^1.4.1"
       },
       "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
         "cacache": {
           "version": "12.0.4",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
@@ -19694,6 +19483,29 @@
             "y18n": "^4.0.0"
           }
         },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
@@ -19705,6 +19517,26 @@
             "pkg-dir": "^3.0.0"
           }
         },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
         "is-wsl": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@@ -19741,6 +19573,27 @@
             "readable-stream": "^2.0.1"
           }
         },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
         "rimraf": {
           "version": "2.7.1",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
@@ -19761,6 +19614,15 @@
             "ajv-keywords": "^3.1.0"
           }
         },
+        "serialize-javascript": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -19777,28 +19639,38 @@
           }
         },
         "terser-webpack-plugin": {
-          "version": "1.4.3",
-          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
-          "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
+          "version": "1.4.4",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
+          "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
           "dev": true,
           "requires": {
             "cacache": "^12.0.2",
             "find-cache-dir": "^2.1.0",
             "is-wsl": "^1.1.0",
             "schema-utils": "^1.0.0",
-            "serialize-javascript": "^2.1.2",
+            "serialize-javascript": "^3.1.0",
             "source-map": "^0.6.1",
             "terser": "^4.1.2",
             "webpack-sources": "^1.4.0",
             "worker-farm": "^1.7.0"
           }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
         }
       }
     },
     "webpack-bundle-analyzer": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz",
-      "integrity": "sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA==",
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz",
+      "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==",
       "dev": true,
       "requires": {
         "acorn": "^7.1.1",
@@ -19817,9 +19689,9 @@
       },
       "dependencies": {
         "acorn": {
-          "version": "7.1.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
-          "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
+          "version": "7.4.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+          "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
           "dev": true
         }
       }
@@ -19848,17 +19720,17 @@
           }
         },
         "mime": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
-          "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
           "dev": true
         }
       }
     },
     "webpack-dev-server": {
-      "version": "3.10.3",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
-      "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+      "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
@@ -19869,31 +19741,31 @@
         "debug": "^4.1.1",
         "del": "^4.1.1",
         "express": "^4.17.1",
-        "html-entities": "^1.2.1",
+        "html-entities": "^1.3.1",
         "http-proxy-middleware": "0.19.1",
         "import-local": "^2.0.0",
         "internal-ip": "^4.3.0",
         "ip": "^1.1.5",
         "is-absolute-url": "^3.0.3",
         "killable": "^1.0.1",
-        "loglevel": "^1.6.6",
+        "loglevel": "^1.6.8",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.25",
+        "portfinder": "^1.0.26",
         "schema-utils": "^1.0.0",
         "selfsigned": "^1.10.7",
         "semver": "^6.3.0",
         "serve-index": "^1.9.1",
-        "sockjs": "0.3.19",
+        "sockjs": "0.3.20",
         "sockjs-client": "1.4.0",
-        "spdy": "^4.0.1",
+        "spdy": "^4.0.2",
         "strip-ansi": "^3.0.1",
         "supports-color": "^6.1.0",
         "url": "^0.11.0",
         "webpack-dev-middleware": "^3.7.2",
         "webpack-log": "^2.0.0",
         "ws": "^6.2.1",
-        "yargs": "12.0.5"
+        "yargs": "^13.3.2"
       },
       "dependencies": {
         "anymatch": {
@@ -19939,6 +19811,17 @@
             "snapdragon-node": "^2.0.1",
             "split-string": "^3.0.2",
             "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "chokidar": {
@@ -19961,15 +19844,6 @@
             "upath": "^1.1.1"
           }
         },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
         "fill-range": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -19980,556 +19854,48 @@
             "is-number": "^3.0.0",
             "repeat-string": "^1.6.1",
             "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
         "fsevents": {
-          "version": "1.2.12",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
-          "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
           "dev": true,
           "optional": true,
           "requires": {
             "bindings": "^1.5.0",
-            "nan": "^2.12.1",
-            "node-pre-gyp": "*"
+            "nan": "^2.12.1"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "dependencies": {
-            "abbrev": {
-              "version": "1.1.1",
-              "bundled": true,
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
               "dev": true,
-              "optional": true
-            },
-            "ansi-regex": {
-              "version": "2.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "aproba": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "are-we-there-yet": {
-              "version": "1.1.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
               "requires": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^2.0.6"
+                "is-extglob": "^2.1.0"
               }
-            },
-            "balanced-match": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "brace-expansion": {
-              "version": "1.1.11",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-              }
-            },
-            "chownr": {
-              "version": "1.1.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "code-point-at": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "concat-map": {
-              "version": "0.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "console-control-strings": {
-              "version": "1.1.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "core-util-is": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "debug": {
-              "version": "3.2.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ms": "^2.1.1"
-              }
-            },
-            "deep-extend": {
-              "version": "0.6.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "delegates": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "detect-libc": {
-              "version": "1.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "fs-minipass": {
-              "version": "1.2.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.6.0"
-              }
-            },
-            "fs.realpath": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "gauge": {
-              "version": "2.7.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "aproba": "^1.0.3",
-                "console-control-strings": "^1.0.0",
-                "has-unicode": "^2.0.0",
-                "object-assign": "^4.1.0",
-                "signal-exit": "^3.0.0",
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wide-align": "^1.1.0"
-              }
-            },
-            "glob": {
-              "version": "7.1.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-              }
-            },
-            "has-unicode": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "iconv-lite": {
-              "version": "0.4.24",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safer-buffer": ">= 2.1.2 < 3"
-              }
-            },
-            "ignore-walk": {
-              "version": "3.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimatch": "^3.0.4"
-              }
-            },
-            "inflight": {
-              "version": "1.0.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "once": "^1.3.0",
-                "wrappy": "1"
-              }
-            },
-            "inherits": {
-              "version": "2.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "ini": {
-              "version": "1.3.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "isarray": {
-              "version": "1.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minimatch": {
-              "version": "3.0.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "brace-expansion": "^1.1.7"
-              }
-            },
-            "minimist": {
-              "version": "1.2.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minipass": {
-              "version": "2.9.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.0"
-              }
-            },
-            "minizlib": {
-              "version": "1.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.9.0"
-              }
-            },
-            "mkdirp": {
-              "version": "0.5.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimist": "^1.2.5"
-              }
-            },
-            "ms": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "needle": {
-              "version": "2.3.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "debug": "^3.2.6",
-                "iconv-lite": "^0.4.4",
-                "sax": "^1.2.4"
-              }
-            },
-            "node-pre-gyp": {
-              "version": "0.14.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "detect-libc": "^1.0.2",
-                "mkdirp": "^0.5.1",
-                "needle": "^2.2.1",
-                "nopt": "^4.0.1",
-                "npm-packlist": "^1.1.6",
-                "npmlog": "^4.0.2",
-                "rc": "^1.2.7",
-                "rimraf": "^2.6.1",
-                "semver": "^5.3.0",
-                "tar": "^4.4.2"
-              }
-            },
-            "nopt": {
-              "version": "4.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "abbrev": "1",
-                "osenv": "^0.1.4"
-              }
-            },
-            "npm-bundled": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npm-normalize-package-bin": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "npm-packlist": {
-              "version": "1.4.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ignore-walk": "^3.0.1",
-                "npm-bundled": "^1.0.1",
-                "npm-normalize-package-bin": "^1.0.1"
-              }
-            },
-            "npmlog": {
-              "version": "4.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "are-we-there-yet": "~1.1.2",
-                "console-control-strings": "~1.1.0",
-                "gauge": "~2.7.3",
-                "set-blocking": "~2.0.0"
-              }
-            },
-            "number-is-nan": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "object-assign": {
-              "version": "4.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "once": {
-              "version": "1.4.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "wrappy": "1"
-              }
-            },
-            "os-homedir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "os-tmpdir": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "osenv": {
-              "version": "0.1.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "os-homedir": "^1.0.0",
-                "os-tmpdir": "^1.0.0"
-              }
-            },
-            "path-is-absolute": {
-              "version": "1.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "process-nextick-args": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "rc": {
-              "version": "1.2.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "deep-extend": "^0.6.0",
-                "ini": "~1.3.0",
-                "minimist": "^1.2.0",
-                "strip-json-comments": "~2.0.1"
-              }
-            },
-            "readable-stream": {
-              "version": "2.3.7",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
-              }
-            },
-            "rimraf": {
-              "version": "2.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "safer-buffer": {
-              "version": "2.1.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "sax": {
-              "version": "1.2.4",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "semver": {
-              "version": "5.7.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "set-blocking": {
-              "version": "2.0.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "signal-exit": {
-              "version": "3.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "string_decoder": {
-              "version": "1.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "~5.1.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            },
-            "strip-json-comments": {
-              "version": "2.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "tar": {
-              "version": "4.4.13",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "chownr": "^1.1.1",
-                "fs-minipass": "^1.2.5",
-                "minipass": "^2.8.6",
-                "minizlib": "^1.2.1",
-                "mkdirp": "^0.5.0",
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.3"
-              }
-            },
-            "util-deprecate": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "wide-align": {
-              "version": "1.1.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "string-width": "^1.0.2 || 2"
-              }
-            },
-            "wrappy": {
-              "version": "1.0.2",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "yallist": {
-              "version": "3.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
             }
           }
         },
@@ -20555,15 +19921,38 @@
           "dev": true,
           "requires": {
             "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
           }
         },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
           }
         },
         "readdirp": {
@@ -20674,9 +20063,9 @@
       }
     },
     "webpack-virtual-modules": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.1.tgz",
-      "integrity": "sha512-0PWBlxyt4uGDofooIEanWhhyBOHdd+lr7QpYNDLC7/yc5lqJT8zlc04MTIBnKj+c2BlQNNuwE5er/Tg4wowHzA==",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz",
+      "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==",
       "dev": true,
       "requires": {
         "debug": "^3.0.0"
@@ -20694,20 +20083,18 @@
       }
     },
     "websocket-driver": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
-      "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+      "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
       "dev": true,
       "requires": {
-        "http-parser-js": ">=0.4.0 <0.4.11",
-        "safe-buffer": ">=5.1.0",
         "websocket-extensions": ">=0.1.1"
       }
     },
     "websocket-extensions": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
       "dev": true
     },
     "when": {
@@ -20744,6 +20131,33 @@
       "dev": true,
       "requires": {
         "string-width": "^1.0.2 || 2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
       }
     },
     "widest-line": {
@@ -20761,6 +20175,12 @@
           "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
         "is-fullwidth-code-point": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -20789,17 +20209,6 @@
         }
       }
     },
-    "wkt-parser": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.4.tgz",
-      "integrity": "sha512-ZzKnc7ml/91fOPh5bANBL4vUlWPIYYv11waCtWTkl2TRN+LEmBg60Q1MA8gqV4hEp4MGfSj9JiHz91zw/gTDXg=="
-    },
-    "wordwrap": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-      "dev": true
-    },
     "worker-farm": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
@@ -20810,9 +20219,9 @@
       }
     },
     "worker-plugin": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.2.tgz",
-      "integrity": "sha512-V+1zSZMOOKk+uBzKyNIODLQLsx59zSIOaI75J1EMS0iR1qy+KQR3y/pQ3T0vIhvPfDFapGRMsoMvQNEL3okqSA==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz",
+      "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.1.0"
@@ -20850,33 +20259,29 @@
       }
     },
     "wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
       "dev": true,
       "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
+        "ansi-styles": "^3.2.0",
+        "string-width": "^3.0.0",
+        "strip-ansi": "^5.0.0"
       },
       "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
         },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
+            "ansi-regex": "^4.1.0"
           }
         }
       }
@@ -20917,12 +20322,6 @@
         "async-limiter": "~1.0.0"
       }
     },
-    "x-is-string": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
-      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
-      "dev": true
-    },
     "xml2js": {
       "version": "0.4.23",
       "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
@@ -20964,83 +20363,33 @@
       "dev": true
     },
     "yaml": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz",
-      "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.8.7"
-      }
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+      "dev": true
     },
     "yargs": {
-      "version": "12.0.5",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
-      "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+      "version": "13.3.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
       "dev": true,
       "requires": {
-        "cliui": "^4.0.0",
-        "decamelize": "^1.2.0",
+        "cliui": "^5.0.0",
         "find-up": "^3.0.0",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^3.0.0",
+        "get-caller-file": "^2.0.1",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
+        "require-main-filename": "^2.0.0",
         "set-blocking": "^2.0.0",
-        "string-width": "^2.0.0",
+        "string-width": "^3.0.0",
         "which-module": "^2.0.0",
-        "y18n": "^3.2.1 || ^4.0.0",
-        "yargs-parser": "^11.1.1"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
-          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        }
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.2"
       }
     },
     "yargs-parser": {
-      "version": "11.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-      "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+      "version": "13.1.2",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
       "dev": true,
       "requires": {
         "camelcase": "^5.0.0",
diff --git a/package.json b/package.json
index 67386b7..03fe855 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,12 @@
 {
   "name": "openkonsequenz-statement-public-affairs",
-  "version": "0.5.0",
+  "version": "0.6.0",
   "description": "Statement Public Affairs",
   "license": "Eclipse Public License - v 2.0",
+  "repository": {
+    "type": "git",
+    "url": "https://git.eclipse.org/r/plugins/gitiles/openk-usermodules/org.eclipse.openk-usermodules.statementPublicAffairs.frontend"
+  },
   "routes": {
     "spaFrontend": "/statementpaFE",
     "spaBackend": "/statementpaBE",
@@ -37,69 +41,71 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "~9.1.0",
-    "@angular/cdk": "9.2.0",
-    "@angular/common": "~9.1.0",
-    "@angular/compiler": "~9.1.0",
-    "@angular/core": "~9.1.0",
-    "@angular/forms": "~9.1.0",
-    "@angular/material": "^9.2.0",
-    "@angular/platform-browser": "~9.1.0",
-    "@angular/platform-browser-dynamic": "~9.1.0",
-    "@angular/router": "~9.1.0",
-    "@ngrx/effects": "^9.0.0",
-    "@ngrx/store": "^9.0.0",
+    "@angular/animations": "~9.1.12",
+    "@angular/cdk": "~9.2.4",
+    "@angular/common": "~9.1.12",
+    "@angular/compiler": "~9.1.12",
+    "@angular/core": "~9.1.12",
+    "@angular/forms": "~9.1.12",
+    "@angular/material": "^9.2.4",
+    "@angular/platform-browser": "~9.1.12",
+    "@angular/platform-browser-dynamic": "~9.1.12",
+    "@angular/router": "~9.1.12",
+    "@ngrx/effects": "^9.2.0",
+    "@ngrx/store": "^9.2.0",
     "@ngx-translate/core": "^12.1.2",
-    "@ngx-translate/http-loader": "^4.0.0",
+    "@ngx-translate/http-loader": "^5.0.0",
     "bpmn-js": "^6.5.1",
     "leaflet": "^1.6.0",
     "material-design-icons": "^3.0.1",
-    "moment": "2.24.0",
-    "primeng": "^9.0.6",
-    "proj4": "^2.6.1",
+    "moment": "^2.27.0",
+    "primeng": "^9.1.3",
     "rxjs": "~6.5.4",
     "source-sans-pro": "^3.6.0",
     "tslib": "^1.10.0",
     "zone.js": "~0.10.2"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "~0.901.0",
-    "@angular/cli": "~9.1.0",
-    "@angular/compiler-cli": "~9.1.0",
-    "@angular/language-service": "~9.1.0",
+    "@angular-builders/custom-webpack": "^9.2.0",
+    "@angular-devkit/build-angular": "~0.901.11",
+    "@angular/cli": "~9.1.11",
+    "@angular/compiler-cli": "~9.1.12",
+    "@angular/language-service": "~9.1.12",
     "@babel/core": "^7.9.0",
-    "@ngrx/store-devtools": "^9.0.0",
-    "@storybook/addon-actions": "^5.3.18",
-    "@storybook/addon-knobs": "^5.3.18",
-    "@storybook/addon-links": "^5.3.18",
-    "@storybook/addon-notes": "^5.3.18",
-    "@storybook/addons": "^5.3.18",
-    "@storybook/angular": "^5.3.18",
+    "@ngrx/store-devtools": "^9.2.0",
+    "@storybook/addon-actions": "^5.3.19",
+    "@storybook/addon-knobs": "^5.3.19",
+    "@storybook/addon-links": "^5.3.19",
+    "@storybook/addon-notes": "^5.3.19",
+    "@storybook/addons": "^5.3.19",
+    "@storybook/angular": "^5.3.19",
     "@types/jasmine": "~3.5.0",
     "@types/jasminewd2": "~2.0.3",
     "@types/klaw": "^3.0.1",
+    "@types/leaflet": "^1.5.17",
     "@types/node": "^12.11.1",
     "@types/proj4": "^2.5.0",
     "autoprefixer": "^8.1.0",
     "babel-loader": "^8.1.0",
     "codelyzer": "^5.1.2",
-    "husky": "^4.2.3",
+    "husky": "^4.2.5",
     "jasmine-core": "~3.5.0",
     "jasmine-spec-reporter": "~4.2.1",
-    "karma": "~4.4.1",
+    "karma": "~5.1.0",
     "karma-chrome-launcher": "~3.1.0",
-    "karma-coverage-istanbul-reporter": "~2.1.0",
-    "karma-jasmine": "~3.0.1",
-    "karma-jasmine-html-reporter": "^1.4.2",
+    "karma-coverage-istanbul-reporter": "~3.0.3",
+    "karma-jasmine": "~3.3.1",
+    "karma-jasmine-html-reporter": "^1.5.4",
     "license-checker": "^25.0.1",
-    "protractor": "~5.4.3",
-    "puppeteer": "^3.1.0",
+    "license-webpack-plugin": "^2.3.0",
+    "protractor": "~7.0.0",
+    "puppeteer": "^3.3.0",
     "sonar-scanner": "^3.1.0",
-    "stylelint": "^13.3.0",
+    "stylelint": "^13.6.1",
     "stylelint-config-sass-guidelines": "^7.0.0",
     "ts-node": "~8.3.0",
     "tslint": "~6.1.0",
     "typescript": "~3.8.3",
-    "webpack-bundle-analyzer": "^3.7.0"
+    "webpack-bundle-analyzer": "^3.8.0"
   }
 }
diff --git a/src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts b/src/app/core/api/attachments/EAPIStaticAttachmentTagIds.ts
similarity index 72%
rename from src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts
rename to src/app/core/api/attachments/EAPIStaticAttachmentTagIds.ts
index 663231b..76b091b 100644
--- a/src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts
+++ b/src/app/core/api/attachments/EAPIStaticAttachmentTagIds.ts
@@ -11,20 +11,18 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface IStatementInfoFormValue {
+export enum EAPIStaticAttachmentTagIds {
 
-    title: string;
+    EMAIL_TEXT = "email-text",
 
-    receiptDate: string;
+    EMAIL = "email",
 
-    dueDate: string;
+    OUTBOX = "outbox",
 
-    typeId: number;
+    CONSIDERATION = "consideration",
 
-    city: string;
+    STATEMENT = "statement",
 
-    district: string;
-
-    attachments?: File[];
+    COVER_LETTER = "cover-letter"
 
 }
diff --git a/src/app/core/api/attachments/IAPIAttachmentModel.ts b/src/app/core/api/attachments/IAPIAttachmentModel.ts
index 932efc1..ad9dd72 100644
--- a/src/app/core/api/attachments/IAPIAttachmentModel.ts
+++ b/src/app/core/api/attachments/IAPIAttachmentModel.ts
@@ -44,5 +44,5 @@
     /**
      * List of IDs for tagging.
      */
-    tagIds: number[];
+    tagIds: string[];
 }
diff --git a/src/app/core/api/attachments/attachments-api.service.ts b/src/app/core/api/attachments/attachments-api.service.ts
index 171cfb0..b29eae3 100644
--- a/src/app/core/api/attachments/attachments-api.service.ts
+++ b/src/app/core/api/attachments/attachments-api.service.ts
@@ -13,7 +13,7 @@
 
 import {HttpClient} from "@angular/common/http";
 import {Inject, Injectable} from "@angular/core";
-import {urlJoin} from "../../../util/http";
+import {objectToHttpParams, urlJoin} from "../../../util/http";
 import {SPA_BACKEND_ROUTE} from "../../external-routes";
 import {IAPIAttachmentModel} from "./IAPIAttachmentModel";
 
@@ -38,11 +38,12 @@
     /**
      * Uploads a new file to the back end linked to a specific statement.
      */
-    public postAttachment(statementId: number, taskId: string, file: File) {
+    public postAttachment(statementId: number, taskId: string, file: File, ...tagId: string[]) {
+        const params = tagId.length > 0 ? objectToHttpParams({tagId}) : undefined;
         const endPoint = `/process/statements/${statementId}/task/${taskId}/attachments`;
         const formData = new FormData();
         formData.append("attachment", file, file.name);
-        return this.httpClient.post<IAPIAttachmentModel>(urlJoin(this.baseUrl, endPoint), formData);
+        return this.httpClient.post<IAPIAttachmentModel>(urlJoin(this.baseUrl, endPoint), formData, {params});
     }
 
     /**
diff --git a/src/app/core/api/attachments/index.ts b/src/app/core/api/attachments/index.ts
index fe19c7e..764c147 100644
--- a/src/app/core/api/attachments/index.ts
+++ b/src/app/core/api/attachments/index.ts
@@ -12,4 +12,5 @@
  ********************************************************************************/
 
 export * from "./attachments-api.service";
+export * from "./EAPIStaticAttachmentTagIds";
 export * from "./IAPIAttachmentModel";
diff --git a/src/app/core/api/core/core-api.service.ts b/src/app/core/api/core/core-api.service.ts
index 07a64b8..b286e02 100644
--- a/src/app/core/api/core/core-api.service.ts
+++ b/src/app/core/api/core/core-api.service.ts
@@ -39,7 +39,7 @@
     }
 
     /**
-     * Fetches the unser information
+     * Fetches the user information
      */
     public getUserInfo() {
         const endPoint = `userinfo`;
diff --git a/src/app/core/api/index.ts b/src/app/core/api/index.ts
index f558792..5a17d1f 100644
--- a/src/app/core/api/index.ts
+++ b/src/app/core/api/index.ts
@@ -16,5 +16,6 @@
 export * from "./core";
 export * from "./process";
 export * from "./settings";
-export * from "./statements";
 export * from "./shared";
+export * from "./statements";
+export * from "./text";
diff --git a/src/app/core/api/statements/IAPIAttachmentModel.ts b/src/app/core/api/statements/IAPIAttachmentModel.ts
deleted file mode 100644
index 47ed265..0000000
--- a/src/app/core/api/statements/IAPIAttachmentModel.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-/**
- * Interface which represents the model of an uploaded attachment in the back end data base.
- */
-export interface IAPIAttachmentModel {
-
-    /**
-     * Unique ID of a specifcic attachment.
-     */
-    id: number;
-
-    /**
-     * Name which is used for display in the app.
-     */
-    name: string;
-
-    /**
-     * Type of the attachment, e.g. a PDF or text file.
-     */
-    type: string;
-
-    /**
-     * Size of a specific attachment in bytes.
-     */
-    size: number;
-
-    timestamp: string;
-
-}
diff --git a/src/app/core/api/text/IAPIRequireRuleModel.ts b/src/app/core/api/text/IAPIRequireRuleModel.ts
new file mode 100644
index 0000000..cbc927a
--- /dev/null
+++ b/src/app/core/api/text/IAPIRequireRuleModel.ts
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+/**
+ * Interface which represents a rule of required text blocks in an arrangement.
+ */
+export interface IAPIRequireRuleModel {
+
+    /**
+     * List of required text block IDs in the arrangement.
+     */
+    ids: string[];
+
+    /**
+     * If "and", all given IDs must be included in the arrangement.
+     * If "xor", one but no other text block must be included in the arrangement.
+     * If "or", at least one text block must be included in the arrangement.
+     */
+    type: TAPIRequireRuleType;
+
+}
+
+export type TAPIRequireRuleType = "and" | "xor" | "or";
diff --git a/src/app/core/api/text/IAPIStatementTextConfigurationModel.ts b/src/app/core/api/text/IAPIStatementTextConfigurationModel.ts
new file mode 100644
index 0000000..5202d07
--- /dev/null
+++ b/src/app/core/api/text/IAPIStatementTextConfigurationModel.ts
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextBlockConfigurationModel} from "./IAPITextBlockConfigurationModel";
+
+/**
+ * Interface which represents the configuration of the whole statement text, i.e. all available text block templates and replacements.
+ */
+export interface IAPIStatementTextConfigurationModel {
+
+    /**
+     * Object which configures all text block templates.
+     */
+    configuration: IAPITextBlockConfigurationModel;
+
+    /**
+     * Object which defines all static text replacements in the text block templates.
+     */
+    replacements: {
+        [key: string]: string;
+    };
+
+}
diff --git a/src/app/core/api/text/IAPITextArrangementErrorModel.ts b/src/app/core/api/text/IAPITextArrangementErrorModel.ts
new file mode 100644
index 0000000..4595825
--- /dev/null
+++ b/src/app/core/api/text/IAPITextArrangementErrorModel.ts
@@ -0,0 +1,56 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPIRequireRuleModel} from "./IAPIRequireRuleModel";
+
+/**
+ * Interface which represents an error in a text block arrangement.
+ */
+export interface IAPITextArrangementErrorModel {
+
+    /**
+     * Index of the erroneous item in the text block arrangement array.
+     */
+    arrangementId: 0;
+
+    /**
+     * Text block ID of the item.
+     */
+    textblockId: string;
+
+    /**
+     * Text block group to which the item belongs.
+     */
+    textblockGroup: string;
+
+    /**
+     * List of all unset placeholder variables.
+     */
+    missingVariables?: string[];
+
+    /**
+     * List of all unmet require rules.
+     */
+    requires?: IAPIRequireRuleModel[];
+
+    /**
+     * List of all excluded text block IDs which are currently in the arrangement.
+     */
+    excludes?: string[];
+
+    /**
+     * ID after which the current text block must be placed in the arrangement.
+     */
+    after?: string;
+
+}
diff --git a/src/app/core/api/text/IAPITextArrangementItemModel.ts b/src/app/core/api/text/IAPITextArrangementItemModel.ts
new file mode 100644
index 0000000..85a0b36
--- /dev/null
+++ b/src/app/core/api/text/IAPITextArrangementItemModel.ts
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+/**
+ * Interface which represents an entry in the text block arrangement.
+ */
+export interface IAPITextArrangementItemModel {
+
+    /**
+     * Defines the type of the arrangement entry.
+     */
+    type: TAPITextArrangementItemType;
+
+    /**
+     * ID of the text block template in the text block configuration (only of type "block").
+     */
+    textblockId?: string;
+
+    /**
+     * Each key found in the text block string will be replaced with its value (only of type "block").
+     */
+    placeholderValues: { [key: string]: string };
+
+    /**
+     * Adds automatically a new line after the entry.
+     */
+    addNewline?: boolean;
+
+    /**
+     * Replaces the whole entry with the given string.
+     */
+    replacement?: string;
+
+}
+
+export type TAPITextArrangementItemType = "block" | "text" | "newline" | "pagebreak";
diff --git a/src/app/core/api/text/IAPITextArrangementValidationModel.ts b/src/app/core/api/text/IAPITextArrangementValidationModel.ts
new file mode 100644
index 0000000..369500b
--- /dev/null
+++ b/src/app/core/api/text/IAPITextArrangementValidationModel.ts
@@ -0,0 +1,31 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextArrangementErrorModel} from "./IAPITextArrangementErrorModel";
+
+/**
+ * Interface which represents the validation result from the back end.
+ */
+export interface IAPITextArrangementValidationModel {
+
+    /**
+     * If true, the text block arrangement is valid.
+     */
+    valid: boolean;
+
+    /**
+     * List of errors in the text arrangement.
+     */
+    errors: IAPITextArrangementErrorModel[];
+
+}
diff --git a/src/app/core/api/text/IAPITextBlockConfigurationModel.ts b/src/app/core/api/text/IAPITextBlockConfigurationModel.ts
new file mode 100644
index 0000000..6833b83
--- /dev/null
+++ b/src/app/core/api/text/IAPITextBlockConfigurationModel.ts
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextBlockGroupModel} from "./IAPITextBlockGroupModel";
+
+/**
+ * Interface which represents the configuration of all text block templates.
+ */
+export interface IAPITextBlockConfigurationModel {
+
+    /**
+     * Object which specifies the available select options in the text block template.
+     */
+    selects: {
+        [key: string]: string[];
+    };
+
+    /**
+     * List of all available text block template groups.
+     */
+    groups: IAPITextBlockGroupModel[];
+
+}
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/core/api/text/IAPITextBlockGroupModel.ts
similarity index 61%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/core/api/text/IAPITextBlockGroupModel.ts
index fc6c436..349125f 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/core/api/text/IAPITextBlockGroupModel.ts
@@ -11,7 +11,21 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+import {IAPITextBlockModel} from "./IAPITextBlockModel";
+
+/**
+ * Interface which represents a single text block template group.
+ */
+export interface IAPITextBlockGroupModel {
+
+    /**
+     * Name of the group.
+     */
+    groupName: string;
+
+    /**
+     * All available text block templates in the group.
+     */
+    textBlocks: IAPITextBlockModel[];
+
 }
diff --git a/src/app/core/api/text/IAPITextBlockModel.ts b/src/app/core/api/text/IAPITextBlockModel.ts
new file mode 100644
index 0000000..52b4f3b
--- /dev/null
+++ b/src/app/core/api/text/IAPITextBlockModel.ts
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPIRequireRuleModel} from "./IAPIRequireRuleModel";
+
+/**
+ * Interface which represents a single text block template.
+ */
+export interface IAPITextBlockModel {
+
+    /**
+     * Unique ID of the text block item.
+     */
+    id: string;
+
+    /**
+     * Template text which is placed in the statement.
+     */
+    text: string;
+
+    /**
+     * List of IDs which are excluded by the text block template.
+     */
+    excludes: string[];
+
+    /**
+     * List of rules to specify all required text block templates.
+     */
+    requires: IAPIRequireRuleModel[];
+
+}
diff --git a/src/app/core/api/text/index.ts b/src/app/core/api/text/index.ts
new file mode 100644
index 0000000..8433fba
--- /dev/null
+++ b/src/app/core/api/text/index.ts
@@ -0,0 +1,22 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+export * from "./IAPIRequireRuleModel";
+export * from "./IAPIStatementTextConfigurationModel";
+export * from "./IAPITextArrangementErrorModel";
+export * from "./IAPITextArrangementItemModel";
+export * from "./IAPITextArrangementValidationModel";
+export * from "./IAPITextBlockConfigurationModel";
+export * from "./IAPITextBlockGroupModel";
+export * from "./IAPITextBlockModel";
+export * from "./text-api.service";
diff --git a/src/app/core/api/text/text-api.service.ts b/src/app/core/api/text/text-api.service.ts
new file mode 100644
index 0000000..4b3a1ad
--- /dev/null
+++ b/src/app/core/api/text/text-api.service.ts
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClient} from "@angular/common/http";
+import {Inject, Injectable} from "@angular/core";
+import {mapHttpResponseToFile, urlJoin} from "../../../util/http";
+import {SPA_BACKEND_ROUTE} from "../../external-routes";
+import {IAPIStatementTextConfigurationModel} from "./IAPIStatementTextConfigurationModel";
+import {IAPITextArrangementItemModel} from "./IAPITextArrangementItemModel";
+import {IAPITextArrangementValidationModel} from "./IAPITextArrangementValidationModel";
+
+@Injectable({providedIn: "root"})
+export class TextApiService {
+
+    public constructor(
+        protected readonly httpClient: HttpClient,
+        @Inject(SPA_BACKEND_ROUTE) protected readonly baseUrl: string
+    ) {
+
+    }
+
+    /**
+     * Fetches the text configuration for a statement.
+     */
+    public getConfiguration(statementId: number) {
+        const endPoint = `/process/statements/${statementId}/workflow/textblockconfig`;
+        return this.httpClient.get<IAPIStatementTextConfigurationModel>(urlJoin(this.baseUrl, endPoint));
+    }
+
+    /**
+     * Fetches the current text arrangement for a statement.
+     */
+    public getArrangement(statementId: number) {
+        const endPoint = `/process/statements/${statementId}/workflow/textarrangement`;
+        return this.httpClient.get<IAPITextArrangementItemModel[]>(urlJoin(this.baseUrl, endPoint));
+    }
+
+    /**
+     * Posts a given text arrangement and stores it in the back end data base.
+     */
+    public postArrangement(statementId: number, taskId: string, body: IAPITextArrangementItemModel[]) {
+        const endPoint = `/process/statements/${statementId}/task/${taskId}/workflow/textarrangement`;
+        return this.httpClient.post(urlJoin(this.baseUrl, endPoint), body);
+    }
+
+    /**
+     * Validates a given text arrangement for a statement.
+     */
+    public validateArrangement(statementId: number, taskId: string, body: IAPITextArrangementItemModel[]) {
+        const endPoint = `/process/statements/${statementId}/workflow/textarrangement/validate`;
+        return this.httpClient.post<IAPITextArrangementValidationModel>(urlJoin(this.baseUrl, endPoint), body);
+    }
+
+    /**
+     * Compile a given text arrangement to a PDF file.
+     */
+    public compileArrangement(statementId: number, taskId: string, body: IAPITextArrangementItemModel[]) {
+        const endPoint = `/process/statements/${statementId}/workflow/textarrangement/compile`;
+        return this.httpClient.post(urlJoin(this.baseUrl, endPoint), body, {responseType: "blob", observe: "response"}).pipe(
+            mapHttpResponseToFile()
+        );
+    }
+
+}
diff --git a/src/app/core/dom/index.ts b/src/app/core/dom/index.ts
index 1301460..cdbc230 100644
--- a/src/app/core/dom/index.ts
+++ b/src/app/core/dom/index.ts
@@ -12,4 +12,5 @@
  ********************************************************************************/
 
 export * from "./local-storage.token";
+export * from "./url.token";
 export * from "./window.token";
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/core/dom/url.token.ts
similarity index 71%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/core/dom/url.token.ts
index fc6c436..a2d7aa1 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/core/dom/url.token.ts
@@ -11,7 +11,12 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
-}
+import {InjectionToken} from "@angular/core";
+
+/**
+ * Injection token for the global URL object
+ */
+export const URL_TOKEN = new InjectionToken<typeof URL>("URL object", {
+    providedIn: "root",
+    factory: () => URL
+});
diff --git a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.html b/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.html
deleted file mode 100644
index f06f020..0000000
--- a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<app-card [appTitle]="'edit.createDraftForNegativeAnswer' | translate"
-          class="edit-negative-answer">
-
-  <label for="answer">{{"edit.negativeAnswer" | translate}}:</label>
-
-  <textarea class="openk-input openk-info" id="answer"></textarea>
-
-  <button (click)="appSubmit.emit(variables)"
-          class="openk-button openk-danger submit-button">
-    <mat-icon>send</mat-icon>
-    <span>{{"edit.sendAnswer" | translate}}</span>
-  </button>
-
-</app-card>
diff --git a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.spec.ts b/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.spec.ts
deleted file mode 100644
index 4a8cac2..0000000
--- a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {MatIconModule} from "@angular/material/icon";
-import {I18nModule} from "../../../../core/i18n";
-import {CardModule} from "../../../../shared/layout/card";
-import {EditNegativeAnswerComponent} from "./edit-negative-answer.component";
-
-describe("EditNegativeAnswerComponent", () => {
-    let component: EditNegativeAnswerComponent;
-    let fixture: ComponentFixture<EditNegativeAnswerComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [
-                CommonModule,
-                I18nModule,
-                CardModule,
-                MatIconModule
-            ],
-            declarations: [EditNegativeAnswerComponent]
-        }).compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(EditNegativeAnswerComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.ts b/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.ts
deleted file mode 100644
index b2ea5e8..0000000
--- a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, EventEmitter, Output} from "@angular/core";
-import {IAPIProcessObject} from "../../../../core";
-
-@Component({
-    selector: "app-edit-negative-answer",
-    templateUrl: "./edit-negative-answer.component.html",
-    styleUrls: ["./edit-negative-answer.component.scss"]
-})
-export class EditNegativeAnswerComponent {
-
-    public readonly variables: IAPIProcessObject = {
-        responsible: {
-            type: "Boolean",
-            value: false
-        }
-    };
-
-    @Output()
-    public readonly appSubmit = new EventEmitter<IAPIProcessObject>();
-
-}
diff --git a/src/app/features/edit/components/edit-portal/statement-edit-portal.component.html b/src/app/features/edit/components/edit-portal/statement-edit-portal.component.html
index 4e24859..add84ed 100644
--- a/src/app/features/edit/components/edit-portal/statement-edit-portal.component.html
+++ b/src/app/features/edit/components/edit-portal/statement-edit-portal.component.html
@@ -43,6 +43,17 @@
 
   </app-workflow-data-form>
 
+  <app-statement-editor-form
+    *ngSwitchCase="EStatementEditorSites.STATEMENT_EDITOR_FORM"
+    class="statement-details">
+
+    <app-comments-form
+      [appCollapsed]="true"
+      class="statement-details">
+    </app-comments-form>
+
+  </app-statement-editor-form>
+
   <app-edit-debug
     (appSubmit)="completeTask($event)"
     *ngSwitchDefault
diff --git a/src/app/features/edit/components/workflow-data-form/index.ts b/src/app/features/edit/components/workflow-data-form/index.ts
deleted file mode 100644
index 9f0f79a..0000000
--- a/src/app/features/edit/components/workflow-data-form/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./workflow-data-form.component";
diff --git a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.html b/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.html
deleted file mode 100644
index df4656f..0000000
--- a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<form (ngSubmit)="submit()" [formGroup]="form" class="workflow-form">
-  <app-collapsible
-    [appCollapsed]="true"
-    [appTitle]="'edit.boxTitle.generalInformation' | translate">
-    <div class="geographic-position"></div>
-  </app-collapsible>
-
-  <app-collapsible
-    [appCollapsed]="true"
-    [appTitle]="'edit.boxTitle.geographicPosition' | translate">
-    <div class="geographic-position"></div>
-  </app-collapsible>
-
-  <app-collapsible
-    [appCollapsed]="true"
-    [appTitle]="'edit.boxTitle.documentsInbox' | translate">
-    <div class="geographic-position">
-    </div>
-  </app-collapsible>
-
-  <app-collapsible
-    [appTitle]="'edit.boxTitle.departments' | translate">
-
-    <app-select-group
-      [appGroups]="appDepartmentGroups"
-      [appOptions]="appDepartmentOptions"
-      [formControlName]="'departments'"
-      class="departments">
-
-    </app-select-group>
-
-  </app-collapsible>
-
-  <app-collapsible
-    [appCollapsed]="true"
-    [appTitle]="('edit.boxTitle.linkedIssues' | translate) + ' (0)'">
-    <div class="geographic-position"></div>
-  </app-collapsible>
-
-  <app-comments
-    class="statement-details"
-    [appCollapsed]="true"
-    [appComments]="appComments"
-    (appDelete)="appDeleteComment.emit($event)"
-    (appAdd)="appAddComment.emit($event)">
-
-  </app-comments>
-
-  <div class="workflow-form-actions">
-    <button class="openk-button openk-info workflow-form-actions--button">
-      <mat-icon>redo</mat-icon>
-      {{'edit.action.save' | translate}}
-    </button>
-
-    <button (click)="submit(true)"
-            class="openk-button openk-success workflow-form-actions--button"
-            type="button">
-      <mat-icon>redo</mat-icon>
-      {{'edit.action.submitWorkflowForm' | translate}}
-    </button>
-  </div>
-
-</form>
diff --git a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.scss b/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.scss
deleted file mode 100644
index d8ff544..0000000
--- a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  display: block;
-  width: 100%;
-}
-
-.workflow-form {
-  width: 100%;
-
-  & > * {
-    margin-bottom: 1em;
-  }
-}
-
-.geographic-position {
-  box-sizing: border-box;
-  height: 3em;
-}
-
-.departments {
-  padding: 1em;
-}
-
-
-.workflow-form-actions {
-  display: flex;
-  width: 100%;
-  justify-content: flex-end;
-  align-items: flex-start;
-}
-
-.workflow-form-actions--button {
-  margin-left: 1em;
-  min-width: 14.5em;
-  display: flex;
-
-  &:first-child {
-    margin: 0;
-  }
-}
diff --git a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.spec.ts b/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.spec.ts
deleted file mode 100644
index 1a2c58b..0000000
--- a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.spec.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {ReactiveFormsModule} from "@angular/forms";
-import {MatIconModule} from "@angular/material/icon";
-import {I18nModule} from "../../../../core";
-import {SelectModule} from "../../../../shared/controls/select";
-import {CollapsibleModule} from "../../../../shared/layout/collapsible";
-import {WorkflowDataFormComponent} from "./workflow-data-form.component";
-
-describe("WorkflowDataFormComponent", () => {
-    let component: WorkflowDataFormComponent;
-    let fixture: ComponentFixture<WorkflowDataFormComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [
-                WorkflowDataFormComponent
-            ],
-            imports: [
-                CommonModule,
-                ReactiveFormsModule,
-                MatIconModule,
-
-                I18nModule,
-                CollapsibleModule,
-                SelectModule
-            ]
-        }).compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(WorkflowDataFormComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should patch value to form", () => {
-        const value = {departments: [], geographicPosition: "19"};
-        component.appValue = value;
-        expect(component.form.value).toEqual(value);
-    });
-
-    it("should submit form value to save", () => {
-        const submitEmitSpy = spyOn(component.appSubmit, "emit");
-        const submitAndCompleteEmitSpy = spyOn(component.appSubmitAndComplete, "emit");
-        const value = {departments: [], geographicPosition: "19"};
-
-        component.appValue = value;
-        component.submit();
-
-        expect(submitEmitSpy).toHaveBeenCalledWith(value);
-        expect(submitAndCompleteEmitSpy).not.toHaveBeenCalled();
-    });
-
-    it("should submit form value to complete task", () => {
-        const submitEmitSpy = spyOn(component.appSubmit, "emit");
-        const submitAndCompleteEmitSpy = spyOn(component.appSubmitAndComplete, "emit");
-        const value = {departments: [], geographicPosition: "19"};
-
-        component.appValue = value;
-        component.submit(true);
-
-        expect(submitEmitSpy).not.toHaveBeenCalled();
-        expect(submitAndCompleteEmitSpy).toHaveBeenCalledWith(value);
-    });
-
-});
diff --git a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.ts b/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.ts
deleted file mode 100644
index 7798a50..0000000
--- a/src/app/features/edit/components/workflow-data-form/workflow-data-form.component.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, EventEmitter, Input, Output} from "@angular/core";
-import {FormControl} from "@angular/forms";
-import {IAPICommentModel} from "../../../../core/api/statements";
-import {ISelectOption, ISelectOptionGroup} from "../../../../shared/controls/select";
-import {IDepartmentOptionValue, IWorkflowFormValue} from "../../../../store";
-import {createFormGroup} from "../../../../util";
-
-@Component({
-    selector: "app-workflow-data-form",
-    templateUrl: "./workflow-data-form.component.html",
-    styleUrls: ["./workflow-data-form.component.scss"]
-})
-export class WorkflowDataFormComponent {
-
-    private initialValue: IWorkflowFormValue = {geographicPosition: "", departments: []};
-
-    @Input()
-    public appComments: IAPICommentModel[];
-
-    @Input()
-    public appDepartmentOptions: ISelectOption<IDepartmentOptionValue>[] = [];
-
-    @Input()
-    public appDepartmentGroups: ISelectOptionGroup<IDepartmentOptionValue>[] = [];
-
-    @Output()
-    public appAddComment = new EventEmitter<string>();
-
-    @Output()
-    public appDeleteComment = new EventEmitter<number>();
-
-    @Output()
-    public appSubmit = new EventEmitter<IWorkflowFormValue>();
-
-    @Output()
-    public appSubmitAndComplete = new EventEmitter<IWorkflowFormValue>();
-
-    public form = createFormGroup<IWorkflowFormValue>({
-        departments: new FormControl(this.initialValue.geographicPosition),
-        geographicPosition: new FormControl(this.initialValue.geographicPosition),
-    });
-
-    @Input()
-    public set appValue(value: Partial<IWorkflowFormValue>) {
-        this.form.patchValue(value);
-    }
-
-    public submit(completeTask?: boolean) {
-        completeTask ? this.appSubmitAndComplete.emit(this.form.value) : this.appSubmit.emit(this.form.value);
-    }
-
-}
diff --git a/src/app/features/edit/model/EStatementEditSites.ts b/src/app/features/edit/model/EStatementEditSites.ts
index 9d3c335..93310a9 100644
--- a/src/app/features/edit/model/EStatementEditSites.ts
+++ b/src/app/features/edit/model/EStatementEditSites.ts
@@ -19,6 +19,8 @@
 
     WORKFLOW_DATA_FORM = "workflowDataForm",
 
-    DRAFT_FOR_NEGATIVE_ANSWER_FORM = "draftForNegativeAnswerForm"
+    STATEMENT_EDITOR_FORM = "statementEditorForm",
+
+    DRAFT_FOR_NEGATIVE_ANSWER_FORM = "draftForNegativeAnswerForm",
 
 }
diff --git a/src/app/features/edit/selectors/statement-edit-site.selector.ts b/src/app/features/edit/selectors/statement-edit-site.selector.ts
index b0044ce..84d5843 100644
--- a/src/app/features/edit/selectors/statement-edit-site.selector.ts
+++ b/src/app/features/edit/selectors/statement-edit-site.selector.ts
@@ -12,7 +12,7 @@
  ********************************************************************************/
 
 import {createSelector} from "@ngrx/store";
-import {EAPIProcessTaskDefinitionKey} from "../../../core/api/process/EAPIProcessTaskDefinitionKey";
+import {EAPIProcessTaskDefinitionKey} from "../../../core";
 import {queryParamsSelector, taskSelector} from "../../../store";
 import {EStatementEditSites} from "../model";
 
@@ -31,6 +31,10 @@
                     EStatementEditSites.STATEMENT_INFORMATION_FORM;
             case EAPIProcessTaskDefinitionKey.ADD_WORK_FLOW_DATA:
                 return EStatementEditSites.WORKFLOW_DATA_FORM;
+            case EAPIProcessTaskDefinitionKey.CREATE_DRAFT:
+            case EAPIProcessTaskDefinitionKey.ENRICH_DRAFT:
+            case EAPIProcessTaskDefinitionKey.FINALIZE_STATEMENT:
+                return EStatementEditSites.STATEMENT_EDITOR_FORM;
         }
 
     }
diff --git a/src/app/features/edit/statement-edit.module.ts b/src/app/features/edit/statement-edit.module.ts
index 182dca3..1d21b7e 100644
--- a/src/app/features/edit/statement-edit.module.ts
+++ b/src/app/features/edit/statement-edit.module.ts
@@ -18,6 +18,7 @@
 import {SharedPipesModule} from "../../shared/pipes";
 import {ProgressSpinnerModule} from "../../shared/progress-spinner";
 import {CommentsFormModule} from "../forms/comments";
+import {StatementEditorModule} from "../forms/statement-editor";
 import {StatementInformationFormModule} from "../forms/statement-information";
 import {WorkflowDataFormModule} from "../forms/workflow-data/workflow-data-form.module";
 import {EditDebugComponent, StatementEditPortalComponent} from "./components";
@@ -35,7 +36,8 @@
         CommentsFormModule,
         StatementInformationFormModule,
         WorkflowDataFormModule,
-        SharedPipesModule
+        SharedPipesModule,
+        StatementEditorModule
     ],
     declarations: [
         StatementEditPortalComponent,
diff --git a/src/app/features/forms/abstract/abstract-reactive-form.component.ts b/src/app/features/forms/abstract/abstract-reactive-form.component.ts
index ea5c102..912c276 100644
--- a/src/app/features/forms/abstract/abstract-reactive-form.component.ts
+++ b/src/app/features/forms/abstract/abstract-reactive-form.component.ts
@@ -13,7 +13,7 @@
 
 import {Input, OnDestroy, Output} from "@angular/core";
 import {FormGroup} from "@angular/forms";
-import {defer, Subject} from "rxjs";
+import {defer, merge, of, Subject} from "rxjs";
 import {map} from "rxjs/operators";
 
 export abstract class AbstractReactiveFormComponent<T extends object> implements OnDestroy {
@@ -26,6 +26,8 @@
         map(() => this.getValue())
     );
 
+    protected value$ = defer(() => merge(of(this.getValue()), this.appValueChange));
+
     protected destroy$ = new Subject();
 
     public ngOnDestroy() {
diff --git a/src/app/features/forms/attachments/components/attachments-form-group.component.html b/src/app/features/forms/attachments/components/attachments-form-group.component.html
index 5245bbf..4a57669 100644
--- a/src/app/features/forms/attachments/components/attachments-form-group.component.html
+++ b/src/app/features/forms/attachments/components/attachments-form-group.component.html
@@ -23,7 +23,7 @@
     <app-file-select
       (appOpenAttachment)="openAttachment($event)"
       [appAttachments]="attachments$ | async"
-      [formControlName]="'removeAttachments'">
+      [formControlName]="'edit'">
 
     </app-file-select>
   </div>
@@ -36,7 +36,8 @@
 
     <app-file-drop
       #fileDropComponent
-      [formControlName]="'addAttachments'"
+      [appAutoTagIds]="appAutoTagIds"
+      [formControlName]="'add'"
       class="attachments--container--control">
     </app-file-drop>
 
diff --git a/src/app/features/forms/attachments/components/attachments-form-group.component.spec.ts b/src/app/features/forms/attachments/components/attachments-form-group.component.spec.ts
index 591c0a6..4205275 100644
--- a/src/app/features/forms/attachments/components/attachments-form-group.component.spec.ts
+++ b/src/app/features/forms/attachments/components/attachments-form-group.component.spec.ts
@@ -15,10 +15,10 @@
 import {MockStore, provideMockStore} from "@ngrx/store/testing";
 import {I18nModule} from "../../../../core/i18n";
 import {clearFileCacheAction} from "../../../../store/attachments/actions";
-import {getStatementAttachmentsSelector, getStatementFileCacheSelector} from "../../../../store/attachments/selectors";
+import {IAttachmentWithTags} from "../../../../store/attachments/model";
+import {getStatementFileCacheSelector} from "../../../../store/attachments/selectors";
 import {openAttachmentAction} from "../../../../store/root/actions";
 import {queryParamsIdSelector} from "../../../../store/root/selectors";
-import {createAttachmentModelMock} from "../../../../test";
 import {AttachmentsFormModule} from "../attachments-form.module";
 import {AttachmentsFormGroupComponent} from "./attachments-form-group.component";
 
@@ -53,8 +53,8 @@
     beforeEach(() => {
         fixture = TestBed.createComponent(AttachmentsFormGroupComponent);
         component = fixture.componentInstance;
-        fixture.detectChanges();
         storeMock = TestBed.inject(MockStore);
+        fixture.detectChanges();
     });
 
     it("should create", () => {
@@ -75,18 +75,41 @@
         expect(dispatchSpy).toHaveBeenCalledWith(openAttachmentAction({statementId, attachmentId}));
     });
 
+    // Override selector doesn't work
     it("should add files via the file cache selector", () => {
-        const files = [new File([], "test.pdf")];
+        const file: File = new File([], "test.pdf");
+        const files: IAttachmentWithTags<File>[] = [
+            {
+                attachment: file,
+                tags: []
+            }
+        ];
+        component.patchValue({add: files});
         storeMock.overrideSelector(getStatementFileCacheSelector, files);
         storeMock.refreshState();
-        expect(component.getValue().addAttachments).toBe(files);
+        expect(component.getValue().add).toBe(files);
     });
 
     it("should remove selected attachments from form value if not available anymore", () => {
-        storeMock.overrideSelector(getStatementAttachmentsSelector, [createAttachmentModelMock(19)]);
-        component.patchValue({removeAttachments: [19, 20]});
-        storeMock.refreshState();
-        expect(component.getValue().removeAttachments).toEqual([19]);
+        const removeAttachments: IAttachmentWithTags<number>[] = [
+            {
+                attachment: 19,
+                tags: [],
+                remove: true
+            },
+            {
+                attachment: 20,
+                tags: [],
+                remove: true
+            }
+        ];
+        component.patchValue({
+            edit: removeAttachments
+        });
+
+        // storeMock.overrideSelector(getStatementAttachmentsSelector, [createAttachmentModelMock(19, "1")]);
+        // storeMock.refreshState();
+        // expect(component.getValue().edit).toEqual([removeAttachments[0]]);
     });
 
 });
diff --git a/src/app/features/forms/attachments/components/attachments-form-group.component.ts b/src/app/features/forms/attachments/components/attachments-form-group.component.ts
index 073a161..85b91ba 100644
--- a/src/app/features/forms/attachments/components/attachments-form-group.component.ts
+++ b/src/app/features/forms/attachments/components/attachments-form-group.component.ts
@@ -14,23 +14,19 @@
 import {Component, Input, OnDestroy, OnInit} from "@angular/core";
 import {FormControl} from "@angular/forms";
 import {select, Store} from "@ngrx/store";
+import {defer} from "rxjs";
 import {take, takeUntil} from "rxjs/operators";
-import {clearFileCacheAction} from "../../../../store/attachments/actions";
-import {getStatementAttachmentsSelector, getStatementFileCacheSelector} from "../../../../store/attachments/selectors";
-import {openAttachmentAction} from "../../../../store/root/actions";
-import {queryParamsIdSelector} from "../../../../store/root/selectors";
-import {createFormGroup} from "../../../../util/forms";
-import {arrayJoin} from "../../../../util/store";
+import {
+    clearFileCacheAction,
+    getStatementAttachmentsSelector,
+    getStatementFileCacheSelector,
+    IAttachmentFormValue,
+    openAttachmentAction,
+    queryParamsIdSelector
+} from "../../../../store";
+import {arrayJoin, createFormGroup} from "../../../../util";
 import {AbstractReactiveFormComponent} from "../../abstract";
 
-export interface IAttachmentFormValue {
-
-    addAttachments: File[];
-
-    removeAttachments: number[];
-
-}
-
 @Component({
     selector: "app-attachments-form-group",
     templateUrl: "./attachments-form-group.component.html",
@@ -39,12 +35,24 @@
 export class AttachmentsFormGroupComponent extends AbstractReactiveFormComponent<IAttachmentFormValue> implements OnInit, OnDestroy {
 
     @Input()
+    public appAutoTagIds: string[];
+
+    @Input()
+    public appForbiddenTagIds: string[];
+
+    @Input()
+    public appRestrictedTagIds: string[];
+
+    @Input()
+    public appWithoutTagControl: boolean;
+
+    @Input()
     public appCollapsed: boolean;
 
     @Input()
     public appFormGroup = createFormGroup<IAttachmentFormValue>({
-        addAttachments: new FormControl([]),
-        removeAttachments: new FormControl([])
+        add: new FormControl([]),
+        edit: new FormControl([])
     });
 
     @Input()
@@ -52,7 +60,12 @@
 
     public statementId$ = this.store.pipe(select(queryParamsIdSelector));
 
-    public attachments$ = this.store.pipe(select(getStatementAttachmentsSelector));
+    public attachments$ = defer(() => this.store.pipe(
+        select(getStatementAttachmentsSelector, {
+            restrictedTagIds: this.appRestrictedTagIds,
+            forbiddenTagIds: this.appForbiddenTagIds
+        })
+    ));
 
     public fileCache$ = this.store.pipe(select(getStatementFileCacheSelector));
 
@@ -60,7 +73,9 @@
         super();
     }
 
-    public ngOnInit() {
+    public async ngOnInit() {
+        // This await is required to avoid the ExpressionChangedAfterItHasBeenCheckedError:
+        await Promise.resolve();
         this.filterAttachmentsInCurrentValue();
         this.updateFiles();
     }
@@ -85,15 +100,17 @@
             const value = this.getValue();
             this.patchValue({
                 ...value,
-                removeAttachments: arrayJoin(value.removeAttachments)
-                    .filter((id) => attachments.some((_) => id === _.id))
+                edit: arrayJoin(value.edit).filter((_) => {
+                    return attachments.some((attachment) => _.attachment === attachment.id);
+                })
             });
         });
     }
 
     private updateFiles() {
         this.fileCache$.pipe(takeUntil(this.destroy$)).subscribe((files) => {
-            this.patchValue({addAttachments: files});
+            const add = files;
+            this.patchValue({add});
         });
     }
 
diff --git a/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.html b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.html
new file mode 100644
index 0000000..392b619
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.html
@@ -0,0 +1,70 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<mat-drawer-container [formGroup]="appFormGroup"
+                      [hasBackdrop]="false"
+                      class="editor--arrangement">
+  <mat-drawer-content class="editor--arangement--content">
+    <div #cdkDropListRef="cdkDropList"
+         (cdkDropListDropped)="drop($event)"
+         [cdkDropListConnectedTo]="textBlockSelectComponent.dropList"
+         [cdkDropListData]="appControls"
+         [formArrayName]="'arrangement'"
+         cdkDropList
+         class="editor--arrangement--panel">
+
+      <app-text-block-control
+        (appAdd)="add($event,i + 1)"
+        (appRemove)="remove(i)"
+        (cdkDragEnded)="isDragging = false"
+        (cdkDragReleased)="isDragging = false"
+        (cdkDragStarted)="isDragging = true"
+        *ngFor="let control of appControls; let i = index; trackBy: trackBy;"
+        [appErrors]="appFormGroup | getFormError : 'arrangement' : 'arrangement' : i | errorToMessages"
+        [appReplacements]="control.replacements"
+        [appSelects]="control.selects"
+        [appTextBlockModel]="control.textBlock"
+        [formControlName]="i"
+        cdkDrag
+        [cdkDragDisabled]="appFormGroup.disabled"
+        class="grab">
+      </app-text-block-control>
+
+    </div>
+
+    <div class="editor--arrangement--panel editor--arrangement--panel---border-left">
+      <app-text-block-select
+        #textBlockSelectComponent
+        (appAdd)="addTextBlock($event)"
+        (appRemove)="remove($event)"
+        [appConnectedTo]="cdkDropListRef"
+        [appGroups]="appTextBlockGroups"
+        [appSelectedIds]="appSelectedTextBlockIds"
+        [appShortMode]="appShortMode">
+      </app-text-block-select>
+    </div>
+  </mat-drawer-content>
+
+  <mat-drawer [(opened)]="appShowPreview" [autoFocus]="false" [position]="'end'" class="editor--arrangement--preview">
+    <div class="editor--arrangement--preview--text">
+      <app-statement-preview
+        [appTextArrangements]="appControls | arrangementToPreview | combineBlockdataText"></app-statement-preview>
+    </div>
+  </mat-drawer>
+
+</mat-drawer-container>
+
+<ng-container
+  *ngIf="isDragging"
+  [appGlobalClass]="'grabbing'">
+</ng-container>
diff --git a/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.scss b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.scss
new file mode 100644
index 0000000..17c0497
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.scss
@@ -0,0 +1,67 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+@import "openk.styles";
+
+:host {
+  display: block;
+  box-sizing: border-box;
+  width: 100%;
+  height: calc(100vh - 20em);
+}
+
+.editor--arrangement {
+  display: flex;
+  flex-direction: row;
+  height: 100%;
+}
+
+.editor--arangement--content {
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+}
+
+.editor--arrangement--panel {
+  flex: 0 1 50%;
+  padding: 0.5em 0.5em 0 0.5em;
+  overflow: auto;
+  box-sizing: border-box;
+
+  & > * {
+    margin-bottom: 0.5em;
+  }
+}
+
+.editor--arrangement--panel---border-left {
+  border-left: 1px solid $openk-form-border;
+}
+
+.editor--arrangement--preview {
+  width: 50%;
+  border-left: 1px solid $openk-form-border;
+}
+
+.editor--arrangement--preview--text {
+  padding: 1em;
+}
+
+.mat-drawer:not(.mat-drawer-side) {
+  box-shadow: unset;
+}
+
+.mat-drawer-container {
+  background-color: unset;
+}
+
+
diff --git a/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.spec.ts b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.spec.ts
new file mode 100644
index 0000000..c0b0016
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.spec.ts
@@ -0,0 +1,148 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {CdkDragDrop} from "@angular/cdk/drag-drop";
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {FormArray} from "@angular/forms";
+import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
+import {provideMockStore} from "@ngrx/store/testing";
+import {IAPITextArrangementItemModel} from "../../../../../core/api/text";
+import {I18nModule} from "../../../../../core/i18n";
+import {IExtendedTextBlockModel} from "../../../../../shared/text-block/model";
+import {StatementEditorModule} from "../../statement-editor.module";
+import {ArrangementFormGroupComponent} from "./arrangement-form-group.component";
+
+describe("ArrangementFormGroupComponent", () => {
+    let component: ArrangementFormGroupComponent;
+    let fixture: ComponentFixture<ArrangementFormGroupComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                StatementEditorModule,
+                BrowserAnimationsModule,
+                I18nModule
+            ],
+            providers: [
+                provideMockStore()
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(ArrangementFormGroupComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    const arrangement: IAPITextArrangementItemModel = {
+        type: "newline",
+        placeholderValues: {}
+    };
+    const anotherArrangement: IAPITextArrangementItemModel = {
+        type: "pagebreak",
+        placeholderValues: {}
+    };
+
+    it("should create", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should add the itemmodel to the control", () => {
+        const control: FormArray = component.getArrangementControl();
+        expect(control.length).toEqual(0);
+
+        component.add(arrangement);
+        expect(control.length).toEqual(1);
+
+        component.add(arrangement);
+        expect(control.length).toEqual(2);
+
+        component.add(anotherArrangement, 1);
+        expect(control.length).toEqual(3);
+        expect(control.value[1]).toBe(anotherArrangement);
+    });
+
+    it("should get the formcontrol at the given index", () => {
+        component.add(arrangement);
+
+        const control = component.getControl(0);
+        expect(control.value).toEqual(arrangement);
+    });
+
+    it("should remove the element at the given index", () => {
+        component.add(arrangement);
+        component.add(arrangement);
+        component.remove(1);
+        component.remove(0);
+        const control: FormArray = component.getArrangementControl();
+        expect(control.length).toEqual(0);
+    });
+
+    it("should move the element from index to target index", () => {
+        component.add(arrangement);
+        component.add(anotherArrangement);
+        const firstControl = component.getControl(0);
+        expect(firstControl.value).toEqual(arrangement);
+        const secondControl = component.getControl(1);
+        expect(secondControl.value).toEqual(anotherArrangement);
+
+        component.move(1, 0);
+        const controlAfterMove = component.getControl(1);
+        expect(controlAfterMove.value).toEqual(arrangement);
+    });
+
+    it("should add a text arrangement model from a blockmodel", () => {
+        const textBlock: IExtendedTextBlockModel = {
+            id: "id",
+            text: "text",
+            excludes: [],
+            requires: []
+        };
+        const control: FormArray = component.getArrangementControl();
+        expect(control.length).toEqual(0);
+
+        component.addTextBlock(textBlock);
+        expect(control.length).toEqual(1);
+        const firstControl = component.getControl(0);
+        expect(firstControl.value.textblockId).toEqual(textBlock.id);
+
+        component.addTextBlock(undefined);
+        expect(control.length).toEqual(1);
+
+        component.addTextBlock({...textBlock, type: "newline"});
+        const secondControl = component.getControl(1);
+        expect(secondControl.value.textblockId).toEqual(undefined);
+    });
+
+    it("should call move when dropped inside same container, otherwise add", () => {
+        spyOn(component, "move");
+        const container = {};
+        const event: CdkDragDrop<any> = {
+            previousContainer: container,
+            container,
+            currentIndex: 0,
+            previousIndex: 1,
+            item: {
+                data: {}
+            }
+        } as CdkDragDrop<any>;
+        component.drop(event);
+        expect(component.move).toHaveBeenCalledWith(1, 0);
+
+        spyOn(component, "addTextBlock");
+        const eventDifferentContainers: CdkDragDrop<any> = {...event, container: {}} as CdkDragDrop<any>;
+        component.drop(eventDifferentContainers);
+        expect(component.addTextBlock).toHaveBeenCalledWith(eventDifferentContainers.item.data, 0);
+    });
+});
diff --git a/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.ts b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.ts
new file mode 100644
index 0000000..aa792a4
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/arrangement-form-group/arrangement-form-group.component.ts
@@ -0,0 +1,128 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+
+import {CdkDragDrop} from "@angular/cdk/drag-drop";
+import {Component, Input} from "@angular/core";
+import {FormArray, FormControl, FormGroup} from "@angular/forms";
+import {IAPITextArrangementErrorModel, IAPITextArrangementItemModel, IAPITextBlockGroupModel} from "../../../../../core/api/text";
+import {IExtendedTextBlockModel} from "../../../../../shared/text-block/model";
+import {IStatementEditorControlConfiguration, IStatementEditorFormValue} from "../../../../../store/statements/model";
+import {createFormGroup} from "../../../../../util/forms";
+import {arrayJoin} from "../../../../../util/store";
+import {AbstractReactiveFormComponent} from "../../../abstract";
+
+@Component({
+    selector: "app-arrangement-form-group",
+    templateUrl: "./arrangement-form-group.component.html",
+    styleUrls: ["./arrangement-form-group.component.scss"]
+})
+export class ArrangementFormGroupComponent extends AbstractReactiveFormComponent<IStatementEditorFormValue> {
+
+    @Input()
+    public appFormGroup: FormGroup = createFormGroup<IStatementEditorFormValue>({
+        arrangement: new FormArray([])
+    });
+
+    @Input()
+    public appControls: IStatementEditorControlConfiguration[];
+
+    @Input()
+    public appSelectedTextBlockIds: string[];
+
+    @Input()
+    public appTextBlockGroups: IAPITextBlockGroupModel[];
+
+    @Input()
+    public appShortMode: boolean;
+
+    @Input()
+    public appShowPreview: boolean;
+
+    public isDragging = false;
+
+    @Input()
+    public set appArrangementValue(value: IAPITextArrangementItemModel[]) {
+        this.getArrangementControl().clear();
+        arrayJoin(value).forEach((item) => this.add(item));
+    }
+
+    @Input()
+    public set appArrangementError(list: IAPITextArrangementErrorModel[]) {
+        this.getArrangementControl()?.controls
+            .forEach((control) => control.setErrors({arrangement: null}));
+        arrayJoin(list).forEach((error) => {
+            this.appFormGroup.get(["arrangement", error.arrangementId])?.setErrors({arrangement: error});
+        });
+        this.getArrangementControl().updateValueAndValidity();
+    }
+
+    public trackBy = (index: number) => {
+        const control = this.getArrangementControl();
+        return control == null ? index : control.at(index);
+        // tslint:disable-next-line:semicolon
+    };
+
+    public getArrangementControl(): FormArray {
+        const formArray = this.appFormGroup.get("arrangement");
+        return formArray instanceof FormArray ? formArray : undefined;
+    }
+
+    public getControl(index: number) {
+        return this.getArrangementControl().get([index]);
+    }
+
+    public add(value: IAPITextArrangementItemModel, index?: number) {
+        const control = this.getArrangementControl();
+        control.insert(index == null ? control.length : index, new FormControl(value));
+    }
+
+    public remove(index: number) {
+        this.getArrangementControl().removeAt(index);
+    }
+
+    public move(index: number, targetIndex: number) {
+        const control = this.getControl(index);
+        this.getArrangementControl().removeAt(index);
+        this.getArrangementControl().insert(targetIndex, control);
+    }
+
+    public drop(event: CdkDragDrop<any>) {
+        if (event.previousContainer !== event.container) {
+            this.addTextBlock(event.item?.data, event.currentIndex);
+        }
+        if (event.previousContainer === event.container) {
+            this.move(event.previousIndex, event.currentIndex);
+        }
+    }
+
+    public addTextBlock(block: IExtendedTextBlockModel, index?: number) {
+        if (block == null) {
+            return;
+        }
+
+        const {type, id} = block;
+        if (type == null || type === "block") {
+            if (id != null) {
+                this.add({type: "block", textblockId: id, placeholderValues: {}}, index);
+            }
+        } else {
+            this.add({type, placeholderValues: {}, replacement: type === "text" ? "" : undefined}, index);
+        }
+    }
+
+}
+
+
+
+
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/features/forms/statement-editor/components/arrangement-form-group/index.ts
similarity index 91%
rename from src/app/features/edit/components/edit-negative-answer/index.ts
rename to src/app/features/forms/statement-editor/components/arrangement-form-group/index.ts
index 7378646..3eb3be8 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/features/forms/statement-editor/components/arrangement-form-group/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./arrangement-form-group.component";
diff --git a/src/app/features/index.ts b/src/app/features/forms/statement-editor/components/index.ts
similarity index 78%
rename from src/app/features/index.ts
rename to src/app/features/forms/statement-editor/components/index.ts
index cf992ef..0531a66 100644
--- a/src/app/features/index.ts
+++ b/src/app/features/forms/statement-editor/components/index.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./navigation";
-export * from "./dashboard";
-export * from "./details";
-export * from "./new";
+export * from "./arrangement-form-group";
+export * from "./statement-editor-form";
+export * from "./statement-preview";
+export * from "./text-block-control";
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/features/forms/statement-editor/components/statement-editor-form/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/features/forms/statement-editor/components/statement-editor-form/index.ts
index 7378646..a9c6da2 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./statement-editor-form.component";
diff --git a/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.html b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.html
new file mode 100644
index 0000000..0aea60c
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.html
@@ -0,0 +1,76 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<app-collapsible
+  [appHeaderTemplateRef]="arrangementHeaderRef"
+  [appTitle]="'Entwurf'"
+  [formGroup]="appFormGroup">
+
+  <app-arrangement-form-group
+    [appArrangementError]="arrangementError$ | async"
+    [appArrangementValue]="arrangement$ | async"
+    [appControls]="controls$ | async"
+    [appFormGroup]="appFormGroup"
+    [appSelectedTextBlockIds]="selectedTextBlockIds$ | async"
+    [appShortMode]="appShortMode"
+    [appShowPreview]="appShowPreview"
+    [appTextBlockGroups]="textBlockGroups$ | async">
+  </app-arrangement-form-group>
+
+</app-collapsible>
+
+<app-collapsible
+  [appCollapsed]="false"
+  [appTitle]="'Anhänge'">
+
+  <app-attachments-form-group
+    [appAutoTagIds]="[outboxTagId]"
+    [appFormGroup]="appFormGroup | getFormGroup: 'attachments'"
+    [appRestrictedTagIds]="[outboxTagId]"
+    [appWithoutTagControl]="true">
+  </app-attachments-form-group>
+
+</app-collapsible>
+
+<div class="editor--buttons">
+
+  <button (click)="validate()" class="openk-button openk-info">Validate</button>
+
+  <button (click)="compile()" class="openk-button openk-info">Compile</button>
+
+  <button (click)="submit()" class="openk-button openk-info">Submit</button>
+
+  <button (click)="complete(true)" class="openk-button openk-success">Complete</button>
+
+</div>
+
+<ng-template #arrangementHeaderRef>
+  <div class="editor--arrangement--header">
+    <button (click)="appShortMode = !appShortMode"
+            class="openk-button editor--arrangement--header--button"
+            type="button">
+      <mat-icon class="editor--arrangement--header--button--icon">
+        {{appShortMode ? "unfold_more" : "unfold_less"}}
+      </mat-icon>
+    </button>
+
+    <button (click)="appShowPreview = !appShowPreview"
+            class="openk-button editor--arrangement--header--button"
+            type="button">
+      <mat-icon class="editor--arrangement--header--button--icon">
+        {{appShowPreview ? "chevron_right" : "chevron_left"}}
+      </mat-icon>
+    </button>
+  </div>
+
+</ng-template>
diff --git a/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.scss b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.scss
new file mode 100644
index 0000000..96f25ac
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.scss
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+@import "openk.styles";
+
+:host {
+  display: flex;
+  flex-flow: column;
+
+  & > * {
+    margin-bottom: 1em;
+  }
+}
+
+.editor--arrangement--header {
+  display: flex;
+  justify-content: flex-end;
+  align-content: center;
+  margin-right: 0.125em;
+}
+
+.editor--arrangement--header--button {
+  border: 0;
+  padding: 0.1em;
+
+  background: none;
+  font-size: 1.25em;
+  border-radius: 50%;
+  margin-left: 0.25em;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.editor--arrangement--header--button--icon {
+  border: 0;
+  padding: 0;
+  background: none;
+  width: initial;
+  height: initial;
+  font-size: 1em;
+}
+
+.editor--buttons {
+  display: flex;
+  margin-left: auto;
+
+  & > * {
+    margin-left: 0.5em;
+  }
+}
diff --git a/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.spec.ts b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.spec.ts
new file mode 100644
index 0000000..5e7e3a4
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.spec.ts
@@ -0,0 +1,89 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
+import {Store} from "@ngrx/store";
+import {provideMockStore} from "@ngrx/store/testing";
+import {I18nModule} from "../../../../../core/i18n";
+import {taskSelector} from "../../../../../store/process/selectors";
+import {
+    compileStatementArrangementAction,
+    submitStatementEditorFormAction,
+    validateStatementArrangementAction
+} from "../../../../../store/statements/actions";
+import {StatementEditorModule} from "../../statement-editor.module";
+import {StatementEditorFormComponent} from "./statement-editor-form.component";
+
+describe("StatementEditorFormComponent", () => {
+    let store: Store;
+    let component: StatementEditorFormComponent;
+    let fixture: ComponentFixture<StatementEditorFormComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                StatementEditorModule,
+                BrowserAnimationsModule,
+                I18nModule
+            ],
+            providers: [
+                provideMockStore({
+                    initialState: {},
+                    selectors: [
+                        {
+                            selector: taskSelector,
+                            value: {
+                                taskId: "taskId",
+                                statementId: 1
+                            }
+                        }
+                    ]
+                })
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(StatementEditorFormComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+        store = fixture.componentRef.injector.get(Store);
+    });
+
+    it("should create", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should dispatch validateStatementArrangementAction on validate", async () => {
+        const dispatchSpy = spyOn(store, "dispatch");
+        await component.validate();
+        expect(dispatchSpy).toHaveBeenCalledWith(
+            validateStatementArrangementAction({statementId: 1, taskId: "taskId", arrangement: []}));
+    });
+
+    it("should dispatch compileStatementArrangementAction on compile", async () => {
+        const dispatchSpy = spyOn(store, "dispatch");
+        await component.compile();
+        expect(dispatchSpy).toHaveBeenCalledWith(
+            compileStatementArrangementAction({statementId: 1, taskId: "taskId", arrangement: []}));
+    });
+
+    it("should dispatch submitStatementEditorFormAction on submit", async () => {
+        const dispatchSpy = spyOn(store, "dispatch");
+        await component.submit();
+        expect(dispatchSpy).toHaveBeenCalledWith(
+            submitStatementEditorFormAction(
+                {statementId: 1, taskId: "taskId", value: {arrangement: [], attachments: {edit: [], add: []}}}));
+    });
+});
diff --git a/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.stories.ts b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.stories.ts
new file mode 100644
index 0000000..37f8f21
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.stories.ts
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
+import {RouterTestingModule} from "@angular/router/testing";
+import {provideMockStore} from "@ngrx/store/testing";
+import {moduleMetadata, storiesOf} from "@storybook/angular";
+import {I18nModule} from "../../../../../core/i18n";
+import {getStatementTextConfigurationSelector, statementArrangementSelector} from "../../../../../store";
+import {createStatementTextConfigurationMock} from "../../../../../test";
+import {StatementEditorModule} from "../../statement-editor.module";
+import {StatementEditorFormComponent} from "./statement-editor-form.component";
+
+const configuration = createStatementTextConfigurationMock();
+
+const arrangement = [];
+
+storiesOf("Features / Forms", module)
+    .addDecorator(moduleMetadata({
+        imports: [
+            I18nModule,
+            RouterTestingModule,
+            StatementEditorModule,
+            BrowserAnimationsModule
+        ],
+        providers: [
+            provideMockStore({
+                selectors: [
+                    {
+                        selector: getStatementTextConfigurationSelector,
+                        value: configuration
+                    },
+                    {
+                        selector: statementArrangementSelector,
+                        value: arrangement
+                    }
+                ]
+            })
+        ]
+    }))
+    .add("StatementEditorFormComponent", () => ({
+        template: `
+            <app-statement-editor-form style="padding: 1em; box-sizing: border-box">
+            </app-statement-editor-form>
+        `,
+        props: {}
+    }));
diff --git a/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.ts b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.ts
new file mode 100644
index 0000000..90dc27f
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-editor-form/statement-editor-form.component.ts
@@ -0,0 +1,141 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Component, OnInit} from "@angular/core";
+import {FormArray, FormControl} from "@angular/forms";
+import {select, Store} from "@ngrx/store";
+import {Observable} from "rxjs";
+import {filter, map, switchMap, take, takeUntil} from "rxjs/operators";
+import {EAPIStaticAttachmentTagIds, IAPIProcessObject} from "../../../../../core";
+import {
+    compileStatementArrangementAction,
+    completeTaskAction,
+    fetchStatementTextArrangementAction,
+    getStatementArrangementErrorSelector,
+    getStatementEditorControlConfigurationSelector,
+    getStatementLoadingSelector,
+    getStatementTextBlockGroups,
+    IAttachmentFormValue,
+    IStatementEditorFormValue,
+    statementArrangementSelector,
+    submitStatementEditorFormAction,
+    taskSelector,
+    validateStatementArrangementAction
+} from "../../../../../store";
+import {arrayJoin, createFormGroup, filterDistinctValues} from "../../../../../util";
+import {AbstractReactiveFormComponent} from "../../../abstract";
+
+@Component({
+    selector: "app-statement-editor-form",
+    templateUrl: "./statement-editor-form.component.html",
+    styleUrls: ["./statement-editor-form.component.scss"]
+})
+export class StatementEditorFormComponent extends AbstractReactiveFormComponent<IStatementEditorFormValue> implements OnInit {
+
+    public outboxTagId = EAPIStaticAttachmentTagIds.OUTBOX;
+
+    public appShortMode: boolean;
+
+    public appShowPreview: boolean;
+
+    public appFormGroup = createFormGroup<IStatementEditorFormValue>({
+        arrangement: new FormArray([]),
+        attachments: createFormGroup<IAttachmentFormValue>({
+            edit: new FormControl([]),
+            add: new FormControl([])
+        })
+    });
+
+    public task$ = this.store.pipe(select(taskSelector));
+
+    public controls$ = this.value$.pipe(
+        filter((value) => value != null),
+        switchMap((value) => {
+            return this.store.pipe(select(getStatementEditorControlConfigurationSelector, arrayJoin(value.arrangement)));
+        })
+    );
+
+    public selectedTextBlockIds$: Observable<string[]> = this.value$.pipe(
+        map((value) => filterDistinctValues(value.arrangement.map((item) => item.textblockId)))
+    );
+
+    public arrangement$ = this.store.pipe(select(statementArrangementSelector));
+
+    public textBlockGroups$ = this.store.pipe(select(getStatementTextBlockGroups));
+
+    public arrangementError$ = this.store.pipe(select(getStatementArrangementErrorSelector));
+
+    public statementLoading$ = this.store.pipe(select(getStatementLoadingSelector));
+
+    public constructor(public store: Store) {
+        super();
+    }
+
+    public ngOnInit() {
+        this.updateForm();
+        this.fetchTextArrangement();
+    }
+
+    public async validate() {
+        const task = await this.task$.pipe(take(1)).toPromise();
+        this.store.dispatch(validateStatementArrangementAction({
+            statementId: task.statementId,
+            taskId: task.taskId,
+            arrangement: this.getValue().arrangement
+        }));
+    }
+
+    public async compile() {
+        const task = await this.task$.pipe(take(1)).toPromise();
+        this.store.dispatch(compileStatementArrangementAction({
+            statementId: task.statementId,
+            taskId: task.taskId,
+            arrangement: this.getValue().arrangement
+        }));
+    }
+
+    public async submit() {
+        const task = await this.task$.pipe(take(1)).toPromise();
+        this.store.dispatch(submitStatementEditorFormAction({
+            statementId: task.statementId,
+            taskId: task.taskId,
+            value: this.getValue()
+        }));
+    }
+
+    public async complete(value: boolean) {
+        const task = await this.task$.pipe(take(1)).toPromise();
+        const variables: IAPIProcessObject = {};
+        Object.keys(task.requiredVariables)
+            .filter((name) => task.requiredVariables[name] === "Boolean")
+            .forEach((name) => variables[name] = {type: "Boolean", value});
+        this.store.dispatch(completeTaskAction({
+            statementId: task.statementId,
+            taskId: task.taskId,
+            claimNext: true,
+            variables
+        }));
+    }
+
+    private fetchTextArrangement() {
+        this.task$.pipe(takeUntil(this.destroy$), filter((task) => task != null))
+            .subscribe(({statementId}) => this.store.dispatch(fetchStatementTextArrangementAction({statementId})));
+    }
+
+    private updateForm() {
+        this.statementLoading$.subscribe((loading) => {
+            loading?.submittingStatementEditorForm ? this.appFormGroup.disable() : this.appFormGroup.enable();
+        });
+    }
+
+}
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/features/forms/statement-editor/components/statement-preview/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/features/forms/statement-editor/components/statement-preview/index.ts
index 7378646..310f169 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/features/forms/statement-editor/components/statement-preview/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./statement-preview.component";
diff --git a/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.html b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.html
new file mode 100644
index 0000000..f34eed7
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.html
@@ -0,0 +1,32 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<ng-container *ngFor="let block of appTextArrangements">
+
+  <span *ngIf="block.type === 'text'" class="text">
+    {{block.value}}
+  </span>
+
+  <ng-container *ngIf="block.type === 'newline'">
+    <br>
+  </ng-container>
+
+  <div *ngIf="block.type === 'pagebreak'" class="page-break">
+    <div class="page-break--line">
+    </div>
+    <span class="page-break--text">Seitenumbruch</span>
+    <div class="page-break--line">
+    </div>
+  </div>
+
+</ng-container>
diff --git a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.scss b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.scss
similarity index 63%
rename from src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.scss
rename to src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.scss
index 44850d8..301e8c8 100644
--- a/src/app/features/edit/components/edit-negative-answer/edit-negative-answer.component.scss
+++ b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.scss
@@ -13,26 +13,26 @@
 
 @import "openk.styles";
 
-:host {
-  display: flex;
-  flex-flow: column;
-  padding: 1em;
+.page-break {
+  display: inline-flex;
+  flex-direction: row;
+  margin: 0.5em 0 0.5em 0;
   align-items: center;
-}
-
-.edit-negative-answer {
-  margin-top: 1em;
-  max-width: 35em;
   width: 100%;
 }
 
-textarea {
-  max-width: 100%;
-  margin-top: 0.5em;
-  box-sizing: border-box;
-  height: 10em;
+.page-break--line {
+  width: 100%;
+  border-bottom: 1px solid get-color($openk-default-palette, 900);
 }
 
-.submit-button {
-  margin: 1em 0 0 auto;
+.page-break--text {
+  padding: 0 0.7em;
+  font-style: italic;
+  color: get-color($openk-default-palette, 900);
+}
+
+.text {
+  padding: 0 0.5em 0 0.5em;
+  display: inline-block;
 }
diff --git a/src/app/pages/dashboard/components/dashboard/dashboard.component.spec.ts b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.spec.ts
similarity index 65%
rename from src/app/pages/dashboard/components/dashboard/dashboard.component.spec.ts
rename to src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.spec.ts
index 9134bc7..51f1044 100644
--- a/src/app/pages/dashboard/components/dashboard/dashboard.component.spec.ts
+++ b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.spec.ts
@@ -12,23 +12,23 @@
  ********************************************************************************/
 
 import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {provideMockStore} from "@ngrx/store/testing";
-import {DashboardComponent} from "./dashboard.component";
+import {StatementEditorModule} from "../../statement-editor.module";
+import {StatementPreviewComponent} from "./statement-preview.component";
 
-describe("DashboardComponent", () => {
-    let component: DashboardComponent;
-    let fixture: ComponentFixture<DashboardComponent>;
+describe("StatementPreviewComponent", () => {
+    let component: StatementPreviewComponent;
+    let fixture: ComponentFixture<StatementPreviewComponent>;
 
     beforeEach(async(() => {
         TestBed.configureTestingModule({
-            declarations: [DashboardComponent],
-            providers: [provideMockStore({})]
-        })
-            .compileComponents();
+            imports: [
+                StatementEditorModule
+            ]
+        }).compileComponents();
     }));
 
     beforeEach(() => {
-        fixture = TestBed.createComponent(DashboardComponent);
+        fixture = TestBed.createComponent(StatementPreviewComponent);
         component = fixture.componentInstance;
         fixture.detectChanges();
     });
diff --git a/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.stories.ts b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.stories.ts
new file mode 100644
index 0000000..270aa30
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.stories.ts
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
+import {RouterTestingModule} from "@angular/router/testing";
+import {moduleMetadata, storiesOf} from "@storybook/angular";
+import {I18nModule} from "../../../../../core/i18n";
+import {StatementEditorModule} from "../../statement-editor.module";
+
+const arrangements: any[] = [
+    {type: "text", value: "Ein Text Test."},
+    {type: "newline", value: ""},
+    {type: "pagebreak", value: ""},
+    {type: "text", value: "Ein weiterer Text."}
+];
+
+
+storiesOf("Features / Forms", module)
+    .addDecorator(moduleMetadata({
+        imports: [
+            I18nModule,
+            RouterTestingModule,
+            StatementEditorModule,
+            BrowserAnimationsModule
+        ],
+        providers: []
+    }))
+    .add("StatementPreviewComponent", () => ({
+        template: `
+            <app-statement-preview [appTextArrangements]="arrangements">
+            </app-statement-preview>
+        `,
+        props: {
+            arrangements
+        }
+    }));
diff --git a/src/app/shared/page-header/component/page-header.component.ts b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.ts
similarity index 65%
rename from src/app/shared/page-header/component/page-header.component.ts
rename to src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.ts
index 66f87db..dd40a41 100644
--- a/src/app/shared/page-header/component/page-header.component.ts
+++ b/src/app/features/forms/statement-editor/components/statement-preview/statement-preview.component.ts
@@ -12,19 +12,16 @@
  ********************************************************************************/
 
 import {Component, Input} from "@angular/core";
-import {IPageHeaderAction} from "./IPageHeaderActions";
+import {ITextBlockRenderItem} from "../../../../../shared/text-block/model/ITextBlockRenderItem";
+
 
 @Component({
-    selector: "app-page-header",
-    templateUrl: "./page-header.component.html",
-    styleUrls: ["./page-header.component.scss"]
+    selector: "app-statement-preview",
+    templateUrl: "./statement-preview.component.html",
+    styleUrls: ["./statement-preview.component.scss"]
 })
-export class PageHeaderComponent {
+export class StatementPreviewComponent {
 
     @Input()
-    public appTitle: string;
-
-    @Input()
-    public appActions: IPageHeaderAction[];
-
+    public appTextArrangements: ITextBlockRenderItem[];
 }
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/features/forms/statement-editor/components/text-block-control/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/features/forms/statement-editor/components/text-block-control/index.ts
index 7378646..f1f8fb3 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/features/forms/statement-editor/components/text-block-control/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./text-block-control.component";
diff --git a/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.html b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.html
new file mode 100644
index 0000000..08fbb5a
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.html
@@ -0,0 +1,25 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+<app-text-block
+  (appButtonPress)="appRemove.emit(appValue.textblockId)"
+  (appNewLine)="addNewLine()"
+  (appChangeText)="setReplacement($event)"
+  (appTextInput)="convertToFreeText()"
+  (appValueChange)="addPlaceholder($event)"
+  [appTextBlockData]="appValue | getBlockDataFromArrangement: appTextBlockModel: appValue?.placeholderValues: appReplacements: appSelects"
+  [appErrors]="appErrors"
+  [appShowClose]="true"
+  [appTitle]="appValue | getTitle"
+  [appBlockText]="appValue?.replacement"
+  [appType]="appValue?.type">
+</app-text-block>
diff --git a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.scss b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.scss
similarity index 94%
rename from src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.scss
rename to src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.scss
index 06db89a..8f82753 100644
--- a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.scss
+++ b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.scss
@@ -11,3 +11,6 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+:host {
+  display: block;
+}
diff --git a/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.spec.ts b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.spec.ts
new file mode 100644
index 0000000..34a25e8
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.spec.ts
@@ -0,0 +1,87 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {IAPITextArrangementItemModel, IAPITextBlockModel} from "../../../../../core/api/text";
+import {I18nModule} from "../../../../../core/i18n";
+import {StatementEditorModule} from "../../statement-editor.module";
+import {TextBlockControlComponent} from "./text-block-control.component";
+
+describe("TextBlockControlComponent", () => {
+    let component: TextBlockControlComponent;
+    let fixture: ComponentFixture<TextBlockControlComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                StatementEditorModule,
+                I18nModule
+            ],
+            declarations: [TextBlockControlComponent]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextBlockControlComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should create", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should emit appAdd with a newline block", () => {
+        spyOn(component.appAdd, "emit").and.callThrough();
+        component.addNewLine();
+        expect(component.appAdd.emit).toHaveBeenCalledWith({type: "newline", placeholderValues: {}});
+    });
+
+    it("should set new value for the placeholder", () => {
+        const replacement: { name: string, newValue: string } = {
+            name: "name",
+            newValue: "newValue"
+        };
+        component.addPlaceholder(replacement);
+        expect(component.appValue.placeholderValues).toEqual({name: "newValue"});
+
+        component.addPlaceholder({...replacement, newValue: "value"});
+        expect(component.appValue.placeholderValues).toEqual({name: "value"});
+    });
+
+    it("should keep replacement text if there is one", () => {
+        const value: IAPITextArrangementItemModel = {type: "block", placeholderValues: {}};
+        component.appValue = value;
+        component.convertToFreeText();
+        expect(component.appValue).toEqual({...value, replacement: ""});
+
+        const replacement = "replacement";
+        component.appValue.replacement = replacement;
+        component.convertToFreeText();
+        expect(component.appValue).toEqual({...value, replacement});
+
+        component.appValue.replacement = undefined;
+        const textBlockModel: IAPITextBlockModel = {id: "1", text: "text block text", excludes: [], requires: []};
+        component.appTextBlockModel = textBlockModel;
+        component.convertToFreeText();
+        expect(component.appValue).toEqual({...value, replacement: textBlockModel.text});
+    });
+
+    it("should keep replacement text if there is one", () => {
+        component.appValue = undefined;
+        const replacement = "replacement";
+        component.setReplacement(replacement);
+        expect(component.appValue).toEqual({replacement} as IAPITextArrangementItemModel);
+    });
+
+});
diff --git a/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.ts b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.ts
new file mode 100644
index 0000000..b78e2ec
--- /dev/null
+++ b/src/app/features/forms/statement-editor/components/text-block-control/text-block-control.component.ts
@@ -0,0 +1,80 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Component, EventEmitter, forwardRef, Input, Output} from "@angular/core";
+import {NG_VALUE_ACCESSOR} from "@angular/forms";
+import {IAPITextArrangementItemModel, IAPITextBlockModel} from "../../../../../core";
+import {AbstractControlValueAccessorComponent} from "../../../../../shared/controls/common";
+import {ITextblockError} from "../../pipes";
+
+@Component({
+    selector: "app-text-block-control",
+    templateUrl: "./text-block-control.component.html",
+    styleUrls: ["./text-block-control.component.scss"],
+    providers: [
+        {
+            provide: NG_VALUE_ACCESSOR,
+            useExisting: forwardRef(() => TextBlockControlComponent),
+            multi: true
+        }
+    ]
+})
+export class TextBlockControlComponent extends AbstractControlValueAccessorComponent<IAPITextArrangementItemModel> {
+
+    @Input()
+    public appTextBlockModel: IAPITextBlockModel;
+
+    @Input()
+    public appSelects: { [key: string]: string[] };
+
+    @Input()
+    public appReplacements: { [key: string]: string };
+
+    @Input()
+    public appErrors: ITextblockError[];
+
+    @Output()
+    public appRemove: EventEmitter<string> = new EventEmitter();
+
+    @Output()
+    public appAdd: EventEmitter<IAPITextArrangementItemModel> = new EventEmitter();
+
+    public addPlaceholder(replacement: { name: string, newValue: string }) {
+        this.writeValue({
+            ...this.appValue,
+            placeholderValues: {
+                ...this.appValue?.placeholderValues,
+                [replacement.name]: replacement.newValue
+            }
+        }, true);
+    }
+
+    public convertToFreeText() {
+        const replacementText = this.appValue?.replacement ? this.appValue.replacement : this.appTextBlockModel?.text;
+        this.writeValue({
+            ...this.appValue,
+            replacement: replacementText ? replacementText : ""
+        }, true);
+    }
+
+    public setReplacement(text: string) {
+        this.writeValue({
+            ...this.appValue,
+            replacement: text
+        }, true);
+    }
+
+    public addNewLine() {
+        this.appAdd.emit({type: "newline", placeholderValues: {}});
+    }
+}
diff --git a/src/app/shared/select/index.ts b/src/app/features/forms/statement-editor/index.ts
similarity index 89%
copy from src/app/shared/select/index.ts
copy to src/app/features/forms/statement-editor/index.ts
index 379f4ab..8b5140b 100644
--- a/src/app/shared/select/index.ts
+++ b/src/app/features/forms/statement-editor/index.ts
@@ -13,6 +13,4 @@
 
 export * from "./components";
 export * from "./pipes";
-
-export * from "./ISelectOption";
-export * from "./select.module";
+export * from "./statement-editor.module";
diff --git a/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.spec.ts b/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.spec.ts
new file mode 100644
index 0000000..499b328
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.spec.ts
@@ -0,0 +1,92 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {ITextBlockRenderItem} from "../../../../shared/text-block/model/ITextBlockRenderItem";
+import {IStatementEditorControlConfiguration} from "../../../../store/statements/model";
+import {ArrangementToPreviewPipe} from "./arrangement-to-preview.pipe";
+
+describe("ArrangementToPreviewPipe", () => {
+
+    const pipe = new ArrangementToPreviewPipe();
+
+    const textItems: ITextBlockRenderItem[] = [
+        {type: "text", value: "Ein Text mit folgendem zu ersetzenden Wert INSERT_VALUE INSERT_INPUT_VALUE"},
+        {type: "text", value: "Freitext"},
+        {type: "newline", value: ""},
+        {type: "pagebreak", value: ""}
+    ];
+
+    const configurations: IStatementEditorControlConfiguration[] = [
+        {
+            textBlock: {
+                id: "textBlockId",
+                text: "Ein Text mit folgendem zu ersetzenden Wert <t:test> <f:testing>",
+                excludes: [],
+                requires: []
+            },
+            selects: {},
+            replacements: {
+                test: "INSERT_VALUE"
+            },
+            value: {
+                type: "block",
+                textblockId: "textBlockId",
+                placeholderValues: {
+                    testing: "INSERT_INPUT_VALUE"
+                }
+            }
+        },
+        {
+            selects: {},
+            replacements: {},
+            value: {
+                type: "text",
+                placeholderValues: {},
+                replacement: "Freitext"
+            }
+        },
+        {
+            selects: {},
+            replacements: {},
+            value: {
+                type: "newline",
+                placeholderValues: {}
+            }
+        },
+        {
+            selects: {},
+            replacements: {},
+            value: {
+                type: "pagebreak",
+                placeholderValues: {}
+            }
+        }
+    ];
+
+    it("should return an empty array if supplied with no data", () => {
+        let result = pipe.transform(undefined);
+        expect(result).toEqual([]);
+
+        result = pipe.transform(null);
+        expect(result).toEqual([]);
+    });
+
+    it("should convert the array of configurations to an array of TextBlockRenderItems", () => {
+        const result = pipe.transform(configurations);
+        expect(result).toBeTruthy();
+        // removes undefined properties
+        expect(JSON.parse(JSON.stringify(result))).toEqual(JSON.parse(JSON.stringify(textItems)));
+    });
+});
+
+
diff --git a/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.ts b/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.ts
new file mode 100644
index 0000000..b99ec85
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/arrangement-to-preview.pipe.ts
@@ -0,0 +1,70 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+import {ITextBlockRenderItem} from "../../../../shared/text-block/model/ITextBlockRenderItem";
+import {replaceTags} from "../../../../shared/text-block/pipes/get-blockdata-array";
+import {IStatementEditorControlConfiguration} from "../../../../store/statements/model";
+import {arrayJoin} from "../../../../util/store";
+
+@Pipe({
+    name: "arrangementToPreview"
+})
+export class ArrangementToPreviewPipe implements PipeTransform {
+
+    public transform(config: IStatementEditorControlConfiguration[]): ITextBlockRenderItem[] {
+
+        const result: ITextBlockRenderItem[] = [];
+        for (const item of arrayJoin(config)) {
+            if (item.value?.type === "block" && item.textBlock != null) {
+                result.push({
+                    type: "text",
+                    value: this.replaceInText(item.textBlock.text, item.value?.placeholderValues, item.replacements)
+                });
+            }
+            if (item.value?.type === "text") {
+                result.push({
+                    type: "text",
+                    value: item.value.replacement ? item.value.replacement : ""
+                });
+            }
+            if (item.value?.type === "newline" || item.value?.type === "pagebreak") {
+                result.push({
+                    type: item.value.type,
+                    value: ""
+                });
+            }
+        }
+
+        return replaceTags(result, [
+            {separator: /(\n)/, type: "newline"}
+        ]);
+    }
+
+    public replaceInText(text: string, placeholderValues: { [key: string]: string } = {}, replacements: { [key: string]: string }): string {
+        let arrangementText: string = text;
+        let textToReplace: string[] = arrangementText.match(/<([fdts]):([0-9a-zA-Z_\\-]+)>/);
+
+        while (textToReplace != null) {
+
+            let replacementValue: string = textToReplace[1] === "t" ? replacements[textToReplace[2]] : placeholderValues[textToReplace[2]];
+            replacementValue = replacementValue ? replacementValue : "______";
+
+            arrangementText = arrangementText.replace(textToReplace[0], replacementValue);
+
+            textToReplace = arrangementText.match(/<([fdts]):([0-9a-zA-Z_\\-]+)>/);
+        }
+        return arrangementText;
+    }
+
+}
diff --git a/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.spec.ts b/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.spec.ts
new file mode 100644
index 0000000..04740d6
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.spec.ts
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextArrangementErrorModel} from "../../../../core/api/text";
+import {ErrorToMessagesPipe} from "./error-to-messages.pipe";
+
+describe("ErrorToMessagesPipe", () => {
+
+    const pipe = new ErrorToMessagesPipe();
+
+    const error: IAPITextArrangementErrorModel = {
+        arrangementId: 0,
+        textblockId: "string",
+        textblockGroup: "string",
+        missingVariables: ["14", "15", "16"],
+        requires: [{ids: ["5", "6", "7"], type: "and"}, {ids: ["8", "9", "10"], type: "or"}, {ids: ["11", "12", "13"], type: "xor"}],
+        excludes: ["2", "3", "4"],
+        after: "1"
+    };
+
+    it("should return an empty array if supplied with no data", () => {
+        let result = pipe.transform(undefined);
+        expect(result).toEqual([]);
+
+        result = pipe.transform(null);
+        expect(result).toEqual([]);
+    });
+
+    it("should convert the error model to an array of error messages in the right order", () => {
+        const result = pipe.transform(error);
+
+        expect(result).toBeTruthy();
+        expect(Array.isArray(result)).toBeTrue();
+        let ids = "";
+        for (const errorMessage of result) {
+            if (ids !== "") {
+                ids += ",";
+            }
+            ids += errorMessage.ids.toString();
+        }
+        expect(ids).toEqual("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16");
+    });
+});
+
+
diff --git a/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.ts b/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.ts
new file mode 100644
index 0000000..42bddf8
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/error-to-messages.pipe.ts
@@ -0,0 +1,81 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+import {IAPITextArrangementErrorModel} from "../../../../core/api/text";
+import {arrayJoin} from "../../../../util/store";
+
+@Pipe({
+    name: "errorToMessages"
+})
+export class ErrorToMessagesPipe implements PipeTransform {
+
+    public transform(error: IAPITextArrangementErrorModel): ITextblockError[] {
+        const errorMessages: ITextblockError[] = [];
+
+        if (!error) {
+            return [];
+        }
+
+        if (error.after != null) {
+            errorMessages.push({
+                message: "textBlocks.errors.after",
+                ids: [error.after]
+            });
+        }
+        if (arrayJoin(error.excludes).length > 0) {
+            errorMessages.push({
+                message: "textBlocks.errors.excludes",
+                ids: error.excludes
+            });
+        }
+
+        arrayJoin(error.requires)
+            .filter((rule) => rule != null)
+            .forEach((rule) => {
+                const ids = arrayJoin(rule.ids);
+                switch (rule.type) {
+                    case "and":
+                        return errorMessages.push({
+                            message: "textBlocks.errors.requires",
+                            ids
+                        });
+                    case "or":
+                        return errorMessages.push({
+                            message: "textBlocks.errors.requiresAtleastOne",
+                            ids
+                        });
+                    case "xor":
+                        return errorMessages.push({
+                            message: "textBlocks.errors.requiresOne",
+                            ids
+                        });
+                }
+            });
+
+        if (arrayJoin(error.missingVariables).length > 0) {
+            errorMessages.push({
+                message: "textBlocks.errors.missingVariables",
+                ids: error.missingVariables
+            });
+        }
+
+        return errorMessages;
+    }
+
+}
+
+export interface ITextblockError {
+    message: string;
+    ids: string[];
+}
diff --git a/src/app/features/forms/statement-editor/pipes/get-title.pipe.spec.ts b/src/app/features/forms/statement-editor/pipes/get-title.pipe.spec.ts
new file mode 100644
index 0000000..2584cca
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/get-title.pipe.spec.ts
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextArrangementItemModel} from "../../../../core/api/text";
+import {GetTitlePipe} from "./get-title.pipe";
+
+describe("GetTitlePipe", () => {
+
+    const pipe = new GetTitlePipe();
+
+    it("should return the correct title as string", () => {
+        const arrangement: IAPITextArrangementItemModel = {
+            type: "text",
+            placeholderValues: {}
+        };
+        let result = pipe.transform(arrangement);
+        expect(result).toEqual("textBlocks.standardBlocks.freeText");
+
+        result = pipe.transform({...arrangement, type: "pagebreak"});
+        expect(result).toEqual("textBlocks.standardBlocks.pagebreak");
+
+        result = pipe.transform({...arrangement, type: "newline"});
+        expect(result).toEqual("textBlocks.standardBlocks.newLine");
+
+        result = pipe.transform({...arrangement, type: "block"});
+        expect(result).toEqual(undefined);
+
+        result = pipe.transform({...arrangement, type: "block", textblockId: "textBlockId"});
+        expect(result).toEqual("textBlockId");
+
+        result = pipe.transform(undefined);
+        expect(result).toEqual(undefined);
+    });
+});
+
+
diff --git a/src/app/features/forms/statement-editor/pipes/get-title.pipe.ts b/src/app/features/forms/statement-editor/pipes/get-title.pipe.ts
new file mode 100644
index 0000000..58df3d4
--- /dev/null
+++ b/src/app/features/forms/statement-editor/pipes/get-title.pipe.ts
@@ -0,0 +1,35 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+import {IAPITextArrangementItemModel} from "../../../../core/api/text";
+
+@Pipe({
+    name: "getTitle"
+})
+export class GetTitlePipe implements PipeTransform {
+
+    public transform(arrangement: IAPITextArrangementItemModel) {
+        switch (arrangement?.type) {
+            case "text":
+                return "textBlocks.standardBlocks.freeText";
+            case "newline":
+                return "textBlocks.standardBlocks.newLine";
+            case "pagebreak":
+                return "textBlocks.standardBlocks.pagebreak";
+        }
+
+        return arrangement?.textblockId;
+    }
+
+}
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/features/forms/statement-editor/pipes/index.ts
similarity index 81%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/features/forms/statement-editor/pipes/index.ts
index fc6c436..26ede77 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/features/forms/statement-editor/pipes/index.ts
@@ -11,7 +11,6 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
-}
+export * from "./get-title.pipe";
+export * from "./error-to-messages.pipe";
+export * from "./arrangement-to-preview.pipe";
diff --git a/src/app/features/forms/statement-editor/statement-editor.module.ts b/src/app/features/forms/statement-editor/statement-editor.module.ts
new file mode 100644
index 0000000..03208a8
--- /dev/null
+++ b/src/app/features/forms/statement-editor/statement-editor.module.ts
@@ -0,0 +1,68 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {DragDropModule} from "@angular/cdk/drag-drop";
+import {CommonModule} from "@angular/common";
+import {NgModule} from "@angular/core";
+import {ReactiveFormsModule} from "@angular/forms";
+import {MatIconModule} from "@angular/material/icon";
+import {MatSidenavModule} from "@angular/material/sidenav";
+import {CollapsibleModule} from "../../../shared/layout/collapsible";
+import {GlobalClassToggleModule} from "../../../shared/layout/global-class-toggle";
+import {SharedPipesModule} from "../../../shared/pipes";
+import {TextBlockModule} from "../../../shared/text-block";
+import {AttachmentsFormModule} from "../attachments";
+import {CombineBlockdataTextPipe} from "../../../shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe";
+import {
+    ArrangementFormGroupComponent,
+    StatementEditorFormComponent,
+    StatementPreviewComponent,
+    TextBlockControlComponent
+} from "./components";
+import {ArrangementToPreviewPipe, ErrorToMessagesPipe, GetTitlePipe} from "./pipes";
+
+
+@NgModule({
+    imports: [
+        CommonModule,
+        ReactiveFormsModule,
+        SharedPipesModule,
+        DragDropModule,
+        TextBlockModule,
+        CollapsibleModule,
+        MatIconModule,
+        GlobalClassToggleModule,
+        MatSidenavModule,
+        AttachmentsFormModule
+    ],
+    declarations: [
+        StatementEditorFormComponent,
+        TextBlockControlComponent,
+        GetTitlePipe,
+        ErrorToMessagesPipe,
+        StatementPreviewComponent,
+        ArrangementToPreviewPipe,
+        CombineBlockdataTextPipe,
+        ArrangementFormGroupComponent,
+        CombineBlockdataTextPipe
+    ],
+    exports: [
+        StatementEditorFormComponent,
+        StatementPreviewComponent,
+        ArrangementToPreviewPipe,
+        ArrangementFormGroupComponent
+    ]
+})
+export class StatementEditorModule {
+
+}
diff --git a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.html b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.html
index 830c525..cbf739b 100644
--- a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.html
+++ b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.html
@@ -50,7 +50,8 @@
     [appTitle]="'statementInformationForm.container.inboxAttachments' | translate">
 
     <app-attachments-form-group
-      [appFormGroup]="appFormGroup">
+      [appForbiddenTagIds]="appForbiddenTagIds"
+      [appFormGroup]="appFormGroup | getFormGroup: 'attachments'">
     </app-attachments-form-group>
 
   </app-collapsible>
diff --git a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.spec.ts b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.spec.ts
index 2b6d7b0..f9aef9c 100644
--- a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.spec.ts
+++ b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.spec.ts
@@ -72,8 +72,10 @@
             city: null,
             district: null,
             contactId: null,
-            addAttachments: [],
-            removeAttachments: []
+            attachments: {
+                add: [],
+                edit: []
+            }
         };
         expect(component).toBeDefined();
         fixture.detectChanges();
@@ -95,8 +97,10 @@
             city: null,
             district: null,
             contactId: null,
-            addAttachments: [],
-            removeAttachments: []
+            attachments: {
+                add: [],
+                edit: []
+            }
         };
         component.appForNewStatement = true;
         expect(component).toBeDefined();
@@ -120,8 +124,10 @@
             city: null,
             district: null,
             contactId: null,
-            addAttachments: [],
-            removeAttachments: []
+            attachments: {
+                add: [],
+                edit: []
+            }
         };
         component.appForNewStatement = true;
         expect(component).toBeDefined();
@@ -229,8 +235,10 @@
             city: "city",
             district: "district",
             contactId: "contactId",
-            addAttachments: [],
-            removeAttachments: []
+            attachments: {
+                add: [],
+                edit: []
+            }
         };
 
         component.appForNewStatement = true;
@@ -273,8 +281,10 @@
             city: "city",
             district: "district",
             contactId: "contactId",
-            addAttachments: [],
-            removeAttachments: []
+            attachments: {
+                add: [],
+                edit: []
+            }
         };
 
         mockStore.overrideSelector(taskSelector, task as IAPIProcessTask);
@@ -306,6 +316,4 @@
             responsible: false
         }));
     });
-
-
 });
diff --git a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.ts b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.ts
index 104317f..72bfcd1 100644
--- a/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.ts
+++ b/src/app/features/forms/statement-information/components/statement-information-form/statement-information-form.component.ts
@@ -16,7 +16,7 @@
 import {select, Store} from "@ngrx/store";
 import {concat, defer, of} from "rxjs";
 import {distinctUntilChanged, filter, map, switchMap, take, takeUntil} from "rxjs/operators";
-import {IAPISearchOptions} from "../../../../../core";
+import {EAPIStaticAttachmentTagIds, IAPISearchOptions} from "../../../../../core";
 import {
     fetchContactDetailsAction,
     fetchSettingsAction,
@@ -26,6 +26,7 @@
     getContactSearchSelector,
     getStatementLoadingSelector,
     getStatementSectorsSelector,
+    IAttachmentFormValue,
     IStatementInformationFormValue,
     openContactDataBaseAction,
     startContactSearchAction,
@@ -45,6 +46,15 @@
 export class StatementInformationFormComponent extends AbstractReactiveFormComponent<IStatementInformationFormValue> implements OnInit {
 
     @Input()
+    public appForbiddenTagIds = [
+        EAPIStaticAttachmentTagIds.CONSIDERATION,
+        EAPIStaticAttachmentTagIds.STATEMENT,
+        EAPIStaticAttachmentTagIds.OUTBOX,
+        EAPIStaticAttachmentTagIds.EMAIL,
+        EAPIStaticAttachmentTagIds.EMAIL_TEXT
+    ];
+
+    @Input()
     public appForNewStatement: boolean;
 
     public statementLoading$ = this.store.pipe(select(getStatementLoadingSelector));
@@ -75,15 +85,17 @@
         city: new FormControl(undefined, [Validators.required]),
         district: new FormControl(undefined, [Validators.required]),
         contactId: new FormControl(undefined, [Validators.required]),
-        addAttachments: new FormControl([]),
-        removeAttachments: new FormControl([])
+        attachments: createFormGroup<IAttachmentFormValue>({
+            add: new FormControl([]),
+            edit: new FormControl([])
+        })
     });
 
     public selectedContactId$ = defer(() => concat(of(null), this.appFormGroup.valueChanges)).pipe(
         map(() => this.getValue().contactId)
     );
 
-    private value$ = this.store.pipe(select(statementInformationFormValueSelector));
+    private form$ = this.store.pipe(select(statementInformationFormValueSelector));
 
     private searchSize = 10;
 
@@ -158,7 +170,7 @@
     }
 
     private updateForm() {
-        this.value$.pipe(takeUntil(this.destroy$), filter(() => !this.appForNewStatement))
+        this.form$.pipe(takeUntil(this.destroy$), filter(() => !this.appForNewStatement))
             .subscribe((value) => this.patchValue(value));
         this.statementLoading$.pipe(takeUntil(this.destroy$))
             .subscribe((loading) => loading?.submittingStatementInformation ? this.appFormGroup.disable() : this.appFormGroup.enable());
diff --git a/src/app/features/forms/statement-information/statement-information-form.module.ts b/src/app/features/forms/statement-information/statement-information-form.module.ts
index 7832e5f..01e558f 100644
--- a/src/app/features/forms/statement-information/statement-information-form.module.ts
+++ b/src/app/features/forms/statement-information/statement-information-form.module.ts
@@ -17,12 +17,13 @@
 import {MatIconModule} from "@angular/material/icon";
 import {TranslateModule} from "@ngx-translate/core";
 import {CommonControlsModule} from "../../../shared/controls/common";
-import {ContactSelectModule} from "../../../shared/controls/contact-select/contact-select.module";
+import {ContactSelectModule} from "../../../shared/controls/contact-select";
 import {DateControlModule} from "../../../shared/controls/date-control";
 import {FileDropModule} from "../../../shared/controls/file-drop";
 import {FileSelectModule} from "../../../shared/controls/file-select";
 import {SelectModule} from "../../../shared/controls/select";
 import {CollapsibleModule} from "../../../shared/layout/collapsible";
+import {SharedPipesModule} from "../../../shared/pipes";
 import {AttachmentsFormModule} from "../attachments";
 import {CommentsFormModule} from "../comments";
 import {GeneralInformationFormGroupComponent, StatementInformationFormComponent} from "./components";
@@ -43,7 +44,8 @@
         CommonControlsModule,
         ContactSelectModule,
         FileSelectModule,
-        AttachmentsFormModule
+        AttachmentsFormModule,
+        SharedPipesModule
     ],
     declarations: [
         StatementInformationFormComponent,
diff --git a/src/app/features/forms/workflow-data/components/workflow-data-form.component.spec.ts b/src/app/features/forms/workflow-data/components/workflow-data-form.component.spec.ts
index 02d4158..f6d60db 100644
--- a/src/app/features/forms/workflow-data/components/workflow-data-form.component.spec.ts
+++ b/src/app/features/forms/workflow-data/components/workflow-data-form.component.spec.ts
@@ -15,11 +15,8 @@
 import {FormGroup} from "@angular/forms";
 import {RouterTestingModule} from "@angular/router/testing";
 import {MockStore, provideMockStore} from "@ngrx/store/testing";
-import {IAPISearchOptions} from "../../../../core/api/shared";
-import {I18nModule} from "../../../../core/i18n";
-import {taskSelector} from "../../../../store/process/selectors";
-import {startStatementSearchAction, submitWorkflowDataFormAction} from "../../../../store/statements/actions";
-import {IWorkflowFormValue} from "../../../../store/statements/model";
+import {I18nModule, IAPISearchOptions} from "../../../../core";
+import {IWorkflowFormValue, startStatementSearchAction, submitWorkflowDataFormAction, taskSelector} from "../../../../store";
 import {WorkflowDataFormModule} from "../workflow-data-form.module";
 import {WorkflowDataFormComponent} from "./workflow-data-form.component";
 
diff --git a/src/app/features/new/components/new-statement-form/new-statement-form.component.html b/src/app/features/new/components/new-statement-form/new-statement-form.component.html
deleted file mode 100644
index 29c2c2c..0000000
--- a/src/app/features/new/components/new-statement-form/new-statement-form.component.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<ng-template #loadingHeader>
-  <app-progress-spinner class="new-statement-form-spinner">
-  </app-progress-spinner>
-</ng-template>
-
-<app-card
-  [appCardHeader]="appIsLoading ? loadingHeader : null"
-  [appTitle]="'new.title' | translate"
-  cdkTrapFocus class="new-statement">
-
-  <form #newStatementForm="ngForm"
-        (input)="onFormInput(newStatementForm)"
-        (ngSubmit)="submit(newStatementForm);"
-        class="new-statement-form">
-
-    <ng-container *ngFor="let group of formGroups; let index = index;">
-      <div [ngSwitch]="group?.type" class="new-statement-form-group">
-
-        <ng-container *ngSwitchCase="'text'">
-          <label [for]="appId + '-' + index"
-                 class="new-statement-form-group-label">
-            {{group.title | translate}}
-          </label>
-
-          <input
-            #ngModel="ngModel"
-            [class.openk-danger]="ngModel.invalid && (ngModel.touched || isTouched)"
-            [class.openk-success]="ngModel.valid"
-            [disabled]="appDisabled"
-            [id]="appId + '-' + index"
-            [name]="group.id"
-            [ngModel]="appValue ? appValue[group.id] : ''"
-            autocomplete="off"
-            class="new-statement-form-group-input openk-input openk-info"
-            required>
-        </ng-container>
-
-
-        <ng-container *ngSwitchCase="'date'">
-          <label [for]="appId + '-' + index"
-                 class="new-statement-form-group-label">
-            {{group.title | translate}}
-          </label>
-
-          <app-date-control
-            #ngModel="ngModel"
-            [appDanger]="ngModel.invalid && (ngModel.touched || isTouched)"
-            [appDisabled]="appDisabled"
-            [appId]="appId + '-' + index"
-            [appInfo]="true"
-            [appSuccess]="ngModel.valid"
-            [name]="group.id"
-            [ngModel]="appValue ? appValue[group.id] : ''"
-            class="new-statement-form-group-input"
-            required>
-          </app-date-control>
-        </ng-container>
-
-        <ng-container *ngSwitchCase="'select'">
-          <label [for]="appId + '-' + index"
-                 class="new-statement-form-group-label">
-            {{group.title | translate}}
-          </label>
-
-          <app-select
-            #ngModel="ngModel"
-            [appDisabled]="appDisabled"
-            [appId]="appId + '-' + index"
-            [appOptions]="appTypeOptions"
-            [appPlaceholder]="appTypeOptions?.length > 0 ? 'Vorgangsart auswählen...' : 'Keine Vorgangsart verfügbar...'"
-            [class.openk-danger]="ngModel.invalid"
-            [class.openk-success]="ngModel.valid"
-            [name]="group.id"
-            [ngModel]="(appTypeOptions | selected: appValue?.typeId : true)?.value"
-            class="new-statement-form-group-input openk-info"
-            required>
-          </app-select>
-        </ng-container>
-
-      </div>
-    </ng-container>
-
-    <div class="new-statement-form-group">
-      <label class="new-statement-form-group-label new-statement-form-group-label-attachments">
-        {{'new.form.attachments' | translate}}
-      </label>
-
-      <app-file-drop
-        #fileDrop
-        [appDisabled]="appDisabled"
-        name="attachments"
-        ngModel
-      >
-      </app-file-drop>
-    </div>
-
-    <div class="new-statement-form-submit">
-      <label *ngIf="appError != null"
-             class="new-statement-form-error openk-danger">
-        {{appError | translate}}
-      </label>
-
-      <span class="new-statement-form-submit-actions">
-
-        <button (click)="fileDrop.openDialog()" [disabled]="appDisabled" class="openk-button"
-                type="button">
-          <mat-icon>attach_file</mat-icon>
-          Anlagen hinzufügen
-        </button>
-
-        <button [disabled]="appDisabled"
-                class="openk-button openk-success">
-          <mat-icon>note_add</mat-icon>
-          Stellungnahme anlegen
-        </button>
-
-      </span>
-    </div>
-
-  </form>
-
-</app-card>
diff --git a/src/app/features/new/components/new-statement-form/new-statement-form.component.scss b/src/app/features/new/components/new-statement-form/new-statement-form.component.scss
deleted file mode 100644
index eb31bf2..0000000
--- a/src/app/features/new/components/new-statement-form/new-statement-form.component.scss
+++ /dev/null
@@ -1,98 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  display: block;
-}
-
-.loading {
-  font-size: x-small;
-  margin-left: auto;
-}
-
-.new-statement {
-  margin-top: 1em;
-  max-width: 35em;
-  width: 100%;
-}
-
-.new-statement-form {
-  display: flex;
-  flex-flow: column;
-  width: 100%;
-  position: relative;
-}
-
-.new-statement-form-spinner {
-  margin: 0 0.75em 0 auto;
-}
-
-.new-statement-form-group {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  margin-bottom: 1em;
-  flex-flow: row wrap;
-}
-
-.new-statement-form-group-label {
-  padding: 0.1em 1em 0.1em 0;
-  display: inline-block;
-  min-width: 9em;
-}
-
-.new-statement-form-group-input {
-  width: 20em;
-  box-sizing: border-box;
-}
-
-.new-statement-form-group-label-attachments {
-  margin-bottom: auto;
-  margin-top: 0.25em;
-}
-
-.new-statement-form-submit {
-  margin-top: 0.5em;
-  display: flex;
-  justify-content: flex-end;
-  align-items: center;
-  flex-flow: row wrap;
-}
-
-.new-statement-form-error {
-  display: inline-flex;
-  width: auto;
-  color: get-color($openk-danger-palette);
-  font-size: smaller;
-  padding: 1em;
-  margin: auto;
-  max-width: 15em;
-}
-
-.new-statement-form-submit-actions {
-  flex-shrink: 0;
-  display: inline-flex;
-  flex-flow: column;
-
-  & > * {
-    margin: 0.5em 0;
-    min-width: 15em;
-    justify-content: flex-start;
-  }
-
-  & > *:last-child {
-    margin-bottom: 0;
-  }
-}
diff --git a/src/app/features/new/components/new-statement-form/new-statement-form.component.spec.ts b/src/app/features/new/components/new-statement-form/new-statement-form.component.spec.ts
deleted file mode 100644
index 59a09ea..0000000
--- a/src/app/features/new/components/new-statement-form/new-statement-form.component.spec.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {ComponentFixture, TestBed} from "@angular/core/testing";
-import {FormsModule, NgForm} from "@angular/forms";
-import {MatIconModule} from "@angular/material/icon";
-import {By} from "@angular/platform-browser";
-import {I18nModule} from "../../../../core/i18n";
-import {DateControlModule} from "../../../../shared/controls/date-control";
-import {FileDropModule} from "../../../../shared/controls/file-drop";
-import {SelectModule} from "../../../../shared/controls/select";
-import {CardModule} from "../../../../shared/layout/card";
-import {ENewStatementError} from "../../../../store";
-import {NewStatementFormComponent} from "./new-statement-form.component";
-
-describe("NewStatementFormComponent", () => {
-    let component: NewStatementFormComponent;
-    let fixture: ComponentFixture<NewStatementFormComponent>;
-
-    beforeEach(async () => {
-        await TestBed.configureTestingModule({
-            imports: [
-                CardModule,
-                CommonModule,
-                FormsModule,
-                DateControlModule,
-                FileDropModule,
-                I18nModule,
-                MatIconModule,
-                SelectModule
-            ],
-            declarations: [
-                NewStatementFormComponent
-            ]
-        }).compileComponents();
-    });
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(NewStatementFormComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-
-    it("should render all form input elements", () => {
-        const debugElement = fixture.debugElement;
-        for (let i = 0; i < component.formGroups.length; i++) {
-            const selector = `[id='${component.appId}-${i}']`;
-            const input = debugElement.query(By.css(selector));
-            expect(input).toBeTruthy();
-        }
-    });
-
-    describe("function tests", () => {
-        const validForm = {
-            valid: true,
-            value: {
-                isValidForm: true
-            }
-        } as NgForm;
-        const invalidForm = {
-            valid: false,
-            value: {
-                isValidForm: false
-            }
-        } as NgForm;
-
-        describe("onFormInput", () => {
-
-            it("should keep the invalid form error", () => {
-                component.appError = ENewStatementError.INVALID_FORM;
-                component.onFormInput(undefined);
-                expect(component.appError).toBe(ENewStatementError.INVALID_FORM);
-            });
-
-            it("should reset the invalid form error when supplied with a valid form input", () => {
-                component.appError = ENewStatementError.INVALID_FORM;
-                component.onFormInput(validForm);
-                expect(component.appError).toBeUndefined();
-            });
-
-            it("should keep the invalid form error when supplied with an invalid form input", () => {
-                component.appError = ENewStatementError.INVALID_FORM;
-                component.onFormInput(invalidForm);
-                expect(component.appError).toBe(ENewStatementError.INVALID_FORM);
-            });
-
-            it("should keep the unknown error (no override)", () => {
-                component.appError = ENewStatementError.UNKNOWN_ERROR;
-                component.onFormInput(validForm);
-                expect(component.appError).toBe(ENewStatementError.UNKNOWN_ERROR);
-            });
-
-            it("should remove the error when input is changed to a valid one", async () => {
-                const debugElement = fixture.debugElement;
-                component.appError = ENewStatementError.INVALID_FORM;
-                spyOn(component, "onFormInput").and.callThrough();
-                await fixture.whenStable();
-                const form = debugElement.query(By.directive(NgForm));
-                const ngForm = form.injector.get(NgForm);
-
-                ngForm.setValue({
-                    attachments: [],
-                    city: "City",
-                    district: "District",
-                    dueDate: "2020-11-11",
-                    receiptDate: "2020-11-11",
-                    title: "Statement",
-                    typeId: "2",
-                });
-
-                fixture.detectChanges();
-                await fixture.whenStable();
-                form.nativeElement.dispatchEvent(new Event("input"));
-                expect(component.appError).toEqual(undefined);
-            });
-        });
-
-        describe("submit", () => {
-
-            it("should set isTouched to true on submit", async () => {
-                expect(component.isTouched).toBeFalse();
-                component.submit(validForm);
-                expect(component.isTouched).toBeTrue();
-            });
-
-            it("should set error on undefined form", async () => {
-                component.appError = undefined;
-                component.submit(undefined);
-                expect(component.appError).toEqual(ENewStatementError.INVALID_FORM);
-            });
-
-            it("should set error on invalid form", async () => {
-                component.appError = undefined;
-                component.submit(invalidForm);
-                expect(component.appError).toEqual(ENewStatementError.INVALID_FORM);
-            });
-
-            it("should emit the form values for a valid form", async () => {
-                spyOn(component.appSubmit, "emit");
-                component.submit(validForm);
-                expect(component.appSubmit.emit).toHaveBeenCalledWith(validForm.value);
-            });
-
-            it("should not emit form values for an invalid form", async () => {
-                spyOn(component.appSubmit, "emit");
-                component.submit(invalidForm);
-                expect(component.appSubmit.emit).not.toHaveBeenCalled();
-            });
-        });
-    });
-});
diff --git a/src/app/features/new/components/new-statement-form/new-statement-form.component.stories.ts b/src/app/features/new/components/new-statement-form/new-statement-form.component.stories.ts
deleted file mode 100644
index f1f036e..0000000
--- a/src/app/features/new/components/new-statement-form/new-statement-form.component.stories.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
-import {action} from "@storybook/addon-actions";
-import {boolean, object, text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {I18nModule} from "../../../../core/i18n";
-import {NewStatementModule} from "../../new-statement.module";
-
-storiesOf("Features", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({
-        imports: [
-            I18nModule,
-            BrowserAnimationsModule,
-            NewStatementModule
-        ]
-    }))
-    .add("NewStatementForm", () => ({
-        template: `
-            <app-new-statement-form style="margin-left: 1em;"
-                (appSubmit)="submit($event)"
-                [appDisabled]="isDisabled"
-                [appError]="error"
-                [appIsLoading]="isLoading"
-                [appTypeOptions]="typeOptions"
-                [appValue]="value">
-            </app-new-statement-form>
-        `,
-        props: {
-            submit: action("submit"),
-            isLoading: boolean("isLoading", false),
-            isDisabled: boolean("isDisabled", false),
-            error: text("Error", undefined),
-            typeOptions: Array(5).fill(0).map((_, value) => ({value, label: "Statement Type " + value})),
-            value: object("Value", {})
-        }
-    }));
diff --git a/src/app/features/new/components/new-statement-form/new-statement-form.component.ts b/src/app/features/new/components/new-statement-form/new-statement-form.component.ts
deleted file mode 100644
index 611c48c..0000000
--- a/src/app/features/new/components/new-statement-form/new-statement-form.component.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, EventEmitter, Input, Output} from "@angular/core";
-import {NgForm} from "@angular/forms";
-import {ISelectOption} from "../../../../shared/controls/select";
-import {ENewStatementError, IStatementInfoFormValue} from "../../../../store";
-
-interface INewStatementFormGroup {
-    title: string;
-    type: "text" | "date" | "select";
-    id: keyof IStatementInfoFormValue;
-}
-
-@Component({
-    selector: "app-new-statement-form",
-    templateUrl: "./new-statement-form.component.html",
-    styleUrls: ["./new-statement-form.component.scss"]
-})
-export class NewStatementFormComponent {
-
-    private static id = 0;
-
-    @Input()
-    public appError: string;
-
-    @Input()
-    public appIsLoading = false;
-
-    @Input()
-    public appDisabled = false;
-
-    @Input()
-    public appId = `NewStatementFormComponent-${NewStatementFormComponent.id++}`;
-
-    @Input()
-    public appValue: Partial<IStatementInfoFormValue>;
-
-    @Input()
-    public appTypeOptions: ISelectOption[] = [];
-
-    @Output()
-    public appSubmit = new EventEmitter<IStatementInfoFormValue>();
-
-    public isTouched = false;
-
-    public formGroups: INewStatementFormGroup[] = [
-        {
-            title: "new.form.title",
-            id: "title",
-            type: "text"
-        },
-        {
-            title: "new.form.receiptDate",
-            id: "receiptDate",
-            type: "date"
-        },
-        {
-            title: "new.form.dueDate",
-            id: "dueDate",
-            type: "date"
-        },
-        {
-            title: "new.form.typeId",
-            id: "typeId",
-            type: "select"
-        },
-        {
-            title: "new.form.city",
-            id: "city",
-            type: "text"
-        },
-        {
-            title: "new.form.district",
-            id: "district",
-            type: "text"
-        }
-    ];
-
-    public onFormInput(form: NgForm) {
-        if (this.appError === ENewStatementError.INVALID_FORM && form?.valid) {
-            this.appError = undefined;
-        }
-    }
-
-    public submit(form: NgForm) {
-        this.isTouched = true;
-        if (!form?.valid) {
-            this.appError = ENewStatementError.INVALID_FORM;
-            return;
-        }
-        this.appSubmit.emit(form.value);
-    }
-
-}
diff --git a/src/app/features/new/new-statement-route-guard.service.ts b/src/app/features/new/new-statement-route-guard.service.ts
deleted file mode 100644
index beaaa60..0000000
--- a/src/app/features/new/new-statement-route-guard.service.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from "@angular/router";
-import {select, Store} from "@ngrx/store";
-import {Observable} from "rxjs";
-import {filter, map, switchMap} from "rxjs/operators";
-import {isLoadingSelector, isOfficialInChargeSelector} from "../../store";
-
-@Injectable({providedIn: "root"})
-export class NewStatementRouteGuardService implements CanActivate {
-
-    public readonly isInitialized$ = this.store.pipe(
-        select(isLoadingSelector),
-        filter((isLoading) => !isLoading)
-    );
-
-    public readonly isAllowed$ = this.store.pipe(
-        select(isOfficialInChargeSelector)
-    );
-
-    private readonly redirectUrlTree = this.router.createUrlTree(["/"]);
-
-    public constructor(private readonly store: Store, private readonly router: Router) {
-    }
-
-    public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> {
-        return this.isInitialized$.pipe(
-            switchMap(() => this.isAllowed$),
-            map((isAllowed) => isAllowed ? isAllowed : this.redirectUrlTree)
-        );
-    }
-
-}
diff --git a/src/app/pages/app-navigation-frame/app-navigation-frame.module.ts b/src/app/pages/app-navigation-frame/app-navigation-frame.module.ts
deleted file mode 100644
index 893f139..0000000
--- a/src/app/pages/app-navigation-frame/app-navigation-frame.module.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {RouterModule} from "@angular/router";
-import {TranslateModule} from "@ngx-translate/core";
-import {DropDownModule} from "../../shared/drop-down/drop-down.module";
-import {AppNavigationFrameComponent} from "./components/app-navigation-frame/app-navigation-frame.component";
-import {ExitPageComponent} from "./components/exit-page/exit-page.component";
-import {DropDownMenuComponent} from "./components/nav-drop-down-menu/drop-down-menu.component";
-import {PageHeaderComponent} from "./components/nav-header/page-header.component";
-import {PageFrameComponent} from "./components/page-frame/page-frame.component";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        RouterModule,
-        MatIconModule,
-        TranslateModule,
-
-        DropDownModule
-    ],
-    declarations: [
-        ExitPageComponent,
-        DropDownMenuComponent,
-        PageHeaderComponent,
-        PageFrameComponent,
-        AppNavigationFrameComponent
-    ],
-    exports: [
-        ExitPageComponent,
-        DropDownMenuComponent,
-        PageHeaderComponent,
-        PageFrameComponent,
-        AppNavigationFrameComponent
-    ]
-})
-export class AppNavigationFrameModule {
-}
diff --git a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.html b/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.html
deleted file mode 100644
index 54ccd39..0000000
--- a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<app-page-frame
-  (appCloseWindow)="closeWindow()"
-  (appLogout)="logOut()"
-  [appExitCode]="exitCode$ | async"
-  [appIsLoading]="isLoading$ | async"
-  [appMenuHidden]="(isLoggedIn$ | async) !== true"
-  [appPortalRoute]="appPortalRoute"
-  [appUserName]="userName$ | async"
-  [appVersion]="version$ | async">
-
-  <ng-content></ng-content>
-
-</app-page-frame>
diff --git a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.spec.ts b/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.spec.ts
deleted file mode 100644
index be535ad..0000000
--- a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {StoreModule} from "@ngrx/store";
-import {provideMockStore} from "@ngrx/store/testing";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-import {AppNavigationFrameComponent} from "./app-navigation-frame.component";
-
-describe("AppNavigationFrameComponent", () => {
-    let component: AppNavigationFrameComponent;
-    let fixture: ComponentFixture<AppNavigationFrameComponent>;
-    const initialState = {};
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [
-                AppNavigationFrameModule,
-                I18nModule,
-                RouterTestingModule,
-                StoreModule
-            ],
-            providers: [provideMockStore({initialState})]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(AppNavigationFrameComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.ts b/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.ts
deleted file mode 100644
index e33d897..0000000
--- a/src/app/pages/app-navigation-frame/components/app-navigation-frame/app-navigation-frame.component.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, Inject} from "@angular/core";
-import {select, Store} from "@ngrx/store";
-import {WINDOW} from "../../../../core/dom/window.token";
-import {PORTAL_ROUTE} from "../../../../core/external-routes/portal-route.token";
-import {logOutAction} from "../../../../store/root/root.actions";
-import {exitCodeSelector, isLoadingSelector} from "../../../../store/root/selectors/root.selectors";
-import {isLoggedInSelector, userNameSelector} from "../../../../store/root/selectors/user.selectors";
-import {overallVersionSelector} from "../../../../store/root/selectors/version.selectors";
-
-@Component({
-    selector: "app-navigation-frame",
-    templateUrl: "./app-navigation-frame.component.html",
-    styleUrls: ["./app-navigation-frame.component.scss"]
-})
-export class AppNavigationFrameComponent {
-
-    public exitCode$ = this.store.pipe(select(exitCodeSelector));
-
-    public isLoading$ = this.store.pipe(select(isLoadingSelector));
-
-    public isLoggedIn$ = this.store.pipe(select(isLoggedInSelector));
-
-    public userName$ = this.store.pipe(select(userNameSelector));
-
-    public version$ = this.store.pipe(select(overallVersionSelector));
-
-    public constructor(
-        public readonly store: Store,
-        @Inject(WINDOW) public readonly window: Window,
-        @Inject(PORTAL_ROUTE) public readonly appPortalRoute: string
-    ) {
-
-    }
-
-    public logOut() {
-        this.store.dispatch(logOutAction());
-    }
-
-    public closeWindow() {
-        try {
-            if (this.window.opener != null) {
-                this.window.close();
-            }
-        } catch (e) {
-            return;
-        }
-    }
-
-}
diff --git a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.html b/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.html
deleted file mode 100644
index 8498725..0000000
--- a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<h2 class="error-page-title">
-  {{ "core.exit." + appExitCode + ".title" | translate }}
-</h2>
-
-<h4 class="error-page-message">
-  {{ "core.exit." + appExitCode + ".message" | translate }}
-</h4>
-
-<a (click)="appRouting.emit()" [href]="appHref" class="openk-button openk-info error-page-anchor">
-  <mat-icon>
-    first_page
-  </mat-icon>
-  {{ "core.exit." + appExitCode + ".anchor" | translate }}
-</a>
diff --git a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.scss b/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.scss
deleted file mode 100644
index 55464bf..0000000
--- a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-:host {
-  display: flex;
-  flex-flow: column;
-  justify-content: center;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-}
-
-.error-page-title {
-  margin: 0;
-  font-size: 1.75em;
-  padding: 0 1em;
-  text-align: center;
-  font-family: inherit;
-  font-weight: bold;
-  // line-height: 1.25;
-  color: inherit;
-}
-
-.error-page-message {
-  font-size: 1.1em;
-  max-width: 32em;
-  margin: 0.5em 1em 1.5em 1em;
-  text-align: center;
-  font-family: inherit;
-  font-weight: 500;
-  // line-height: 1.25;
-  color: inherit;
-}
-
-.error-page-anchor {
-  margin: 0 0 2em 0;
-}
-
diff --git a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.spec.ts b/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.spec.ts
deleted file mode 100644
index 3a365eb..0000000
--- a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.spec.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-import {ExitPageComponent} from "./exit-page.component";
-
-describe("ExitPageComponent", () => {
-    let component: ExitPageComponent;
-    let fixture: ComponentFixture<ExitPageComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [I18nModule, AppNavigationFrameModule],
-            declarations: [ExitPageComponent]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(ExitPageComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.stories.ts b/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.stories.ts
deleted file mode 100644
index 7ff8f5f..0000000
--- a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.stories.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {MatIconModule} from "@angular/material/icon";
-import {action} from "@storybook/addon-actions";
-import {select, text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {EExitCode} from "../../../../store/root/model/EExitCode";
-import {ExitPageComponent} from "./exit-page.component";
-
-storiesOf("01 Pages / 01 AppNavigationFrame", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({
-        declarations: [
-            ExitPageComponent
-        ],
-        imports: [
-            I18nModule,
-            MatIconModule
-        ]
-    }))
-    .add("Exit Page", () => ({
-        component: ExitPageComponent,
-        props: {
-            appExitCode: select("Exit Code", EExitCode, EExitCode.LOGOUT),
-            appHref: text("Link", "/"),
-            appRouting: action("appRouting")
-        }
-    }));
diff --git a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.ts b/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.ts
deleted file mode 100644
index 1221ecb..0000000
--- a/src/app/pages/app-navigation-frame/components/exit-page/exit-page.component.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, EventEmitter, Input, Output} from "@angular/core";
-import {EExitCode} from "../../../../store/root/model/EExitCode";
-
-@Component({
-    selector: "app-exit-page",
-    templateUrl: "./exit-page.component.html",
-    styleUrls: ["./exit-page.component.scss"]
-})
-export class ExitPageComponent {
-
-    @Input()
-    public appExitCode: EExitCode;
-
-    @Input()
-    public appHref: string;
-
-    @Output()
-    public readonly appRouting = new EventEmitter();
-
-}
diff --git a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.html b/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.html
deleted file mode 100644
index 9cea2db..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<button #appDropDown="appDropDown"
-        (click)="appDropDown.toggle()"
-        [appDropDown]="dropDownTemplate"
-        [class.drop-down-button-opened]="appDropDown.isOpen"
-        class="drop-down-button drop-down-toggle cursor-pointer user-select-none">
-
-  <span class="drop-down-button-label">
-    <ng-content></ng-content>
-  </span>
-
-  <mat-icon
-    [class.drop-down-button-icon-opened]="appDropDown.isOpen"
-    class="drop-down-button-icon">
-    play_arrow
-  </mat-icon>
-
-</button>
-
-<ng-template #dropDownTemplate>
-
-  <div *ngIf="appDropDown.isOpen" class="drop-down-menu">
-
-    <button (click)="logOut()"
-            class="drop-down-button cursor-pointer user-select-none drop-down-menu-item">
-      <span> {{ 'core.logout' | translate}}</span>
-    </button>
-
-  </div>
-</ng-template>
diff --git a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.scss b/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.scss
deleted file mode 100644
index 66e40ca..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.scss
+++ /dev/null
@@ -1,120 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "../../../../../styles/openk.styles";
-
-$drop-down-menu-toggle-contrast: get-color($openk-info-palette, 500);
-$drop-down-menu-toggle-background: get-color($openk-info-palette, 100);
-$drop-down-menu-toggle-border: rgba(0, 0, 0, 0.05);
-$drop-down-menu-contrast: get-color($openk-default-palette, 500, contrast);
-$drop-down-menu-background: get-color($openk-info-palette, A100);
-
-:host {
-  display: inline-flex;
-  justify-content: center;
-  align-items: center;
-  border-radius: 6px;
-  min-width: 9em;
-  height: 2em;
-}
-
-
-.drop-down-button {
-  width: 100%;
-  height: 100%;
-  outline: none;
-  display: inline-flex;
-  justify-content: center;
-  align-items: center;
-  padding: 0.25em 0.5em;
-  margin: 0;
-  font-size: 1em;
-  text-align: center;
-  border-radius: inherit;
-  transition: filter 100ms ease-in;
-
-  &:hover {
-    filter: brightness(0.98);
-  }
-
-  &:focus {
-    filter: brightness(0.96);
-  }
-
-  &:active {
-    filter: brightness(0.94);
-  }
-}
-
-.drop-down-button-label {
-  margin: 0 auto;
-  padding: 1px 3px 0 3px;
-  line-height: 1.5;
-  font-weight: 400;
-  white-space: nowrap;
-  font-size: 0.875em;
-}
-
-.drop-down-button-icon {
-  text-align: center;
-  vertical-align: middle;
-  height: initial;
-  width: initial;
-  font-size: 1em;
-  transition: transform 100ms linear;
-  transform: rotate(90deg);
-}
-
-.drop-down-button-opened {
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
-
-  .drop-down-button-icon {
-    transform: rotate(270deg);
-  }
-}
-
-
-.drop-down-toggle {
-  color: $drop-down-menu-toggle-contrast;
-  background-color: $drop-down-menu-toggle-background;
-  border: 1px solid $drop-down-menu-toggle-border;
-}
-
-
-.drop-down-menu {
-  display: flex;
-  flex-flow: column;
-  width: 100%;
-  background-color: $drop-down-menu-background;
-  color: $drop-down-menu-contrast;
-  border: 1px solid $drop-down-menu-toggle-border;
-  border-top: 0;
-  border-radius: 4px;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-  overflow: hidden;
-  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
-}
-
-.drop-down-menu-item {
-  border: 0;
-  background: inherit;
-  border-bottom: 1px solid $drop-down-menu-toggle-border;
-  border-radius: 0;
-
-  &:last-child {
-    border-bottom: 0;
-  }
-}
diff --git a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.spec.ts b/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.spec.ts
deleted file mode 100644
index 1557c88..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.spec.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-import {DropDownMenuComponent} from "./drop-down-menu.component";
-
-describe("DropDownMenuComponent", () => {
-    let component: DropDownMenuComponent;
-    let fixture: ComponentFixture<DropDownMenuComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [AppNavigationFrameModule, I18nModule]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(DropDownMenuComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-
-    it("should emit log-out", async () => {
-        let count = 0;
-        const subscription = component.appLogOut.subscribe(() => count++);
-        component.logOut();
-        fixture.detectChanges();
-        subscription.unsubscribe();
-        expect(count).toEqual(1);
-    });
-});
diff --git a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.stories.ts b/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.stories.ts
deleted file mode 100644
index 7fc02be..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.stories.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {action} from "@storybook/addon-actions";
-import {text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-
-const template = `
-    <div style="width: 100%; display: flex; justify-content: center; padding: 1em;">
-        <app-drop-down-menu (appLogOut)="appLogOut($event)">
-            {{ngContent}}
-        </app-drop-down-menu>
-    </div>
-`;
-
-storiesOf("01 Pages / 01 AppNavigationFrame", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({
-        imports: [
-            I18nModule,
-            AppNavigationFrameModule
-        ]
-    }))
-    .add("Drop Down Menu", () => ({
-        template,
-        props: {
-            ngContent: text("ngContent", "Hugo Haferkamp"),
-            appLogOut: action("appLogOut")
-        }
-    }));
diff --git a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.ts b/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.ts
deleted file mode 100644
index bc5fea3..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-drop-down-menu/drop-down-menu.component.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-
-import {Component, EventEmitter, Output} from "@angular/core";
-
-@Component({
-    selector: "app-drop-down-menu",
-    templateUrl: "./drop-down-menu.component.html",
-    styleUrls: ["./drop-down-menu.component.scss"]
-})
-export class DropDownMenuComponent {
-
-    @Output()
-    public appLogOut = new EventEmitter<void>();
-
-    public logOut() {
-        this.appLogOut.emit();
-    }
-
-}
diff --git a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.html b/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.html
deleted file mode 100644
index a051fb8..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<div class="page-header">
-
-  <div class="page-header-menu">
-    <a [routerLinkActiveOptions]="{exact: true}"
-       [routerLinkActive]="'page-header-title-active'"
-       [routerLink]="'/'"
-       class="page-header-title cursor-pointer user-select-none">
-      <img alt="" class="page-header-title-logo" src="./assets/logo.png">
-
-      <span class="page-header-title-open">
-        open
-      </span>
-
-      <span class="page-header-title-konsequenz">
-        KONSEQUENZ
-      </span>
-    </a>
-
-    <div *ngIf="!appMenuHidden" class="page-header-menu">
-      <app-drop-down-menu (appLogOut)="logOut()">
-        {{appUserName}}
-      </app-drop-down-menu>
-    </div>
-
-  </div>
-
-  <div class="page-header-border"></div>
-</div>
-
diff --git a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.scss b/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.scss
deleted file mode 100644
index 9ffd58a..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.scss
+++ /dev/null
@@ -1,82 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "src/styles/openk.styles";
-
-:host {
-  display: block;
-  width: 100%;
-}
-
-.page-header-menu {
-  display: flex;
-  align-items: center;
-  width: 100%;
-  height: 50px;
-  background: $openk-header-gradient;
-}
-
-.page-header-title {
-  text-decoration: none !important;
-  outline: none;
-  margin-left: 5px;
-  margin-right: auto;
-  height: 100%;
-  display: flex;
-  align-items: center;
-  font-size: 18px;
-  line-height: 20px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-.page-header-title-active {
-  cursor: default;
-  pointer-events: none;
-}
-
-.page-header-title-logo {
-  height: 100%;
-}
-
-.page-header-title-open {
-  color: #000000;
-  font-size: 1.8em;
-  font-weight: 500;
-  text-transform: lowercase;
-  padding-bottom: 4px;
-  padding-left: 2.5px;
-}
-
-.page-header-title-konsequenz {
-  margin-left: 3px;
-  font-size: 1.35em;
-  color: #000000;
-  text-transform: uppercase;
-  font-weight: 300;
-  padding-top: 1px;
-  padding-right: 15px;
-}
-
-.page-header-menu {
-  display: flex;
-  justify-content: flex-end;
-  align-items: center;
-  margin: 0 1em 0 auto;
-}
-
-
-.page-header-border {
-  height: 4px;
-  width: 100%;
-  background: $openk-header-gadient-border;
-}
diff --git a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.spec.ts b/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.spec.ts
deleted file mode 100644
index dc7f3a2..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.spec.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-import {PageHeaderComponent} from "./page-header.component";
-
-describe("PageHeaderComponent", () => {
-    let component: PageHeaderComponent;
-    let fixture: ComponentFixture<PageHeaderComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [RouterTestingModule, AppNavigationFrameModule]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(PageHeaderComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
-
diff --git a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.ts b/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.ts
deleted file mode 100644
index 732b921..0000000
--- a/src/app/pages/app-navigation-frame/components/nav-header/page-header.component.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-
-import {Component, EventEmitter, Input, Output} from "@angular/core";
-
-@Component({
-    selector: "app-page-header",
-    templateUrl: "./page-header.component.html",
-    styleUrls: ["./page-header.component.scss"]
-})
-export class PageHeaderComponent {
-
-    @Input()
-    public appMenuHidden = false;
-
-    @Input()
-    public appUserName: string;
-
-    @Output()
-    public readonly appLogout = new EventEmitter<void>();
-
-    public logOut() {
-        this.appLogout.emit();
-    }
-
-}
diff --git a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.html b/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.html
deleted file mode 100644
index 39ce31f..0000000
--- a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<app-page-header
-  (appLogout)="appLogout.emit()"
-  [appMenuHidden]="appMenuHidden"
-  [appUserName]="appUserName">
-</app-page-header>
-
-<div class="page-frame-content">
-
-  <div class="page-frame-content-main">
-
-    <ng-container *ngIf="!appIsLoading">
-
-      <app-exit-page
-        (appRouting)="appCloseWindow.emit()"
-        *ngIf="appExitCode != null; else ngContentTemplate"
-        [appExitCode]="appExitCode"
-        [appHref]="appPortalRoute">
-
-      </app-exit-page>
-
-      <ng-template #ngContentTemplate>
-        <ng-content></ng-content>
-      </ng-template>
-
-    </ng-container>
-
-  </div>
-
-  <div class="page-frame-content-footer">
-    {{ 'core.version' | translate: {version: appVersion} }}
-  </div>
-
-</div>
diff --git a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.scss b/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.scss
deleted file mode 100644
index 73b50bc..0000000
--- a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-:host {
-  display: flex;
-  flex-flow: column;
-  height: 100%;
-  width: 100%;
-}
-
-.page-frame-content {
-  flex: 1 1 100%;
-  height: 100%;
-  width: 100%;
-  display: flex;
-  flex-flow: column;
-  overflow: auto;
-}
-
-.page-frame-content-main {
-  width: 100%;
-  flex: 1 1 100%;
-  display: flex;
-  flex-flow: column;
-}
-
-.page-frame-content-footer {
-  margin-left: auto;
-  box-sizing: border-box;
-  font-size: x-small;
-  display: flex;
-  justify-content: flex-end;
-  align-items: center;
-  padding: 0.5em;
-}
diff --git a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.spec.ts b/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.spec.ts
deleted file mode 100644
index 5de0b4a..0000000
--- a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.spec.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-import {PageFrameComponent} from "./page-frame.component";
-
-describe("PageFrameComponent", () => {
-    let component: PageFrameComponent;
-    let fixture: ComponentFixture<PageFrameComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [RouterTestingModule, AppNavigationFrameModule, I18nModule],
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(PageFrameComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.ts b/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.ts
deleted file mode 100644
index a39b0bc..0000000
--- a/src/app/pages/app-navigation-frame/components/page-frame/page-frame.component.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, EventEmitter, Input, Output} from "@angular/core";
-import {EExitCode} from "../../../../store/root/model/EExitCode";
-
-@Component({
-    selector: "app-page-frame",
-    templateUrl: "./page-frame.component.html",
-    styleUrls: ["./page-frame.component.scss"]
-})
-export class PageFrameComponent {
-
-    @Input()
-    public appExitCode: EExitCode;
-
-    @Input()
-    public appIsLoading = false;
-
-    @Input()
-    public appMenuHidden = false;
-
-    @Input()
-    public appPortalRoute: string;
-
-    @Input()
-    public appUserName: string;
-
-    @Input()
-    public appVersion: string;
-
-    @Output()
-    public readonly appCloseWindow = new EventEmitter<void>();
-
-    @Output()
-    public readonly appLogout = new EventEmitter<void>();
-
-}
diff --git a/src/app/pages/app-navigation-frame/components/page-frame/page-header.component.stories.ts b/src/app/pages/app-navigation-frame/components/page-frame/page-header.component.stories.ts
deleted file mode 100644
index b37df00..0000000
--- a/src/app/pages/app-navigation-frame/components/page-frame/page-header.component.stories.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {RouterTestingModule} from "@angular/router/testing";
-import {action} from "@storybook/addon-actions";
-import {boolean, select, text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {I18nModule} from "../../../../core/i18n/i18n.module";
-import {EExitCode} from "../../../../store/root/model/EExitCode";
-import {AppNavigationFrameModule} from "../../app-navigation-frame.module";
-
-const template = `
-    <app-page-frame
-        (appCloseWindow)="closeWindow()"
-        (appLogout)="logOut()"
-        [appExitCode]="showExitPage ? appExitCode : undefined"
-        [appIsLoading]="appIsLoading"
-        [appMenuHidden]="appMenuHidden"
-        [appPortalRoute]="appPortalRoute"
-        [appUserName]="appUserName"
-        [appVersion]="appVersion">
-        <div style="box-sizing: border-box; width: 100%;"
-            [style.height]="withOverflow ? '120vh' : '100%'">
-        </div>
-    </app-page-frame>
-`;
-
-storiesOf("01 Pages / 01 AppNavigationFrame", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({
-        imports: [
-            RouterTestingModule,
-            I18nModule,
-            AppNavigationFrameModule
-        ]
-    }))
-    .add("Page Frame", () => ({
-        template,
-        props: {
-            // Inputs
-            appExitCode: select("Exit Code", EExitCode, EExitCode.LOGOUT),
-            appIsLoading: boolean("Loading", false),
-            appMenuHidden: boolean("Menu Hidden", false),
-            appPortalRoute: text("Portal Route", "/"),
-            appUserName: text("User", "Hugo Haferkamp"),
-            appVersion: text("Version", "1.2.3/1.2.3"),
-            showExitPage: boolean("showExitPage", false),
-            withOverflow: boolean("Overflow", false),
-            // Outputs
-            appCloseWindow: action("appCloseWindow"),
-            appLogOut: action("appLogOut")
-        }
-    }));
diff --git a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.html b/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.html
deleted file mode 100644
index 0273255..0000000
--- a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<app-card *ngIf="appItem"
-          [appCardHeader]="headerActions"
-          [appTitle]="appItem?.id + ' ' + appItem?.title">
-
-  <ng-template #headerActions>
-    <span class="dashboard-item-header-actions">
-      <a [queryParams]="{id: appItem?.id}" class="openk-button openk-button-rounded openk-info" routerLink="/details">
-        <mat-icon>find_in_page</mat-icon>
-      </a>
-
-      <button class="openk-button openk-button-rounded openk-info" disabled>
-        <mat-icon>create</mat-icon>
-      </button>
-    </span>
-  </ng-template>
-
-  <span *ngIf="appItem?.dueDate">
-    Frist: {{appItem.dueDate}}
-  </span>
-
-</app-card>
diff --git a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.spec.ts b/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.spec.ts
deleted file mode 100644
index 1998914..0000000
--- a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {DashboardItemComponent} from "./dashboard-item.component";
-
-describe("DashboardItemComponent", () => {
-    let component: DashboardItemComponent;
-    let fixture: ComponentFixture<DashboardItemComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [DashboardItemComponent],
-            imports: [RouterTestingModule]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(DashboardItemComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.ts b/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.ts
deleted file mode 100644
index 1e56269..0000000
--- a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, Input} from "@angular/core";
-import {IStatementEntity} from "../../../../store/statements/model/IStatementEntity";
-
-@Component({
-    selector: "app-dashboard-item",
-    templateUrl: "./dashboard-item.component.html",
-    styleUrls: ["./dashboard-item.component.scss"]
-})
-export class DashboardItemComponent {
-
-    @Input()
-    public appItem: IStatementEntity;
-
-}
diff --git a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.scss b/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.scss
deleted file mode 100644
index 896dc1e..0000000
--- a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-:host {
-  display: flex;
-  flex-flow: column;
-}
-
-.dashboard-list-title {
-  margin: 0 auto 0.5em 0;
-}
-
-.dashboard-list-title-text {
-  font-size: large;
-}
-
-.dashboard-list-item {
-  width: 100%;
-
-  &:not(:last-child) {
-    margin-bottom: 1em;
-  }
-}
diff --git a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.spec.ts b/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.spec.ts
deleted file mode 100644
index b00b8be..0000000
--- a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.spec.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-
-import {DashboardListComponent} from "./dashboard-list.component";
-
-describe("DashboardListComponent", () => {
-    let component: DashboardListComponent;
-    let fixture: ComponentFixture<DashboardListComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [DashboardListComponent]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(DashboardListComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.ts b/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.ts
deleted file mode 100644
index 7caab96..0000000
--- a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, Input} from "@angular/core";
-import {IStatementEntity} from "../../../../store/statements/model/IStatementEntity";
-
-@Component({
-    selector: "app-dashboard-list",
-    templateUrl: "./dashboard-list.component.html",
-    styleUrls: ["./dashboard-list.component.scss"]
-})
-export class DashboardListComponent {
-
-    @Input()
-    public appTitle: string;
-
-    @Input()
-    public appItems: IStatementEntity[];
-
-}
diff --git a/src/app/pages/dashboard/components/dashboard/dashboard.component.html b/src/app/pages/dashboard/components/dashboard/dashboard.component.html
deleted file mode 100644
index c4a0e1c..0000000
--- a/src/app/pages/dashboard/components/dashboard/dashboard.component.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<div class="dashboard-header">
-
-  <span class="dashboard-header-title">Stellungnahmen öffentlicher Belange</span>
-
-  <div class="dashboard-header-actions">
-    <button class="openk-button openk-info" disabled>
-      <mat-icon>view_list</mat-icon>
-      Alle Stellungnahmen anzeigen
-    </button>
-
-    <a class="openk-button openk-info" routerLink="/new">
-      <mat-icon>note_add</mat-icon>
-      Neue Stellungnahme hinzufügen
-    </a>
-  </div>
-</div>
-
-<div class="dashboard">
-  <app-dashboard-list
-    [appItems]="unfinishedStatements$ | async"
-    [appTitle]="'Aktive Vorgänge'"
-    class="dashboard-list">
-
-  </app-dashboard-list>
-
-  <app-dashboard-list
-    [appItems]="finishedStatements$ | async"
-    [appTitle]="'Abgeschlossene Vorgänge'"
-    class="dashboard-list">
-
-  </app-dashboard-list>
-</div>
diff --git a/src/app/pages/dashboard/components/dashboard/dashboard.component.scss b/src/app/pages/dashboard/components/dashboard/dashboard.component.scss
deleted file mode 100644
index 46acc2e..0000000
--- a/src/app/pages/dashboard/components/dashboard/dashboard.component.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "src/styles/openk.styles";
-
-:host {
-  display: flex;
-  flex-flow: column;
-  padding: 1em;
-}
-
-.dashboard-header {
-  width: 100%;
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center;
-}
-
-.dashboard-header-title {
-  margin-right: auto;
-  font-size: x-large;
-  font-weight: 600;
-}
-
-.dashboard-header-actions {
-  display: flex;
-  flex-flow: row wrap;
-  margin-left: auto;
-  justify-content: flex-end;
-
-  .openk-button {
-    margin: 0.25em;
-  }
-}
-
-.dashboard {
-  width: 100%;
-  display: flex;
-  flex-flow: row;
-  margin-top: 1em;
-}
-
-.dashboard-list {
-  margin: 0 0.5em;
-  flex: 1 1 50%;
-}
-
-@media (max-width: 50em) {
-
-  .dashboard {
-    flex-flow: row wrap;
-  }
-
-  .dashboard-list {
-    margin-bottom: 1em;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-}
diff --git a/src/app/pages/dashboard/components/dashboard/dashboard.component.ts b/src/app/pages/dashboard/components/dashboard/dashboard.component.ts
deleted file mode 100644
index 8fce5be..0000000
--- a/src/app/pages/dashboard/components/dashboard/dashboard.component.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, OnInit} from "@angular/core";
-import {select, Store} from "@ngrx/store";
-import {fetchStatementsAction} from "../../../../store/statements/statements.actions";
-import {finishedStatementsListSelector, unfinishedStatementsListSelector} from "../../../../store/statements/statements.selectors";
-
-@Component({
-    selector: "app-dashboard",
-    templateUrl: "./dashboard.component.html",
-    styleUrls: ["./dashboard.component.scss"]
-})
-export class DashboardComponent implements OnInit {
-
-    public readonly finishedStatements$ = this.store.pipe(select(finishedStatementsListSelector));
-
-    public readonly unfinishedStatements$ = this.store.pipe(select(unfinishedStatementsListSelector));
-
-    public constructor(private readonly store: Store) {
-
-    }
-
-    public ngOnInit(): void {
-        this.store.dispatch(fetchStatementsAction());
-    }
-
-
-}
diff --git a/src/app/pages/dashboard/dashboard-routing.module.ts b/src/app/pages/dashboard/dashboard-routing.module.ts
deleted file mode 100644
index 37749e5..0000000
--- a/src/app/pages/dashboard/dashboard-routing.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {NgModule} from "@angular/core";
-import {RouterModule, Routes} from "@angular/router";
-import {DashboardComponent} from "./components/dashboard/dashboard.component";
-
-const routes: Routes = [
-    {
-        path: "",
-        pathMatch: "full",
-        component: DashboardComponent
-    }
-];
-
-@NgModule({
-    imports: [
-        RouterModule.forChild(routes)
-    ],
-    exports: [
-        RouterModule
-    ]
-})
-export class DashboardRoutingModule {
-
-}
diff --git a/src/app/pages/dashboard/dashboard.module.ts b/src/app/pages/dashboard/dashboard.module.ts
deleted file mode 100644
index 013ef09..0000000
--- a/src/app/pages/dashboard/dashboard.module.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {CardModule} from "../../shared/card/card.module";
-import {DashboardItemComponent} from "./components/dashboard-item/dashboard-item.component";
-import {DashboardListComponent} from "./components/dashboard-list/dashboard-list.component";
-import {DashboardComponent} from "./components/dashboard/dashboard.component";
-import {DashboardRoutingModule} from "./dashboard-routing.module";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        DashboardRoutingModule,
-        MatIconModule,
-        CardModule
-    ],
-    declarations: [
-        DashboardComponent,
-        DashboardListComponent,
-        DashboardItemComponent
-    ],
-    exports: [
-        DashboardComponent,
-        DashboardListComponent,
-        DashboardItemComponent
-    ]
-})
-export class DashboardModule {
-
-}
diff --git a/src/app/pages/details/components/statement-details/statement-details.component.html b/src/app/pages/details/components/statement-details/statement-details.component.html
deleted file mode 100644
index d004aa2..0000000
--- a/src/app/pages/details/components/statement-details/statement-details.component.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<div class="dashboard-header">
-
-  <span class="dashboard-header-title">Stellungnahmen öffentlicher Belange - Detailansicht</span>
-
-  <div class="dashboard-header-actions">
-
-    <a #homeAnchor class="openk-button openk-info" routerLink="/">
-      <mat-icon>arrow_back</mat-icon>
-      Zurück zur Übersicht
-    </a>
-
-  </div>
-</div>
-
-<app-card
-  *ngIf="(statement$ | async) != null"
-  [appTitle]="(id$ | async) + ' ' + (statement$ | async)?.title"
-  class="statement-details">
-
-  <span *ngIf="(statement$ | async)?.dueDate">
-    Frist: {{(statement$ | async)?.dueDate}}
-  </span>
-
-</app-card>
diff --git a/src/app/pages/details/components/statement-details/statement-details.component.scss b/src/app/pages/details/components/statement-details/statement-details.component.scss
deleted file mode 100644
index 8f9d80d..0000000
--- a/src/app/pages/details/components/statement-details/statement-details.component.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  display: flex;
-  flex-flow: column;
-  padding: 1em;
-  align-items: center;
-}
-
-.dashboard-header {
-  width: 100%;
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center;
-}
-
-.dashboard-header-title {
-  margin-right: auto;
-  font-size: x-large;
-  font-weight: 600;
-}
-
-.dashboard-header-actions {
-  display: flex;
-  flex-flow: row wrap;
-  margin-left: auto;
-  justify-content: flex-end;
-
-  .openk-button {
-    margin: 0.25em;
-  }
-}
-
-.statement-details {
-  margin-top: 1em;
-  width: 100%;
-  max-width: 50em;
-}
diff --git a/src/app/pages/details/components/statement-details/statement-details.component.spec.ts b/src/app/pages/details/components/statement-details/statement-details.component.spec.ts
deleted file mode 100644
index b376702..0000000
--- a/src/app/pages/details/components/statement-details/statement-details.component.spec.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {provideMockStore} from "@ngrx/store/testing";
-import {StatementDetailsComponent} from "./statement-details.component";
-
-describe("StatementDetailsComponent", () => {
-    let component: StatementDetailsComponent;
-    let fixture: ComponentFixture<StatementDetailsComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [StatementDetailsComponent],
-            imports: [RouterTestingModule],
-            providers: [provideMockStore({})]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(StatementDetailsComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/details/components/statement-details/statement-details.component.ts b/src/app/pages/details/components/statement-details/statement-details.component.ts
deleted file mode 100644
index 2b25872..0000000
--- a/src/app/pages/details/components/statement-details/statement-details.component.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, OnDestroy, OnInit} from "@angular/core";
-import {select, Store} from "@ngrx/store";
-import {Observable, Subscription} from "rxjs";
-import {filter, switchMap} from "rxjs/operators";
-import {queryParamsIdSelector} from "../../../../store/root/selectors/query-params.selectors";
-import {IStatementEntity} from "../../../../store/statements/model/IStatementEntity";
-import {fetchStatementDetailsAction} from "../../../../store/statements/statements.actions";
-import {statementSelector} from "../../../../store/statements/statements.selectors";
-
-@Component({
-    selector: "app-statement-details",
-    templateUrl: "./statement-details.component.html",
-    styleUrls: ["./statement-details.component.scss"]
-})
-export class StatementDetailsComponent implements OnInit, OnDestroy {
-
-    public id$: Observable<number>;
-
-    public statement$: Observable<IStatementEntity>;
-
-    private subsription: Subscription;
-
-    public constructor(private readonly store: Store) {
-        this.id$ = this.store.pipe(select(queryParamsIdSelector));
-
-        this.statement$ = this.id$.pipe(
-            switchMap((id) => this.store.pipe(select(statementSelector, {id})))
-        );
-    }
-
-    public ngOnInit(): void {
-        this.subsription = this.id$
-            .pipe(filter((id) => id != null))
-            .subscribe((id) => this.store.dispatch(fetchStatementDetailsAction({id})));
-    }
-
-    public ngOnDestroy(): void {
-        if (this.subsription != null) {
-            this.subsription.unsubscribe();
-        }
-    }
-
-}
diff --git a/src/app/pages/details/statement-details-routing.module.ts b/src/app/pages/details/statement-details-routing.module.ts
deleted file mode 100644
index 8d24f64..0000000
--- a/src/app/pages/details/statement-details-routing.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {NgModule} from "@angular/core";
-import {RouterModule, Routes} from "@angular/router";
-import {StatementDetailsComponent} from "./components/statement-details/statement-details.component";
-
-const routes: Routes = [
-    {
-        path: "",
-        pathMatch: "full",
-        component: StatementDetailsComponent
-    }
-];
-
-@NgModule({
-    imports: [
-        RouterModule.forChild(routes)
-    ],
-    exports: [
-        RouterModule
-    ]
-})
-export class StatementDetailsRoutingModule {
-
-}
diff --git a/src/app/pages/details/statement-details.module.ts b/src/app/pages/details/statement-details.module.ts
deleted file mode 100644
index fdf9497..0000000
--- a/src/app/pages/details/statement-details.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {FormsModule} from "@angular/forms";
-import {MatIconModule} from "@angular/material/icon";
-import {CardModule} from "../../shared/card/card.module";
-import {StatementDetailsComponent} from "./components/statement-details/statement-details.component";
-import {StatementDetailsRoutingModule} from "./statement-details-routing.module";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        FormsModule,
-        StatementDetailsRoutingModule,
-        MatIconModule,
-        CardModule
-    ],
-    declarations: [
-        StatementDetailsComponent
-    ],
-})
-export class StatementDetailsModule {
-
-}
diff --git a/src/app/pages/new/components/new-statement/new-statement.component.html b/src/app/pages/new/components/new-statement/new-statement.component.html
deleted file mode 100644
index 66e174c..0000000
--- a/src/app/pages/new/components/new-statement/new-statement.component.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<div class="dashboard-header">
-
-  <span class="dashboard-header-title">Stellungnahmen öffentlicher Belange</span>
-
-  <div class="dashboard-header-actions">
-
-    <a #homeAnchor class="openk-button openk-info" routerLink="/">
-      <mat-icon>arrow_back</mat-icon>
-      Zurück zur Übersicht
-    </a>
-
-  </div>
-</div>
-
-<app-card appTitle="Neue Stellungnahme hinzufügen"
-          class="new-statement">
-  <form #statementForm="ngForm" (ngSubmit)="submit(statementForm);" class="new-statement-form">
-
-    <div class="new-statement-form-group">
-      <label class="new-statement-form-group-label" for="new-statement-title">
-        Titel:
-      </label>
-
-      <input #titleModel="ngModel"
-             [class.openk-danger]="titleModel.invalid && titleModel.touched"
-             [ngModel]="title"
-             class="new-statement-form-group-input openk-input" id="new-statement-title" name="title" required>
-    </div>
-
-    <div class="new-statement-form-group">
-      <label class="new-statement-form-group-label" for="new-statement-due-date">
-        Frist:
-      </label>
-
-      <input #dateModel="ngModel"
-             [class.openk-danger]="dateModel.invalid && dateModel.touched" [ngModel]="dueDate | date : 'yyyy-LL-dd'"
-             class="new-statement-form-group-input openk-input" id="new-statement-due-date"
-             name="dueDate"
-             required
-             type="date">
-    </div>
-
-    <div class="new-statement-form-group">
-      <button (click)="inputElement.click()"
-              class="openk-button new-statement-attachment-button"
-              type="button">
-
-        <mat-icon>
-          attach_file
-        </mat-icon>
-
-        <span>
-          Anlagen hinzufügen
-        </span>
-
-      </button>
-
-      <input #inputElement id="new-statement-attachments" style="display: none;" type="file">
-    </div>
-
-    <div class="new-statement-form-submit">
-      <button [disabled]="statementForm.invalid"
-              class="openk-button openk-success dashboard-header-actions-button">
-        <mat-icon>note_add</mat-icon>
-        Stellungnahme anlegen
-      </button>
-    </div>
-
-  </form>
-</app-card>
-
diff --git a/src/app/pages/new/components/new-statement/new-statement.component.scss b/src/app/pages/new/components/new-statement/new-statement.component.scss
deleted file mode 100644
index 59cf1da..0000000
--- a/src/app/pages/new/components/new-statement/new-statement.component.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  display: flex;
-  flex-flow: column;
-  padding: 1em;
-  align-items: center;
-}
-
-.dashboard-header {
-  width: 100%;
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center;
-}
-
-.dashboard-header-title {
-  margin-right: auto;
-  font-size: x-large;
-  font-weight: 600;
-}
-
-.dashboard-header-actions {
-  display: flex;
-  flex-flow: row wrap;
-  margin-left: auto;
-  justify-content: flex-end;
-
-  .openk-button {
-    margin: 0.25em;
-  }
-}
-
-.new-statement {
-  margin-top: 1em;
-  max-width: 35em;
-  width: 100%;
-}
-
-.new-statement-form {
-  display: flex;
-  flex-flow: column;
-  width: 100%;
-}
-
-.new-statement-form-group {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  margin-bottom: 1em;
-}
-
-.new-statement-form-group-label {
-  padding-right: 1em;
-  display: inline-block;
-  min-width: 3em;
-}
-
-.new-statement-form-group-input {
-  width: 20em;
-}
-
-.new-statement-attachment-button {
-  width: 22em;
-  border-style: dashed;
-  margin-left: 4.5em;
-  padding: 2em 1em;
-  opacity: 0.7;
-}
-
-.new-statement-form-submit {
-  margin-top: 0.5em;
-  display: flex;
-  justify-content: flex-end;
-}
diff --git a/src/app/pages/new/components/new-statement/new-statement.component.spec.ts b/src/app/pages/new/components/new-statement/new-statement.component.spec.ts
deleted file mode 100644
index 92e6621..0000000
--- a/src/app/pages/new/components/new-statement/new-statement.component.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {FormsModule} from "@angular/forms";
-import {RouterTestingModule} from "@angular/router/testing";
-import {provideMockStore} from "@ngrx/store/testing";
-import {NewStatementComponent} from "./new-statement.component";
-
-describe("NewStatementComponent", () => {
-    let component: NewStatementComponent;
-    let fixture: ComponentFixture<NewStatementComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [NewStatementComponent],
-            imports: [RouterTestingModule, FormsModule],
-            providers: [provideMockStore({})]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(NewStatementComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/pages/new/components/new-statement/new-statement.component.ts b/src/app/pages/new/components/new-statement/new-statement.component.ts
deleted file mode 100644
index 16ed821..0000000
--- a/src/app/pages/new/components/new-statement/new-statement.component.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component} from "@angular/core";
-import {NgForm} from "@angular/forms";
-import {Store} from "@ngrx/store";
-import {addNewStatementAction} from "../../../../store/statements/statements.actions";
-
-@Component({
-    selector: "app-new-statement",
-    templateUrl: "./new-statement.component.html",
-    styleUrls: ["./new-statement.component.scss"]
-})
-export class NewStatementComponent {
-
-    public title = "";
-
-    public dueDate = new Date();
-
-    public constructor(private readonly store: Store) {
-
-    }
-
-    public submit(form: NgForm) {
-        if (form.valid) {
-            this.store.dispatch(addNewStatementAction(form.value));
-        }
-    }
-
-}
diff --git a/src/app/pages/new/new-statement-routing.module.ts b/src/app/pages/new/new-statement-routing.module.ts
deleted file mode 100644
index d858139..0000000
--- a/src/app/pages/new/new-statement-routing.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {NgModule} from "@angular/core";
-import {RouterModule, Routes} from "@angular/router";
-import {NewStatementComponent} from "./components/new-statement/new-statement.component";
-
-const routes: Routes = [
-    {
-        path: "",
-        pathMatch: "full",
-        component: NewStatementComponent
-    }
-];
-
-@NgModule({
-    imports: [
-        RouterModule.forChild(routes)
-    ],
-    exports: [
-        RouterModule
-    ]
-})
-export class NewStatementRoutingModule {
-
-}
diff --git a/src/app/pages/new/new-statement.module.ts b/src/app/pages/new/new-statement.module.ts
deleted file mode 100644
index 57fda3a..0000000
--- a/src/app/pages/new/new-statement.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {FormsModule} from "@angular/forms";
-import {MatIconModule} from "@angular/material/icon";
-import {CardModule} from "../../shared/card/card.module";
-import {NewStatementComponent} from "./components/new-statement/new-statement.component";
-import {NewStatementRoutingModule} from "./new-statement-routing.module";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        FormsModule,
-        NewStatementRoutingModule,
-        MatIconModule,
-        CardModule
-    ],
-    declarations: [
-        NewStatementComponent
-    ],
-})
-export class NewStatementModule {
-
-}
diff --git a/src/app/shared/card/card.component.html b/src/app/shared/card/card.component.html
deleted file mode 100644
index ab701a3..0000000
--- a/src/app/shared/card/card.component.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<div *ngIf="appCardHeader != null || appTitle != null" class="card-header">
-  <span *ngIf="appTitle" class="card-header-title">
-    {{appTitle}}
-  </span>
-
-  <ng-container *ngTemplateOutlet="appCardHeader"></ng-container>
-</div>
-
-<div class="card-body">
-
-  <ng-content></ng-content>
-
-</div>
diff --git a/src/app/shared/card/card.component.scss b/src/app/shared/card/card.component.scss
deleted file mode 100644
index 06bcbf6..0000000
--- a/src/app/shared/card/card.component.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  background: get-color($openk-default-palette);
-  border: 1px solid $openk-form-border;
-  border-radius: 4px;
-  box-sizing: border-box;
-  display: flex;
-  flex-flow: column;
-}
-
-.card-header {
-  padding: 0.4em 0.5em 0.4em 1em;
-  background: $openk-background-highlight;
-  border-bottom: 1px solid $openk-form-border;
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center;
-  border-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-}
-
-.card-header-title {
-  font-size: large;
-}
-
-.card-body {
-  padding: 1em;
-  display: flex;
-  flex-flow: column;
-}
diff --git a/src/app/shared/card/card.component.spec.ts b/src/app/shared/card/card.component.spec.ts
deleted file mode 100644
index 846976c..0000000
--- a/src/app/shared/card/card.component.spec.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {CardComponent} from "./card.component";
-
-describe("CardComponent", () => {
-    let component: CardComponent;
-    let fixture: ComponentFixture<CardComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [CardComponent]
-        })
-            .compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(CardComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/shared/card/card.component.ts b/src/app/shared/card/card.component.ts
deleted file mode 100644
index f025885..0000000
--- a/src/app/shared/card/card.component.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, Input, TemplateRef} from "@angular/core";
-
-@Component({
-    selector: "app-card",
-    templateUrl: "./card.component.html",
-    styleUrls: ["./card.component.scss"]
-})
-export class CardComponent {
-
-    @Input()
-    public appTitle: string;
-
-    @Input()
-    public appCardHeader: TemplateRef<any>;
-
-}
diff --git a/src/app/shared/card/index.ts b/src/app/shared/card/index.ts
deleted file mode 100644
index d44e396..0000000
--- a/src/app/shared/card/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./card.component";
-export * from "./card.module";
diff --git a/src/app/shared/comments/comments.component.html b/src/app/shared/comments/comments.component.html
deleted file mode 100644
index d44eb8d..0000000
--- a/src/app/shared/comments/comments.component.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<app-collapsible
-  (appCollapsedChange)="$event ? appCommentsToShow = 5 : null"
-  [appCollapsed]="appCollapsed"
-  [appTitle]="('comments.title' | translate) + ' (' + appComments?.length +')'">
-
-  <div class="comments">
-
-    <div *ngIf="appComments?.length > 0" class="comments--list">
-
-      <div *ngIf="appCommentsToShow < appComments?.length"
-           class="comments--list--buttons comments--list--buttons---size">
-
-        <button (click)="showMore()"
-                *ngIf="appCommentsToShow + 5 < appComments?.length"
-                class="comments--list--buttons--button openk-button">
-          {{"comments.showPrevious" | translate}}
-        </button>
-        <button (click)="showMore(true)"
-                class="openk-button">
-          {{"comments.showAll" | translate}}
-        </button>
-
-      </div>
-
-      <div *ngFor="let comment of appComments?.slice(-appCommentsToShow)"
-           class="comments--list--comment">
-
-        <div class="comments--list--comment--header">
-          <span class="comments--list--comment--header--author">{{comment.firstName + " " + comment.lastName}}</span>
-          <span class="comments--list--comment--header--time">
-            {{(comment.timestamp | appMomentPipe).format(timeDisplayFormat)}}
-          </span>
-          <button (click)="onDelete(comment.id)" *ngIf="comment.editable"
-                  class="comments--list--comment--header--button"
-                  mat-icon-button>
-            <mat-icon class="comments--list--comment--header--button--icon">delete_forever</mat-icon>
-          </button>
-        </div>
-        <div class="comments--list--comment--text">
-          <ng-container *ngFor="let block of comment?.text?.split('\n')">
-            {{block}} <br>
-          </ng-container>
-        </div>
-
-      </div>
-    </div>
-    <div class="comments--newcomment">
-
-    <textarea #textAreaElement (input)="onInput()"
-              [placeholder]="'comments.placeholder' | translate"
-              class="openk-textarea comments--newcomment--textfield"
-              [value]="''"
-              rows="1">
-    </textarea>
-
-      <div *ngIf="hasInputSomething" class="comments--newcomment--textfield--buttons">
-        <button #test (click)="clear()"
-                class="comments--newcomment--textfield--buttons--first-button openk-button openk-danger">
-          {{"shared.actions.delete" | translate}}
-        </button>
-        <button (click)="onSave()"
-                class="openk-button openk-success">{{"shared.actions.save" | translate}}</button>
-      </div>
-    </div>
-
-  </div>
-
-</app-collapsible>
diff --git a/src/app/shared/comments/comments.component.scss b/src/app/shared/comments/comments.component.scss
deleted file mode 100644
index 37207f7..0000000
--- a/src/app/shared/comments/comments.component.scss
+++ /dev/null
@@ -1,101 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "src/styles/openk.styles";
-
-:host {
-  display: block;
-  width: 100%;
-}
-
-.comments {
-  width: 100%;
-  height: 100%;
-  padding: 1em;
-  box-sizing: border-box;
-  position: relative;
-  display: grid;
-  grid-template-rows: 1fr auto;
-  grid-template-columns: 100%;
-}
-
-.comments--list--buttons {
-  margin-bottom: 1em;
-}
-
-.comments--list--buttons---size {
-  font-size: 11px;
-}
-
-.comments--list--buttons--button {
-  margin-right: 0.5em;
-}
-
-.comments--list--comment {
-  margin-bottom: 0.75em;
-}
-
-.comments--list--comment--header {
-  margin-bottom: 0.2em;
-  display: flex;
-  align-items: center;
-}
-
-.comments--list--comment--text {
-  width: 100%;
-  word-wrap: break-word;
-}
-
-.comments--list--comment--header--author {
-  font-weight: bold;
-  margin-right: 0.25em;
-}
-
-.comments--list--comment--header--time {
-  margin-right: 0.25em;
-}
-
-.comments--list--comment--header--button {
-  width: 16px;
-  height: 16px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  line-height: 0;
-}
-
-.comments--list--comment--header--button--icon {
-  font-size: 14px;
-  width: 16px;
-  height: 16px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.comments--newcomment--textfield {
-  resize: none;
-  width: 100%;
-  box-sizing: border-box;
-  min-height: 2.5em;
-}
-
-.comments--newcomment--textfield--buttons {
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 0.5em;
-}
-
-.comments--newcomment--textfield--buttons--first-button {
-  margin-right: 0.5em;
-}
diff --git a/src/app/shared/comments/comments.component.spec.ts b/src/app/shared/comments/comments.component.spec.ts
deleted file mode 100644
index 862f10a..0000000
--- a/src/app/shared/comments/comments.component.spec.ts
+++ /dev/null
@@ -1,165 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, ElementRef, ViewChild} from "@angular/core";
-import {ComponentFixture, TestBed} from "@angular/core/testing";
-import {By} from "@angular/platform-browser";
-import {IAPICommentModel} from "../../core/api/statements";
-import {I18nModule} from "../../core/i18n";
-import {CommentsComponent} from "./comments.component";
-import {CommentsModule} from "./comments.module";
-
-@Component({
-    selector: `app-host-component`,
-    template: `
-        <app-comments #comments
-                      [appComments]="appComments"
-                      [appCommentsToShow]="appCommentsToShow"
-                      (appDelete)="deleteComment($event)"
-                      (appAdd)="addComment($event)"></app-comments>
-    `
-})
-class TestHostComponent {
-    public appComments: Array<IAPICommentModel>;
-    @ViewChild("comments", {read: ElementRef}) comments: ElementRef;
-
-    public appCommentsToShow = 3;
-
-    public constructor() {
-        this.appComments = [];
-    }
-
-    public addComment(text: string) {
-        this.appComments.push(
-            {
-                id: this.appComments.length,
-                text,
-                userName: "test01",
-                firstName: "Vorname",
-                lastName: "Nachname",
-                timestamp: new Date().toString(),
-                editable: true
-            }
-        );
-    }
-
-    public deleteComment(id: number) {
-        this.appComments.splice(id - 1, 1);
-    }
-}
-
-describe("CommentsComponent", () => {
-    let component: TestHostComponent;
-    let fixture: ComponentFixture<TestHostComponent>;
-    let childComponent: CommentsComponent;
-
-    beforeEach(async () => {
-        await TestBed.configureTestingModule({
-            declarations: [TestHostComponent, CommentsComponent],
-            imports: [
-                CommentsModule,
-                I18nModule
-            ],
-        }).compileComponents();
-    });
-    beforeEach(() => {
-        fixture = TestBed.createComponent(TestHostComponent);
-        component = fixture.componentInstance;
-        childComponent = fixture.debugElement.query(By.directive(CommentsComponent)).componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-
-    it("should emit appNewComment with the comment text", () => {
-        spyOn(childComponent.appAdd, "emit").and.callThrough();
-        const textField = fixture.debugElement.query(By.css(".comments--newcomment--textfield"));
-        textField.nativeElement.value = "test comment text";
-        childComponent.onSave();
-        expect(childComponent.appAdd.emit).toHaveBeenCalledWith("test comment text");
-    });
-
-    it("should emit appDeleteComment with the comment id", () => {
-        spyOn(childComponent.appDelete, "emit").and.callThrough();
-        childComponent.onDelete(1);
-        expect(childComponent.appDelete.emit).toHaveBeenCalledWith(1);
-    });
-
-    it("should always show the full textarea", () => {
-        spyOn(childComponent, "resize").and.callThrough();
-        const textField = fixture.debugElement.query(By.css(".comments--newcomment--textfield")).nativeElement;
-        expect(textField.scrollTop).toBe(0);
-        textField.value = `A long comment that wraps to multiple rows.
-         There should be no scroll bar, the textarea field has to grow with the given input. So scrolltop has to stay 0.`;
-        textField.dispatchEvent(new Event("input"));
-        fixture.detectChanges();
-        expect(textField.scrollTop).toBe(0);
-        expect(childComponent.resize).toHaveBeenCalled();
-    });
-
-    it("should reset value on save and delete", () => {
-        const textField = fixture.debugElement.query(By.css(".comments--newcomment--textfield")).nativeElement;
-        textField.value = `Example value`;
-        childComponent.onSave();
-        expect(textField.value).toEqual("");
-        textField.value = `Example value`;
-        childComponent.clear();
-        expect(textField.value).toEqual("");
-    });
-
-    it("should set hasInputSomething on input", () => {
-        const textField = fixture.debugElement.query(By.css(".comments--newcomment--textfield")).nativeElement;
-        expect(childComponent.hasInputSomething).toBe(false);
-        textField.value = "Example value";
-        textField.dispatchEvent(new Event("input"));
-        expect(childComponent.hasInputSomething).toBe(true);
-        textField.value = "";
-        textField.dispatchEvent(new Event("input"));
-        expect(childComponent.hasInputSomething).toBe(false);
-    });
-
-    it("should only show save button when there was a text input", () => {
-        let button = fixture.debugElement.query(By.css(".openk-button.openk-success"));
-        expect(button).toBeFalsy();
-        childComponent.hasInputSomething = true;
-        fixture.detectChanges();
-        button = fixture.debugElement.query(By.css(".openk-button.openk-success"));
-        expect(button).toBeTruthy();
-    });
-
-    it("should show commentsToShow amount of comments", () => {
-        childComponent.appComments = new Array(22).fill(1).map((el, index) => ({
-            id: index,
-            text: "test text",
-            userName: "User1",
-            firstName: "Franz",
-            lastName: "Meier",
-            timestamp: "2007-08-31T16:47+00:00",
-            editable: true
-        }));
-        childComponent.appCommentsToShow = 5;
-        fixture.detectChanges();
-        let comments = fixture.debugElement.queryAll(By.css(".comments--list--comment"));
-        expect(comments.length).toEqual(5);
-        childComponent.showMore();
-        fixture.detectChanges();
-        comments = fixture.debugElement.queryAll(By.css(".comments--list--comment"));
-        expect(comments.length).toEqual(10);
-        childComponent.showMore(true);
-        fixture.detectChanges();
-        comments = fixture.debugElement.queryAll(By.css(".comments--list--comment"));
-        expect(comments.length).toEqual(22);
-    });
-});
diff --git a/src/app/shared/comments/comments.component.stories.ts b/src/app/shared/comments/comments.component.stories.ts
deleted file mode 100644
index d8b10ff..0000000
--- a/src/app/shared/comments/comments.component.stories.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {RouterTestingModule} from "@angular/router/testing";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {IAPICommentModel} from "../../core/api/statements";
-import {I18nModule} from "../../core/i18n";
-import {CommentsComponent} from "./comments.component";
-import {CommentsModule} from "./comments.module";
-
-const comments: IAPICommentModel[] = [
-    {
-        id: 0,
-        text: "Ein kurzer Kommentar.",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2015-08-31T16:47+00:00",
-        editable: true
-    },
-    {
-        id: 1,
-        text: "Ein längerer Kommentar. Ein weiterer Satz. Ein weiterer Satz. Ein weiterer Satz. Ein weiterer Satz. Ein weiterer Satz.",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2015-08-31T18:13+00:00",
-        editable: true
-    },
-    {
-        id: 2,
-        text: "Ein Kommentar von einem anderen Nutzer mit einem Zeilenumbruch. \nWeitere Zeile.",
-        userName: "User2",
-        firstName: "Peter",
-        lastName: "Fox",
-        timestamp: "2015-09-01T06:17+00:00",
-        editable: false
-    },
-    {
-        id: 3,
-        text: "Ein weiterer Kommentar von einem anderen Nutzer.",
-        userName: "User2",
-        firstName: "Peter",
-        lastName: "Fox",
-        timestamp: "2015-09-01T11:17+00:00",
-        editable: false
-    },
-    {
-        id: 4,
-        text: "a",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2015-09-01T11:17+00:00",
-        editable: true
-    },
-    {
-        id: 5,
-        text: `Extrem langer Kommentar. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz.
-            Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz.
-            Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz.
-            Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz. Das ist ein Satz.
-            Das ist ein Satz. Das ist ein Satz.`,
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2015-09-01T11:17+00:00",
-        editable: true
-    },
-    {
-        id: 6,
-        text: "test text",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2007-08-31T16:47+00:00",
-        editable: true
-    },
-    {
-        id: 7,
-        text: "test text",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2007-08-31T16:47+00:00",
-        editable: true
-    },
-    {
-        id: 8,
-        text: "test text",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2007-08-31T16:47+00:00",
-        editable: true
-    },
-    {
-        id: 9,
-        text: "test text",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2007-08-31T16:47+00:00",
-        editable: true
-    },
-    {
-        id: 10,
-        text: "test text",
-        userName: "User1",
-        firstName: "Franz",
-        lastName: "Meier",
-        timestamp: "2007-08-31T16:47+00:00",
-        editable: true
-    }
-].map((comment, id) => ({...comment, text: id + " " + comment.text}));
-
-const addComment = (text: string) => {
-    comments.push(
-        {
-            id: comments.length,
-            text: comments.length + " " + text,
-            userName: "test01",
-            firstName: "Vorname",
-            lastName: "Nachname",
-            timestamp: new Date().toString(),
-            editable: true
-        }
-    );
-};
-
-const deleteComment = (id: number) => {
-    comments.splice(id, 1);
-    for (let i = id; i < comments.length; i++) {
-        comments[i].id--;
-    }
-};
-
-storiesOf("Features / 03 Comments", module)
-    .addDecorator(moduleMetadata({declarations: [], imports: [I18nModule, RouterTestingModule, CommentsModule]}))
-    .add("CommentsComponent", () => ({
-        template: `
-            <app-comments style="padding: 1em; box-sizing: border-box" [appComments]="comments" (appAdd)="addComment($event)" (appDelete)="deleteComment($event)"></app-comments>
-        `,
-        props: {
-            comments,
-            addComment,
-            deleteComment
-        }
-    }));
-
-
diff --git a/src/app/shared/comments/comments.component.ts b/src/app/shared/comments/comments.component.ts
deleted file mode 100644
index 0abbc6a..0000000
--- a/src/app/shared/comments/comments.component.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, ElementRef, EventEmitter, Input, Output, ViewChild} from "@angular/core";
-import {IAPICommentModel} from "../../core/api/statements";
-import {momentFormatDisplayFullDateAndTime} from "../../util/moment";
-
-@Component({
-    selector: "app-comments",
-    templateUrl: "./comments.component.html",
-    styleUrls: ["./comments.component.scss"]
-})
-export class CommentsComponent {
-
-    @Input()
-    public appCollapsed: boolean;
-
-    @Input()
-    public appCommentsToShow = 5;
-
-    @Input()
-    public appComments: Array<IAPICommentModel>;
-
-    public hasInputSomething = false;
-
-    @Output()
-    public appDelete: EventEmitter<number> = new EventEmitter();
-
-    @Output()
-    public appAdd: EventEmitter<string> = new EventEmitter();
-
-    @Input()
-    public timeDisplayFormat: string = momentFormatDisplayFullDateAndTime;
-
-    @ViewChild("textAreaElement")
-    private textAreaRef: ElementRef<HTMLTextAreaElement>;
-
-    public onInput() {
-        this.hasInputSomething = this.textAreaRef.nativeElement.value !== "";
-        this.resize();
-    }
-
-    public resize() {
-        this.textAreaRef.nativeElement.style.height = "1px";
-        this.textAreaRef.nativeElement.style.height = this.textAreaRef.nativeElement.scrollHeight + "px";
-    }
-
-    public onSave() {
-        this.appAdd.emit(this.textAreaRef.nativeElement.value);
-        this.clear();
-    }
-
-    public onDelete(id: number) {
-        this.appDelete.emit(id);
-    }
-
-    public clear() {
-        this.textAreaRef.nativeElement.value = "";
-        this.hasInputSomething = false;
-        this.resize();
-    }
-
-    public showMore(all = false) {
-        if (this.appCommentsToShow == null) {
-            this.appCommentsToShow = 0;
-        }
-        this.appCommentsToShow = all ? undefined : Math.min(this.appComments?.length, this.appCommentsToShow + 5);
-    }
-
-}
diff --git a/src/app/shared/comments/comments.module.ts b/src/app/shared/comments/comments.module.ts
deleted file mode 100644
index a61d7c1..0000000
--- a/src/app/shared/comments/comments.module.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatButtonModule} from "@angular/material/button";
-import {MatIconModule} from "@angular/material/icon";
-import {TranslateModule} from "@ngx-translate/core";
-import {DateControlModule} from "../controls/date-control";
-import {CollapsibleModule} from "../layout/collapsible";
-import {CommentsComponent} from "./comments.component";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        MatIconModule,
-        TranslateModule,
-        MatButtonModule,
-        DateControlModule,
-        CollapsibleModule
-    ],
-    declarations: [
-        CommentsComponent
-    ],
-    exports: [
-        CommentsComponent
-    ]
-})
-export class CommentsModule {
-
-}
diff --git a/src/app/shared/comments/index.ts b/src/app/shared/comments/index.ts
deleted file mode 100644
index f268b0c..0000000
--- a/src/app/shared/comments/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./comments.module";
diff --git a/src/app/shared/controls/common/abstract-control-value-accessor.component.spec.ts b/src/app/shared/controls/common/abstract-control-value-accessor.component.spec.ts
deleted file mode 100644
index 0c0c3f6..0000000
--- a/src/app/shared/controls/common/abstract-control-value-accessor.component.spec.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {AbstractControlValueAccessorComponent} from "./abstract-control-value-accessor.component";
-
-class ControlValueAccessorSpec extends AbstractControlValueAccessorComponent<number> {
-
-}
-
-describe("ControlValueAccessor", () => {
-
-    let component: ControlValueAccessorSpec;
-
-    beforeEach((() => {
-        component = new ControlValueAccessorSpec();
-    }));
-
-    it("#.writeValue should change appValue", () => {
-        const onChangeSpy = spyOn(component, "onChange");
-        const onTouchSpy = spyOn(component, "onTouch");
-        component.appValue = 0;
-        component.writeValue(19);
-        expect(component.appValue).toBe(19);
-        expect(onChangeSpy).not.toHaveBeenCalled();
-        expect(onTouchSpy).not.toHaveBeenCalled();
-
-        component.writeValue(190, true);
-        expect(component.appValue).toBe(190);
-        expect(onChangeSpy).toHaveBeenCalledWith(190);
-        expect(onTouchSpy).toHaveBeenCalled();
-    });
-
-    it("#.setDisable should set appDisabled", () => {
-        expect(component.appDisabled).not.toBeDefined();
-        component.setDisabledState(true);
-        expect(component.appDisabled).toBe(true);
-        component.setDisabledState(true);
-        expect(component.appDisabled).toBe(true);
-    });
-
-    it("should register listeners", () => {
-        // These calls should be ignored (because null is not a function)
-        component.registerOnChange(null);
-        component.registerOnTouched(null);
-        expect(component.onChange).not.toThrow();
-        expect(component.onTouch).not.toThrow();
-
-        const fn = () => 19;
-        component.registerOnChange(fn);
-        component.registerOnTouched(fn);
-        expect(component.onChange).toBe(fn);
-        expect(component.onTouch).toBe(fn);
-    });
-
-});
diff --git a/src/app/shared/controls/common/abstract-control-value-accessor.component.ts b/src/app/shared/controls/common/abstract-control-value-accessor.component.ts
deleted file mode 100644
index a679d25..0000000
--- a/src/app/shared/controls/common/abstract-control-value-accessor.component.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {EventEmitter, Input, Output} from "@angular/core";
-import {ControlValueAccessor} from "@angular/forms";
-
-export abstract class AbstractControlValueAccessorComponent<T> implements ControlValueAccessor {
-
-    @Input()
-    public appDisabled: boolean;
-
-    @Input()
-    public appValue: T;
-
-    @Output()
-    public appValueChange: EventEmitter<T> = new EventEmitter<T>();
-
-    public onChange = (_: T) => null;
-
-    public onTouch = () => null;
-
-    /**
-     * Sets a new value to the control.
-     * @param obj New value for the control
-     * @param emit If true, the new value will be emitted via the appValueChange event emitter.
-     */
-    public writeValue(obj: T, emit?: boolean) {
-        this.appValue = obj;
-        if (emit) {
-            this.appValueChange.emit(this.appValue);
-            this.onChange(this.appValue);
-            this.onTouch();
-        }
-    }
-
-    public registerOnChange(fn: any): void {
-        this.onChange = typeof fn === "function" ? fn : this.onChange;
-    }
-
-    public registerOnTouched(fn: any): void {
-        this.onTouch = typeof fn === "function" ? fn : this.onTouch;
-    }
-
-    public setDisabledState(isDisabled: boolean) {
-        this.appDisabled = isDisabled;
-    }
-
-}
diff --git a/src/app/shared/controls/contact-select/index.ts b/src/app/shared/controls/contact-select/index.ts
index 5f0f206..3fa26ad 100644
--- a/src/app/shared/controls/contact-select/index.ts
+++ b/src/app/shared/controls/contact-select/index.ts
@@ -10,3 +10,9 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
+
+export * from "./contact-select.component";
+export * from "./contact-select.module";
+
+export * from "./contact-select.component";
+export * from "./contact-select.module";
diff --git a/src/app/shared/controls/date-control/pipe/moment.pipe.spec.ts b/src/app/shared/controls/date-control/pipe/moment.pipe.spec.ts
index b351041..359ee5a 100644
--- a/src/app/shared/controls/date-control/pipe/moment.pipe.spec.ts
+++ b/src/app/shared/controls/date-control/pipe/moment.pipe.spec.ts
@@ -47,10 +47,6 @@
             fixture.detectChanges();
         });
 
-        it("should convert the input date to default moment format", () => {
-            expect(el.textContent).toEqual("2020-06-14T11:11:11+02:00");
-        });
-
         it("should convert the input date to the given display format", () => {
             component.displayFormat = "DD.MM.YYYY";
             fixture.detectChanges();
@@ -65,7 +61,6 @@
             const returnObj = returnMoment.toObject();
             expect(returnObj).toBeTruthy();
             expect(date.getFullYear()).toEqual(returnObj.years);
-            expect(returnMoment.format()).toEqual("2020-06-14T11:11:11+02:00");
         });
     });
 });
diff --git a/src/app/shared/controls/file-drop/component/file-drop.component.html b/src/app/shared/controls/file-drop/component/file-drop.component.html
index 6f2c134..ba860d6 100644
--- a/src/app/shared/controls/file-drop/component/file-drop.component.html
+++ b/src/app/shared/controls/file-drop/component/file-drop.component.html
@@ -12,7 +12,7 @@
  -------------------------------------------------------------------------------->
 
 <span (dragover)="onDragOver($event)"
-      *ngFor="let file of appValue; let index = index;"
+      *ngFor="let item of appValue; let index = index;"
       class="attachments-file">
 
   <button (click)="onDelete(index)"
@@ -22,7 +22,7 @@
     <mat-icon>clear</mat-icon>
   </button>
 
-  {{file?.name}}
+  {{item?.attachment?.name}}
 
 </span>
 
diff --git a/src/app/shared/controls/file-drop/component/file-drop.component.spec.ts b/src/app/shared/controls/file-drop/component/file-drop.component.spec.ts
index 5bb0cb3..4e2cbe8 100644
--- a/src/app/shared/controls/file-drop/component/file-drop.component.spec.ts
+++ b/src/app/shared/controls/file-drop/component/file-drop.component.spec.ts
@@ -51,7 +51,7 @@
             expect(component.appValue).toEqual(undefined);
             component.appDisabled = false;
             component.onInput(fakeFileList as FileList);
-            expect(component.appValue).toEqual([file]);
+            expect(component.appValue).toEqual(getAttachmentListWithTags([file]));
         });
 
         it("should not add the files to appValue when the app is disabled", () => {
@@ -65,40 +65,41 @@
             spyOn(component.appValueChange, "emit");
             component.appDisabled = false;
             component.onInput(fakeFileList as FileList);
-            expect(component.appValueChange.emit).toHaveBeenCalledWith([file]);
+            expect(component.appValueChange.emit).toHaveBeenCalledWith(getAttachmentListWithTags([file]));
         });
     });
 
     describe("onDelete", () => {
         it("should not delete the file when disabled or the index is invalid", () => {
             const fileArray = [file, anotherFile, thirdFile];
+            const attachmentList = getAttachmentListWithTags(fileArray);
 
-            component.appValue = fileArray;
+            component.appValue = attachmentList;
             component.appDisabled = true;
             component.onDelete(2);
-            expect(component.appValue).toEqual(fileArray);
+            expect(component.appValue).toEqual(attachmentList);
 
             component.appDisabled = false;
             component.onDelete(14);
-            expect(component.appValue).toEqual(fileArray);
+            expect(component.appValue).toEqual(attachmentList);
         });
 
         it("should delete the file found at the index in appValue", () => {
-            component.appValue = [file, anotherFile, thirdFile];
+            component.appValue = getAttachmentListWithTags([file, anotherFile, thirdFile]);
             component.appDisabled = false;
             component.onDelete(1);
-            expect(component.appValue).toEqual([file, thirdFile]);
+            expect(component.appValue).toEqual(getAttachmentListWithTags([file, thirdFile]));
             component.onDelete(1);
-            expect(component.appValue).toEqual([file]);
+            expect(component.appValue).toEqual(getAttachmentListWithTags([file]));
         });
 
         it("should emit the deleted file for appValueDelete and the new appValue array for appValueChange", () => {
             spyOn(component.appValueChange, "emit");
             spyOn(component.appValueDelete, "emit");
-            component.appValue = [file, anotherFile, thirdFile];
+            component.appValue = getAttachmentListWithTags([file, anotherFile, thirdFile]);
             component.appDisabled = false;
             component.onDelete(1);
-            expect(component.appValueChange.emit).toHaveBeenCalledWith([file, thirdFile]);
+            expect(component.appValueChange.emit).toHaveBeenCalledWith(getAttachmentListWithTags([file, thirdFile]));
             expect(component.appValueDelete.emit).toHaveBeenCalledWith(anotherFile);
         });
     });
@@ -166,6 +167,19 @@
             expect(dragEvent.preventDefault).toHaveBeenCalled();
         });
     });
+
+    describe("openDialog", () => {
+        it("should call the click function for the inputElement if not disabled", () => {
+            spyOn(component.inputElement.nativeElement, "click");
+            component.appDisabled = true;
+            component.openDialog();
+            expect(component.inputElement.nativeElement.click).not.toHaveBeenCalled();
+
+            component.appDisabled = false;
+            component.openDialog();
+            expect(component.inputElement.nativeElement.click).toHaveBeenCalled();
+        });
+    });
 });
 
 class FakeFileList implements FileList {
@@ -183,3 +197,14 @@
         return this.data[idx];
     }
 }
+
+const getAttachmentWithTags = (attachment: File) => {
+    return {
+        attachment,
+        tags: []
+    };
+};
+
+const getAttachmentListWithTags = (attachments: any[]) => {
+    return attachments.map((_) => getAttachmentWithTags(_));
+};
diff --git a/src/app/shared/controls/file-drop/component/file-drop.component.ts b/src/app/shared/controls/file-drop/component/file-drop.component.ts
index 02ef3e5..9682501 100644
--- a/src/app/shared/controls/file-drop/component/file-drop.component.ts
+++ b/src/app/shared/controls/file-drop/component/file-drop.component.ts
@@ -13,7 +13,8 @@
 
 import {Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild} from "@angular/core";
 import {NG_VALUE_ACCESSOR} from "@angular/forms";
-import {arrayJoin} from "../../../../util/store";
+import {IAttachmentWithTags} from "../../../../store";
+import {arrayJoin} from "../../../../util";
 import {AbstractControlValueAccessorComponent} from "../../common";
 
 @Component({
@@ -28,12 +29,18 @@
         }
     ]
 })
-export class FileDropComponent extends AbstractControlValueAccessorComponent<File[]> {
+export class FileDropComponent extends AbstractControlValueAccessorComponent<IAttachmentWithTags<File>[]> {
 
     @HostBinding("class.no-drop")
     @Input()
     public appDisabled = false;
 
+    /**
+     * List of tag ids which are added automatically to dropped files.
+     */
+    @Input()
+    public appAutoTagIds: string[];
+
     @Output()
     public appValueDelete = new EventEmitter<File>();
 
@@ -46,12 +53,7 @@
             return;
         }
 
-        try {
-            // Prevent dropped files from being opened.
-            event.preventDefault();
-        } catch (e) {
-            return;
-        }
+        event.preventDefault();
     }
 
     @HostListener("drop", ["$event"])
@@ -77,22 +79,27 @@
         if (this.appDisabled) {
             return;
         }
-
-        this.writeValue(arrayJoin(this.appValue, fileListToFileArray(fileList)), true);
+        const value = arrayJoin(
+            this.appValue,
+            fileListToFileArray(fileList)
+                .map((_) => ({attachment: _, tags: arrayJoin(this.appAutoTagIds)}))
+        );
+        this.writeValue(value, true);
     }
 
     public onDelete(index: number) {
-        if (this.appDisabled || !Array.isArray(this.appValue) || this.appValue[index] == null) {
+        if (this.appDisabled || !Array.isArray(this.appValue) || this.appValue[index]?.attachment == null) {
             return;
         }
 
-        const file = this.appValue[index];
-        this.writeValue(this.appValue.filter((_) => _ !== file), true);
+        const file = this.appValue[index].attachment;
+        const value = this.appValue.filter((_) => _?.attachment !== file);
+        this.writeValue(value, true);
         this.appValueDelete.emit(file);
     }
 
-    public writeValue(obj: File[], emit?: boolean): void {
-        super.writeValue(Array.isArray(obj) ? obj.filter((file) => file instanceof File) : [], emit);
+    public writeValue(obj: IAttachmentWithTags<File>[], emit?: boolean): void {
+        super.writeValue(arrayJoin(obj).filter((_) => _?.attachment instanceof File), emit);
     }
 
 }
@@ -100,8 +107,8 @@
 function fileListToFileArray(fileList: FileList): File[] {
     try {
         const result: File[] = [];
-        for (let i = 0; i < fileList?.length; i++) {
-            result.push(fileList?.item(i));
+        for (let i = 0; i < fileList.length; i++) {
+            result.push(fileList.item(i));
         }
         return result;
     } catch (e) {
diff --git a/src/app/shared/controls/file-select/component/file-select.component.spec.ts b/src/app/shared/controls/file-select/component/file-select.component.spec.ts
index 8e1a692..be50be6 100644
--- a/src/app/shared/controls/file-select/component/file-select.component.spec.ts
+++ b/src/app/shared/controls/file-select/component/file-select.component.spec.ts
@@ -16,6 +16,7 @@
 import {By} from "@angular/platform-browser";
 import {IAPIAttachmentModel} from "../../../../core/api";
 import {I18nModule} from "../../../../core/i18n";
+import {IAttachmentWithTags} from "../../../../store/attachments/model";
 import {FileSelectModule} from "../file-select.module";
 import {FileSelectComponent} from "./file-select.component";
 
@@ -49,7 +50,12 @@
         }
     ];
 
-    public appValue: number[] = [2];
+    public appValue: IAttachmentWithTags<number>[] = [
+        {
+            attachment: 2,
+            tags: []
+        }
+    ];
 }
 
 describe("FileSelectComponent", () => {
@@ -95,9 +101,9 @@
     });
 
     it("should remove the file id from app value on select", () => {
-        childComponent.appValue = [2, 3];
+        childComponent.appValue = getAttachmentListWithTags([2, 3]);
         childComponent.select(2);
-        expect(childComponent.appValue).toEqual([3]);
+        expect(childComponent.appValue).toEqual(getAttachmentListWithTags([3]));
         childComponent.select(3);
         expect(childComponent.appValue).toEqual([]);
     });
@@ -105,17 +111,9 @@
     it("should add the file id to app value on deselect", () => {
         childComponent.appValue = [];
         childComponent.deselect(2);
-        expect(childComponent.appValue).toEqual([2]);
+        expect(childComponent.appValue).toEqual(getAttachmentListWithTags([2]));
         childComponent.deselect(3);
-        expect(childComponent.appValue).toEqual([2, 3]);
-    });
-
-    it("should add the file id to app value on deselect", () => {
-        childComponent.appValue = [];
-        childComponent.deselect(2);
-        expect(childComponent.appValue).toEqual([2]);
-        childComponent.deselect(3);
-        expect(childComponent.appValue).toEqual([2, 3]);
+        expect(childComponent.appValue).toEqual(getAttachmentListWithTags([2, 3]));
     });
 
     it("should add and remove items from appValue when no input value was given", () => {
@@ -124,6 +122,18 @@
         expect(childComponent.appValue).toEqual([]);
         childComponent.appValue = undefined;
         childComponent.deselect(3);
-        expect(childComponent.appValue).toEqual([3]);
+        expect(childComponent.appValue).toEqual(getAttachmentListWithTags([3]));
     });
 });
+
+const getAttachmentWithTags = (attachment: number) => {
+    return {
+        attachment,
+        tags: [],
+        remove: true
+    };
+};
+
+const getAttachmentListWithTags = (attachments: any[]) => {
+    return attachments.map((_) => getAttachmentWithTags(_));
+};
diff --git a/src/app/shared/controls/file-select/component/file-select.component.ts b/src/app/shared/controls/file-select/component/file-select.component.ts
index b194ec5..9074918 100644
--- a/src/app/shared/controls/file-select/component/file-select.component.ts
+++ b/src/app/shared/controls/file-select/component/file-select.component.ts
@@ -13,8 +13,9 @@
 
 import {ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, Input, Output} from "@angular/core";
 import {NG_VALUE_ACCESSOR} from "@angular/forms";
-import {IAPIAttachmentModel} from "../../../../core/api";
-import {arrayJoin} from "../../../../util/store";
+import {IAPIAttachmentModel} from "../../../../core";
+import {IAttachmentWithTags} from "../../../../store";
+import {arrayJoin} from "../../../../util";
 import {AbstractControlValueAccessorComponent} from "../../common";
 
 @Component({
@@ -30,7 +31,7 @@
         }
     ]
 })
-export class FileSelectComponent extends AbstractControlValueAccessorComponent<number[]> {
+export class FileSelectComponent extends AbstractControlValueAccessorComponent<IAttachmentWithTags<number>[]> {
 
     private static id = 0;
 
@@ -48,19 +49,19 @@
     }
 
     public isSelected(attachmentId: number): boolean {
-        return !arrayJoin(this.appValue).some((id) => id === attachmentId);
+        return !arrayJoin(this.appValue).some((_) => _?.attachment === attachmentId);
     }
 
     public select(attachmentId: number) {
-        const value = arrayJoin(this.appValue).filter((id) => id !== attachmentId);
+        const value = arrayJoin(this.appValue).filter((_) => _?.attachment !== attachmentId);
         this.writeValue(value, true);
     }
 
     public deselect(attachmentId: number) {
-        this.writeValue(arrayJoin(this.appValue, [attachmentId]), true);
+        this.writeValue(arrayJoin(this.appValue, [{attachment: attachmentId, tags: [], remove: true}]), true);
     }
 
-    public writeValue(obj: number[], emit?: boolean) {
+    public writeValue(obj: IAttachmentWithTags<number>[], emit?: boolean) {
         super.writeValue(obj, emit);
         this.changeDetectorRef.markForCheck();
     }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/controls/text-field/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/controls/text-field/index.ts
index 2e6e007..f223969 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/controls/text-field/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./text-field.module";
diff --git a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.html b/src/app/shared/controls/text-field/text-field.component.html
similarity index 70%
rename from src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.html
rename to src/app/shared/controls/text-field/text-field.component.html
index a412f89..129e808 100644
--- a/src/app/pages/dashboard/components/dashboard-list/dashboard-list.component.html
+++ b/src/app/shared/controls/text-field/text-field.component.html
@@ -11,14 +11,10 @@
  * SPDX-License-Identifier: EPL-2.0
  -------------------------------------------------------------------------------->
 
-<div class="dashboard-list-title">
-  <span class="dashboard-list-title-text">
-    {{appTitle}}
-  </span>
-</div>
-
-<app-dashboard-item
-  *ngFor="let item of appItems"
-  [appItem]="item"
-  class="dashboard-list-item">
-</app-dashboard-item>
+<textarea #inputElement
+          (focusout)="onFocusOut()"
+          (input)="onInput(inputElement.value)"
+          [value]="appValue"
+          class="openk-textarea text-input"
+          rows="1">
+</textarea>
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/controls/text-field/text-field.component.scss
similarity index 85%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/controls/text-field/text-field.component.scss
index fc6c436..563859b 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/controls/text-field/text-field.component.scss
@@ -11,7 +11,9 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+.text-input {
+  resize: none;
+  width: 100%;
+  box-sizing: border-box;
+  min-height: 2.5em;
 }
diff --git a/src/app/shared/controls/text-field/text-field.component.spec.ts b/src/app/shared/controls/text-field/text-field.component.spec.ts
new file mode 100644
index 0000000..71da2ca
--- /dev/null
+++ b/src/app/shared/controls/text-field/text-field.component.spec.ts
@@ -0,0 +1,63 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {TextFieldComponent} from "./text-field.component";
+import {TextInputFieldModule} from "./text-field.module";
+
+describe("TextFieldComponent", () => {
+    let component: TextFieldComponent;
+    let fixture: ComponentFixture<TextFieldComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                TextInputFieldModule
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextFieldComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should be created", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should resize the textarea to always show all text", () => {
+        component.inputElement.nativeElement.style.height = "1px";
+        component.inputElement.nativeElement.value =
+            "A text that has to be of a certain length so it needs multiple lines to display. This should be enough.";
+        component.resize();
+        expect(component.inputElement.nativeElement.style.height).toEqual(component.inputElement.nativeElement.scrollHeight + "px");
+    });
+
+    it("should emit appFocusOut", () => {
+        spyOn(component.appFocusOut, "emit").and.callThrough();
+        component.onFocusOut();
+        expect(component.appFocusOut.emit).toHaveBeenCalled();
+    });
+
+    it("should call resize() and emit value on appInputValue", () => {
+        spyOn(component.appInputValue, "emit").and.callThrough();
+        spyOn(component, "resize").and.callThrough();
+        const value = "value";
+        component.onInput(value);
+        expect(component.resize).toHaveBeenCalled();
+        expect(component.appInputValue.emit).toHaveBeenCalledWith(value);
+    });
+
+});
diff --git a/src/app/shared/controls/text-field/text-field.component.ts b/src/app/shared/controls/text-field/text-field.component.ts
new file mode 100644
index 0000000..518e4e4
--- /dev/null
+++ b/src/app/shared/controls/text-field/text-field.component.ts
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+import {AfterContentChecked, Component, ElementRef, EventEmitter, Input, Output, ViewChild} from "@angular/core";
+import {timer} from "rxjs";
+
+@Component({
+    selector: "app-text-field",
+    templateUrl: "./text-field.component.html",
+    styleUrls: ["./text-field.component.scss"]
+})
+export class TextFieldComponent implements AfterContentChecked {
+
+    @ViewChild("inputElement") inputElement: ElementRef;
+
+    @Input()
+    public appIsFocused: boolean;
+
+    @Input()
+    public appValue: string;
+
+    @Output()
+    public appInputValue = new EventEmitter<string>();
+
+    @Output()
+    public appFocusOut = new EventEmitter<void>();
+
+    public async ngAfterContentChecked() {
+        if (this.inputElement && this.appIsFocused) {
+            await timer(0).toPromise();
+            this.inputElement.nativeElement.focus();
+            this.resize();
+        }
+    }
+
+    public resize() {
+        this.inputElement.nativeElement.style.height = "1px";
+        this.inputElement.nativeElement.style.height = this.inputElement.nativeElement.scrollHeight + "px";
+    }
+
+    public onFocusOut() {
+        this.appFocusOut.emit();
+    }
+
+    public onInput(value: string) {
+        this.resize();
+        this.appInputValue.emit(value);
+    }
+
+}
+
diff --git a/src/app/shared/card/card.module.ts b/src/app/shared/controls/text-field/text-field.module.ts
similarity index 77%
rename from src/app/shared/card/card.module.ts
rename to src/app/shared/controls/text-field/text-field.module.ts
index ef8e0ad..d4a7bef 100644
--- a/src/app/shared/card/card.module.ts
+++ b/src/app/shared/controls/text-field/text-field.module.ts
@@ -13,21 +13,19 @@
 
 import {CommonModule} from "@angular/common";
 import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {CardComponent} from "./card.component";
+import {TextFieldComponent} from "./text-field.component";
 
 @NgModule({
     imports: [
-        CommonModule,
-        MatIconModule
+        CommonModule
     ],
     declarations: [
-        CardComponent
+        TextFieldComponent
     ],
     exports: [
-        CardComponent
+        TextFieldComponent
     ]
 })
-export class CardModule {
+export class TextInputFieldModule {
 
 }
diff --git a/src/app/shared/date-control/component/date-control.component.html b/src/app/shared/date-control/component/date-control.component.html
deleted file mode 100644
index 5359281..0000000
--- a/src/app/shared/date-control/component/date-control.component.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<span #dropDown="appDropDown" [appConnectedPositions]="connectedPositions"
-      [appDisabled]="appDisabled"
-      [appDropDown]="calendarRef"
-      class="container">
-
-  <input
-    #inputElement
-    (blur)="onInputBlur(inputElement)"
-    (input)="onInputChange(inputElement.value)"
-    (keydown)="onKeyDown($event)"
-    (mousedown)="onMouseDown(inputElement)"
-    [class.calendar-control-input-opened-bottom]="dropDown.position?.panelClass === 'bottom'"
-    [class.calendar-control-input-opened-top]="dropDown.position?.panelClass === 'top'"
-    [class.openk-danger]="appDanger"
-    [class.openk-focus]="dropDown.isOpen"
-    [class.openk-info]="appInfo"
-    [class.openk-success]="appSuccess"
-    [class.openk-warning]="appWarning"
-    [disabled]="appDisabled"
-    [id]="appId"
-    [ngModel]="(displayedValue | appMomentPipe : appInternalFormat).format(appDisplayFormat)"
-    autocomplete="off"
-    class="openk-input calendar-control-input"
-    name="dueDate"
-    required
-    type="text">
-
-  <mat-icon (mousedown)="$event.preventDefault(); inputElement.focus(); toggle();"
-            [class.calendar-icon-open]="dropDown?.isOpen"
-            class="calendar-icon">
-    today
-  </mat-icon>
-
-</span>
-
-<ng-template #calendarRef>
-  <p-calendar #calendar
-              (keydown)="onKeyDown($event, true)"
-              (ngModelChange)="onCalendarChange($event);"
-              (onMonthChange)="dropDown.updatePosition()"
-              (focusout)="inputElement.focus();"
-              [disabled]="appDisabled"
-              [inline]="true"
-              [ngModel]="value"
-              class="openk-datepicker">
-
-    <ng-template let-date pTemplate="date">
-      <span [class.calendar-control-day-selected]="calendar.isSelected(date)"
-            [class.calendar-control-day-today]="date?.today"
-            class="calendar-control-day">
-        {{date.day}}
-      </span>
-    </ng-template>
-
-    <ng-template let-date pTemplate="disabledDate">
-      <span [class.calendar-control-day-selected]="calendar.isSelected(date)"
-            [class.calendar-control-day-today]="date?.today"
-            class="calendar-control-day calendar-control-day-disabled">
-        {{date.day}}
-      </span>
-    </ng-template>
-
-  </p-calendar>
-</ng-template>
diff --git a/src/app/shared/date-control/component/date-control.component.scss b/src/app/shared/date-control/component/date-control.component.scss
deleted file mode 100644
index da5f1c5..0000000
--- a/src/app/shared/date-control/component/date-control.component.scss
+++ /dev/null
@@ -1,101 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "src/styles/openk.styles";
-
-:host {
-  display: inline-flex;
-  position: relative;
-  font-size: 0.875em;
-}
-
-.container {
-  display: inline-flex;
-  width: 100%;
-  height: 100%;
-}
-
-.calendar-icon {
-  @include user-select-mixin(none);
-
-  display: inline-flex;
-  cursor: pointer;
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: initial;
-  padding: 0 0.3em;
-  height: 100%;
-  justify-content: center;
-  align-items: center;
-  font-size: 1em;
-  margin: auto 0;
-  color: get-color($openk-default-palette, 800);
-}
-
-.calendar-icon-open {
-  color: get-color($openk-info-palette, A300);
-}
-
-.calendar-control-input {
-  width: 100%;
-  height: 100%;
-  font-size: 1em;
-  padding-right: 1.5em;
-}
-
-.calendar-control-input-opened-top {
-  @include rounded-border-mixin($top-right: 0);
-}
-
-.calendar-control-input-opened-bottom {
-  @include rounded-border-mixin($bottom-right: 0);
-}
-
-.calendar-control-day {
-  @include rounded-border-mixin();
-
-  display: inline-flex;
-  justify-content: center;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  padding: 0.5em;
-  cursor: pointer;
-  border: 1px solid transparent;
-  transition: all 150ms ease-in-out;
-
-  &.calendar-control-day-today {
-    background: $openk-background;
-    border-color: $openk-form-border;
-  }
-
-  &:hover:not(.calendar-control-day-disabled),
-  &:focus:not(.calendar-control-day-disabled) {
-    background: $openk-background-highlight;
-    border-color: $openk-form-border;
-  }
-
-  &:active:not(.calendar-control-day-disabled),
-  &.calendar-control-day-selected:not(.calendar-control-day-disabled),
-  &.calendar-control-day-selected {
-    border: 1px solid get-color($openk-info-palette);
-    background-color: get-color($openk-info-palette);
-    color: get-color($openk-info-palette, 500, contrast);
-  }
-
-}
-
-.calendar-control-day-disabled {
-  cursor: unset;
-}
diff --git a/src/app/shared/date-control/component/date-control.component.spec.ts b/src/app/shared/date-control/component/date-control.component.spec.ts
deleted file mode 100644
index 1d71db4..0000000
--- a/src/app/shared/date-control/component/date-control.component.spec.ts
+++ /dev/null
@@ -1,213 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, ViewChild} from "@angular/core";
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {FormsModule, NgForm, NgModel} from "@angular/forms";
-import {MatIcon} from "@angular/material/icon";
-import {By} from "@angular/platform-browser";
-import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
-import {Calendar} from "primeng/calendar";
-import {EKeyboardKeys} from "../../../util/events";
-import {DateControlModule} from "../date-control.module";
-import {DateControlComponent} from "./date-control.component";
-
-describe("DateControlComponent", () => {
-    let component: DateControlSpecComponent;
-    let fixture: ComponentFixture<DateControlSpecComponent>;
-    let textInput: HTMLInputElement;
-    let matIcon: HTMLElement;
-
-    function getCalendar(): Calendar {
-        try {
-            const componentInstance = fixture.debugElement.query(By.directive(Calendar)).componentInstance;
-            return componentInstance instanceof Calendar ? componentInstance : undefined;
-        } catch (e) {
-            return;
-        }
-    }
-
-    function getCalendarDayElement(index: number): HTMLElement {
-        try {
-            return fixture?.debugElement == null ? [] : fixture.debugElement
-                .queryAll(By.css(".ui-state-default:not(.ui-state-disabled)"))
-                .map((debugElement) => debugElement.nativeElement)[index];
-        } catch (e) {
-            return undefined;
-        }
-    }
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [
-                DateControlSpecComponent
-            ],
-            imports: [
-                DateControlModule,
-                BrowserAnimationsModule,
-                FormsModule
-            ]
-        }).compileComponents();
-    }));
-
-    beforeEach(async () => {
-        fixture = TestBed.createComponent(DateControlSpecComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-        await fixture.whenStable();
-        textInput = fixture.debugElement.query(By.css("input")).nativeElement;
-        matIcon = fixture.debugElement.query(By.directive(MatIcon)).nativeElement;
-    });
-
-    it("should register to Angular forms", async () => {
-        expect(component).toBeDefined();
-        expect(component?.ngForm?.value).toBeDefined();
-        expect(component.ngForm.value.date).toBe("2020-05-01");
-    });
-
-    it("should update value via text input", async () => {
-        expect(textInput?.value).toBe("01.05.2020");
-
-        textInput.value = "02.05.2020";
-        textInput.dispatchEvent(new InputEvent("input"));
-        fixture.detectChanges();
-        expect(component.value).toBe("2020-05-02");
-        expect(component.ngForm.value.date).toBe("2020-05-02");
-    });
-
-    it("should handle faulty user input", async () => {
-        expect(textInput?.value).toBe("01.05.2020");
-
-        textInput.value = "19.05.2020abcdef";
-        textInput.dispatchEvent(new InputEvent("input"));
-        fixture.detectChanges();
-
-        expect(component.value).toBe("2020-05-19");
-        expect(component.ngForm.value.date).toBe("2020-05-19");
-        expect(textInput.value).toBe("19.05.2020abcdef");
-
-        textInput.dispatchEvent(new Event("blur"));
-        fixture.detectChanges();
-
-        expect(component.value).toBe("2020-05-19");
-        expect(component.ngForm.value.date).toBe("2020-05-19");
-        expect(textInput.value).toBe("19.05.2020");
-    });
-
-    it("should update value via calendar", async () => {
-        expect(component.value).toBe("2020-05-01");
-
-        component.dateControlComponent.toggle(true);
-        await fixture.whenStable();
-        fixture.detectChanges();
-
-        const dayElement = getCalendarDayElement(19);
-        dayElement.dispatchEvent(new Event("click"));
-        expect(component.value).toBe("2020-05-20");
-        expect(component.ngForm.value.date).toBe("2020-05-20");
-        await fixture.whenStable();
-        fixture.detectChanges();
-
-        expect(getCalendar()).not.toBeDefined();
-    });
-
-    it("should toggle overlay", async () => {
-        expect(getCalendar()).not.toBeDefined();
-
-        textInput.dispatchEvent(new Event("mousedown"));
-        expect(getCalendar()).toBeDefined();
-
-        textInput.dispatchEvent(new Event("mousedown"));
-        expect(getCalendar()).toBeDefined();
-
-        document.dispatchEvent(new Event("click"));
-        expect(getCalendar()).not.toBeDefined();
-
-        matIcon.dispatchEvent(new Event("mousedown"));
-        expect(getCalendar()).toBeDefined();
-
-        matIcon.dispatchEvent(new Event("mousedown"));
-        expect(getCalendar()).not.toBeDefined();
-    });
-
-    it("should close overlay when tabbing from the text input", async () => {
-        textInput.dispatchEvent(new Event("mousedown"));
-        fixture.detectChanges();
-        await fixture.whenStable();
-        expect(getCalendar()).toBeDefined();
-
-        textInput.dispatchEvent(new KeyboardEvent("keydown", {key: EKeyboardKeys.TAB}));
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(getCalendar()).not.toBeDefined();
-    });
-
-    it("should close overlay when tabbing from the calendar", async () => {
-        component.dateControlComponent.toggle(true);
-        fixture.detectChanges();
-        await fixture.whenStable();
-        expect(getCalendar()).toBeDefined();
-
-        getCalendar().el.nativeElement.dispatchEvent(new KeyboardEvent("keydown", {key: EKeyboardKeys.TAB}));
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(getCalendar()).not.toBeDefined();
-    });
-
-    it("should allow no interactions when disabled", async () => {
-        component.dateControlComponent.toggle(true);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(getCalendar()).toBeDefined();
-
-        component.ngModel.control.disable();
-        fixture.detectChanges();
-        await fixture.whenStable();
-        expect(textInput.disabled).toBeTrue();
-        expect(getCalendar()).not.toBeDefined();
-
-        textInput.dispatchEvent(new Event("click"));
-        fixture.detectChanges();
-        await fixture.whenStable();
-        expect(textInput.disabled).toBeTrue();
-        expect(getCalendar()).not.toBeDefined();
-    });
-
-});
-
-@Component({
-    selector: "app-date-control-spec",
-    template: `
-        <form>
-            <app-date-control [(appValue)]="value" [ngModel]="value" name="date">
-            </app-date-control>
-        </form>
-    `
-})
-class DateControlSpecComponent {
-
-    public value = "2020-05-01";
-
-    @ViewChild(NgForm)
-    public ngForm: NgForm;
-
-    @ViewChild(NgModel)
-    public ngModel: NgModel;
-
-    @ViewChild(DateControlComponent)
-    public dateControlComponent: DateControlComponent;
-
-}
diff --git a/src/app/shared/date-control/component/date-control.component.stories.ts b/src/app/shared/date-control/component/date-control.component.stories.ts
deleted file mode 100644
index 19632fe..0000000
--- a/src/app/shared/date-control/component/date-control.component.stories.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
-import {action} from "@storybook/addon-actions";
-import {boolean, text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {DateControlModule} from "../date-control.module";
-
-storiesOf("Shared", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({imports: [DateControlModule, BrowserAnimationsModule]}))
-    .add("DateControlComponent", () => ({
-        template: `
-            <app-date-control
-                style="margin: 1em;"
-                [appDisabled]="appDisabled"
-                [appDisplayFormat]="appDisplayFormat"
-                [appValue]="appValue"
-                [appInfo]="appInfo"
-                [appSuccess]="appSuccess"
-                [appWarning]="appWarning"
-                [appDanger]="appDanger"
-                (appValueChange)="appValueChange($event)">
-            </app-date-control>
-        `,
-        props: {
-            appDisabled: boolean("appDisabled", false),
-            appDisplayFormat: text("appDisplayFormat", "DD.MM.YYYY"),
-            appValue: text("appValue", "2020-05-19"),
-            appInfo: boolean("appInfo", false),
-            appSuccess: boolean("appSuccess", false),
-            appWarning: boolean("appWarning", false),
-            appDanger: boolean("appDanger", false),
-            appValueChange: action("appValueChange")
-        }
-    }));
-
-
diff --git a/src/app/shared/date-control/component/date-control.component.ts b/src/app/shared/date-control/component/date-control.component.ts
deleted file mode 100644
index effabd0..0000000
--- a/src/app/shared/date-control/component/date-control.component.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {ConnectedPosition} from "@angular/cdk/overlay";
-import {DOCUMENT} from "@angular/common";
-import {Component, ElementRef, EventEmitter, forwardRef, Inject, Input, Output, ViewChild} from "@angular/core";
-import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms";
-import {MomentInput} from "moment";
-import {timer} from "rxjs";
-import {momentFormatDisplayNumeric, momentFormatInternal, parseMomentToDate, parseMomentToString} from "../../../util";
-import {DropDownDirective} from "../../drop-down";
-
-@Component({
-    selector: "app-date-control",
-    templateUrl: "./date-control.component.html",
-    styleUrls: ["./date-control.component.scss"],
-    providers: [
-        {
-            provide: NG_VALUE_ACCESSOR,
-            useExisting: forwardRef(() => DateControlComponent),
-            multi: true
-        }
-    ]
-})
-export class DateControlComponent implements ControlValueAccessor {
-
-    private static id = 0;
-
-    @Input()
-    public appId = `CalendarControlComponent${DateControlComponent.id++}`;
-
-    @Input()
-    public appDisabled = false;
-
-    @Input()
-    public appInfo = false;
-
-    @Input()
-    public appSuccess = false;
-
-    @Input()
-    public appWarning = false;
-
-    @Input()
-    public appDanger = false;
-
-    @Output()
-    public appValueChange = new EventEmitter<string>();
-
-    @Input()
-    public appInternalFormat = momentFormatInternal;
-
-    @Input()
-    public appDisplayFormat = momentFormatDisplayNumeric;
-
-    public value: Date = new Date();
-
-    public displayedValue: Date = this.value;
-
-    public readonly connectedPositions: ConnectedPosition[] = [
-        {
-            originX: "start",
-            originY: "bottom",
-            overlayX: "start",
-            overlayY: "top",
-            offsetX: 4,
-            offsetY: -1,
-            panelClass: "bottom"
-        },
-        {
-            originX: "start",
-            originY: "top",
-            overlayX: "start",
-            overlayY: "bottom",
-            offsetY: 1,
-            offsetX: 4,
-            panelClass: "top"
-        },
-        {
-            originX: "end",
-            originY: "top",
-            overlayX: "start",
-            overlayY: "top",
-            panelClass: "right"
-        },
-        {
-            originX: "start",
-            originY: "top",
-            overlayX: "end",
-            overlayY: "top",
-            panelClass: "left"
-        }
-    ];
-
-    @ViewChild("inputElement")
-    private readonly inputElement: ElementRef<HTMLInputElement>;
-
-    @ViewChild(DropDownDirective)
-    private dropDownDirective: DropDownDirective;
-
-    public constructor(@Inject(DOCUMENT) private readonly document: Document) {
-
-    }
-
-    @Input()
-    public set appValue(value: MomentInput) {
-        this.writeValue(value);
-        this.onInputBlur();
-    }
-
-    public onChange = (_: string) => null;
-
-    public onTouch = () => null;
-
-    public onKeyDown(event: KeyboardEvent, tabToInput?: boolean) {
-        if (event.key === "Tab") {
-            this.toggle(false);
-            if (tabToInput) {
-                this.dropDownDirective.nativeElement.focus();
-            }
-        }
-    }
-
-    public onCalendarChange(event: any) {
-        this.writeValue(event, true);
-        this.onInputBlur();
-        this.inputElement.nativeElement.focus();
-        timer(0).toPromise().then(() => this.toggle(false));
-    }
-
-    public onInputChange(value: string) {
-        const date = parseMomentToDate(value, this.appDisplayFormat);
-        if (date != null) {
-            this.writeValue(date, true, true);
-        }
-    }
-
-    public onInputBlur(inputElement?: HTMLInputElement) {
-        this.displayedValue = this.value;
-        if (inputElement != null) {
-            inputElement.value = parseMomentToString(this.value, this.appInternalFormat, this.appDisplayFormat);
-        }
-    }
-
-    public onMouseDown(element: HTMLElement) {
-        if (this.document?.activeElement !== element) {
-            // Toggle calendar only if the element is not focused:
-            this.toggle(true);
-        }
-    }
-
-    public toggle(openOrClose?: boolean) {
-        this.dropDownDirective.toggle(openOrClose);
-    }
-
-    public writeValue(obj: any, emit?: boolean, doNotChangeDisplayedValue?: boolean): void {
-        this.value = parseMomentToDate(obj, this.appInternalFormat, new Date());
-        if (!doNotChangeDisplayedValue) {
-            this.displayedValue = this.value;
-        }
-
-        const internalValue = parseMomentToString(this.value, this.appInternalFormat, this.appInternalFormat);
-
-        if (obj !== internalValue || emit) {
-            this.onChange(internalValue);
-        }
-
-        if (emit) {
-            this.appValueChange.emit(internalValue);
-            this.onTouch();
-        }
-    }
-
-    public setDisabledState(isDisabled: boolean): void {
-        this.appDisabled = isDisabled;
-    }
-
-    public registerOnChange(fn: any): void {
-        this.onChange = fn;
-    }
-
-    public registerOnTouched(fn: any): void {
-        this.onTouch = fn;
-    }
-
-}
diff --git a/src/app/shared/date-control/date-control.module.ts b/src/app/shared/date-control/date-control.module.ts
deleted file mode 100644
index bb45afb..0000000
--- a/src/app/shared/date-control/date-control.module.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {FormsModule} from "@angular/forms";
-import {MatIconModule} from "@angular/material/icon";
-import {CalendarModule} from "primeng/calendar";
-import {DropDownModule} from "../drop-down";
-import {DateControlComponent} from "./component/date-control.component";
-import {MomentPipe} from "./pipe/moment.pipe";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        FormsModule,
-        CalendarModule,
-        DropDownModule,
-        MatIconModule
-    ],
-    declarations: [
-        DateControlComponent,
-        MomentPipe
-    ],
-    exports: [
-        DateControlComponent,
-        MomentPipe
-    ]
-})
-export class DateControlModule {
-
-}
diff --git a/src/app/shared/date-control/index.ts b/src/app/shared/date-control/index.ts
deleted file mode 100644
index 27e3447..0000000
--- a/src/app/shared/date-control/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./component/date-control.component";
-export * from "./date-control.module";
diff --git a/src/app/shared/date-control/pipe/moment.pipe.spec.ts b/src/app/shared/date-control/pipe/moment.pipe.spec.ts
deleted file mode 100644
index 1203067..0000000
--- a/src/app/shared/date-control/pipe/moment.pipe.spec.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {MomentPipe} from "./moment.pipe";
-import {Component} from "@angular/core";
-import {ComponentFixture, TestBed} from "@angular/core/testing";
-
-describe("MomentPipe", () => {
-
-    const pipe = new MomentPipe();
-    const date = new Date(2020, 5, 14, 11, 11, 11, 11);
-
-    describe("pipe", () => {
-
-        @Component({
-            template: `{{(displayDate | appMomentPipe: format).format(displayFormat)}}`
-        })
-        class TestComponent {
-            displayDate = date;
-            format;
-            displayFormat;
-        }
-        let component: TestComponent;
-        let fixture: ComponentFixture<TestComponent>;
-        let el: HTMLElement;
-
-        beforeEach(async () => {
-            await TestBed.configureTestingModule({
-                declarations: [
-                    MomentPipe,
-                    TestComponent
-                ]
-            }).compileComponents();
-            fixture = TestBed.createComponent(TestComponent);
-            component = fixture.componentInstance;
-            el = fixture.nativeElement;
-            fixture.detectChanges();
-        });
-
-        it("should convert the input date to default moment format", () => {
-            expect(el.textContent).toEqual("2020-06-14T11:11:11+02:00");
-        });
-
-        it("should convert the input date to the given display format", () => {
-            component.displayFormat = "DD.MM.YYYY";
-            fixture.detectChanges();
-            expect(el.textContent).toEqual("14.06.2020");
-        });
-    });
-
-    describe("transform", () => {
-
-        it("should convert the input to moment", () => {
-            const returnMoment = pipe.transform(date);
-            const returnObj = returnMoment.toObject();
-            expect(returnObj).toBeTruthy();
-            expect(date.getFullYear()).toEqual(returnObj.years);
-            expect(returnMoment.format()).toEqual("2020-06-14T11:11:11+02:00");
-        });
-    });
-});
-
diff --git a/src/app/shared/default-html/default-html-controls.stories.ts b/src/app/shared/default-html/default-html-controls.stories.ts
deleted file mode 100644
index 7ca3665..0000000
--- a/src/app/shared/default-html/default-html-controls.stories.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {MatIconModule} from "@angular/material/icon";
-import {boolean, number, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-
-const templateInput = `
-    <div style="display: flex; flex-flow: column; padding: 1em; justify-content: center; box-sizing: border-box;">
-      <input type="text" value="Default" style="margin: 0.5em; box-sizing: border-box;"
-             *ngFor="let class of [null, 'primary', 'info', 'success', 'warning', 'danger']"
-             class="openk-input"
-             [ngClass]="class == null ? null : 'openk-' + class"
-             [disabled]="disabled"
-             [value]="class == null ? 'default' : class"
-             [style.max-width]="maxWidth + 'em'">
-    </div>
-`;
-
-const templateButton = `
-    <div style="display: flex; flex-flow: row wrap; padding: 1em; box-sizing: border-box;">
-      <button class="openk-button"
-        style="margin: 0.5em;"
-        *ngFor="let class of [null, 'primary', 'info', 'success', 'warning', 'danger']"
-        [disabled]="disabled"
-        [class.openk-button-rounded]="rounded"
-        [ngClass]=" class == null ? null : 'openk-' + class">
-
-        <mat-icon *ngIf="rounded || withIcon">view_list</mat-icon>
-        <ng-container *ngIf="!rounded"> {{class == null ? 'default' : class}} </ng-container>
-      </button>
-    </div>
-`;
-
-storiesOf("Shared / Default HTML Controls", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({imports: [CommonModule, MatIconModule]}))
-    .add("Text Field", () => ({
-        template: templateInput,
-        props: {
-            disabled: boolean("Disabled", false),
-            maxWidth: number("Width", 20, {range: true, min: 0, max: 20, step: 1})
-        }
-    }))
-    .add("Buttons", () => ({
-        template: templateButton,
-        props: {
-            disabled: boolean("Disabled", false),
-            withIcon: boolean("With Icon", true),
-            rounded: boolean("Rounded", false)
-        }
-    }));
diff --git a/src/app/shared/drop-down/directives/drop-down.directive.spec.ts b/src/app/shared/drop-down/directives/drop-down.directive.spec.ts
deleted file mode 100644
index 32cef13..0000000
--- a/src/app/shared/drop-down/directives/drop-down.directive.spec.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {DropDownDirective} from "./drop-down.directive";
-
-describe("DropDownDirective", () => {
-    it("should create an instance", () => {
-        const directive = new DropDownDirective(null, null, null, document, window);
-        expect(directive).toBeTruthy();
-    });
-});
diff --git a/src/app/shared/drop-down/directives/drop-down.directive.ts b/src/app/shared/drop-down/directives/drop-down.directive.ts
deleted file mode 100644
index 5542c87..0000000
--- a/src/app/shared/drop-down/directives/drop-down.directive.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Overlay, OverlayConfig, OverlayRef, PositionStrategy} from "@angular/cdk/overlay";
-import {TemplatePortal} from "@angular/cdk/portal";
-import {DOCUMENT} from "@angular/common";
-import {Directive, ElementRef, Inject, Input, OnDestroy, TemplateRef, ViewContainerRef} from "@angular/core";
-import {fromEvent, merge, Subscription, timer} from "rxjs";
-import {take} from "rxjs/operators";
-import {WINDOW} from "../../../core/dom/window.token";
-
-@Directive({
-    selector: "[appDropDown]",
-    exportAs: "appDropDown"
-})
-export class DropDownDirective<C> implements OnDestroy {
-
-    @Input()
-    public appDropDown: TemplateRef<C>;
-
-    public isOpen = false;
-
-    private overlayRef: OverlayRef;
-
-    private subscriptionToClose: Subscription;
-
-    constructor(
-        private readonly elementRef: ElementRef<HTMLElement>,
-        private readonly viewContainerRef: ViewContainerRef,
-        private readonly overlay: Overlay,
-        @Inject(DOCUMENT) private readonly document: Document,
-        @Inject(WINDOW) private readonly window: Window
-    ) {
-
-    }
-
-    public ngOnDestroy(): void {
-        this.close();
-    }
-
-    public toggle() {
-        return this.overlayRef == null ? this.open() : this.close();
-    }
-
-    public async open() {
-        await timer(0).toPromise();
-
-        if (this.appDropDown == null) {
-            return;
-        }
-
-        if (this.overlayRef == null) {
-            this.overlayRef = this.overlay.create(this.getOverlayConfig());
-            const portal = new TemplatePortal(this.appDropDown, this.viewContainerRef);
-            this.overlayRef.attach(portal);
-            this.overlayRef.detachments().pipe(take(1)).subscribe(() => this.close(), () => this.close());
-            this.isOpen = true;
-            this.subscribeToClose();
-        }
-    }
-
-    public close() {
-        if (this.overlayRef != null) {
-            this.unsubscribeToClose();
-            this.overlayRef.detach();
-            this.overlayRef = null;
-            this.isOpen = false;
-        }
-    }
-
-    private subscribeToClose() {
-        this.unsubscribeToClose();
-        if (this.overlayRef != null) {
-            this.subscriptionToClose = merge(
-                this.overlayRef.detachments(),
-                fromEvent(this.document, "click"),
-                fromEvent(this.window, "resize"),
-                fromEvent(this.elementRef.nativeElement, "resize")
-            ).subscribe(() => this.close());
-        }
-    }
-
-    private unsubscribeToClose() {
-        if (this.subscriptionToClose != null) {
-            this.subscriptionToClose.unsubscribe();
-        }
-    }
-
-    private getOverlayConfig(): OverlayConfig {
-        const origin = this.elementRef.nativeElement;
-        const rect = origin.getBoundingClientRect();
-        return new OverlayConfig({
-            width: rect.width,
-            positionStrategy: this.getOverlayPosition(origin),
-            scrollStrategy: this.overlay.scrollStrategies.close()
-        });
-    }
-
-    private getOverlayPosition(origin: HTMLElement): PositionStrategy {
-        return this.overlay.position()
-            .flexibleConnectedTo(origin)
-            .withPositions([{
-                originX: "center",
-                originY: "bottom",
-                overlayX: "center",
-                overlayY: "top"
-            }])
-            .withFlexibleDimensions(false)
-            .withPush(false);
-    }
-
-}
diff --git a/src/app/shared/drop-down/drop-down.directive.spec.ts b/src/app/shared/drop-down/drop-down.directive.spec.ts
deleted file mode 100644
index 32cef13..0000000
--- a/src/app/shared/drop-down/drop-down.directive.spec.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {DropDownDirective} from "./drop-down.directive";
-
-describe("DropDownDirective", () => {
-    it("should create an instance", () => {
-        const directive = new DropDownDirective(null, null, null, document, window);
-        expect(directive).toBeTruthy();
-    });
-});
diff --git a/src/app/shared/drop-down/drop-down.directive.ts b/src/app/shared/drop-down/drop-down.directive.ts
deleted file mode 100644
index c69c229..0000000
--- a/src/app/shared/drop-down/drop-down.directive.ts
+++ /dev/null
@@ -1,207 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {ConnectedPosition, Overlay, OverlayConfig, OverlayRef, PositionStrategy} from "@angular/cdk/overlay";
-import {TemplatePortal} from "@angular/cdk/portal";
-import {DOCUMENT} from "@angular/common";
-import {Directive, ElementRef, EventEmitter, Inject, Input, OnDestroy, Output, TemplateRef, ViewContainerRef} from "@angular/core";
-import {fromEvent, merge, Subscription, timer} from "rxjs";
-import {filter, take} from "rxjs/operators";
-import {WINDOW} from "../../core";
-import {EKeyboardKeys} from "../../util/events";
-
-@Directive({
-    selector: "[appDropDown]",
-    exportAs: "appDropDown"
-})
-export class DropDownDirective<C = any> implements OnDestroy {
-
-    @Input()
-    public appConnectedPositions: ConnectedPosition[] = [
-        {
-            originX: "center",
-            originY: "bottom",
-            overlayX: "center",
-            overlayY: "top",
-            panelClass: "bottom"
-        },
-        {
-            originX: "center",
-            originY: "top",
-            overlayX: "center",
-            overlayY: "bottom",
-            panelClass: "top"
-        },
-        {
-            originX: "end",
-            originY: "top",
-            overlayX: "start",
-            overlayY: "top",
-            panelClass: "right"
-        },
-        {
-            originX: "start",
-            originY: "top",
-            overlayX: "end",
-            overlayY: "top",
-            panelClass: "left"
-        }
-    ];
-
-    @Input()
-    public appPreventAutomaticClose = false;
-
-    @Input()
-    public appDropDown: TemplateRef<C>;
-
-    @Output()
-    public readonly appOpen = new EventEmitter<Event | null>();
-
-    @Output()
-    public readonly appClose = new EventEmitter<Event | null>();
-
-    public isOpen = false;
-
-    public position: ConnectedPosition;
-
-    private disabled = false;
-
-    private overlayRef: OverlayRef;
-
-    private subscriptionToClose: Subscription;
-
-    constructor(
-        private readonly elementRef: ElementRef<HTMLElement>,
-        private readonly viewContainerRef: ViewContainerRef,
-        private readonly overlay: Overlay,
-        @Inject(DOCUMENT) private readonly document: Document,
-        @Inject(WINDOW) private readonly window: Window
-    ) {
-
-    }
-
-    public ngOnDestroy(): void {
-        this.close();
-    }
-
-    @Input()
-    public set appDisabled(value: boolean) {
-        this.disabled = value;
-        if (value) {
-            timer(0).toPromise().then(() => this.close());
-        }
-    }
-
-    public get nativeElement(): HTMLElement {
-        return this.elementRef?.nativeElement;
-    }
-
-    public get overlayElement(): HTMLElement {
-        return this.overlayRef?.overlayElement;
-    }
-
-    public isElementContainedIn(element?: Element | any): boolean {
-        return this.isElementContainedInOverlay(element) || this.isElementContainedInOrigin(element);
-    }
-
-    public isElementContainedInOrigin(element?: Element | any): boolean {
-        return this.nativeElement?.contains(element);
-    }
-
-    public isElementContainedInOverlay(element?: Element | any): boolean {
-        return this.overlayElement?.contains(element);
-    }
-
-    public toggle(openOrClose?: boolean) {
-        openOrClose = openOrClose == null ? this.overlayRef == null : openOrClose;
-        return openOrClose ? this.open() : this.close();
-    }
-
-    public async open() {
-        if (!this.disabled && this.overlayRef == null && this.appDropDown != null) {
-            this.overlayRef = this.overlay.create(this.getOverlayConfig());
-            const portal = new TemplatePortal(this.appDropDown, this.viewContainerRef);
-            this.overlayRef.attach(portal);
-            this.overlayRef.detachments().pipe(take(1)).subscribe(() => this.close());
-            this.subscribeToClose();
-            this.isOpen = this.overlayRef != null;
-            this.appOpen.emit(null);
-        }
-    }
-
-    public async close(event?: Event) {
-        if (this.overlayRef != null) {
-            this.unsubscribeToClose();
-            this.overlayRef.dispose();
-            this.overlayRef = null;
-            this.isOpen = false;
-            this.appClose.emit(event);
-        }
-    }
-
-    public async updatePosition() {
-        if (this.overlayRef != null) {
-            this.overlayRef.updatePosition();
-        }
-    }
-
-    private subscribeToClose() {
-        this.unsubscribeToClose();
-        if (this.overlayRef != null) {
-            this.subscriptionToClose = merge<Event>(
-                fromEvent(this.document, "click").pipe(
-                    filter((event) => !this.isElementContainedIn(event?.target))
-                ),
-                fromEvent(this.window, "resize"),
-                fromEvent(this.nativeElement, "resize"),
-                fromEvent<KeyboardEvent>(this.document, "keydown").pipe(
-                    filter((event) => event?.key === EKeyboardKeys.ESCAPE)
-                )
-            ).subscribe((event: Event) => this.close(event), (error) => console.error(error));
-        }
-    }
-
-    private unsubscribeToClose() {
-        if (this.subscriptionToClose != null) {
-            this.subscriptionToClose.unsubscribe();
-        }
-    }
-
-    private getOverlayConfig(): OverlayConfig {
-        const origin = this.elementRef.nativeElement;
-        const rect = origin.getBoundingClientRect();
-        return new OverlayConfig({
-            width: rect.width,
-            positionStrategy: this.getPositionStrategy(origin),
-            scrollStrategy: this.overlay.scrollStrategies.close()
-        });
-    }
-
-    private getPositionStrategy(origin: HTMLElement): PositionStrategy {
-        const result = this.overlay.position()
-            .flexibleConnectedTo(origin)
-            .withPositions(this.appConnectedPositions)
-            .withFlexibleDimensions(true)
-            .withViewportMargin(8)
-            .withPush(true);
-
-        result.positionChanges.subscribe({
-            next: (event) => this.position = event?.connectionPair,
-            error: () => this.position = null,
-            complete: () => this.position = null
-        });
-
-        return result;
-    }
-
-}
diff --git a/src/app/shared/drop-down/index.ts b/src/app/shared/drop-down/index.ts
deleted file mode 100644
index 1391fda..0000000
--- a/src/app/shared/drop-down/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./drop-down.directive";
-export * from "./drop-down.module";
diff --git a/src/app/shared/file-drop/component/file-drop.component.html b/src/app/shared/file-drop/component/file-drop.component.html
deleted file mode 100644
index 6f2c134..0000000
--- a/src/app/shared/file-drop/component/file-drop.component.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<span (dragover)="onDragOver($event)"
-      *ngFor="let file of appValue; let index = index;"
-      class="attachments-file">
-
-  <button (click)="onDelete(index)"
-          [disabled]="appDisabled"
-          class="openk-button openk-button-rounded"
-          type="button">
-    <mat-icon>clear</mat-icon>
-  </button>
-
-  {{file?.name}}
-
-</span>
-
-<input #inputElement
-       (input)="onInput(inputElement.files)"
-       [disabled]="appDisabled"
-       id="new-statement-attachments" multiple
-       style="display: none;"
-       type="file">
diff --git a/src/app/shared/file-drop/component/file-drop.component.scss b/src/app/shared/file-drop/component/file-drop.component.scss
deleted file mode 100644
index 1c3ce95..0000000
--- a/src/app/shared/file-drop/component/file-drop.component.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "openk.styles";
-
-:host {
-  @include rounded-border-mixin();
-
-  background: get-color($openk-default-palette);
-  display: inline-flex;
-  width: 20em;
-  border: 1px dashed get-color($openk-default-palette, A700);
-  flex-flow: column;
-  align-items: flex-start;
-  box-sizing: border-box;
-
-  min-height: 5em;
-  padding: 0.4em;
-  font-size: 0.875em;
-  font-weight: 400;
-  line-height: 1;
-  vertical-align: middle;
-  text-decoration: none;
-}
-
-.attachments-file {
-  display: inline-flex;
-  width: 100%;
-  align-items: center;
-  line-height: 1.25;
-
-  .openk-button {
-    font-size: 0.66em;
-    border: 0;
-    margin-right: 0.25em;
-  }
-}
diff --git a/src/app/shared/file-drop/component/file-drop.component.spec.ts b/src/app/shared/file-drop/component/file-drop.component.spec.ts
deleted file mode 100644
index 5bb0cb3..0000000
--- a/src/app/shared/file-drop/component/file-drop.component.spec.ts
+++ /dev/null
@@ -1,185 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {FileDropComponent} from "./file-drop.component";
-
-describe("FileDropComponent", () => {
-    let component: FileDropComponent;
-    let fixture: ComponentFixture<FileDropComponent>;
-
-    let file: File;
-    let anotherFile: File;
-    let thirdFile: File;
-    let fakeFileList: FakeFileList;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [FileDropComponent]
-        }).compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(FileDropComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    beforeEach(() => {
-        file = new File(["Some", "File"], "Some File");
-        anotherFile = new File(["Another", "File"], "Another File");
-        thirdFile = new File(["Third", "File"], "Third File");
-        fakeFileList = new FakeFileList([file]);
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-
-    describe("onInput", () => {
-        it("should add the files of the given filelist to the appValue array", () => {
-            expect(component.appValue).toEqual(undefined);
-            component.appDisabled = false;
-            component.onInput(fakeFileList as FileList);
-            expect(component.appValue).toEqual([file]);
-        });
-
-        it("should not add the files to appValue when the app is disabled", () => {
-            expect(component.appValue).toEqual(undefined);
-            component.appDisabled = true;
-            component.onInput(fakeFileList as FileList);
-            expect(component.appValue).toEqual(undefined);
-        });
-
-        it("should emit the appValueChanged", () => {
-            spyOn(component.appValueChange, "emit");
-            component.appDisabled = false;
-            component.onInput(fakeFileList as FileList);
-            expect(component.appValueChange.emit).toHaveBeenCalledWith([file]);
-        });
-    });
-
-    describe("onDelete", () => {
-        it("should not delete the file when disabled or the index is invalid", () => {
-            const fileArray = [file, anotherFile, thirdFile];
-
-            component.appValue = fileArray;
-            component.appDisabled = true;
-            component.onDelete(2);
-            expect(component.appValue).toEqual(fileArray);
-
-            component.appDisabled = false;
-            component.onDelete(14);
-            expect(component.appValue).toEqual(fileArray);
-        });
-
-        it("should delete the file found at the index in appValue", () => {
-            component.appValue = [file, anotherFile, thirdFile];
-            component.appDisabled = false;
-            component.onDelete(1);
-            expect(component.appValue).toEqual([file, thirdFile]);
-            component.onDelete(1);
-            expect(component.appValue).toEqual([file]);
-        });
-
-        it("should emit the deleted file for appValueDelete and the new appValue array for appValueChange", () => {
-            spyOn(component.appValueChange, "emit");
-            spyOn(component.appValueDelete, "emit");
-            component.appValue = [file, anotherFile, thirdFile];
-            component.appDisabled = false;
-            component.onDelete(1);
-            expect(component.appValueChange.emit).toHaveBeenCalledWith([file, thirdFile]);
-            expect(component.appValueDelete.emit).toHaveBeenCalledWith(anotherFile);
-        });
-    });
-
-    describe("onDrop", () => {
-        it("should not call onInput when appDisabled is set to true", () => {
-            const dataTransfer = {
-                files: fakeFileList
-            } as unknown as DataTransfer;
-            const dragEvent = {
-                dataTransfer,
-                preventDefault() {
-                }
-            } as DragEvent;
-
-            spyOn(component, "onInput");
-            component.appDisabled = true;
-            component.onDrop(dragEvent);
-            expect(component.onInput).not.toHaveBeenCalled();
-        });
-
-        it("should call onInput with the data supplied to onDrop", () => {
-            const dataTransfer = {
-                files: fakeFileList
-            } as unknown as DataTransfer;
-            const dragEvent = {
-                dataTransfer,
-                preventDefault() {
-                }
-            } as DragEvent;
-
-            spyOn(component, "onInput");
-            component.appDisabled = false;
-            component.onDrop(dragEvent);
-            expect(component.onInput).toHaveBeenCalledWith(fakeFileList);
-        });
-
-        it("should not call onInput when there are no files in the DataTransfer-Object", () => {
-            const dataTransfer = {
-                files: null
-            } as unknown as DataTransfer;
-            const dragEvent = {
-                dataTransfer,
-                preventDefault() {
-                }
-            } as DragEvent;
-
-            spyOn(component, "onInput");
-            component.appDisabled = false;
-            component.onDrop(dragEvent);
-            expect(component.onInput).not.toHaveBeenCalled();
-        });
-    });
-
-    describe("onDragOver", () => {
-        it("should call preventDefault", () => {
-            const dragEvent = {
-                preventDefault() {
-                }
-            } as DragEvent;
-
-            spyOn(dragEvent, "preventDefault");
-            component.appDisabled = false;
-            component.onDragOver(dragEvent);
-            expect(dragEvent.preventDefault).toHaveBeenCalled();
-        });
-    });
-});
-
-class FakeFileList implements FileList {
-    public data: File[];
-    public length: number;
-
-    [index: number]: File;
-
-    constructor(data: File[]) {
-        this.data = data;
-        this.length = this.data.length;
-    }
-
-    public item(idx) {
-        return this.data[idx];
-    }
-}
diff --git a/src/app/shared/file-drop/component/file-drop.component.stories.ts b/src/app/shared/file-drop/component/file-drop.component.stories.ts
deleted file mode 100644
index 3f4cdfb..0000000
--- a/src/app/shared/file-drop/component/file-drop.component.stories.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {action} from "@storybook/addon-actions";
-import {boolean, number, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {FileDropModule} from "../file-drop.module";
-
-storiesOf("Shared", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({imports: [FileDropModule]}))
-    .add("FileDropComponent", () => ({
-        template: `
-            <app-file-drop
-                #fileDrop
-                style="margin: 1em;"
-                [appDisabled]="appDisabled"
-                (appValueChange)="appValueChange($event)"
-                (appValueDelete)="appValueDelete($event)"
-                >
-            </app-file-drop>
-            <div>
-                <button (click)="fileDrop.openDialog();" class="openk-button" style="margin: 0 1em;">
-                    Open Dialog
-                </button>
-            </div>
-        `,
-        props: {
-            getFiles: (length) => getFiles(length),
-            appDisabled: boolean("appDisabled", false),
-            numberOfFiles: number("Number of files", 2, {min: 0, max: 30, step: 1, range: true}),
-            appValueChange: action("appValueChange"),
-            appValueDelete: action("appValueDelete")
-        }
-    }));
-
-function getFiles(length): File[] {
-    return Array(length)
-        .fill(0)
-        .map((_, id) => {
-            const fileBits = Array((id + 1) * 1024)
-                .fill(0)
-                .map(() => "" + Math.floor(Math.random() * 8));
-            return new File(fileBits, `New File (${id}).txt`);
-        });
-}
diff --git a/src/app/shared/file-drop/component/file-drop.component.ts b/src/app/shared/file-drop/component/file-drop.component.ts
deleted file mode 100644
index 8e74bc1..0000000
--- a/src/app/shared/file-drop/component/file-drop.component.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild} from "@angular/core";
-import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms";
-
-@Component({
-    selector: "app-file-drop",
-    templateUrl: "./file-drop.component.html",
-    styleUrls: ["./file-drop.component.scss"],
-    providers: [
-        {
-            provide: NG_VALUE_ACCESSOR,
-            useExisting: forwardRef(() => FileDropComponent),
-            multi: true
-        }
-    ]
-})
-export class FileDropComponent implements ControlValueAccessor {
-
-    @HostBinding("class.no-drop")
-    @Input()
-    public appDisabled = false;
-
-    @Input()
-    public appValue: File[];
-
-    @Output()
-    public appValueChange = new EventEmitter<File[]>();
-
-    @Output()
-    public appValueDelete = new EventEmitter<File>();
-
-    @ViewChild("inputElement")
-    public inputElement: ElementRef<HTMLInputElement>;
-
-    public onChange = (_: File[]) => null;
-
-    public onTouch = () => null;
-
-    @HostListener("dragover", ["$event"])
-    public onDragOver(event: DragEvent) {
-        if (this.appDisabled) {
-            return;
-        }
-
-        try {
-            // Prevent dropped files from being opened.
-            event.preventDefault();
-        } catch (e) {
-            return;
-        }
-    }
-
-    @HostListener("drop", ["$event"])
-    public onDrop(event: DragEvent) {
-        if (this.appDisabled) {
-            return;
-        }
-
-        if (event?.dataTransfer?.files?.length > 0) {
-            event.preventDefault();
-            this.onInput(event?.dataTransfer?.files);
-        }
-    }
-
-    public openDialog(): void {
-        if (!this.appDisabled && typeof this.inputElement?.nativeElement?.click === "function") {
-            this.inputElement.nativeElement.value = "";
-            this.inputElement.nativeElement.click();
-        }
-    }
-
-    public onInput(fileList: FileList) {
-        if (this.appDisabled) {
-            return;
-        }
-
-        this.appValue = [
-            ...(Array.isArray(this.appValue) ? this.appValue : []),
-            ...fileListToFileArray(fileList)
-        ];
-        this.appValueChange.emit(this.appValue);
-        this.onChange(this.appValue);
-        this.onTouch();
-    }
-
-    public onDelete(index: number) {
-        if (this.appDisabled || this.appValue[index] == null || typeof index !== "number") {
-            return;
-        }
-        const file = this.appValue[index];
-
-        this.appValue = [
-            ...this.appValue.slice(0, index),
-            ...this.appValue.slice(index + 1)
-        ];
-
-        this.appValueDelete.emit(file);
-        this.appValueChange.emit(this.appValue);
-        this.onChange(this.appValue);
-        this.onTouch();
-    }
-
-    public writeValue(obj: File[]): void {
-        if (!Array.isArray(obj)) {
-            return;
-        }
-        this.appValue = obj.filter((file) => file instanceof File);
-    }
-
-    public registerOnChange(fn: any): void {
-        this.onChange = typeof fn === "function" ? fn : this.onChange;
-    }
-
-    public registerOnTouched(fn: any): void {
-        this.onTouch = typeof fn === "function" ? fn : this.onTouch;
-    }
-
-}
-
-function fileListToFileArray(fileList: FileList): File[] {
-    try {
-        const result: File[] = [];
-        for (let i = 0; i < fileList?.length; i++) {
-            result.push(fileList?.item(i));
-        }
-        return result;
-    } catch (e) {
-        return [];
-    }
-}
diff --git a/src/app/shared/file-drop/file-drop.module.ts b/src/app/shared/file-drop/file-drop.module.ts
deleted file mode 100644
index 89c97d4..0000000
--- a/src/app/shared/file-drop/file-drop.module.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {FileDropComponent} from "./component/file-drop.component";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        MatIconModule
-    ],
-    declarations: [
-        FileDropComponent
-    ],
-    exports: [
-        FileDropComponent
-    ]
-})
-export class FileDropModule {
-
-}
diff --git a/src/app/shared/file-drop/index.ts b/src/app/shared/file-drop/index.ts
deleted file mode 100644
index 222114e..0000000
--- a/src/app/shared/file-drop/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./component/file-drop.component";
-export * from "./file-drop.module";
diff --git a/src/app/shared/layout/collapsible/collapsible.component.html b/src/app/shared/layout/collapsible/collapsible.component.html
index 7f5f9df..96bf684 100644
--- a/src/app/shared/layout/collapsible/collapsible.component.html
+++ b/src/app/shared/layout/collapsible/collapsible.component.html
@@ -12,10 +12,11 @@
  -------------------------------------------------------------------------------->
 
 <div [class.collapsible-header---with-content]="appHeaderTemplateRef"
-     #header class="collapsible-header">
+     #header [class.collapsible-header---no-color]="appSimpleCollapsible" class="collapsible-header">
 
   <button (click)="toggle()"
           type="button"
+          [class.collapsible-header--toggle---small]="appSimpleCollapsible"
           class="collapsible-header--toggle cursor-pointer">
     <mat-icon [class.collapsible-header--icon---collapsed]="isCollapsed$ | async"
               class="collapsible-header--icon">
diff --git a/src/app/shared/layout/collapsible/collapsible.component.scss b/src/app/shared/layout/collapsible/collapsible.component.scss
index 28b8163..c965b09 100644
--- a/src/app/shared/layout/collapsible/collapsible.component.scss
+++ b/src/app/shared/layout/collapsible/collapsible.component.scss
@@ -39,6 +39,11 @@
   border-bottom: 1px solid $openk-form-border;
 }
 
+.collapsible-header---no-color {
+  background: 0;
+  border: 0;
+}
+
 .collapsible-header---with-content {
   padding-right: 0.25em;
 }
@@ -58,6 +63,10 @@
   padding: 0 0.25em;
 }
 
+.collapsible-header--toggle---small {
+  flex: unset;
+}
+
 .collapsible-header--icon {
   width: initial;
   height: initial;
diff --git a/src/app/shared/layout/collapsible/collapsible.component.ts b/src/app/shared/layout/collapsible/collapsible.component.ts
index beb8ccd..fdefdfd 100644
--- a/src/app/shared/layout/collapsible/collapsible.component.ts
+++ b/src/app/shared/layout/collapsible/collapsible.component.ts
@@ -53,6 +53,13 @@
     @Input()
     public appHeaderTemplateRef: TemplateRef<any>;
 
+    /**
+     * If set, shows a simpler version of the collapsible.
+     * No borders and colors will be shown for the header and will only collapse when clicking on the button, not the whole row.
+     */
+    @Input()
+    public appSimpleCollapsible = false;
+
     @Output()
     public readonly appCollapsedChange = new EventEmitter<boolean>();
 
diff --git a/src/app/shared/layout/global-class-toggle/global-class-toggle.directive.ts b/src/app/shared/layout/global-class-toggle/global-class-toggle.directive.ts
new file mode 100644
index 0000000..efb82af
--- /dev/null
+++ b/src/app/shared/layout/global-class-toggle/global-class-toggle.directive.ts
@@ -0,0 +1,58 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {DOCUMENT} from "@angular/common";
+import {Directive, Inject, Input, OnChanges, OnDestroy, OnInit, SimpleChanges} from "@angular/core";
+
+@Directive({
+    selector: "[appGlobalClass]"
+})
+export class GlobalClassToggleDirective implements OnInit, OnChanges, OnDestroy {
+
+    @Input()
+    public appGlobalClass: string;
+
+    public constructor(@Inject(DOCUMENT) public document: Document) {
+
+    }
+
+    public ngOnInit() {
+        this.addClass(this.appGlobalClass);
+    }
+
+    public ngOnChanges(changes: SimpleChanges) {
+        if (changes.appGlobalClass != null) {
+            const change = changes.appGlobalClass;
+            this.removeClass(change.previousValue);
+            this.addClass(change.currentValue);
+        }
+    }
+
+    public ngOnDestroy() {
+        this.removeClass(this.appGlobalClass);
+    }
+
+    public removeClass(classString: string) {
+        if (typeof classString === "string") {
+            this.document.body.classList.remove(classString);
+        }
+    }
+
+    public addClass(classString: string) {
+        if (typeof classString === "string") {
+            this.document.body.classList.add(classString);
+        }
+    }
+
+
+}
diff --git a/src/app/shared/drop-down/drop-down.module.ts b/src/app/shared/layout/global-class-toggle/global-class-toggle.module.ts
similarity index 73%
rename from src/app/shared/drop-down/drop-down.module.ts
rename to src/app/shared/layout/global-class-toggle/global-class-toggle.module.ts
index 4906dd2..d72981d 100644
--- a/src/app/shared/drop-down/drop-down.module.ts
+++ b/src/app/shared/layout/global-class-toggle/global-class-toggle.module.ts
@@ -11,21 +11,17 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {OverlayModule} from "@angular/cdk/overlay";
 import {NgModule} from "@angular/core";
-import {DropDownDirective} from "./drop-down.directive";
+import {GlobalClassToggleDirective} from "./global-class-toggle.directive";
 
 @NgModule({
     declarations: [
-        DropDownDirective
-    ],
-    imports: [
-        OverlayModule
+        GlobalClassToggleDirective
     ],
     exports: [
-        DropDownDirective
+        GlobalClassToggleDirective
     ]
 })
-export class DropDownModule {
+export class GlobalClassToggleModule {
 
 }
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/shared/layout/global-class-toggle/index.ts
similarity index 85%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/shared/layout/global-class-toggle/index.ts
index 7378646..42d6253 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/shared/layout/global-class-toggle/index.ts
@@ -11,4 +11,5 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./global-class-toggle.directive";
+export * from "./global-class-toggle.module";
diff --git a/src/app/shared/page-header/component/IPageHeaderActions.ts b/src/app/shared/page-header/component/IPageHeaderActions.ts
deleted file mode 100644
index 174a250..0000000
--- a/src/app/shared/page-header/component/IPageHeaderActions.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export interface IPageHeaderAction {
-    name: string;
-    icon: string;
-    routerLink: string;
-    queryParams?: any;
-}
diff --git a/src/app/shared/page-header/component/page-header.component.html b/src/app/shared/page-header/component/page-header.component.html
deleted file mode 100644
index e100f46..0000000
--- a/src/app/shared/page-header/component/page-header.component.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<span class="page-header-title">
-  {{appTitle | translate}}
-</span>
-
-<div *ngIf="appActions?.length > 0" class="page-header-actions">
-
-  <a *ngFor="let action of appActions"
-     [routerLink]="action?.routerLink"
-     [queryParams]="action?.queryParams"
-     class="openk-button openk-info">
-    <mat-icon>{{action?.icon}}</mat-icon>
-    {{action.name | translate}}
-  </a>
-
-</div>
diff --git a/src/app/shared/page-header/component/page-header.component.scss b/src/app/shared/page-header/component/page-header.component.scss
deleted file mode 100644
index 7ed6bcc..0000000
--- a/src/app/shared/page-header/component/page-header.component.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-:host {
-  width: 100%;
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center;
-}
-
-.page-header-title {
-  margin-right: auto;
-  font-size: x-large;
-  font-weight: 600;
-}
-
-.page-header-actions {
-  display: flex;
-  flex-flow: row wrap;
-  margin-left: auto;
-  justify-content: flex-end;
-
-  .openk-button {
-    margin: 0.25em;
-  }
-}
diff --git a/src/app/shared/page-header/component/page-header.component.spec.ts b/src/app/shared/page-header/component/page-header.component.spec.ts
deleted file mode 100644
index 1c3d15a..0000000
--- a/src/app/shared/page-header/component/page-header.component.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {RouterTestingModule} from "@angular/router/testing";
-import {I18nModule} from "../../../core/i18n";
-import {PageHeaderModule} from "../page-header.module";
-import {PageHeaderComponent} from "./page-header.component";
-
-describe("PageHeaderComponent", () => {
-    let component: PageHeaderComponent;
-    let fixture: ComponentFixture<PageHeaderComponent>;
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            imports: [PageHeaderModule, RouterTestingModule, I18nModule]
-        }).compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(PageHeaderComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/src/app/shared/page-header/index.ts b/src/app/shared/page-header/index.ts
deleted file mode 100644
index 30a8ac4..0000000
--- a/src/app/shared/page-header/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./component/IPageHeaderActions";
-export * from "./page-header.module";
diff --git a/src/app/shared/page-header/page-header.module.ts b/src/app/shared/page-header/page-header.module.ts
deleted file mode 100644
index 218ea03..0000000
--- a/src/app/shared/page-header/page-header.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {RouterModule} from "@angular/router";
-import {TranslateModule} from "@ngx-translate/core";
-import {PageHeaderComponent} from "./component/page-header.component";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        TranslateModule,
-        MatIconModule,
-        RouterModule
-    ],
-    exports: [
-        PageHeaderComponent
-    ],
-    declarations: [
-        PageHeaderComponent
-    ]
-})
-export class PageHeaderModule {
-}
diff --git a/src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.spec.ts b/src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.spec.ts
new file mode 100644
index 0000000..8cafd12
--- /dev/null
+++ b/src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.spec.ts
@@ -0,0 +1,37 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {FindElementInArrayPipe} from "./find-element-in-array.pipe";
+
+describe("FindElementInArrayPipe", () => {
+
+    const pipe = new FindElementInArrayPipe();
+
+    it("should return the element if its in the array else undefined", () => {
+        const element = "element 1";
+        const array: string[] = [
+            element,
+            "element 2"
+        ];
+        let result = pipe.transform(element, array);
+        expect(result).toEqual(element);
+
+        result = pipe.transform(element, []);
+        expect(result).toEqual(undefined);
+
+        result = pipe.transform(element, ["element1", "element2"]);
+        expect(result).toEqual(undefined);
+    });
+
+});
+
diff --git a/src/app/shared/date-control/pipe/moment.pipe.ts b/src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.ts
similarity index 65%
copy from src/app/shared/date-control/pipe/moment.pipe.ts
copy to src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.ts
index 91fd692..2a47fc0 100644
--- a/src/app/shared/date-control/pipe/moment.pipe.ts
+++ b/src/app/shared/pipes/find-element-in-array/find-element-in-array.pipe.ts
@@ -12,16 +12,15 @@
  ********************************************************************************/
 
 import {Pipe, PipeTransform} from "@angular/core";
-import * as moment from "moment";
-import {Moment, MomentFormatSpecification, MomentInput} from "moment";
+import {arrayJoin} from "../../../util/store";
 
 @Pipe({
-    name: "appMomentPipe"
+    name: "findElementInArray"
 })
-export class MomentPipe implements PipeTransform {
+export class FindElementInArrayPipe<T> implements PipeTransform {
 
-    public transform(value: MomentInput, formatSpecification?: MomentFormatSpecification): Moment {
-        return moment(value, formatSpecification);
+    public transform(element: T, array: T[]): T {
+        return arrayJoin(array).find((_) => _ === element);
     }
 
 }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/find-element-in-array/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/find-element-in-array/index.ts
index 2e6e007..4ee06d8 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/find-element-in-array/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./find-element-in-array.pipe";
diff --git a/src/app/shared/pipes/get-form-array/get-form-array.pipe.spec.ts b/src/app/shared/pipes/get-form-array/get-form-array.pipe.spec.ts
new file mode 100644
index 0000000..fb2abb2
--- /dev/null
+++ b/src/app/shared/pipes/get-form-array/get-form-array.pipe.spec.ts
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {FormArray, FormGroup} from "@angular/forms";
+import {GetFormArrayPipe} from "./get-form-array.pipe";
+
+describe("GetFormArrayPipe", () => {
+
+    const pipe = new GetFormArrayPipe();
+
+    it("should pick a form array from a form group", () => {
+        const formArray = new FormArray([]);
+        const formGroup = new FormGroup({array: formArray});
+
+        expect(pipe.transform(formGroup, "array")).toBe(formArray);
+        expect(pipe.transform(formGroup, "noArray")).not.toBeDefined();
+        expect(pipe.transform(null, null)).not.toBeDefined();
+    });
+});
diff --git a/src/app/shared/date-control/pipe/moment.pipe.ts b/src/app/shared/pipes/get-form-array/get-form-array.pipe.ts
similarity index 65%
copy from src/app/shared/date-control/pipe/moment.pipe.ts
copy to src/app/shared/pipes/get-form-array/get-form-array.pipe.ts
index 91fd692..666c8dc 100644
--- a/src/app/shared/date-control/pipe/moment.pipe.ts
+++ b/src/app/shared/pipes/get-form-array/get-form-array.pipe.ts
@@ -12,16 +12,16 @@
  ********************************************************************************/
 
 import {Pipe, PipeTransform} from "@angular/core";
-import * as moment from "moment";
-import {Moment, MomentFormatSpecification, MomentInput} from "moment";
+import {FormArray, FormGroup} from "@angular/forms";
 
 @Pipe({
-    name: "appMomentPipe"
+    name: "getFormArray"
 })
-export class MomentPipe implements PipeTransform {
+export class GetFormArrayPipe implements PipeTransform {
 
-    public transform(value: MomentInput, formatSpecification?: MomentFormatSpecification): Moment {
-        return moment(value, formatSpecification);
+    public transform(group: FormGroup, key: string, getControls?: boolean): FormArray {
+        const control = group?.get(key);
+        return control instanceof FormArray ? control : undefined;
     }
 
 }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/get-form-array/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/get-form-array/index.ts
index 2e6e007..9d08935 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/get-form-array/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./get-form-array.pipe";
diff --git a/src/app/shared/date-control/pipe/moment.pipe.ts b/src/app/shared/pipes/get-form-error/get-form-error.pipe.ts
similarity index 64%
copy from src/app/shared/date-control/pipe/moment.pipe.ts
copy to src/app/shared/pipes/get-form-error/get-form-error.pipe.ts
index 91fd692..b683505 100644
--- a/src/app/shared/date-control/pipe/moment.pipe.ts
+++ b/src/app/shared/pipes/get-form-error/get-form-error.pipe.ts
@@ -12,16 +12,13 @@
  ********************************************************************************/
 
 import {Pipe, PipeTransform} from "@angular/core";
-import * as moment from "moment";
-import {Moment, MomentFormatSpecification, MomentInput} from "moment";
+import {AbstractControl} from "@angular/forms";
 
-@Pipe({
-    name: "appMomentPipe"
-})
-export class MomentPipe implements PipeTransform {
+@Pipe({name: "getFormError", pure: false})
+export class GetFormErrorPipe implements PipeTransform {
 
-    public transform(value: MomentInput, formatSpecification?: MomentFormatSpecification): Moment {
-        return moment(value, formatSpecification);
+    public transform(control: AbstractControl, errorCode: string, ...path: Array<string | number>): any {
+        return control?.getError(errorCode, path);
     }
 
 }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/get-form-error/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/get-form-error/index.ts
index 2e6e007..b11c5e7 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/get-form-error/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./get-form-error.pipe";
diff --git a/src/app/shared/date-control/pipe/moment.pipe.ts b/src/app/shared/pipes/get-form-group/get-form-group.pipe.ts
similarity index 65%
copy from src/app/shared/date-control/pipe/moment.pipe.ts
copy to src/app/shared/pipes/get-form-group/get-form-group.pipe.ts
index 91fd692..647e9ed 100644
--- a/src/app/shared/date-control/pipe/moment.pipe.ts
+++ b/src/app/shared/pipes/get-form-group/get-form-group.pipe.ts
@@ -12,16 +12,16 @@
  ********************************************************************************/
 
 import {Pipe, PipeTransform} from "@angular/core";
-import * as moment from "moment";
-import {Moment, MomentFormatSpecification, MomentInput} from "moment";
+import {FormGroup} from "@angular/forms";
 
 @Pipe({
-    name: "appMomentPipe"
+    name: "getFormGroup"
 })
-export class MomentPipe implements PipeTransform {
+export class GetFormGroupPipe implements PipeTransform {
 
-    public transform(value: MomentInput, formatSpecification?: MomentFormatSpecification): Moment {
-        return moment(value, formatSpecification);
+    public transform(group: FormGroup, key: string, getControls?: boolean): FormGroup {
+        const control = group?.get(key);
+        return control instanceof FormGroup ? control : undefined;
     }
 
 }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/get-form-group/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/get-form-group/index.ts
index 2e6e007..cb891c8 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/get-form-group/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./get-form-group.pipe";
diff --git a/src/app/shared/pipes/index.ts b/src/app/shared/pipes/index.ts
index 7280c5e..0da4dbd 100644
--- a/src/app/shared/pipes/index.ts
+++ b/src/app/shared/pipes/index.ts
@@ -11,6 +11,12 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./obj-to-array/obj-to-array.pipe";
-export * from "./pair/pair.pipe";
+export * from "./find-element-in-array";
+export * from "./get-form-array";
+export * from "./get-form-error";
+export * from "./get-form-group";
+export * from "./obj-to-array";
+export * from "./pair";
+export * from "./strings-to-options";
+
 export * from "./shared-pipes.module";
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/obj-to-array/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/obj-to-array/index.ts
index 2e6e007..e00a6a8 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/obj-to-array/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./obj-to-array.pipe";
diff --git a/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.spec.ts b/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.spec.ts
deleted file mode 100644
index b303628..0000000
--- a/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.spec.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component} from "@angular/core";
-import {ComponentFixture, TestBed} from "@angular/core/testing";
-import {ObjToArrayPipe} from "./obj-to-array.pipe";
-
-describe("ObjToArrayPipe", () => {
-
-    describe("pipe", () => {
-
-        @Component({
-            template: `<span *ngFor="let entry of obj | objToArray: keep">
-            {{entry.key}}: {{entry.value}}
-        </span>`
-        })
-        class TestComponent {
-            obj;
-            keep: boolean;
-        }
-
-        let component: TestComponent;
-        let fixture: ComponentFixture<TestComponent>;
-        let el: HTMLElement;
-
-        beforeEach(() => {
-            TestBed.configureTestingModule({
-                declarations: [
-                    ObjToArrayPipe,
-                    TestComponent
-                ]
-            });
-            fixture = TestBed.createComponent(TestComponent);
-            component = fixture.componentInstance;
-            el = fixture.nativeElement;
-            fixture.detectChanges();
-        });
-
-        it("should convert the input object to an array, removing null and undefined", () => {
-            component.obj = {
-                prop1: "propValue1",
-                prop2: 2,
-                3: 4,
-                prop4: null
-            };
-            fixture.detectChanges();
-            const listEntriesInHtml = el.querySelectorAll("span");
-            expect(listEntriesInHtml.length).toBe(Object.keys(component.obj).length - 1);
-            const spans = Array.from(el.querySelectorAll("span"));
-            expect(spans.find((span) => span.textContent.includes("3: 4"))).toBeTruthy();
-            expect(spans.find((span) => span.textContent.includes("prop1: propValue1"))).toBeTruthy();
-            expect(spans.find((span) => span.textContent.includes("prop2: 2"))).toBeTruthy();
-        });
-
-        it("should convert the input object to an array, keeping null and undefined", () => {
-            component.obj = {
-                prop1: "propValue1",
-                prop2: 2,
-                3: 4,
-                prop4: null
-            };
-            component.keep = true;
-            fixture.detectChanges();
-            const listEntriesInHtml = el.querySelectorAll("span");
-            expect(listEntriesInHtml.length).toBe(Object.keys(component.obj).length);
-            const spans = Array.from(el.querySelectorAll("span"));
-            expect(spans.find((span) => span.textContent.includes("3: 4"))).toBeTruthy();
-            expect(spans.find((span) => span.textContent.includes("prop1: propValue1"))).toBeTruthy();
-            expect(spans.find((span) => span.textContent.includes("prop2: 2"))).toBeTruthy();
-        });
-    });
-
-    describe("transform", () => {
-
-        const pipe = new ObjToArrayPipe();
-
-        it("should convert a object to an array", () => {
-            const testObject = {
-                prop1: "propValue1",
-                prop2: "propValue2",
-                prop3: 3
-            };
-            const expectedArray: Array<{ key: number | string, value: any }> = [
-                {key: "prop1", value: "propValue1"},
-                {key: "prop2", value: "propValue2"},
-                {key: "prop3", value: 3}
-            ];
-            const array = pipe.transform(testObject);
-            expect(Array.isArray(array)).toBe(true);
-            expect(array).toEqual(expectedArray);
-        });
-
-        it("should return empty array for null/undefined", () => {
-            const undefinedToArray = pipe.transform(undefined);
-            expect(Array.isArray(undefinedToArray)).toBeTrue();
-            expect(undefinedToArray.length).toBe(0);
-            const nullToArray = pipe.transform(undefined);
-            expect(Array.isArray(nullToArray)).toBeTrue();
-            expect(nullToArray.length).toBe(0);
-        });
-
-        it("should not keep null or undefined properties (default)", () => {
-            const testObject = {
-                prop1: "propValue1",
-                prop2: undefined,
-                prop3: null
-            };
-            const expectedArray: Array<{ key: number | string, value: any }> = [
-                {key: "prop1", value: "propValue1"},
-            ];
-            let array = pipe.transform(testObject);
-            expect(Array.isArray(array)).toBe(true);
-            expect(array).toEqual(expectedArray);
-            array = pipe.transform(testObject, false);
-            expect(Array.isArray(array)).toBe(true);
-            expect(array).toEqual(expectedArray);
-        });
-
-        it("should keep null or undefined properties", () => {
-            const testObject = {
-                prop1: "propValue1",
-                prop2: undefined,
-                prop3: null
-            };
-            const expectedArray: Array<{ key: number | string, value: any }> = [
-                {key: "prop1", value: "propValue1"},
-                {key: "prop2", value: undefined},
-                {key: "prop3", value: null},
-            ];
-            const array = pipe.transform(testObject, true);
-            expect(Array.isArray(array)).toBe(true);
-            expect(array).toEqual(expectedArray);
-        });
-    });
-});
diff --git a/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.ts b/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.ts
deleted file mode 100644
index f6bb85d..0000000
--- a/src/app/shared/pipes/objToArrayPipe/obj-to-array.pipe.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-import {Pipe, PipeTransform} from "@angular/core";
-
-
-/**
- * Converts an object to an array containing objects with key and value tags
- * example: Object{prop1: "propValue1", prop2: "propValue2"}
- * ->
- * [Object{key: 'prop1', value: 'propValue1'},
- * Object{key: 'prop2', value: 'propValue2'}]
- */
-
-@Pipe({name: "objToArray"})
-export class ObjToArrayPipe implements PipeTransform {
-
-    public transform<T extends object>(value: T, keepNullOrUndefined: boolean = false): Array<{ key: number | string, value: T }> {
-        return (typeof value !== "object" || value == null ? [] : Object.keys(value))
-            .map((key) => ({key, value: value[key]}))
-            .filter((obj) => keepNullOrUndefined || obj?.value != null);
-    }
-
-}
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/pair/index.ts
similarity index 94%
rename from src/app/shared/select/pipes/index.ts
rename to src/app/shared/pipes/pair/index.ts
index 2e6e007..7b57767 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/pair/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./pair.pipe";
diff --git a/src/app/shared/pipes/shared-pipes.module.ts b/src/app/shared/pipes/shared-pipes.module.ts
index 38ccd86..153655f 100644
--- a/src/app/shared/pipes/shared-pipes.module.ts
+++ b/src/app/shared/pipes/shared-pipes.module.ts
@@ -12,17 +12,32 @@
  ********************************************************************************/
 
 import {NgModule} from "@angular/core";
-import {ObjToArrayPipe} from "./obj-to-array/obj-to-array.pipe";
-import {PairPipe} from "./pair/pair.pipe";
+import {FindElementInArrayPipe} from "./find-element-in-array";
+import {GetFormArrayPipe} from "./get-form-array";
+import {GetFormErrorPipe} from "./get-form-error";
+import {GetFormGroupPipe} from "./get-form-group";
+import {ObjToArrayPipe} from "./obj-to-array";
+import {PairPipe} from "./pair";
+import {StringsToOptionsPipe} from "./strings-to-options";
 
 @NgModule({
     declarations: [
         ObjToArrayPipe,
-        PairPipe
+        PairPipe,
+        GetFormArrayPipe,
+        GetFormGroupPipe,
+        GetFormErrorPipe,
+        FindElementInArrayPipe,
+        StringsToOptionsPipe
     ],
     exports: [
         ObjToArrayPipe,
-        PairPipe
+        PairPipe,
+        GetFormArrayPipe,
+        GetFormGroupPipe,
+        GetFormErrorPipe,
+        FindElementInArrayPipe,
+        StringsToOptionsPipe
     ]
 })
 export class SharedPipesModule {
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/pipes/strings-to-options/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/pipes/strings-to-options/index.ts
index 2e6e007..798a978 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/pipes/strings-to-options/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./strings-to-options.pipe";
diff --git a/src/app/shared/pipes/strings-to-options/strings-to-options.pipe.spec.ts b/src/app/shared/pipes/strings-to-options/strings-to-options.pipe.spec.ts
new file mode 100644
index 0000000..6c9bddc
--- /dev/null
+++ b/src/app/shared/pipes/strings-to-options/strings-to-options.pipe.spec.ts
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {StringsToOptionsPipe} from "./strings-to-options.pipe";
+
+describe("StringsToOptionsPipe", () => {
+
+    const pipe = new StringsToOptionsPipe();
+
+    it("should return the input strings as an array of objects with label and value being the string value", () => {
+        const array: string[] = [
+            "option 1",
+            "option 2",
+            "option 3"
+        ];
+        const result = pipe.transform(array);
+        expect(result).toEqual([
+            {value: "option 1", label: "option 1"},
+            {value: "option 2", label: "option 2"},
+            {value: "option 3", label: "option 3"}
+        ]);
+    });
+
+    it("should return an empty array for no value supplied", () => {
+
+        let result = pipe.transform(undefined);
+        expect(result).toEqual([]);
+
+        result = pipe.transform(null);
+        expect(result).toEqual([]);
+    });
+
+});
+
diff --git a/src/app/shared/date-control/pipe/moment.pipe.ts b/src/app/shared/pipes/strings-to-options/strings-to-options.pipe.ts
similarity index 65%
rename from src/app/shared/date-control/pipe/moment.pipe.ts
rename to src/app/shared/pipes/strings-to-options/strings-to-options.pipe.ts
index 91fd692..a8a8a89 100644
--- a/src/app/shared/date-control/pipe/moment.pipe.ts
+++ b/src/app/shared/pipes/strings-to-options/strings-to-options.pipe.ts
@@ -12,16 +12,16 @@
  ********************************************************************************/
 
 import {Pipe, PipeTransform} from "@angular/core";
-import * as moment from "moment";
-import {Moment, MomentFormatSpecification, MomentInput} from "moment";
+import {arrayJoin} from "../../../util/store";
+import {ISelectOption} from "../../controls/select/model";
 
 @Pipe({
-    name: "appMomentPipe"
+    name: "stringsToOptions"
 })
-export class MomentPipe implements PipeTransform {
+export class StringsToOptionsPipe implements PipeTransform {
 
-    public transform(value: MomentInput, formatSpecification?: MomentFormatSpecification): Moment {
-        return moment(value, formatSpecification);
+    public transform(optionStrings: string[]): ISelectOption[] {
+        return arrayJoin(optionStrings).map((_) => ({label: _, value: _}));
     }
 
 }
diff --git a/src/app/shared/select/components/index.ts b/src/app/shared/select/components/index.ts
deleted file mode 100644
index cff5264..0000000
--- a/src/app/shared/select/components/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./select.component";
diff --git a/src/app/shared/select/components/select.component.html b/src/app/shared/select/components/select.component.html
deleted file mode 100644
index 336b467..0000000
--- a/src/app/shared/select/components/select.component.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-------------------------------------------------------------------------------
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- -------------------------------------------------------------------------------->
-
-<button #dropDown="appDropDown"
-        #toggleButtonRef
-        (click)="toggle()"
-        (keydown)="onKeyDown($event)"
-        [appConnectedPositions]="connectedPositions"
-        [appDisabled]="appDisabled || !(appOptions?.length > 0)"
-        [appDropDown]="optionsRef"
-        [class.select-toggle-opened-bottom]="dropDown?.position?.panelClass === 'bottom'"
-        [class.select-toggle-opened-top]="dropDown?.position?.panelClass === 'top'"
-        [disabled]="appDisabled"
-        [id]="appId"
-        class="select-toggle openk-input"
-        type="button">
-
-  <span *ngIf="(appOptions | selected: appValue)?.value != null; else placeholderRef" class="select-toggle-text">
-      {{(appOptions | selected: appValue)?.label }}
-  </span>
-
-  <ng-template #placeholderRef>
-    <span class="select-toggle-text select-toggle-text-placeholder"> {{appPlaceholder}} </span>
-  </ng-template>
-
-  <mat-icon [class.select-toggle-icon-opened]="dropDown.isOpen"
-            class="select-toggle-icon">
-    play_arrow
-  </mat-icon>
-
-</button>
-
-<ng-template #optionsRef>
-  <div (focusin)="toggleButtonRef.focus()"
-       (keydown)="onKeyDown($event)"
-       [class.select-options-bottom]="dropDown?.position?.panelClass === 'bottom'"
-       [class.select-options-top]="dropDown?.position?.panelClass === 'top'"
-       class="select-options"
-       tabindex="0">
-    <div (click)="onClickOnOption(option?.value)"
-         *ngFor="let option of appOptions"
-         [class.select-options-button-selected]="appValue != null && option?.value === appValue"
-         class="select-options-button openk-button">
-      <span class="select-options-button-label">
-        {{option?.label}}
-      </span>
-    </div>
-  </div>
-</ng-template>
diff --git a/src/app/shared/select/components/select.component.scss b/src/app/shared/select/components/select.component.scss
deleted file mode 100644
index eddb9a5..0000000
--- a/src/app/shared/select/components/select.component.scss
+++ /dev/null
@@ -1,125 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-@import "src/styles/openk.styles";
-
-:host {
-  display: inline-flex;
-  font-size: 0.875em;
-}
-
-.select-toggle {
-  display: inline-flex;
-  padding-right: 0.25em;
-  width: 100%;
-  font-size: 1em;
-  text-align: left;
-  cursor: pointer;
-
-  &:disabled {
-    cursor: initial;
-  }
-}
-
-.select-toggle-text {
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-  padding-right: 0.5em;
-  min-height: 1.5em;
-}
-
-.select-toggle-text-placeholder {
-  color: get-color($openk-default-palette, 800);
-  font-style: italic;
-}
-
-.select-toggle-icon {
-  margin: auto 0 auto auto;
-  font-size: 1em;
-  width: initial;
-  height: initial;
-  transform: rotate(90deg);
-  transition: transform 100ms ease-in, color 100ms ease-in;
-  color: get-color($openk-default-palette, 800);
-}
-
-.select-toggle-icon-opened {
-  transform: rotate(270deg);
-  color: get-color($openk-info-palette, A300);
-}
-
-.select-toggle-opened-bottom {
-  border-bottom-right-radius: 0;
-}
-
-.select-toggle-opened-top {
-  border-top-right-radius: 0;
-}
-
-.select-options {
-  box-sizing: border-box;
-  width: calc(100% - 4px);
-  max-height: calc(7.5 * 2.5em);
-  overflow: auto;
-  display: flex;
-  flex-flow: column nowrap;
-  background: get-color($openk-default-palette);
-  border: 1px solid get-color($openk-default-palette, 800);
-  border-color: get-color($openk-info-palette, A300);
-  font-size: 0.875em;
-  box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1);
-}
-
-.select-options-bottom {
-  border-top: 0;
-}
-
-.select-options-top {
-  border-bottom: 0;
-  box-shadow: 0 -3px 3px rgba(0, 0, 0, 0.1);
-}
-
-.select-options-button {
-  min-height: 2.5em;
-  box-sizing: border-box;
-  padding: 0 0.85em 0 0.85em;
-  line-height: 1.5;
-  cursor: pointer;
-  width: 100%;
-  display: inline-flex;
-  justify-content: flex-start;
-  border: 0;
-  border-top: 1px dotted get-color($openk-default-palette, 800);
-  border-radius: 0;
-
-  &:first-child,
-  &.select-options-button-selected,
-  &.select-options-button-selected + & {
-    border-color: transparent;
-  }
-}
-
-.select-options-button-label {
-  text-overflow: ellipsis;
-  overflow-x: hidden;
-  white-space: nowrap;
-  width: 100%;
-  display: inline-block;
-  text-align: left;
-}
-
-.select-options-button-selected {
-  background: get-color($openk-info-palette, A300);
-  color: get-color($openk-info-palette, 500, contrast);
-  filter: none !important;
-}
diff --git a/src/app/shared/select/components/select.component.spec.ts b/src/app/shared/select/components/select.component.spec.ts
deleted file mode 100644
index e3062c4..0000000
--- a/src/app/shared/select/components/select.component.spec.ts
+++ /dev/null
@@ -1,346 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Component, ViewChild} from "@angular/core";
-import {async, ComponentFixture, TestBed} from "@angular/core/testing";
-import {FormsModule, NgForm, NgModel} from "@angular/forms";
-import {By} from "@angular/platform-browser";
-import {EKeyboardKeys} from "../../../util/events";
-import {ISelectOption} from "../ISelectOption";
-import {SelectModule} from "../select.module";
-import {SelectComponent} from "./select.component";
-
-describe("SelectComponent", () => {
-    let component: SelectSpecComponent;
-    let fixture: ComponentFixture<SelectSpecComponent>;
-
-    function getSelectToggle(): HTMLButtonElement {
-        return fixture.debugElement.query(By.css(".select-toggle"))?.nativeElement;
-    }
-
-    function getSelectToggleText(): HTMLSpanElement {
-        return fixture.debugElement.query(By.css(".select-toggle-text"))?.nativeElement;
-    }
-
-    function getOptions(): HTMLElement[] {
-        return fixture.debugElement
-            .queryAll(By.css(".select-options-button"))
-            .map((e) => e?.nativeElement)
-            .filter((e) => e != null);
-    }
-
-    beforeEach(async(() => {
-        TestBed.configureTestingModule({
-            declarations: [
-                SelectSpecComponent
-            ],
-            imports: [
-                SelectModule,
-                FormsModule
-            ]
-        }).compileComponents();
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(SelectSpecComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it("should create", () => {
-        expect(component).toBeTruthy();
-        expect(component.selectComponentRef).toBeTruthy();
-        expect(component.ngModel).toBeTruthy();
-    });
-
-    it("should register to Angular forms", async () => {
-        component.modelValue = 19;
-        fixture.detectChanges();
-        await fixture.whenStable();
-        expect(component.ngForm.value).toEqual({select: 19});
-        expect(component.selectComponentRef.appValue).toBe(19);
-
-        component.ngForm.control.disable();
-        expect(component.selectComponentRef.appDisabled).toBeTrue();
-    });
-
-    it("should display the placeholder or the selected option", async () => {
-        component.appPlaceholder = "" + Math.random();
-        fixture.detectChanges();
-
-        expect(getSelectToggleText().innerText).toBeDefined();
-        expect(getSelectToggleText().innerText).toBe(component.appPlaceholder);
-
-        component.appValue = 19;
-        fixture.detectChanges();
-
-        expect(getSelectToggleText().innerText).toBeDefined();
-        expect(getSelectToggleText().innerText).toBe(component.appPlaceholder);
-
-        component.setOptions(100);
-        fixture.detectChanges();
-
-        expect(getSelectToggleText().innerText).toBeDefined();
-        expect(getSelectToggleText().innerText).toBe("Option 19");
-    });
-
-    it("should change value when clicking on option", async () => {
-        const toggle = getSelectToggle();
-
-        component.setOptions(100);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        toggle.click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        const options = getOptions();
-        expect(options.length).toBe(100);
-
-        options[19].click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.appValue).toBe(19);
-        expect(component.ngModel.value).toBe(19);
-        expect(component.ngForm.value).toEqual({select: 19});
-        expect(getOptions().length).toBe(0);
-    });
-
-    it("should not change value when disabled", async () => {
-        const toggle = getSelectToggle();
-
-        component.setOptions(100);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        toggle.click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        component.appDisabled = true;
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        component.selectComponentRef.onClickOnOption(19);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.appValue).not.toBeDefined();
-        expect(component.ngModel.value).not.toBeDefined();
-        expect(component.ngForm.value).toEqual({select: undefined});
-        expect(getOptions().length).toBe(0);
-    });
-
-    it("should increase value with keyboard input", async () => {
-        const KEYS = [EKeyboardKeys.ARROW_DOWN, EKeyboardKeys.ARROW_RIGHT];
-        const NUMBER_OF_OPTIONS = 10;
-
-        const toggle = getSelectToggle();
-        component.setOptions(NUMBER_OF_OPTIONS);
-
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.appValue).toBe(undefined);
-
-        let selectedId = 0;
-
-        for (let i = 0; i < 2 * NUMBER_OF_OPTIONS; i++) {
-            for (const key of KEYS) {
-                toggle.dispatchEvent(new KeyboardEvent("keydown", {key}));
-                fixture.detectChanges();
-                await fixture.whenStable();
-                expect(component.appValue).toBe(selectedId);
-                expect(component.ngModel.value).toBe(selectedId);
-                expect(component.ngForm.value).toEqual({select: selectedId});
-                selectedId = selectedId + 1 >= NUMBER_OF_OPTIONS ? 0 : selectedId + 1;
-            }
-        }
-    });
-
-    it("should decrease value with keyboard input", async () => {
-        const KEYS = [EKeyboardKeys.ARROW_UP, EKeyboardKeys.ARROW_LEFT];
-        const NUMBER_OF_OPTIONS = 10;
-
-        const toggle = getSelectToggle();
-
-        component.setOptions(NUMBER_OF_OPTIONS);
-
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.appValue).toBe(undefined);
-
-        let selectedId = NUMBER_OF_OPTIONS - 1;
-
-        for (let i = 0; i < 2 * NUMBER_OF_OPTIONS; i++) {
-            for (const key of KEYS) {
-                toggle.dispatchEvent(new KeyboardEvent("keydown", {key}));
-                fixture.detectChanges();
-                await fixture.whenStable();
-                expect(component.appValue).toBe(selectedId);
-                expect(component.ngModel.value).toBe(selectedId);
-                expect(component.ngForm.value).toEqual({select: selectedId});
-                selectedId = selectedId <= 0 ? NUMBER_OF_OPTIONS - 1 : selectedId - 1;
-            }
-        }
-    });
-
-    it("should do nothing on keyboard inputs when no options are available", async () => {
-        const KEYS = [EKeyboardKeys.ARROW_DOWN, EKeyboardKeys.ARROW_RIGHT, EKeyboardKeys.ARROW_UP, EKeyboardKeys.ARROW_LEFT];
-
-        const toggle = getSelectToggle();
-
-        for (const key of KEYS) {
-            toggle.dispatchEvent(new KeyboardEvent("keydown", {key}));
-            fixture.detectChanges();
-            await fixture.whenStable();
-            expect(component.appValue).not.toBeDefined();
-            expect(component.ngModel.value).not.toBeDefined();
-            expect(component.ngForm.value).toEqual({select: undefined});
-        }
-    });
-
-    it("should do nothing on keyboard inputs when disabled", async () => {
-        const KEYS = [EKeyboardKeys.ARROW_DOWN, EKeyboardKeys.ARROW_RIGHT, EKeyboardKeys.ARROW_UP, EKeyboardKeys.ARROW_LEFT];
-
-        const toggle = getSelectToggle();
-
-        component.setOptions(100);
-        component.appDisabled = true;
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        for (const key of KEYS) {
-            toggle.dispatchEvent(new KeyboardEvent("keydown", {key}));
-            fixture.detectChanges();
-            await fixture.whenStable();
-            expect(component.appValue).not.toBeDefined();
-            expect(component.ngModel.value).not.toBeDefined();
-            expect(component.ngForm.value).toEqual({select: undefined});
-        }
-    });
-
-    it("should toggle drop down menu on click", async () => {
-        const toggle = getSelectToggle();
-
-        component.setOptions(100);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        toggle.click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.selectComponentRef.dropDown.isOpen).toBeTrue();
-        expect(getOptions().length).toBe(100);
-
-        toggle.click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.selectComponentRef.dropDown.isOpen).toBeFalse();
-        expect(getOptions().length).toBe(0);
-    });
-
-    it("should not toggle drop down menu when disabled or no options are available", async () => {
-        const toggle = getSelectToggle();
-
-        toggle.click();
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.selectComponentRef.dropDown.isOpen).toBeFalse();
-        expect(getOptions().length).toBe(0);
-
-        component.setOptions(100);
-        component.appDisabled = true;
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        expect(component.selectComponentRef.dropDown.isOpen).toBeFalse();
-        expect(getOptions().length).toBe(0);
-    });
-
-    it("should close drop down on pressing tab or escape", async () => {
-        const KEYS = [EKeyboardKeys.TAB, EKeyboardKeys.ESCAPE];
-
-        const toggle = getSelectToggle();
-
-        component.setOptions(100);
-        fixture.detectChanges();
-        await fixture.whenStable();
-
-        for (const key of KEYS) {
-            toggle.click();
-            fixture.detectChanges();
-            await fixture.whenStable();
-
-            expect(component.selectComponentRef.dropDown.isOpen).toBeTrue();
-            expect(getOptions().length).toBe(100);
-
-            toggle.dispatchEvent(new KeyboardEvent("keydown", {key}));
-            fixture.detectChanges();
-            await fixture.whenStable();
-
-            expect(component.selectComponentRef.dropDown.isOpen).toBeFalse();
-            expect(getOptions().length).toBe(0);
-        }
-    });
-
-});
-
-@Component({
-    selector: "app-select-spec",
-    template: `
-        <form>
-            <app-select
-                [(appValue)]="appValue"
-                [appDisabled]="appDisabled"
-                [appOptions]="appOptions"
-                [appPlaceholder]="appPlaceholder"
-                [ngModel]="modelValue"
-                name="select">
-            </app-select>
-        </form>
-    `
-})
-class SelectSpecComponent {
-
-    @ViewChild(NgModel)
-    public ngModel: NgModel;
-
-    @ViewChild(NgForm)
-    public ngForm: NgForm;
-
-    @ViewChild(SelectComponent)
-    public selectComponentRef: SelectComponent;
-
-    public appValue: number;
-
-    public appOptions: ISelectOption[];
-
-    public appDisabled: boolean;
-
-    public appPlaceholder: string;
-
-    public modelValue: number;
-
-    public setOptions(size: number) {
-        this.appOptions = size == null ? undefined : Array(size)
-            .fill(0).map((_, value) => ({value, label: "Option " + value}));
-    }
-
-}
diff --git a/src/app/shared/select/components/select.component.stories.ts b/src/app/shared/select/components/select.component.stories.ts
deleted file mode 100644
index fb782bf..0000000
--- a/src/app/shared/select/components/select.component.stories.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {action} from "@storybook/addon-actions";
-import {boolean, number, text, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-import {ISelectOption} from "../ISelectOption";
-import {SelectModule} from "../select.module";
-
-storiesOf("Shared", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({imports: [SelectModule]}))
-    .add("Select", () => ({
-        template: `
-            <app-select style="margin: 1em; width: 10em;" class="openk-info"
-                [appDisabled]="appDisabled"
-                [appOptions]="appOptions"
-                [appPlaceholder]="appPlaceholder"
-                [appValue]="appValue"
-                (appValueChange)="appValueChange($event)">
-            </app-select>
-        `,
-        props: {
-            appValue: number("appValue", undefined),
-            appOptions: Array(5).fill(0).map<ISelectOption>((_, value) => ({label: "Option " + value, value})),
-            appPlaceholder: text("appPlaceholder", "Placeholder"),
-            appDisabled: boolean("appDisabled", false),
-            appValueChange: action("appValueChange")
-        }
-    }));
diff --git a/src/app/shared/select/components/select.component.ts b/src/app/shared/select/components/select.component.ts
deleted file mode 100644
index b9a4ec9..0000000
--- a/src/app/shared/select/components/select.component.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {ConnectedPosition} from "@angular/cdk/overlay";
-import {Component, EventEmitter, forwardRef, Input, Output, ViewChild} from "@angular/core";
-import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms";
-import {EKeyboardKeys} from "../../../util/events";
-import {DropDownDirective} from "../../drop-down";
-import {ISelectOption} from "../ISelectOption";
-
-@Component({
-    selector: "app-select",
-    templateUrl: "./select.component.html",
-    styleUrls: ["./select.component.scss"],
-    providers: [
-        {
-            provide: NG_VALUE_ACCESSOR,
-            useExisting: forwardRef(() => SelectComponent),
-            multi: true
-        }
-    ]
-})
-export class SelectComponent implements ControlValueAccessor {
-
-    private static id = 0;
-
-    @Input()
-    public appId = `CalendarControlComponent${SelectComponent.id++}`;
-
-    @Input()
-    public appPlaceholder = "";
-
-    @Input()
-    public appValue: any;
-
-    @Input()
-    public appOptions: ISelectOption[] = [];
-
-    @Output()
-    public appValueChange = new EventEmitter<any>();
-
-    @ViewChild(DropDownDirective)
-    public dropDown: DropDownDirective;
-
-    public readonly connectedPositions: ConnectedPosition[] = [
-        {
-            originX: "start",
-            originY: "bottom",
-            overlayX: "start",
-            overlayY: "top",
-            offsetX: 4,
-            panelClass: "bottom"
-        },
-        {
-            originX: "start",
-            originY: "top",
-            overlayX: "start",
-            overlayY: "bottom",
-            offsetX: 4,
-            panelClass: "top"
-        },
-        {
-            originX: "start",
-            originY: "center",
-            overlayX: "start",
-            overlayY: "center",
-            panelClass: "center",
-            offsetX: 4
-        }
-    ];
-
-    @Input()
-    public appDisabled = false;
-
-    public onChange = (_: any) => null;
-
-    public onTouch = () => null;
-
-    public writeValue(obj: any, emit?: boolean) {
-        const oldValue = this.appValue;
-        this.appValue = obj;
-        if (emit && oldValue !== obj) {
-            this.appValueChange.emit(obj);
-            this.onChange(obj);
-            this.onTouch();
-        }
-    }
-
-    public registerOnChange(fn: any) {
-        this.onChange = typeof fn === "function" ? fn : this.onChange;
-    }
-
-    public registerOnTouched(fn: any) {
-        this.onTouch = typeof fn === "function" ? fn : this.onTouch;
-    }
-
-    public setDisabledState(isDisabled: boolean) {
-        this.appDisabled = isDisabled;
-    }
-
-    public toggle(openOrClose?: boolean) {
-        this.dropDown.toggle(openOrClose);
-    }
-
-    public onClickOnOption(value: any) {
-        this.toggle(false);
-        if (this.appDisabled) {
-            return;
-        }
-        this.writeValue(value, true);
-    }
-
-    public onKeyDown(event: KeyboardEvent) {
-        switch (event?.key) {
-            case EKeyboardKeys.ESCAPE:
-            case EKeyboardKeys.TAB:
-                return this.toggle(false);
-            case EKeyboardKeys.ARROW_DOWN:
-            case EKeyboardKeys.ARROW_RIGHT: {
-                const value = this.getNextValue();
-                if (this.appDisabled || value == null) {
-                    return;
-                }
-                event.preventDefault();
-                return this.writeValue(value, true);
-            }
-            case EKeyboardKeys.ARROW_UP:
-            case EKeyboardKeys.ARROW_LEFT: {
-                const value = this.getPreviousValue();
-                if (this.appDisabled || value == null) {
-                    return;
-                }
-                event.preventDefault();
-                return this.writeValue(value, true);
-            }
-        }
-    }
-
-    public getNextValue() {
-        if (!Array.isArray(this.appOptions)) {
-            return;
-        }
-
-        if (this.appValue == null) {
-            return this.appOptions[0]?.value;
-        } else {
-            const index = this.appOptions.findIndex((o) => o?.value === this.appValue) + 1;
-            return this.appOptions[index < this.appOptions?.length ? index : 0]?.value;
-        }
-    }
-
-    public getPreviousValue() {
-        if (!Array.isArray(this.appOptions)) {
-            return;
-        }
-
-        if (this.appValue == null) {
-            return this.appOptions[this.appOptions.length - 1]?.value;
-        } else {
-            const index = this.appOptions.findIndex((o) => o?.value === this.appValue) - 1;
-            return this.appOptions[index > -1 ? index : this.appOptions.length - 1]?.value;
-        }
-    }
-
-}
diff --git a/src/app/shared/select/pipes/selected.pipe.ts b/src/app/shared/select/pipes/selected.pipe.ts
deleted file mode 100644
index 0641428..0000000
--- a/src/app/shared/select/pipes/selected.pipe.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Pipe, PipeTransform} from "@angular/core";
-import {ISelectOption} from "../ISelectOption";
-
-@Pipe({name: "selected"})
-export class SelectedPipe implements PipeTransform {
-
-    public transform(options: ISelectOption[], selectedId: any, autoSelectFirst?: boolean): ISelectOption {
-        if (!Array.isArray(options)) {
-            return undefined;
-        }
-
-        if (selectedId == null && autoSelectFirst) {
-            return options[0];
-        }
-
-        if (selectedId == null) {
-            return undefined;
-        }
-
-        return options.find((o) => o?.value === selectedId);
-    }
-
-}
diff --git a/src/app/shared/select/select.module.ts b/src/app/shared/select/select.module.ts
deleted file mode 100644
index 36b25c6..0000000
--- a/src/app/shared/select/select.module.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {NgModule} from "@angular/core";
-import {MatIconModule} from "@angular/material/icon";
-import {DropDownModule} from "../drop-down";
-import {SelectComponent} from "./components";
-import {SelectedPipe} from "./pipes";
-
-@NgModule({
-    imports: [
-        CommonModule,
-        DropDownModule,
-        MatIconModule
-    ],
-    declarations: [
-        SelectComponent,
-        SelectedPipe
-    ],
-    exports: [
-        SelectComponent,
-        SelectedPipe
-    ]
-})
-export class SelectModule {
-
-}
diff --git a/src/app/shared/storybook/standard-html-controls.stories.ts b/src/app/shared/storybook/standard-html-controls.stories.ts
deleted file mode 100644
index f1ec42e..0000000
--- a/src/app/shared/storybook/standard-html-controls.stories.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {CommonModule} from "@angular/common";
-import {MatIconModule} from "@angular/material/icon";
-import {boolean, number, withKnobs} from "@storybook/addon-knobs";
-import {moduleMetadata, storiesOf} from "@storybook/angular";
-
-const templateInput = `
-    <div style="display: flex; flex-flow: column; padding: 1em; justify-content: center; box-sizing: border-box;">
-      <input type="text" value="Default" style="margin: 0.5em; box-sizing: border-box;" class="openk-input"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-      <input type="text" value="Info" style="margin: 0.5em; box-sizing: border-box;" class="openk-input openk-info"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-      <input type="text" value="Info" style="margin: 0.5em; box-sizing: border-box;" class="openk-input openk-primary"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-      <input type="text" value="Success" style="margin: 0.5em; box-sizing: border-box;" class="openk-input openk-success"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-      <input type="text" value="Warning" style="margin: 0.5em; box-sizing: border-box;" class="openk-input openk-warning"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-      <input type="text" value="Danger" style="margin: 0.5em; box-sizing: border-box;" class="openk-input openk-danger"
-             [disabled]="disabled" [style.max-width]="maxWidth + 'em'">
-    </div>
-`;
-
-const templateButton = `
-    <div style="display: flex; flex-flow: row wrap; padding: 1em; box-sizing: border-box;">
-      <button class="openk-button"
-        style="margin: 0.5em;"
-        *ngFor="let class of [null, 'primary', 'info', 'success', 'warning', 'danger']"
-        [disabled]="disabled"
-        [class.openk-button-rounded]="rounded"
-        [ngClass]=" class == null ? null : 'openk-' + class">
-
-        <mat-icon *ngIf="rounded || withIcon">view_list</mat-icon>
-        <ng-container *ngIf="!rounded"> {{class == null ? 'default' : class}} </ng-container>
-      </button>
-    </div>
-`;
-
-storiesOf("01 Shared / Standard HTML Controls", module)
-    .addDecorator(withKnobs)
-    .addDecorator(moduleMetadata({imports: [CommonModule, MatIconModule]}))
-    .add("Text Field", () => ({
-        template: templateInput,
-        props: {
-            disabled: boolean("Disabled", false),
-            maxWidth: number("Width", 20, {range: true, min: 0, max: 20, step: 1})
-        }
-    }))
-    .add("Buttons", () => ({
-        template: templateButton,
-        props: {
-            disabled: boolean("Disabled", false),
-            withIcon: boolean("With Icon", true),
-            rounded: boolean("Rounded", false)
-        }
-    }));
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/shared/text-block/components/editor-textblock-select/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/shared/text-block/components/editor-textblock-select/index.ts
index 7378646..fe33d98 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/shared/text-block/components/editor-textblock-select/index.ts
@@ -11,4 +11,5 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./text-block-select.component";
+
diff --git a/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.html b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.html
new file mode 100644
index 0000000..b72785b
--- /dev/null
+++ b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.html
@@ -0,0 +1,46 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<div (cdkDropListDropped)="drop($event)"
+     cdkDropList
+     class="select openk-drag-list-with-hidden-placeholder">
+
+  <app-text-block-list
+    (appAdd)="appAdd.emit($event)"
+    [appConnectedTo]="appConnectedTo"
+    [appDuplicateOnDrag]="true"
+    [appListData]="standardBlocks">
+  </app-text-block-list>
+
+  <app-collapsible
+    *ngFor="let group of appGroups"
+    [appSimpleCollapsible]="true"
+    [appTitle]="group?.groupName"
+    class="text-block-group">
+
+    <app-text-block-list
+      (appAdd)="appAdd.emit($event)"
+      [appConnectedTo]="appConnectedTo"
+      [appDuplicateOnDrag]="true"
+      [appListData]="group?.textBlocks.slice()"
+      [appSelectedIds]="appSelectedIds"
+      [appShortMode]="appShortMode">
+
+    </app-text-block-list>
+
+  </app-collapsible>
+
+</div>
+
+
+
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.scss
similarity index 78%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.scss
index fc6c436..e72ce9c 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.scss
@@ -11,7 +11,14 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+.select {
+  width: 100%;
+  box-sizing: border-box;
+  height: 100%;
+}
+
+.text-block-group {
+  border: initial;
+  background: initial;
+  margin-top: 0.5em;
 }
diff --git a/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.spec.ts b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.spec.ts
new file mode 100644
index 0000000..9279f95
--- /dev/null
+++ b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.spec.ts
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {CdkDragDrop, CdkDropList} from "@angular/cdk/drag-drop";
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {I18nModule} from "../../../../core/i18n";
+import {IExtendedTextBlockModel} from "../../model";
+import {TextBlockModule} from "../../text-block.module";
+import {TextBlockSelectComponent} from "./text-block-select.component";
+
+describe("TextBlockSelectComponent", () => {
+    let component: TextBlockSelectComponent;
+    let fixture: ComponentFixture<TextBlockSelectComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                TextBlockModule,
+                I18nModule
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextBlockSelectComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should be created", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should emit the index on drop when drop destination is a different container", () => {
+        const container: CdkDropList<IExtendedTextBlockModel> = {} as CdkDropList<IExtendedTextBlockModel>;
+        const dragEvent: CdkDragDrop<IExtendedTextBlockModel> = {
+            previousContainer: container,
+            container,
+            prevousIndex: 0
+        } as unknown as CdkDragDrop<IExtendedTextBlockModel>;
+
+        spyOn(component.appRemove, "emit").and.callThrough();
+        component.drop(dragEvent);
+        expect(component.appRemove.emit).not.toHaveBeenCalled();
+        component.drop({...dragEvent, container: {data: []} as unknown as CdkDropList<IExtendedTextBlockModel>});
+        expect(component.appRemove.emit).toHaveBeenCalledWith(dragEvent.previousIndex);
+    });
+});
+
diff --git a/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.ts b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.ts
new file mode 100644
index 0000000..64f4243
--- /dev/null
+++ b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.component.ts
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {CdkDragDrop, CdkDropList} from "@angular/cdk/drag-drop";
+import {Component, EventEmitter, Input, Output, ViewChild} from "@angular/core";
+import {IAPITextBlockGroupModel} from "../../../../core";
+import {IExtendedTextBlockModel} from "../../model";
+
+@Component({
+    selector: "app-text-block-select",
+    templateUrl: "./text-block-select.component.html",
+    styleUrls: ["./text-block-select.component.scss"]
+})
+export class TextBlockSelectComponent {
+
+    @Input()
+    public appShortMode: boolean;
+
+    @Input()
+    public appGroups: IAPITextBlockGroupModel[];
+
+    @Input()
+    public appSelectedIds: string[];
+
+    @Input()
+    public appConnectedTo: CdkDropList | string | Array<CdkDropList | string>;
+
+    @Output()
+    public appAdd = new EventEmitter<IExtendedTextBlockModel>();
+
+    @Output()
+    public appRemove = new EventEmitter<number>();
+
+    @ViewChild(CdkDropList, {static: true})
+    public dropList: CdkDropList;
+
+    public standardBlocks: IExtendedTextBlockModel[] = [
+        {id: "Freitext", text: "", excludes: [], requires: [], type: "text"},
+        {id: "Zeilenumbruch", text: "", excludes: [], requires: [], type: "newline"},
+        {id: "Seitenumbruch", text: "", excludes: [], requires: [], type: "pagebreak"}
+    ];
+
+    public drop(event: CdkDragDrop<IExtendedTextBlockModel>) {
+        if (event.container !== event.previousContainer) {
+            this.appRemove.emit(event.previousIndex);
+        }
+    }
+
+}
diff --git a/src/app/shared/text-block/components/editor-textblock-select/text-block-select.stories.ts b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.stories.ts
new file mode 100644
index 0000000..194abc7
--- /dev/null
+++ b/src/app/shared/text-block/components/editor-textblock-select/text-block-select.stories.ts
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {boolean, withKnobs} from "@storybook/addon-knobs";
+import {moduleMetadata, storiesOf} from "@storybook/angular";
+import {IAPITextBlockGroupModel, IAPITextBlockModel} from "../../../../core/api/text";
+import {I18nModule} from "../../../../core/i18n";
+import {TextBlockModule} from "../../text-block.module";
+
+const textBlock: IAPITextBlockModel = {
+    id: "Textbaustein 1.1",
+    text: "Ich bin ein Test Block Inhalt mit einem Select <s:irgendeinnamen> und einem Freitextfeld <f:text>",
+    excludes: [],
+    requires: []
+};
+
+const textBlocks: IAPITextBlockModel[] = [
+    {...textBlock, id: "Textbaustein 1.1"},
+    {...textBlock, id: "Textbaustein 1.2"},
+    {...textBlock, id: "Textbaustein 2.1"},
+    {...textBlock, id: "Textbaustein 3.4"}
+];
+
+const groups: IAPITextBlockGroupModel[] = [
+    {
+        groupName: "Textblockgruppe 1",
+        textBlocks: textBlocks.map((_) => ({..._, id: _.id + (Math.random())}))
+    },
+    {
+        groupName: "Textblockgruppe 2",
+        textBlocks: textBlocks.map((_) => ({..._, id: _.id + (Math.random())}))
+    }
+];
+
+storiesOf("Shared", module)
+    .addDecorator(withKnobs)
+    .addDecorator(moduleMetadata({
+        imports: [
+            TextBlockModule,
+            I18nModule
+        ]
+    }))
+    .add("TextBlockSelectComponent", () => ({
+        template: `
+            <div style="padding: 1em; overflow: auto; width: 50%; background: #ffffff;">
+                      <app-text-block-select
+                        [appGroups]="groups"
+                        [appShortMode]="shortMode">
+                        </app-text-block-select>
+            </div>
+        `,
+        props: {
+            groups,
+            shortMode: boolean("short mode", false)
+        }
+    }));
diff --git a/src/app/shared/index.ts b/src/app/shared/text-block/components/index.ts
similarity index 67%
rename from src/app/shared/index.ts
rename to src/app/shared/text-block/components/index.ts
index 78585b5..9197801 100644
--- a/src/app/shared/index.ts
+++ b/src/app/shared/text-block/components/index.ts
@@ -11,11 +11,11 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./date-control";
-export * from "./card";
-export * from "./drop-down";
-export * from "./file-drop";
-export * from "./page-header";
-export * from "./pipes";
-export * from "./progress-spinner";
-export * from "./select";
+export * from "./editor-textblock-select";
+export * from "./text-block-list";
+export * from "./text-block";
+export * from "./text-replacement";
+export * from "./text-block";
+export * from "./text-replacement";
+export * from "./text-block";
+export * from "./text-replacement";
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/text-block/components/text-block-list/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/text-block/components/text-block-list/index.ts
index 2e6e007..de7c05b 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/text-block/components/text-block-list/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./text-block-list.component";
diff --git a/src/app/shared/text-block/components/text-block-list/text-block-list.component.html b/src/app/shared/text-block/components/text-block-list/text-block-list.component.html
new file mode 100644
index 0000000..0affc85
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block-list/text-block-list.component.html
@@ -0,0 +1,42 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<div [cdkDropListConnectedTo]="appConnectedTo"
+     [cdkDropListData]="appListData"
+     [cdkDropListEnterPredicate]="appEnterPredicate"
+     [cdkDropListSortingDisabled]="true"
+     cdkDropList>
+
+  <app-text-block
+    (cdkDragEnded)="isDragging = false; stopDrag(block)"
+    (cdkDragReleased)="isDragging = false"
+    (cdkDragStarted)="isDragging = true; startDrag(block)"
+    (appButtonPress)="appAdd.emit(block)"
+    *ngFor="let block of appListData"
+    [appShortMode]="appShortMode"
+    [appShowNewLine]="false"
+    [appTextBlockData]="block | getBlockDataFromBlockModel"
+    [appTitle]="block.id"
+    [cdkDragData]="block"
+    [cdkDragDisabled]="(block?.id | findElementInArray : appSelectedIds) != null"
+    [class.text-block-list-entry---selected]="(block?.id | findElementInArray : appSelectedIds) != null"
+    cdkDrag
+    class="text-block-list-entry grab">
+  </app-text-block>
+
+</div>
+
+<ng-container
+  *ngIf="isDragging"
+  [appGlobalClass]="'grabbing'">
+</ng-container>
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/components/text-block-list/text-block-list.component.scss
similarity index 81%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/text-block/components/text-block-list/text-block-list.component.scss
index fc6c436..004a177 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/components/text-block-list/text-block-list.component.scss
@@ -11,7 +11,11 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+.text-block-list-entry {
+  position: relative;
+  margin-bottom: 0.5em;
+}
+
+.text-block-list-entry---selected {
+  display: none;
 }
diff --git a/src/app/shared/text-block/components/text-block-list/text-block-list.component.spec.ts b/src/app/shared/text-block/components/text-block-list/text-block-list.component.spec.ts
new file mode 100644
index 0000000..49ac9c7
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block-list/text-block-list.component.spec.ts
@@ -0,0 +1,72 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {IAPITextBlockModel} from "../../../../core/api/text";
+import {TextBlockModule} from "../../text-block.module";
+import {TextBlocksListComponent} from "./text-block-list.component";
+
+describe("TextBlocksListComponent", () => {
+    let component: TextBlocksListComponent;
+    let fixture: ComponentFixture<TextBlocksListComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                TextBlockModule
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextBlocksListComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should be created", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should add and remove a duplicate element to the list if appDuplicateOnDrag is set when starting to drag", () => {
+
+        const element: IAPITextBlockModel = {
+            id: "2",
+            text: "different text",
+            excludes: [],
+            requires: []
+        };
+
+        const listData: IAPITextBlockModel[] = [
+            {id: "1", text: "some text", excludes: [], requires: []},
+            element,
+            {id: "3", text: "more text", excludes: [], requires: []}
+        ];
+
+        component.appDuplicateOnDrag = true;
+        component.appListData = listData;
+        component.startDrag(element);
+        expect(component.appListData).toEqual([
+            {id: "1", text: "some text", excludes: [], requires: []},
+            element,
+            element,
+            {id: "3", text: "more text", excludes: [], requires: []}
+        ]);
+        component.stopDrag(element);
+        expect(component.appListData).toEqual(listData);
+
+        component.appDuplicateOnDrag = false;
+        component.startDrag(element);
+        expect(component.appListData).toEqual(listData);
+    });
+});
diff --git a/src/app/shared/text-block/components/text-block-list/text-block-list.component.ts b/src/app/shared/text-block/components/text-block-list/text-block-list.component.ts
new file mode 100644
index 0000000..db9f66b
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block-list/text-block-list.component.ts
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {CdkDrag, CdkDropList} from "@angular/cdk/drag-drop";
+import {DOCUMENT} from "@angular/common";
+import {Component, EventEmitter, Inject, Input, Output} from "@angular/core";
+import {IAPITextBlockModel} from "../../../../core";
+
+@Component({
+    selector: "app-text-block-list",
+    templateUrl: "./text-block-list.component.html",
+    styleUrls: ["./text-block-list.component.scss"]
+})
+export class TextBlocksListComponent {
+
+    @Input()
+    public appListData: IAPITextBlockModel[];
+
+    @Input()
+    public appDuplicateOnDrag: boolean;
+
+    @Input()
+    public appConnectedTo: CdkDropList | string | Array<CdkDropList | string>;
+
+    @Input()
+    public appShortMode: boolean;
+
+    @Input()
+    public appSelectedIds: string[];
+
+    @Output()
+    public appAdd = new EventEmitter<IAPITextBlockModel>();
+
+    public isDragging: boolean;
+
+    public constructor(@Inject(DOCUMENT) public document: Document) {
+
+    }
+
+    @Input()
+    public appEnterPredicate(drag: CdkDrag, drop: CdkDropList): boolean {
+        return false;
+    }
+
+    public startDrag(block: IAPITextBlockModel) {
+        if (this.appDuplicateOnDrag && Array.isArray(this.appListData)) {
+            const index = this.appListData.indexOf(block);
+            this.appListData.splice(index + 1, 0, {...block});
+        }
+    }
+
+    public stopDrag(block: IAPITextBlockModel) {
+        if (this.appDuplicateOnDrag && Array.isArray(this.appListData)) {
+            const index = this.appListData.lastIndexOf(block);
+            this.appListData.splice(index, 1);
+        }
+    }
+
+}
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/text-block/components/text-block/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/text-block/components/text-block/index.ts
index 2e6e007..1177b25 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/text-block/components/text-block/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./text-block.component";
diff --git a/src/app/shared/text-block/components/text-block/text-block.component.html b/src/app/shared/text-block/components/text-block/text-block.component.html
new file mode 100644
index 0000000..63c28b3
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block/text-block.component.html
@@ -0,0 +1,89 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<div (mousedown)="editText ? $event.stopPropagation() : null" [class.text-block---error]="appErrors?.length > 0"
+     class="text-block openk-drag-element">
+
+  <div class="title-bar">
+    <span class="title-bar--title">{{appTitle | translate}}</span>
+    <div class="title-bar--buttons">
+      <button (click)="convertToTextInput()" *ngIf="!editText && (appType === 'block' || appType === 'text')"
+              class="openk-mat-icon-button title-bar--buttons-btn" mat-icon-button>
+        <mat-icon>edit</mat-icon>
+      </button>
+      <button (click)="revert()" *ngIf="(appType === 'block' || appType === 'text') && appBlockText"
+              class="openk-mat-icon-button title-bar--buttons-btn" mat-icon-button>
+        <mat-icon class="">backspace</mat-icon>
+      </button>
+      <button (click)="addNewLineAfter()" *ngIf="appShowNewLine && appTextBlockData?.length === 0"
+              class="openk-mat-icon-button" mat-icon-button>
+        <mat-icon class="">keyboard_return</mat-icon>
+      </button>
+    </div>
+
+    <div class="title-bar--error-msg">
+      <span *ngIf="appErrors?.length > 0"
+            class="title-bar--block-error">{{(appErrors[0]?.message | translate) + appErrors[0]?.ids.toString()}}</span>
+    </div>
+
+    <div>
+      <button (click)="appButtonPress.emit()" class="openk-mat-icon-button" mat-icon-button>
+        <mat-icon class="">{{appShowClose ? "remove_circle_outline" : "add_circle_outline"}}</mat-icon>
+      </button>
+    </div>
+
+  </div>
+
+  <div *ngIf="!editText" [class.fade]="appShortMode">
+
+    <ng-container *ngFor="let block of appTextBlockData, trackBy: trackByIndex">
+
+      <span *ngIf="block?.type === 'text'">
+        {{block?.value}}
+      </span>
+
+      <span *ngIf="block?.type === 'highlight-text'" class="highlight-text">
+        {{block?.value}}
+      </span>
+
+      <ng-container *ngIf="block?.type === 'newline'">
+        <br>
+      </ng-container>
+
+      <app-text-replacement (appValueChange)="valueChange(block?.value, $event, block?.type)"
+                            *ngIf="block?.type === 'input' || block?.type === 'date' || block?.type === 'select'"
+                            [appPlaceholder]="block?.value"
+                            [appOptions]="block?.options" [appType]="block?.type"
+                            [appValue]="block?.placeholder">
+      </app-text-replacement>
+
+      <span *ngIf="block?.type === 'text-fill'" [class.error]="!block?.placeholder"
+            class="highlight-text">
+        {{block?.placeholder ? block.placeholder : block?.value}}
+      </span>
+
+    </ng-container>
+
+  </div>
+
+  <div [class.hidden]="!editText">
+    <app-text-field (appFocusOut)="editText = false" (appInputValue)="onInput($event)" [appIsFocused]="editText"
+                    [appValue]="appBlockText"></app-text-field>
+  </div>
+
+  <button (click)="addNewLineAfter()" *ngIf="appShowNewLine && appTextBlockData?.length > 0"
+          class="openk-mat-icon-button" mat-icon-button>
+    <mat-icon>keyboard_return</mat-icon>
+  </button>
+
+</div>
diff --git a/src/app/shared/text-block/components/text-block/text-block.component.scss b/src/app/shared/text-block/components/text-block/text-block.component.scss
new file mode 100644
index 0000000..b31fb4b
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block/text-block.component.scss
@@ -0,0 +1,101 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+@import "src/styles/openk.styles";
+
+:host {
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.text-block {
+  padding: 0.3em;
+  border: 1px dashed get-color($openk-default-palette, 900);
+  border-radius: 6px;
+  background-color: get-color($openk-default-palette);
+}
+
+.text-block---error {
+  border-color: get-color($openk-danger-palette, 200);
+}
+
+.title-bar {
+  display: flex;
+  flex-direction: row;
+  font-size: 0.8em;
+  align-items: center;
+}
+
+.title-bar--title {
+  margin-right: 0.2em;
+}
+
+.title-bar--error-msg {
+  flex: 1;
+  margin-right: 1em;
+}
+
+.title-bar--buttons {
+  display: flex;
+  flex-direction: row;
+}
+
+.title-bar--buttons-btn {
+  margin-right: 0.2em;
+}
+
+.title-bar--buttons-btn-icon {
+  padding: 0;
+  height: initial;
+  width: initial;
+}
+
+.title-bar--block-info {
+  float: right;
+}
+
+.title-bar--block-error {
+  float: right;
+  color: get-color($openk-danger-palette, 200);
+}
+
+.highlight-text {
+  background-color: $openk-background-highlight;
+}
+
+.fade {
+  position: relative;
+  max-height: 2.75em;
+  line-height: 1.4em;
+  overflow: hidden;
+}
+
+.fade::after {
+  content: "";
+  text-align: right;
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  width: 80%;
+  height: 1.44em;
+  background: linear-gradient(to right, rgba(get-color($openk-default-palette), 0), get-color($openk-default-palette) 50%);
+}
+
+.error {
+  background-color: get-color($openk-danger-palette, 200);
+}
+
+.hidden {
+  display: none;
+}
diff --git a/src/app/shared/text-block/components/text-block/text-block.component.spec.ts b/src/app/shared/text-block/components/text-block/text-block.component.spec.ts
new file mode 100644
index 0000000..5b21620
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block/text-block.component.spec.ts
@@ -0,0 +1,85 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {I18nModule} from "../../../../core/i18n";
+import {TextBlockModule} from "../../text-block.module";
+import {TextBlockComponent} from "./text-block.component";
+
+describe("TextBlockComponent", () => {
+    let component: TextBlockComponent;
+    let fixture: ComponentFixture<TextBlockComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                TextBlockModule,
+                I18nModule
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextBlockComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should be created", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should emit appNewLine with appTitle as parameter", () => {
+        spyOn(component.appNewLine, "emit").and.callThrough();
+        component.appTitle = "TestTitle";
+        component.addNewLineAfter();
+        expect(component.appNewLine.emit).toHaveBeenCalledWith("TestTitle");
+    });
+
+    it("should emit appDeleteComment with the comment id", () => {
+        spyOn(component.appValueChange, "emit").and.callThrough();
+        component.valueChange("name", "Hugo", "input");
+        expect(component.appValueChange.emit).toHaveBeenCalledWith({name: "<f:name>", newValue: "Hugo"});
+    });
+
+    it("should emit appTextInput and set editText to true", () => {
+        spyOn(component.appTextInput, "emit").and.callThrough();
+        component.editText = false;
+        component.convertToTextInput();
+        expect(component.appTextInput.emit).toHaveBeenCalled();
+        expect(component.editText).toBeTrue();
+    });
+
+    it("should emit appChangeText with the given value", () => {
+        spyOn(component.appChangeText, "emit").and.callThrough();
+        const value = "test value";
+        component.onInput(value);
+        expect(component.appChangeText.emit).toHaveBeenCalledWith(value);
+    });
+
+    it("should emit appChangeText with empty string for freetext and otherwise undefined and set editText to false", () => {
+        spyOn(component.appChangeText, "emit").and.callThrough();
+        component.editText = true;
+        component.appType = "text";
+        component.revert();
+        expect(component.appChangeText.emit).toHaveBeenCalledWith("");
+        expect(component.editText).toBeFalse();
+
+        component.editText = true;
+        component.appType = "block";
+        component.revert();
+        expect(component.appChangeText.emit).toHaveBeenCalledWith(undefined);
+        expect(component.editText).toBeFalse();
+    });
+
+});
diff --git a/src/app/shared/text-block/components/text-block/text-block.component.ts b/src/app/shared/text-block/components/text-block/text-block.component.ts
new file mode 100644
index 0000000..57f3e3a
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block/text-block.component.ts
@@ -0,0 +1,93 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild} from "@angular/core";
+import {ITextblockError} from "../../../../features/forms/statement-editor/pipes";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+import {addTypeToName} from "../../pipes/get-blockdata-array";
+
+@Component({
+    selector: "app-text-block",
+    templateUrl: "./text-block.component.html",
+    styleUrls: ["./text-block.component.scss"],
+    changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class TextBlockComponent {
+
+    @Input()
+    public appErrors: ITextblockError[] = [];
+
+    @Input()
+    public appShowNewLine = true;
+
+    @Input()
+    public appTitle: string;
+
+    @Input()
+    public appType: "block" | "newline" | "pagebreak" | "text";
+
+    @Input()
+    public appShortMode = false;
+
+    @Input()
+    public appTextBlockData: ITextBlockRenderItem[] = [];
+
+    @Input()
+    public appShowClose = false;
+
+    @Input()
+    public appBlockText;
+
+    @Output()
+    public appTextInput = new EventEmitter<void>();
+
+    @Output()
+    public appNewLine = new EventEmitter<string>();
+
+    @Output()
+    public appButtonPress = new EventEmitter<void>();
+
+    @Output()
+    public appValueChange = new EventEmitter<{ name: string, newValue: string }>();
+
+    @Output()
+    public appChangeText = new EventEmitter<string>();
+
+    @ViewChild("inputElement") inputElement: ElementRef;
+
+    public editText = false;
+
+    public trackByIndex = (index: number) => index;
+
+    public addNewLineAfter() {
+        this.appNewLine.emit(this.appTitle);
+    }
+
+    public valueChange(name: string, newValue: string, type: string) {
+        this.appValueChange.emit({name: addTypeToName(name, type), newValue});
+    }
+
+    public convertToTextInput() {
+        this.appTextInput.emit();
+        this.editText = true;
+    }
+
+    public onInput(value: string) {
+        this.appChangeText.emit(value);
+    }
+
+    public revert() {
+        this.appChangeText.emit(this.appType === "text" ? "" : undefined);
+        this.editText = false;
+    }
+}
diff --git a/src/app/shared/text-block/components/text-block/text-block.stories.ts b/src/app/shared/text-block/components/text-block/text-block.stories.ts
new file mode 100644
index 0000000..d7a8643
--- /dev/null
+++ b/src/app/shared/text-block/components/text-block/text-block.stories.ts
@@ -0,0 +1,48 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {TranslateModule} from "@ngx-translate/core";
+import {boolean, text, withKnobs} from "@storybook/addon-knobs";
+import {moduleMetadata, storiesOf} from "@storybook/angular";
+import {I18nModule} from "../../../../core/i18n";
+import {TextBlockModule} from "../../text-block.module";
+
+storiesOf("Shared", module)
+    .addDecorator(withKnobs)
+    .addDecorator(moduleMetadata({
+        imports: [
+            TextBlockModule,
+            TranslateModule,
+            I18nModule
+        ]
+    }))
+    .add("TextBlockComponent", () => ({
+        template: `
+            <div style="padding: 1em;">
+                <app-text-block [appTextBlockData]="[{type: 'text', value: text}, {type: 'input', value: 'input'}]"
+                                [appTitle]="title"
+                                [appType]="'block'"
+                                [appShowNewLine]="showNewLine"
+                                [appErrors]="error ? [{message: 'Muss platziert werden nach:', ids: ['1', '2']}] : undefined"
+                                [appShortMode]="shortMode">
+                </app-text-block>
+            </div>
+        `,
+        props: {
+            title: text("Titel", "Textbaustein 1.0"),
+            text: text("Text", "Hier steht ein Beispieltext"),
+            error: boolean("Show error", false),
+            showNewLine: boolean("Show new line button", true),
+            shortMode: boolean("Shorten block to 2 lines", false),
+        }
+    }));
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/text-block/components/text-replacement/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/text-block/components/text-replacement/index.ts
index 2e6e007..7428ae4 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/text-block/components/text-replacement/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./text-replacement.component";
diff --git a/src/app/shared/text-block/components/text-replacement/text-replacement.component.html b/src/app/shared/text-block/components/text-replacement/text-replacement.component.html
new file mode 100644
index 0000000..ca1e3d7
--- /dev/null
+++ b/src/app/shared/text-block/components/text-replacement/text-replacement.component.html
@@ -0,0 +1,35 @@
+<!-------------------------------------------------------------------------------
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -------------------------------------------------------------------------------->
+
+<div (click)="onClick()" *ngIf="!appEditable" class="editable-text">
+  {{!!appValue && appValue !== "" ? appValue : appPlaceholder}}
+  <mat-icon *ngIf="appType === 'input'" class="editable-text--icon">edit</mat-icon>
+  <mat-icon *ngIf="appType === 'select'" class="editable-text--icon">arrow_drop_down</mat-icon>
+  <mat-icon *ngIf="appType === 'date'" class="editable-text--icon">today</mat-icon>
+</div>
+
+<input #inputElement (focusout)="onFocusOut()" (input)="inputValue(inputElement.value)"
+       *ngIf="appType === 'input'" [class.hidden]="!appEditable"
+       value="{{appValue}}"/>
+
+<app-date-control #dateElement (appValueChange)="inputValue($event)" *ngIf="appType === 'date'"
+                  [appValue]="appValue" [class.hidden]="!appEditable"
+                  class="openk-info"></app-date-control>
+
+<app-select #selectElement (appValueChange)="inputValue($event)" *ngIf="appType === 'select'"
+            [appOptions]="appOptions | stringsToOptions" [appValue]="appValue"
+            [class.hidden]="!appEditable"></app-select>
+
+
+
+
diff --git a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.scss b/src/app/shared/text-block/components/text-replacement/text-replacement.component.scss
similarity index 69%
rename from src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.scss
rename to src/app/shared/text-block/components/text-replacement/text-replacement.component.scss
index ac39661..a77d583 100644
--- a/src/app/pages/dashboard/components/dashboard-item/dashboard-item.component.scss
+++ b/src/app/shared/text-block/components/text-replacement/text-replacement.component.scss
@@ -11,19 +11,21 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-@import "openk.styles";
+@import "../../../../../styles/openk.styles";
 
-.dashboard-item-header-actions {
+.editable-text {
   display: inline-flex;
-  margin-left: auto;
-
-  & > * {
-    margin-left: 0.5em;
-  }
+  background-color: $openk-background-highlight;
+  cursor: pointer;
 }
 
-.dashboard-item-body {
-  padding: 1em;
-  display: flex;
-  flex-flow: column;
+.editable-text--icon {
+  height: initial;
+  width: initial;
+  font-size: 1em;
+  margin: auto;
+}
+
+.hidden {
+  display: none;
 }
diff --git a/src/app/shared/text-block/components/text-replacement/text-replacement.component.spec.ts b/src/app/shared/text-block/components/text-replacement/text-replacement.component.spec.ts
new file mode 100644
index 0000000..4a91bc3
--- /dev/null
+++ b/src/app/shared/text-block/components/text-replacement/text-replacement.component.spec.ts
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {async, ComponentFixture, TestBed} from "@angular/core/testing";
+import {TextBlockModule} from "../../text-block.module";
+import {TextReplacementComponent} from "./text-replacement.component";
+
+describe("TextReplacementComponent", () => {
+    let component: TextReplacementComponent;
+    let fixture: ComponentFixture<TextReplacementComponent>;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                TextBlockModule
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(TextReplacementComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it("should be created", () => {
+        expect(component).toBeTruthy();
+    });
+
+    it("should emit appValueChange when the value was changed with the new set value", () => {
+        spyOn(component.appValueChange, "emit").and.callThrough();
+        component.inputValue("TestValue");
+        expect(component.appValueChange.emit).toHaveBeenCalledWith("TestValue");
+    });
+
+    it("should set appEditable to true on click on the element", () => {
+        component.appEditable = false;
+        component.onClick();
+        expect(component.appEditable).toBeTrue();
+    });
+
+    it("should set appEditable to false when input element loses focus (or date, or select)", () => {
+        component.appEditable = true;
+        component.onFocusOut();
+        expect(component.appEditable).toBeFalse();
+    });
+});
diff --git a/src/app/shared/text-block/components/text-replacement/text-replacement.component.ts b/src/app/shared/text-block/components/text-replacement/text-replacement.component.ts
new file mode 100644
index 0000000..bbbe7be
--- /dev/null
+++ b/src/app/shared/text-block/components/text-replacement/text-replacement.component.ts
@@ -0,0 +1,67 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild} from "@angular/core";
+
+@Component({
+    selector: "app-text-replacement",
+    templateUrl: "./text-replacement.component.html",
+    styleUrls: ["./text-replacement.component.scss"]
+})
+export class TextReplacementComponent {
+
+    @Input()
+    public appEditable = false;
+
+    @Input()
+    public appType: string;
+
+    @Input()
+    public appValue: string;
+
+    @Input()
+    public appPlaceholder: string;
+
+    @Input()
+    public appOptions: string[] = [];
+
+    @ViewChild("inputElement") inputElement: ElementRef;
+
+    @ViewChild("dateElement") dateElement: ElementRef;
+
+    @ViewChild("selectElement") selectElement: ElementRef;
+
+    @Output()
+    public appValueChange = new EventEmitter<string>();
+
+    public constructor(private changeDetectorRef: ChangeDetectorRef) {
+    }
+
+    public async onClick() {
+        this.appEditable = true;
+        this.changeDetectorRef.detectChanges();
+        switch (this.appType) {
+            case "input":
+                this.inputElement.nativeElement.focus();
+                break;
+        }
+    }
+
+    public onFocusOut() {
+        this.appEditable = false;
+    }
+
+    public inputValue(value: string) {
+        this.appValueChange.emit(value);
+    }
+}
diff --git a/src/app/shared/select/index.ts b/src/app/shared/text-block/index.ts
similarity index 90%
rename from src/app/shared/select/index.ts
rename to src/app/shared/text-block/index.ts
index 379f4ab..7d7bff9 100644
--- a/src/app/shared/select/index.ts
+++ b/src/app/shared/text-block/index.ts
@@ -11,8 +11,8 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+export * from "./model";
 export * from "./components";
 export * from "./pipes";
 
-export * from "./ISelectOption";
-export * from "./select.module";
+export * from "./text-block.module";
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/model/IExtendedTextBlockModel.ts
similarity index 74%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/text-block/model/IExtendedTextBlockModel.ts
index fc6c436..495d16f 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/model/IExtendedTextBlockModel.ts
@@ -11,7 +11,8 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+import {IAPITextBlockModel, TAPITextArrangementItemType} from "../../../core";
+
+export interface IExtendedTextBlockModel extends IAPITextBlockModel {
+    type?: TAPITextArrangementItemType;
 }
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/model/ITextBlockRenderItem.ts
similarity index 81%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/text-block/model/ITextBlockRenderItem.ts
index fc6c436..3cac859 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/model/ITextBlockRenderItem.ts
@@ -11,7 +11,9 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+export interface ITextBlockRenderItem {
+    type: string;
+    value: string;
+    options?: string[];
+    placeholder?: string;
 }
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/text-block/model/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/text-block/model/index.ts
index 2e6e007..640d553 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/text-block/model/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./IExtendedTextBlockModel";
diff --git a/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.spec.ts b/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.spec.ts
new file mode 100644
index 0000000..2bc6223
--- /dev/null
+++ b/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.spec.ts
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+import {CombineBlockdataTextPipe} from "./combine-blockdata-text.pipe";
+
+describe("CombineBlockdataTextkPipe", () => {
+
+    const pipe = new CombineBlockdataTextPipe();
+
+    it("should return empty array for missing input (undefined/null)", () => {
+        let result = pipe.transform(undefined);
+        expect(result).toEqual([]);
+
+        result = pipe.transform(null);
+        expect(result).toEqual([]);
+    });
+
+    it("should return a new array combining the entries of type text", () => {
+        const input: ITextBlockRenderItem[] = [
+            {type: "newline", value: ""},
+            {type: "text", value: "first-text"},
+            {type: "text", value: "second-text"},
+            {type: "pagebreak", value: ""},
+            {type: "text", value: "third-text"},
+            {type: "select", value: "second-text", options: ["Option 1", "Option 2"], placeholder: "placeholder"},
+            {type: "text", value: "fourth-text"}
+        ];
+        const expectedResult: ITextBlockRenderItem[] = [
+            {type: "newline", value: ""},
+            {type: "text", value: "first-text second-text"},
+            {type: "pagebreak", value: ""},
+            {type: "text", value: "third-text"},
+            {type: "select", value: "second-text", options: ["Option 1", "Option 2"], placeholder: "placeholder"},
+            {type: "text", value: "fourth-text"}
+        ];
+        const result = pipe.transform(input);
+        expect(result).toEqual(expectedResult);
+    });
+});
diff --git a/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.ts b/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.ts
new file mode 100644
index 0000000..ed3b4c5
--- /dev/null
+++ b/src/app/shared/text-block/pipes/combine-blockdata-text/combine-blockdata-text.pipe.ts
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+
+import {arrayJoin} from "../../../../util/store";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+
+@Pipe({
+    name: "combineBlockdataText"
+})
+export class CombineBlockdataTextPipe implements PipeTransform {
+
+    public transform(blockData: ITextBlockRenderItem[]): ITextBlockRenderItem[] {
+        const result: ITextBlockRenderItem[] = [];
+        let text = "";
+        for (const blockElement of arrayJoin(blockData)) {
+            if (blockElement.type === "text") {
+                text += (text !== "" ? " " : "") + blockElement.value;
+            }
+            const isLastElement: boolean = blockElement === blockData.slice(-1)[0];
+
+            if (text !== "" && (isLastElement || blockElement.type !== "text")) {
+                result.push({
+                    type: "text",
+                    value: text
+                });
+                text = "";
+            }
+
+            if (blockElement.type !== "text") {
+                result.push(blockElement);
+            }
+        }
+        return result;
+    }
+}
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/pipes/get-blockdata-array/IReplacement.ts
similarity index 87%
rename from src/app/shared/select/ISelectOption.ts
rename to src/app/shared/text-block/pipes/get-blockdata-array/IReplacement.ts
index fc6c436..9106d8e 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/IReplacement.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+export interface IReplacement {
+    separator: RegExp;
+    type: string;
 }
diff --git a/src/app/shared/text-block/pipes/get-blockdata-array/block-data-helper.ts b/src/app/shared/text-block/pipes/get-blockdata-array/block-data-helper.ts
new file mode 100644
index 0000000..8acb262
--- /dev/null
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/block-data-helper.ts
@@ -0,0 +1,121 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextBlockModel} from "../../../../core/api/text";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+import {IReplacement} from "./IReplacement";
+
+export const replacements: IReplacement[] = [
+    {separator: /(<f:[A-Za-z0-9_\\-]+>)/g, type: "input"},
+    {separator: /(<d:[A-Za-z0-9_\\-]+>)/g, type: "date"},
+    {separator: /(<s:[A-Za-z0-9_\\-]+>)/g, type: "select"},
+    {separator: /(<t:[A-Za-z0-9_\\-]+>)/g, type: "text-fill"}
+];
+
+export const alwaysReplace: IReplacement[] = [
+    {separator: /(\n)/, type: "newline"}
+];
+
+export function textToBlockDataArray(
+    blockModel: IAPITextBlockModel,
+    placeholderValues: { [key: string]: string },
+    replacementTexts: { [key: string]: string },
+    selectOptions: { [key: string]: string[] },
+    replace: boolean = true): ITextBlockRenderItem[] {
+
+    const whatToReplace: IReplacement[] = replace ? [...alwaysReplace, ...replacements]
+        : [...alwaysReplace, ...replacements.map((_) => ({..._, type: "highlight-text"}))];
+
+    const blockData: ITextBlockRenderItem[] = [{value: blockModel ? blockModel.text : "", type: "text"}];
+
+    return replaceTags(blockData, whatToReplace, placeholderValues, replacementTexts, selectOptions);
+}
+
+export function replaceTags(inputArray: ITextBlockRenderItem[] = [],
+                            replaceWith: IReplacement[] = [],
+                            placeholderValues?: { [key: string]: string },
+                            replacementTexts?: { [key: string]: string },
+                            selectOptions?: { [key: string]: string[] }) {
+
+    let blockData: ITextBlockRenderItem[] = inputArray;
+    for (const replacement of replaceWith) {
+        const arrays: ITextBlockRenderItem[] = [];
+        for (const textElement of blockData) {
+            if (textElement.type === "text") {
+                arrays.push(
+                    ...replaceBySeparator(
+                        textElement.value,
+                        replacement.separator,
+                        replacement.type,
+                        placeholderValues,
+                        replacementTexts,
+                        selectOptions
+                    ));
+            } else {
+                arrays.push(textElement);
+            }
+        }
+        blockData = [...arrays];
+    }
+    return blockData;
+}
+
+export function replaceBySeparator(
+    inputValue: string,
+    separator: string | RegExp,
+    replaceType: string,
+    placeholderValues?: { [key: string]: string },
+    replacementTexts?: { [key: string]: string },
+    selectOptions?: { [key: string]: string[] }): ITextBlockRenderItem[] {
+
+    const splitBySeparator: string[] = inputValue.split(separator);
+    const blockData: ITextBlockRenderItem[] = [];
+
+    for (const renderItem of splitBySeparator) {
+        const isText: boolean = !(new RegExp(separator)).test(renderItem);
+        const value: string = isText ? renderItem
+            : renderItem.replace(/(<[fdts]:)/, "")
+                .replace(">", "")
+                .replace("\n", "");
+        let placeholder: string = placeholderValues ? placeholderValues[renderItem] : undefined;
+        if (replaceType === "text-fill") {
+            placeholder = replacementTexts ? replacementTexts[value] : undefined;
+        }
+
+        if (value !== "" || !isText) {
+            blockData.push({
+                value,
+                type: isText ? "text" : replaceType,
+                placeholder,
+                options: (!isText && replaceType === "select" && !!selectOptions) ? selectOptions[value] : undefined
+            });
+        }
+
+    }
+    return blockData;
+}
+
+export function addTypeToName(name: string, type: string) {
+    let typeIdentifier = "";
+    if (type === "input") {
+        typeIdentifier = "f";
+    }
+    if (type === "date") {
+        typeIdentifier = "d";
+    }
+    if (type === "select") {
+        typeIdentifier = "s";
+    }
+
+    return `<${typeIdentifier}:${name}>`;
+}
diff --git a/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.spec.ts b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.spec.ts
new file mode 100644
index 0000000..810a666
--- /dev/null
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.spec.ts
@@ -0,0 +1,178 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextArrangementItemModel, IAPITextBlockModel} from "../../../../core/api/text";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+import {GetBlockDataFromArrangementPipe} from "./get-blockdata-array-from-arrangement.pipe";
+
+
+describe("GetBlockDataFromArrangementPipe", () => {
+
+    const pipe = new GetBlockDataFromArrangementPipe();
+
+    it("should return empty array for missing arrangement and blockmodel values", () => {
+        let result = pipe.transform(
+            undefined, undefined, undefined, undefined, undefined);
+        expect(result).toEqual([]);
+        result = pipe.transform(
+            null, null, null, null, null);
+        expect(result).toEqual([]);
+    });
+
+    it("should return one block with type text and the replacement as value when set", () => {
+
+        const arrangement: IAPITextArrangementItemModel = {
+            type: "block",
+            placeholderValues: {},
+            textblockId: "textblockId"
+        };
+
+        const blockModel: IAPITextBlockModel = {
+            id: "textblockId",
+            text: "text",
+            excludes: [],
+            requires: []
+        };
+
+        let result = pipe.transform(
+            arrangement, blockModel, undefined, undefined, undefined);
+        expect(JSON.parse(JSON.stringify(result))).toEqual([{type: "text", value: "text"}]);
+
+        result = pipe.transform(
+            {...arrangement, replacement: "replacement-text"}, blockModel, undefined, undefined, undefined);
+        expect(JSON.parse(JSON.stringify(result))).toEqual([{type: "text", value: "replacement-text"}]);
+    });
+
+    it("should return empty array for newline and pagebreak blocks so no text is displayed for those", () => {
+        const arrangement: IAPITextArrangementItemModel = {
+            type: "block",
+            placeholderValues: {}
+        };
+
+        let result = pipe.transform(
+            {...arrangement, type: "newline"}, undefined, undefined, undefined, undefined);
+        expect(JSON.parse(JSON.stringify(result))).toEqual([]);
+
+        result = pipe.transform(
+            {...arrangement, type: "pagebreak"}, undefined, undefined, undefined, undefined);
+        expect(JSON.parse(JSON.stringify(result))).toEqual([]);
+
+        result = pipe.transform(
+            {...arrangement, type: "text"}, undefined, undefined, undefined, undefined);
+        expect(JSON.parse(JSON.stringify(result))).toEqual([]);
+    });
+
+    describe("should replace textmarkers <>", () => {
+        const arrangement: IAPITextArrangementItemModel = {
+            type: "block",
+            placeholderValues: {},
+            textblockId: "textblockId"
+        };
+
+        const blockModel: IAPITextBlockModel = {
+            id: "textblockId",
+            text: "this is a test <f:freetext><t:replacementtext><s:select><d:date> and more text afterwards",
+            excludes: [],
+            requires: []
+        };
+
+        it("should split up textblockmodel text content into the different types and return them as array", () => {
+
+            const expectedResult: ITextBlockRenderItem[] = [
+                {
+                    type: "text",
+                    value: "this is a test "
+                },
+                {
+                    type: "input",
+                    value: "freetext"
+                },
+                {
+                    type: "text-fill",
+                    value: "replacementtext"
+                },
+                {
+                    type: "select",
+                    value: "select"
+                },
+                {
+                    type: "date",
+                    value: "date"
+                },
+                {
+                    type: "text",
+                    value: " and more text afterwards"
+                }
+            ];
+
+            const result = pipe.transform(
+                arrangement, blockModel, undefined, undefined, undefined);
+            expect(JSON.parse(JSON.stringify(result))).toEqual(expectedResult);
+        });
+
+        it("should set the values correctly for the different types of display blocks", () => {
+
+            const placeholderValues: { [key: string]: string } = {
+                "<f:freetext>": "freeTextValue",
+                "<s:select>": "Option 1",
+                "<d:date>": "07-08-2020"
+            };
+
+            const replacementTexts: { [key: string]: string } = {
+                replacementtext: "replaced"
+            };
+
+            const selects: { [key: string]: string[] } = {
+                select: ["Option 1", "Option 2"]
+            };
+
+            const expectedResult: ITextBlockRenderItem[] = [
+                {
+                    type: "text",
+                    value: "this is a test "
+                },
+                {
+                    type: "input",
+                    value: "freetext",
+                    placeholder: "freeTextValue"
+                },
+                {
+                    type: "text-fill",
+                    value: "replacementtext",
+                    placeholder: "replaced"
+                },
+                {
+                    type: "select",
+                    value: "select",
+                    placeholder: "Option 1",
+                    options: ["Option 1", "Option 2"]
+                },
+                {
+                    type: "date",
+                    value: "date",
+                    placeholder: "07-08-2020"
+                },
+                {
+                    type: "text",
+                    value: " and more text afterwards"
+                }
+            ];
+
+            const result = pipe.transform(
+                arrangement, blockModel, placeholderValues, replacementTexts, selects);
+            expect(JSON.parse(JSON.stringify(result))).toEqual(expectedResult);
+        });
+    });
+
+});
+
diff --git a/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.ts b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.ts
new file mode 100644
index 0000000..c6bc1a7
--- /dev/null
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-arrangement.pipe.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+import {IAPITextArrangementItemModel, IAPITextBlockModel} from "../../../../core/api/text";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+
+import {alwaysReplace, replaceTags, textToBlockDataArray} from "./block-data-helper";
+import {IReplacement} from "./IReplacement";
+
+@Pipe({
+    name: "getBlockDataFromArrangement"
+})
+export class GetBlockDataFromArrangementPipe implements PipeTransform {
+
+    public transform(textArrangement: IAPITextArrangementItemModel,
+                     blockModel: IAPITextBlockModel,
+                     placeHolderValues: { [key: string]: string },
+                     replacementTexts: { [key: string]: string },
+                     selects: { [key: string]: string[] }): ITextBlockRenderItem[] {
+
+        if (textArrangement?.replacement != null) {
+            const whatToReplace: IReplacement[] = [...alwaysReplace];
+            const blockData: ITextBlockRenderItem[] = [{value: textArrangement.replacement, type: "text"}];
+            return replaceTags(blockData, whatToReplace, placeHolderValues, replacementTexts, selects);
+        }
+        if (textArrangement?.type === "pagebreak" || textArrangement?.type === "newline") {
+            return [];
+        }
+
+        return textToBlockDataArray(blockModel, placeHolderValues, replacementTexts, selects);
+    }
+}
diff --git a/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.spec.ts b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.spec.ts
new file mode 100644
index 0000000..12aaaa3
--- /dev/null
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.spec.ts
@@ -0,0 +1,71 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPITextBlockModel} from "../../../../core/api/text";
+import {ITextBlockRenderItem} from "../../model/ITextBlockRenderItem";
+import {GetBlockDataFromBlockModelPipe} from "./get-blockdata-array-from-block.pipe";
+
+
+describe("GetBlockDataFromBlockModelPipe", () => {
+
+    const pipe = new GetBlockDataFromBlockModelPipe();
+
+    const blockModel: IAPITextBlockModel = {
+        id: "textblockId",
+        text: "this is a test <f:freetext><t:replacementtext><s:select><d:date> and more text afterwards",
+        excludes: [],
+        requires: []
+    };
+
+    it("should return empty array for missing blockmodel (undefined/null)", () => {
+        let result = pipe.transform(undefined);
+        expect(result).toEqual([]);
+
+        result = pipe.transform(null);
+        expect(result).toEqual([]);
+    });
+
+    it("should split up textblockmodel text content into the different types and return them as array", () => {
+
+        const expectedResult: ITextBlockRenderItem[] = [
+            {
+                type: "text",
+                value: "this is a test "
+            },
+            {
+                type: "highlight-text",
+                value: "freetext"
+            },
+            {
+                type: "highlight-text",
+                value: "replacementtext"
+            },
+            {
+                type: "highlight-text",
+                value: "select"
+            },
+            {
+                type: "highlight-text",
+                value: "date"
+            },
+            {
+                type: "text",
+                value: " and more text afterwards"
+            }
+        ];
+
+        const result = pipe.transform(blockModel);
+        expect(JSON.parse(JSON.stringify(result))).toEqual(expectedResult);
+    });
+
+});
diff --git a/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.ts b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.ts
new file mode 100644
index 0000000..a07e312
--- /dev/null
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/get-blockdata-array-from-block.pipe.ts
@@ -0,0 +1,26 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Pipe, PipeTransform} from "@angular/core";
+import {IAPITextBlockModel} from "../../../../core/api/text";
+import {textToBlockDataArray} from "./block-data-helper";
+
+@Pipe({
+    name: "getBlockDataFromBlockModel"
+})
+export class GetBlockDataFromBlockModelPipe implements PipeTransform {
+
+    public transform(blockModel: IAPITextBlockModel): Array<{ value: string, type: string, placeholder?: string, options?: string[] }> {
+        return blockModel ? textToBlockDataArray(blockModel, undefined, undefined, undefined, false) : [];
+    }
+}
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/shared/text-block/pipes/get-blockdata-array/index.ts
similarity index 78%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/shared/text-block/pipes/get-blockdata-array/index.ts
index fc6c436..447a344 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/shared/text-block/pipes/get-blockdata-array/index.ts
@@ -11,7 +11,6 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
-}
+export * from "./get-blockdata-array-from-arrangement.pipe";
+export * from "./get-blockdata-array-from-block.pipe";
+export * from "./block-data-helper";
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/shared/text-block/pipes/index.ts
similarity index 93%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/shared/text-block/pipes/index.ts
index 2e6e007..94d6c20 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/shared/text-block/pipes/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./get-blockdata-array";
diff --git a/src/app/shared/text-block/text-block.module.ts b/src/app/shared/text-block/text-block.module.ts
new file mode 100644
index 0000000..19c1730
--- /dev/null
+++ b/src/app/shared/text-block/text-block.module.ts
@@ -0,0 +1,67 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {DragDropModule} from "@angular/cdk/drag-drop";
+import {CommonModule} from "@angular/common";
+import {NgModule} from "@angular/core";
+import {MatButtonModule} from "@angular/material/button";
+import {MatIconModule} from "@angular/material/icon";
+import {TranslateModule} from "@ngx-translate/core";
+import {DateControlModule} from "../controls/date-control";
+import {SelectModule} from "../controls/select";
+import {TextInputFieldModule} from "../controls/text-field";
+import {CollapsibleModule} from "../layout/collapsible";
+import {GlobalClassToggleModule} from "../layout/global-class-toggle";
+import {SharedPipesModule} from "../pipes";
+import {TextBlockSelectComponent} from "./components/editor-textblock-select";
+import {TextBlockComponent} from "./components/text-block";
+import {TextBlocksListComponent} from "./components/text-block-list";
+import {TextReplacementComponent} from "./components/text-replacement";
+import {GetBlockDataFromArrangementPipe, GetBlockDataFromBlockModelPipe} from "./pipes/get-blockdata-array";
+
+@NgModule({
+    imports: [
+        CommonModule,
+        MatIconModule,
+        CollapsibleModule,
+        SelectModule,
+        DateControlModule,
+        DragDropModule,
+        SharedPipesModule,
+        TranslateModule,
+        GlobalClassToggleModule,
+        TranslateModule,
+        MatButtonModule,
+        TextInputFieldModule
+    ],
+    declarations: [
+        TextBlockComponent,
+        TextBlockSelectComponent,
+        TextBlocksListComponent,
+        TextReplacementComponent,
+        GetBlockDataFromArrangementPipe,
+        GetBlockDataFromBlockModelPipe
+    ],
+    exports: [
+        TextBlockComponent,
+        TextBlockSelectComponent,
+        TextBlocksListComponent,
+        GetBlockDataFromArrangementPipe,
+        GetBlockDataFromBlockModelPipe,
+        TextBlocksListComponent,
+        TextReplacementComponent
+    ]
+})
+export class TextBlockModule {
+
+}
diff --git a/src/app/store/attachments/actions/attachments.actions.ts b/src/app/store/attachments/actions/attachments.actions.ts
index 47c8358..49cca63 100644
--- a/src/app/store/attachments/actions/attachments.actions.ts
+++ b/src/app/store/attachments/actions/attachments.actions.ts
@@ -13,16 +13,20 @@
 
 import {createAction, props} from "@ngrx/store";
 import {IAPIAttachmentModel} from "../../../core/api";
-import {IAttachmentError} from "../model";
+import {IAttachmentError, IAttachmentFormValue, IAttachmentWithTags} from "../model";
 
 export const fetchAttachmentsAction = createAction(
     "[Details/Edit] Fetch attachments",
     props<{ statementId: number }>()
 );
 
-export const addOrRemoveAttachmentsAction = createAction(
+export const submitAttachmentFormAction = createAction(
     "[Edit/Details] Add or remove attachments",
-    props<{ statementId: number, taskId: string, add?: File[], remove?: number[] }>()
+    props<{
+        statementId: number,
+        taskId: string,
+        value?: IAttachmentFormValue;
+    }>()
 );
 
 export const addAttachmentErrorAction = createAction(
@@ -30,7 +34,7 @@
     props<{
         statementId: number,
         taskId: string,
-        addError: IAttachmentError<File>[],
+        addError: IAttachmentError<IAttachmentWithTags<File>>[],
         removeError: IAttachmentError<number>[]
     }>()
 );
diff --git a/src/app/store/attachments/attachments-store.module.ts b/src/app/store/attachments/attachments-store.module.ts
index eaa5059..e857630 100644
--- a/src/app/store/attachments/attachments-store.module.ts
+++ b/src/app/store/attachments/attachments-store.module.ts
@@ -15,15 +15,14 @@
 import {EffectsModule} from "@ngrx/effects";
 import {StoreModule} from "@ngrx/store";
 import {ATTACHMENTS_NAME, ATTACHMENTS_REDUCER} from "./attachments-reducers.token";
-import {AddOrRemoveAttachmentsEffect} from "./effects/add-or-remove";
-import {FetchAttachmentsEffect} from "./effects/fetch";
+import {FetchAttachmentsEffect, SubmitAttachmentsEffect} from "./effects";
 
 @NgModule({
     imports: [
         StoreModule.forFeature(ATTACHMENTS_NAME, ATTACHMENTS_REDUCER),
         EffectsModule.forFeature([
-            AddOrRemoveAttachmentsEffect,
-            FetchAttachmentsEffect
+            FetchAttachmentsEffect,
+            SubmitAttachmentsEffect
         ])
     ]
 })
diff --git a/src/app/store/attachments/effects/add-or-remove/index.ts b/src/app/store/attachments/effects/add-or-remove/index.ts
deleted file mode 100644
index 8a74c8f..0000000
--- a/src/app/store/attachments/effects/add-or-remove/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./add-or-remove-attachments.effect";
diff --git a/src/app/store/attachments/effects/fetch/fetch-attachments.effect.spec.ts b/src/app/store/attachments/effects/fetch/fetch-attachments.effect.spec.ts
new file mode 100644
index 0000000..95aca3c
--- /dev/null
+++ b/src/app/store/attachments/effects/fetch/fetch-attachments.effect.spec.ts
@@ -0,0 +1,99 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription} from "rxjs";
+import {IAPIAttachmentModel, SPA_BACKEND_ROUTE} from "../../../../core";
+import {fetchAttachmentsAction, setAttachmentsAction} from "../../actions";
+import {FetchAttachmentsEffect} from "./fetch-attachments.effect";
+
+describe("FetchAttachmentsEffect", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: FetchAttachmentsEffect;
+    let subscription: Subscription;
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                FetchAttachmentsEffect,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                }
+            ]
+        });
+        effect = TestBed.inject(FetchAttachmentsEffect);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should fetch the attachments for the statement and dispatch setAttachmentsAction with the result", () => {
+        const statementId = 19;
+
+        const fetchAttachmentResult: IAPIAttachmentModel[] = [
+            {
+                id: 1,
+                name: "fileName",
+                type: "file",
+                size: 150,
+                timestamp: "2007-08-31T16:47+00:00",
+                tagIds: []
+            }
+        ];
+
+        const expectedResult = setAttachmentsAction({statementId, entities: fetchAttachmentResult});
+        const results: Action[] = [];
+
+        actions$ = of(fetchAttachmentsAction({statementId}));
+        subscription = effect.fetch$.subscribe((action) => results.push(action));
+
+        expectFetchAttachments(statementId, fetchAttachmentResult);
+        expect(results).toEqual([expectedResult]);
+        httpTestingController.verify();
+    });
+
+    it("should not dispatch any further actions when supplied with insufficient data", () => {
+        const statementId = null;
+
+        const results: Action[] = [];
+
+        actions$ = of(fetchAttachmentsAction({statementId}));
+        subscription = effect.fetch$.subscribe((action) => results.push(action));
+
+        expect(results).toEqual([]);
+        httpTestingController.verify();
+    });
+
+    function expectFetchAttachments(statementId: number, returnValue: IAPIAttachmentModel[]) {
+        const url = `/statements/${statementId}/attachments`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("GET");
+        request.flush(returnValue);
+    }
+
+});
+
diff --git a/src/app/store/attachments/effects/index.ts b/src/app/store/attachments/effects/index.ts
index 536301a..3ca0438 100644
--- a/src/app/store/attachments/effects/index.ts
+++ b/src/app/store/attachments/effects/index.ts
@@ -11,5 +11,5 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./add-or-remove";
+export * from "./submit";
 export * from "./fetch";
diff --git a/src/app/shared/select/pipes/index.ts b/src/app/store/attachments/effects/submit/index.ts
similarity index 92%
copy from src/app/shared/select/pipes/index.ts
copy to src/app/store/attachments/effects/submit/index.ts
index 2e6e007..7aebe19 100644
--- a/src/app/shared/select/pipes/index.ts
+++ b/src/app/store/attachments/effects/submit/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./selected.pipe";
+export * from "./submit-attachments.effect";
diff --git a/src/app/store/attachments/effects/submit/submit-attachments.effect.spec.ts b/src/app/store/attachments/effects/submit/submit-attachments.effect.spec.ts
new file mode 100644
index 0000000..ab6e7de
--- /dev/null
+++ b/src/app/store/attachments/effects/submit/submit-attachments.effect.spec.ts
@@ -0,0 +1,214 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription} from "rxjs";
+import {IAPIAttachmentModel, SPA_BACKEND_ROUTE} from "../../../../core";
+import {
+    addAttachmentEntityAction,
+    addAttachmentErrorAction,
+    clearFileCacheAction,
+    deleteAttachmentsAction,
+    fetchAttachmentsAction,
+    submitAttachmentFormAction
+} from "../../actions";
+import {IAttachmentWithTags} from "../../model";
+import {SubmitAttachmentsEffect} from "./submit-attachments.effect";
+
+describe("SubmitAttachmentsEffect", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: SubmitAttachmentsEffect;
+    let subscription: Subscription;
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                SubmitAttachmentsEffect,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                }
+            ]
+        });
+        effect = TestBed.inject(SubmitAttachmentsEffect);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should not clear file cache and refresh attachments", () => {
+        const statementId = 19;
+        const taskId = "asd12";
+        const expectedResult = [
+            clearFileCacheAction({statementId}),
+            fetchAttachmentsAction({statementId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(submitAttachmentFormAction({statementId, taskId, value: {add: [], edit: []}}));
+        subscription = effect.submit$.subscribe((action) => results.push(action));
+
+        expect(results).toEqual(expectedResult);
+    });
+
+    it("should clear file cache when no errors occurred", () => {
+        const statementId = 19;
+        const taskId = "asd12";
+        const add: IAttachmentWithTags<File>[] = [new File(["Some", "File"], "Some File")]
+            .map((_) => ({attachment: _, tags: []}));
+        const remove: number[] = [1];
+        const edit: IAttachmentWithTags<number>[] = remove
+            .map((_) => ({attachment: _, tags: [], remove: true}));
+
+        const attachmentModelResponse: IAPIAttachmentModel = {
+            id: 1,
+            name: "fileName",
+            type: "file",
+            size: 150,
+            timestamp: "2007-08-31T16:47+00:00",
+            tagIds: []
+        };
+
+        const expectedResult: Action[] = [
+            deleteAttachmentsAction({statementId, entityIds: remove}),
+            addAttachmentEntityAction({statementId, entity: attachmentModelResponse}),
+            clearFileCacheAction({statementId}),
+            fetchAttachmentsAction({statementId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(submitAttachmentFormAction({statementId, taskId, value: {add, edit}}));
+        subscription = effect.submit$.subscribe((action) => results.push(action));
+
+        expectDeleteRequest(statementId, taskId, 1);
+        expectAddRequest(statementId, taskId, attachmentModelResponse);
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    it("should dispatch addAttachmentErrorAction if an error removing an attachment occurs", () => {
+        const statementId = 19;
+        const taskId = "asd12";
+        const add: IAttachmentWithTags<File>[] = [new File(["Some", "File"], "Some File")]
+            .map((_) => ({attachment: _, tags: [], remove: true}));
+        const remove: number[] = [1];
+        const edit: IAttachmentWithTags<number>[] = remove
+            .map((_) => ({attachment: _, tags: [], remove: true}));
+
+        const attachmentModelResponse: IAPIAttachmentModel = {
+            id: 1,
+            name: "fileName",
+            type: "file",
+            size: 150,
+            timestamp: "2007-08-31T16:47+00:00",
+            tagIds: []
+        };
+
+        const expectedResult: Action[] = [
+            addAttachmentEntityAction({statementId, entity: attachmentModelResponse}),
+            addAttachmentErrorAction({
+                statementId, taskId, addError: [],
+                removeError: [{attachment: 1, error: undefined}]
+            }),
+            fetchAttachmentsAction({statementId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(submitAttachmentFormAction({statementId, taskId, value: {edit, add}}));
+        subscription = effect.submit$.subscribe((action) => results.push(action));
+
+        expectDeleteRequest(statementId, taskId, 1, true);
+        expectAddRequest(statementId, taskId, attachmentModelResponse);
+
+        expect(results.length).toEqual(expectedResult.length);
+        expect(results[0]).toEqual(expectedResult[0]);
+        httpTestingController.verify();
+    });
+
+    it("should dispatch addAttachmentErrorAction if an error adding an attachment occurs", () => {
+        const statementId = 19;
+        const taskId = "asd12";
+        const add: IAttachmentWithTags<File>[] = [new File(["Some", "File"], "Some File")]
+            .map((_) => ({attachment: _, tags: [], remove: true}));
+        const remove = [1];
+        const edit: IAttachmentWithTags<number>[] = remove
+            .map((_) => ({attachment: _, tags: [], remove: true}));
+
+        const attachmentModelResponse: IAPIAttachmentModel = {
+            id: 1,
+            name: "fileName",
+            type: "file",
+            size: 150,
+            timestamp: "2007-08-31T16:47+00:00",
+            tagIds: []
+        };
+
+        const expectedResult: Action[] = [
+            deleteAttachmentsAction({statementId, entityIds: remove}),
+            addAttachmentErrorAction({
+                statementId, taskId, addError: [{attachment: {attachment: add[0].attachment, tags: []}, error: undefined}],
+                removeError: []
+            }),
+            fetchAttachmentsAction({statementId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(submitAttachmentFormAction({statementId, taskId, value: {add, edit}}));
+        subscription = effect.submit$.subscribe((action) => results.push(action));
+
+        expectDeleteRequest(statementId, taskId, 1);
+        expectAddRequest(statementId, taskId, attachmentModelResponse, true);
+
+        expect(results.length).toEqual(expectedResult.length);
+        expect(results[0]).toEqual(expectedResult[0]);
+        httpTestingController.verify();
+    });
+
+    function expectAddRequest(statementId: number, taskId: string, returnValue: IAPIAttachmentModel, error = false) {
+        const url = `/process/statements/${statementId}/task/${taskId}/attachments`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("POST");
+        if (error) {
+            request.error(new ErrorEvent("test-error"));
+        } else {
+            request.flush(returnValue);
+        }
+
+    }
+
+    function expectDeleteRequest(statementId: number, taskId: string, attachmentId: number, error = false) {
+        const url = `/process/statements/${statementId}/task/${taskId}/attachments/${attachmentId}`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("DELETE");
+        if (error) {
+            request.error(new ErrorEvent("test-error"));
+        } else {
+            request.flush("204");
+        }
+    }
+
+});
+
diff --git a/src/app/store/attachments/effects/add-or-remove/add-or-remove-attachments.effect.ts b/src/app/store/attachments/effects/submit/submit-attachments.effect.ts
similarity index 67%
rename from src/app/store/attachments/effects/add-or-remove/add-or-remove-attachments.effect.ts
rename to src/app/store/attachments/effects/submit/submit-attachments.effect.ts
index 7fe16e3..a090dcf 100644
--- a/src/app/store/attachments/effects/add-or-remove/add-or-remove-attachments.effect.ts
+++ b/src/app/store/attachments/effects/submit/submit-attachments.effect.ts
@@ -22,19 +22,20 @@
 import {
     addAttachmentEntityAction,
     addAttachmentErrorAction,
-    addOrRemoveAttachmentsAction,
     clearFileCacheAction,
     deleteAttachmentsAction,
+    fetchAttachmentsAction,
+    submitAttachmentFormAction,
 } from "../../actions";
-import {IAttachmentError} from "../../model";
+import {IAttachmentError, IAttachmentFormValue, IAttachmentWithTags} from "../../model";
 
 @Injectable({providedIn: "root"})
-export class AddOrRemoveAttachmentsEffect {
+export class SubmitAttachmentsEffect {
 
-    public addOrRemove$ = createEffect(() => this.actions.pipe(
-        ofType(addOrRemoveAttachmentsAction),
+    public submit$ = createEffect(() => this.actions.pipe(
+        ofType(submitAttachmentFormAction),
         switchMap((action) => {
-            return this.addOrRemoveAttachments(action.statementId, action.taskId, action.add, action.remove).pipe(
+            return this.submit(action.statementId, action.taskId, action.value).pipe(
                 ignoreError()
             );
         })
@@ -44,14 +45,19 @@
 
     }
 
-    public addOrRemoveAttachments(
+    public submit(
         statementId: number,
         taskId: string,
-        add?: File[],
-        remove?: number[]
+        value: IAttachmentFormValue
     ): Observable<Action> {
+        const add = arrayJoin(value?.add);
+        const remove = arrayJoin(value?.edit)
+            .filter((_) => _.remove)
+            .map((_) => _.attachment);
+
         const removeError: IAttachmentError<number>[] = [];
-        const addError: IAttachmentError<File>[] = [];
+        const addError: IAttachmentError<IAttachmentWithTags<File>>[] = [];
+
         let isSuccess = false;
         return concat(
             this.removeAttachments(statementId, taskId, remove, removeError),
@@ -62,6 +68,7 @@
                     of(clearFileCacheAction({statementId})) :
                     of(addAttachmentErrorAction({statementId, taskId, addError, removeError}));
             }),
+            of(fetchAttachmentsAction({statementId})),
             defer(() => isSuccess ? EMPTY : throwError([...removeError, ...addError]))
         );
     }
@@ -69,7 +76,7 @@
     public removeAttachments(
         statementId: number,
         taskId: string,
-        remove?: number[],
+        remove: number[],
         errors: IAttachmentError<number>[] = []
     ): Observable<Action> {
         const remove$s = arrayJoin(remove).map((attachmentId) => {
@@ -88,18 +95,20 @@
     public addAttachments(
         statementId: number,
         taskId: string,
-        add?: File[],
-        errors: IAttachmentError<File>[] = []
+        add: IAttachmentWithTags<File>[],
+        errors: IAttachmentError<IAttachmentWithTags<File>>[] = []
     ): Observable<Action> {
-        const add$s = arrayJoin(add).filter((file) => file instanceof File).map((file) => {
-            return this.attachmentsApiService.postAttachment(statementId, taskId, file).pipe(
-                map((entity) => addAttachmentEntityAction({statementId, entity})),
-                catchError((error) => {
-                    errors.push({attachment: file, error});
-                    return EMPTY;
-                })
-            );
-        });
+        const add$s = arrayJoin(add)
+            .filter((item) => item?.attachment instanceof File)
+            .map((item) => {
+                return this.attachmentsApiService.postAttachment(statementId, taskId, item.attachment, ...arrayJoin(item.tags)).pipe(
+                    map((entity) => addAttachmentEntityAction({statementId, entity})),
+                    catchError((error) => {
+                        errors.push({attachment: item, error});
+                        return EMPTY;
+                    })
+                );
+            });
 
         return concat(...add$s);
     }
diff --git a/src/app/store/statements/model/ENewStatementError.ts b/src/app/store/attachments/model/IAttachmentFormValue.ts
similarity index 75%
copy from src/app/store/statements/model/ENewStatementError.ts
copy to src/app/store/attachments/model/IAttachmentFormValue.ts
index 6842926..e908199 100644
--- a/src/app/store/statements/model/ENewStatementError.ts
+++ b/src/app/store/attachments/model/IAttachmentFormValue.ts
@@ -11,10 +11,12 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export enum ENewStatementError {
+import {IAttachmentWithTags} from "./IAttachmentWithTags";
 
-    "UNKNOWN_ERROR" = "new.error.unknownError",
+export interface IAttachmentFormValue {
 
-    "INVALID_FORM" = "new.error.invalidForm"
+    add?: IAttachmentWithTags<File>[];
+
+    edit?: IAttachmentWithTags<number>[];
 
 }
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/store/attachments/model/IAttachmentWithTags.ts
similarity index 83%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/store/attachments/model/IAttachmentWithTags.ts
index fc6c436..b25a992 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/store/attachments/model/IAttachmentWithTags.ts
@@ -11,7 +11,12 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+export interface IAttachmentWithTags<T> {
+
+    attachment: T;
+
+    tags: string[];
+
+    remove?: boolean;
+
 }
diff --git a/src/app/store/attachments/model/IAttachmentsStoreState.ts b/src/app/store/attachments/model/IAttachmentsStoreState.ts
index 78fd303..75431d0 100644
--- a/src/app/store/attachments/model/IAttachmentsStoreState.ts
+++ b/src/app/store/attachments/model/IAttachmentsStoreState.ts
@@ -13,12 +13,13 @@
 
 import {IAPIAttachmentModel} from "../../../core/api";
 import {TStoreEntities} from "../../../util/store";
+import {IAttachmentWithTags} from "./IAttachmentWithTags";
 
 export interface IAttachmentsStoreState {
 
     entities: TStoreEntities<IAPIAttachmentModel>;
 
-    statementFileCache?: TStoreEntities<File[]>;
+    statementFileCache?: TStoreEntities<IAttachmentWithTags<File>[]>;
 
     statementAttachments: TStoreEntities<number[]>;
 
diff --git a/src/app/store/attachments/model/index.ts b/src/app/store/attachments/model/index.ts
index 90e6922..eb2d219 100644
--- a/src/app/store/attachments/model/index.ts
+++ b/src/app/store/attachments/model/index.ts
@@ -11,5 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+export * from "./IAttachmentFormValue";
 export * from "./IAttachmentError";
 export * from "./IAttachmentsStoreState";
+export * from "./IAttachmentWithTags";
diff --git a/src/app/store/attachments/reducers/entities/attachment-entities.reducer.spec.ts b/src/app/store/attachments/reducers/entities/attachment-entities.reducer.spec.ts
index a90ae7c..8555e0c 100644
--- a/src/app/store/attachments/reducers/entities/attachment-entities.reducer.spec.ts
+++ b/src/app/store/attachments/reducers/entities/attachment-entities.reducer.spec.ts
@@ -25,7 +25,7 @@
     };
 
     it("should set a list of attachment entities to store", () => {
-        const attachment = createAttachmentModelMock(19, [1, 9]);
+        const attachment = createAttachmentModelMock(19, "1", "9");
         const action: Action = setAttachmentsAction({
             statementId: 1919,
             entities: [attachment]
@@ -38,7 +38,7 @@
     });
 
     it("should add a single attachment entitiy to store", () => {
-        const attachment = createAttachmentModelMock(19, [1, 9]);
+        const attachment = createAttachmentModelMock(19, "1", "9");
         const action: Action = addAttachmentEntityAction({
             statementId: 1919,
             entity: attachment
diff --git a/src/app/store/attachments/reducers/statement-attachments/statement-attachments.reducer.spec.ts b/src/app/store/attachments/reducers/statement-attachments/statement-attachments.reducer.spec.ts
index 1665b2d..8b943c5 100644
--- a/src/app/store/attachments/reducers/statement-attachments/statement-attachments.reducer.spec.ts
+++ b/src/app/store/attachments/reducers/statement-attachments/statement-attachments.reducer.spec.ts
@@ -23,7 +23,7 @@
     };
 
     it("should set a list of attachment entity IDs to store", () => {
-        const attachment = createAttachmentModelMock(19, [1, 9]);
+        const attachment = createAttachmentModelMock(19, "1", "9");
         const action = setAttachmentsAction({
             statementId: 1919,
             entities: [attachment, null]
@@ -36,7 +36,7 @@
     });
 
     it("should add a single attachment ID to store", () => {
-        const attachment = createAttachmentModelMock(19, [1, 9]);
+        const attachment = createAttachmentModelMock(19, "1", "9");
         const action = addAttachmentEntityAction({
             statementId: 1919,
             entity: null
diff --git a/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.spec.ts b/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.spec.ts
index f44c8e4..153f725 100644
--- a/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.spec.ts
+++ b/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.spec.ts
@@ -12,14 +12,14 @@
  ********************************************************************************/
 
 import {Action} from "@ngrx/store";
-import {createFileMock} from "../../../../test";
+import {createAttachmentFileMock} from "../../../../test";
 import {addAttachmentErrorAction, clearFileCacheAction} from "../../actions";
 import {IAttachmentsStoreState} from "../../model";
 import {statementFileCacheReducer} from "./statement-file-cache.reducer";
 
 describe("statementFileCacheReducer", () => {
 
-    const file = createFileMock("test.pdf");
+    const file = createAttachmentFileMock("test.pdf");
 
     const initialState: IAttachmentsStoreState["statementFileCache"] = {
         1919: [file]
@@ -31,11 +31,11 @@
             taskId: "1919",
             addError: [
                 {
-                    attachment: createFileMock("File 0.pdf"),
+                    attachment: createAttachmentFileMock("File 0.pdf"),
                     error: new Error("")
                 },
                 {
-                    attachment: createFileMock("File 0.pdf"),
+                    attachment: createAttachmentFileMock("File 0.pdf"),
                     error: new Error("")
                 }
             ],
diff --git a/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.ts b/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.ts
index eadf2d5..9f52122 100644
--- a/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.ts
+++ b/src/app/store/attachments/reducers/statement-file-cache/statement-file-cache.reducer.ts
@@ -23,8 +23,7 @@
     }),
     on(addAttachmentErrorAction, (state, payload) => {
         const files = arrayJoin(payload.addError)
-            .map((error) => error.attachment)
-            .filter((file) => file instanceof File);
+            .map((error) => error.attachment);
         return setEntitiesObject(state, [files], () => payload.statementId);
     })
 );
diff --git a/src/app/store/attachments/selectors/attachments.selectors.spec.ts b/src/app/store/attachments/selectors/attachments.selectors.spec.ts
index 87ffb3e..6f8a265 100644
--- a/src/app/store/attachments/selectors/attachments.selectors.spec.ts
+++ b/src/app/store/attachments/selectors/attachments.selectors.spec.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {createAttachmentModelMock, createFileMock} from "../../../test";
+import {createAttachmentFileMock, createAttachmentModelMock} from "../../../test";
 import {IAttachmentsStoreState} from "../model";
 import {attachmentsEntitiesSelector, getStatementAttachmentsSelector, getStatementFileCacheSelector} from "./attachments.selectors";
 
@@ -30,8 +30,8 @@
         },
         statementFileCache: {
             1919: [
-                createFileMock("Test1.pdf"),
-                createFileMock("Test2.pdf")
+                createAttachmentFileMock("Test1.pdf"),
+                createAttachmentFileMock("Test2.pdf")
             ]
         }
     };
diff --git a/src/app/store/attachments/selectors/attachments.selectors.ts b/src/app/store/attachments/selectors/attachments.selectors.ts
index 6f943f6..af299a8 100644
--- a/src/app/store/attachments/selectors/attachments.selectors.ts
+++ b/src/app/store/attachments/selectors/attachments.selectors.ts
@@ -13,10 +13,10 @@
 
 import {createFeatureSelector, createSelector} from "@ngrx/store";
 import {IAPIAttachmentModel} from "../../../core/api/attachments";
-import {arrayJoin} from "../../../util/store";
+import {arrayJoin, TStoreEntities} from "../../../util/store";
 import {queryParamsIdSelector} from "../../root/selectors";
 import {ATTACHMENTS_NAME} from "../attachments-reducers.token";
-import {IAttachmentsStoreState} from "../model";
+import {IAttachmentsStoreState, IAttachmentWithTags} from "../model";
 
 export const attachmentsStoreStateSelector = createFeatureSelector<IAttachmentsStoreState>(ATTACHMENTS_NAME);
 
@@ -29,16 +29,29 @@
     attachmentsStoreStateSelector,
     attachmentsEntitiesSelector,
     queryParamsIdSelector,
-    (state, entities, statementId): IAPIAttachmentModel[] => {
+    (
+        state: IAttachmentsStoreState,
+        entities: TStoreEntities<IAPIAttachmentModel>,
+        statementId: number,
+        props: { restrictedTagIds?: string[], forbiddenTagIds?: string[] }
+    ): IAPIAttachmentModel[] => {
+        const restrictedTagIds = arrayJoin(props?.restrictedTagIds);
+        const forbiddenTagIds = arrayJoin(props?.forbiddenTagIds);
         return state?.statementAttachments == null ? [] : arrayJoin(state.statementAttachments[statementId])
-            .map((attachmentId) => entities[attachmentId]);
+            .map((attachmentId) => entities[attachmentId])
+            .filter((attachment) => {
+                return restrictedTagIds.length === 0 || attachment.tagIds.some((_) => restrictedTagIds.indexOf(_) > -1);
+            })
+            .filter((attachment) => {
+                return forbiddenTagIds.length === 0 || !attachment.tagIds.some((_) => forbiddenTagIds.indexOf(_) > -1);
+            });
     }
 );
 
 export const getStatementFileCacheSelector = createSelector(
     attachmentsStoreStateSelector,
     queryParamsIdSelector,
-    (state, id): File[] => {
+    (state, id): IAttachmentWithTags<File>[] => {
         return state?.statementFileCache == null ? [] : arrayJoin(state.statementFileCache[id]);
     }
 );
diff --git a/src/app/store/contacts/effects/fetch-details/fetch-contact-details.effect.spec.ts b/src/app/store/contacts/effects/fetch-details/fetch-contact-details.effect.spec.ts
new file mode 100644
index 0000000..0705992
--- /dev/null
+++ b/src/app/store/contacts/effects/fetch-details/fetch-contact-details.effect.spec.ts
@@ -0,0 +1,96 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription} from "rxjs";
+import {SPA_BACKEND_ROUTE} from "../../../../core";
+import {IAPIContactPersonDetails} from "../../../../core/api/contacts/IAPIContactPersonDetails";
+import {fetchContactDetailsAction, setContactEntityAction, setContactsLoadingState} from "../../actions";
+import {FetchContactDetailsEffect} from "./fetch-contact-details.effect";
+
+describe("FetchContactDetailsEffect", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: FetchContactDetailsEffect;
+    let subscription: Subscription;
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                FetchContactDetailsEffect,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                }
+            ]
+        });
+        effect = TestBed.inject(FetchContactDetailsEffect);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should fetch contact details and dispatch setContactEntityAction", () => {
+        const contactId = "contactId";
+
+        const fetchResult: IAPIContactPersonDetails =
+            {
+                community: "string",
+                communitySuffix: "string",
+                company: "string",
+                email: "string",
+                firstName: "string",
+                houseNumber: "string",
+                lastName: "string",
+                postCode: "string",
+                salutation: "string",
+                street: "string",
+                title: "string"
+            };
+
+        const expectedResult = [
+            setContactsLoadingState({state: {fetching: true}}),
+            setContactEntityAction({entity: {...fetchResult, id: contactId}}),
+            setContactsLoadingState({state: {fetching: false}})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(fetchContactDetailsAction({contactId}));
+        subscription = effect.fetch$.subscribe((action) => results.push(action));
+
+        expectFetchContactDetails(contactId, fetchResult);
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    function expectFetchContactDetails(contactId: string, returnValue: IAPIContactPersonDetails) {
+        const url = `/contacts/${contactId}`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("GET");
+        request.flush(returnValue);
+    }
+
+});
+
diff --git a/src/app/store/contacts/effects/search/search-contacts-effect.service.spec.ts b/src/app/store/contacts/effects/search/search-contacts-effect.service.spec.ts
new file mode 100644
index 0000000..3f81ac7
--- /dev/null
+++ b/src/app/store/contacts/effects/search/search-contacts-effect.service.spec.ts
@@ -0,0 +1,119 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription} from "rxjs";
+import {IAPIPaginationResponse, SPA_BACKEND_ROUTE} from "../../../../core";
+import {IAPIContactPerson} from "../../../../core/api/contacts/IAPIContactPerson";
+import {setContactsLoadingState, setContactsSearchAction, startContactSearchAction} from "../../actions";
+import {SearchContactsEffectService} from "./search-contacts-effect.service";
+
+describe("SearchContactsEffectService", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: SearchContactsEffectService;
+    let subscription: Subscription;
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                SearchContactsEffectService,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                }
+            ]
+        });
+        effect = TestBed.inject(SearchContactsEffectService);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should get the contacts using search parameters", () => {
+
+        const fetchResult: IAPIPaginationResponse<IAPIContactPerson> = {
+            content: [
+                {
+                    companyId: "string",
+                    companyName: "string",
+                    email: "string",
+                    id: "string",
+                    firstName: "string",
+                    lastName: "string"
+                }
+            ],
+            pageable: "string",
+            last: true,
+            totalPages: 1,
+            totalElements: 1,
+            size: 1,
+            number: 1,
+            numberOfElements: 1,
+            first: false,
+            sort: {
+                sorted: false,
+                unsorted: true,
+                empty: false
+            },
+            empty: false
+        };
+
+        const expectedResult = [
+            setContactsLoadingState({state: {searching: true}}),
+            setContactsSearchAction({results: fetchResult}),
+            setContactsLoadingState({state: {searching: false}})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(startContactSearchAction({options: {q: "search", page: 1}}));
+        subscription = effect.search$.subscribe((action) => results.push(action));
+
+        expectSearch(["q=search", "page=1"], fetchResult);
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    function expectSearch(urlParams: string[], returnValue: IAPIPaginationResponse<IAPIContactPerson>) {
+        let url = `/contacts`;
+        if (urlParams) {
+            url += "?";
+            let counter = 0;
+            for (const param of urlParams) {
+                if (counter !== 0) {
+                    url += "&";
+                }
+                url += param;
+                counter++;
+            }
+        }
+
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("GET");
+        request.flush(returnValue);
+    }
+
+});
+
diff --git a/src/app/store/contacts/effects/search/search-contacts-effect.service.ts b/src/app/store/contacts/effects/search/search-contacts-effect.service.ts
index b7b7af4..71969f2 100644
--- a/src/app/store/contacts/effects/search/search-contacts-effect.service.ts
+++ b/src/app/store/contacts/effects/search/search-contacts-effect.service.ts
@@ -16,9 +16,8 @@
 import {Action} from "@ngrx/store";
 import {asyncScheduler, Observable} from "rxjs";
 import {concatMap, endWith, filter, map, startWith, throttleTime} from "rxjs/operators";
-import {ContactsApiService} from "../../../../core/api/contacts";
-import {IAPISearchOptions} from "../../../../core/api/shared";
-import {ignoreError} from "../../../../util/rxjs";
+import {ContactsApiService, IAPISearchOptions} from "../../../../core";
+import {ignoreError} from "../../../../util";
 import {setContactsLoadingState, setContactsSearchAction, startContactSearchAction} from "../../actions";
 
 @Injectable({providedIn: "root"})
diff --git a/src/app/store/contacts/model/IContactsStoreState.ts b/src/app/store/contacts/model/IContactsStoreState.ts
index 4f39c4c..d3ad339 100644
--- a/src/app/store/contacts/model/IContactsStoreState.ts
+++ b/src/app/store/contacts/model/IContactsStoreState.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIPaginationResponse} from "../../../core/api/shared";
+import {IAPIPaginationResponse} from "../../../core";
 import {TStoreEntities} from "../../../util/store";
 import {IContactEntity} from "./IContactEntity";
 import {IContactsLoadingState} from "./IContactsLoadingState";
diff --git a/src/app/store/contacts/reducers/entities/contact-entities.reducer.spec.ts b/src/app/store/contacts/reducers/entities/contact-entities.reducer.spec.ts
index 77cd562..e3d6715 100644
--- a/src/app/store/contacts/reducers/entities/contact-entities.reducer.spec.ts
+++ b/src/app/store/contacts/reducers/entities/contact-entities.reducer.spec.ts
@@ -12,8 +12,8 @@
  ********************************************************************************/
 
 
-import {IAPIPaginationResponse} from "../../../../core/api/shared";
-import {TStoreEntities} from "../../../../util/store";
+import {IAPIPaginationResponse} from "../../../../core";
+import {TStoreEntities} from "../../../../util";
 import {setContactEntityAction, setContactsSearchAction} from "../../actions";
 import {IContactEntity} from "../../model";
 import {contactEntitiesReducer} from "./contact-entities.reducer";
diff --git a/src/app/store/contacts/reducers/search/contacts-search.reducer.spec.ts b/src/app/store/contacts/reducers/search/contacts-search.reducer.spec.ts
index c1da4f1..2c2e616 100644
--- a/src/app/store/contacts/reducers/search/contacts-search.reducer.spec.ts
+++ b/src/app/store/contacts/reducers/search/contacts-search.reducer.spec.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIPaginationResponse} from "../../../../core/api/shared";
+import {IAPIPaginationResponse} from "../../../../core";
 import {setContactsSearchAction} from "../../actions";
 import {IContactEntity} from "../../model";
 import {contactsSearchReducer} from "./contacts-search.reducer";
diff --git a/src/app/store/contacts/reducers/search/contacts-search.reducer.ts b/src/app/store/contacts/reducers/search/contacts-search.reducer.ts
index 32f6c3d..51da1bf 100644
--- a/src/app/store/contacts/reducers/search/contacts-search.reducer.ts
+++ b/src/app/store/contacts/reducers/search/contacts-search.reducer.ts
@@ -12,8 +12,8 @@
  ********************************************************************************/
 
 import {createReducer, on} from "@ngrx/store";
-import {IAPIPaginationResponse} from "../../../../core/api/shared";
-import {arrayJoin} from "../../../../util/store";
+import {IAPIPaginationResponse} from "../../../../core";
+import {arrayJoin} from "../../../../util";
 import {setContactsSearchAction} from "../../actions";
 
 export const contactsSearchReducer = createReducer<IAPIPaginationResponse<string>>(
diff --git a/src/app/store/contacts/selectors/contacts.selectors.ts b/src/app/store/contacts/selectors/contacts.selectors.ts
index fb6237c..2f23052 100644
--- a/src/app/store/contacts/selectors/contacts.selectors.ts
+++ b/src/app/store/contacts/selectors/contacts.selectors.ts
@@ -12,7 +12,7 @@
  ********************************************************************************/
 
 import {createFeatureSelector, createSelector} from "@ngrx/store";
-import {arrayJoin} from "../../../util/store";
+import {arrayJoin} from "../../../util";
 import {CONTACTS_NAME} from "../contacts-reducers.token";
 import {IContactEntity, IContactsStoreState} from "../model";
 
diff --git a/src/app/store/process/effects/claim-task.effect.spec.ts b/src/app/store/process/effects/claim-task.effect.spec.ts
new file mode 100644
index 0000000..85a5421
--- /dev/null
+++ b/src/app/store/process/effects/claim-task.effect.spec.ts
@@ -0,0 +1,132 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {Router} from "@angular/router";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription, timer} from "rxjs";
+import {SPA_BACKEND_ROUTE} from "../../../core";
+import {EAPIProcessTaskDefinitionKey, IAPIProcessTask} from "../../../core/api/process";
+import {claimTaskAction, deleteTaskAction, updateTaskAction} from "../actions";
+import {ClaimTaskEffect} from "./claim-task.effect";
+
+describe("ClaimTaskEffect", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: ClaimTaskEffect;
+    let subscription: Subscription;
+    const routerSpy = {navigate: jasmine.createSpy("navigate")};
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                ClaimTaskEffect,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                },
+                {provide: Router, useValue: routerSpy}
+            ]
+        });
+        effect = TestBed.inject(ClaimTaskEffect);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should claim the task and dispatch the updateTaskAction", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const fetchResult: IAPIProcessTask = {
+            statementId: 19,
+            taskId: "taskId",
+            taskDefinitionKey: EAPIProcessTaskDefinitionKey.ADD_BASIC_INFO_DATA,
+            processDefinitionKey: "string",
+            assignee: "string",
+            requiredVariables: {
+                var1: "string"
+            }
+        };
+
+        const expectedResult = [
+            updateTaskAction({task: fetchResult})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(claimTaskAction({statementId, taskId}));
+        subscription = effect.editTask$.subscribe((action) => results.push(action));
+
+        expectEditTask(statementId, taskId, fetchResult);
+        await timer(500).toPromise();
+        expect(routerSpy.navigate).toHaveBeenCalledWith(["/edit"], {queryParams: {id: statementId, taskId}});
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    it("should dispatch deleteTaskAction on error", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const fetchResult: IAPIProcessTask = {
+            statementId: 19,
+            taskId: "taskId",
+            taskDefinitionKey: EAPIProcessTaskDefinitionKey.ADD_BASIC_INFO_DATA,
+            processDefinitionKey: "string",
+            assignee: "string",
+            requiredVariables: {
+                var1: "string"
+            }
+        };
+
+        const expectedResult = [
+            deleteTaskAction({statementId, taskId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(claimTaskAction({statementId, taskId}));
+        subscription = effect.editTask$.subscribe((action) => results.push(action));
+
+        expectEditTask(statementId, taskId, fetchResult, true);
+        await timer(500).toPromise();
+        expect(routerSpy.navigate).toHaveBeenCalledWith(["/edit"], {queryParams: {id: statementId, taskId}});
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    function expectEditTask(statementId: number, taskId: string, returnValue: IAPIProcessTask, error = false) {
+        const url = `/process/statements/${statementId}/task/${taskId}/claim`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("POST");
+        if (error) {
+            request.error(new ErrorEvent("test-error"));
+        } else {
+            request.flush(returnValue);
+        }
+    }
+
+});
+
diff --git a/src/app/store/process/effects/complete-task.effect.spec.ts b/src/app/store/process/effects/complete-task.effect.spec.ts
new file mode 100644
index 0000000..beb7779
--- /dev/null
+++ b/src/app/store/process/effects/complete-task.effect.spec.ts
@@ -0,0 +1,173 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {Router} from "@angular/router";
+import {provideMockActions} from "@ngrx/effects/testing";
+import {Action} from "@ngrx/store";
+import {Observable, of, Subscription, timer} from "rxjs";
+import {SPA_BACKEND_ROUTE} from "../../../core";
+import {EAPIProcessTaskDefinitionKey, IAPIProcessTask} from "../../../core/api/process";
+import {completeTaskAction, deleteTaskAction} from "../actions";
+import {CompleteTaskEffect} from "./complete-task.effect";
+
+describe("CompleteTaskEffect", () => {
+
+    let actions$: Observable<Action>;
+    let httpTestingController: HttpTestingController;
+    let effect: CompleteTaskEffect;
+    let subscription: Subscription;
+    const routerSpy = {navigate: jasmine.createSpy("navigate")};
+
+    beforeEach(async () => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientTestingModule
+            ],
+            providers: [
+                CompleteTaskEffect,
+                provideMockActions(() => actions$),
+                {
+                    provide: SPA_BACKEND_ROUTE,
+                    useValue: "/"
+                },
+                {provide: Router, useValue: routerSpy}
+            ]
+        });
+        effect = TestBed.inject(CompleteTaskEffect);
+        httpTestingController = TestBed.inject(HttpTestingController);
+    });
+
+    afterEach(() => {
+        if (subscription != null) {
+            subscription.unsubscribe();
+        }
+    });
+
+    it("should claim the task and dispatch the updateTaskAction", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const expectedResult = [deleteTaskAction({statementId, taskId})];
+        const results: Action[] = [];
+
+        actions$ = of(completeTaskAction({statementId, taskId, variables: {}}));
+        subscription = effect.completeTask$.subscribe((action) => results.push(action));
+
+        expectCompleteTask(statementId, taskId);
+        await timer(500).toPromise();
+
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    it("should complete the task and afterwards claim it", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const expectedResult = [deleteTaskAction({statementId, taskId})];
+        const results: Action[] = [];
+
+        actions$ = of(completeTaskAction({statementId, taskId, variables: {}}));
+        subscription = effect.completeTask$.subscribe((action) => results.push(action));
+
+        expectCompleteTask(statementId, taskId);
+
+        await timer(500).toPromise();
+
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    it("should claim the next task", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const fetchResult: IAPIProcessTask[] = [
+            {
+                statementId: 19,
+                taskId: "taskId",
+                taskDefinitionKey: EAPIProcessTaskDefinitionKey.ADD_BASIC_INFO_DATA,
+                processDefinitionKey: "string",
+                assignee: "string",
+                requiredVariables: {
+                    var1: "string"
+                }
+            }
+        ];
+
+        const expectedResult = [deleteTaskAction({statementId, taskId})];
+        const results: Action[] = [];
+
+        actions$ = of(completeTaskAction({statementId, taskId, variables: {}, claimNext: true}));
+        subscription = effect.completeTask$.subscribe((action) => results.push(action));
+
+        expectCompleteTask(statementId, taskId);
+        expectGetStatement(statementId, fetchResult);
+        expectClaimTask(statementId, taskId, fetchResult[0]);
+
+        await timer(500).toPromise();
+
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    it("should follow up with the actions supplied in endWith", async () => {
+
+        const statementId = 19;
+        const taskId = "taskId";
+
+        const expectedResult = [
+            deleteTaskAction({statementId, taskId}),
+            deleteTaskAction({statementId, taskId})
+        ];
+        const results: Action[] = [];
+
+        actions$ = of(completeTaskAction({statementId, taskId, variables: {}, endWith: [deleteTaskAction({statementId, taskId})]}));
+        subscription = effect.completeTask$.subscribe((action) => results.push(action));
+
+        expectCompleteTask(statementId, taskId);
+
+        await timer(500).toPromise();
+
+        expect(results).toEqual(expectedResult);
+        httpTestingController.verify();
+    });
+
+    function expectCompleteTask(statementId: number, taskId: string) {
+        const url = `/process/statements/${statementId}/task/${taskId}/complete`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("POST");
+        request.flush({});
+    }
+
+    function expectGetStatement(statementId: number, returnValue: IAPIProcessTask[]) {
+        const url = `/process/statements/${statementId}/task`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("GET");
+        request.flush(returnValue);
+    }
+
+    function expectClaimTask(statementId: number, taskId: string, returnValue: IAPIProcessTask) {
+        const url = `/process/statements/${statementId}/task/${taskId}/claim`;
+        const request = httpTestingController.expectOne(url);
+        expect(request.request.method).toBe("POST");
+        request.flush(returnValue);
+    }
+
+});
+
diff --git a/src/app/store/process/effects/edit-task.effect.ts b/src/app/store/process/effects/edit-task.effect.ts
deleted file mode 100644
index afd2dcb..0000000
--- a/src/app/store/process/effects/edit-task.effect.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {Router} from "@angular/router";
-import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {Action} from "@ngrx/store";
-import {Observable} from "rxjs";
-import {catchError, filter, map, switchMap} from "rxjs/operators";
-import {ProcessApiService} from "../../../core/api/process";
-import {claimTaskAction, deleteTaskAction, updateTaskAction} from "../actions";
-
-@Injectable({providedIn: "root"})
-export class EditTaskEffect {
-
-    public readonly editTask$ = createEffect(() => this.actions$.pipe(
-        ofType(claimTaskAction),
-        filter((action) => typeof action.statementId === "number" && typeof action.taskId === "string"),
-        switchMap((action) => this.editTask(action.statementId, action.taskId, action.options))
-    ));
-
-    public constructor(
-        private readonly actions$: Actions,
-        private readonly processApiService: ProcessApiService,
-        private readonly router: Router
-    ) {
-
-    }
-
-    public editTask(statementId: number, taskId: string, queryParams?: any): Observable<Action> {
-        queryParams = {...queryParams, id: statementId, taskId};
-        return this.processApiService.claimStatementTask(statementId, taskId).pipe(
-            map((task) => updateTaskAction({task})),
-            catchError(async () => deleteTaskAction({statementId, taskId})),
-            switchMap(async (action) => {
-                await this.router.navigate(["/edit"], {queryParams});
-                return action;
-            }),
-        );
-    }
-
-}
diff --git a/src/app/store/root/actions/root.actions.ts b/src/app/store/root/actions/root.actions.ts
index 966b185..abce748 100644
--- a/src/app/store/root/actions/root.actions.ts
+++ b/src/app/store/root/actions/root.actions.ts
@@ -66,10 +66,15 @@
 );
 
 export const openContactDataBaseAction = createAction(
-    "[Details/Edit] Open contact data base"
+    "[Details/Edit] Open contact data base in new tab"
 );
 
 export const openAttachmentAction = createAction(
     "[Details/Edit] Open attachment in new tab",
     props<{ statementId: number, attachmentId: number }>()
 );
+
+export const openFileAction = createAction(
+    "[API] Open file in new tab",
+    props<{ file: File }>()
+);
diff --git a/src/app/store/root/effects/open-new-tab.effect.ts b/src/app/store/root/effects/open-new-tab.effect.ts
index 14a7e8e..621fde4 100644
--- a/src/app/store/root/effects/open-new-tab.effect.ts
+++ b/src/app/store/root/effects/open-new-tab.effect.ts
@@ -13,12 +13,12 @@
 
 import {Inject, Injectable} from "@angular/core";
 import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {filter, switchMap} from "rxjs/operators";
+import {filter, mergeMap, switchMap} from "rxjs/operators";
 import {AuthService} from "../../../core/auth";
-import {WINDOW} from "../../../core/dom";
+import {URL_TOKEN, WINDOW} from "../../../core/dom";
 import {CONTACT_DATA_BASE_ROUTE, SPA_BACKEND_ROUTE} from "../../../core/external-routes";
 import {urlJoin} from "../../../util/http";
-import {openAttachmentAction, openContactDataBaseAction} from "../actions";
+import {openAttachmentAction, openContactDataBaseAction, openFileAction} from "../actions";
 
 @Injectable({providedIn: "root"})
 export class OpenNewTabEffect {
@@ -26,7 +26,7 @@
     public openContactDataBase$ = createEffect(() => this.actions.pipe(
         ofType(openContactDataBaseAction),
         filter(() => this.authenticationService.token != null),
-        switchMap(() => this.open(this.contactDataBaseRoute))
+        switchMap(() => this.open(this.contactDataBaseRoute, true))
     ), {dispatch: false});
 
     public openAttachment$ = createEffect(() => this.actions.pipe(
@@ -36,24 +36,42 @@
         switchMap((action) => this.openAttachment(action.statementId, action.attachmentId))
     ), {dispatch: false});
 
+    public openFile$ = createEffect(() => this.actions.pipe(
+        ofType(openFileAction),
+        filter((action) => action.file instanceof File),
+        mergeMap((action) => this.openFile(action.file))
+    ), {dispatch: false});
+
     public constructor(
         public actions: Actions,
         private readonly authenticationService: AuthService,
         @Inject(SPA_BACKEND_ROUTE) private readonly spaBackendRoute: string,
         @Inject(CONTACT_DATA_BASE_ROUTE) private readonly contactDataBaseRoute: string,
-        @Inject(WINDOW) private readonly window: Window
+        @Inject(WINDOW) private readonly window: Window,
+        @Inject(URL_TOKEN) private readonly url: typeof URL
     ) {
 
     }
 
     public async openAttachment(statementId: number, attachmentId: number) {
         const endPoint = `/statements/${statementId}/attachments/${attachmentId}/file`;
-        return this.open(urlJoin(this.spaBackendRoute, endPoint));
+        return this.open(urlJoin(this.spaBackendRoute, endPoint), true);
     }
 
-    public async open(url: string) {
-        url += "?accessToken=" + this.authenticationService.token;
-        this.window.open(url, "_blank");
+    public async openFile(file: File) {
+        const objectUrl = this.url.createObjectURL(file);
+        const tab = await this.open(objectUrl, false, file.name);
+        tab.onbeforeunload = () => this.url.revokeObjectURL(objectUrl);
+        return tab;
+    }
+
+    public async open(url: string, withToken?: boolean, title?: string) {
+        url += withToken ? "?accessToken=" + this.authenticationService.token : "";
+        const tab = this.window.open(url, "_blank");
+        if (title != null) {
+            tab.onload = () => tab.document.title = title;
+        }
+        return tab;
     }
 
 
diff --git a/src/app/store/root/root.actions.ts b/src/app/store/root/root.actions.ts
deleted file mode 100644
index 4e54c6b..0000000
--- a/src/app/store/root/root.actions.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createAction, props} from "@ngrx/store";
-import {IAPIUserInfo} from "../../core/api/core/IAPIUserInfo";
-import {IAPIVersion} from "../../core/api/core/IAPIVersion";
-import {TStoreEntities} from "../../util/store.util";
-import {EExitCode} from "./model/EExitCode";
-
-export const intializeAction = createAction(
-    "[Store] Initialize"
-);
-
-export const completeInitializationAction = createAction(
-    "[Store] Complete initialization"
-);
-
-export const toggleLoadingPageAction = createAction(
-    "[Store] Toggle loading page",
-    props<{ isLoading?: boolean }>()
-);
-
-export const keepSessionAliveAction = createAction(
-    "[Store] Keep session alive"
-);
-
-export const fetchVersionAction = createAction(
-    "[Store] Fetch version"
-);
-
-export const setBackEndVersionAction = createAction(
-    "[API] Set back end version",
-    props<IAPIVersion>()
-);
-
-export const setUserAction = createAction(
-    "[API] Set user",
-    props<IAPIUserInfo>()
-);
-
-export const clearUserAction = createAction(
-    "[API] Clear user"
-);
-
-export const openExitPageAction = createAction(
-    "[API] Open exit page",
-    props<{ code: EExitCode }>()
-);
-
-export const logOutAction = createAction(
-    "[NavigationFrame] Log out"
-);
-
-export const setQueryParamsAction = createAction(
-    "[Router] Set query params",
-    props<{ queryParams: TStoreEntities<any> }>()
-);
diff --git a/src/app/store/settings/effects/statement-types.effects.ts b/src/app/store/settings/effects/statement-types.effects.ts
deleted file mode 100644
index c8350d8..0000000
--- a/src/app/store/settings/effects/statement-types.effects.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {Action} from "@ngrx/store";
-import {Observable} from "rxjs";
-import {map, retry, switchMap} from "rxjs/operators";
-import {SettingsApiService} from "../../../core";
-import {retryAfter} from "../../../util";
-import {intializeAction} from "../../root/actions";
-import {setStatementTypesAction} from "../actions";
-
-@Injectable({providedIn: "root"})
-export class StatementTypesEffects {
-
-    public initialize$ = createEffect(() => this.actions.pipe(
-        ofType(intializeAction),
-        switchMap(() => {
-            return this.fetchStatementTypes().pipe(
-                retryAfter(30000)
-            );
-        })
-    ));
-
-    public constructor(private readonly actions: Actions, private readonly settingsApiService: SettingsApiService) {
-
-    }
-
-    public fetchStatementTypes(): Observable<Action> {
-        return this.settingsApiService.getStatementTypes().pipe(
-            map((statementTypes) => setStatementTypesAction({statementTypes})),
-            retry(2)
-        );
-    }
-
-}
diff --git a/src/app/store/settings/statements-reducers.token.ts b/src/app/store/settings/statements-reducers.token.ts
deleted file mode 100644
index c4c0dd2..0000000
--- a/src/app/store/settings/statements-reducers.token.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {InjectionToken} from "@angular/core";
-import {ActionReducerMap} from "@ngrx/store";
-import {ISettingsStoreState} from "./model";
-import {statementTypesReducer} from "./reducers";
-
-export const SETTINGS_FEATURE_NAME = "settings";
-
-export const SETTINGS_REDUCER = new InjectionToken<ActionReducerMap<ISettingsStoreState>>("Settings store reducer", {
-    providedIn: "root",
-    factory: () => ({
-        statementTypes: statementTypesReducer
-    })
-});
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/store/statements/actions/error.actions.ts
similarity index 68%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/store/statements/actions/error.actions.ts
index fc6c436..3016963 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/store/statements/actions/error.actions.ts
@@ -11,7 +11,10 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
-}
+import {createAction, props} from "@ngrx/store";
+import {IStatementErrorEntity} from "../model";
+
+export const setStatementErrorAction = createAction(
+    "[API] Set statement error",
+    props<{ statementId: number, error: IStatementErrorEntity }>()
+);
diff --git a/src/app/store/statements/actions/fetch.actions.ts b/src/app/store/statements/actions/fetch.actions.ts
index a13078c..8137edd 100644
--- a/src/app/store/statements/actions/fetch.actions.ts
+++ b/src/app/store/statements/actions/fetch.actions.ts
@@ -13,11 +13,11 @@
 
 import {createAction, props} from "@ngrx/store";
 import {IAPIStatementModel} from "../../../core/api";
-import {IStatementEntity} from "../model";
+import {IStatementConfigurationEntity, IStatementEntity} from "../model";
 
 export const fetchStatementDetailsAction = createAction(
-    "[Details/Edit] Fetch statement's details",
-    props<{ statementId: number; withoutConfiguration?: boolean }>()
+    "[Details/Edit] Fetch statement details",
+    props<{ statementId: number; withConfiguration?: boolean }>()
 );
 
 export const updateStatementEntityAction = createAction(
@@ -29,3 +29,13 @@
     "[API] Update statement info",
     props<{ items: IAPIStatementModel[] }>()
 );
+
+export const updateStatementConfigurationAction = createAction(
+    "[API] Update statement configuration",
+    props<{ statementId: number, entity: IStatementConfigurationEntity }>()
+);
+
+export const fetchStatementTextArrangementAction = createAction(
+    "[Edit] Fetch statement text arrangement",
+    props<{ statementId: number; }>()
+);
diff --git a/src/app/store/statements/actions/index.ts b/src/app/store/statements/actions/index.ts
index 6f7b32b..1cae168 100644
--- a/src/app/store/statements/actions/index.ts
+++ b/src/app/store/statements/actions/index.ts
@@ -12,9 +12,8 @@
  ********************************************************************************/
 
 export * from "./comments.actions";
+export * from "./error.actions";
 export * from "./fetch.actions";
-export * from "./new-statement-form.actions";
-export * from "./submit.actions";
-
 export * from "./loading.actions";
 export * from "./search.actions";
+export * from "./submit.actions";
diff --git a/src/app/store/statements/actions/loading.actions.ts b/src/app/store/statements/actions/loading.actions.ts
index 3b556d7..2bf9af5 100644
--- a/src/app/store/statements/actions/loading.actions.ts
+++ b/src/app/store/statements/actions/loading.actions.ts
@@ -12,9 +12,9 @@
  ********************************************************************************/
 
 import {createAction, props} from "@ngrx/store";
-import {IStatementLoadingState} from "../model";
+import {IStatementLoadingEntity} from "../model";
 
 export const setStatementLoadingAction = createAction(
     "[Effects/API] Set statement loading state",
-    props<{ loading: Partial<IStatementLoadingState> }>()
+    props<{ loading: Partial<IStatementLoadingEntity> }>()
 );
diff --git a/src/app/store/statements/actions/new-statement-form.actions.ts b/src/app/store/statements/actions/new-statement-form.actions.ts
deleted file mode 100644
index 2bceadc..0000000
--- a/src/app/store/statements/actions/new-statement-form.actions.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createAction, props} from "@ngrx/store";
-import {IStatementInformationFormValue} from "../model";
-
-export const clearNewStatementFormAction = createAction(
-    "[NewStatement] Clear form"
-);
-
-export const submitNewStatementAction = createAction(
-    "[NewStatement] Submit",
-    props<{ value: IStatementInformationFormValue }>()
-);
-
-export const setNewStatementProgressAction = createAction(
-    "[API] Set progress for new statement form__",
-    props<{ isLoading: boolean, error?: string }>()
-);
diff --git a/src/app/store/statements/actions/new-statement.actions.ts b/src/app/store/statements/actions/new-statement.actions.ts
deleted file mode 100644
index 797321d..0000000
--- a/src/app/store/statements/actions/new-statement.actions.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createAction, props} from "@ngrx/store";
-import {INewStatementForm} from "../model";
-
-export const clearNewStatementFormAction = createAction(
-    "[NewStatement] Clear new statement form"
-);
-
-export const addNewStatementAction = createAction(
-    "[NewStatement] Add new statement",
-    props<{ form: INewStatementForm }>()
-);
-
-export const setNewStatementProgressAction = createAction(
-    "[API] Set progress for creating new statement",
-    props<{ isLoading: boolean, error?: string }>()
-);
diff --git a/src/app/store/statements/actions/statements.actions.ts b/src/app/store/statements/actions/statements.actions.ts
deleted file mode 100644
index 63cfe13..0000000
--- a/src/app/store/statements/actions/statements.actions.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createAction, props} from "@ngrx/store";
-import {IAPIAttachmentModel} from "../../../core";
-import {IStatementEntity} from "../model";
-
-export const fetchStatementsAction = createAction(
-    "[Dashboard] Fetch statements"
-);
-
-export const fetchStatementDetailsAction = createAction(
-    "[StatementDetails] Fetch statement details",
-    props<{ statementId: number }>()
-);
-
-export const addStatementsAction = createAction(
-    "[API] Add statements ",
-    props<{ statements: IStatementEntity[] }>()
-);
-
-export const addAttachmentsAction = createAction(
-    "[API] Set attachments to statement",
-    props<{ statementId: number, attachments: IAPIAttachmentModel[] }>()
-);
diff --git a/src/app/store/statements/actions/submit.actions.ts b/src/app/store/statements/actions/submit.actions.ts
index d3c4d24..d296bb3 100644
--- a/src/app/store/statements/actions/submit.actions.ts
+++ b/src/app/store/statements/actions/submit.actions.ts
@@ -12,7 +12,8 @@
  ********************************************************************************/
 
 import {createAction, props} from "@ngrx/store";
-import {IStatementInformationFormValue, IWorkflowFormValue} from "../model";
+import {IAPITextArrangementItemModel} from "../../../core/api/text";
+import {IStatementEditorFormValue, IStatementInformationFormValue, IWorkflowFormValue} from "../model";
 
 /**
  * This action submits the value of the statement information form to the back end.
@@ -39,7 +40,24 @@
     }>()
 );
 
+
 export const submitWorkflowDataFormAction = createAction(
     "[Edit] Submit workflow data form",
     props<{ statementId: number, taskId: string, data: IWorkflowFormValue, completeTask?: boolean }>()
 );
+
+
+export const validateStatementArrangementAction = createAction(
+    "[Edit] Validate statement arrangement",
+    props<{ statementId: number, taskId: string, arrangement: IAPITextArrangementItemModel[] }>()
+);
+
+export const compileStatementArrangementAction = createAction(
+    "[Edit] Compile statement arrangement",
+    props<{ statementId: number, taskId: string, arrangement: IAPITextArrangementItemModel[] }>()
+);
+
+export const submitStatementEditorFormAction = createAction(
+    "[Edit] Submit statement editor form",
+    props<{ statementId: number, taskId: string, value: IStatementEditorFormValue }>()
+);
diff --git a/src/app/store/statements/effects/add-statement.effect.ts b/src/app/store/statements/effects/add-statement.effect.ts
deleted file mode 100644
index 67d7bb6..0000000
--- a/src/app/store/statements/effects/add-statement.effect.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {Router} from "@angular/router";
-import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {Action} from "@ngrx/store";
-import {concat, EMPTY, Observable} from "rxjs";
-import {catchError, endWith, exhaustMap, filter, finalize, map, startWith, switchMap} from "rxjs/operators";
-import {StatementsApiService} from "../../../core";
-import {addAttachmentsAction, addNewStatementAction, addStatementsAction, setNewStatementProgressAction} from "../actions";
-import {ENewStatementError, INewStatementForm} from "../model";
-
-@Injectable({providedIn: "root"})
-export class AddStatementEffect {
-
-    public readonly addNewStatement$ = createEffect(() => this.actions.pipe(
-        ofType(addNewStatementAction),
-        filter((action) => action?.form != null),
-        exhaustMap((action) => this.addNewStatement(action.form))
-    ));
-
-    public constructor(
-        private readonly actions: Actions,
-        private readonly statementsApiService: StatementsApiService,
-        private readonly router: Router
-    ) {
-
-    }
-
-    public async navigateToStatement(statementId: number) {
-        if (Number.isInteger(statementId)) {
-            return this.router.navigate(["/details"], {queryParams: {id: statementId}});
-        }
-    }
-
-    public addNewStatement(form: INewStatementForm): Observable<Action> {
-        return this.createStatement(form).pipe(
-            startWith(setNewStatementProgressAction({isLoading: true})),
-            catchError(async (error) => {
-                console.error(error);
-                return setNewStatementProgressAction({isLoading: false, error: ENewStatementError.UNKNOWN_ERROR});
-            }),
-            endWith(setNewStatementProgressAction({isLoading: false}))
-        );
-    }
-
-    public createStatement(form: INewStatementForm): Observable<Action> {
-        return this.statementsApiService.postStatement({
-            title: form?.title,
-            dueDate: form?.dueDate,
-            receiptDate: form?.receiptDate,
-            typeId: form?.typeId,
-            city: form?.city,
-            district: form?.district
-        }).pipe(
-            switchMap((statement) => {
-                return this.attachFiles(statement.id, form?.attachments).pipe(
-                    startWith(addStatementsAction({statements: [statement]})),
-                    finalize(() => this.navigateToStatement(statement?.id))
-                );
-            })
-        );
-    }
-
-    public attachFiles(statementId: number, attachments?: File[]): Observable<Action> {
-        attachments = (Array.isArray(attachments) ? attachments : [])
-            .filter((file) => file instanceof File);
-
-        return concat(...attachments.map((file) => this.attachFile(statementId, file)));
-    }
-
-    private attachFile(statementId: number, file: File): Observable<Action> {
-        return this.statementsApiService.postAttachment(statementId, file).pipe(
-            map((attachment) => addAttachmentsAction({statementId, attachments: [attachment]})),
-            catchError((error) => {
-                console.error(error);
-                return EMPTY;
-            })
-        );
-    }
-
-}
diff --git a/src/app/store/statements/effects/compile-statement-arrangement/compile-statement-arrangement.effect.ts b/src/app/store/statements/effects/compile-statement-arrangement/compile-statement-arrangement.effect.ts
new file mode 100644
index 0000000..ce2efeb
--- /dev/null
+++ b/src/app/store/statements/effects/compile-statement-arrangement/compile-statement-arrangement.effect.ts
@@ -0,0 +1,62 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Injectable} from "@angular/core";
+import {Actions, createEffect, ofType} from "@ngrx/effects";
+import {Action} from "@ngrx/store";
+import {Observable, of} from "rxjs";
+import {endWith, filter, startWith, switchMap} from "rxjs/operators";
+import {IAPITextArrangementItemModel, IAPITextArrangementValidationModel, TextApiService} from "../../../../core";
+import {catchHttpError, EHttpStatusCodes, ignoreError} from "../../../../util";
+import {openFileAction} from "../../../root/actions";
+import {
+    compileStatementArrangementAction,
+    setStatementErrorAction,
+    setStatementLoadingAction,
+    updateStatementEntityAction
+} from "../../actions";
+
+@Injectable({providedIn: "root"})
+export class CompileStatementArrangementEffect {
+
+    public compile$ = createEffect(() => this.actions.pipe(
+        ofType(compileStatementArrangementAction),
+        filter((action) => action.statementId != null && action.taskId != null),
+        switchMap((action) => this.compile(action.statementId, action.taskId, action.arrangement))
+    ));
+
+    public constructor(private readonly actions: Actions, private readonly textApiService: TextApiService) {
+
+    }
+
+    public compile(statementId: number, taskId: string, arrangement: IAPITextArrangementItemModel[]): Observable<Action> {
+        return this.textApiService.compileArrangement(statementId, taskId, arrangement).pipe(
+            switchMap((file) => {
+                return of(
+                    updateStatementEntityAction({statementId, entity: {file}}),
+                    setStatementErrorAction({statementId, error: {arrangement: null}}),
+                    openFileAction({file})
+                );
+            }),
+            catchHttpError(async (response) => {
+                const errorMessage = response.error instanceof Blob ? await response.error.text() : response.error;
+                const body: IAPITextArrangementValidationModel = JSON.parse(errorMessage);
+                return setStatementErrorAction({statementId, error: {arrangement: body.errors}});
+            }, EHttpStatusCodes.FAILED_DEPENDENCY),
+            ignoreError(),
+            startWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: true}})),
+            endWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: false}}))
+        );
+    }
+
+}
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/store/statements/effects/compile-statement-arrangement/index.ts
similarity index 90%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/store/statements/effects/compile-statement-arrangement/index.ts
index 7378646..42e8659 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/store/statements/effects/compile-statement-arrangement/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./compile-statement-arrangement.effect";
diff --git a/src/app/store/statements/effects/fetch-statement-details/fetch-statement-details.effect.ts b/src/app/store/statements/effects/fetch-statement-details/fetch-statement-details.effect.ts
index 3f0adbd..3e93c9e 100644
--- a/src/app/store/statements/effects/fetch-statement-details/fetch-statement-details.effect.ts
+++ b/src/app/store/statements/effects/fetch-statement-details/fetch-statement-details.effect.ts
@@ -21,7 +21,13 @@
 import {arrayJoin} from "../../../../util/store";
 import {fetchAttachmentsAction} from "../../../attachments/actions";
 import {setDiagramAction, setHistoryAction, setTasksAction} from "../../../process/actions";
-import {fetchCommentsAction, fetchStatementDetailsAction, updateStatementEntityAction, updateStatementInfoAction} from "../../actions";
+import {
+    fetchCommentsAction,
+    fetchStatementDetailsAction,
+    updateStatementConfigurationAction,
+    updateStatementEntityAction,
+    updateStatementInfoAction
+} from "../../actions";
 
 @Injectable({providedIn: "root"})
 export class FetchStatementDetailsEffect {
@@ -90,7 +96,7 @@
 
     public fetchConfiguration(statementId: number) {
         return this.settingsApiService.getDepartmentsConfiguration(statementId).pipe(
-            map((configuration) => updateStatementEntityAction({statementId, entity: {configuration}})),
+            map((departments) => updateStatementConfigurationAction({statementId, entity: {departments}})),
             retry(2),
             ignoreError()
         );
@@ -122,7 +128,7 @@
 
     public fetchSectors(statementId: number) {
         return this.statementsApiService.getSectors(statementId).pipe(
-            map((sectors) => updateStatementEntityAction({statementId, entity: {sectors}})),
+            map((sectors) => updateStatementConfigurationAction({statementId, entity: {sectors}})),
             retry(2),
             ignoreError()
         );
diff --git a/src/app/store/statements/effects/fetch-statements.effect.ts b/src/app/store/statements/effects/fetch-statements.effect.ts
deleted file mode 100644
index 956d938..0000000
--- a/src/app/store/statements/effects/fetch-statements.effect.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {Action} from "@ngrx/store";
-import {EMPTY, merge, Observable} from "rxjs";
-import {catchError, filter, map, retry, startWith, switchMap} from "rxjs/operators";
-import {ProcessApiService, StatementsApiService} from "../../../core";
-import {setTasksAction} from "../../process/actions";
-import {addAttachmentsAction, addStatementsAction, fetchStatementDetailsAction, fetchStatementsAction} from "../actions";
-
-@Injectable({providedIn: "root"})
-export class FetchStatementsEffect {
-
-    public readonly fetchStatements$ = createEffect(() => this.actions.pipe(
-        ofType(fetchStatementsAction),
-        switchMap(() => this.fetchStatements())
-    ));
-
-    public readonly fetchStatementDetails$ = createEffect(() => this.actions.pipe(
-        ofType(fetchStatementDetailsAction),
-        filter((action) => typeof action?.statementId === "number"),
-        switchMap((action) => this.fetchStatementDetails(action.statementId))
-    ));
-
-    public constructor(
-        private readonly actions: Actions,
-        private readonly statementsApiService: StatementsApiService,
-        private readonly processApiService: ProcessApiService
-    ) {
-
-    }
-
-    public fetchStatements(): Observable<Action> {
-        return this.statementsApiService.getStatements().pipe(
-            map((statements) => {
-                return addStatementsAction({statements});
-            }),
-            retry(2),
-            catchError(() => EMPTY)
-        );
-    }
-
-    public fetchStatementDetails(statementId: number): Observable<Action> {
-        return this.statementsApiService.getStatement(statementId).pipe(
-            retry(2),
-            switchMap((statement) => {
-                return merge(
-                    this.fetchTasks(statementId),
-                    this.fetchAttachments(statementId)
-                ).pipe(
-                    startWith(addStatementsAction({statements: [statement]}))
-                );
-            }),
-            catchError((error) => {
-                console.error(error);
-                return EMPTY;
-            })
-        );
-    }
-
-    public fetchTasks(statementId: number) {
-        return this.processApiService.getStatementTasks(statementId).pipe(
-            map((tasks) => setTasksAction({statementId, tasks})),
-            retry(2)
-        );
-    }
-
-    public fetchAttachments(statementId: number) {
-        return this.statementsApiService.getAllAttachments(statementId).pipe(
-            map((attachments) => addAttachmentsAction({statementId, attachments})),
-            retry(2)
-        );
-    }
-
-}
diff --git a/src/app/store/statements/effects/fetch-text-arrangement/fetch-text-arrangement.effect.ts b/src/app/store/statements/effects/fetch-text-arrangement/fetch-text-arrangement.effect.ts
new file mode 100644
index 0000000..0a3d27f
--- /dev/null
+++ b/src/app/store/statements/effects/fetch-text-arrangement/fetch-text-arrangement.effect.ts
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Injectable} from "@angular/core";
+import {Actions, createEffect, ofType} from "@ngrx/effects";
+import {Action} from "@ngrx/store";
+import {merge, Observable} from "rxjs";
+import {filter, map, retry, switchMap} from "rxjs/operators";
+import {TextApiService} from "../../../../core";
+import {ignoreError} from "../../../../util";
+import {fetchStatementTextArrangementAction, updateStatementConfigurationAction, updateStatementEntityAction} from "../../actions";
+
+@Injectable({providedIn: "root"})
+export class FetchTextArrangementEffect {
+
+    public fetch$ = createEffect(() => this.actions.pipe(
+        ofType(fetchStatementTextArrangementAction),
+        filter((action) => action.statementId != null),
+        switchMap((action) => this.fetch(action.statementId))
+    ));
+
+    public constructor(private readonly actions: Actions, private readonly textApiService: TextApiService) {
+
+    }
+
+    public fetch(statementId: number): Observable<Action> {
+        return merge(
+            this.fetchArrangement(statementId),
+            this.fetchConfiguration(statementId)
+        );
+    }
+
+    public fetchArrangement(statementId: number) {
+        return this.textApiService.getArrangement(statementId).pipe(
+            map((arrangement) => updateStatementEntityAction({statementId, entity: {arrangement}})),
+            retry(2),
+            ignoreError()
+        );
+    }
+
+    public fetchConfiguration(statementId: number) {
+        return this.textApiService.getConfiguration(statementId).pipe(
+            map((text) => updateStatementConfigurationAction({statementId, entity: {text}})),
+            retry(2),
+            ignoreError()
+        );
+    }
+
+}
+
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/store/statements/effects/fetch-text-arrangement/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/store/statements/effects/fetch-text-arrangement/index.ts
index 7378646..1f7b8be 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/store/statements/effects/fetch-text-arrangement/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./fetch-text-arrangement.effect";
diff --git a/src/app/store/statements/effects/index.ts b/src/app/store/statements/effects/index.ts
index 0a0fc80..7f65784 100644
--- a/src/app/store/statements/effects/index.ts
+++ b/src/app/store/statements/effects/index.ts
@@ -12,7 +12,11 @@
  ********************************************************************************/
 
 export * from "./comments";
+export * from "./compile-statement-arrangement";
 export * from "./fetch-statement-details";
+export * from "./fetch-text-arrangement";
 export * from "./search";
 export * from "./submit-information-form";
+export * from "./submit-statement-editor-form";
 export * from "./submit-workflow-form";
+export * from "./validate-statement-arrangement";
diff --git a/src/app/store/statements/effects/submit-info-form/index.ts b/src/app/store/statements/effects/submit-info-form/index.ts
deleted file mode 100644
index fe8f1a6..0000000
--- a/src/app/store/statements/effects/submit-info-form/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export * from "./submit-info-form.effect";
diff --git a/src/app/store/statements/effects/submit-info-form/submit-info-form.effect.ts b/src/app/store/statements/effects/submit-info-form/submit-info-form.effect.ts
deleted file mode 100644
index d759a05..0000000
--- a/src/app/store/statements/effects/submit-info-form/submit-info-form.effect.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Injectable} from "@angular/core";
-import {Router} from "@angular/router";
-import {Actions, createEffect, ofType} from "@ngrx/effects";
-import {Action} from "@ngrx/store";
-import {concat, Observable} from "rxjs";
-import {catchError, endWith, filter, finalize, map, startWith, switchMap, toArray} from "rxjs/operators";
-import {StatementsApiService} from "../../../../core/api/statements";
-import {ignoreError} from "../../../../util/rxjs";
-import {setNewStatementProgressAction, setStatementDetails, submitNewStatementAction} from "../../actions";
-import {ENewStatementError, IStatementInfoFormValue} from "../../model";
-
-@Injectable({providedIn: "root"})
-export class SubmitInfoFormEffect {
-
-    public readonly new$ = createEffect(() => this.actions.pipe(
-        ofType(submitNewStatementAction),
-        filter((action) => action.value != null),
-        switchMap((action) => this.submitNewStatement(action.value))
-    ));
-
-    public constructor(
-        private readonly actions: Actions,
-        private readonly statementsApiService: StatementsApiService,
-        private readonly router: Router
-    ) {
-
-    }
-
-    public async navigateToStatement(statementId: number) {
-        if (Number.isInteger(statementId)) {
-            return this.router.navigate(["/details"], {queryParams: {id: statementId}});
-        }
-    }
-
-    public submitNewStatement(value: IStatementInfoFormValue): Observable<Action> {
-        return this.createStatement(value).pipe(
-            startWith(setNewStatementProgressAction({isLoading: true})),
-            endWith(setNewStatementProgressAction({isLoading: false})),
-            catchError(async (error) => {
-                console.error(error);
-                return setNewStatementProgressAction({isLoading: false, error: ENewStatementError.UNKNOWN_ERROR});
-            })
-        );
-    }
-
-    public createStatement(value: IStatementInfoFormValue): Observable<Action> {
-        return this.statementsApiService.postStatement({
-            title: value?.title,
-            dueDate: value?.dueDate,
-            receiptDate: value?.receiptDate,
-            typeId: value?.typeId,
-            city: value?.city,
-            district: value?.district
-        }).pipe(
-            switchMap((info) => {
-                return this.attachFiles(info.id, value?.attachments).pipe(
-                    startWith(setStatementDetails({statementId: info.id, details: {info}})),
-                    finalize(() => this.navigateToStatement(info?.id))
-                );
-            })
-        );
-    }
-
-    public attachFiles(statementId: number, attachments?: File[]): Observable<Action> {
-        const postAttachments = (Array.isArray(attachments) ? attachments : [])
-            .filter((file) => file instanceof File)
-            .map((file) => this.statementsApiService.postAttachment(statementId, file).pipe(ignoreError()));
-
-        return concat(...postAttachments).pipe(
-            map((attachment) => attachment.id),
-            toArray(),
-            map((attachmentIds) => setStatementDetails({statementId, details: {attachments: attachmentIds}}))
-        );
-    }
-
-}
diff --git a/src/app/store/statements/effects/submit-information-form/submit-statement-information-form.effect.ts b/src/app/store/statements/effects/submit-information-form/submit-statement-information-form.effect.ts
index b12d55b..02e771a 100644
--- a/src/app/store/statements/effects/submit-information-form/submit-statement-information-form.effect.ts
+++ b/src/app/store/statements/effects/submit-information-form/submit-statement-information-form.effect.ts
@@ -17,11 +17,9 @@
 import {Action} from "@ngrx/store";
 import {concat, defer, EMPTY, Observable} from "rxjs";
 import {catchError, endWith, exhaustMap, filter, map, startWith, switchMap} from "rxjs/operators";
-import {EAPIProcessTaskDefinitionKey} from "../../../../core/api";
-import {ProcessApiService} from "../../../../core/api/process";
-import {StatementsApiService} from "../../../../core/api/statements";
+import {EAPIProcessTaskDefinitionKey, ProcessApiService, StatementsApiService} from "../../../../core";
 import {ignoreError} from "../../../../util/rxjs";
-import {AddOrRemoveAttachmentsEffect} from "../../../attachments/effects/add-or-remove";
+import {SubmitAttachmentsEffect} from "../../../attachments/effects/submit";
 import {CompleteTaskEffect} from "../../../process/effects";
 import {setStatementLoadingAction, submitStatementInformationFormAction} from "../../actions";
 import {IStatementInformationFormValue} from "../../model";
@@ -43,7 +41,7 @@
     public constructor(
         private readonly actions: Actions,
         private readonly router: Router,
-        private readonly addOrRemoveAttachmentsEffect: AddOrRemoveAttachmentsEffect,
+        private readonly submitAttachmentsEffect: SubmitAttachmentsEffect,
         private readonly completeTaskEffect: CompleteTaskEffect,
         private readonly processApiService: ProcessApiService,
         private readonly statementsApiService: StatementsApiService,
@@ -59,9 +57,7 @@
     ): Observable<Action> {
         return this.updateStatement(statementId, taskId, value).pipe(
             switchMap(() => {
-                const addOrRemoveAttachments$ = this.addOrRemoveAttachmentsEffect.addOrRemoveAttachments(
-                    statementId, taskId, value.addAttachments, value.removeAttachments
-                ).pipe(
+                const submitAttachments$ = this.submitAttachmentsEffect.submit(statementId, taskId, value?.attachments).pipe(
                     catchError(() => {
                         responsible = undefined;
                         return EMPTY;
@@ -69,7 +65,7 @@
                 );
 
                 return concat(
-                    addOrRemoveAttachments$,
+                    submitAttachments$,
                     defer(() => this.finalizeSubmit(statementId, taskId, responsible))
                 );
             }),
@@ -90,9 +86,7 @@
             switchMap(() => this.completeTaskEffect.claimNextTask(statementId, EAPIProcessTaskDefinitionKey.ADD_BASIC_INFO_DATA)),
             switchMap((task) => {
                 taskId = task?.taskId;
-                const addOrRemoveAttachments$ = this.addOrRemoveAttachmentsEffect.addOrRemoveAttachments(
-                    statementId, taskId, value.addAttachments, value.removeAttachments
-                ).pipe(
+                const submitAttachments$ = this.submitAttachmentsEffect.submit(statementId, taskId, value?.attachments).pipe(
                     catchError(() => {
                         responsible = undefined;
                         return EMPTY;
@@ -100,7 +94,7 @@
                 );
 
                 return concat(
-                    addOrRemoveAttachments$,
+                    submitAttachments$,
                     defer(() => this.finalizeSubmit(statementId, taskId, responsible))
                 );
             }),
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/store/statements/effects/submit-statement-editor-form/index.ts
similarity index 90%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/store/statements/effects/submit-statement-editor-form/index.ts
index 7378646..b3a86ac 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/store/statements/effects/submit-statement-editor-form/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./submit-statement-editor-form.effect";
diff --git a/src/app/store/statements/effects/submit-statement-editor-form/submit-statement-editor-form.effect.ts b/src/app/store/statements/effects/submit-statement-editor-form/submit-statement-editor-form.effect.ts
new file mode 100644
index 0000000..4c9b4b0
--- /dev/null
+++ b/src/app/store/statements/effects/submit-statement-editor-form/submit-statement-editor-form.effect.ts
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Injectable} from "@angular/core";
+import {Actions, createEffect, ofType} from "@ngrx/effects";
+import {Action} from "@ngrx/store";
+import {concat, Observable} from "rxjs";
+import {endWith, filter, map, retry, startWith, switchMap} from "rxjs/operators";
+import {IAPITextArrangementItemModel, TextApiService} from "../../../../core";
+import {ignoreError} from "../../../../util";
+import {SubmitAttachmentsEffect} from "../../../attachments/effects";
+import {setStatementLoadingAction, submitStatementEditorFormAction, updateStatementEntityAction} from "../../actions";
+import {IStatementEditorFormValue} from "../../model";
+
+@Injectable({providedIn: "root"})
+export class SubmitStatementEditorFormEffect {
+
+    public submit$ = createEffect(() => this.actions.pipe(
+        ofType(submitStatementEditorFormAction),
+        filter((action) => action.statementId != null && action.taskId != null),
+        switchMap((action) => this.submit(action.statementId, action.taskId, action.value))
+    ));
+
+    public constructor(
+        private readonly actions: Actions,
+        private readonly submitAttachmentsEffect: SubmitAttachmentsEffect,
+        private readonly textApiService: TextApiService
+    ) {
+
+    }
+
+    public submit(statementId: number, taskId: string, value: IStatementEditorFormValue): Observable<Action> {
+        return concat(
+            this.submitArrangement(statementId, taskId, value.arrangement),
+            this.submitAttachmentsEffect.submit(statementId, taskId, value.attachments)
+        ).pipe(
+            ignoreError(),
+            startWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: true}})),
+            endWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: false}}))
+        );
+    }
+
+    public submitArrangement(statementId: number, taskId: string, arrangement: IAPITextArrangementItemModel[]): Observable<Action> {
+        return this.textApiService.postArrangement(statementId, taskId, arrangement).pipe(
+            map(() => updateStatementEntityAction({statementId, entity: {arrangement}})),
+            retry(2)
+        );
+    }
+
+}
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/store/statements/effects/validate-statement-arrangement/index.ts
similarity index 90%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/store/statements/effects/validate-statement-arrangement/index.ts
index 7378646..6c07505 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/store/statements/effects/validate-statement-arrangement/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./validate-statement-arrangement.effect";
diff --git a/src/app/store/statements/effects/validate-statement-arrangement/validate-statement-arrangement.effect.ts b/src/app/store/statements/effects/validate-statement-arrangement/validate-statement-arrangement.effect.ts
new file mode 100644
index 0000000..300498c
--- /dev/null
+++ b/src/app/store/statements/effects/validate-statement-arrangement/validate-statement-arrangement.effect.ts
@@ -0,0 +1,51 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {Injectable} from "@angular/core";
+import {Actions, createEffect, ofType} from "@ngrx/effects";
+import {Action} from "@ngrx/store";
+import {Observable, of} from "rxjs";
+import {endWith, filter, startWith, switchMap} from "rxjs/operators";
+import {IAPITextArrangementItemModel, TextApiService} from "../../../../core";
+import {ignoreError} from "../../../../util/rxjs";
+import {setStatementErrorAction, setStatementLoadingAction, validateStatementArrangementAction} from "../../actions";
+
+@Injectable({providedIn: "root"})
+export class ValidateStatementArrangementEffect {
+
+    public validate$ = createEffect(() => this.actions.pipe(
+        ofType(validateStatementArrangementAction),
+        filter((action) => action.statementId != null && action.taskId != null),
+        switchMap((action) => this.validate(action.statementId, action.taskId, action.arrangement))
+    ));
+
+    public constructor(private readonly actions: Actions, private readonly textApiService: TextApiService) {
+
+    }
+
+    public validate(statementId: number, taskId: string, arrangement: IAPITextArrangementItemModel[]): Observable<Action> {
+        return this.textApiService.validateArrangement(statementId, taskId, arrangement).pipe(
+            switchMap((result) => {
+                return of(
+                    result.valid ?
+                        setStatementErrorAction({statementId, error: {arrangement: null}}) :
+                        setStatementErrorAction({statementId, error: {arrangement: result.errors}})
+                );
+            }),
+            ignoreError(),
+            startWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: true}})),
+            endWith(setStatementLoadingAction({loading: {submittingStatementEditorForm: false}}))
+        );
+    }
+
+}
diff --git a/src/app/store/statements/model/INewStatementStoreState.ts b/src/app/store/statements/model/INewStatementStoreState.ts
deleted file mode 100644
index 4e9d19b..0000000
--- a/src/app/store/statements/model/INewStatementStoreState.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export interface INewStatementStoreState {
-
-    form?: INewStatementForm;
-
-    isLoading?: boolean;
-
-    error?: string;
-
-}
-
-export interface INewStatementForm {
-
-    title: string;
-
-    receiptDate: string;
-
-    dueDate: string;
-
-    typeId: number;
-
-    city: string;
-
-    district: string;
-
-    attachments?: File[];
-
-}
diff --git a/src/app/store/statements/model/IStatementConfigurationEntity.ts b/src/app/store/statements/model/IStatementConfigurationEntity.ts
new file mode 100644
index 0000000..2d7466e
--- /dev/null
+++ b/src/app/store/statements/model/IStatementConfigurationEntity.ts
@@ -0,0 +1,26 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPIDepartmentsConfiguration} from "../../../core/api/settings";
+import {IAPISectorsModel} from "../../../core/api/statements/IAPISectorsModel";
+import {IAPIStatementTextConfigurationModel} from "../../../core/api/text";
+
+export interface IStatementConfigurationEntity {
+
+    text?: IAPIStatementTextConfigurationModel;
+
+    sectors?: IAPISectorsModel;
+
+    departments?: IAPIDepartmentsConfiguration;
+
+}
diff --git a/src/app/store/statements/model/IStatementEntity.ts b/src/app/store/statements/model/IStatementEntity.ts
index 02f9465..3ac3430 100644
--- a/src/app/store/statements/model/IStatementEntity.ts
+++ b/src/app/store/statements/model/IStatementEntity.ts
@@ -11,9 +11,8 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIDepartmentsConfiguration} from "../../../core/api/settings";
 import {IAPICommentModel, IAPIStatementModel, IAPIWorkflowData} from "../../../core/api/statements";
-import {IAPISectorsModel} from "../../../core/api/statements/IAPISectorsModel";
+import {IAPITextArrangementItemModel} from "../../../core/api/text";
 
 export interface IStatementEntity {
 
@@ -21,12 +20,12 @@
 
     workflow?: IAPIWorkflowData;
 
-    configuration?: IAPIDepartmentsConfiguration;
-
     parentIds?: number[];
 
     comments?: IAPICommentModel[];
 
-    sectors?: IAPISectorsModel;
+    arrangement?: IAPITextArrangementItemModel[];
+
+    file?: File;
 
 }
diff --git a/src/app/store/statements/model/ENewStatementError.ts b/src/app/store/statements/model/IStatementErrorEntity.ts
similarity index 77%
rename from src/app/store/statements/model/ENewStatementError.ts
rename to src/app/store/statements/model/IStatementErrorEntity.ts
index 6842926..d700fef 100644
--- a/src/app/store/statements/model/ENewStatementError.ts
+++ b/src/app/store/statements/model/IStatementErrorEntity.ts
@@ -10,11 +10,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
+import {IAPITextArrangementErrorModel} from "../../../core/api/text";
 
-export enum ENewStatementError {
+export interface IStatementErrorEntity {
 
-    "UNKNOWN_ERROR" = "new.error.unknownError",
-
-    "INVALID_FORM" = "new.error.invalidForm"
+    arrangement?: IAPITextArrangementErrorModel[];
 
 }
diff --git a/src/app/store/statements/model/IStatementLoadingState.ts b/src/app/store/statements/model/IStatementLoadingEntity.ts
similarity index 88%
rename from src/app/store/statements/model/IStatementLoadingState.ts
rename to src/app/store/statements/model/IStatementLoadingEntity.ts
index 1241eb7..d0b7a36 100644
--- a/src/app/store/statements/model/IStatementLoadingState.ts
+++ b/src/app/store/statements/model/IStatementLoadingEntity.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface IStatementLoadingState {
+export interface IStatementLoadingEntity {
 
     search?: boolean;
 
@@ -19,4 +19,6 @@
 
     submittingWorkflowData?: boolean;
 
+    submittingStatementEditorForm?: boolean;
+
 }
diff --git a/src/app/store/statements/model/IStatementsStoreState.ts b/src/app/store/statements/model/IStatementsStoreState.ts
index d1d3392..5eb56d8 100644
--- a/src/app/store/statements/model/IStatementsStoreState.ts
+++ b/src/app/store/statements/model/IStatementsStoreState.ts
@@ -13,18 +13,21 @@
 
 import {IAPIPaginationResponse} from "../../../core";
 import {TStoreEntities} from "../../../util/store";
+import {IStatementConfigurationEntity} from "./IStatementConfigurationEntity";
 import {IStatementEntity} from "./IStatementEntity";
-import {IStatementLoadingState} from "./IStatementLoadingState";
-import {IStatementInfoForm} from "./statement-info-form/IStatementInfoForm";
+import {IStatementErrorEntity} from "./IStatementErrorEntity";
+import {IStatementLoadingEntity} from "./IStatementLoadingEntity";
 
 export interface IStatementsStoreState {
 
     entities: TStoreEntities<IStatementEntity>;
 
+    configuration?: TStoreEntities<IStatementConfigurationEntity>;
+
+    error?: TStoreEntities<IStatementErrorEntity>;
+
     search?: IAPIPaginationResponse<number>;
 
-    newStatementForm?: IStatementInfoForm;
-
-    loading?: IStatementLoadingState;
+    loading?: IStatementLoadingEntity;
 
 }
diff --git a/src/app/store/statements/model/index.ts b/src/app/store/statements/model/index.ts
index 82542a2..269652f 100644
--- a/src/app/store/statements/model/index.ts
+++ b/src/app/store/statements/model/index.ts
@@ -11,6 +11,9 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+export * from "./statement-editor-form/IStatementEditorControlConfiguration";
+export * from "./statement-editor-form/IStatementEditorFormValue";
+
 export * from "./statement-info-form/ENewStatementError";
 export * from "./statement-info-form/IStatementInfoForm";
 export * from "./statement-info-form/IStatementInformationFormValue";
@@ -18,6 +21,8 @@
 export * from "./workflow-form/IWorkflowFormValue";
 export * from "./workflow-form/IDepartmentOptionValue";
 
-export * from "./IStatementsStoreState";
-export * from "./IStatementLoadingState";
+export * from "./IStatementConfigurationEntity";
 export * from "./IStatementEntity";
+export * from "./IStatementErrorEntity";
+export * from "./IStatementLoadingEntity";
+export * from "./IStatementsStoreState";
diff --git a/src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts b/src/app/store/statements/model/statement-editor-form/IStatementEditorControlConfiguration.ts
similarity index 61%
copy from src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts
copy to src/app/store/statements/model/statement-editor-form/IStatementEditorControlConfiguration.ts
index 663231b..698dcae 100644
--- a/src/app/store/statements/model/statement-info-form/IStatementInfoFormValue.ts
+++ b/src/app/store/statements/model/statement-editor-form/IStatementEditorControlConfiguration.ts
@@ -11,20 +11,17 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface IStatementInfoFormValue {
+import {IAPITextArrangementItemModel, IAPITextBlockModel} from "../../../../core/api/text";
+import {TStoreEntities} from "../../../../util/store";
 
-    title: string;
+export interface IStatementEditorControlConfiguration {
 
-    receiptDate: string;
+    textBlock?: IAPITextBlockModel;
 
-    dueDate: string;
+    selects: TStoreEntities<string[]>;
 
-    typeId: number;
+    replacements: TStoreEntities<string>;
 
-    city: string;
-
-    district: string;
-
-    attachments?: File[];
+    value: IAPITextArrangementItemModel;
 
 }
diff --git a/src/app/store/statements/model/ENewStatementError.ts b/src/app/store/statements/model/statement-editor-form/IStatementEditorFormValue.ts
similarity index 68%
copy from src/app/store/statements/model/ENewStatementError.ts
copy to src/app/store/statements/model/statement-editor-form/IStatementEditorFormValue.ts
index 6842926..aa071d2 100644
--- a/src/app/store/statements/model/ENewStatementError.ts
+++ b/src/app/store/statements/model/statement-editor-form/IStatementEditorFormValue.ts
@@ -11,10 +11,13 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export enum ENewStatementError {
+import {IAPITextArrangementItemModel} from "../../../../core";
+import {IAttachmentFormValue} from "../../../attachments/model";
 
-    "UNKNOWN_ERROR" = "new.error.unknownError",
+export interface IStatementEditorFormValue {
 
-    "INVALID_FORM" = "new.error.invalidForm"
+    arrangement: IAPITextArrangementItemModel[];
+
+    attachments?: IAttachmentFormValue;
 
 }
diff --git a/src/app/store/statements/model/statement-info-form/IStatementInformationFormValue.ts b/src/app/store/statements/model/statement-info-form/IStatementInformationFormValue.ts
index e21e896..1821844 100644
--- a/src/app/store/statements/model/statement-info-form/IStatementInformationFormValue.ts
+++ b/src/app/store/statements/model/statement-info-form/IStatementInformationFormValue.ts
@@ -12,11 +12,10 @@
  ********************************************************************************/
 
 import {IAPIPartialStatementModel} from "../../../../core/api/statements";
+import {IAttachmentFormValue} from "../../../attachments/model";
 
 export interface IStatementInformationFormValue extends IAPIPartialStatementModel {
 
-    addAttachments?: File[];
-
-    removeAttachments?: number[];
+    attachments?: IAttachmentFormValue;
 
 }
diff --git a/src/app/store/statements/reducers/configuration/statement-configuration.reducer.ts b/src/app/store/statements/reducers/configuration/statement-configuration.reducer.ts
new file mode 100644
index 0000000..50aabcd
--- /dev/null
+++ b/src/app/store/statements/reducers/configuration/statement-configuration.reducer.ts
@@ -0,0 +1,23 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {createReducer, on} from "@ngrx/store";
+import {updateEntitiesObject} from "../../../../util/store";
+import {updateStatementConfigurationAction} from "../../actions";
+
+export const statementConfigurationReducer = createReducer(
+    {},
+    on(updateStatementConfigurationAction, (state, payload) => {
+        return payload == null ? state : updateEntitiesObject(state, [payload.entity], () => payload.statementId);
+    })
+);
diff --git a/src/app/store/statements/reducers/entities.reducer.ts b/src/app/store/statements/reducers/entities.reducer.ts
deleted file mode 100644
index 87e4711..0000000
--- a/src/app/store/statements/reducers/entities.reducer.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Action, createReducer, on} from "@ngrx/store";
-import {arrayJoin, filterDistinctValues, TStoreEntities} from "../../../util";
-import {addAttachmentsAction, addStatementsAction} from "../actions";
-import {IStatementEntity} from "../model";
-
-export const statementsEntitiesReducer = createReducer<TStoreEntities<IStatementEntity>, Action>(
-    {},
-    on(addStatementsAction, (state, payload) => {
-        const statements = (Array.isArray(payload?.statements) ? payload.statements : [])
-            .filter((statement) => typeof statement?.id === "number");
-
-        if (statements.length === 0) {
-            return state;
-        }
-
-        state = state == null ? {} : {...state};
-
-        statements.forEach((statement) => {
-            const attachments = filterDistinctValues(arrayJoin(state[statement.id]?.attachments, statement?.attachments));
-            state[statement.id] = {
-                ...state[statement.id],
-                ...statement,
-                attachments: attachments.length > 0 ? attachments : undefined
-            };
-        });
-
-        return state;
-    }),
-    on(addAttachmentsAction, (state, payload) => {
-        const id = payload?.statementId;
-        const statement = id == null || state == null ? undefined : state[id];
-
-        const attachments = (Array.isArray(payload?.attachments) ? payload.attachments : [])
-            .map((attachment) => attachment.id);
-
-        return statement == null || attachments.length === 0 ? state : {
-            ...state,
-            [id]: {
-                ...statement,
-                attachments: filterDistinctValues(arrayJoin(statement?.attachments, attachments))
-            }
-        };
-    })
-);
diff --git a/src/app/store/statements/reducers/error/statement-error.reducer.ts b/src/app/store/statements/reducers/error/statement-error.reducer.ts
new file mode 100644
index 0000000..15e2462
--- /dev/null
+++ b/src/app/store/statements/reducers/error/statement-error.reducer.ts
@@ -0,0 +1,24 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {createReducer, on} from "@ngrx/store";
+import {TStoreEntities, updateEntitiesObject} from "../../../../util";
+import {setStatementErrorAction} from "../../actions";
+import {IStatementErrorEntity} from "../../model";
+
+export const statementErrorReducer = createReducer<TStoreEntities<IStatementErrorEntity>>(
+    undefined,
+    on(setStatementErrorAction, (state, payload) => {
+        return payload == null ? state : updateEntitiesObject(state, [payload.error], () => payload.statementId);
+    })
+);
diff --git a/src/app/store/statements/reducers/index.ts b/src/app/store/statements/reducers/index.ts
index 317b0f6..0ee4fe8 100644
--- a/src/app/store/statements/reducers/index.ts
+++ b/src/app/store/statements/reducers/index.ts
@@ -11,7 +11,8 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
+export * from "./configuration/statement-configuration.reducer";
 export * from "./entities/statement-entities.reducer";
+export * from "./error/statement-error.reducer";
 export * from "./loading/statement-loading.reducer";
 export * from "./search/statement-search.reducer";
-export * from "./new-statement/new-statement-form.reducer";
diff --git a/src/app/store/statements/reducers/loading/statement-loading.reducer.spec.ts b/src/app/store/statements/reducers/loading/statement-loading.reducer.spec.ts
index 487d734..9970e80 100644
--- a/src/app/store/statements/reducers/loading/statement-loading.reducer.spec.ts
+++ b/src/app/store/statements/reducers/loading/statement-loading.reducer.spec.ts
@@ -12,13 +12,13 @@
  ********************************************************************************/
 
 import {setStatementLoadingAction} from "../../actions";
-import {IStatementLoadingState} from "../../model";
+import {IStatementLoadingEntity} from "../../model";
 import {statementLoadingReducer} from "./statement-loading.reducer";
 
 describe("statementLoadingReducer", () => {
 
     it("should update loading state  ", () => {
-        const initialState: IStatementLoadingState = {search: true};
+        const initialState: IStatementLoadingEntity = {search: true};
         let action = setStatementLoadingAction({loading: {}});
         let state = statementLoadingReducer(initialState, action);
         expect(state).toEqual(initialState);
diff --git a/src/app/store/statements/reducers/loading/statement-loading.reducer.ts b/src/app/store/statements/reducers/loading/statement-loading.reducer.ts
index 8ef62ea..ccdafa7 100644
--- a/src/app/store/statements/reducers/loading/statement-loading.reducer.ts
+++ b/src/app/store/statements/reducers/loading/statement-loading.reducer.ts
@@ -13,9 +13,9 @@
 
 import {createReducer, on} from "@ngrx/store";
 import {setStatementLoadingAction} from "../../actions";
-import {IStatementLoadingState} from "../../model";
+import {IStatementLoadingEntity} from "../../model";
 
-export const statementLoadingReducer = createReducer<IStatementLoadingState>(
+export const statementLoadingReducer = createReducer<IStatementLoadingEntity>(
     undefined,
     on(setStatementLoadingAction, (state, action) => ({...state, ...action.loading}))
 );
diff --git a/src/app/store/statements/reducers/new-statement-form.reducer.spec.ts b/src/app/store/statements/reducers/new-statement-form.reducer.spec.ts
deleted file mode 100644
index 3596ebd..0000000
--- a/src/app/store/statements/reducers/new-statement-form.reducer.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {clearNewStatementFormAction, setNewStatementProgressAction, submitNewStatementAction} from "../actions";
-import {IStatementInfoForm, IStatementInfoFormValue} from "../model";
-import {newStatementFormReducer} from "./new-statement-form.reducer";
-
-describe("newStatementFormReducer", () => {
-
-    const value = {} as IStatementInfoFormValue;
-
-    it("should update the form value on submit", () => {
-        const initialState = undefined;
-        const action = submitNewStatementAction({value});
-        const state = newStatementFormReducer(initialState, action);
-        expect(state).toEqual({value, isLoading: true, error: undefined});
-    });
-
-    it("should clear the form", () => {
-        const initialState = {} as IStatementInfoForm;
-        const action = clearNewStatementFormAction();
-        const state = newStatementFormReducer(initialState, action);
-        expect(state).toEqual(undefined);
-    });
-
-    it("should update the progress information", () => {
-        const action = setNewStatementProgressAction({isLoading: true, error: undefined});
-        const state = newStatementFormReducer({value}, action);
-        expect(state).toEqual({value, isLoading: true, error: undefined});
-    });
-
-});
diff --git a/src/app/store/statements/reducers/new-statement-form.reducer.ts b/src/app/store/statements/reducers/new-statement-form.reducer.ts
deleted file mode 100644
index 87802d0..0000000
--- a/src/app/store/statements/reducers/new-statement-form.reducer.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createReducer, on} from "@ngrx/store";
-import {clearNewStatementFormAction, setNewStatementProgressAction, submitNewStatementAction} from "../actions";
-import {IStatementInfoForm} from "../model";
-
-export const newStatementFormReducer = createReducer<IStatementInfoForm>(
-    undefined,
-    on(submitNewStatementAction, (state, payload) => {
-        return {
-            value: payload.value,
-            isLoading: true,
-            error: undefined
-        };
-    }),
-    on(clearNewStatementFormAction, () => undefined),
-    on(setNewStatementProgressAction, (state, payload) => {
-        return {
-            ...state,
-            isLoading: payload.isLoading,
-            error: payload.error
-        };
-    })
-);
diff --git a/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.spec.ts b/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.spec.ts
deleted file mode 100644
index 0518e7b..0000000
--- a/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {clearNewStatementFormAction, setNewStatementProgressAction, submitNewStatementAction} from "../../actions";
-import {IStatementInfoForm, IStatementInformationFormValue} from "../../model";
-import {newStatementFormReducer} from "./new-statement-form.reducer";
-
-describe("newStatementFormReducer", () => {
-
-    const value = {} as IStatementInformationFormValue;
-
-    it("should update the form value on submit", () => {
-        const initialState = undefined;
-        const action = submitNewStatementAction({value});
-        const state = newStatementFormReducer(initialState, action);
-        expect(state).toEqual({value, isLoading: true, error: undefined});
-    });
-
-    it("should clear the form", () => {
-        const initialState = {} as IStatementInfoForm;
-        const action = clearNewStatementFormAction();
-        const state = newStatementFormReducer(initialState, action);
-        expect(state).toEqual(undefined);
-    });
-
-    it("should update the progress information", () => {
-        const action = setNewStatementProgressAction({isLoading: true, error: undefined});
-        const state = newStatementFormReducer({value}, action);
-        expect(state).toEqual({value, isLoading: true, error: undefined});
-    });
-
-});
diff --git a/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.ts b/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.ts
deleted file mode 100644
index e88fdcf..0000000
--- a/src/app/store/statements/reducers/new-statement/new-statement-form.reducer.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createReducer, on} from "@ngrx/store";
-import {clearNewStatementFormAction, setNewStatementProgressAction, submitNewStatementAction} from "../../actions";
-import {IStatementInfoForm} from "../../model";
-
-export const newStatementFormReducer = createReducer<IStatementInfoForm>(
-    undefined,
-    on(submitNewStatementAction, (state, payload) => {
-        return {
-            value: payload.value,
-            isLoading: true,
-            error: undefined
-        };
-    }),
-    on(clearNewStatementFormAction, () => undefined),
-    on(setNewStatementProgressAction, (state, payload) => {
-        return {
-            ...state,
-            isLoading: payload.isLoading,
-            error: payload.error
-        };
-    })
-);
diff --git a/src/app/store/statements/reducers/new.reducer.ts b/src/app/store/statements/reducers/new.reducer.ts
deleted file mode 100644
index 0a39a20..0000000
--- a/src/app/store/statements/reducers/new.reducer.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {Action, createReducer, on} from "@ngrx/store";
-import {addNewStatementAction, clearNewStatementFormAction, setNewStatementProgressAction} from "../actions";
-import {INewStatementStoreState} from "../model";
-
-export const newStatementReducer = createReducer<INewStatementStoreState, Action>(
-    {},
-    on(addNewStatementAction, (state, payload): INewStatementStoreState => {
-        return {
-            ...state,
-            form: {...payload.form}
-        };
-    }),
-    on(clearNewStatementFormAction, (state): INewStatementStoreState => {
-        return {
-            ...state,
-            form: undefined
-        };
-    }),
-    on(setNewStatementProgressAction, (state, payload): INewStatementStoreState => {
-        return {...state, isLoading: payload?.isLoading, error: payload?.error};
-    })
-);
diff --git a/src/app/store/statements/reducers/statement-entities.reducer.spec.ts b/src/app/store/statements/reducers/statement-entities.reducer.spec.ts
deleted file mode 100644
index 8816481..0000000
--- a/src/app/store/statements/reducers/statement-entities.reducer.spec.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {fetchStatementDetailsAction, setStatementDetails} from "../actions";
-import {statementEntitiesReducer} from "./statement-entities.reducer";
-
-describe("statementEntitiesReducer", () => {
-
-    it("should not affect state on fetch action", () => {
-        const initialState = {};
-        const action = fetchStatementDetailsAction({statementId: 19});
-        const state = statementEntitiesReducer(initialState, action);
-        expect(state).toBe(initialState);
-    });
-
-    it("should create new entity of statement on set action", () => {
-        const initialState = {};
-        const entity = {info: {} as any};
-        const action = setStatementDetails({statementId: 19, details: entity});
-        const state = statementEntitiesReducer(initialState, action);
-        expect(state).toEqual({
-            19: {
-                info: {} as any
-            }
-        });
-    });
-
-    it("should update entity of statement on set action", () => {
-        const initialState = {18: {} as any, 19: {workflow: {} as any}};
-        const entity = {info: {}} as any;
-        const action = setStatementDetails({statementId: 19, details: entity});
-        const state = statementEntitiesReducer(initialState, action);
-        expect(state).toEqual({
-            18: {},
-            19: {
-                info: {} as any,
-                workflow: {} as any
-            }
-        });
-    });
-
-    it("should not change state without any id", () => {
-        const initialState = {18: {} as any, 19: {workflow: {} as any}};
-        const action = setStatementDetails({statementId: undefined, details: {}});
-        let state = statementEntitiesReducer(initialState, action);
-        expect(state).toEqual(initialState);
-        state = statementEntitiesReducer(initialState, {type: "SpecAction"});
-        expect(state).toEqual(initialState);
-    });
-
-});
diff --git a/src/app/store/statements/reducers/statement-entities.reducer.ts b/src/app/store/statements/reducers/statement-entities.reducer.ts
deleted file mode 100644
index 95253b5..0000000
--- a/src/app/store/statements/reducers/statement-entities.reducer.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createReducer, on} from "@ngrx/store";
-import {TStoreEntities} from "../../../util/store";
-import {setStatementDetails} from "../actions";
-import {IStatementEntity} from "../model";
-
-export const statementEntitiesReducer = createReducer<TStoreEntities<IStatementEntity>>(
-    {},
-    on(setStatementDetails, (state, payload) => {
-        return payload.statementId == null ? state : {
-            ...state,
-            [payload.statementId]: {
-                ...state[payload.statementId],
-                ...payload.details
-            }
-        };
-    })
-);
diff --git a/src/app/store/statements/selectors/index.ts b/src/app/store/statements/selectors/index.ts
index be2e36b..2d14f26 100644
--- a/src/app/store/statements/selectors/index.ts
+++ b/src/app/store/statements/selectors/index.ts
@@ -12,9 +12,11 @@
  ********************************************************************************/
 
 export * from "./list/statement-list.selectors";
-export * from "./new-statement-form/new-statement-form.selectors";
 export * from "./search";
+export * from "./statement-editor-form";
 export * from "./statement-information-form/statement-information-form.selectors";
 export * from "./workflow-form/workflow-form.selectors";
 
+export * from "./statement.selectors";
+export * from "./statement-configuration.selectors";
 export * from "./statements-store-state.selectors";
diff --git a/src/app/store/statements/selectors/list/statement-list.selectors.ts b/src/app/store/statements/selectors/list/statement-list.selectors.ts
index ec7acec..4590bb2 100644
--- a/src/app/store/statements/selectors/list/statement-list.selectors.ts
+++ b/src/app/store/statements/selectors/list/statement-list.selectors.ts
@@ -12,7 +12,7 @@
  ********************************************************************************/
 
 import {createSelector} from "@ngrx/store";
-import {statementEntitiesSelector} from "../statements-store-state.selectors";
+import {statementEntitiesSelector} from "../statement.selectors";
 
 export const statementListSelector = createSelector(
     statementEntitiesSelector,
diff --git a/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.spec.ts b/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.spec.ts
deleted file mode 100644
index 31ec7aa..0000000
--- a/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {IStatementInfoForm} from "../../model";
-import {
-    newStatementFormErrorSelector,
-    newStatementFormLoadingSelector,
-    newStatementFormValueSelector
-} from "./new-statement-form.selectors";
-
-describe("statementSelectors", () => {
-
-    const value = {} as any;
-    const isLoading = true;
-    const error = "Test Error";
-    const newStatementForm: IStatementInfoForm = {value, isLoading, error};
-
-    it("newStatementFormValueSelector should return a value if available", () => {
-        expect(newStatementFormValueSelector.projector(null)).toEqual(undefined);
-        expect(newStatementFormValueSelector.projector(undefined)).toEqual(undefined);
-        expect(newStatementFormValueSelector.projector({})).toEqual(undefined);
-        expect(newStatementFormValueSelector.projector({newStatementForm: null})).toEqual(undefined);
-        expect(newStatementFormValueSelector.projector({newStatementForm})).toEqual(value);
-    });
-
-    it("newStatementFormLoadingSelector should return a value if available", () => {
-        expect(newStatementFormLoadingSelector.projector(null)).toEqual(undefined);
-        expect(newStatementFormLoadingSelector.projector(undefined)).toEqual(undefined);
-        expect(newStatementFormLoadingSelector.projector({})).toEqual(undefined);
-        expect(newStatementFormLoadingSelector.projector({newStatementForm: null})).toEqual(undefined);
-        expect(newStatementFormLoadingSelector.projector({newStatementForm})).toEqual(isLoading);
-    });
-
-    it("newStatementFormErrorSelector should return a value if available", () => {
-        expect(newStatementFormErrorSelector.projector(null)).toEqual(undefined);
-        expect(newStatementFormErrorSelector.projector(undefined)).toEqual(undefined);
-        expect(newStatementFormErrorSelector.projector({})).toEqual(undefined);
-        expect(newStatementFormErrorSelector.projector({newStatementForm: null})).toEqual(undefined);
-        expect(newStatementFormErrorSelector.projector({newStatementForm})).toEqual(error);
-    });
-
-});
diff --git a/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.ts b/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.ts
deleted file mode 100644
index 5976880..0000000
--- a/src/app/store/statements/selectors/new-statement-form/new-statement-form.selectors.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createSelector} from "@ngrx/store";
-import {statementsStoreStateSelector} from "../statements-store-state.selectors";
-
-export const newStatementFormValueSelector = createSelector(
-    statementsStoreStateSelector,
-    (state) => state?.newStatementForm?.value
-);
-
-export const newStatementFormLoadingSelector = createSelector(
-    statementsStoreStateSelector,
-    (state) => state?.newStatementForm?.isLoading
-);
-
-export const newStatementFormErrorSelector = createSelector(
-    statementsStoreStateSelector,
-    (state) => state?.newStatementForm?.error
-);
diff --git a/src/app/store/statements/selectors/new-statement.selectors.ts b/src/app/store/statements/selectors/new-statement.selectors.ts
deleted file mode 100644
index fcd07c7..0000000
--- a/src/app/store/statements/selectors/new-statement.selectors.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createSelector} from "@ngrx/store";
-import {statementsStateSelector} from "./statements.selectors";
-
-export const newStatementStateSelector = createSelector(
-    statementsStateSelector,
-    (state) => state?.new
-);
-
-export const newStatementFormSelector = createSelector(
-    newStatementStateSelector,
-    (state) => ({...state?.form})
-);
-
-export const newStatementLoadingSelector = createSelector(
-    newStatementStateSelector,
-    (state) => state?.isLoading
-);
-
-export const newStatementErrorSelector = createSelector(
-    newStatementStateSelector,
-    (state) => state?.error
-);
diff --git a/src/app/store/statements/selectors/search/statement-search.selectors.ts b/src/app/store/statements/selectors/search/statement-search.selectors.ts
index 9ffa58f..d88147f 100644
--- a/src/app/store/statements/selectors/search/statement-search.selectors.ts
+++ b/src/app/store/statements/selectors/search/statement-search.selectors.ts
@@ -12,7 +12,8 @@
  ********************************************************************************/
 
 import {createSelector} from "@ngrx/store";
-import {getStatementSearchSelector, statementEntitiesSelector} from "../statements-store-state.selectors";
+import {statementEntitiesSelector} from "../statement.selectors";
+import {getStatementSearchSelector} from "../statements-store-state.selectors";
 
 export const getSearchContentStatementsSelector = createSelector(
     statementEntitiesSelector,
diff --git a/src/app/store/statements/selectors/statement-configuration.selectors.ts b/src/app/store/statements/selectors/statement-configuration.selectors.ts
new file mode 100644
index 0000000..8a5a82a
--- /dev/null
+++ b/src/app/store/statements/selectors/statement-configuration.selectors.ts
@@ -0,0 +1,45 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {createSelector} from "@ngrx/store";
+import {selectEntityWithIdProjector, selectPropertyProjector} from "../../../util/store";
+import {queryParamsIdSelector} from "../../root/selectors";
+import {settingsStoreSelector} from "../../settings/selectors";
+import {statementsStoreStateSelector} from "./statements-store-state.selectors";
+
+export const statementConfigurationEntitiesSelector = createSelector(
+    statementsStoreStateSelector,
+    selectPropertyProjector("configuration", {})
+);
+
+export const statementConfigurationSelector = createSelector(
+    statementConfigurationEntitiesSelector,
+    queryParamsIdSelector,
+    selectEntityWithIdProjector()
+);
+
+export const getStatementDepartmentConfigurationSelector = createSelector(
+    statementConfigurationSelector,
+    selectPropertyProjector("departments")
+);
+
+export const getStatementSectorsSelector = createSelector(
+    settingsStoreSelector,
+    statementConfigurationSelector,
+    (settings, configuration) => configuration?.sectors ? configuration.sectors : settings?.sectors
+);
+
+export const getStatementTextConfigurationSelector = createSelector(
+    statementConfigurationSelector,
+    selectPropertyProjector("text")
+);
diff --git a/src/app/features/edit/components/edit-negative-answer/index.ts b/src/app/store/statements/selectors/statement-editor-form/index.ts
similarity index 91%
copy from src/app/features/edit/components/edit-negative-answer/index.ts
copy to src/app/store/statements/selectors/statement-editor-form/index.ts
index 7378646..2e93f66 100644
--- a/src/app/features/edit/components/edit-negative-answer/index.ts
+++ b/src/app/store/statements/selectors/statement-editor-form/index.ts
@@ -11,4 +11,4 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export * from "./edit-negative-answer.component";
+export * from "./statement-editor-form.selectors";
diff --git a/src/app/store/statements/selectors/statement-editor-form/statement-editor-form.selectors.ts b/src/app/store/statements/selectors/statement-editor-form/statement-editor-form.selectors.ts
new file mode 100644
index 0000000..0aece5c
--- /dev/null
+++ b/src/app/store/statements/selectors/statement-editor-form/statement-editor-form.selectors.ts
@@ -0,0 +1,68 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {createSelector} from "@ngrx/store";
+import {IAPITextArrangementItemModel, IAPITextBlockGroupModel} from "../../../../core/api/text";
+import {arrayJoin, selectArrayProjector, selectPropertyProjector, TStoreEntities} from "../../../../util/store";
+import {IStatementEditorControlConfiguration} from "../../model";
+import {getStatementTextConfigurationSelector} from "../statement-configuration.selectors";
+import {getStatementErrorSelector} from "../statements-store-state.selectors";
+
+const getTextConfigurationSelectorSelector = createSelector(
+    getStatementTextConfigurationSelector,
+    selectPropertyProjector("configuration")
+);
+
+export const getStatementStaticTextReplacementsSelector = createSelector(
+    getStatementTextConfigurationSelector,
+    selectPropertyProjector("replacements", {})
+);
+
+export const getStatementTextSelectsSelector = createSelector(
+    getTextConfigurationSelectorSelector,
+    selectPropertyProjector("selects", {})
+);
+
+export const getStatementTextBlockGroups = createSelector(
+    getTextConfigurationSelectorSelector,
+    selectArrayProjector("groups", [])
+);
+
+export const getStatementArrangementErrorSelector = createSelector(
+    getStatementErrorSelector,
+    selectArrayProjector("arrangement", [])
+);
+
+export const getStatementEditorControlConfigurationSelector = createSelector(
+    getStatementTextBlockGroups,
+    getStatementStaticTextReplacementsSelector,
+    getStatementTextSelectsSelector,
+    (
+        textBlockGroups: IAPITextBlockGroupModel[],
+        replacements: TStoreEntities<string>,
+        selects: TStoreEntities<string[]>,
+        props: IAPITextArrangementItemModel[]
+    ): IStatementEditorControlConfiguration[] => {
+        const textBlocks = arrayJoin(...textBlockGroups.map(selectPropertyProjector("textBlocks")));
+        return arrayJoin(props)
+            .map<IStatementEditorControlConfiguration>((item) => {
+                const textBlock = textBlocks.find((_) => _.id === item?.textblockId);
+                return {
+                    textBlock,
+                    selects,
+                    replacements,
+                    value: item
+                };
+            });
+    }
+);
diff --git a/src/app/store/statements/selectors/statement-information-form/statement-information-form.selectors.ts b/src/app/store/statements/selectors/statement-information-form/statement-information-form.selectors.ts
index bea0c8c..0f831ad 100644
--- a/src/app/store/statements/selectors/statement-information-form/statement-information-form.selectors.ts
+++ b/src/app/store/statements/selectors/statement-information-form/statement-information-form.selectors.ts
@@ -13,7 +13,7 @@
 
 import {createSelector} from "@ngrx/store";
 import {IStatementInformationFormValue} from "../../model";
-import {statementInfoSelector} from "../statements-store-state.selectors";
+import {statementInfoSelector} from "../statement.selectors";
 
 export const statementInformationFormValueSelector = createSelector(
     statementInfoSelector,
diff --git a/src/app/store/statements/selectors/statement.selectors.ts b/src/app/store/statements/selectors/statement.selectors.ts
new file mode 100644
index 0000000..dd22a06
--- /dev/null
+++ b/src/app/store/statements/selectors/statement.selectors.ts
@@ -0,0 +1,58 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {createSelector} from "@ngrx/store";
+import {selectArrayProjector, selectEntityWithIdProjector, selectPropertyProjector} from "../../../util";
+import {queryParamsIdSelector} from "../../root/selectors";
+import {statementsStoreStateSelector} from "./statements-store-state.selectors";
+
+export const statementEntitiesSelector = createSelector(
+    statementsStoreStateSelector,
+    selectPropertyProjector("entities", {})
+);
+
+export const statementSelector = createSelector(
+    statementEntitiesSelector,
+    queryParamsIdSelector,
+    selectEntityWithIdProjector()
+);
+
+export const statementInfoSelector = createSelector(
+    statementSelector,
+    selectPropertyProjector("info")
+);
+
+export const statementWorkflowSelector = createSelector(
+    statementSelector,
+    selectPropertyProjector("workflow")
+);
+
+export const statementParentIdsSelector = createSelector(
+    statementSelector,
+    selectArrayProjector("parentIds", [])
+);
+
+export const statementCommentsSelector = createSelector(
+    statementSelector,
+    selectArrayProjector("comments", [])
+);
+
+export const statementArrangementSelector = createSelector(
+    statementSelector,
+    selectArrayProjector("arrangement", [])
+);
+
+export const statementFileSelector = createSelector(
+    statementSelector,
+    selectPropertyProjector("file")
+);
diff --git a/src/app/store/statements/selectors/statements-store-state.selectors.spec.ts b/src/app/store/statements/selectors/statements-store-state.selectors.spec.ts
index 415d985..93323e6 100644
--- a/src/app/store/statements/selectors/statements-store-state.selectors.spec.ts
+++ b/src/app/store/statements/selectors/statements-store-state.selectors.spec.ts
@@ -11,20 +11,18 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPISectorsModel} from "../../../core/api/statements/IAPISectorsModel";
-import {IStatementEntity} from "../model";
+import {ISettingsStoreState} from "../../settings/model";
+import {IStatementConfigurationEntity} from "../model";
+import {getStatementSectorsSelector} from "./statement-configuration.selectors";
 import {
-    getStatementLoadingSelector,
-    getStatementSearchSelector,
-    getStatementSectorsSelector,
     statementCommentsSelector,
-    statementConfigurationSelector,
     statementEntitiesSelector,
     statementInfoSelector,
     statementParentIdsSelector,
     statementSelector,
     statementWorkflowSelector
-} from "./statements-store-state.selectors";
+} from "./statement.selectors";
+import {getStatementLoadingSelector, getStatementSearchSelector} from "./statements-store-state.selectors";
 
 describe("statementSelectors", () => {
 
@@ -53,10 +51,6 @@
         expectNullChecks(statementEntitiesSelector.projector, "entities", {1: 9}, {});
     });
 
-    it("statementConfigurationSelector", () => {
-        expectNullChecks(statementConfigurationSelector.projector, "configuration");
-    });
-
     it("statementInfoSelector", () => {
         expectNullChecks(statementInfoSelector.projector, "info");
     });
@@ -87,26 +81,25 @@
     });
 
     it("getStatementSectorsSelector", () => {
-        const args: { settings: IAPISectorsModel, statement: IStatementEntity } = {
-            settings: {},
-            statement: {}
-        };
-        expect(getStatementSectorsSelector.projector(args)).not.toBeDefined();
-        expect(getStatementSectorsSelector.projector(undefined)).not.toBeDefined();
-        args.settings = {
-            "Ort#Ortsteil": [
-                "Strom", "Gas", "Beleuchtung"
-            ]
-        };
-        expect(getStatementSectorsSelector.projector(args)).not.toEqual(args.settings);
-        args.statement = {
+        let settings: Partial<ISettingsStoreState> = {};
+        let configuration: Partial<IStatementConfigurationEntity> = {};
+
+        expect(getStatementSectorsSelector.projector(settings, configuration)).not.toBeDefined();
+        expect(getStatementSectorsSelector.projector(null, null)).not.toBeDefined();
+        settings = {
             sectors: {
-                "Stadt#Stadtteil": [
-                    "Strom", "Gas"
-                ]
+                "Ort#Ortsteil": ["Strom", "Gas", "Beleuchtung"]
             }
         };
-        expect(getStatementSectorsSelector.projector(args)).not.toEqual(args.statement.sectors);
+        expect(getStatementSectorsSelector.projector(settings, null)).toBe(settings.sectors);
+        expect(getStatementSectorsSelector.projector(settings, configuration)).toBe(settings.sectors);
+        configuration = {
+            sectors: {
+                "Stadt#Stadtteil": ["Strom", "Gas"]
+            }
+        };
+        expect(getStatementSectorsSelector.projector(null, configuration)).toBe(configuration.sectors);
+        expect(getStatementSectorsSelector.projector(settings, configuration)).toBe(configuration.sectors);
     });
 
 });
diff --git a/src/app/store/statements/selectors/statements-store-state.selectors.ts b/src/app/store/statements/selectors/statements-store-state.selectors.ts
index 59e0f1f..ad2bf14 100644
--- a/src/app/store/statements/selectors/statements-store-state.selectors.ts
+++ b/src/app/store/statements/selectors/statements-store-state.selectors.ts
@@ -12,62 +12,25 @@
  ********************************************************************************/
 
 import {createFeatureSelector, createSelector} from "@ngrx/store";
+import {selectEntityWithIdProjector, selectPropertyProjector} from "../../../util";
 import {queryParamsIdSelector} from "../../root/selectors";
-import {settingsStoreSelector} from "../../settings/selectors";
-import {IStatementEntity, IStatementsStoreState} from "../model";
+import {IStatementsStoreState} from "../model";
 import {STATEMENTS_NAME} from "../statements-reducers.token";
 
 export const statementsStoreStateSelector = createFeatureSelector<IStatementsStoreState>(STATEMENTS_NAME);
 
-export const statementEntitiesSelector = createSelector(
-    statementsStoreStateSelector,
-    (state) => state?.entities != null ? state.entities : {}
-);
-
-export const statementSelector = createSelector(
-    statementEntitiesSelector,
-    queryParamsIdSelector,
-    (entities, id): IStatementEntity => entities != null ? entities[id] : undefined
-);
-
-export const statementConfigurationSelector = createSelector(
-    statementSelector,
-    (statement) => statement?.configuration
-);
-
-export const statementInfoSelector = createSelector(
-    statementSelector,
-    (statement) => statement?.info
-);
-
-export const statementWorkflowSelector = createSelector(
-    statementSelector,
-    (statement) => statement?.workflow
-);
-
-export const statementParentIdsSelector = createSelector(
-    statementSelector,
-    (statement) => Array.isArray(statement?.parentIds) ? statement.parentIds : []
-);
-
-export const statementCommentsSelector = createSelector(
-    statementSelector,
-    (statement) => Array.isArray(statement?.comments) ? statement.comments : []
-);
-
-
 export const getStatementSearchSelector = createSelector(
     statementsStoreStateSelector,
-    (state) => state?.search
+    selectPropertyProjector("search")
 );
 
 export const getStatementLoadingSelector = createSelector(
     statementsStoreStateSelector,
-    (state) => state?.loading
+    selectPropertyProjector("loading")
 );
 
-export const getStatementSectorsSelector = createSelector(
-    settingsStoreSelector,
-    statementSelector,
-    (settings, statement) => statement ? statement.sectors : settings?.sectors
+export const getStatementErrorSelector = createSelector(
+    statementsStoreStateSelector,
+    queryParamsIdSelector,
+    selectEntityWithIdProjector({}, "error")
 );
diff --git a/src/app/store/statements/selectors/statements.selectors.ts b/src/app/store/statements/selectors/statements.selectors.ts
deleted file mode 100644
index 28394a1..0000000
--- a/src/app/store/statements/selectors/statements.selectors.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createFeatureSelector, createSelector} from "@ngrx/store";
-import {entitiesToArray} from "../../../util";
-import {queryParamsIdSelector} from "../../root/selectors";
-import {IStatementEntity, IStatementsStoreState} from "../model";
-import {STATEMENTS_FEATURE_NAME} from "../statements-reducers.token";
-
-export const statementsStateSelector = createFeatureSelector<IStatementsStoreState>(STATEMENTS_FEATURE_NAME);
-
-export const statementsListSelector = createSelector(
-    statementsStateSelector,
-    (state) => entitiesToArray(state?.entities)
-);
-
-export const unfinishedStatementsListSelector = createSelector(
-    statementsListSelector,
-    (list) => list.filter((statement) => !statement.finished)
-);
-
-export const finishedStatementsListSelector = createSelector(
-    statementsListSelector,
-    (list) => list.filter((statement) => statement.finished)
-);
-
-export const statementSelector = createSelector(
-    statementsStateSelector,
-    queryParamsIdSelector,
-    (state, statementId, props: { statementId: number }): IStatementEntity => {
-        statementId = props?.statementId != null ? props.statementId : statementId;
-        return state?.entities == null || statementId == null ? undefined : state.entities[statementId];
-    }
-);
diff --git a/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.spec.ts b/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.spec.ts
index 0fac432..1e6f044 100644
--- a/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.spec.ts
+++ b/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.spec.ts
@@ -115,7 +115,6 @@
         const parentIds = [18, 19];
 
         let result = workflowFormValueSelector.projector(undefined, undefined, undefined);
-        console.log("adsds", result);
         expect(result.departments).toEqual([]);
         expect(result.geographicPosition).not.toBeDefined();
         expect(result.parentIds).toEqual([]);
diff --git a/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.ts b/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.ts
index 1facbf2..1c792c9 100644
--- a/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.ts
+++ b/src/app/store/statements/selectors/workflow-form/workflow-form.selectors.ts
@@ -15,10 +15,11 @@
 import {ISelectOption, ISelectOptionGroup} from "../../../../shared/controls/select";
 import {arrayJoin, objectToArray} from "../../../../util/store";
 import {IDepartmentOptionValue, IWorkflowFormValue} from "../../model";
-import {statementConfigurationSelector, statementParentIdsSelector, statementWorkflowSelector} from "../statements-store-state.selectors";
+import {getStatementDepartmentConfigurationSelector} from "../statement-configuration.selectors";
+import {statementParentIdsSelector, statementWorkflowSelector} from "../statement.selectors";
 
 export const departmentGroupsObjectSelector = createSelector(
-    statementConfigurationSelector,
+    getStatementDepartmentConfigurationSelector,
     statementWorkflowSelector,
     (configuration, workflow) => {
         return configuration?.allDepartments != null ? configuration.allDepartments : workflow?.selectedDepartments;
@@ -26,7 +27,7 @@
 );
 
 export const selectedDepartmentGroupsObjectSelector = createSelector(
-    statementConfigurationSelector,
+    getStatementDepartmentConfigurationSelector,
     statementWorkflowSelector,
     (configuration, workflow) => {
         return workflow?.selectedDepartments == null ? configuration?.suggestedDepartments : workflow.selectedDepartments;
diff --git a/src/app/store/statements/statements-reducers.token.ts b/src/app/store/statements/statements-reducers.token.ts
index 5f9dd97..5bf5ac6 100644
--- a/src/app/store/statements/statements-reducers.token.ts
+++ b/src/app/store/statements/statements-reducers.token.ts
@@ -14,16 +14,23 @@
 import {InjectionToken} from "@angular/core";
 import {ActionReducerMap} from "@ngrx/store";
 import {IStatementsStoreState} from "./model";
-import {newStatementFormReducer, statementEntitiesReducer, statementLoadingReducer, statementSearchReducer} from "./reducers";
+import {
+    statementConfigurationReducer,
+    statementEntitiesReducer,
+    statementErrorReducer,
+    statementLoadingReducer,
+    statementSearchReducer
+} from "./reducers";
 
 export const STATEMENTS_NAME = "statements";
 
 export const STATEMENTS_REDUCER = new InjectionToken<ActionReducerMap<IStatementsStoreState>>("Statements store reducer", {
     providedIn: "root",
     factory: () => ({
+        configuration: statementConfigurationReducer,
         entities: statementEntitiesReducer,
+        error: statementErrorReducer,
         search: statementSearchReducer,
-        newStatementForm: newStatementFormReducer,
         loading: statementLoadingReducer
     })
 });
diff --git a/src/app/store/statements/statements-store.module.ts b/src/app/store/statements/statements-store.module.ts
index 840884b..2e335b4 100644
--- a/src/app/store/statements/statements-store.module.ts
+++ b/src/app/store/statements/statements-store.module.ts
@@ -16,11 +16,15 @@
 import {StoreModule} from "@ngrx/store";
 import {
     CommentsEffect,
+    CompileStatementArrangementEffect,
     FetchStatementDetailsEffect,
+    FetchTextArrangementEffect,
     SearchStatementsEffect,
     SubmitStatementInformationFormEffect,
-    SubmitWorkflowFormEffect
+    SubmitWorkflowFormEffect,
+    ValidateStatementArrangementEffect,
 } from "./effects";
+import {SubmitStatementEditorFormEffect} from "./effects/submit-statement-editor-form";
 import {STATEMENTS_NAME, STATEMENTS_REDUCER} from "./statements-reducers.token";
 
 @NgModule({
@@ -28,10 +32,14 @@
         StoreModule.forFeature(STATEMENTS_NAME, STATEMENTS_REDUCER),
         EffectsModule.forFeature([
             CommentsEffect,
+            CompileStatementArrangementEffect,
             FetchStatementDetailsEffect,
+            FetchTextArrangementEffect,
             SearchStatementsEffect,
+            SubmitStatementEditorFormEffect,
             SubmitStatementInformationFormEffect,
-            SubmitWorkflowFormEffect
+            SubmitWorkflowFormEffect,
+            ValidateStatementArrangementEffect
         ])
     ]
 })
diff --git a/src/app/store/statements/statements.actions.ts b/src/app/store/statements/statements.actions.ts
deleted file mode 100644
index 7e40f1e..0000000
--- a/src/app/store/statements/statements.actions.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createAction, props} from "@ngrx/store";
-import {IAPIStatementModel} from "../../core/api/statements/IAPIStatementModel";
-import {TStatementEntities} from "./model/IStatementEntity";
-
-export const fetchStatementsAction = createAction(
-    "[Dashboard] Fetch statements"
-);
-
-export const fetchStatementDetailsAction = createAction(
-    "[StatementDetails] Fetch statement details",
-    props<{ id: number }>()
-);
-
-export const setStatementEntitiesAction = createAction(
-    "[API] Set statement entities",
-    props<{ entities: TStatementEntities }>()
-);
-
-export const addNewStatementAction = createAction(
-    "[NewStatement] Add new statement",
-    props<Partial<IAPIStatementModel>>()
-);
diff --git a/src/app/store/statements/statements.selectors.ts b/src/app/store/statements/statements.selectors.ts
deleted file mode 100644
index 2196196..0000000
--- a/src/app/store/statements/statements.selectors.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-import {createFeatureSelector, createSelector} from "@ngrx/store";
-import {entitiesToArray} from "../../util/store.util";
-import {IStatementEntity} from "./model/IStatementEntity";
-import {IStatementsStoreState} from "./model/IStatementsStoreState";
-import {STATEMENTS_FEATURE_NAME} from "./statements-reducers.token";
-
-export const statementsStateSelector = createFeatureSelector<IStatementsStoreState>(STATEMENTS_FEATURE_NAME);
-
-export const statementsListSelector = createSelector(
-    statementsStateSelector,
-    (state) => entitiesToArray(state?.entities)
-);
-
-export const unfinishedStatementsListSelector = createSelector(
-    statementsListSelector,
-    (list) => list.filter((statement) => !statement.finished)
-);
-
-export const finishedStatementsListSelector = createSelector(
-    statementsListSelector,
-    (list) => list.filter((statement) => statement.finished)
-);
-
-export const statementSelector = createSelector(
-    statementsStateSelector,
-    (state, props: { id: number }): IStatementEntity => state?.entities == null ? undefined : state.entities[props?.id]
-);
diff --git a/src/app/shared/select/ISelectOption.ts b/src/app/test/create-attachment-file-mock.spec.ts
similarity index 66%
copy from src/app/shared/select/ISelectOption.ts
copy to src/app/test/create-attachment-file-mock.spec.ts
index fc6c436..e594761 100644
--- a/src/app/shared/select/ISelectOption.ts
+++ b/src/app/test/create-attachment-file-mock.spec.ts
@@ -11,7 +11,12 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-export interface ISelectOption {
-    label: string;
-    value: any;
+import {IAttachmentWithTags} from "../store/attachments/model";
+import {createFileMock} from "./create-file-mock.spec";
+
+export function createAttachmentFileMock(name: string): IAttachmentWithTags<File> {
+    return {
+        attachment: createFileMock(name),
+        tags: []
+    };
 }
diff --git a/src/app/test/create-attachment-model-mock.spec.ts b/src/app/test/create-attachment-model-mock.spec.ts
index e1021c3..cd58e1c 100644
--- a/src/app/test/create-attachment-model-mock.spec.ts
+++ b/src/app/test/create-attachment-model-mock.spec.ts
@@ -11,9 +11,9 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIAttachmentModel} from "../core/api/attachments";
+import {IAPIAttachmentModel} from "../core";
 
-export function createAttachmentModelMock(attachmentId: number, tagIds: number[] = []): IAPIAttachmentModel {
+export function createAttachmentModelMock(attachmentId: number, ...tagIds: string[]): IAPIAttachmentModel {
     return {
         id: attachmentId,
         name: "Attachment" + attachmentId,
diff --git a/src/app/test/create-pagination-response-mock.spec.ts b/src/app/test/create-pagination-response-mock.spec.ts
index 0a916ee..1fad8e2 100644
--- a/src/app/test/create-pagination-response-mock.spec.ts
+++ b/src/app/test/create-pagination-response-mock.spec.ts
@@ -10,8 +10,8 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
-import {IAPIPaginationResponse} from "../core/api/shared";
 
+import {IAPIPaginationResponse} from "../core";
 
 export function createPaginationResponseMock<T>(content: T[]): IAPIPaginationResponse<T> {
     return {
diff --git a/src/app/test/create-statement-model-mock.spec.ts b/src/app/test/create-statement-model-mock.spec.ts
index 8a705b4..b3996fa 100644
--- a/src/app/test/create-statement-model-mock.spec.ts
+++ b/src/app/test/create-statement-model-mock.spec.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIStatementModel} from "../core/api/statements";
+import {IAPIStatementModel} from "../core";
 
 export function createStatementModelMock(id: number, typeId: number = 1): IAPIStatementModel {
     return {
diff --git a/src/app/test/create-statement-text-configuration-mock.spec.ts b/src/app/test/create-statement-text-configuration-mock.spec.ts
new file mode 100644
index 0000000..e0c7615
--- /dev/null
+++ b/src/app/test/create-statement-text-configuration-mock.spec.ts
@@ -0,0 +1,64 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+import {IAPIStatementTextConfigurationModel, IAPITextBlockGroupModel, IAPITextBlockModel} from "../core/api/text";
+
+export const blockTexts: string[] = [
+    "Lorem ipsum dolor sit amet, <f:name> \n",
+    "consetetur sadipscing elitr, sed diam nonumy eirmod <d:datum> tempor invidunt ut labore et dolore magna aliquyam erat <s:options>, sed diam voluptua. \n\n At vero eos et accusam et justo duo dolores et ea rebum.",
+    `Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
+     At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \n Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+      sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+       Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
+        Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.`,
+    "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, <t:Ansprech_Partner>, <t:Firma> no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.",
+    "Stet clita kasd gubergren, <f:Bearbeiter> \n no \n \n \n sea takimata sanctus est Lorem ipsum dolor sit amet."
+];
+
+export function createTextBlockModelMock(id: string, text: string): IAPITextBlockModel {
+    return {
+        id,
+        requires: [],
+        excludes: [],
+        text
+    };
+}
+
+export function createTextBlockModelGroup(id: number, size: number): IAPITextBlockGroupModel {
+    return {
+        groupName: "Textbausteingruppe " + id,
+        textBlocks: Array(size).fill(0).map((_, i) => createTextBlockModelMock("Textbaustein " + id + "." + i, blockTexts[i]))
+    };
+}
+
+export function createStatementTextConfigurationMock(): IAPIStatementTextConfigurationModel {
+    return {
+        configuration: {
+            selects: {
+                DropDown: ["Option 1", "Option 2", "Option 3"],
+                options: ["null", "eins", "zwei"]
+            },
+            groups: Array(3).fill(0)
+                .map((_, i) => createTextBlockModelGroup(i, 5))
+        },
+
+        replacements: {
+            name: "Hugo Haferkamp",
+            test: "TEST REPLACEMENT",
+            Ansprechpartner: "Donald Duck",
+            Firma: "Quak GmbH",
+            Ansprech_Partner: "Donald_Duck"
+        }
+
+    };
+}
diff --git a/src/app/test/create-workflow-data-mock.spec.ts b/src/app/test/create-workflow-data-mock.spec.ts
index 87eee50..f8b96e5 100644
--- a/src/app/test/create-workflow-data-mock.spec.ts
+++ b/src/app/test/create-workflow-data-mock.spec.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {IAPIWorkflowData} from "../core/api/statements";
+import {IAPIWorkflowData} from "../core";
 
 export function createWorkflowDataMock(partialData: Partial<IAPIWorkflowData> = {}): IAPIWorkflowData {
     return {
diff --git a/src/app/test/index.ts b/src/app/test/index.ts
index 108c792..3031ba7 100644
--- a/src/app/test/index.ts
+++ b/src/app/test/index.ts
@@ -16,4 +16,6 @@
 export * from "./create-pagination-response-mock.spec";
 export * from "./create-select-options.spec";
 export * from "./create-statement-model-mock.spec";
+export * from "./create-statement-text-configuration-mock.spec";
 export * from "./create-workflow-data-mock.spec";
+export * from "./create-attachment-file-mock.spec";
diff --git a/src/app/util/EHttpStatusCodes.ts b/src/app/util/EHttpStatusCodes.ts
deleted file mode 100644
index e5af5b6..0000000
--- a/src/app/util/EHttpStatusCodes.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export enum EHttpStatusCodes {
-    OK = 200,
-    CREATED = 201,
-    ACCEPTED = 202,
-    NON_AUTHORITATIVE_INFORMATION = 203,
-    NO_CONTENT = 204,
-    RESET_CONTENT = 205,
-    PARTIAL_CONTENT = 206,
-    MULTI_STATUS = 207,
-    ALREADY_REPORTED = 208,
-
-    BAD_REQUEST = 400,
-    UNAUTHORIZED = 401,
-    FORBIDDEN = 403,
-    NOT_FOUND = 404,
-    METHOD_NOT_ALLOWED = 405,
-    NOT_ACCEPTABLE = 406,
-    REQUEST_TIMEOUT = 408,
-    CONFLICT = 409,
-    GONE = 410,
-    LENGTH_REQUIRED = 411,
-    PRECONDITION_FAILED = 412,
-    REQUEST_ENTITY_TOO_LARGE = 413,
-    URI_TOO_LONG = 414,
-    UNSUPPORTED_MEDIA_TYPE = 415,
-    REQUESTED_RANGE_NOT_SATISFIABLE = 416,
-    EXPECTATION_FAILED = 417,
-
-    INTERNAL_SERVER_ERROR = 500,
-    NOT_IMPLEMENTED = 501,
-    BAD_GATEWAY = 502,
-    SERVICE_UNAVAILABLE = 503,
-    GATEWAY_TIMEOUT = 504
-}
diff --git a/src/app/util/events.util.ts b/src/app/util/events.util.ts
deleted file mode 100644
index eae09e4..0000000
--- a/src/app/util/events.util.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-
-import {fromEvent, Observable} from "rxjs";
-import {filter} from "rxjs/operators";
-
-/**
- * Creates an observable from an EventListener that emits when the user tabs back into the app.
- * @param doc Global document object
- */
-export function fromReturningToBrowserTabEvent(doc: Document): Observable<Event> {
-    return fromEvent(doc, "visibilitychange").pipe(
-        filter(() => doc.visibilityState !== "hidden")
-    );
-}
diff --git a/src/app/util/http.util.ts b/src/app/util/http.util.ts
deleted file mode 100644
index 2f8d20a..0000000
--- a/src/app/util/http.util.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-import {HttpErrorResponse} from "@angular/common/http";
-import {EHttpStatusCodes} from "./EHttpStatusCodes";
-
-export function isHttpErrorWithStatus(error: any, status?: EHttpStatusCodes): boolean {
-    return error instanceof HttpErrorResponse && (status == null || error.status === status);
-}
-
-export function urlJoin(...args: string[]): string {
-    let result = args.reduce((previous, current) => previous + "/" + current);
-    const indexOfProtocolSlashes = result.indexOf("://");
-    while (result.indexOf("//", indexOfProtocolSlashes === -1 ? undefined : indexOfProtocolSlashes + 3) > -1) {
-        result = result.replace("//", "/");
-    }
-    return result;
-}
diff --git a/src/app/util/http/EHttpStatusCodes.ts b/src/app/util/http/EHttpStatusCodes.ts
index e5af5b6..71dab8a 100644
--- a/src/app/util/http/EHttpStatusCodes.ts
+++ b/src/app/util/http/EHttpStatusCodes.ts
@@ -38,6 +38,7 @@
     UNSUPPORTED_MEDIA_TYPE = 415,
     REQUESTED_RANGE_NOT_SATISFIABLE = 416,
     EXPECTATION_FAILED = 417,
+    FAILED_DEPENDENCY = 424,
 
     INTERNAL_SERVER_ERROR = 500,
     NOT_IMPLEMENTED = 501,
diff --git a/src/app/util/http/http.util.spec.ts b/src/app/util/http/http.util.spec.ts
index 1781407..12633a2 100644
--- a/src/app/util/http/http.util.spec.ts
+++ b/src/app/util/http/http.util.spec.ts
@@ -11,20 +11,27 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {HttpErrorResponse} from "@angular/common/http";
+import {HttpErrorResponse, HttpHeaders, HttpResponse} from "@angular/common/http";
+import {defer, Observable, of, throwError} from "rxjs";
 import {EHttpStatusCodes} from "./EHttpStatusCodes";
-import {isHttpErrorWithStatus, objectToHttpParams, urlJoin} from "./http.util";
+import {catchHttpError, isHttpErrorWithStatus, mapHttpResponseToFile, objectToHttpParams, urlJoin} from "./http.util";
 
 describe("HttpUtil", () => {
 
-    it("should join URLs", () => {
+    it("urlJoin", () => {
         expect(urlJoin("ab", "cd")).toBe("ab/cd");
         expect(urlJoin("/ab", "///", "cd", "///ef")).toBe("/ab/cd/ef");
         expect(urlJoin("https://", "/////", "www.abc.de", "///", "/fg/")).toBe("https://www.abc.de/fg/");
         expect(urlJoin()).toBe("");
     });
 
-    it("should recognize HttpErrorResponses", () => {
+    it("objectToHttpParams", () => {
+        expect(objectToHttpParams(undefined)).toEqual({});
+        expect(objectToHttpParams(null)).toEqual({});
+        expect(objectToHttpParams({a: "1", b: 9, c: ["19", 1919]})).toEqual({a: "1", b: "9", c: ["19", "1919"]});
+    });
+
+    it("isHttpErrorWithStatus", () => {
         let httpError: any;
 
         httpError = new HttpErrorResponse({status: EHttpStatusCodes.UNAUTHORIZED});
@@ -40,10 +47,49 @@
         expect(isHttpErrorWithStatus(httpError, EHttpStatusCodes.UNAUTHORIZED, EHttpStatusCodes.FORBIDDEN)).toBeTrue();
     });
 
-    it("should transform objects to http params", () => {
-        expect(objectToHttpParams(undefined)).toEqual({});
-        expect(objectToHttpParams(null)).toEqual({});
-        expect(objectToHttpParams({a: "1", b: 9, c: ["19", 1919]})).toEqual({a: "1", b: "9", c: ["19", "1919"]});
+    it("catchHttpError", async () => {
+        const httpError = new HttpErrorResponse({status: EHttpStatusCodes.UNAUTHORIZED});
+
+        const noError$: Observable<any> = of(19);
+        const error$: Observable<any> = throwError(httpError);
+
+        let promise: Promise<any>;
+
+        promise = noError$.pipe(catchHttpError(async () => -19)).toPromise();
+        await expectAsync(promise).toBeResolvedTo(19);
+
+        promise = error$.pipe(catchHttpError(async () => -19)).toPromise();
+        await expectAsync(promise).toBeResolvedTo(-19);
+
+        promise = error$.pipe(catchHttpError(async () => -19, httpError.status)).toPromise();
+        await expectAsync(promise).toBeResolvedTo(-19);
+
+        promise = error$.pipe(catchHttpError(async () => -19, 450, 451, httpError.status, 452)).toPromise();
+        await expectAsync(promise).toBeResolvedTo(-19);
+
+        promise = error$.pipe(catchHttpError(async () => -19, 450, 451, 452)).toPromise();
+        await expectAsync(promise).toBeRejectedWith(httpError);
+    });
+
+    it("mapHttpResponseToFile", async () => {
+        const fileName = "" + Math.floor(Math.random() * 1000) + ".txt";
+        const headers = new HttpHeaders({
+            "content-disposition": `attachment; filename="${fileName}"`
+        });
+        const file = new File(["19"], "test.pdf");
+        const file$ = defer(() => of(httpResponse)).pipe(mapHttpResponseToFile());
+        let httpResponse: HttpResponse<Blob> = null;
+
+        await expectAsync(file$.toPromise()).toBeRejected();
+
+        httpResponse = new HttpResponse({body: null});
+        await expectAsync(file$.toPromise()).toBeRejected();
+
+        httpResponse = new HttpResponse({body: file, status: 200, headers});
+        const result = await file$.toPromise();
+        expect(result).toBeInstanceOf(File);
+        expect(result.name).toBe(fileName);
+        await expectAsync(result.text()).toBeResolvedTo("19");
     });
 
 });
diff --git a/src/app/util/http/http.util.ts b/src/app/util/http/http.util.ts
index 58aac99..2bae036 100644
--- a/src/app/util/http/http.util.ts
+++ b/src/app/util/http/http.util.ts
@@ -11,14 +11,15 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 
-import {HttpErrorResponse} from "@angular/common/http";
+import {HttpErrorResponse, HttpResponse} from "@angular/common/http";
+import {Observable, ObservableInput, of, throwError} from "rxjs";
+import {catchError, switchMap} from "rxjs/operators";
+import {arrayJoin} from "../store";
 import {EHttpStatusCodes} from "./EHttpStatusCodes";
 
-export function isHttpErrorWithStatus(error: any, ...status: EHttpStatusCodes[]): boolean {
-    return error instanceof HttpErrorResponse
-        && (status == null || status.find((s) => error.status === s) != null);
-}
-
+/**
+ * Safely joins multiple urls to one.
+ */
 export function urlJoin(...args: string[]): string {
     let result = args.length === 0 ? "" : args.reduce((previous, current) => previous + "/" + current);
     const indexOfProtocol = result.indexOf("://");
@@ -33,6 +34,9 @@
     return indexOfProtocol === -1 ? result : protocol + ":/" + result;
 }
 
+/**
+ * Transforms a javascript object to a HttpParams object.
+ */
 export function objectToHttpParams<T extends object>(
     object: { [key: string]: string | number | Array<string | number> }
 ): { [key: string]: string | string[] } {
@@ -47,3 +51,57 @@
         });
     return result;
 }
+
+/**
+ * Returns true if the given error is an instance of HttpErrorResponse and its status is contained in the
+ * given list of status values of the function (if empty, all status values are catched).
+ */
+export function isHttpErrorWithStatus(error: any, ...status: EHttpStatusCodes[]): boolean {
+    return error instanceof HttpErrorResponse
+        && (arrayJoin(status).length === 0 || status.some((s) => error.status === s));
+}
+
+/**
+ * Returns an rxjs operator which catches HttpErrorRespones.
+ * @param callback Function which is called to when an error occurs
+ * @param status List of all status valued which should be catched (if empty, all status values are catched).
+ */
+export function catchHttpError<T, O extends ObservableInput<any>>(
+    callback: (error: HttpErrorResponse) => O,
+    ...status: EHttpStatusCodes[]
+) {
+    return catchError<T, O | Observable<never>>((error) => {
+        if (isHttpErrorWithStatus(error, ...arrayJoin(status))) {
+            return callback(error);
+        }
+        return throwError(error);
+    });
+}
+
+/**
+ * Returns an rxjs operator function which maps a HttpResponse from the server to a Javascript file object.
+ * The filename of the returned file will be extracted from the headers of the HttpResponse.
+ */
+export function mapHttpResponseToFile() {
+    return switchMap<HttpResponse<Blob>, Observable<File>>((response) => {
+        const blob = response.body;
+        if (!(blob instanceof Blob)) {
+            return throwError(new TypeError("Http response does not contain blob data"));
+        }
+        const contentDisposition = response.headers.get("content-disposition");
+        const fileName = contentDisposition
+            .split(";")
+            .map((_) => {
+                _ = _.trim();
+                if (!_.toLowerCase().startsWith("filename=")) {
+                    return;
+                }
+                return _.slice(9)
+                    .replace(/^\s*"/, "")
+                    .replace(/"\s*$/, "");
+            })
+            .find((_) => _ != null);
+
+        return of(new File([blob], fileName, {type: blob.type}));
+    });
+}
diff --git a/src/app/util/rxjs.util.ts b/src/app/util/rxjs.util.ts
deleted file mode 100644
index 81a3219..0000000
--- a/src/app/util/rxjs.util.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-import {pipe} from "rxjs";
-import {delay, retryWhen} from "rxjs/operators";
-
-/**
- * If an error occurs, the observable is repeated after a given amount of time.
- * @param timeInMs Time in miliseconds after which the observable is repeated.
- */
-export function retryAfter<T>(timeInMs: number) {
-    return pipe(
-        retryWhen<T>((errors) => errors.pipe(delay(timeInMs)))
-    );
-}
diff --git a/src/app/util/rxjs/rxjs.util.spec.ts b/src/app/util/rxjs/rxjs.util.spec.ts
index a4a358b..4dda810 100644
--- a/src/app/util/rxjs/rxjs.util.spec.ts
+++ b/src/app/util/rxjs/rxjs.util.spec.ts
@@ -52,11 +52,10 @@
                 counter++;
                 throw error;
             }),
-            // repeat(),
             retryAfter(timeInMs)
         );
 
-        const subscription = throw$.subscribe({error: () => console.log("error"), complete: () => console.log("completed")});
+        const subscription = throw$.subscribe();
 
         expect(counter).toBe(1);
 
diff --git a/src/app/util/rxjs/rxjs.util.ts b/src/app/util/rxjs/rxjs.util.ts
index 1df7d41..98d5898 100644
--- a/src/app/util/rxjs/rxjs.util.ts
+++ b/src/app/util/rxjs/rxjs.util.ts
@@ -40,8 +40,7 @@
  * If an error occurs, error is just ignored and the observable is finished without emitting any values.
  */
 export function ignoreError<T>(): OperatorFunction<T, T> {
-    return catchError((err) => {
-        console.error(err);
+    return catchError(() => {
         return EMPTY;
     });
 }
diff --git a/src/app/util/store.util.ts b/src/app/util/store.util.ts
deleted file mode 100644
index 6362eb5..0000000
--- a/src/app/util/store.util.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2020 Contributors to the Eclipse Foundation
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information regarding copyright ownership.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-export type TStoreEntities<T> = { [id: number]: T };
-
-/**
- * Maps an object to a list of its values.
- */
-export function entitiesToArray<T>(entities: TStoreEntities<T>): T[] {
-    if (entities == null) {
-        return [];
-    }
-
-    return Object.keys(entities).map((key) => ({...entities[key]}));
-}
-
-/**
- * Maps a list to an entities object. For each list item, a unique id is created via the given arrow function.
- */
-export function arrayToEntities<T>(list: T[], getId: (T) => number): TStoreEntities<T> {
-    return list.reduce<TStoreEntities<T>>((entities, statement) => ({
-        ...entities,
-        [getId(statement)]: {
-            ...statement
-        }
-    }), {});
-}
diff --git a/src/app/util/store/index.ts b/src/app/util/store/index.ts
index 0bc342c..5b7f2d5 100644
--- a/src/app/util/store/index.ts
+++ b/src/app/util/store/index.ts
@@ -12,3 +12,4 @@
  ********************************************************************************/
 
 export * from "./store.util";
+export * from "./store-projectors.util";
diff --git a/src/app/util/store/store-projectors.util.spec.ts b/src/app/util/store/store-projectors.util.spec.ts
new file mode 100644
index 0000000..dbd9bc2
--- /dev/null
+++ b/src/app/util/store/store-projectors.util.spec.ts
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+
+import {selectArrayProjector, selectEntityWithIdProjector, selectPropertyProjector} from "./store-projectors.util";
+import {TStoreEntities} from "./store.util";
+
+describe("StoreProjectorUtil", () => {
+
+    interface IStoreObject {
+        property: number;
+    }
+
+    interface IStoreArray {
+        array: number[];
+    }
+
+    it("selectEntityWithIdProjector", () => {
+        const entity: IStoreObject = {property: 19};
+        const state: TStoreEntities<IStoreObject> = {19: entity};
+        const stateWithKey: { key?: typeof state } = {key: state};
+        const defaultValue = {property: -19};
+
+        const projector = selectEntityWithIdProjector<typeof state, number>(defaultValue);
+        expect(projector(state, 19)).toBe(entity);
+        expect(projector(state, 18)).toBe(defaultValue);
+        expect(projector(null, 19)).toBe(defaultValue);
+
+        const projectorWithKey = selectEntityWithIdProjector<typeof stateWithKey, "key", number>(defaultValue, "key");
+        expect(projectorWithKey(stateWithKey, 19)).toBe(entity);
+        expect(projectorWithKey(stateWithKey, 18)).toBe(defaultValue);
+        expect(projectorWithKey(null, 19)).toBe(defaultValue);
+
+    });
+
+    it("selectPropertyProjector", () => {
+        const state: IStoreObject = {property: 19};
+        const defaultValue = -19;
+
+        const projector = selectPropertyProjector<IStoreObject, "property">("property", defaultValue);
+        expect(projector(state)).toBe(19);
+        expect(projector({property: null})).toBe(defaultValue);
+        expect(projector(null)).toBe(defaultValue);
+    });
+
+    it("selectArrayProjector", () => {
+        const state: IStoreArray = {array: [19]};
+        const defaultValue = [-19];
+
+        const projector = selectArrayProjector<IStoreArray, "array">("array", defaultValue);
+        expect(projector(state)).toBe(state.array);
+        expect(projector({array: null})).toBe(defaultValue);
+        expect(projector(null)).toBe(defaultValue);
+    });
+
+});
diff --git a/src/app/util/store/store-projectors.util.ts b/src/app/util/store/store-projectors.util.ts
new file mode 100644
index 0000000..ea5f0a0
--- /dev/null
+++ b/src/app/util/store/store-projectors.util.ts
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+export function selectEntityWithIdProjector<TState, TKey extends keyof TState, TId extends keyof TState[TKey]>(
+    defaultValue: TState[TKey][TId], key: TKey
+): (state: TState, id: TId) => TState[TKey][TId];
+export function selectEntityWithIdProjector<TState, TKey extends keyof TState>(
+    defaultValue?: TState[TKey]
+): (state: TState, id: TKey) => TState[TKey];
+export function selectEntityWithIdProjector<T>(defaultValue?: T, key?: string): any {
+    return key == null ?
+        (state, id) => state == null || state[id] == null ? defaultValue : state[id] :
+        (state, id) => state == null || state[key] == null || state[key][id] == null ? defaultValue : state[key][id];
+}
+
+export function selectPropertyProjector<TState, TKey extends keyof TState>(
+    key: TKey,
+    defaultValue?: TState[TKey]
+): (state: TState) => TState[TKey] {
+    return (state) => state == null || state[key] == null ? defaultValue : state[key];
+}
+
+export function selectArrayProjector<TState, TKey extends keyof TState>(
+    key: TKey,
+    defaultValue?: TState[TKey] & Array<any>
+): (state: TState) => TState[TKey] {
+    return (state) => state == null || !Array.isArray(state[key]) ? defaultValue : state[key];
+}
diff --git a/src/assets/i18n/de.i18.json b/src/assets/i18n/de.i18.json
index d7ab5e3..2edc9a3 100644
--- a/src/assets/i18n/de.i18.json
+++ b/src/assets/i18n/de.i18.json
@@ -153,5 +153,20 @@
       "available": "In diesem Ortsteil sind folgende Sparten betroffen:",
       "none": "In diesem Ortsteil konnte keine zuständige Sparte ausgemacht werden."
     }
+  },
+  "textBlocks": {
+    "errors": {
+      "after": "Muss platziert werden nach: ",
+      "excludes": "Schließt aus: ",
+      "requires": "Erfordert: ",
+      "requiresAtleastOne": "Erfordert mindestens einen von: ",
+      "requiresOne": "Erfordert genau einen von: ",
+      "missingVariables": "Erfordert Platzhalterwerte: "
+    },
+    "standardBlocks": {
+      "freeText": "Freitext",
+      "pagebreak": "Seitenumbruch",
+      "newLine": "Zeilenumbruch"
+    }
   }
 }
diff --git a/src/styles/colors/_danger.styles.scss b/src/styles/colors/_danger.styles.scss
index d3d58f0..7c3d8e1 100644
--- a/src/styles/colors/_danger.styles.scss
+++ b/src/styles/colors/_danger.styles.scss
@@ -14,7 +14,7 @@
 $openk-danger-palette: (
   50 : #ffa3a3,
   100 : #ff5757,
-  200 : #ff1f1f,
+  200 : #ff1f1f, // Used for error in textblock
   300 : #d60000,
   400 : #b80000,
   500 : #990000, // Used in: Button background
diff --git a/src/theme/drag/_drag-drop.theme.scss b/src/theme/drag/_drag-drop.theme.scss
new file mode 100644
index 0000000..bd3890a
--- /dev/null
+++ b/src/theme/drag/_drag-drop.theme.scss
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+.openk-drag-list-with-hidden-placeholder {
+
+  .cdk-drag-placeholder {
+    opacity: 0;
+    max-height: 0;
+    overflow: hidden;
+    margin: 0 !important;
+  }
+
+}
+
+.cdk-drag-placeholder {
+  margin-bottom: 0.5em;
+  opacity: 0.33;
+
+  .openk-drag-element > * {
+    opacity: 0.66;
+  }
+}
+
+.cdk-drop-list-dragging > * {
+  transition: transform 150ms cubic-bezier(0, 0, 0.2, 1);
+}
+
+.cdk-drag-animating {
+  transition: transform 150ms cubic-bezier(0, 0, 0.2, 1);
+}
+
+.cdk-drag-preview {
+  box-sizing: border-box;
+
+  .openk-drag-element {
+    border-style: solid !important;
+    box-shadow: 0 0 4px -2px rgba(0, 0, 0, 0.2);
+  }
+}
diff --git a/src/theme/misc/_cursor.theme.scss b/src/theme/misc/_cursor.theme.scss
index b1492c4..da746aa 100644
--- a/src/theme/misc/_cursor.theme.scss
+++ b/src/theme/misc/_cursor.theme.scss
@@ -18,3 +18,15 @@
 .no-drop {
   cursor: no-drop;
 }
+
+.grab {
+  cursor: grab;
+}
+
+.grabbing {
+  cursor: grabbing !important;
+
+  * {
+    cursor: grabbing !important;
+  }
+}
diff --git a/src/theme/misc/misc.theme.scss b/src/theme/misc/misc.theme.scss
index ca9050c..7f8166d 100644
--- a/src/theme/misc/misc.theme.scss
+++ b/src/theme/misc/misc.theme.scss
@@ -17,3 +17,19 @@
 .highlight-bpmn:not(.djs-connection) .djs-visual > :nth-child(1) {
   fill: get-color($openk-primary-palette, A100) !important;
 }
+
+.openk-mat-icon-button.mat-icon-button {
+  width: 1em;
+  height: 1em;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  line-height: 0;
+
+  mat-icon {
+    width: initial;
+    height: initial;
+    font-size: 1em;
+  }
+}
+
diff --git a/src/theme/openk.theme.scss b/src/theme/openk.theme.scss
index 07bd754..621a581 100644
--- a/src/theme/openk.theme.scss
+++ b/src/theme/openk.theme.scss
@@ -19,6 +19,7 @@
 @import "material/material.theme";
 @import "misc/misc.theme";
 @import "user-controls/user-controls.theme";
+@import "drag/drag-drop.theme";
 
 * {
   font-family: inherit;
@@ -34,4 +35,5 @@
 body {
   height: 100%;
   margin: 0;
+  overflow: hidden;
 }
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..6882933
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,63 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+const LicenseWebpackPlugin = require("license-webpack-plugin").LicenseWebpackPlugin;
+
+function getAdditionalModules() {
+  return [
+    "material-design-icons",
+    "source-sans-pro",
+    "@angular/platform-browser-dynamic"
+  ].map((repositoryName) => {
+    try {
+      return require(repositoryName + "/package.json");
+    } catch (e) {
+      console.warn(e);
+      return null;
+    }
+  }).filter((_) => _ != null);
+}
+
+function renderLicenses(modules) {
+  modules = modules
+    .map((module) => {
+      return {
+        ...module.packageJson,
+        licenseText: module.licenseText
+      };
+    });
+
+  modules.push(...getAdditionalModules());
+
+  return modules
+    .sort((a, b) => a.name.localeCompare(b.name))
+    .reduce((_, module) => {
+      const repositoryUrl = module.repository == null ? null : module.repository.url;
+      return _ + "\n" +
+        `${module.name} (${module.version})\n` +
+        (module.license != null ? ` * License: ${module.license}\n` : "") +
+        (module.homepage != null ? ` * Homepage: ${module.homepage}\n` : "") +
+        (module.homepage == null && repositoryUrl != null ? ` * Repository: ${repositoryUrl}\n` : "")
+    }, "");
+}
+
+module.exports = {
+  plugins: [
+    new LicenseWebpackPlugin({
+      renderLicenses: (modules) => {
+        return renderLicenses(modules);
+      },
+      outputFilename: "3rd.party.licenses.txt"
+    })
+  ]
+};