Repository: kubernetes/dashboard
Pull request #4427 (2019-10-17 00:58:25)

Update karma to the latest version 🚀

## The devDependency [karma](https://github.com/karma-runner/karma) was updated from `4.3.0` to `4.4.0`.
This version is **not covered** by your **current version range**.

If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.

---

**Publisher:** [karmarunnerbot](https://www.npmjs.com/~karmarunnerbot)
**License:** MIT

<details>
<summary>Release Notes for v4.4.0</summary>

<h3>Bug Fixes</h3>
<ul>
<li><strong>runner:</strong> remove explicit error on all tests failed (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3369" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3369/hovercard">#3369</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/f8005c6">f8005c6</a>), closes <a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3367" data-hovercard-type="issue" data-hovercard-url="/karma-runner/karma/issues/3367/hovercard">#3367</a></li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>client:</strong> Add trusted types support (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3360" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3360/hovercard">#3360</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/019bfd4">019bfd4</a>)</li>
<li>Preprocessor can return Promise (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3376" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3376/hovercard">#3376</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/3ffcd83">3ffcd83</a>)</li>
<li><strong>config:</strong> add failOnSkippedTests option. (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3374" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3374/hovercard">#3374</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/4ed3af0">4ed3af0</a>)</li>
<li><strong>config:</strong> clientDisplayNone sets client elements display none. (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3348" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3348/hovercard">#3348</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/6235e68">6235e68</a>)</li>
<li><strong>deps:</strong> Remove core-js dependency. (<a href="https://urls.greenkeeper.io/karma-runner/karma/issues/3379" data-hovercard-type="pull_request" data-hovercard-url="/karma-runner/karma/pull/3379/hovercard">#3379</a>) (<a href="https://urls.greenkeeper.io/karma-runner/karma/commit/0d70809">0d70809</a>)</li>
</ul>
</details>

<details>
<summary>Commits</summary>
<p>The new version differs by 11 commits.</p>
<ul>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/fbad778cbf5f9a7f5ba38bfd87347c05e1dd35ac"><code>fbad778</code></a> <code>chore: release v4.4.0</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/5aa4361dbb46bdec77dd1b0b5633d1a754d98c0d"><code>5aa4361</code></a> <code>chore: update contributors</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/4ed3af0c5ec9a9949448c4c568c16c33d6bc5cdd"><code>4ed3af0</code></a> <code>feat(config): add failOnSkippedTests option. (#3374)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/c7bab36db145cf59e762639825dc2f29d43ff08b"><code>c7bab36</code></a> <code>docs(commit-msg): Add failOnFailingTestSuite option to docs (#3380)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/0d70809b2522c80664abda3e32b7ab8ccfca7f39"><code>0d70809</code></a> <code>feat(deps): Remove core-js dependency. (#3379)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/3ffcd83b6a7666fc997c23f9d16bc2e1f9a493e0"><code>3ffcd83</code></a> <code>feat: Preprocessor can return Promise (#3376)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/f8005c6307d530c703f3db266f31e40d55049fb6"><code>f8005c6</code></a> <code>fix(runner): remove explicit error on all tests failed (#3369)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/f2eba153750e53b2887ed1c3753da8c095033b5d"><code>f2eba15</code></a> <code>chore: travis - upgrade on new version Ubuntu 16.04 (#3371)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/eab7e5b89908c263cc7ef141b70e3cd4759f7cb6"><code>eab7e5b</code></a> <code>chore(appveyor): Notification config. (#3375)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/6235e68bbf5a21b6723b652b3e9e09d627c2fad0"><code>6235e68</code></a> <code>feat(config): clientDisplayNone sets client elements display none. (#3348)</code></li>
<li><a href="https://urls.greenkeeper.io/karma-runner/karma/commit/019bfd4f7e402263c2dd01e758213c0c754578b7"><code>019bfd4</code></a> <code>feat(client): Add trusted types support (#3360)</code></li>
</ul>
<p>See the <a href="https://urls.greenkeeper.io/karma-runner/karma/compare/fa6be1583b71d866fc0d5114f1573b05d9d5401a...fbad778cbf5f9a7f5ba38bfd87347c05e1dd35ac">full diff</a></p>
</details>

---

<details>
  <summary>FAQ and help</summary>

  There is a collection of [frequently asked questions](https://greenkeeper.io/faq.html). If those don’t help, you can always [ask the humans behind Greenkeeper](https://github.com/greenkeeperio/greenkeeper/issues/new).
</details>

---


Your [Greenkeeper](https://greenkeeper.io) bot :palm_tree:



k8s-ci-robot: Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

:memo: **Please follow instructions at <https://git.k8s.io/community/CLA.md#the-contributor-license-agreement> to sign the CLA.**

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify.  Thanks.

---

- If you've already signed a CLA, it's possible we don't have your GitHub username or you're using a different email address.  Check your existing CLA data and verify that your [email is set on your git commits](https://help.github.com/articles/setting-your-email-in-git/).
- If you signed the CLA as a corporation, please sign in with your organization's credentials at <https://identity.linuxfoundation.org/projects/cncf> to be authorized.
- If you have done the above and are still having issues with the CLA being reported as unsigned, please log a ticket with the Linux Foundation Helpdesk: <https://support.linuxfoundation.org/>
- Should you encounter any issues with the Linux Foundation Helpdesk, send a message to the backup e-mail support address at: login-issues@jira.linuxfoundation.org

<!-- need_sender_cla -->

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
	
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/dashboard/pull/4427#" title="Author self-approved">greenkeeper[bot]</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **jeefy**
You can assign the PR to them by writing `/assign @jeefy` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fdashboard).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes/dashboard/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["jeefy"]} -->

Patch:
diff --git a/aio/scripts/conf.sh b/aio/scripts/conf.sh
index f3bff7d43..70ec88c27 100644
--- a/aio/scripts/conf.sh
+++ b/aio/scripts/conf.sh
@@ -41,7 +41,7 @@ ARCH=$(uname | awk '{print tolower($0)}')
 # Local cluster configuration (check start-cluster.sh script for more details).
 HEAPSTER_VERSION="v1.5.4"
 HEAPSTER_PORT=8082
-KIND_VERSION="0.2.1"
+KIND_VERSION="v0.5.1"
 KIND_BIN=${CACHE_DIR}/kind-${KIND_VERSION}
 
 # Setup logger.
diff --git a/aio/scripts/start-cluster.sh b/aio/scripts/start-cluster.sh
index f00ffc167..4d3a19ba4 100755
--- a/aio/scripts/start-cluster.sh
+++ b/aio/scripts/start-cluster.sh
@@ -36,7 +36,7 @@ function start-ci-heapster {
 }
 
 function start-kind {
-  ${KIND_BIN} create cluster --name="k8s-cluster-ci"
+  ${KIND_BIN} create cluster --name="k8s-cluster-ci" --image=kindest/node:v1.16.2
   ensure-kubeconfig
   if [ "${CI}" = true ] ; then
     start-ci-heapster
diff --git a/angular.json b/angular.json
index e7096577b..8cdf24ad4 100644
--- a/angular.json
+++ b/angular.json
@@ -21,6 +21,11 @@
                 "glob": "**/*",
                 "input": "src/app/frontend/assets",
                 "output": "/assets"
+              },
+              {
+                "glob": "robots.txt",
+                "input": "src/app/frontend/assets",
+                "output": "/"
               }
             ],
             "styles": [
diff --git a/cypress/fixtures/.keep b/cypress/fixtures/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/cypress/fixtures/crd.yaml b/cypress/fixtures/crd.yaml
new file mode 100644
index 000000000..4a457068d
--- /dev/null
+++ b/cypress/fixtures/crd.yaml
@@ -0,0 +1,11 @@
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  name: foos.samplecontroller.k8s.io
+spec:
+  group: samplecontroller.k8s.io
+  version: v1alpha1
+  names:
+    kind: Foo
+    plural: foos
+  scope: Namespaced
diff --git a/cypress/fixtures/example-foo.yaml b/cypress/fixtures/example-foo.yaml
new file mode 100644
index 000000000..897059c3d
--- /dev/null
+++ b/cypress/fixtures/example-foo.yaml
@@ -0,0 +1,7 @@
+apiVersion: samplecontroller.k8s.io/v1alpha1
+kind: Foo
+metadata:
+  name: example-foo
+spec:
+  deploymentName: example-foo
+  replicas: 1
diff --git a/cypress/integration/crd.spec.js b/cypress/integration/crd.spec.js
new file mode 100644
index 000000000..961710b50
--- /dev/null
+++ b/cypress/integration/crd.spec.js
@@ -0,0 +1,130 @@
+describe('Custom Resource Definitions', () => {
+  it('crd list is initially empty', () => {
+    cy.visit('/');
+
+    cy.get('#sidebar-crd').click();
+    cy.url().should('include', '/#/customresourcedefinition');
+
+    cy.get('#zero-state').should('be.visible');
+  });
+
+  it('create a crd', () => {
+    cy.fixture('crd.yaml').then(crd => {
+      cy.createResource({content: crd});
+      cy.reload();
+    });
+  });
+
+  it('crd list should contain the new crd', () => {
+    cy.get('#zero-state').should('not.be.visible');
+    cy.get('kd-crd-list').within(() => {
+      cy.get('mat-row').should('have.length', 1);
+    });
+  });
+
+  it('go to crd details page', () => {
+    cy.get('kd-crd-list').within(() => {
+      cy.get('a')
+        .first()
+        .click();
+    });
+    cy.url().should(
+      'include',
+      '/#/customresourcedefinition/foos.samplecontroller.k8s.io?namespace=default',
+    );
+
+    // loads correctly
+    cy.get('kd-object-meta').within(() => {
+      cy.get('kd-property')
+        .first()
+        .contains('foos.samplecontroller.k8s.io');
+    });
+
+    // has resource information
+    cy.get('#resource-information').within(() => {
+      cy.get('kd-property').should('have.length', 3);
+
+      cy.get('#resource-version')
+        .contains('v1alpha1');
+      cy.get('#resource-scope')
+        .contains('Namespaced');
+      cy.get('#resource-group')
+        .contains('samplecontroller.k8s.io');
+    });
+
+    // has accepted names
+    cy.get('#accepted-names').within(() => {
+      cy.get('kd-property').should('have.length', 4);
+
+      cy.get('kd-property')
+        .eq(0)
+        .contains('foos');
+      cy.get('kd-property')
+        .eq(1)
+        .contains('foo');
+      cy.get('kd-property')
+        .eq(2)
+        .contains('Foo');
+      cy.get('kd-property')
+        .eq(3)
+        .contains('FooList');
+    });
+
+    // has empty object section
+    cy.get('kd-crd-object-list').within(() => {
+      cy.get('#zero-state').should('be.visible');
+    });
+
+    // has one version
+    cy.get('kd-crd-versions-list').within(() => {
+      cy.get('mat-row').should('have.length', 1);
+
+      cy.get('mat-cell')
+        .first()
+        .contains('v1alpha1');
+    });
+  });
+
+  it('create a crd object', () => {
+    cy.fixture('example-foo.yaml').then(object => {
+      cy.createResource({content: object, namespace: 'default'});
+      cy.reload();
+    });
+  });
+
+  it('crd objects list should contain the new object', () => {
+    cy.get('kd-crd-object-list').within(() => {
+      cy.get('#zero-state').should('not.be.visible');
+
+      cy.get('mat-row').should('have.length', 1);
+      cy.get('mat-cell')
+        .first()
+        .contains('example-foo');
+    });
+  });
+
+  it('go to object detail page', () => {
+    cy.get('kd-crd-object-list').within(() => {
+      cy.get('a')
+        .first()
+        .click();
+    });
+
+    cy.url().should(
+      'include',
+      '/#/customresourcedefinition/foos.samplecontroller.k8s.io/default/example-foo?namespace=default',
+    );
+
+    cy.get('kd-object-meta').within(() => {
+      // Name
+      cy.get('kd-property')
+        .eq(0)
+        .contains('example-foo');
+
+      // Namespace
+      cy.get('kd-property')
+        .eq(1)
+        .contains('default');
+    });
+  });
+});
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index d60f01bf9..a1e91f54a 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -1,3 +1,31 @@
-// ***********************************************
-// Create various custom commands and overwrite existing commands.
-// ***********************************************
+Cypress.Commands.add(
+  'createResource',
+  ({resource = '', name = '', namespace = '', content = ''}) => {
+    return getCsrfToken('appdeploymentfromfile').then(response => {
+      const {token} = response.body;
+
+      return cy.request({
+        url: '/api/v1/appdeploymentfromfile',
+        method: 'POST',
+        headers: {
+          Accept: 'application/json',
+          'Content-Type': 'application/json',
+          'X-CSRF-TOKEN': token,
+        },
+        body: {
+          name,
+          namespace,
+          resource,
+          content,
+        },
+      });
+    });
+  },
+);
+
+function getCsrfToken(action) {
+  return cy.request({
+    url: `api/v1/csrftoken/${action}`,
+    method: 'GET',
+  });
+}
diff --git a/docs/developer/internationalization.md b/docs/developer/internationalization.md
index 13172388d..a0377b61f 100644
--- a/docs/developer/internationalization.md
+++ b/docs/developer/internationalization.md
@@ -1,6 +1,6 @@
 # Internationalization
 
-Based on current browser locale the Dashboard can be displayed in one of the supported languages listed below. In case it does not work, make sure that your browser's locale is identified with correct language code.
+Based on current browser locale the Dashboard can be displayed in one of the supported languages listed below. In case it does not work, make sure that your browser's locale is identified with correct language code. In more details, Dashboard determines requested language based on HTTP `Accept-Language` header from browser. We can check which language codes are requested by browser on `Network` tab in developer tool of browser.
 
 | Language           | Code |
 |--------------------|------|
@@ -40,6 +40,7 @@ Find new localizable texts in `i18n/[locale]/messages.[locale].xlf` file and tra
 Since dashboard team can not review translation files in your language, so dashboard team transfers authority to review and approve for updating your translation file. At first, you need to organize translation team for your language that manages dashboard translation file.
 
 1. Add your locale, e.g. `fr` or `ja`, into `"languages"` array of `"xfillmergeOptions"` in `package.json` file.
+  **Impotant: Locales should be written in lower case to be handled by Dashboard, e.g. `zh-tw`, not `zh-TW`**
 2. Run `npm run fix:i18n`. Then translation file for your language, e.g. `i18n/fr/messages.fr.xlf`, would be generated.
 3. Open your translation file and translate texts in `<target>` element into your language.
 
diff --git a/docs/user/certificate-management.md b/docs/user/certificate-management.md
index 664e8f47d..01770b16e 100644
--- a/docs/user/certificate-management.md
+++ b/docs/user/certificate-management.md
@@ -22,9 +22,9 @@ In case you want to generate certificates on your own you need library like [Ope
 A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty. This password is used by Certificate Authorities to authenticate the certificate owner when they want to revoke their certificate. Since this is a self-signed certificate, there’s no way to revoke it via CRL (Certificate Revocation List).
 
 ```
-openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
+openssl genrsa -des3 -passout pass:over4chars -out dashboard.pass.key 2048
 ...
-openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
+openssl rsa -passin pass:over4chars -in dashboard.pass.key -out dashboard.key
 # Writing RSA key
 rm dashboard.pass.key
 openssl req -new -key dashboard.key -out dashboard.csr
diff --git a/i18n/fr/messages.fr.xlf b/i18n/fr/messages.fr.xlf
index 0ad239c74..48b40f661 100644
--- a/i18n/fr/messages.fr.xlf
+++ b/i18n/fr/messages.fr.xlf
@@ -31,7 +31,7 @@
         <target>Mettre à jour</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">42</context>
+          <context context-type="linenumber">43</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7" datatype="html">
@@ -39,11 +39,11 @@
         <target>Annuler</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">46</context>
+          <context context-type="linenumber">47</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/createnamespace/template.html</context>
@@ -87,11 +87,11 @@
         <target>Supprimer</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">44</context>
+          <context context-type="linenumber">45</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">53</context>
         </context-group>
       </trans-unit>
       <trans-unit id="db0cf322b4bfc4f0466c9826810e3800dc4687dd" datatype="html">
@@ -1167,19 +1167,19 @@
         <target>Éditer</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
       </trans-unit>
       <trans-unit id="222a0537c59f20178268925dc70fb661a20dbdb7" datatype="html">
         <source>There is nothing to display here</source>
         <target>Il n'y a rien à afficher ici</target>
         <context-group purpose="location">
-          <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
-          <context context-type="linenumber">23</context>
+          <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
+          <context context-type="linenumber">22</context>
         </context-group>
         <context-group purpose="location">
-          <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">21</context>
+          <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
+          <context context-type="linenumber">23</context>
         </context-group>
       </trans-unit>
       <trans-unit id="7066e1af065c2b6a45b83dc874af7d15f1fba435" datatype="html">
@@ -1919,7 +1919,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">67</context>
+          <context context-type="linenumber">72</context>
         </context-group>
       </trans-unit>
       <trans-unit id="90ae2a4959c979abc049f4652f59b85e993e16cd" datatype="html">
@@ -2027,7 +2027,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">38</context>
+          <context context-type="linenumber">41</context>
         </context-group>
       </trans-unit>
       <trans-unit id="484b0e541230d60ddb5fbd771a34a5c8d90e7a57" datatype="html">
@@ -2355,7 +2355,7 @@
         <target>Tous les espaces de noms</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">34</context>
         </context-group>
       </trans-unit>
       <trans-unit id="6fac407fa5aec6e3291cf87a7ed3252add8a7d28" datatype="html">
@@ -2363,7 +2363,7 @@
         <target>ESPACES DE NOMS</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">34</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="2489eefea00931942b91f4a1ae109514b591e2e1" datatype="html">
@@ -2467,7 +2467,7 @@
         <target>Aucune ressource trouvée.</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">24</context>
+          <context context-type="linenumber">25</context>
         </context-group>
       </trans-unit>
       <trans-unit id="a44df39b2ce0f5d85e406c3aeec76ae898dbf9af" datatype="html">
@@ -2499,7 +2499,7 @@
         <target>Version</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">28</context>
+          <context context-type="linenumber">29</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1481b8488e10dbc437accce89d2ae35a0106e8ba" datatype="html">
@@ -2507,7 +2507,7 @@
         <target>Portée</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d9ac1caf6715c8011155c0a027d544dbeca63062" datatype="html">
@@ -2515,7 +2515,7 @@
         <target>Sous-ressources</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">43</context>
+          <context context-type="linenumber">47</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1ec17de9560711cd81108ccf93eb5b1df4eb6d4c" datatype="html">
@@ -2523,7 +2523,7 @@
         <target>Noms acceptés</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">55</context>
         </context-group>
       </trans-unit>
       <trans-unit id="fa1312fe00bfe38662df238fa059bcd75866ecd7" datatype="html">
@@ -2531,7 +2531,7 @@
         <target>Pluriel</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">57</context>
+          <context context-type="linenumber">62</context>
         </context-group>
       </trans-unit>
       <trans-unit id="712232bebfc8836a394c358ce9679452fabb945f" datatype="html">
@@ -2539,7 +2539,7 @@
         <target>Singulier</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">62</context>
+          <context context-type="linenumber">67</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5a2fcb3c1d8240f8f966564ee3500235d7427245" datatype="html">
@@ -2547,7 +2547,7 @@
         <target>Type de liste</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">72</context>
+          <context context-type="linenumber">77</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d27e60f49dba9b7994331db545a4c14e1e2683ad" datatype="html">
@@ -2555,7 +2555,7 @@
         <target>Noms abrégés</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">77</context>
+          <context context-type="linenumber">82</context>
         </context-group>
       </trans-unit>
       <trans-unit id="04201f9d27abd7d6f58a4328ab98063ce1072006" datatype="html">
@@ -2563,7 +2563,7 @@
         <target>Catégories</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">87</context>
         </context-group>
       </trans-unit>
       <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html">
@@ -2835,7 +2835,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">136</context>
+          <context context-type="linenumber">137</context>
         </context-group>
       </trans-unit>
       <trans-unit id="03511cfe5e28ed3380ab198c13cf62ebde1e89e6" datatype="html">
@@ -2844,7 +2844,7 @@
         <target>Paramètres</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">147</context>
+          <context context-type="linenumber">148</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c2fa735eb6b1b2c10171c5acb818f6e0975a9406" datatype="html">
@@ -2853,7 +2853,7 @@
         <target>À propos</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">152</context>
+          <context context-type="linenumber">153</context>
         </context-group>
       </trans-unit>
       <trans-unit id="7e892ba15f2c6c17e83510e273b3e10fc32ea016" datatype="html">
diff --git a/i18n/ja/messages.ja.xlf b/i18n/ja/messages.ja.xlf
index 137e95a24..9078bb060 100644
--- a/i18n/ja/messages.ja.xlf
+++ b/i18n/ja/messages.ja.xlf
@@ -31,7 +31,7 @@
         <target>更新</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">42</context>
+          <context context-type="linenumber">43</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7" datatype="html">
@@ -39,11 +39,11 @@
         <target>キャンセル</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">46</context>
+          <context context-type="linenumber">47</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/createnamespace/template.html</context>
@@ -87,11 +87,11 @@
         <target>削除</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">44</context>
+          <context context-type="linenumber">45</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">53</context>
         </context-group>
       </trans-unit>
       <trans-unit id="db0cf322b4bfc4f0466c9826810e3800dc4687dd" datatype="html">
@@ -523,7 +523,7 @@
         <target>編集</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c97f017e8bd3fb17065c3c94515a2cca404f0157" datatype="html">
@@ -1331,7 +1331,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">67</context>
+          <context context-type="linenumber">72</context>
         </context-group>
       </trans-unit>
       <trans-unit id="7357d53d819cc1f5dd329a4fff4c582461ee1317" datatype="html">
@@ -1464,7 +1464,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">38</context>
+          <context context-type="linenumber">41</context>
         </context-group>
       </trans-unit>
       <trans-unit id="484b0e541230d60ddb5fbd771a34a5c8d90e7a57" datatype="html">
@@ -1668,7 +1668,7 @@
         <target>表示するものがありません</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">21</context>
+          <context context-type="linenumber">22</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
@@ -1680,7 +1680,7 @@
         <target>リソースがありません。</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">24</context>
+          <context context-type="linenumber">25</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c3a7e364a88ea4673199dfa98bc73e6dbe09dfac" datatype="html">
@@ -1756,7 +1756,7 @@
         <target>すべてのネームスペース</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">34</context>
         </context-group>
       </trans-unit>
       <trans-unit id="6fac407fa5aec6e3291cf87a7ed3252add8a7d28" datatype="html">
@@ -1764,7 +1764,7 @@
         <target>ネームスペース</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">34</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d12515fa127fafff639075d37498207138a5d18a" datatype="html">
@@ -2565,7 +2565,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">136</context>
+          <context context-type="linenumber">137</context>
         </context-group>
       </trans-unit>
       <trans-unit id="03511cfe5e28ed3380ab198c13cf62ebde1e89e6" datatype="html">
@@ -2574,7 +2574,7 @@
         <target>設定</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">147</context>
+          <context context-type="linenumber">148</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c2fa735eb6b1b2c10171c5acb818f6e0975a9406" datatype="html">
@@ -2583,7 +2583,7 @@
         <target>Kubernetes Dashboard について</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">152</context>
+          <context context-type="linenumber">153</context>
         </context-group>
       </trans-unit>
       <trans-unit id="01269ce8051398188d50367ead1831407e77d504" datatype="html">
@@ -2907,7 +2907,7 @@
         <target>バージョン</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">28</context>
+          <context context-type="linenumber">29</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1481b8488e10dbc437accce89d2ae35a0106e8ba" datatype="html">
@@ -2915,7 +2915,7 @@
         <target>スコープ</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d9ac1caf6715c8011155c0a027d544dbeca63062" datatype="html">
@@ -2923,7 +2923,7 @@
         <target>サブリソース</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">43</context>
+          <context context-type="linenumber">47</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1ec17de9560711cd81108ccf93eb5b1df4eb6d4c" datatype="html">
@@ -2931,7 +2931,7 @@
         <target>容認された名前</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">55</context>
         </context-group>
       </trans-unit>
       <trans-unit id="fa1312fe00bfe38662df238fa059bcd75866ecd7" datatype="html">
@@ -2939,7 +2939,7 @@
         <target>複数</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">57</context>
+          <context context-type="linenumber">62</context>
         </context-group>
       </trans-unit>
       <trans-unit id="712232bebfc8836a394c358ce9679452fabb945f" datatype="html">
@@ -2947,7 +2947,7 @@
         <target>単数</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">62</context>
+          <context context-type="linenumber">67</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5a2fcb3c1d8240f8f966564ee3500235d7427245" datatype="html">
@@ -2955,7 +2955,7 @@
         <target>種類一覧</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">72</context>
+          <context context-type="linenumber">77</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d27e60f49dba9b7994331db545a4c14e1e2683ad" datatype="html">
@@ -2963,7 +2963,7 @@
         <target>省略名</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">77</context>
+          <context context-type="linenumber">82</context>
         </context-group>
       </trans-unit>
       <trans-unit id="04201f9d27abd7d6f58a4328ab98063ce1072006" datatype="html">
@@ -2971,7 +2971,7 @@
         <target>カテゴリー</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">87</context>
         </context-group>
       </trans-unit>
       <trans-unit id="7db62a1ccd31f1bb55e3532b0f58984a492296a8" datatype="html">
diff --git a/i18n/ko/messages.ko.xlf b/i18n/ko/messages.ko.xlf
index 6bbf5ec76..71929bc65 100644
--- a/i18n/ko/messages.ko.xlf
+++ b/i18n/ko/messages.ko.xlf
@@ -31,7 +31,7 @@
         <target state="new">업데이트</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">42</context>
+          <context context-type="linenumber">43</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7" datatype="html">
@@ -39,11 +39,11 @@
         <target state="new">취소</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">46</context>
+          <context context-type="linenumber">47</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/createnamespace/template.html</context>
@@ -87,11 +87,11 @@
         <target state="new">삭제</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">44</context>
+          <context context-type="linenumber">45</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">53</context>
         </context-group>
       </trans-unit>
       <trans-unit id="db0cf322b4bfc4f0466c9826810e3800dc4687dd" datatype="html">
@@ -727,7 +727,7 @@
         <target state="new">편집</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c0adb9c346b1a2715886258558098dc32bd10c40" datatype="html">
@@ -1523,7 +1523,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">67</context>
+          <context context-type="linenumber">72</context>
         </context-group>
       </trans-unit>
       <trans-unit id="81054386839df6c7c45d298e0044956413589ef4" datatype="html">
@@ -1613,7 +1613,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">38</context>
+          <context context-type="linenumber">41</context>
         </context-group>
       </trans-unit>
       <trans-unit id="484b0e541230d60ddb5fbd771a34a5c8d90e7a57" datatype="html">
@@ -1781,7 +1781,7 @@
         <target state="new">여기에 표시할 항목이 없습니다.</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">21</context>
+          <context context-type="linenumber">22</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
@@ -1793,7 +1793,7 @@
         <target state="new">검색된 리소스가 없습니다.</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">24</context>
+          <context context-type="linenumber">25</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c3a7e364a88ea4673199dfa98bc73e6dbe09dfac" datatype="html">
@@ -1917,7 +1917,7 @@
         <target state="new">모든 네임스페이스</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">34</context>
         </context-group>
       </trans-unit>
       <trans-unit id="6fac407fa5aec6e3291cf87a7ed3252add8a7d28" datatype="html">
@@ -1925,7 +1925,7 @@
         <target state="new">네임스페이스</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">34</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="f721a500a68c357e8f2a01e60510f6a01e4ba529" datatype="html">
@@ -2619,7 +2619,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">136</context>
+          <context context-type="linenumber">137</context>
         </context-group>
       </trans-unit>
       <trans-unit id="03511cfe5e28ed3380ab198c13cf62ebde1e89e6" datatype="html">
@@ -2629,7 +2629,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">147</context>
+          <context context-type="linenumber">148</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c2fa735eb6b1b2c10171c5acb818f6e0975a9406" datatype="html">
@@ -2639,7 +2639,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">152</context>
+          <context context-type="linenumber">153</context>
         </context-group>
       </trans-unit>
       <trans-unit id="01269ce8051398188d50367ead1831407e77d504" datatype="html">
@@ -2969,7 +2969,7 @@
         <target state="new">버전</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">28</context>
+          <context context-type="linenumber">29</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1481b8488e10dbc437accce89d2ae35a0106e8ba" datatype="html">
@@ -2977,7 +2977,7 @@
         <target state="new">범위</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d9ac1caf6715c8011155c0a027d544dbeca63062" datatype="html">
@@ -2985,7 +2985,7 @@
         <target state="new">Subresources</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">43</context>
+          <context context-type="linenumber">47</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1ec17de9560711cd81108ccf93eb5b1df4eb6d4c" datatype="html">
@@ -2993,7 +2993,7 @@
         <target state="new">Accepted Names</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">55</context>
         </context-group>
       </trans-unit>
       <trans-unit id="fa1312fe00bfe38662df238fa059bcd75866ecd7" datatype="html">
@@ -3001,7 +3001,7 @@
         <target state="new">복수</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">57</context>
+          <context context-type="linenumber">62</context>
         </context-group>
       </trans-unit>
       <trans-unit id="712232bebfc8836a394c358ce9679452fabb945f" datatype="html">
@@ -3009,7 +3009,7 @@
         <target state="new">단수</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">62</context>
+          <context context-type="linenumber">67</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5a2fcb3c1d8240f8f966564ee3500235d7427245" datatype="html">
@@ -3017,7 +3017,7 @@
         <target state="new">종류 리스트</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">72</context>
+          <context context-type="linenumber">77</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d27e60f49dba9b7994331db545a4c14e1e2683ad" datatype="html">
@@ -3025,7 +3025,7 @@
         <target state="new">단축 이름</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">77</context>
+          <context context-type="linenumber">82</context>
         </context-group>
       </trans-unit>
       <trans-unit id="04201f9d27abd7d6f58a4328ab98063ce1072006" datatype="html">
@@ -3033,7 +3033,7 @@
         <target state="new">카테고리</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">87</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5ad4eecbd0fe09c34678fefce317a052af39dc96" datatype="html">
@@ -3339,6 +3339,8 @@
         
         
         
+        
+        
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/template.html</context>
           <context context-type="linenumber">54</context>
diff --git a/i18n/messages.xlf b/i18n/messages.xlf
index 7b66f8b7b..ec48a03db 100644
--- a/i18n/messages.xlf
+++ b/i18n/messages.xlf
@@ -28,18 +28,18 @@
         <source>Update</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">42</context>
+          <context context-type="linenumber">43</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7" datatype="html">
         <source>Cancel</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">46</context>
+          <context context-type="linenumber">47</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/createnamespace/template.html</context>
@@ -74,11 +74,11 @@
         <source>Delete</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">44</context>
+          <context context-type="linenumber">45</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">53</context>
         </context-group>
       </trans-unit>
       <trans-unit id="db0cf322b4bfc4f0466c9826810e3800dc4687dd" datatype="html">
@@ -646,7 +646,7 @@
         <source>Edit</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c0adb9c346b1a2715886258558098dc32bd10c40" datatype="html">
@@ -1411,7 +1411,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">67</context>
+          <context context-type="linenumber">72</context>
         </context-group>
       </trans-unit>
       <trans-unit id="81054386839df6c7c45d298e0044956413589ef4" datatype="html">
@@ -1496,7 +1496,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">38</context>
+          <context context-type="linenumber">41</context>
         </context-group>
       </trans-unit>
       <trans-unit id="484b0e541230d60ddb5fbd771a34a5c8d90e7a57" datatype="html">
@@ -1645,7 +1645,7 @@
         <source>There is nothing to display here</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">21</context>
+          <context context-type="linenumber">22</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
@@ -1656,7 +1656,7 @@
         <source>No resources found.</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">24</context>
+          <context context-type="linenumber">25</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c3a7e364a88ea4673199dfa98bc73e6dbe09dfac" datatype="html">
@@ -1762,14 +1762,14 @@
         <source>All namespaces</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">34</context>
         </context-group>
       </trans-unit>
       <trans-unit id="6fac407fa5aec6e3291cf87a7ed3252add8a7d28" datatype="html">
         <source>NAMESPACES</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">34</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="f721a500a68c357e8f2a01e60510f6a01e4ba529" datatype="html">
@@ -2362,7 +2362,7 @@
       </source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">136</context>
+          <context context-type="linenumber">137</context>
         </context-group>
       </trans-unit>
       <trans-unit id="03511cfe5e28ed3380ab198c13cf62ebde1e89e6" datatype="html">
@@ -2370,7 +2370,7 @@
       </source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">147</context>
+          <context context-type="linenumber">148</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c2fa735eb6b1b2c10171c5acb818f6e0975a9406" datatype="html">
@@ -2378,7 +2378,7 @@
       </source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">152</context>
+          <context context-type="linenumber">153</context>
         </context-group>
       </trans-unit>
       <trans-unit id="01269ce8051398188d50367ead1831407e77d504" datatype="html">
@@ -2654,63 +2654,63 @@
         <source>Version</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">28</context>
+          <context context-type="linenumber">29</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1481b8488e10dbc437accce89d2ae35a0106e8ba" datatype="html">
         <source>Scope</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d9ac1caf6715c8011155c0a027d544dbeca63062" datatype="html">
         <source>Subresources</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">43</context>
+          <context context-type="linenumber">47</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1ec17de9560711cd81108ccf93eb5b1df4eb6d4c" datatype="html">
         <source>Accepted Names</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">55</context>
         </context-group>
       </trans-unit>
       <trans-unit id="fa1312fe00bfe38662df238fa059bcd75866ecd7" datatype="html">
         <source>Plural</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">57</context>
+          <context context-type="linenumber">62</context>
         </context-group>
       </trans-unit>
       <trans-unit id="712232bebfc8836a394c358ce9679452fabb945f" datatype="html">
         <source>Singular</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">62</context>
+          <context context-type="linenumber">67</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5a2fcb3c1d8240f8f966564ee3500235d7427245" datatype="html">
         <source>List Kind</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">72</context>
+          <context context-type="linenumber">77</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d27e60f49dba9b7994331db545a4c14e1e2683ad" datatype="html">
         <source>Short Names</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">77</context>
+          <context context-type="linenumber">82</context>
         </context-group>
       </trans-unit>
       <trans-unit id="04201f9d27abd7d6f58a4328ab98063ce1072006" datatype="html">
         <source>Categories</source>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">87</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5ad4eecbd0fe09c34678fefce317a052af39dc96" datatype="html">
diff --git a/i18n/zh/OWNERS b/i18n/zh/OWNERS
index 2af948efb..eba747a76 100644
--- a/i18n/zh/OWNERS
+++ b/i18n/zh/OWNERS
@@ -1,5 +1,6 @@
 approvers:
   - hwdef
+  - tanjunchen
 
 labels:
 - language/zh
diff --git a/i18n/zh/messages.zh.xlf b/i18n/zh/messages.zh.xlf
index 0f43c5e2e..6e544fdf9 100644
--- a/i18n/zh/messages.zh.xlf
+++ b/i18n/zh/messages.zh.xlf
@@ -31,7 +31,7 @@
         <target state="new">更新</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">42</context>
+          <context context-type="linenumber">43</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7" datatype="html">
@@ -39,11 +39,11 @@
         <target state="new">取消</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/editresource/template.html</context>
-          <context context-type="linenumber">46</context>
+          <context context-type="linenumber">47</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/create/from/form/createnamespace/template.html</context>
@@ -87,11 +87,11 @@
         <target state="new">删除</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/dialogs/deleteresource/template.html</context>
-          <context context-type="linenumber">44</context>
+          <context context-type="linenumber">45</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">53</context>
         </context-group>
       </trans-unit>
       <trans-unit id="db0cf322b4bfc4f0466c9826810e3800dc4687dd" datatype="html">
@@ -727,7 +727,7 @@
         <target state="new">编辑</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/column/menu/template.html</context>
-          <context context-type="linenumber">48</context>
+          <context context-type="linenumber">49</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c0adb9c346b1a2715886258558098dc32bd10c40" datatype="html">
@@ -1523,7 +1523,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">67</context>
+          <context context-type="linenumber">72</context>
         </context-group>
       </trans-unit>
       <trans-unit id="81054386839df6c7c45d298e0044956413589ef4" datatype="html">
@@ -1613,7 +1613,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">38</context>
+          <context context-type="linenumber">41</context>
         </context-group>
       </trans-unit>
       <trans-unit id="484b0e541230d60ddb5fbd771a34a5c8d90e7a57" datatype="html">
@@ -1781,7 +1781,7 @@
         <target state="new">这里没有可以显示的</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">21</context>
+          <context context-type="linenumber">22</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/zerostate/template.html</context>
@@ -1793,7 +1793,7 @@
         <target state="new">找不到资源。</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/list/zerostate/template.html</context>
-          <context context-type="linenumber">24</context>
+          <context context-type="linenumber">25</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c3a7e364a88ea4673199dfa98bc73e6dbe09dfac" datatype="html">
@@ -1869,7 +1869,7 @@
         <target state="new">全部命名空间</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">34</context>
         </context-group>
       </trans-unit>
       <trans-unit id="6fac407fa5aec6e3291cf87a7ed3252add8a7d28" datatype="html">
@@ -1877,7 +1877,7 @@
         <target state="new">命名空间</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/common/components/namespace/template.html</context>
-          <context context-type="linenumber">34</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d12515fa127fafff639075d37498207138a5d18a" datatype="html">
@@ -2619,7 +2619,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">136</context>
+          <context context-type="linenumber">137</context>
         </context-group>
       </trans-unit>
       <trans-unit id="03511cfe5e28ed3380ab198c13cf62ebde1e89e6" datatype="html">
@@ -2629,7 +2629,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">147</context>
+          <context context-type="linenumber">148</context>
         </context-group>
       </trans-unit>
       <trans-unit id="c2fa735eb6b1b2c10171c5acb818f6e0975a9406" datatype="html">
@@ -2639,7 +2639,7 @@
       </target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/chrome/nav/template.html</context>
-          <context context-type="linenumber">152</context>
+          <context context-type="linenumber">153</context>
         </context-group>
       </trans-unit>
       <trans-unit id="01269ce8051398188d50367ead1831407e77d504" datatype="html">
@@ -2969,7 +2969,7 @@
         <target state="new">Version</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">28</context>
+          <context context-type="linenumber">29</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1481b8488e10dbc437accce89d2ae35a0106e8ba" datatype="html">
@@ -2977,7 +2977,7 @@
         <target state="new">Scope</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">33</context>
+          <context context-type="linenumber">35</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d9ac1caf6715c8011155c0a027d544dbeca63062" datatype="html">
@@ -2985,7 +2985,7 @@
         <target state="new">Subresources</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">43</context>
+          <context context-type="linenumber">47</context>
         </context-group>
       </trans-unit>
       <trans-unit id="1ec17de9560711cd81108ccf93eb5b1df4eb6d4c" datatype="html">
@@ -2993,7 +2993,7 @@
         <target state="new">Accepted Names</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">51</context>
+          <context context-type="linenumber">55</context>
         </context-group>
       </trans-unit>
       <trans-unit id="fa1312fe00bfe38662df238fa059bcd75866ecd7" datatype="html">
@@ -3001,7 +3001,7 @@
         <target state="new">Plural</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">57</context>
+          <context context-type="linenumber">62</context>
         </context-group>
       </trans-unit>
       <trans-unit id="712232bebfc8836a394c358ce9679452fabb945f" datatype="html">
@@ -3009,7 +3009,7 @@
         <target state="new">Singular</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">62</context>
+          <context context-type="linenumber">67</context>
         </context-group>
       </trans-unit>
       <trans-unit id="5a2fcb3c1d8240f8f966564ee3500235d7427245" datatype="html">
@@ -3017,7 +3017,7 @@
         <target state="new">List Kind</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">72</context>
+          <context context-type="linenumber">77</context>
         </context-group>
       </trans-unit>
       <trans-unit id="d27e60f49dba9b7994331db545a4c14e1e2683ad" datatype="html">
@@ -3025,7 +3025,7 @@
         <target state="new">Short Names</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">77</context>
+          <context context-type="linenumber">82</context>
         </context-group>
       </trans-unit>
       <trans-unit id="04201f9d27abd7d6f58a4328ab98063ce1072006" datatype="html">
@@ -3033,7 +3033,7 @@
         <target state="new">Categories</target>
         <context-group purpose="location">
           <context context-type="sourcefile">../src/app/frontend/crd/detail/template.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">87</context>
         </context-group>
       </trans-unit>
       <trans-unit id="7db62a1ccd31f1bb55e3532b0f58984a492296a8" datatype="html">
diff --git a/package-lock.json b/package-lock.json
index a90f2eb20..7370877a2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,12 +5,12 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.803.9",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.9.tgz",
-      "integrity": "sha512-grbnPxZ8vnd1UWQUWdJKBxsG8kD6Pj9XtTOEqKg5gH9Vha1zKkEnROWG18TFZzHrJffCE8E18c0OgDIjz+pL3g==",
+      "version": "0.803.15",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.15.tgz",
+      "integrity": "sha512-kxDhEPckatii2efN5mqB2bbGvI65K+sV8iR/yVMN5wK8qchvA9ayU0Qudg2xECvwudxfaZnIbJAoCibEkmdzuw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.9",
+        "@angular-devkit/core": "8.3.15",
         "rxjs": "6.4.0"
       },
       "dependencies": {
@@ -26,18 +26,18 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.803.9",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.9.tgz",
-      "integrity": "sha512-fSA3b506Z06l+Lvbw8xxytG+/WcWclMoO3QTMec897shXAFAZNtK+3KtoF2VITTQcYP12MNIVM7TQiTGof70AQ==",
+      "version": "0.803.15",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.15.tgz",
+      "integrity": "sha512-7fZOask1lWkglhgLUHd6VBJtujr8P7MO2tPrEAP+wu+9rhQoNqCq4xboS8MM/3zKdIM/0y0rWMcL4gNO2mgiSQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.803.9",
-        "@angular-devkit/build-optimizer": "0.803.9",
-        "@angular-devkit/build-webpack": "0.803.9",
-        "@angular-devkit/core": "8.3.9",
+        "@angular-devkit/architect": "0.803.15",
+        "@angular-devkit/build-optimizer": "0.803.15",
+        "@angular-devkit/build-webpack": "0.803.15",
+        "@angular-devkit/core": "8.3.15",
         "@babel/core": "7.5.5",
         "@babel/preset-env": "7.5.5",
-        "@ngtools/webpack": "8.3.9",
+        "@ngtools/webpack": "8.3.15",
         "ajv": "6.10.2",
         "autoprefixer": "9.6.1",
         "browserslist": "4.6.6",
@@ -81,725 +81,19 @@
         "terser-webpack-plugin": "1.4.1",
         "tree-kill": "1.2.1",
         "webpack": "4.39.2",
-        "webpack-dev-middleware": "3.7.0",
-        "webpack-dev-server": "3.8.0",
+        "webpack-dev-middleware": "3.7.2",
+        "webpack-dev-server": "3.9.0",
         "webpack-merge": "4.2.1",
         "webpack-sources": "1.4.3",
         "webpack-subresource-integrity": "1.1.0-rc.6",
         "worker-plugin": "3.2.0"
       },
       "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
-        },
-        "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"
-          }
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
-        },
-        "core-js": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
-          "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "del": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-          "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-          "dev": true,
-          "requires": {
-            "@types/glob": "^7.1.1",
-            "globby": "^6.1.0",
-            "is-path-cwd": "^2.0.0",
-            "is-path-in-cwd": "^2.0.0",
-            "p-map": "^2.0.0",
-            "pify": "^4.0.1",
-            "rimraf": "^2.6.3"
-          }
-        },
-        "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"
-          }
-        },
-        "fsevents": {
-          "version": "1.2.9",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
-          "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "nan": "^2.12.1",
-            "node-pre-gyp": "^0.12.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,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^2.0.6"
-              }
-            },
-            "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.1",
-              "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": "4.1.1",
-              "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.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.2.1"
-              }
-            },
-            "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.3",
-              "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.1",
-              "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.3",
-              "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": "0.0.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "minipass": {
-              "version": "2.3.5",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.0"
-              }
-            },
-            "minizlib": {
-              "version": "1.2.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minipass": "^2.2.1"
-              }
-            },
-            "mkdirp": {
-              "version": "0.5.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "minimist": "0.0.8"
-              }
-            },
-            "ms": {
-              "version": "2.1.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "needle": {
-              "version": "2.3.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "debug": "^4.1.0",
-                "iconv-lite": "^0.4.4",
-                "sax": "^1.2.4"
-              }
-            },
-            "node-pre-gyp": {
-              "version": "0.12.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"
-              }
-            },
-            "nopt": {
-              "version": "4.0.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "abbrev": "1",
-                "osenv": "^0.1.4"
-              }
-            },
-            "npm-bundled": {
-              "version": "1.0.6",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            },
-            "npm-packlist": {
-              "version": "1.4.1",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ignore-walk": "^3.0.1",
-                "npm-bundled": "^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.0",
-              "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"
-              },
-              "dependencies": {
-                "minimist": {
-                  "version": "1.2.0",
-                  "bundled": true,
-                  "dev": true,
-                  "optional": true
-                }
-              }
-            },
-            "readable-stream": {
-              "version": "2.3.6",
-              "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.6.3",
-              "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.0",
-              "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.8",
-              "bundled": true,
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "chownr": "^1.1.1",
-                "fs-minipass": "^1.2.5",
-                "minipass": "^2.3.4",
-                "minizlib": "^1.1.1",
-                "mkdirp": "^0.5.0",
-                "safe-buffer": "^5.1.2",
-                "yallist": "^3.0.2"
-              }
-            },
-            "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.0.3",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-              "dev": true
-            }
-          }
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.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"
-          }
-        },
-        "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"
-          }
+        "core-js": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
+          "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==",
+          "dev": true
         },
         "parse5": {
           "version": "4.0.0",
@@ -817,17 +111,6 @@
             "schema-utils": "^2.0.1"
           }
         },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
         "rxjs": {
           "version": "6.4.0",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
@@ -859,119 +142,21 @@
           }
         },
         "schema-utils": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz",
-          "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==",
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz",
+          "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==",
           "dev": true,
           "requires": {
             "ajv": "^6.10.2",
             "ajv-keywords": "^3.4.1"
           }
-        },
-        "sockjs-client": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
-          "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
-          "dev": true,
-          "requires": {
-            "debug": "^3.2.5",
-            "eventsource": "^1.0.7",
-            "faye-websocket": "~0.11.1",
-            "inherits": "^2.0.3",
-            "json3": "^3.3.2",
-            "url-parse": "^1.4.3"
-          },
-          "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"
-              }
-            }
-          }
-        },
-        "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"
-          }
-        },
-        "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-dev-server": {
-          "version": "3.8.0",
-          "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz",
-          "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==",
-          "dev": true,
-          "requires": {
-            "ansi-html": "0.0.7",
-            "bonjour": "^3.5.0",
-            "chokidar": "^2.1.6",
-            "compression": "^1.7.4",
-            "connect-history-api-fallback": "^1.6.0",
-            "debug": "^4.1.1",
-            "del": "^4.1.1",
-            "express": "^4.17.1",
-            "html-entities": "^1.2.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.0",
-            "killable": "^1.0.1",
-            "loglevel": "^1.6.3",
-            "opn": "^5.5.0",
-            "p-retry": "^3.0.1",
-            "portfinder": "^1.0.21",
-            "schema-utils": "^1.0.0",
-            "selfsigned": "^1.10.4",
-            "semver": "^6.3.0",
-            "serve-index": "^1.9.1",
-            "sockjs": "0.3.19",
-            "sockjs-client": "1.3.0",
-            "spdy": "^4.0.1",
-            "strip-ansi": "^3.0.1",
-            "supports-color": "^6.1.0",
-            "url": "^0.11.0",
-            "webpack-dev-middleware": "^3.7.0",
-            "webpack-log": "^2.0.0",
-            "ws": "^6.2.1",
-            "yargs": "12.0.5"
-          },
-          "dependencies": {
-            "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"
-              }
-            }
-          }
         }
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.803.9",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.9.tgz",
-      "integrity": "sha512-AeuQroeK7eCTTc7JG+DLzglGGp8aymA+9hkFveOoUgqdhnCG9FaqBew8ZetBD6FEokU7eFT4bERJmgq497MTOg==",
+      "version": "0.803.15",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.15.tgz",
+      "integrity": "sha512-uu7RSCc5VsRTcBY0BEjzKiNFmA4PnbjOiPkEXIRjasnEa+PKzhTeiHC0W9gqWW900ea6+sL0W5+rvEeLOjxmuw==",
       "dev": true,
       "requires": {
         "loader-utils": "1.2.3",
@@ -990,15 +175,14 @@
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.803.9",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.9.tgz",
-      "integrity": "sha512-IqS7xAEigI9Uwbv8WtcDN9YYqfYJsS/HxRq0XNYXUfHsdbZGb2qBrQ/8QODbh3V1S99yxTiPn0x+LYhO98zlnA==",
+      "version": "0.803.15",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.15.tgz",
+      "integrity": "sha512-LCO6HI0zm25sVRHphBU0MZbEvLDTr8j2mqlcgOIq1WKCQOeBteKblrR1XnKivlq1VWQUxpxa/RS+vs0o5ypHTA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.803.9",
-        "@angular-devkit/core": "8.3.9",
-        "rxjs": "6.4.0",
-        "webpack-merge": "4.2.1"
+        "@angular-devkit/architect": "0.803.15",
+        "@angular-devkit/core": "8.3.15",
+        "rxjs": "6.4.0"
       },
       "dependencies": {
         "rxjs": {
@@ -1013,9 +197,9 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "8.3.9",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.9.tgz",
-      "integrity": "sha512-LYNdY8UpcEGaqWq0smPhSAiz+Oq1gv4j1LGLLyY1d2CJpf4czIuI8SkTHtmGMjpKy8ss/Vk1mHwRjBrWB0dUag==",
+      "version": "8.3.15",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.15.tgz",
+      "integrity": "sha512-FYUYNcggvRm7glfmqsRgBA1N6ubkINVx2nquZZX10AeCIs4MRqlG4UsddFbOvVckIF/4Q+tBK5P/NngpP1zGXA==",
       "dev": true,
       "requires": {
         "ajv": "6.10.2",
@@ -3035,12 +2219,12 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "8.3.9",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.9.tgz",
-      "integrity": "sha512-SicYBW+3GA0S3q2YMkbNeoidUK0mjiNYk/Im+WaNo9uxyE8Jq2Ui5NXQ9QUxANtFsaeFomXW5rUwCrgkLYLg0w==",
+      "version": "8.3.15",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.15.tgz",
+      "integrity": "sha512-eenlDUIlB1sjmNgioq2gFG2wt9rpgouQBOdjN/PKigglo4XvCPrJYN5XhcinL9Douy28HCTmPHo8+IjMgQChOA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.9",
+        "@angular-devkit/core": "8.3.15",
         "enhanced-resolve": "4.1.0",
         "rxjs": "6.4.0",
         "tree-kill": "1.2.1",
@@ -3544,9 +2728,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "12.11.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.0.tgz",
-      "integrity": "sha512-7v0K9WHdjFpE3LMj1rdRan7PDO2d9Qky51T0cYzzk7fWoqoYKu/fZHnrF7OhNZVx0uKwYoQFMZ3dgVD51s/vYA==",
+      "version": "12.12.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.1.tgz",
+      "integrity": "sha512-m6VgTAkmFCu/uSgAvm4zta1nxMU9U02BFZY36FILD4R/fdRXM7v0EHY3BAg+MCgDmDTIUDj2986G+rMPi49+SQ==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -3555,6 +2739,12 @@
       "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
       "dev": true
     },
+    "@types/sizzle": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
+      "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==",
+      "dev": true
+    },
     "@types/source-list-map": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
@@ -3807,9 +2997,9 @@
       }
     },
     "ace-builds": {
-      "version": "1.4.6",
-      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.6.tgz",
-      "integrity": "sha512-JpuzcHQxTO6Nk8Q1Y8fVQAaxpimziAvVe/CX4h39ig0iHTtBNuySOGHUxmno8mNe4IMbjO8RJICmsrQKTdTWpQ=="
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.7.tgz",
+      "integrity": "sha512-gwQGVFewBopRLho08BfahyvRa9FlB43JUig5ItAKTYc9kJJsbA9QNz75p28QtQomoPQ9rJx82ymL21x4ZSZmdg=="
     },
     "acorn": {
       "version": "6.3.0",
@@ -7710,13 +6900,10 @@
       }
     },
     "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "requires": {
-        "date-now": "^0.1.4"
-      }
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
     },
     "console-control-strings": {
       "version": "1.1.0",
@@ -7868,18 +7055,43 @@
       }
     },
     "core-js": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.2.tgz",
-      "integrity": "sha512-S1FfZpeBchkhyoY76YAdFzKS4zz9aOK7EeFaNA2aJlyXyA+sgqz6xdxmLPGXEAf0nF44MVN1kSjrA9Kt3ATDQg=="
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.3.tgz",
+      "integrity": "sha512-0xmD4vUJRY8nfLyV9zcpC17FtSie5STXzw+HyYw2t8IIvmDnbq7RJUULECCo+NstpJtwK9kx8S+898iyqgeUow=="
     },
     "core-js-compat": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz",
-      "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==",
+      "version": "3.3.5",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.5.tgz",
+      "integrity": "sha512-44ZORuapx0MUht0MUk0p9lcQPh7n/LDXehimTmjCs0CYblpKZcqVd5w0OQDUDq5OQjEbazWObHDQJWvvHYPNTg==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.6",
+        "browserslist": "^4.7.2",
         "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001005",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001005.tgz",
+          "integrity": "sha512-g78miZm1Z5njjYR216a5812oPiLgV1ssndgGxITHWUopmjUrCswMisA0a2kSB7a0vZRox6JOKhM51+efmYN8Mg==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.296",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz",
+          "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==",
+          "dev": true
+        }
       }
     },
     "core-util-is": {
@@ -8071,13 +7283,14 @@
       "dev": true
     },
     "cypress": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.4.1.tgz",
-      "integrity": "sha512-1HBS7t9XXzkt6QHbwfirWYty8vzxNMawGj1yI+Fu6C3/VZJ8UtUngMW6layqwYZzLTZV8tiDpdCNBypn78V4Dg==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.5.0.tgz",
+      "integrity": "sha512-I1iSReD2C8CTP6s4BvQky4gEqHBnKLmhBIqFyCUZdj6BQ6ZDxGnmIbQPM5g79E2iP60KTIbTK99ZPSDVtsNUUg==",
       "dev": true,
       "requires": {
         "@cypress/listr-verbose-renderer": "0.4.1",
         "@cypress/xvfb": "1.2.4",
+        "@types/sizzle": "2.3.2",
         "arch": "2.1.1",
         "bluebird": "3.5.0",
         "cachedir": "1.3.0",
@@ -8104,6 +7317,7 @@
         "request-progress": "3.0.0",
         "supports-color": "5.5.0",
         "tmp": "0.1.0",
+        "untildify": "3.0.3",
         "url": "0.11.0",
         "yauzl": "2.10.0"
       },
@@ -8453,12 +7667,6 @@
       "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
       "dev": true
     },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
     "dateformat": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
@@ -10199,9 +9407,9 @@
       },
       "dependencies": {
         "schema-utils": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz",
-          "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==",
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz",
+          "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==",
           "dev": true,
           "requires": {
             "ajv": "^6.10.2",
@@ -13661,9 +12869,9 @@
       "dev": true
     },
     "karma": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz",
-      "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.0.tgz",
+      "integrity": "sha512-+mvzi+gBWHPrlqt1KE0WrrjcKuePX7WWJjTYNaewp6U00inno/DTSk+QHMbc+aV09scErWjhJukxswFyS7u2qw==",
       "dev": true,
       "requires": {
         "bluebird": "^3.3.0",
@@ -13672,7 +12880,6 @@
         "chokidar": "^3.0.0",
         "colors": "^1.1.0",
         "connect": "^3.6.0",
-        "core-js": "^3.1.3",
         "di": "^0.0.1",
         "dom-serialize": "^2.2.0",
         "flatted": "^2.0.0",
@@ -15869,18 +15076,18 @@
       }
     },
     "node-releases": {
-      "version": "1.1.35",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.35.tgz",
-      "integrity": "sha512-JGcM/wndCN/2elJlU0IGdVEJQQnJwsLbgPCFd2pY7V0mxf17bZ0Gb/lgOtL29ZQhvEX5shnVhxQyZz3ex94N8w==",
+      "version": "1.1.39",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+      "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
       "dev": true,
       "requires": {
         "semver": "^6.3.0"
       }
     },
     "node-sass": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz",
-      "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==",
+      "version": "4.13.0",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz",
+      "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==",
       "dev": true,
       "requires": {
         "async-foreach": "^0.1.3",
@@ -15890,7 +15097,7 @@
         "get-stdin": "^4.0.1",
         "glob": "^7.0.3",
         "in-publish": "^2.0.0",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.15",
         "meow": "^3.7.0",
         "mkdirp": "^0.5.1",
         "nan": "^2.13.2",
@@ -15976,6 +15183,12 @@
             "strip-bom": "^2.0.0"
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "lru-cache": {
           "version": "4.1.5",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -17156,40 +16369,6 @@
       "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
       "dev": true
     },
-    "portfinder": {
-      "version": "1.0.24",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz",
-      "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==",
-      "dev": true,
-      "requires": {
-        "async": "^1.5.2",
-        "debug": "^2.2.0",
-        "mkdirp": "0.5.x"
-      },
-      "dependencies": {
-        "async": {
-          "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-          "dev": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "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
-        }
-      }
-    },
     "portscanner": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz",
@@ -17915,9 +17094,9 @@
       }
     },
     "regjsgen": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
-      "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
       "dev": true
     },
     "regjsparser": {
@@ -20731,9 +19910,9 @@
       },
       "dependencies": {
         "schema-utils": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz",
-          "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==",
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz",
+          "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==",
           "dev": true,
           "requires": {
             "ajv": "^6.10.2",
@@ -21675,6 +20854,12 @@
         }
       }
     },
+    "untildify": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
+      "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==",
+      "dev": true
+    },
     "upath": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
@@ -22853,13 +22038,14 @@
       }
     },
     "webpack-dev-middleware": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz",
-      "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==",
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+      "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
       "dev": true,
       "requires": {
         "memory-fs": "^0.4.1",
-        "mime": "^2.4.2",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
         "range-parser": "^1.2.1",
         "webpack-log": "^2.0.0"
       },
@@ -22873,9 +22059,9 @@
       }
     },
     "webpack-dev-server": {
-      "version": "3.8.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz",
-      "integrity": "sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ==",
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz",
+      "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
@@ -22896,7 +22082,7 @@
         "loglevel": "^1.6.4",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.24",
+        "portfinder": "^1.0.25",
         "schema-utils": "^1.0.0",
         "selfsigned": "^1.10.7",
         "semver": "^6.3.0",
@@ -23592,12 +22778,6 @@
             }
           }
         },
-        "is-absolute-url": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-          "dev": true
-        },
         "is-binary-path": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
@@ -23631,11 +22811,27 @@
           "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
           "dev": true
         },
-        "node-forge": {
-          "version": "0.9.0",
-          "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
-          "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
-          "dev": true
+        "portfinder": {
+          "version": "1.0.25",
+          "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
+          "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
+          "dev": true,
+          "requires": {
+            "async": "^2.6.2",
+            "debug": "^3.1.1",
+            "mkdirp": "^0.5.1"
+          },
+          "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"
+              }
+            }
+          }
         },
         "readdirp": {
           "version": "2.2.1",
@@ -23648,15 +22844,6 @@
             "readable-stream": "^2.0.2"
           }
         },
-        "selfsigned": {
-          "version": "1.10.7",
-          "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
-          "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
-          "dev": true,
-          "requires": {
-            "node-forge": "0.9.0"
-          }
-        },
         "supports-color": {
           "version": "6.1.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
diff --git a/package.json b/package.json
index 4f2183a68..94a373729 100644
--- a/package.json
+++ b/package.json
@@ -109,9 +109,9 @@
     "@types/d3-scale": "2.1.1",
     "@types/file-saver": "2.0.1",
     "@types/highlight.js": "^9.12.3",
-    "ace-builds": "1.4.6",
+    "ace-builds": "1.4.7",
     "c3": "0.7.10",
-    "core-js": "3.3.2",
+    "core-js": "3.3.3",
     "d3": "5.10.1",
     "file-saver": "2.0.2",
     "hammerjs": "2.0.8",
@@ -133,7 +133,7 @@
     "zone.js": "0.9.1"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "0.803.9",
+    "@angular-devkit/build-angular": "0.803.15",
     "@angular/cli": "8.3.7",
     "@angular/compiler-cli": "8.0.3",
     "@angular/language-service": "8.0.3",
@@ -141,13 +141,13 @@
     "@types/jasminewd2": "2.0.8",
     "@types/js-yaml": "3.12.1",
     "@types/lodash": "4.14.143",
-    "@types/node": "12.11.0",
+    "@types/node": "12.12.1",
     "babel": "6.23.0",
     "babel-preset-env": "1.7.0",
     "babel-register": "6.26.0",
     "codelyzer": "4.5.0",
     "concurrently": "5.0.0",
-    "cypress": "3.4.1",
+    "cypress": "3.5.0",
     "del": "5.1.0",
     "git-describe": "4.0.4",
     "gts": "1.1.0",
@@ -159,7 +159,7 @@
     "jasmine-core": "3.5.0",
     "jasmine-spec-reporter": "4.2.1",
     "js-beautify": "1.10.2",
-    "karma": "4.3.0",
+    "karma": "4.4.0",
     "karma-chrome-launcher": "3.1.0",
     "karma-cli": "2.0.0",
     "karma-coverage-istanbul-reporter": "2.1.0",
@@ -173,7 +173,7 @@
     "minimist": "1.2.0",
     "ngx-i18nsupport": "0.17.1",
     "node-gyp": "5.0.4",
-    "node-sass": "4.12.0",
+    "node-sass": "4.13.0",
     "q": "1.5.1",
     "raw-loader": "1.0.0",
     "sass-lint": "1.13.1",
@@ -187,7 +187,7 @@
     "tslint": "5.16.0",
     "typescript": "3.4.5",
     "wait-on": "3.2.0",
-    "webpack-dev-server": "3.8.2"
+    "webpack-dev-server": "3.9.0"
   },
   "engines": {
     "node": ">=10.9.0",
diff --git a/src/app/backend/api/types.go b/src/app/backend/api/types.go
index 226a3a57f..9f7b69b57 100644
--- a/src/app/backend/api/types.go
+++ b/src/app/backend/api/types.go
@@ -141,6 +141,7 @@ const (
 	ResourceKindEndpoint                 = "endpoint"
 )
 
+// Scalable method return whether ResourceKind is scalable.
 func (k ResourceKind) Scalable() bool {
 	scalable := []ResourceKind{
 		ResourceKindDeployment,
@@ -177,6 +178,7 @@ const (
 	ClientTypePluginsClient       = "plugin"
 )
 
+// APIMapping is the mapping from resource kind to ClientType and Namespaced.
 type APIMapping struct {
 	// Kubernetes resource name.
 	Resource string
@@ -186,7 +188,7 @@ type APIMapping struct {
 	Namespaced bool
 }
 
-// Mapping from resource kind to K8s apiserver API path. This is mostly pluralization, because
+// KindToAPIMapping is the mapping from resource kind to K8s apiserver API path. This is mostly pluralization, because
 // Kubernetes apiserver uses plural paths and this project singular.
 // Must be kept in sync with the list of supported kinds.
 // See: https://kubernetes.io/docs/reference/
@@ -219,14 +221,14 @@ var KindToAPIMapping = map[string]APIMapping{
 }
 
 // IsSelectorMatching returns true when an object with the given selector targets the same
-// Resources (or subset) that the tested object with the given selector.
-func IsSelectorMatching(labelSelector map[string]string, testedObjectLabels map[string]string) bool {
+// Resources (or subset) that the target object with the given selector.
+func IsSelectorMatching(srcSelector map[string]string, targetObjectLabels map[string]string) bool {
 	// If service has no selectors, then assume it targets different resource.
-	if len(labelSelector) == 0 {
+	if len(srcSelector) == 0 {
 		return false
 	}
-	for label, value := range labelSelector {
-		if rsValue, ok := testedObjectLabels[label]; !ok || rsValue != value {
+	for label, value := range srcSelector {
+		if rsValue, ok := targetObjectLabels[label]; !ok || rsValue != value {
 			return false
 		}
 	}
@@ -234,18 +236,14 @@ func IsSelectorMatching(labelSelector map[string]string, testedObjectLabels map[
 }
 
 // IsLabelSelectorMatching returns true when a resource with the given selector targets the same
-// Resources(or subset) that a tested object selector with the given selector.
-func IsLabelSelectorMatching(selector map[string]string, labelSelector *v1.LabelSelector) bool {
-	// If the resource has no selectors, then assume it targets different Pods.
-	if len(selector) == 0 {
-		return false
-	}
-	for label, value := range selector {
-		if rsValue, ok := labelSelector.MatchLabels[label]; !ok || rsValue != value {
-			return false
-		}
+// Resources(or subset) that a target object selector with the given selector.
+func IsLabelSelectorMatching(srcSelector map[string]string, targetLabelSelector *v1.LabelSelector) bool {
+	// Check to see if targetLabelSelector pointer is not nil.
+	if targetLabelSelector != nil {
+		targetObjectLabels := targetLabelSelector.MatchLabels
+		return IsSelectorMatching(srcSelector, targetObjectLabels)
 	}
-	return true
+	return false
 }
 
 // ListEverything is a list options used to list all resources without any filtering.
diff --git a/src/app/backend/cert/api/types.go b/src/app/backend/cert/api/types.go
index e0e1ae4a3..8ca74cd08 100644
--- a/src/app/backend/cert/api/types.go
+++ b/src/app/backend/cert/api/types.go
@@ -17,9 +17,10 @@ package api
 import "crypto/tls"
 
 const (
-	// Certificate file names that will be generated by Dashboard
+	// DashboardCertName is the certificate file names that will be generated by Dashboard
 	DashboardCertName = "dashboard.crt"
-	DashboardKeyName  = "dashboard.key"
+	// DashboardKeyName is the key file names that will be generated by Dashboard
+	DashboardKeyName = "dashboard.key"
 )
 
 // Manager is responsible for generating and storing self-signed certificates that can be used by Dashboard
diff --git a/src/app/backend/cert/manager.go b/src/app/backend/cert/manager.go
index 59d54915e..c95e6f909 100644
--- a/src/app/backend/cert/manager.go
+++ b/src/app/backend/cert/manager.go
@@ -22,13 +22,13 @@ import (
 	certapi "github.com/kubernetes/dashboard/src/app/backend/cert/api"
 )
 
-// Implements cert/api/types.Manager interface. See Manager for more information.
+// Manager is used to implement cert/api/types.Manager interface. See Manager for more information.
 type Manager struct {
 	creator certapi.Creator
 	certDir string
 }
 
-// GenerateCertificates implements Manager interface. See Manager for more information.
+// GetCertificates implements Manager interface. See Manager for more information.
 func (self *Manager) GetCertificates() (tls.Certificate, error) {
 	if self.keyFileExists() && self.certFileExists() {
 		log.Println("Certificates already exist. Returning.")
diff --git a/src/app/backend/client/api/types.go b/src/app/backend/client/api/types.go
index f15ca953a..89a277145 100644
--- a/src/app/backend/client/api/types.go
+++ b/src/app/backend/client/api/types.go
@@ -28,10 +28,10 @@ import (
 )
 
 const (
-	// Resource information that are used as csrf token storage. Can be accessible by multiple dashboard replicas.
+	// CsrfTokenSecretName is the resource information that are used as csrf token storage. Can be accessible by multiple dashboard replicas.
 	CsrfTokenSecretName = "kubernetes-dashboard-csrf"
 
-	// Name of the data var that holds the csrf token inside the secret.
+	// CsrfTokenSecretData is the name of the data var that holds the csrf token inside the secret.
 	CsrfTokenSecretData = "csrf"
 )
 
diff --git a/src/app/backend/client/verber.go b/src/app/backend/client/verber.go
index 4a5a4394d..4390439b9 100644
--- a/src/app/backend/client/verber.go
+++ b/src/app/backend/client/verber.go
@@ -21,7 +21,7 @@ import (
 	clientapi "github.com/kubernetes/dashboard/src/app/backend/client/api"
 	"github.com/kubernetes/dashboard/src/app/backend/errors"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/customresourcedefinition"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	restclient "k8s.io/client-go/rest"
@@ -96,10 +96,9 @@ func (verber *resourceVerber) getResourceSpecFromKind(kind string, namespaceSet
 		if namespaceSet {
 			err = errors.NewInvalid(fmt.Sprintf("Set namespace for not-namespaced resource kind: %s", kind))
 			return
-		} else {
-			err = errors.NewInvalid(fmt.Sprintf("Set no namespace for namespaced resource kind: %s", kind))
-			return
 		}
+		err = errors.NewInvalid(fmt.Sprintf("Set no namespace for namespaced resource kind: %s", kind))
+		return
 	}
 
 	if client == nil {
diff --git a/src/app/backend/errors/errors.go b/src/app/backend/errors/errors.go
index d8e12a5fc..2840b7e60 100644
--- a/src/app/backend/errors/errors.go
+++ b/src/app/backend/errors/errors.go
@@ -25,10 +25,15 @@ import (
 
 var _ error = &errors.StatusError{}
 
+// NewUnauthorized returns an error indicating the client is not authorized to perform the requested
+// action.
 func NewUnauthorized(reason string) *errors.StatusError {
 	return errors.NewUnauthorized(reason)
 }
 
+// NewTokenExpired return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches.
 func NewTokenExpired(reason string) *errors.StatusError {
 	return &errors.StatusError{
 		ErrStatus: metav1.Status{
@@ -40,10 +45,14 @@ func NewTokenExpired(reason string) *errors.StatusError {
 	}
 }
 
+// NewBadRequest creates an error that indicates that the request is invalid and can not be processed.
 func NewBadRequest(reason string) *errors.StatusError {
 	return errors.NewBadRequest(reason)
 }
 
+// NewInvalid return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches.
 func NewInvalid(reason string) *errors.StatusError {
 	return &errors.StatusError{
 		ErrStatus: metav1.Status{
@@ -55,6 +64,9 @@ func NewInvalid(reason string) *errors.StatusError {
 	}
 }
 
+// NewNotFound return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches.
 func NewNotFound(reason string) *errors.StatusError {
 	return &errors.StatusError{
 		ErrStatus: metav1.Status{
@@ -66,6 +78,9 @@ func NewNotFound(reason string) *errors.StatusError {
 	}
 }
 
+// NewInternal return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches.
 func NewInternal(reason string) *errors.StatusError {
 	return &errors.StatusError{ErrStatus: metav1.Status{
 		Status: metav1.StatusFailure,
@@ -78,15 +93,24 @@ func NewInternal(reason string) *errors.StatusError {
 	}}
 }
 
+// NewUnexpectedObject return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches.
 func NewUnexpectedObject(obj runtime.Object) *errors.StatusError {
-	return &errors.StatusError{ErrStatus: metav1.Status{
-		Status:  metav1.StatusFailure,
-		Code:    http.StatusInternalServerError,
-		Reason:  metav1.StatusReasonInternalError,
-		Message: errors.FromObject(obj).Error(),
-	}}
+	return &errors.StatusError{
+		ErrStatus: metav1.Status{
+			Status:  metav1.StatusFailure,
+			Code:    http.StatusInternalServerError,
+			Reason:  metav1.StatusReasonInternalError,
+			Message: errors.FromObject(obj).Error(),
+		},
+	}
 }
 
+// NewGenericResponse return a statusError
+// which is an error intended for consumption by a REST API server; it can also be
+// reconstructed by clients from a REST response. Public to allow easy type switches
+// by switch the error code.
 func NewGenericResponse(code int, serverMessage string) *errors.StatusError {
 	reason := metav1.StatusReasonUnknown
 	message := fmt.Sprintf("the server responded with the status code %d but did not return more information", code)
@@ -145,6 +169,7 @@ func NewGenericResponse(code int, serverMessage string) *errors.StatusError {
 	}}
 }
 
+// IsTokenExpired determines if the err is an error which errStatus' message is MsgTokenExpiredError
 func IsTokenExpired(err error) bool {
 	statusErr, ok := err.(*errors.StatusError)
 	if !ok {
@@ -154,10 +179,13 @@ func IsTokenExpired(err error) bool {
 	return statusErr.ErrStatus.Message == MsgTokenExpiredError
 }
 
+// IsAlreadyExists determines if the err is an error which indicates that a specified resource already exists.
 func IsAlreadyExists(err error) bool {
 	return errors.IsAlreadyExists(err)
 }
 
+// IsUnauthorized determines if err is an error which indicates that the request is unauthorized and
+// requires authentication by the user.
 func IsUnauthorized(err error) bool {
 	return errors.IsUnauthorized(err)
 }
diff --git a/src/app/backend/errors/handler.go b/src/app/backend/errors/handler.go
index c153da4e9..2d4b28ff2 100644
--- a/src/app/backend/errors/handler.go
+++ b/src/app/backend/errors/handler.go
@@ -41,10 +41,9 @@ func AppendError(err error, nonCriticalErrors []error) ([]error, error) {
 	if err != nil {
 		if isErrorCritical(err) {
 			return nonCriticalErrors, LocalizeError(err)
-		} else {
-			log.Printf("Non-critical error occurred during resource retrieval: %s", err)
-			nonCriticalErrors = appendMissing(nonCriticalErrors, LocalizeError(err))
 		}
+		log.Printf("Non-critical error occurred during resource retrieval: %s", err)
+		nonCriticalErrors = appendMissing(nonCriticalErrors, LocalizeError(err))
 	}
 	return nonCriticalErrors, nil
 }
@@ -113,6 +112,7 @@ func IsNotFoundError(err error) bool {
 	return status.ErrStatus.Code == http.StatusNotFound
 }
 
+// IsTokenExpiredError determines if the err is the MsgTokenExpiredError.
 func IsTokenExpiredError(err error) bool {
 	if err == nil {
 		return false
@@ -132,7 +132,7 @@ func HandleInternalError(response *restful.Response, err error) {
 	response.WriteErrorString(statusCode, err.Error()+"\n")
 }
 
-// Handle HTTP Errors more accurately based on the localized consts
+// HandleHTTPError is used to handle HTTP Errors more accurately based on the localized consts
 func HandleHTTPError(err error) int {
 	if err == nil {
 		return http.StatusInternalServerError
diff --git a/src/app/backend/handler/apihandler.go b/src/app/backend/handler/apihandler.go
index 01aabea3b..06c520f98 100644
--- a/src/app/backend/handler/apihandler.go
+++ b/src/app/backend/handler/apihandler.go
@@ -149,7 +149,7 @@ func CreateHTTPAPIHandler(iManager integration.IntegrationManager, cManager clie
 			Writes(validation.ProtocolValidity{}))
 	apiV1Ws.Route(
 		apiV1Ws.GET("/appdeployment/protocols").
-			To(apiHandler.handleGetAvailableProcotols).
+			To(apiHandler.handleGetAvailableProtocols).
 			Writes(deployment.Protocols{}))
 
 	apiV1Ws.Route(
@@ -939,12 +939,12 @@ func (apiHandler *APIHandler) handleGetReplicaCount(request *restful.Request, re
 	namespace := request.PathParameter("namespace")
 	kind := request.PathParameter("kind")
 	name := request.PathParameter("name")
-	scaleSpec, err := scaling.GetScaleSpec(cfg, kind, namespace, name)
+	replicaCounts, err := scaling.GetReplicaCounts(cfg, kind, namespace, name)
 	if err != nil {
 		errors.HandleInternalError(response, err)
 		return
 	}
-	response.WriteHeaderAndEntity(http.StatusOK, scaleSpec)
+	response.WriteHeaderAndEntity(http.StatusOK, replicaCounts)
 }
 
 func (apiHandler *APIHandler) handleDeployFromFile(request *restful.Request, response *restful.Response) {
@@ -1024,7 +1024,7 @@ func (apiHandler *APIHandler) handleProtocolValidity(request *restful.Request, r
 	response.WriteHeaderAndEntity(http.StatusOK, validation.ValidateProtocol(spec))
 }
 
-func (apiHandler *APIHandler) handleGetAvailableProcotols(request *restful.Request, response *restful.Response) {
+func (apiHandler *APIHandler) handleGetAvailableProtocols(request *restful.Request, response *restful.Response) {
 	response.WriteHeaderAndEntity(http.StatusOK, deployment.GetAvailableProtocols())
 }
 
@@ -1165,7 +1165,7 @@ func (apiHandler *APIHandler) handleGetPodEvents(request *restful.Request, respo
 
 // Handles execute shell API call
 func (apiHandler *APIHandler) handleExecShell(request *restful.Request, response *restful.Response) {
-	sessionId, err := genTerminalSessionId()
+	sessionID, err := genTerminalSessionId()
 	if err != nil {
 		errors.HandleInternalError(response, err)
 		return
@@ -1183,13 +1183,13 @@ func (apiHandler *APIHandler) handleExecShell(request *restful.Request, response
 		return
 	}
 
-	terminalSessions.Set(sessionId, TerminalSession{
-		id:       sessionId,
+	terminalSessions.Set(sessionID, TerminalSession{
+		id:       sessionID,
 		bound:    make(chan error),
 		sizeChan: make(chan remotecommand.TerminalSize),
 	})
-	go WaitForTerminal(k8sClient, cfg, request, sessionId)
-	response.WriteHeaderAndEntity(http.StatusOK, TerminalResponse{Id: sessionId})
+	go WaitForTerminal(k8sClient, cfg, request, sessionID)
+	response.WriteHeaderAndEntity(http.StatusOK, TerminalResponse{Id: sessionID})
 }
 
 func (apiHandler *APIHandler) handleGetDeployments(request *restful.Request, response *restful.Response) {
@@ -1907,8 +1907,6 @@ func (apiHandler *APIHandler) handleGetJobDetail(request *restful.Request, respo
 
 	namespace := request.PathParameter("namespace")
 	name := request.PathParameter("name")
-	dataSelect := parser.ParseDataSelectPathParameter(request)
-	dataSelect.MetricQuery = dataselect.StandardMetrics
 	result, err := job.GetJobDetail(k8sClient, namespace, name)
 	if err != nil {
 		errors.HandleInternalError(response, err)
diff --git a/src/app/backend/integration/metric/heapster/selector.go b/src/app/backend/integration/metric/heapster/selector.go
index 660269489..942c2098d 100644
--- a/src/app/backend/integration/metric/heapster/selector.go
+++ b/src/app/backend/integration/metric/heapster/selector.go
@@ -63,10 +63,9 @@ func getHeapsterSelector(selector metricapi.ResourceSelector,
 		}
 		return newHeapsterSelectorFromNativeResource(api.ResourceKindPod,
 			selector.Namespace, podListToNameList(myPods), podListToUIDList(myPods))
-	} else {
-		// currently can only convert derived resource to pods. You can change it by implementing other methods
-		return heapsterSelector{}, fmt.Errorf(`Internal Error: Requested summing resources not supported. Requested "%s"`, summingResource)
 	}
+	// currently can only convert derived resource to pods. You can change it by implementing other methods
+	return heapsterSelector{}, fmt.Errorf(`Internal Error: Requested summing resources not supported. Requested "%s"`, summingResource)
 }
 
 // getMyPodsFromCache returns a full list of pods that belong to this resource.
diff --git a/src/app/backend/integration/metric/sidecar/selector.go b/src/app/backend/integration/metric/sidecar/selector.go
index a20426924..69951c3ff 100644
--- a/src/app/backend/integration/metric/sidecar/selector.go
+++ b/src/app/backend/integration/metric/sidecar/selector.go
@@ -63,10 +63,9 @@ func getSidecarSelector(selector metricapi.ResourceSelector,
 		}
 		return newSidecarSelectorFromNativeResource(api.ResourceKindPod,
 			selector.Namespace, podListToNameList(myPods), podListToUIDList(myPods))
-	} else {
-		// currently can only convert derived resource to pods. You can change it by implementing other methods
-		return sidecarSelector{}, fmt.Errorf(`Internal Error: Requested summing resources not supported. Requested "%s"`, summingResource)
 	}
+	// currently can only convert derived resource to pods. You can change it by implementing other methods
+	return sidecarSelector{}, fmt.Errorf(`Internal Error: Requested summing resources not supported. Requested "%s"`, summingResource)
 }
 
 // getMyPodsFromCache returns a full list of pods that belong to this resource.
diff --git a/src/app/backend/resource/common/pod.go b/src/app/backend/resource/common/pod.go
index c67727726..846af0dae 100644
--- a/src/app/backend/resource/common/pod.go
+++ b/src/app/backend/resource/common/pod.go
@@ -22,7 +22,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// FilterPodsByControllerResource returns a subset of pods controlled by given deployment.
+// FilterDeploymentPodsByOwnerReference returns a subset of pods controlled by given deployment.
 func FilterDeploymentPodsByOwnerReference(deployment apps.Deployment, allRS []apps.ReplicaSet,
 	allPods []v1.Pod) []v1.Pod {
 	var matchingPods []v1.Pod
diff --git a/src/app/backend/resource/common/resourcechannels.go b/src/app/backend/resource/common/resourcechannels.go
index 2d6d7683f..f923be636 100644
--- a/src/app/backend/resource/common/resourcechannels.go
+++ b/src/app/backend/resource/common/resourcechannels.go
@@ -24,7 +24,7 @@ import (
 	extensions "k8s.io/api/extensions/v1beta1"
 	rbac "k8s.io/api/rbac/v1"
 	storage "k8s.io/api/storage/v1"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	client "k8s.io/client-go/kubernetes"
@@ -851,7 +851,7 @@ func GetCustomResourceDefinitionChannel(client apiextensionsclientset.Interface,
 	}
 
 	go func() {
-		list, err := client.ApiextensionsV1beta1().CustomResourceDefinitions().List(api.ListEverything)
+		list, err := client.ApiextensionsV1().CustomResourceDefinitions().List(api.ListEverything)
 		for i := 0; i < numReads; i++ {
 			channel.List <- list
 			channel.Error <- err
diff --git a/src/app/backend/resource/configmap/list.go b/src/app/backend/resource/configmap/list.go
index 3c7ce4138..0ae0ab341 100644
--- a/src/app/backend/resource/configmap/list.go
+++ b/src/app/backend/resource/configmap/list.go
@@ -26,7 +26,7 @@ import (
 	kubernetes "k8s.io/client-go/kubernetes"
 )
 
-// ConfigMapListComponent contains a list of Config Maps in the cluster.
+// ConfigMapList contains a list of Config Maps in the cluster.
 type ConfigMapList struct {
 	ListMeta api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/resource/cronjob/list.go b/src/app/backend/resource/cronjob/list.go
index b3a353b72..dcc442001 100644
--- a/src/app/backend/resource/cronjob/list.go
+++ b/src/app/backend/resource/cronjob/list.go
@@ -27,7 +27,7 @@ import (
 	client "k8s.io/client-go/kubernetes"
 )
 
-// CronJobListComponent contains a list of CronJobs in the cluster.
+// CronJobList contains a list of CronJobs in the cluster.
 type CronJobList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
diff --git a/src/app/backend/resource/customresourcedefinition/client.go b/src/app/backend/resource/customresourcedefinition/client.go
index 2a52eccb3..490dd4f2b 100644
--- a/src/app/backend/resource/customresourcedefinition/client.go
+++ b/src/app/backend/resource/customresourcedefinition/client.go
@@ -15,7 +15,7 @@
 package customresourcedefinition
 
 import (
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/serializer"
diff --git a/src/app/backend/resource/customresourcedefinition/common.go b/src/app/backend/resource/customresourcedefinition/common.go
index 7a02ee7e3..50e4d210d 100644
--- a/src/app/backend/resource/customresourcedefinition/common.go
+++ b/src/app/backend/resource/customresourcedefinition/common.go
@@ -18,7 +18,7 @@ import (
 	"github.com/kubernetes/dashboard/src/app/backend/resource/common"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/dataselect"
 	api "k8s.io/api/core/v1"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 )
 
@@ -92,7 +92,7 @@ func fromObjectCells(cells []dataselect.DataCell) []CustomResourceObject {
 func getCustomResourceDefinitionGroupVersion(crd *apiextensions.CustomResourceDefinition) schema.GroupVersion {
 	return schema.GroupVersion{
 		Group:   crd.Spec.Group,
-		Version: crd.Spec.Version,
+		Version: crd.Spec.Versions[0].Name,
 	}
 }
 
diff --git a/src/app/backend/resource/customresourcedefinition/detail.go b/src/app/backend/resource/customresourcedefinition/detail.go
index 905c32d14..01927cb64 100644
--- a/src/app/backend/resource/customresourcedefinition/detail.go
+++ b/src/app/backend/resource/customresourcedefinition/detail.go
@@ -18,7 +18,7 @@ import (
 	"github.com/kubernetes/dashboard/src/app/backend/errors"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/common"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/dataselect"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/rest"
@@ -44,7 +44,7 @@ type CustomResourceDefinitionVersion struct {
 
 // GetCustomResourceDefinitionDetail returns detailed information about a custom resource definition.
 func GetCustomResourceDefinitionDetail(client apiextensionsclientset.Interface, config *rest.Config, name string) (*CustomResourceDefinitionDetail, error) {
-	customResourceDefinition, err := client.ApiextensionsV1beta1().
+	customResourceDefinition, err := client.ApiextensionsV1().
 		CustomResourceDefinitions().
 		Get(name, metav1.GetOptions{})
 	nonCriticalErrors, criticalError := errors.HandleError(err)
@@ -63,11 +63,12 @@ func GetCustomResourceDefinitionDetail(client apiextensionsclientset.Interface,
 
 func toCustomResourceDefinitionDetail(crd *apiextensions.CustomResourceDefinition, objects CustomResourceObjectList, nonCriticalErrors []error) *CustomResourceDefinitionDetail {
 	subresources := []string{}
-	if crd.Spec.Subresources != nil {
-		if crd.Spec.Subresources.Scale != nil {
+	crdSubresources := crd.Spec.Versions[0].Subresources
+	if crdSubresources != nil {
+		if crdSubresources.Scale != nil {
 			subresources = append(subresources, "Scale")
 		}
-		if crd.Spec.Subresources.Status != nil {
+		if crdSubresources.Status != nil {
 			subresources = append(subresources, "Status")
 		}
 	}
diff --git a/src/app/backend/resource/customresourcedefinition/list.go b/src/app/backend/resource/customresourcedefinition/list.go
index c16e72df4..da42f5ff5 100644
--- a/src/app/backend/resource/customresourcedefinition/list.go
+++ b/src/app/backend/resource/customresourcedefinition/list.go
@@ -19,7 +19,7 @@ import (
 	"github.com/kubernetes/dashboard/src/app/backend/errors"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/common"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/dataselect"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 )
 
@@ -81,7 +81,7 @@ func toCustomResourceDefinition(crd *apiextensions.CustomResourceDefinition) Cus
 	return CustomResourceDefinition{
 		ObjectMeta:  api.NewObjectMeta(crd.ObjectMeta),
 		TypeMeta:    api.NewTypeMeta(api.ResourceKindCustomResourceDefinition),
-		Version:     crd.Spec.Version,
+		Version:     crd.Spec.Versions[0].Name,
 		Group:       crd.Spec.Group,
 		Scope:       crd.Spec.Scope,
 		Names:       crd.Status.AcceptedNames,
diff --git a/src/app/backend/resource/customresourcedefinition/objects.go b/src/app/backend/resource/customresourcedefinition/objects.go
index 5f4e460b6..dfa56b021 100644
--- a/src/app/backend/resource/customresourcedefinition/objects.go
+++ b/src/app/backend/resource/customresourcedefinition/objects.go
@@ -21,7 +21,7 @@ import (
 	"github.com/kubernetes/dashboard/src/app/backend/errors"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/common"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/dataselect"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/rest"
@@ -89,7 +89,7 @@ func GetCustomResourceObjectList(client apiextensionsclientset.Interface, config
 	dsQuery *dataselect.DataSelectQuery, crdName string) (*CustomResourceObjectList, error) {
 	var list *CustomResourceObjectList
 
-	customResourceDefinition, err := client.ApiextensionsV1beta1().
+	customResourceDefinition, err := client.ApiextensionsV1().
 		CustomResourceDefinitions().
 		Get(crdName, metav1.GetOptions{})
 	nonCriticalErrors, criticalError := errors.HandleError(err)
@@ -135,7 +135,7 @@ func GetCustomResourceObjectList(client apiextensionsclientset.Interface, config
 func GetCustomResourceObjectDetail(client apiextensionsclientset.Interface, namespace *common.NamespaceQuery, config *rest.Config, crdName string, name string) (*CustomResourceObjectDetail, error) {
 	var detail *CustomResourceObjectDetail
 
-	customResourceDefinition, err := client.ApiextensionsV1beta1().
+	customResourceDefinition, err := client.ApiextensionsV1().
 		CustomResourceDefinitions().
 		Get(crdName, metav1.GetOptions{})
 	nonCriticalErrors, criticalError := errors.HandleError(err)
@@ -173,5 +173,6 @@ func GetCustomResourceObjectDetail(client apiextensionsclientset.Interface, name
 // E.g. changes "Foo" to "foos.samplecontroller.k8s.io"
 func toCRDObject(object *CustomResourceObject, crd *apiextensions.CustomResourceDefinition) {
 	object.TypeMeta.Kind = api.ResourceKind(crd.Name)
-	object.TypeMeta.Scalable = crd.Spec.Subresources != nil && crd.Spec.Subresources.Scale != nil
+	crdSubresources := crd.Spec.Versions[0].Subresources
+	object.TypeMeta.Scalable = crdSubresources != nil && crdSubresources.Scale != nil
 }
diff --git a/src/app/backend/resource/daemonset/detail.go b/src/app/backend/resource/daemonset/detail.go
index f8522ee3a..473590307 100644
--- a/src/app/backend/resource/daemonset/detail.go
+++ b/src/app/backend/resource/daemonset/detail.go
@@ -24,7 +24,7 @@ import (
 	k8sClient "k8s.io/client-go/kubernetes"
 )
 
-// DaemonSeDetail represents detailed information about a Daemon Set.
+// DaemonSetDetail represents detailed information about a Daemon Set.
 type DaemonSetDetail struct {
 	// Extends list item structure.
 	DaemonSet `json:",inline"`
@@ -35,7 +35,7 @@ type DaemonSetDetail struct {
 	Errors []error `json:"errors"`
 }
 
-// Returns detailed information about the given daemon set in the given namespace.
+// GetDaemonSetDetail Returns detailed information about the given daemon set in the given namespace.
 func GetDaemonSetDetail(client k8sClient.Interface, metricClient metricapi.MetricClient,
 	namespace, name string) (*DaemonSetDetail, error) {
 
diff --git a/src/app/backend/resource/daemonset/list.go b/src/app/backend/resource/daemonset/list.go
index b960bcb0d..8ab17b842 100644
--- a/src/app/backend/resource/daemonset/list.go
+++ b/src/app/backend/resource/daemonset/list.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
-// DaemonSetListComponent contains a list of Daemon Sets in the cluster.
+// DaemonSetList contains a list of Daemon Sets in the cluster.
 type DaemonSetList struct {
 	ListMeta          api.ListMeta          `json:"listMeta"`
 	DaemonSets        []DaemonSet           `json:"daemonSets"`
diff --git a/src/app/backend/resource/deployment/common.go b/src/app/backend/resource/deployment/common.go
index 724023e9d..fbcb5924f 100644
--- a/src/app/backend/resource/deployment/common.go
+++ b/src/app/backend/resource/deployment/common.go
@@ -28,6 +28,7 @@ import (
 
 type DeploymentCell apps.Deployment
 
+// GetProperty is used to get property of the deployment
 func (self DeploymentCell) GetProperty(name dataselect.PropertyName) dataselect.ComparableValue {
 	switch name {
 	case dataselect.NameProperty:
diff --git a/src/app/backend/resource/deployment/detail.go b/src/app/backend/resource/deployment/detail.go
index 12c0c1903..29ce2ab55 100644
--- a/src/app/backend/resource/deployment/detail.go
+++ b/src/app/backend/resource/deployment/detail.go
@@ -31,6 +31,7 @@ type RollingUpdateStrategy struct {
 	MaxUnavailable *intstr.IntOrString `json:"maxUnavailable"`
 }
 
+// StatusInfo is the status information of the deployment
 type StatusInfo struct {
 	// Total number of desired replicas on the deployment
 	Replicas int32 `json:"replicas"`
@@ -145,6 +146,7 @@ func GetDeploymentDetail(client client.Interface, namespace string, deploymentNa
 	}, nil
 }
 
+// GetStatusInfo is used to get the status information from the *apps.DeploymentStatus
 func GetStatusInfo(deploymentStatus *apps.DeploymentStatus) StatusInfo {
 	return StatusInfo{
 		Replicas:    deploymentStatus.Replicas,
diff --git a/src/app/backend/resource/deployment/list.go b/src/app/backend/resource/deployment/list.go
index f8759f56a..8cfc3fe79 100644
--- a/src/app/backend/resource/deployment/list.go
+++ b/src/app/backend/resource/deployment/list.go
@@ -28,7 +28,7 @@ import (
 	client "k8s.io/client-go/kubernetes"
 )
 
-// DeploymentListComponent contains a list of Deployments in the cluster.
+// DeploymentList contains a list of Deployments in the cluster.
 type DeploymentList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
@@ -75,7 +75,7 @@ func GetDeploymentList(client client.Interface, nsQuery *common.NamespaceQuery,
 	return GetDeploymentListFromChannels(channels, dsQuery, metricClient)
 }
 
-// GetDeploymentList returns a list of all Deployments in the cluster
+// GetDeploymentListFromChannels returns a list of all Deployments in the cluster
 // reading required resource list once from the channels.
 func GetDeploymentListFromChannels(channels *common.ResourceChannels, dsQuery *dataselect.DataSelectQuery,
 	metricClient metricapi.MetricClient) (*DeploymentList, error) {
diff --git a/src/app/backend/resource/deployment/newreplicasets.go b/src/app/backend/resource/deployment/newreplicasets.go
index 4f834b811..fc63cf495 100644
--- a/src/app/backend/resource/deployment/newreplicasets.go
+++ b/src/app/backend/resource/deployment/newreplicasets.go
@@ -25,7 +25,7 @@ import (
 	"github.com/kubernetes/dashboard/src/app/backend/resource/replicaset"
 )
 
-//GetDeploymentOldReplicaSets returns old replica sets targeting Deployment with given name
+// GetDeploymentNewReplicaSet returns old replica sets targeting Deployment with given name
 func GetDeploymentNewReplicaSet(client client.Interface, dsQuery *dataselect.DataSelectQuery,
 	namespace string, deploymentName string) (*replicaset.ReplicaSet, error) {
 
diff --git a/src/app/backend/resource/ingress/list.go b/src/app/backend/resource/ingress/list.go
index f7cfbfd36..61c347ff1 100644
--- a/src/app/backend/resource/ingress/list.go
+++ b/src/app/backend/resource/ingress/list.go
@@ -32,7 +32,7 @@ type Ingress struct {
 	Endpoints []common.Endpoint `json:"endpoints"`
 }
 
-// IngressListComponent - response structure for a queried ingress list.
+// IngressList - response structure for a queried ingress list.
 type IngressList struct {
 	api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/resource/job/list.go b/src/app/backend/resource/job/list.go
index d938f320d..301696d93 100644
--- a/src/app/backend/resource/job/list.go
+++ b/src/app/backend/resource/job/list.go
@@ -28,7 +28,7 @@ import (
 	client "k8s.io/client-go/kubernetes"
 )
 
-// JobListComponent contains a list of Jobs in the cluster.
+// JobList contains a list of Jobs in the cluster.
 type JobList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
@@ -46,11 +46,11 @@ type JobList struct {
 type JobStatusType string
 
 const (
-	// JobRunning means the job is still running.
+	// JobStatusRunning means the job is still running.
 	JobStatusRunning JobStatusType = "Running"
-	// JobComplete means the job has completed its execution.
+	// JobStatusComplete means the job has completed its execution.
 	JobStatusComplete JobStatusType = "Complete"
-	// JobFailed means the job has failed its execution.
+	// JobStatusFailed means the job has failed its execution.
 	JobStatusFailed JobStatusType = "Failed"
 )
 
diff --git a/src/app/backend/resource/limitrange/detail.go b/src/app/backend/resource/limitrange/detail.go
index 38d49b513..fc66ecd2a 100644
--- a/src/app/backend/resource/limitrange/detail.go
+++ b/src/app/backend/resource/limitrange/detail.go
@@ -27,12 +27,11 @@ func (rMap rangeMap) getRange(resource api.ResourceName) *LimitRangeItem {
 	if !ok {
 		rMap[resource] = &LimitRangeItem{}
 		return rMap[resource]
-	} else {
-		return r
 	}
+	return r
 }
 
-// LimitRange provides resource limit range values
+// LimitRangeItem provides resource limit range values
 type LimitRangeItem struct {
 	// ResourceName usage constraints on this kind by resource name
 	ResourceName string `json:"resourceName,omitempty"`
diff --git a/src/app/backend/resource/persistentvolumeclaim/list.go b/src/app/backend/resource/persistentvolumeclaim/list.go
index 7687ae0dd..989aae2b6 100644
--- a/src/app/backend/resource/persistentvolumeclaim/list.go
+++ b/src/app/backend/resource/persistentvolumeclaim/list.go
@@ -25,7 +25,7 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
-// PersistentVolumeClaimListComponent contains a list of Persistent Volume Claims in the cluster.
+// PersistentVolumeClaimList contains a list of Persistent Volume Claims in the cluster.
 type PersistentVolumeClaimList struct {
 	ListMeta api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/resource/pod/common.go b/src/app/backend/resource/pod/common.go
index 7320acc0d..06aad98fd 100644
--- a/src/app/backend/resource/pod/common.go
+++ b/src/app/backend/resource/pod/common.go
@@ -23,7 +23,7 @@ import (
 	v1 "k8s.io/api/core/v1"
 )
 
-// Gets restart count of given pod (total number of its containers restarts).
+// getRestartCount return the restart count of given pod (total number of its containers restarts).
 func getRestartCount(pod v1.Pod) int32 {
 	var restartCount int32 = 0
 	for _, containerStatus := range pod.Status.ContainerStatuses {
diff --git a/src/app/backend/resource/pod/list.go b/src/app/backend/resource/pod/list.go
index e6db0e086..55a2404c2 100644
--- a/src/app/backend/resource/pod/list.go
+++ b/src/app/backend/resource/pod/list.go
@@ -28,7 +28,7 @@ import (
 	k8sClient "k8s.io/client-go/kubernetes"
 )
 
-// PodListComponent contains a list of Pods in the cluster.
+// PodList contains a list of Pods in the cluster.
 type PodList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
diff --git a/src/app/backend/resource/replicaset/list.go b/src/app/backend/resource/replicaset/list.go
index a58312266..cc420b3eb 100644
--- a/src/app/backend/resource/replicaset/list.go
+++ b/src/app/backend/resource/replicaset/list.go
@@ -28,7 +28,7 @@ import (
 	client "k8s.io/client-go/kubernetes"
 )
 
-// ReplicaSetListComponent contains a list of Replica Sets in the cluster.
+// ReplicaSetList contains a list of Replica Sets in the cluster.
 type ReplicaSetList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
diff --git a/src/app/backend/resource/replicationcontroller/list.go b/src/app/backend/resource/replicationcontroller/list.go
index 73f97097f..116e45a63 100644
--- a/src/app/backend/resource/replicationcontroller/list.go
+++ b/src/app/backend/resource/replicationcontroller/list.go
@@ -27,7 +27,7 @@ import (
 	client "k8s.io/client-go/kubernetes"
 )
 
-// ReplicationControllerListComponent contains a list of Replication Controllers in the cluster.
+// ReplicationControllerList contains a list of Replication Controllers in the cluster.
 type ReplicationControllerList struct {
 	ListMeta          api.ListMeta       `json:"listMeta"`
 	CumulativeMetrics []metricapi.Metric `json:"cumulativeMetrics"`
diff --git a/src/app/backend/resource/secret/list.go b/src/app/backend/resource/secret/list.go
index 9bbb9ada7..592144d2b 100644
--- a/src/app/backend/resource/secret/list.go
+++ b/src/app/backend/resource/secret/list.go
@@ -70,7 +70,7 @@ type Secret struct {
 	Type       v1.SecretType  `json:"type"`
 }
 
-// SecretsList is a response structure for a queried secrets list.
+// SecretList is a response structure for a queried secrets list.
 type SecretList struct {
 	api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/resource/service/list.go b/src/app/backend/resource/service/list.go
index 6a8237a51..e48638b27 100644
--- a/src/app/backend/resource/service/list.go
+++ b/src/app/backend/resource/service/list.go
@@ -49,7 +49,7 @@ type Service struct {
 	ClusterIP string `json:"clusterIP"`
 }
 
-// ServiceListComponent contains a list of services in the cluster.
+// ServiceList contains a list of services in the cluster.
 type ServiceList struct {
 	ListMeta api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/resource/statefulset/list.go b/src/app/backend/resource/statefulset/list.go
index b378bd165..37a3e73a9 100644
--- a/src/app/backend/resource/statefulset/list.go
+++ b/src/app/backend/resource/statefulset/list.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
-// StatefulSetListComponent contains a list of Stateful Sets in the cluster.
+// StatefulSetList contains a list of Stateful Sets in the cluster.
 type StatefulSetList struct {
 	ListMeta api.ListMeta `json:"listMeta"`
 
diff --git a/src/app/backend/scaling/scale.go b/src/app/backend/scaling/scale.go
index 88ea7f9df..66569fe91 100644
--- a/src/app/backend/scaling/scale.go
+++ b/src/app/backend/scaling/scale.go
@@ -34,8 +34,8 @@ type ReplicaCounts struct {
 	ActualReplicas  int32 `json:"actualReplicas"`
 }
 
-// GetScaleSpec returns a populated ReplicaCounts object with desired and actual number of replicas.
-func GetScaleSpec(cfg *rest.Config, kind, namespace, name string) (*ReplicaCounts, error) {
+// GetReplicaCounts returns a populated ReplicaCounts object with desired and actual number of replicas.
+func GetReplicaCounts(cfg *rest.Config, kind, namespace, name string) (*ReplicaCounts, error) {
 	sc, err := getScaleGetter(cfg)
 	if err != nil {
 		return nil, err
@@ -116,7 +116,7 @@ func getGroupResource(kind string) schema.GroupResource {
 
 	if gr.Group != "" && gr.Resource != "" {
 		return gr
-	} else {
-		return apps.Resource(kind)
 	}
+
+	return apps.Resource(kind)
 }
diff --git a/src/app/backend/systembanner/api/types.go b/src/app/backend/systembanner/api/types.go
index 2ca75518f..1e437cd1d 100644
--- a/src/app/backend/systembanner/api/types.go
+++ b/src/app/backend/systembanner/api/types.go
@@ -33,10 +33,10 @@ const (
 	// SystemBannerSeverityInfo is the lowest of allowed system banner severities.
 	SystemBannerSeverityInfo SystemBannerSeverity = "INFO"
 
-	// SystemBannerSeverityInfo is in the middle of allowed system banner severities.
+	// SystemBannerSeverityWarning is in the middle of allowed system banner severities.
 	SystemBannerSeverityWarning SystemBannerSeverity = "WARNING"
 
-	// SystemBannerSeverityInfo is the highest of allowed system banner severities.
+	// SystemBannerSeverityError is the highest of allowed system banner severities.
 	SystemBannerSeverityError SystemBannerSeverity = "ERROR"
 )
 
diff --git a/src/app/backend/validation/validaterbacstatus.go b/src/app/backend/validation/validaterbacstatus.go
index 435479108..8991262d7 100644
--- a/src/app/backend/validation/validaterbacstatus.go
+++ b/src/app/backend/validation/validaterbacstatus.go
@@ -23,13 +23,13 @@ import (
 	"k8s.io/client-go/kubernetes"
 )
 
-// RBACStatus describes status of RBAC in the cluster.
+// RbacStatus describes status of RBAC in the cluster.
 type RbacStatus struct {
 	// True when RBAC is enabled in the cluster.
 	Enabled bool `json:"enabled"`
 }
 
-// ValidateRBACStatus validates if RBAC is enabled in the cluster.
+// ValidateRbacStatus validates if RBAC is enabled in the cluster.
 // Supported version of RBAC api is: 'rbac.authorization.k8s.io/v1beta1'
 func ValidateRbacStatus(client kubernetes.Interface) (*RbacStatus, error) {
 	groupList, err := client.Discovery().ServerGroups()
diff --git a/src/app/frontend/assets/robots.txt b/src/app/frontend/assets/robots.txt
new file mode 100644
index 000000000..1f53798bb
--- /dev/null
+++ b/src/app/frontend/assets/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
diff --git a/src/app/frontend/chrome/nav/template.html b/src/app/frontend/chrome/nav/template.html
index 0d28f19b5..ce4fd9c61 100644
--- a/src/app/frontend/chrome/nav/template.html
+++ b/src/app/frontend/chrome/nav/template.html
@@ -131,6 +131,7 @@ limitations under the License.
 
     <div class="kd-nav-group">
       <kd-nav-item class="kd-nav-group-item"
+                   id="sidebar-crd"
                    state="/customresourcedefinition"
                    [exact]="true"
                    i18n>Custom Resource Definitions
diff --git a/src/app/frontend/common/components/graphmetrics/component.ts b/src/app/frontend/common/components/graphmetrics/component.ts
new file mode 100644
index 000000000..8406115a7
--- /dev/null
+++ b/src/app/frontend/common/components/graphmetrics/component.ts
@@ -0,0 +1,32 @@
+// Copyright 2017 The Kubernetes Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import {Component, Input} from '@angular/core';
+import {Metric} from '@api/backendapi';
+
+@Component({
+  selector: 'kd-graph-metrics',
+  templateUrl: './template.html',
+  styleUrls: ['./style.scss'],
+})
+export class GraphMetricsComponent {
+  @Input() metrics: Metric[];
+
+  showGraphs(): boolean {
+    return (
+      this.metrics &&
+      this.metrics.every(metrics => metrics.dataPoints && metrics.dataPoints.length > 1)
+    );
+  }
+}
diff --git a/src/app/frontend/overview/style.scss b/src/app/frontend/common/components/graphmetrics/style.scss
similarity index 100%
rename from src/app/frontend/overview/style.scss
rename to src/app/frontend/common/components/graphmetrics/style.scss
diff --git a/src/app/frontend/common/components/graphmetrics/template.html b/src/app/frontend/common/components/graphmetrics/template.html
new file mode 100644
index 000000000..072cc4deb
--- /dev/null
+++ b/src/app/frontend/common/components/graphmetrics/template.html
@@ -0,0 +1,29 @@
+<!--
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<div fxLayout="row"
+     *ngIf="showGraphs()">
+  <div class="graph-col">
+    <kd-graph-card graphTitle="CPU Usage"
+                   [metrics]="metrics"
+                   selectedMetricName="cpu/usage_rate"></kd-graph-card>
+  </div>
+  <div class="graph-col">
+    <kd-graph-card graphTitle="Memory Usage"
+                   [metrics]="metrics"
+                   selectedMetricName="memory/usage"></kd-graph-card>
+  </div>
+</div>
diff --git a/src/app/frontend/common/components/list/column/menu/template.html b/src/app/frontend/common/components/list/column/menu/template.html
index 7897c4021..52a90aefe 100644
--- a/src/app/frontend/common/components/list/column/menu/template.html
+++ b/src/app/frontend/common/components/list/column/menu/template.html
@@ -44,15 +44,18 @@ limitations under the License.
     </ng-container>
   </button>
   <button mat-menu-item
+          id="edit"
           (click)="onEdit()"
           i18n>Edit</button>
   <button mat-menu-item
+          id="delete"
           (click)="onDelete()"
           i18n>Delete</button>
 </mat-menu>
 
 <a mat-icon-button
    class="kd-muted"
+   id="more-menu"
    [matMenuTriggerFor]="actions"
    (click)="$event.stopPropagation()">
   <mat-icon matTooltip="Actions">more_vert</mat-icon>
diff --git a/src/app/frontend/common/components/list/zerostate/template.html b/src/app/frontend/common/components/list/zerostate/template.html
index 5d8e1225a..d00962648 100644
--- a/src/app/frontend/common/components/list/zerostate/template.html
+++ b/src/app/frontend/common/components/list/zerostate/template.html
@@ -15,6 +15,7 @@ limitations under the License.
 -->
 
 <div fxLayout="column"
+     id="zero-state"
      class="kd-muted kd-zerostate-container">
   <div fxFlexAlign="center"
        class="kd-zerostate-title"
diff --git a/src/app/frontend/common/components/module.ts b/src/app/frontend/common/components/module.ts
index d8d1d42fd..63ff09641 100644
--- a/src/app/frontend/common/components/module.ts
+++ b/src/app/frontend/common/components/module.ts
@@ -46,6 +46,7 @@ import {ExternalEndpointComponent} from './endpoint/external/component';
 import {InternalEndpointComponent} from './endpoint/internal/component';
 import {GraphComponent} from './graph/component';
 import {GraphCardComponent} from './graphcard/component';
+import {GraphMetricsComponent} from './graphmetrics/component';
 import {HiddenPropertyComponent} from './hiddenproperty/component';
 import {ResourceLimitListComponent} from './limits/component';
 import {ColumnComponent} from './list/column/component';
@@ -121,8 +122,6 @@ const components = [
   CRDListComponent,
   CRDObjectListComponent,
   CRDVersionListComponent,
-  GraphComponent,
-  GraphCardComponent,
 
   DaemonSetListComponent,
   DateComponent,
@@ -133,6 +132,10 @@ const components = [
   ExternalEndpointComponent,
   EventListComponent,
 
+  GraphComponent,
+  GraphCardComponent,
+  GraphMetricsComponent,
+
   HiddenPropertyComponent,
 
   IngressListComponent,
diff --git a/src/app/frontend/common/components/resourcelist/daemonset/component.ts b/src/app/frontend/common/components/resourcelist/daemonset/component.ts
index 16ee7fcbd..7c6cfe25e 100644
--- a/src/app/frontend/common/components/resourcelist/daemonset/component.ts
+++ b/src/app/frontend/common/components/resourcelist/daemonset/component.ts
@@ -20,7 +20,7 @@ import {
   ComponentFactoryResolver,
   Input,
 } from '@angular/core';
-import {DaemonSet, DaemonSetList, Event} from '@api/backendapi';
+import {DaemonSet, DaemonSetList, Event, Metric} from '@api/backendapi';
 import {Observable} from 'rxjs/Observable';
 
 import {ResourceListWithStatuses} from '../../../resources/list';
@@ -37,6 +37,8 @@ import {ListGroupIdentifier, ListIdentifier} from '../groupids';
 })
 export class DaemonSetListComponent extends ResourceListWithStatuses<DaemonSetList, DaemonSet> {
   @Input() endpoint = EndpointManager.resource(Resource.daemonSet, true).list();
+  @Input() showMetrics = false;
+  cumulativeMetrics: Metric[];
 
   constructor(
     private readonly daemonSet_: NamespacedResourceService<DaemonSetList>,
@@ -65,6 +67,7 @@ export class DaemonSetListComponent extends ResourceListWithStatuses<DaemonSetLi
   }
 
   map(daemonSetList: DaemonSetList): DaemonSet[] {
+    this.cumulativeMetrics = daemonSetList.cumulativeMetrics;
     return daemonSetList.daemonSets;
   }
 
diff --git a/src/app/frontend/common/components/resourcelist/daemonset/template.html b/src/app/frontend/common/components/resourcelist/daemonset/template.html
index af0b36887..b09143a92 100644
--- a/src/app/frontend/common/components/resourcelist/daemonset/template.html
+++ b/src/app/frontend/common/components/resourcelist/daemonset/template.html
@@ -14,6 +14,9 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="cumulativeMetrics"
+                  *ngIf="showMetrics"></kd-graph-metrics>
+
 <kd-card role="table"
          [hidden]="isHidden()">
   <div title
diff --git a/src/app/frontend/common/components/resourcelist/deployment/component.ts b/src/app/frontend/common/components/resourcelist/deployment/component.ts
index 341500f08..d52833ee1 100644
--- a/src/app/frontend/common/components/resourcelist/deployment/component.ts
+++ b/src/app/frontend/common/components/resourcelist/deployment/component.ts
@@ -20,7 +20,7 @@ import {
   ComponentFactoryResolver,
   Input,
 } from '@angular/core';
-import {Deployment, DeploymentList, Event} from '@api/backendapi';
+import {Deployment, DeploymentList, Event, Metric} from '@api/backendapi';
 import {Observable} from 'rxjs/Observable';
 import {ResourceListWithStatuses} from '../../../resources/list';
 import {NotificationsService} from '../../../services/global/notifications';
@@ -36,6 +36,8 @@ import {ListGroupIdentifier, ListIdentifier} from '../groupids';
 })
 export class DeploymentListComponent extends ResourceListWithStatuses<DeploymentList, Deployment> {
   @Input() endpoint = EndpointManager.resource(Resource.deployment, true).list();
+  @Input() showMetrics = false;
+  cumulativeMetrics: Metric[];
 
   constructor(
     private readonly deployment_: NamespacedResourceService<DeploymentList>,
@@ -64,6 +66,7 @@ export class DeploymentListComponent extends ResourceListWithStatuses<Deployment
   }
 
   map(deploymentList: DeploymentList): Deployment[] {
+    this.cumulativeMetrics = deploymentList.cumulativeMetrics;
     return deploymentList.deployments;
   }
 
diff --git a/src/app/frontend/common/components/resourcelist/deployment/template.html b/src/app/frontend/common/components/resourcelist/deployment/template.html
index 7dccd7768..7ebc70ae4 100644
--- a/src/app/frontend/common/components/resourcelist/deployment/template.html
+++ b/src/app/frontend/common/components/resourcelist/deployment/template.html
@@ -14,6 +14,9 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="cumulativeMetrics"
+                  *ngIf="showMetrics"></kd-graph-metrics>
+
 <kd-card role="table"
          [hidden]="isHidden()">
   <div title
diff --git a/src/app/frontend/common/components/resourcelist/node/component.ts b/src/app/frontend/common/components/resourcelist/node/component.ts
index e5cb2b8da..0768ae336 100644
--- a/src/app/frontend/common/components/resourcelist/node/component.ts
+++ b/src/app/frontend/common/components/resourcelist/node/component.ts
@@ -14,7 +14,7 @@
 
 import {HttpParams} from '@angular/common/http';
 import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input} from '@angular/core';
-import {Node, NodeList} from '@api/backendapi';
+import {Metric, Node, NodeList} from '@api/backendapi';
 import {Observable} from 'rxjs/Observable';
 import {ResourceListWithStatuses} from '../../../resources/list';
 import {NotificationsService} from '../../../services/global/notifications';
@@ -30,6 +30,8 @@ import {ListGroupIdentifier, ListIdentifier} from '../groupids';
 })
 export class NodeListComponent extends ResourceListWithStatuses<NodeList, Node> {
   @Input() endpoint = EndpointManager.resource(Resource.node).list();
+  @Input() showMetrics = false;
+  cumulativeMetrics: Metric[];
 
   constructor(
     private readonly node_: ResourceService<NodeList>,
@@ -54,6 +56,7 @@ export class NodeListComponent extends ResourceListWithStatuses<NodeList, Node>
   }
 
   map(nodeList: NodeList): Node[] {
+    this.cumulativeMetrics = nodeList.cumulativeMetrics;
     return nodeList.nodes;
   }
 
diff --git a/src/app/frontend/common/components/resourcelist/node/template.html b/src/app/frontend/common/components/resourcelist/node/template.html
index 24582fb3b..76e5b59af 100644
--- a/src/app/frontend/common/components/resourcelist/node/template.html
+++ b/src/app/frontend/common/components/resourcelist/node/template.html
@@ -14,6 +14,9 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="cumulativeMetrics"
+                  *ngIf="showMetrics"></kd-graph-metrics>
+
 <kd-card role="table"
          [hidden]="isHidden()">
   <div title
diff --git a/src/app/frontend/common/components/resourcelist/replicaset/component.ts b/src/app/frontend/common/components/resourcelist/replicaset/component.ts
index f58a2b43f..8f19aa61b 100644
--- a/src/app/frontend/common/components/resourcelist/replicaset/component.ts
+++ b/src/app/frontend/common/components/resourcelist/replicaset/component.ts
@@ -21,7 +21,7 @@ import {
   Input,
 } from '@angular/core';
 import {ActivatedRoute, Router} from '@angular/router';
-import {Event, ReplicaSet, ReplicaSetList} from '@api/backendapi';
+import {Event, Metric, ReplicaSet, ReplicaSetList} from '@api/backendapi';
 import {Observable} from 'rxjs/Observable';
 
 import {ResourceListWithStatuses} from '../../../resources/list';
@@ -39,6 +39,8 @@ import {ListGroupIdentifier, ListIdentifier} from '../groupids';
 export class ReplicaSetListComponent extends ResourceListWithStatuses<ReplicaSetList, ReplicaSet> {
   @Input() title: string;
   @Input() endpoint = EndpointManager.resource(Resource.replicaSet, true).list();
+  @Input() showMetrics = false;
+  cumulativeMetrics: Metric[];
 
   constructor(
     private readonly replicaSet_: NamespacedResourceService<ReplicaSetList>,
@@ -68,6 +70,7 @@ export class ReplicaSetListComponent extends ResourceListWithStatuses<ReplicaSet
   }
 
   map(rsList: ReplicaSetList): ReplicaSet[] {
+    this.cumulativeMetrics = rsList.cumulativeMetrics;
     return rsList.replicaSets;
   }
 
diff --git a/src/app/frontend/common/components/resourcelist/replicaset/template.html b/src/app/frontend/common/components/resourcelist/replicaset/template.html
index 96c863b10..1176c8fe4 100644
--- a/src/app/frontend/common/components/resourcelist/replicaset/template.html
+++ b/src/app/frontend/common/components/resourcelist/replicaset/template.html
@@ -14,6 +14,9 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="cumulativeMetrics"
+                  *ngIf="showMetrics"></kd-graph-metrics>
+
 <kd-card role="table"
          [hidden]="isHidden()">
   <div title
diff --git a/src/app/frontend/common/components/resourcelist/statefulset/component.ts b/src/app/frontend/common/components/resourcelist/statefulset/component.ts
index cf0ae7846..77ed79dd9 100644
--- a/src/app/frontend/common/components/resourcelist/statefulset/component.ts
+++ b/src/app/frontend/common/components/resourcelist/statefulset/component.ts
@@ -20,7 +20,7 @@ import {
   ComponentFactoryResolver,
   Input,
 } from '@angular/core';
-import {Event, StatefulSet, StatefulSetList} from '@api/backendapi';
+import {Event, Metric, StatefulSet, StatefulSetList} from '@api/backendapi';
 import {Observable} from 'rxjs/Observable';
 import {ResourceListWithStatuses} from '../../../resources/list';
 import {NotificationsService} from '../../../services/global/notifications';
@@ -39,6 +39,8 @@ export class StatefulSetListComponent extends ResourceListWithStatuses<
   StatefulSet
 > {
   @Input() endpoint = EndpointManager.resource(Resource.statefulSet, true).list();
+  @Input() showMetrics = false;
+  cumulativeMetrics: Metric[];
 
   constructor(
     private readonly statefulSet_: NamespacedResourceService<StatefulSetList>,
@@ -67,6 +69,7 @@ export class StatefulSetListComponent extends ResourceListWithStatuses<
   }
 
   map(statefulSetList: StatefulSetList): StatefulSet[] {
+    this.cumulativeMetrics = statefulSetList.cumulativeMetrics;
     return statefulSetList.statefulSets;
   }
 
diff --git a/src/app/frontend/common/components/resourcelist/statefulset/template.html b/src/app/frontend/common/components/resourcelist/statefulset/template.html
index 0c13882ef..bfe8ad079 100644
--- a/src/app/frontend/common/components/resourcelist/statefulset/template.html
+++ b/src/app/frontend/common/components/resourcelist/statefulset/template.html
@@ -14,6 +14,9 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="cumulativeMetrics"
+                  *ngIf="showMetrics"></kd-graph-metrics>
+
 <kd-card role="table"
          [hidden]="isHidden()">
   <div title
diff --git a/src/app/frontend/common/components/textinput/component.ts b/src/app/frontend/common/components/textinput/component.ts
index a4bdcc6fe..8bbc222b9 100644
--- a/src/app/frontend/common/components/textinput/component.ts
+++ b/src/app/frontend/common/components/textinput/component.ts
@@ -36,8 +36,8 @@ enum EditorTheme {
   styleUrls: ['./style.scss'],
 })
 export class TextInputComponent implements OnInit {
-  @Output() textChange = new EventEmitter<string | StringMap>();
-  @Input() text: string | StringMap;
+  @Output() textChange = new EventEmitter<string>();
+  @Input() text: string;
   @Input() readOnly = false;
   @Input() mode = 'yaml';
   @Input() prettify = true;
@@ -64,19 +64,14 @@ export class TextInputComponent implements OnInit {
     }
   }
 
-  onTextChange(text: string | StringMap): void {
-    this.text = String(text);
-    this.textChange.emit(this.text);
+  onTextChange(text: string): void {
+    this.textChange.emit(text);
   }
 
   private prettify_(): void {
     switch (this.mode) {
       case 'json':
-        if (typeof this.text === 'string') {
-          this.text = JSON.stringify(JSON.parse(this.text), null, '\t');
-        } else {
-          this.text = JSON.stringify(this.text, null, '\t');
-        }
+        this.text = JSON.stringify(JSON.parse(this.text), null, '\t');
         break;
       default:
         // Do nothing when mode is not recognized.
diff --git a/src/app/frontend/common/components/textinput/template.html b/src/app/frontend/common/components/textinput/template.html
index 3a0590a2f..d5c99a435 100644
--- a/src/app/frontend/common/components/textinput/template.html
+++ b/src/app/frontend/common/components/textinput/template.html
@@ -21,5 +21,5 @@ limitations under the License.
             [mode]="mode"
             [theme]="theme"
             [ngClass]="{'kd-border': border}"
-            (textChange)="onTextChange($event)"
+            (textChange)="onTextChange($event.toString())"
             class="kd-ace"></ace-editor>
diff --git a/src/app/frontend/common/dialogs/deleteresource/template.html b/src/app/frontend/common/dialogs/deleteresource/template.html
index 6160bf8ca..6292e9fc1 100644
--- a/src/app/frontend/common/dialogs/deleteresource/template.html
+++ b/src/app/frontend/common/dialogs/deleteresource/template.html
@@ -40,6 +40,7 @@ limitations under the License.
 <mat-dialog-actions>
   <button mat-button
           color="primary"
+          id="confirm-delete"
           [mat-dialog-close]="true"
           i18n>Delete</button>
   <button mat-button
diff --git a/src/app/frontend/common/dialogs/editresource/template.html b/src/app/frontend/common/dialogs/editresource/template.html
index 8e62030d9..9ebff1513 100644
--- a/src/app/frontend/common/dialogs/editresource/template.html
+++ b/src/app/frontend/common/dialogs/editresource/template.html
@@ -38,6 +38,7 @@ limitations under the License.
 <mat-dialog-actions>
   <button mat-button
           color="primary"
+          id="confirm-edit"
           [mat-dialog-close]="getJSON()"
           i18n>Update</button>
   <button mat-button
diff --git a/src/app/frontend/crd/detail/template.html b/src/app/frontend/crd/detail/template.html
index 3926ed039..08d945f0c 100644
--- a/src/app/frontend/crd/detail/template.html
+++ b/src/app/frontend/crd/detail/template.html
@@ -21,22 +21,26 @@ limitations under the License.
   <div title
        i18n>Resource Information</div>
   <div content
+       id="resource-information"
        *ngIf="isInitialized"
        fxLayout="row wrap">
     <kd-property *ngIf="crd?.version">
       <div key
            i18n>Version</div>
-      <div value>{{crd?.version}}</div>
+      <div id="resource-version"
+           value>{{crd?.version}}</div>
     </kd-property>
     <kd-property>
       <div key
            i18n>Scope</div>
-      <div value>{{crd?.scope}}</div>
+      <div id="resource-scope"
+           value>{{crd?.scope}}</div>
     </kd-property>
     <kd-property>
       <div key
            i18n>Group</div>
-      <div value>{{crd?.group}}</div>
+      <div id="resource-group"
+           value>{{crd?.group}}</div>
     </kd-property>
     <kd-property *ngIf="crd.subresources.length > 0">
       <div key
@@ -50,6 +54,7 @@ limitations under the License.
   <div title
        i18n>Accepted Names</div>
   <div content
+       id="accepted-names"
        *ngIf="isInitialized"
        fxLayout="row wrap">
     <kd-property>
diff --git a/src/app/frontend/overview/component.spec.ts b/src/app/frontend/overview/component.spec.ts
index 160eedda2..f9d04ac95 100644
--- a/src/app/frontend/overview/component.spec.ts
+++ b/src/app/frontend/overview/component.spec.ts
@@ -34,6 +34,7 @@ import {OverviewComponent} from './component';
 import {Helper, ResourceRatioModes} from './helper';
 
 const mockDaemonSetData: DaemonSetList = {
+  cumulativeMetrics: [],
   listMeta: {totalItems: 1},
   daemonSets: [],
   status: {running: 1, pending: 0, succeeded: 0, failed: 0},
diff --git a/src/app/frontend/overview/component.ts b/src/app/frontend/overview/component.ts
index a8ca0dd44..ffc88d284 100644
--- a/src/app/frontend/overview/component.ts
+++ b/src/app/frontend/overview/component.ts
@@ -35,7 +35,6 @@ import {Helper, ResourceRatioModes} from './helper';
 @Component({
   selector: 'kd-overview',
   templateUrl: './template.html',
-  styleUrls: ['./style.scss'],
 })
 export class OverviewComponent extends GroupedResourceList {
   hasWorkloads(): boolean {
@@ -56,10 +55,4 @@ export class OverviewComponent extends GroupedResourceList {
       0
     );
   }
-
-  showGraphs(): boolean {
-    return this.cumulativeMetrics.every(
-      metrics => metrics.dataPoints && metrics.dataPoints.length > 1,
-    );
-  }
 }
diff --git a/src/app/frontend/overview/template.html b/src/app/frontend/overview/template.html
index 9be4debfd..1b21c8eee 100644
--- a/src/app/frontend/overview/template.html
+++ b/src/app/frontend/overview/template.html
@@ -20,19 +20,7 @@ limitations under the License.
        i18n>Workloads</div>
 
   <div>
-    <div fxLayout="row"
-         *ngIf="showGraphs()">
-      <div class="graph-col">
-        <kd-graph-card graphTitle="CPU Usage"
-                       [metrics]="cumulativeMetrics"
-                       selectedMetricName="cpu/usage_rate"></kd-graph-card>
-      </div>
-      <div class="graph-col">
-        <kd-graph-card graphTitle="Memory Usage"
-                       [metrics]="cumulativeMetrics"
-                       selectedMetricName="memory/usage"></kd-graph-card>
-      </div>
-    </div>
+    <kd-graph-metrics [metrics]="cumulativeMetrics"></kd-graph-metrics>
 
     <!-- TODO: Workload statuses cause a memory leak. Has to be fixed before enabling it back. -->
     <kd-workload-statuses *ngIf="false"
diff --git a/src/app/frontend/resource/cluster/node/detail/template.html b/src/app/frontend/resource/cluster/node/detail/template.html
index ef4b32a1f..0d34d3f52 100644
--- a/src/app/frontend/resource/cluster/node/detail/template.html
+++ b/src/app/frontend/resource/cluster/node/detail/template.html
@@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="node?.metrics"></kd-graph-metrics>
+
 <kd-object-meta [initialized]="isInitialized"
                 [objectMeta]="node?.objectMeta"></kd-object-meta>
 
diff --git a/src/app/frontend/resource/cluster/node/list/component.ts b/src/app/frontend/resource/cluster/node/list/component.ts
index a7bcdc654..11bdb3b7f 100644
--- a/src/app/frontend/resource/cluster/node/list/component.ts
+++ b/src/app/frontend/resource/cluster/node/list/component.ts
@@ -16,6 +16,6 @@ import {Component} from '@angular/core';
 
 @Component({
   selector: 'kd-node-list-state',
-  template: '<kd-node-list></kd-node-list>',
+  template: '<kd-node-list [showMetrics]="true"></kd-node-list>',
 })
 export class NodeListComponent {}
diff --git a/src/app/frontend/resource/config/configmap/detail/component.ts b/src/app/frontend/resource/config/configmap/detail/component.ts
index 87d99ffe9..f612d0c8a 100644
--- a/src/app/frontend/resource/config/configmap/detail/component.ts
+++ b/src/app/frontend/resource/config/configmap/detail/component.ts
@@ -57,4 +57,12 @@ export class ConfigMapDetailComponent implements OnInit, OnDestroy {
     this.configMapSubscription_.unsubscribe();
     this.actionbar_.onDetailsLeave.emit();
   }
+
+  getConfigMapData(cm: ConfigMapDetail): string {
+    if (!cm) {
+      return '';
+    }
+
+    return JSON.stringify(cm.data);
+  }
 }
diff --git a/src/app/frontend/resource/config/configmap/detail/template.html b/src/app/frontend/resource/config/configmap/detail/template.html
index b95ef1f07..462ee13e9 100644
--- a/src/app/frontend/resource/config/configmap/detail/template.html
+++ b/src/app/frontend/resource/config/configmap/detail/template.html
@@ -23,7 +23,7 @@ limitations under the License.
        i18n>Data</div>
   <div content>
     <kd-text-input *ngIf="configMap?.data"
-                   [text]="configMap?.data"
+                   [text]="getConfigMapData(configMap)"
                    [readOnly]="true"
                    [border]="false"
                    mode="json"></kd-text-input>
diff --git a/src/app/frontend/resource/workloads/component.ts b/src/app/frontend/resource/workloads/component.ts
index 9bc021362..a41271bf9 100644
--- a/src/app/frontend/resource/workloads/component.ts
+++ b/src/app/frontend/resource/workloads/component.ts
@@ -54,10 +54,4 @@ export class WorkloadsComponent extends GroupedResourceList {
       0
     );
   }
-
-  showGraphs(): boolean {
-    return this.cumulativeMetrics.every(
-      metrics => metrics.dataPoints && metrics.dataPoints.length > 1,
-    );
-  }
 }
diff --git a/src/app/frontend/resource/workloads/daemonset/list/component.ts b/src/app/frontend/resource/workloads/daemonset/list/component.ts
index 2fc9b3521..eea4f925a 100644
--- a/src/app/frontend/resource/workloads/daemonset/list/component.ts
+++ b/src/app/frontend/resource/workloads/daemonset/list/component.ts
@@ -16,6 +16,6 @@ import {Component} from '@angular/core';
 
 @Component({
   selector: 'kd-daemon-set-list-state',
-  template: '<kd-daemon-set-list></kd-daemon-set-list>',
+  template: '<kd-daemon-set-list [showMetrics]="true"></kd-daemon-set-list>',
 })
 export class DaemonSetListComponent {}
diff --git a/src/app/frontend/resource/workloads/deployment/list/component.ts b/src/app/frontend/resource/workloads/deployment/list/component.ts
index 958f6589e..530929af6 100644
--- a/src/app/frontend/resource/workloads/deployment/list/component.ts
+++ b/src/app/frontend/resource/workloads/deployment/list/component.ts
@@ -16,6 +16,6 @@ import {Component} from '@angular/core';
 
 @Component({
   selector: 'kd-deployment-list-state',
-  template: '<kd-deployment-list></kd-deployment-list>',
+  template: '<kd-deployment-list [showMetrics]="true"></kd-deployment-list>',
 })
 export class DeploymentListComponent {}
diff --git a/src/app/frontend/resource/workloads/pod/detail/template.html b/src/app/frontend/resource/workloads/pod/detail/template.html
index 9402e94b2..ab71cff15 100644
--- a/src/app/frontend/resource/workloads/pod/detail/template.html
+++ b/src/app/frontend/resource/workloads/pod/detail/template.html
@@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
+<kd-graph-metrics [metrics]="pod?.metrics"></kd-graph-metrics>
+
 <kd-object-meta [initialized]="isInitialized"
                 [objectMeta]="pod?.objectMeta"></kd-object-meta>
 
diff --git a/src/app/frontend/resource/workloads/replicaset/list/component.ts b/src/app/frontend/resource/workloads/replicaset/list/component.ts
index 6500182c5..cc9f38452 100644
--- a/src/app/frontend/resource/workloads/replicaset/list/component.ts
+++ b/src/app/frontend/resource/workloads/replicaset/list/component.ts
@@ -16,6 +16,6 @@ import {Component} from '@angular/core';
 
 @Component({
   selector: 'kd-replica-set-list-state',
-  template: '<kd-replica-set-list></kd-replica-set-list>',
+  template: '<kd-replica-set-list [showMetrics]="true"></kd-replica-set-list>',
 })
 export class ReplicaSetListComponent {}
diff --git a/src/app/frontend/resource/workloads/statefulset/list/component.ts b/src/app/frontend/resource/workloads/statefulset/list/component.ts
index c654b6d65..00b09d918 100644
--- a/src/app/frontend/resource/workloads/statefulset/list/component.ts
+++ b/src/app/frontend/resource/workloads/statefulset/list/component.ts
@@ -16,6 +16,6 @@ import {Component} from '@angular/core';
 
 @Component({
   selector: 'kd-stateful-set-state',
-  template: '<kd-stateful-set-list></kd-stateful-set-list>',
+  template: '<kd-stateful-set-list [showMetrics]="true"></kd-stateful-set-list>',
 })
 export class StatefulSetListComponent {}
diff --git a/src/app/frontend/typings/backendapi.d.ts b/src/app/frontend/typings/backendapi.d.ts
index 0fa291af0..eb80c2d1d 100644
--- a/src/app/frontend/typings/backendapi.d.ts
+++ b/src/app/frontend/typings/backendapi.d.ts
@@ -89,11 +89,13 @@ export interface CRDObjectList extends ResourceList {
 }
 
 export interface DaemonSetList extends ResourceList {
+  cumulativeMetrics: Metric[] | null;
   daemonSets: DaemonSet[];
   status: Status;
 }
 
 export interface DeploymentList extends ResourceList {
+  cumulativeMetrics: Metric[] | null;
   deployments: Deployment[];
   status: Status;
 }
@@ -124,6 +126,7 @@ export interface NamespaceList extends ResourceList {
 }
 
 export interface NodeList extends ResourceList {
+  cumulativeMetrics: Metric[] | null;
   nodes: Node[];
 }
 
@@ -147,6 +150,7 @@ export interface PodList extends ResourceList {
 }
 
 export interface ReplicaSetList extends ResourceList {
+  cumulativeMetrics: Metric[] | null;
   replicaSets: ReplicaSet[];
   status: Status;
 }
@@ -169,6 +173,7 @@ export interface ServiceList extends ResourceList {
 }
 
 export interface StatefulSetList extends ResourceList {
+  cumulativeMetrics: Metric[] | null;
   statefulSets: StatefulSet[];
   status: Status;
 }
@@ -512,7 +517,7 @@ export interface PodDetail extends ResourceDetail {
   nodeName: string;
   restartCount: number;
   qosClass: string;
-  metrics: PodMetrics;
+  metrics: Metric[];
   conditions: Condition[];
   controller: Resource;
   eventList: EventList;
@@ -530,6 +535,7 @@ export interface NodeDetail extends ResourceDetail {
   initContainerImages: string[];
   addresses: NodeAddress[];
   taints: NodeTaint[];
+  metrics: Metric[];
   conditions: Condition[];
   podList: PodList;
   eventList: EventList;


Test patch:
diff --git a/src/app/backend/resource/customresourcedefinition/list_test.go b/src/app/backend/resource/customresourcedefinition/list_test.go
index ecdfeea5b..89e371990 100644
--- a/src/app/backend/resource/customresourcedefinition/list_test.go
+++ b/src/app/backend/resource/customresourcedefinition/list_test.go
@@ -20,7 +20,7 @@ import (
 
 	"github.com/kubernetes/dashboard/src/app/backend/api"
 	"github.com/kubernetes/dashboard/src/app/backend/resource/dataselect"
-	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
+	apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake"
 	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -42,7 +42,11 @@ func TestGetCustomResourceDefinition(t *testing.T) {
 								Kind:   "Foo",
 								Plural: "foos",
 							},
-							Version: "v1alpha1",
+							Versions: []apiextensions.CustomResourceDefinitionVersion{
+								{
+									Name: "v1alpha1",
+								},
+							},
 						},
 					},
 				},