Build AngularJs component for usecase-ui 27/71027/1
authorzhangab <zhanganbing@chinamobile.com>
Tue, 23 Oct 2018 03:32:03 +0000 (11:32 +0800)
committerzhangab <zhanganbing@chinamobile.com>
Tue, 23 Oct 2018 03:32:05 +0000 (11:32 +0800)
Change-Id: I393f4837fc5f9cbd71448dbf20e1f1781f0656d3
Issue-ID: USECASEUI-154
Signed-off-by: zhangab <zhanganbing@chinamobile.com>
170 files changed:
distribution/pom.xml
pom.xml
usecaseui-portal/.angular-cli.json [new file with mode: 0644]
usecaseui-portal/e2e/app.e2e-spec.ts [new file with mode: 0644]
usecaseui-portal/e2e/app.po.ts [new file with mode: 0644]
usecaseui-portal/e2e/tsconfig.e2e.json [new file with mode: 0644]
usecaseui-portal/package-lock.json [new file with mode: 0644]
usecaseui-portal/package.json [new file with mode: 0644]
usecaseui-portal/pom.xml [new file with mode: 0644]
usecaseui-portal/src/app/alarm/alarm.component.css [new file with mode: 0644]
usecaseui-portal/src/app/alarm/alarm.component.html [new file with mode: 0644]
usecaseui-portal/src/app/alarm/alarm.component.less [new file with mode: 0644]
usecaseui-portal/src/app/alarm/alarm.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/alarm/alarm.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/animates.ts [new file with mode: 0644]
usecaseui-portal/src/app/app-routing.module.ts [new file with mode: 0644]
usecaseui-portal/src/app/app.component.css [new file with mode: 0644]
usecaseui-portal/src/app/app.component.html [new file with mode: 0644]
usecaseui-portal/src/app/app.component.less [new file with mode: 0644]
usecaseui-portal/src/app/app.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/app.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/app.module.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.css [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.html [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.css [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.html [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.css [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.html [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/bar/bar.component.html [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/bar/bar.component.less [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/bar/bar.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/bar/bar.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/line/line.component.html [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/line/line.component.less [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/line/line.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/line/line.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/pie/pie.component.html [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/pie/pie.component.less [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/pie/pie.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/charts/pie/pie.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/details/details.component.css [new file with mode: 0644]
usecaseui-portal/src/app/components/details/details.component.html [new file with mode: 0644]
usecaseui-portal/src/app/components/details/details.component.less [new file with mode: 0644]
usecaseui-portal/src/app/components/details/details.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/details/details.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/graphiclist/graphiclist.component.css [new file with mode: 0644]
usecaseui-portal/src/app/components/graphiclist/graphiclist.component.html [new file with mode: 0644]
usecaseui-portal/src/app/components/graphiclist/graphiclist.component.less [new file with mode: 0644]
usecaseui-portal/src/app/components/graphiclist/graphiclist.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/components/graphiclist/graphiclist.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/dataInterface.ts [new file with mode: 0644]
usecaseui-portal/src/app/home/home.component.css [new file with mode: 0644]
usecaseui-portal/src/app/home/home.component.html [new file with mode: 0644]
usecaseui-portal/src/app/home/home.component.less [new file with mode: 0644]
usecaseui-portal/src/app/home/home.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/home/home.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/myhttp.service.ts [new file with mode: 0644]
usecaseui-portal/src/app/networkHttpservice.service.ts [new file with mode: 0644]
usecaseui-portal/src/app/networkHttpservice.service1.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.css [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.html [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.less [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.css [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.html [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.less [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance.component.css [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance.component.html [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance.component.less [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/performance/performance.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.css [new file with mode: 0644]
usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.html [new file with mode: 0644]
usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.less [new file with mode: 0644]
usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/services-list/services-list.component.css [new file with mode: 0644]
usecaseui-portal/src/app/services/services-list/services-list.component.html [new file with mode: 0644]
usecaseui-portal/src/app/services/services-list/services-list.component.less [new file with mode: 0644]
usecaseui-portal/src/app/services/services-list/services-list.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/services-list/services-list.component.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/services.component.html [new file with mode: 0644]
usecaseui-portal/src/app/services/services.component.less [new file with mode: 0644]
usecaseui-portal/src/app/services/services.component.spec.ts [new file with mode: 0644]
usecaseui-portal/src/app/services/services.component.ts [new file with mode: 0644]
usecaseui-portal/src/assets/i18n/en.json [new file with mode: 0644]
usecaseui-portal/src/assets/i18n/zh.json [new file with mode: 0644]
usecaseui-portal/src/assets/images/VM.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/VNF.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/VNF1.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/VNF2.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/VNF3.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/bigcloud.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/cloud-city1.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/cloud-county1.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/cloud-out.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/cloud-site.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/domain.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/icon.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/loading.gif [new file with mode: 0644]
usecaseui-portal/src/assets/images/open-close.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/open-close2.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/out-domain.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/site.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/tildeimg.png [new file with mode: 0644]
usecaseui-portal/src/assets/images/tp.png [new file with mode: 0644]
usecaseui-portal/src/assets/json/LogicalLinksData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/alarmFormData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/allotted-resources.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/allotted-resources2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/configuration_files/inputNamesTranslate.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/configuration_files/servicesCategory.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/configuration_files/templateCategory.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/createService.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/customers.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/deleteService.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/detailsData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/homeAllData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/homePerformanceChartData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/instanceTableData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/instanceTableData2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/instanceTableData3.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/instanceTableData4.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/netWorkD3Data.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/netWorkD3Data2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/onboardTableData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/p_interfaces1.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/p_interfaces2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/pnfdetail-domain.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/progress.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/sdwanvpnServiceTemplateParameters.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/serviceTemplates.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/serviceTemplates2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/serviceTypes.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/servicesList.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/servicesTableData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/siteAddressData.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/siteServiceTemplateParameters.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/sotn-connectivity.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/sotn-connectivity2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/sotnvpnServiceTemplateParameters.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/specific_link _nfo.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/status.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/status2.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/url.json [new file with mode: 0644]
usecaseui-portal/src/assets/json/vpnbinding.json [new file with mode: 0644]
usecaseui-portal/src/environments/environment.prod.ts [new file with mode: 0644]
usecaseui-portal/src/environments/environment.ts [new file with mode: 0644]
usecaseui-portal/src/favicon.ico [new file with mode: 0644]
usecaseui-portal/src/index.html [new file with mode: 0644]
usecaseui-portal/src/main.ts [new file with mode: 0644]
usecaseui-portal/src/my-theme.css [new file with mode: 0644]
usecaseui-portal/src/my-theme.less [new file with mode: 0644]
usecaseui-portal/src/polyfills.ts [new file with mode: 0644]
usecaseui-portal/src/styles.css [new file with mode: 0644]
usecaseui-portal/src/styles.less [new file with mode: 0644]
usecaseui-portal/src/test.ts [new file with mode: 0644]
usecaseui-portal/src/tsconfig.app.json [new file with mode: 0644]
usecaseui-portal/src/tsconfig.spec.json [new file with mode: 0644]
usecaseui-portal/src/typings.d.ts [new file with mode: 0644]
usecaseui-portal/tsconfig.json [new file with mode: 0644]

index e3799a0..8aaaa30 100644 (file)
                 <outputDirectory>${linux64outputdir}/tomcat/webapps/</outputDirectory>
                 <resources>
                   <resource>
-                    <directory>../usecaseui-common/target/</directory>
+                    <directory>../usecaseui-portal/</directory>
                     <filtering>false</filtering>
                     <includes>
-                      <include>usecase-ui.war</include>
+                      <include>usecase-ui</include>
                     </includes>
                   </resource>
                 </resources>
                 <outputDirectory>${win64outputdir}/tomcat/webapps/</outputDirectory>
                 <resources>
                   <resource>
-                    <directory>../usecaseui-common/target/</directory>
+                    <directory>../usecaseui-portal/</directory>
                     <filtering>false</filtering>
                     <includes>
-                      <include>usecase-ui.war</include>
+                      <include>usecase-ui</include>
                     </includes>
                   </resource>
                 </resources>
diff --git a/pom.xml b/pom.xml
index 4b15105..6b3eccc 100644 (file)
--- a/pom.xml
+++ b/pom.xml
     <name>usecase-ui</name>
 
     <modules>
+        <!--
         <module>usecaseui-common</module>
         <module>usecaseui-monitor</module>
         <module>usecaseui-lcm</module>
+        -->
+        <module>usecaseui-portal</module>
         <module>distribution</module>
     </modules>
 
diff --git a/usecaseui-portal/.angular-cli.json b/usecaseui-portal/.angular-cli.json
new file mode 100644 (file)
index 0000000..5535fc3
--- /dev/null
@@ -0,0 +1,63 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "usecase-ui"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "usecase-ui",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "styles.less",
+        "my-theme.less"
+      ],
+      "scripts": [
+        "../node_modules/echarts/dist/echarts.min.js"
+      ],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "src/tsconfig.spec.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "e2e/tsconfig.e2e.json",
+      "exclude": "**/node_modules/**"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "less",
+    "component": {}
+  }
+}
diff --git a/usecaseui-portal/e2e/app.e2e-spec.ts b/usecaseui-portal/e2e/app.e2e-spec.ts
new file mode 100644 (file)
index 0000000..2bd5c05
--- /dev/null
@@ -0,0 +1,14 @@
+import { AppPage } from './app.po';
+
+describe('uui2 App', () => {
+  let page: AppPage;
+
+  beforeEach(() => {
+    page = new AppPage();
+  });
+
+  it('should display welcome message', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('Welcome to app!');
+  });
+});
diff --git a/usecaseui-portal/e2e/app.po.ts b/usecaseui-portal/e2e/app.po.ts
new file mode 100644 (file)
index 0000000..82ea75b
--- /dev/null
@@ -0,0 +1,11 @@
+import { browser, by, element } from 'protractor';
+
+export class AppPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}
diff --git a/usecaseui-portal/e2e/tsconfig.e2e.json b/usecaseui-portal/e2e/tsconfig.e2e.json
new file mode 100644 (file)
index 0000000..1d9e5ed
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/e2e",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "jasminewd2",
+      "node"
+    ]
+  }
+}
diff --git a/usecaseui-portal/package-lock.json b/usecaseui-portal/package-lock.json
new file mode 100644 (file)
index 0000000..582533e
--- /dev/null
@@ -0,0 +1,12678 @@
+{
+  "name": "usecase-ui",
+  "version": "0.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@angular-devkit/build-optimizer": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz",
+      "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "source-map": "0.5.7",
+        "typescript": "2.6.2",
+        "webpack-sources": "1.3.0"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+          "dev": true
+        }
+      }
+    },
+    "@angular-devkit/core": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz",
+      "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "chokidar": "1.7.0",
+        "rxjs": "5.5.12",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        }
+      }
+    },
+    "@angular-devkit/schematics": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz",
+      "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==",
+      "dev": true,
+      "requires": {
+        "@ngtools/json-schema": "1.2.0",
+        "rxjs": "5.5.12"
+      }
+    },
+    "@angular/animations": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz",
+      "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/cdk": {
+      "version": "5.2.5",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz",
+      "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/cli": {
+      "version": "1.7.4",
+      "resolved": "http://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz",
+      "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/build-optimizer": "0.3.2",
+        "@angular-devkit/core": "0.3.2",
+        "@angular-devkit/schematics": "0.3.2",
+        "@ngtools/json-schema": "1.2.0",
+        "@ngtools/webpack": "1.10.2",
+        "@schematics/angular": "0.3.2",
+        "@schematics/package-update": "0.3.2",
+        "ajv": "6.5.4",
+        "autoprefixer": "7.2.6",
+        "cache-loader": "1.2.2",
+        "chalk": "2.2.2",
+        "circular-dependency-plugin": "4.4.0",
+        "clean-css": "4.2.1",
+        "common-tags": "1.8.0",
+        "copy-webpack-plugin": "4.4.3",
+        "core-object": "3.1.5",
+        "denodeify": "1.2.1",
+        "ember-cli-string-utils": "1.1.0",
+        "extract-text-webpack-plugin": "3.0.2",
+        "file-loader": "1.1.11",
+        "fs-extra": "4.0.3",
+        "glob": "7.1.3",
+        "html-webpack-plugin": "2.30.1",
+        "istanbul-instrumenter-loader": "3.0.1",
+        "karma-source-map-support": "1.3.0",
+        "less": "2.7.3",
+        "less-loader": "4.1.0",
+        "license-webpack-plugin": "1.5.0",
+        "loader-utils": "1.1.0",
+        "lodash": "4.17.11",
+        "memory-fs": "0.4.1",
+        "minimatch": "3.0.4",
+        "node-modules-path": "1.0.2",
+        "node-sass": "4.9.4",
+        "nopt": "4.0.1",
+        "opn": "5.1.0",
+        "portfinder": "1.0.18",
+        "postcss": "6.0.23",
+        "postcss-import": "11.1.0",
+        "postcss-loader": "2.1.6",
+        "postcss-url": "7.3.2",
+        "raw-loader": "0.5.1",
+        "resolve": "1.8.1",
+        "rxjs": "5.5.12",
+        "sass-loader": "6.0.7",
+        "semver": "5.6.0",
+        "silent-error": "1.1.1",
+        "source-map-support": "0.4.18",
+        "style-loader": "0.19.1",
+        "stylus": "0.54.5",
+        "stylus-loader": "3.0.2",
+        "uglifyjs-webpack-plugin": "1.3.0",
+        "url-loader": "0.6.2",
+        "webpack": "3.11.0",
+        "webpack-dev-middleware": "1.12.2",
+        "webpack-dev-server": "2.11.3",
+        "webpack-merge": "4.1.4",
+        "webpack-sources": "1.3.0",
+        "webpack-subresource-integrity": "1.2.0"
+      }
+    },
+    "@angular/common": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz",
+      "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/compiler": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz",
+      "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/compiler-cli": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz",
+      "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==",
+      "dev": true,
+      "requires": {
+        "chokidar": "1.7.0",
+        "minimist": "1.2.0",
+        "reflect-metadata": "0.1.12",
+        "tsickle": "0.27.5"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "@angular/core": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz",
+      "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/forms": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz",
+      "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/http": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz",
+      "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/language-service": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz",
+      "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==",
+      "dev": true
+    },
+    "@angular/platform-browser": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz",
+      "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/platform-browser-dynamic": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz",
+      "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@angular/router": {
+      "version": "5.2.11",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz",
+      "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "@ngtools/json-schema": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz",
+      "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==",
+      "dev": true
+    },
+    "@ngtools/webpack": {
+      "version": "1.10.2",
+      "resolved": "http://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz",
+      "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2",
+        "enhanced-resolve": "3.4.1",
+        "loader-utils": "1.1.0",
+        "magic-string": "0.22.5",
+        "semver": "5.6.0",
+        "source-map": "0.5.7",
+        "tree-kill": "1.2.0",
+        "webpack-sources": "1.3.0"
+      }
+    },
+    "@ngx-translate/core": {
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.1.1.tgz",
+      "integrity": "sha1-rhA5KINrip4Gn9Li52+iGYzH5ig="
+    },
+    "@ngx-translate/http-loader": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-2.0.1.tgz",
+      "integrity": "sha1-qmd4jmS/qGUmkad7Ais7QDEgkRM="
+    },
+    "@schematics/angular": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz",
+      "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==",
+      "dev": true,
+      "requires": {
+        "typescript": "2.6.2"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+          "dev": true
+        }
+      }
+    },
+    "@schematics/package-update": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz",
+      "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==",
+      "dev": true,
+      "requires": {
+        "rxjs": "5.5.12",
+        "semver": "5.6.0",
+        "semver-intersect": "1.4.0"
+      }
+    },
+    "@types/jasmine": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.9.tgz",
+      "integrity": "sha512-8dPZwjosElZOGGYw1nwTvOEMof4gjwAWNFS93nBI091BoEfd5drnHOLRMiRF/LOPuMTn5LgEdv0bTUO8QFVuHQ==",
+      "dev": true
+    },
+    "@types/jasminewd2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.5.tgz",
+      "integrity": "sha512-1awkm/O4pQCR9hI2F80HmIOda/L+ogkSL8Arj1k00eue5VLY5ooewhSOyF/cUJE0S+/34uD5EYY3zmd6fu2OCA==",
+      "dev": true,
+      "requires": {
+        "@types/jasmine": "2.8.9"
+      }
+    },
+    "@types/node": {
+      "version": "6.0.118",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz",
+      "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "0.0.32",
+      "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
+      "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
+      "dev": true
+    },
+    "@types/selenium-webdriver": {
+      "version": "2.53.43",
+      "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz",
+      "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==",
+      "dev": true
+    },
+    "@types/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
+      "dev": true
+    },
+    "@types/strip-json-comments": {
+      "version": "0.0.30",
+      "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+      "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "2.1.21",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+      "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+      "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+      "dev": true,
+      "requires": {
+        "acorn": "4.0.13"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+          "dev": true
+        }
+      }
+    },
+    "addressparser": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
+      "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=",
+      "dev": true,
+      "optional": true
+    },
+    "adm-zip": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
+      "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==",
+      "dev": true
+    },
+    "after": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+      "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+      "dev": true,
+      "requires": {
+        "es6-promisify": "5.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+      "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "2.0.1",
+        "fast-json-stable-stringify": "2.0.0",
+        "json-schema-traverse": "0.4.1",
+        "uri-js": "4.2.2"
+      },
+      "dependencies": {
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        }
+      }
+    },
+    "ajv-keywords": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+      "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+      "dev": true
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2",
+        "longest": "1.0.1",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "amqplib": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
+      "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "bitsyntax": "0.0.4",
+        "bluebird": "3.5.2",
+        "buffer-more-ints": "0.0.2",
+        "readable-stream": "1.1.14",
+        "safe-buffer": "5.1.2"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "1.9.3"
+      }
+    },
+    "anymatch": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+      "dev": true,
+      "requires": {
+        "micromatch": "2.3.11",
+        "normalize-path": "2.1.1"
+      }
+    },
+    "app-root-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
+      "dev": true
+    },
+    "append-transform": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+      "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+      "dev": true,
+      "requires": {
+        "default-require-extensions": "1.0.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "dev": true,
+      "requires": {
+        "delegates": "1.0.0",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
+      "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.3",
+        "es-abstract": "1.12.0"
+      }
+    },
+    "array-slice": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true
+    },
+    "arraybuffer.slice": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+      "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true,
+      "optional": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+      "dev": true,
+      "optional": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "ast-types": {
+      "version": "0.11.6",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.6.tgz",
+      "integrity": "sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg==",
+      "dev": true,
+      "optional": true
+    },
+    "async": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+      "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.11"
+      }
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+      "dev": true,
+      "optional": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "7.2.6",
+      "resolved": "http://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+      "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "2.11.3",
+        "caniuse-lite": "1.0.30000893",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "6.0.23",
+        "postcss-value-parser": "3.3.1"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+      "dev": true,
+      "optional": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.15.3",
+      "resolved": "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz",
+      "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "follow-redirects": "1.0.0"
+      },
+      "dependencies": {
+        "follow-redirects": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz",
+          "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.9"
+          }
+        }
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "dev": true,
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.17.11",
+        "source-map": "0.5.7",
+        "trim-right": "1.0.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "dev": true,
+      "requires": {
+        "core-js": "2.5.7",
+        "regenerator-runtime": "0.11.1"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "debug": "2.6.9",
+        "globals": "9.18.0",
+        "invariant": "2.2.4",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "esutils": "2.0.2",
+        "lodash": "4.17.11",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "cache-base": "1.0.1",
+        "class-utils": "0.3.6",
+        "component-emitter": "1.2.1",
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "mixin-deep": "1.3.1",
+        "pascalcase": "0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "base64-arraybuffer": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+      "dev": true
+    },
+    "base64-js": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+      "dev": true
+    },
+    "base64id": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "dev": true,
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "big.js": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+      "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
+      "dev": true
+    },
+    "bitsyntax": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
+      "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "buffer-more-ints": "0.0.2"
+      }
+    },
+    "bl": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+      "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "2.0.6"
+      },
+      "dependencies": {
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "0.10.31",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "blob": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+      "dev": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "blocking-proxy": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz",
+      "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=",
+      "dev": true,
+      "requires": {
+        "minimist": "1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "bluebird": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
+      "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "1.0.4",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "1.6.16"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "2.1.1",
+        "deep-equal": "1.0.1",
+        "dns-equal": "1.0.0",
+        "dns-txt": "2.0.2",
+        "multicast-dns": "6.2.3",
+        "multicast-dns-service-types": "1.1.0"
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "boom": {
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+      "dev": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "dev": true,
+      "requires": {
+        "expand-range": "1.8.2",
+        "preserve": "0.2.0",
+        "repeat-element": "1.1.3"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "1.0.3",
+        "cipher-base": "1.0.4",
+        "create-hash": "1.2.0",
+        "evp_bytestokey": "1.0.3",
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "1.2.0",
+        "browserify-des": "1.0.2",
+        "evp_bytestokey": "1.0.3"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "des.js": "1.0.0",
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "randombytes": "2.0.6"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "elliptic": "6.4.1",
+        "inherits": "2.0.3",
+        "parse-asn1": "5.1.1"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "requires": {
+        "pako": "1.0.6"
+      }
+    },
+    "browserslist": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+      "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "1.0.30000893",
+        "electron-to-chromium": "1.3.80"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "1.3.0",
+        "ieee754": "1.1.12",
+        "isarray": "1.0.0"
+      }
+    },
+    "buffer-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc-unsafe": "1.1.0",
+        "buffer-fill": "1.0.0"
+      }
+    },
+    "buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+      "dev": true
+    },
+    "buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "dev": true
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-more-ints": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
+      "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "buildmail": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz",
+      "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "addressparser": "1.0.1",
+        "libbase64": "0.1.0",
+        "libmime": "3.0.0",
+        "libqp": "1.1.0",
+        "nodemailer-fetch": "1.6.0",
+        "nodemailer-shared": "1.1.0",
+        "punycode": "1.4.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.2",
+        "chownr": "1.1.1",
+        "glob": "7.1.3",
+        "graceful-fs": "4.1.11",
+        "lru-cache": "4.1.3",
+        "mississippi": "2.0.0",
+        "mkdirp": "0.5.1",
+        "move-concurrently": "1.0.1",
+        "promise-inflight": "1.0.1",
+        "rimraf": "2.6.2",
+        "ssri": "5.3.0",
+        "unique-filename": "1.1.1",
+        "y18n": "4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "collection-visit": "1.0.0",
+        "component-emitter": "1.2.1",
+        "get-value": "2.0.6",
+        "has-value": "1.0.0",
+        "isobject": "3.0.1",
+        "set-value": "2.0.0",
+        "to-object-path": "0.3.0",
+        "union-value": "1.0.0",
+        "unset-value": "1.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "cache-loader": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz",
+      "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "mkdirp": "0.5.1",
+        "neo-async": "2.6.0",
+        "schema-utils": "0.4.7"
+      }
+    },
+    "callsite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.2",
+        "upper-case": "1.1.3"
+      }
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000893",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000893.tgz",
+      "integrity": "sha512-kOddHcTEef+NgN/fs0zmX2brHTNATVOWMEIhlZHCuwQRtXobjSw9pAECc44Op4bTBcavRjkLaPrGomknH7+Jvg==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "requires": {
+        "align-text": "0.1.4",
+        "lazy-cache": "1.0.4"
+      }
+    },
+    "chalk": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz",
+      "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "3.2.1",
+        "escape-string-regexp": "1.0.5",
+        "supports-color": "4.5.0"
+      }
+    },
+    "chokidar": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+      "dev": true,
+      "requires": {
+        "anymatch": "1.3.2",
+        "async-each": "1.0.1",
+        "fsevents": "1.2.4",
+        "glob-parent": "2.0.0",
+        "inherits": "2.0.3",
+        "is-binary-path": "1.0.1",
+        "is-glob": "2.0.1",
+        "path-is-absolute": "1.0.1",
+        "readdirp": "2.2.1"
+      }
+    },
+    "chownr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+      "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+      "dev": true
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "circular-dependency-plugin": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz",
+      "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==",
+      "dev": true
+    },
+    "circular-json": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.8.tgz",
+      "integrity": "sha512-VjaKMyZuVkL40usJkknJnmqQKpn2PkKS4M3/xdTRtZ0VsWl2Wbc2xdvXFXmEdmN6CKGqkm8XGyLHuFECZYEugw==",
+      "dev": true
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "3.1.0",
+        "define-property": "0.2.5",
+        "isobject": "3.0.1",
+        "static-extend": "0.1.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+      "dev": true,
+      "requires": {
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wrap-ansi": "2.1.0"
+      }
+    },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+      "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+      "dev": true,
+      "requires": {
+        "for-own": "1.0.0",
+        "is-plain-object": "2.0.4",
+        "kind-of": "6.0.2",
+        "shallow-clone": "1.0.0"
+      },
+      "dependencies": {
+        "for-own": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+          "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+          "dev": true,
+          "requires": {
+            "for-in": "1.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "codelyzer": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz",
+      "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==",
+      "dev": true,
+      "requires": {
+        "app-root-path": "2.1.0",
+        "css-selector-tokenizer": "0.7.0",
+        "cssauron": "1.4.0",
+        "semver-dsl": "1.0.1",
+        "source-map": "0.5.7",
+        "sprintf-js": "1.1.1"
+      },
+      "dependencies": {
+        "sprintf-js": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz",
+          "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=",
+          "dev": true
+        }
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "1.0.0",
+        "object-visit": "1.0.1"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combine-lists": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.11"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+      "dev": true
+    },
+    "common-tags": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+      "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
+    },
+    "component-inherit": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.15",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
+      "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.37.0"
+      }
+    },
+    "compression": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+      "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "2.0.15",
+        "debug": "2.6.9",
+        "on-headers": "1.0.1",
+        "safe-buffer": "5.1.2",
+        "vary": "1.1.2"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "1.1.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "typedarray": "0.0.6"
+      }
+    },
+    "connect": {
+      "version": "3.6.6",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.0",
+        "parseurl": "1.3.2",
+        "utils-merge": "1.0.1"
+      },
+      "dependencies": {
+        "finalhandler": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+          "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "encodeurl": "1.0.2",
+            "escape-html": "1.0.3",
+            "on-finished": "2.3.0",
+            "parseurl": "1.3.2",
+            "statuses": "1.3.1",
+            "unpipe": "1.0.0"
+          }
+        },
+        "statuses": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+          "dev": true
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
+      "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+      "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "fs-write-stream-atomic": "1.0.10",
+        "iferr": "0.1.5",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "4.4.3",
+      "resolved": "http://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz",
+      "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==",
+      "dev": true,
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "globby": "7.1.1",
+        "is-glob": "4.0.0",
+        "loader-utils": "1.1.0",
+        "minimatch": "3.0.4",
+        "p-limit": "1.3.0",
+        "serialize-javascript": "1.5.0"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        }
+      }
+    },
+    "core-js": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+    },
+    "core-object": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz",
+      "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2"
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+      "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+      "dev": true,
+      "requires": {
+        "is-directory": "0.3.1",
+        "js-yaml": "3.12.0",
+        "parse-json": "4.0.0",
+        "require-from-string": "2.0.2"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "1.3.2",
+            "json-parse-better-errors": "1.0.2"
+          }
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "elliptic": "6.4.1"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "inherits": "2.0.3",
+        "md5.js": "1.3.5",
+        "ripemd160": "2.0.2",
+        "sha.js": "2.4.11"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "create-hash": "1.2.0",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.2",
+        "safe-buffer": "5.1.2",
+        "sha.js": "2.4.11"
+      }
+    },
+    "cross-spawn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lru-cache": "4.1.3",
+        "which": "1.3.1"
+      }
+    },
+    "cryptiles": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "1.0.1",
+        "browserify-sign": "4.0.4",
+        "create-ecdh": "4.0.3",
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "diffie-hellman": "5.0.3",
+        "inherits": "2.0.3",
+        "pbkdf2": "3.0.17",
+        "public-encrypt": "4.0.3",
+        "randombytes": "2.0.6",
+        "randomfill": "1.0.4"
+      }
+    },
+    "css-parse": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
+      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+      "dev": true
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0",
+        "css-what": "2.1.2",
+        "domutils": "1.5.1",
+        "nth-check": "1.0.2"
+      }
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
+      "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+      "dev": true,
+      "requires": {
+        "cssesc": "0.1.0",
+        "fastparse": "1.1.1",
+        "regexpu-core": "1.0.0"
+      }
+    },
+    "css-what": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz",
+      "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==",
+      "dev": true
+    },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "dev": true
+    },
+    "cuint": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+      "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+      "dev": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "custom-event": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "dev": true,
+      "requires": {
+        "es5-ext": "0.10.46"
+      }
+    },
+    "d3": {
+      "version": "3.5.17",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
+      "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "data-uri-to-buffer": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz",
+      "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==",
+      "dev": true,
+      "optional": true
+    },
+    "date-fns": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
+      "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw=="
+    },
+    "date-format": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
+      "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
+      "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
+    },
+    "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"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true,
+      "optional": true
+    },
+    "default-require-extensions": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+      "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+      "dev": true,
+      "requires": {
+        "strip-bom": "2.0.0"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "1.0.2",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "degenerator": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
+      "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "ast-types": "0.11.6",
+        "escodegen": "1.11.0",
+        "esprima": "3.1.3"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "del": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "6.1.0",
+        "is-path-cwd": "1.0.0",
+        "is-path-in-cwd": "1.0.1",
+        "p-map": "1.2.0",
+        "pify": "3.0.0",
+        "rimraf": "2.6.2"
+      },
+      "dependencies": {
+        "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.2",
+            "glob": "7.1.3",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "denodeify": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
+      "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "dev": true
+    },
+    "di": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "miller-rabin": "4.0.1",
+        "randombytes": "2.0.6"
+      }
+    },
+    "dir-glob": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "path-type": "3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "1.1.1"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "dev": true,
+      "requires": {
+        "utila": "0.4.0"
+      }
+    },
+    "dom-serialize": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+      "dev": true,
+      "requires": {
+        "custom-event": "1.0.1",
+        "ent": "2.2.0",
+        "extend": "3.0.2",
+        "void-elements": "2.0.1"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.1.3",
+        "entities": "1.1.2"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz",
+      "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
+      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.2.1"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0.1.0",
+        "domelementtype": "1.2.1"
+      }
+    },
+    "double-ended-queue": {
+      "version": "2.1.0-0",
+      "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
+      "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=",
+      "dev": true,
+      "optional": true
+    },
+    "duplexify": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
+      "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "echarts": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.1.0.tgz",
+      "integrity": "sha512-gP1e1fNnAj9KJpTDLXV21brklbfJlqeINmpQDJCDta9TX3cPoqyQOiDVcEPzbOVHqgBRgTOwNxC5iGwJ89014A==",
+      "requires": {
+        "zrender": "4.0.4"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "ejs": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+      "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.80",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.80.tgz",
+      "integrity": "sha512-WClidEWEUNx7OfwXehB0qaxCuetjbKjev2SmXWgybWPLKAThBiMTF/2Pd8GSUDtoGOavxVzdkKwfFAPRSWlkLw==",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+      "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0",
+        "hash.js": "1.1.5",
+        "hmac-drbg": "1.0.1",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "ember-cli-string-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz",
+      "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=",
+      "dev": true
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0"
+      }
+    },
+    "engine.io": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
+      "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "base64id": "1.0.0",
+        "cookie": "0.3.1",
+        "debug": "3.1.0",
+        "engine.io-parser": "2.1.2",
+        "uws": "9.14.0",
+        "ws": "3.3.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
+      "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "component-inherit": "0.0.3",
+        "debug": "3.1.0",
+        "engine.io-parser": "2.1.2",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "ws": "3.3.3",
+        "xmlhttprequest-ssl": "1.5.5",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+      "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+      "dev": true,
+      "requires": {
+        "after": "0.8.2",
+        "arraybuffer.slice": "0.0.7",
+        "base64-arraybuffer": "0.1.5",
+        "blob": "0.0.4",
+        "has-binary2": "1.0.3"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "memory-fs": "0.4.1",
+        "object-assign": "4.1.1",
+        "tapable": "0.2.8"
+      }
+    },
+    "ent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "dev": true,
+      "requires": {
+        "prr": "1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+      "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "1.2.0",
+        "function-bind": "1.1.1",
+        "has": "1.0.3",
+        "is-callable": "1.1.4",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "dev": true,
+      "requires": {
+        "is-callable": "1.1.4",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.2"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.46",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz",
+      "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "next-tick": "1.0.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46",
+        "es6-iterator": "2.0.3",
+        "es6-set": "0.1.5",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-promise": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
+      "dev": true
+    },
+    "es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "4.2.5"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
+      "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "esprima": "3.1.3",
+        "estraverse": "4.2.0",
+        "esutils": "2.0.2",
+        "optionator": "0.8.2",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+          "dev": true,
+          "optional": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "requires": {
+        "es6-map": "0.1.5",
+        "es6-weak-map": "2.0.2",
+        "esrecurse": "4.2.1",
+        "estraverse": "4.2.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "4.2.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.46"
+      }
+    },
+    "eventemitter3": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "requires": {
+        "original": "1.0.2"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "requires": {
+        "md5.js": "1.3.5",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "5.1.0",
+        "get-stream": "3.0.0",
+        "is-stream": "1.1.0",
+        "npm-run-path": "2.0.2",
+        "p-finally": "1.0.0",
+        "signal-exit": "3.0.2",
+        "strip-eof": "1.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.3",
+            "shebang-command": "1.2.0",
+            "which": "1.3.1"
+          }
+        }
+      }
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "expand-braces": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+      "dev": true,
+      "requires": {
+        "array-slice": "0.2.3",
+        "array-unique": "0.2.1",
+        "braces": "0.1.5"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+          "dev": true,
+          "requires": {
+            "expand-range": "0.1.1"
+          }
+        },
+        "expand-range": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "0.1.1",
+            "repeat-string": "0.2.2"
+          }
+        },
+        "is-number": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+          "dev": true
+        },
+        "repeat-string": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+          "dev": true
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "dev": true,
+      "requires": {
+        "is-posix-bracket": "0.1.1"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "2.2.4"
+      }
+    },
+    "express": {
+      "version": "4.16.4",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+      "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.3",
+        "content-disposition": "0.5.2",
+        "content-type": "1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "finalhandler": "1.1.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "2.0.4",
+        "qs": "6.5.2",
+        "range-parser": "1.2.0",
+        "safe-buffer": "5.1.2",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0",
+        "type-is": "1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "1.1.2"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "1.0.0",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      }
+    },
+    "extract-text-webpack-plugin": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz",
+      "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.1",
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0",
+        "webpack-sources": "1.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true,
+      "optional": true
+    },
+    "fastparse": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": "0.7.0"
+      }
+    },
+    "file-loader": {
+      "version": "1.1.11",
+      "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
+      "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.4.7"
+      }
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "fileset": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
+      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.3",
+        "minimatch": "3.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+      "dev": true,
+      "requires": {
+        "is-number": "2.1.0",
+        "isobject": "2.1.0",
+        "randomatic": "3.1.0",
+        "repeat-element": "1.1.3",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "statuses": "1.4.0",
+        "unpipe": "1.0.0"
+      }
+    },
+    "find-cache-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+      "dev": true,
+      "requires": {
+        "commondir": "1.0.1",
+        "make-dir": "1.3.0",
+        "pkg-dir": "2.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "2.0.0"
+      }
+    },
+    "flush-write-stream": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.5.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz",
+      "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==",
+      "dev": true,
+      "requires": {
+        "debug": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2"
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.7",
+        "mime-types": "2.1.21"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "fs-access": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+      "dev": true,
+      "requires": {
+        "null-check": "1.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+      "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "jsonfile": "4.0.0",
+        "universalify": "0.1.2"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "iferr": "0.1.5",
+        "imurmurhash": "0.1.4",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "2.11.1",
+        "node-pre-gyp": "0.10.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "1.0.0",
+            "readable-stream": "2.3.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.5.1",
+          "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.4"
+          }
+        },
+        "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.2.0",
+            "console-control-strings": "1.1.0",
+            "has-unicode": "2.0.1",
+            "object-assign": "4.1.1",
+            "signal-exit": "3.0.2",
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wide-align": "1.1.2"
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.21",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": "2.1.2"
+          }
+        },
+        "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.4.0",
+            "wrappy": "1.0.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.11"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "minipass": {
+          "version": "2.2.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "5.1.1",
+            "yallist": "3.0.2"
+          }
+        },
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "2.2.4"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.9",
+            "iconv-lite": "0.4.21",
+            "sax": "1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.10.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "1.0.3",
+            "mkdirp": "0.5.1",
+            "needle": "2.2.0",
+            "nopt": "4.0.1",
+            "npm-packlist": "1.1.10",
+            "npmlog": "4.1.2",
+            "rc": "1.2.7",
+            "rimraf": "2.6.2",
+            "semver": "5.5.0",
+            "tar": "4.4.1"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.1",
+            "osenv": "0.1.5"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.1.10",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "3.0.1",
+            "npm-bundled": "1.0.3"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "1.1.4",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1.0.2"
+          }
+        },
+        "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.2",
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "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.7",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "0.5.1",
+            "ini": "1.3.5",
+            "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.2",
+            "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.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "glob": "7.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.1",
+          "bundled": true,
+          "dev": 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.5.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,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "5.1.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chownr": "1.0.1",
+            "fs-minipass": "1.2.5",
+            "minipass": "2.2.4",
+            "minizlib": "1.1.0",
+            "mkdirp": "0.5.1",
+            "safe-buffer": "5.1.1",
+            "yallist": "3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "inherits": "2.0.3",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2"
+      }
+    },
+    "ftp": {
+      "version": "0.3.10",
+      "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
+      "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "1.1.14",
+        "xregexp": "2.0.0"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "console-control-strings": "1.1.0",
+        "has-unicode": "2.0.1",
+        "object-assign": "4.1.1",
+        "signal-exit": "3.0.2",
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wide-align": "1.1.3"
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "globule": "1.2.1"
+      }
+    },
+    "generate-function": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-property": "1.0.2"
+      }
+    },
+    "generate-object-property": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-property": "1.0.2"
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "get-uri": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz",
+      "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "data-uri-to-buffer": "1.2.0",
+        "debug": "2.6.9",
+        "extend": "3.0.2",
+        "file-uri-to-path": "1.0.0",
+        "ftp": "0.3.10",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "2.0.0",
+        "is-glob": "2.0.1"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "dev": true,
+      "requires": {
+        "is-glob": "2.0.1"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+      "dev": true
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "1.0.2",
+        "dir-glob": "2.0.0",
+        "glob": "7.1.3",
+        "ignore": "3.3.10",
+        "pify": "3.0.0",
+        "slash": "1.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "7.1.3",
+        "lodash": "4.17.11",
+        "minimatch": "3.0.4"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "dev": true
+    },
+    "handle-thing": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+      "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+      "dev": true
+    },
+    "handlebars": {
+      "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
+      "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.1",
+        "optimist": "0.6.1",
+        "source-map": "0.6.1",
+        "uglify-js": "3.4.9"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "har-schema": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+      "dev": true,
+      "optional": true
+    },
+    "har-validator": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "ajv": "4.11.8",
+        "har-schema": "1.0.5"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "4.11.8",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "json-stable-stringify": "1.0.1"
+          }
+        }
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-binary2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+      "dev": true,
+      "requires": {
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "2.0.6",
+        "has-values": "1.0.0",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "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.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
+      "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "hawk": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1",
+        "cryptiles": "2.0.5",
+        "hoek": "2.16.3",
+        "sntp": "1.0.9"
+      }
+    },
+    "he": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+      "dev": true
+    },
+    "hipchat-notifier": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz",
+      "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lodash": "4.17.11",
+        "request": "2.81.0"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "1.1.5",
+        "minimalistic-assert": "1.0.1",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "hoek": {
+      "version": "2.16.3",
+      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+      "dev": true
+    },
+    "homedir-polyfill": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.6",
+        "wbuf": "1.7.3"
+      }
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.20",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz",
+      "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.0",
+        "clean-css": "4.2.1",
+        "commander": "2.17.1",
+        "he": "1.1.1",
+        "param-case": "2.1.1",
+        "relateurl": "0.2.7",
+        "uglify-js": "3.4.9"
+      }
+    },
+    "html-webpack-plugin": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz",
+      "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.2",
+        "html-minifier": "3.5.20",
+        "loader-utils": "0.2.17",
+        "lodash": "4.17.11",
+        "pretty-error": "2.1.1",
+        "toposort": "1.0.7"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "3.2.0",
+            "emojis-list": "2.1.0",
+            "json5": "0.5.1",
+            "object-assign": "4.1.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.3.0",
+      "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.2.1",
+        "domhandler": "2.1.0",
+        "domutils": "1.1.6",
+        "readable-stream": "1.0.34"
+      },
+      "dependencies": {
+        "domutils": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
+          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1.2.1"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.6.3",
+      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+      "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "3.1.0",
+        "follow-redirects": "1.5.9",
+        "requires-port": "1.0.0"
+      }
+    },
+    "http-proxy-agent": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
+      "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
+      "dev": true,
+      "requires": {
+        "agent-base": "4.2.1",
+        "debug": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+      "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "1.17.0",
+        "is-glob": "3.1.0",
+        "lodash": "4.17.11",
+        "micromatch": "2.3.11"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "assert-plus": "0.2.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.15.1"
+      }
+    },
+    "httpntlm": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
+      "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=",
+      "dev": true,
+      "requires": {
+        "httpreq": "0.4.24",
+        "underscore": "1.7.0"
+      }
+    },
+    "httpreq": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz",
+      "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=",
+      "dev": true
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+      "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+      "dev": true,
+      "requires": {
+        "agent-base": "4.2.1",
+        "debug": "3.2.6"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+      "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "ieee754": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+      "dev": true
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "2.1.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "2.0.0",
+        "resolve-cwd": "2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "in-publish": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "dev": true,
+      "optional": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflection": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
+      "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=",
+      "dev": true,
+      "optional": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
+    },
+    "internal-ip": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
+      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+      "dev": true,
+      "requires": {
+        "meow": "3.7.0"
+      }
+    },
+    "interpret": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+      "dev": true
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.4.0"
+      }
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "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.12.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-callable": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "dev": true
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "0.1.6",
+        "is-data-descriptor": "0.1.4",
+        "kind-of": "5.1.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      }
+    },
+    "is-my-ip-valid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+      "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+      "dev": true,
+      "optional": true
+    },
+    "is-my-json-valid": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz",
+      "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "generate-function": "2.3.1",
+        "generate-object-property": "1.2.0",
+        "is-my-ip-valid": "1.0.0",
+        "jsonpointer": "4.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "1.0.1"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "1.0.2"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-property": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.3"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-symbol": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isbinaryfile": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+      "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc": "1.2.0"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "dev": true,
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul-api": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
+      "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.1",
+        "fileset": "2.0.3",
+        "istanbul-lib-coverage": "1.2.1",
+        "istanbul-lib-hook": "1.2.2",
+        "istanbul-lib-instrument": "1.10.2",
+        "istanbul-lib-report": "1.1.5",
+        "istanbul-lib-source-maps": "1.2.6",
+        "istanbul-reports": "1.5.1",
+        "js-yaml": "3.12.0",
+        "mkdirp": "0.5.1",
+        "once": "1.4.0"
+      }
+    },
+    "istanbul-instrumenter-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
+      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "1.6.0",
+        "istanbul-lib-instrument": "1.10.2",
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "istanbul-lib-coverage": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
+      "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==",
+      "dev": true
+    },
+    "istanbul-lib-hook": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
+      "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==",
+      "dev": true,
+      "requires": {
+        "append-transform": "0.4.0"
+      }
+    },
+    "istanbul-lib-instrument": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
+      "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
+      "dev": true,
+      "requires": {
+        "babel-generator": "6.26.1",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "istanbul-lib-coverage": "1.2.1",
+        "semver": "5.6.0"
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
+      "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "1.2.1",
+        "mkdirp": "0.5.1",
+        "path-parse": "1.0.6",
+        "supports-color": "3.2.3"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
+      "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
+      "dev": true,
+      "requires": {
+        "debug": "3.2.6",
+        "istanbul-lib-coverage": "1.2.1",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "source-map": "0.5.7"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
+      "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==",
+      "dev": true,
+      "requires": {
+        "handlebars": "4.0.12"
+      }
+    },
+    "jasmine": {
+      "version": "2.99.0",
+      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz",
+      "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=",
+      "dev": true,
+      "requires": {
+        "exit": "0.1.2",
+        "glob": "7.1.3",
+        "jasmine-core": "2.99.1"
+      },
+      "dependencies": {
+        "jasmine-core": {
+          "version": "2.99.1",
+          "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
+          "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=",
+          "dev": true
+        }
+      }
+    },
+    "jasmine-core": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz",
+      "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
+      "dev": true
+    },
+    "jasmine-spec-reporter": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
+      "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
+      "dev": true,
+      "requires": {
+        "colors": "1.1.2"
+      }
+    },
+    "jasminewd2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
+      "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
+      "dev": true
+    },
+    "jquery": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+      "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+    },
+    "js-base64": {
+      "version": "2.4.9",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
+      "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
+      "dev": true,
+      "optional": true
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+      "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+      "dev": true,
+      "requires": {
+        "argparse": "1.0.10",
+        "esprima": "4.0.1"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+      "dev": true
+    },
+    "json-loader": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+      "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+      "dev": true
+    },
+    "json-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "dev": true,
+      "optional": true
+    },
+    "jsonpointer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+      "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+      "dev": true,
+      "optional": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "karma": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz",
+      "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.2",
+        "body-parser": "1.18.3",
+        "chokidar": "2.0.4",
+        "colors": "1.1.2",
+        "combine-lists": "1.0.1",
+        "connect": "3.6.6",
+        "core-js": "2.5.7",
+        "di": "0.0.1",
+        "dom-serialize": "2.2.1",
+        "expand-braces": "0.1.2",
+        "glob": "7.1.3",
+        "graceful-fs": "4.1.11",
+        "http-proxy": "1.17.0",
+        "isbinaryfile": "3.0.3",
+        "lodash": "4.17.11",
+        "log4js": "2.11.0",
+        "mime": "1.6.0",
+        "minimatch": "3.0.4",
+        "optimist": "0.6.1",
+        "qjobs": "1.2.0",
+        "range-parser": "1.2.0",
+        "rimraf": "2.6.2",
+        "safe-buffer": "5.1.2",
+        "socket.io": "2.0.4",
+        "source-map": "0.6.1",
+        "tmp": "0.0.33",
+        "useragent": "2.2.1"
+      },
+      "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.10",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "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.3",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "chokidar": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+          "dev": true,
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.2",
+            "fsevents": "1.2.4",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "lodash.debounce": "4.0.8",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.2.1",
+            "upath": "1.1.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "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.1"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "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.1"
+              }
+            }
+          }
+        },
+        "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.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "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.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.2",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.13",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "karma-chrome-launcher": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+      "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
+      "dev": true,
+      "requires": {
+        "fs-access": "1.0.1",
+        "which": "1.3.1"
+      }
+    },
+    "karma-coverage-istanbul-reporter": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz",
+      "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=",
+      "dev": true,
+      "requires": {
+        "istanbul-api": "1.3.7",
+        "minimatch": "3.0.4"
+      }
+    },
+    "karma-jasmine": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
+      "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
+      "dev": true
+    },
+    "karma-jasmine-html-reporter": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz",
+      "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=",
+      "dev": true,
+      "requires": {
+        "karma-jasmine": "1.1.2"
+      }
+    },
+    "karma-source-map-support": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz",
+      "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==",
+      "dev": true,
+      "requires": {
+        "source-map-support": "0.5.9"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "1.1.1",
+            "source-map": "0.6.1"
+          }
+        }
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "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.6"
+      }
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "1.0.0"
+      }
+    },
+    "less": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
+      "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7",
+        "graceful-fs": "4.1.11",
+        "image-size": "0.5.5",
+        "mime": "1.6.0",
+        "mkdirp": "0.5.1",
+        "promise": "7.3.1",
+        "request": "2.81.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+      "dev": true,
+      "requires": {
+        "clone": "2.1.2",
+        "loader-utils": "1.1.0",
+        "pify": "3.0.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2"
+      }
+    },
+    "libbase64": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
+      "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=",
+      "dev": true
+    },
+    "libmime": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz",
+      "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.15",
+        "libbase64": "0.1.0",
+        "libqp": "1.1.0"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.15",
+          "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+          "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
+          "dev": true
+        }
+      }
+    },
+    "libqp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
+      "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=",
+      "dev": true
+    },
+    "license-webpack-plugin": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz",
+      "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==",
+      "dev": true,
+      "requires": {
+        "ejs": "2.6.1"
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "strip-bom": "2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
+      "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+      "dev": true,
+      "requires": {
+        "big.js": "3.2.0",
+        "emojis-list": "2.1.0",
+        "json5": "0.5.1"
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "requires": {
+        "p-locate": "2.0.0",
+        "path-exists": "3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.11",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+      "dev": true
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
+    },
+    "lodash.mergewith": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+      "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.tail": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+      "dev": true
+    },
+    "log4js": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.11.0.tgz",
+      "integrity": "sha512-z1XdwyGFg8/WGkOyF6DPJjivCWNLKrklGdViywdYnSKOvgtEBo2UyEMZS5sD2mZrQlU3TvO8wDWLc8mzE1ncBQ==",
+      "dev": true,
+      "requires": {
+        "amqplib": "0.5.2",
+        "axios": "0.15.3",
+        "circular-json": "0.5.8",
+        "date-format": "1.2.0",
+        "debug": "3.2.6",
+        "hipchat-notifier": "1.1.0",
+        "loggly": "1.1.1",
+        "mailgun-js": "0.18.1",
+        "nodemailer": "2.7.2",
+        "redis": "2.8.0",
+        "semver": "5.6.0",
+        "slack-node": "0.2.0",
+        "streamroller": "0.7.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "loggly": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz",
+      "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "json-stringify-safe": "5.0.1",
+        "request": "2.75.0",
+        "timespan": "2.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true,
+          "optional": true
+        },
+        "caseless": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+          "dev": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "form-data": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz",
+          "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.7",
+            "mime-types": "2.1.21"
+          }
+        },
+        "har-validator": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+          "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "commander": "2.17.1",
+            "is-my-json-valid": "2.19.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "node-uuid": {
+          "version": "1.4.8",
+          "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+          "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.2.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
+          "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.75.0",
+          "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz",
+          "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.8.0",
+            "bl": "1.1.2",
+            "caseless": "0.11.0",
+            "combined-stream": "1.0.7",
+            "extend": "3.0.2",
+            "forever-agent": "0.6.1",
+            "form-data": "2.0.0",
+            "har-validator": "2.0.6",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.21",
+            "node-uuid": "1.4.8",
+            "oauth-sign": "0.8.2",
+            "qs": "6.2.3",
+            "stringstream": "0.0.6",
+            "tough-cookie": "2.3.4",
+            "tunnel-agent": "0.4.3"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true,
+          "optional": true
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "loglevel": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+      "dev": true
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dev": true,
+      "requires": {
+        "js-tokens": "3.0.2"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "0.4.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "magic-string": {
+      "version": "0.22.5",
+      "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+      "dev": true,
+      "requires": {
+        "vlq": "0.2.3"
+      }
+    },
+    "mailcomposer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz",
+      "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "buildmail": "4.0.1",
+        "libmime": "3.0.0"
+      }
+    },
+    "mailgun-js": {
+      "version": "0.18.1",
+      "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.1.tgz",
+      "integrity": "sha512-lvuMP14u24HS2uBsJEnzSyPMxzU2b99tQsIx1o6QNjqxjk8b3WvR+vq5oG1mjqz/IBYo+5gF+uSoDS0RkMVHmg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async": "2.6.1",
+        "debug": "3.1.0",
+        "form-data": "2.3.3",
+        "inflection": "1.12.0",
+        "is-stream": "1.1.0",
+        "path-proxy": "1.0.0",
+        "promisify-call": "2.0.4",
+        "proxy-agent": "3.0.3",
+        "tsscmp": "1.0.6"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.7",
+            "mime-types": "2.1.21"
+          }
+        }
+      }
+    },
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "make-error": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
+      "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
+      "dev": true
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "1.0.1"
+      }
+    },
+    "math-random": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+      "dev": true
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "3.0.4",
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "2.1.0",
+        "decamelize": "1.2.0",
+        "loud-rejection": "1.6.0",
+        "map-obj": "1.0.1",
+        "minimist": "1.2.0",
+        "normalize-package-data": "2.4.0",
+        "object-assign": "4.1.1",
+        "read-pkg-up": "1.0.1",
+        "redent": "1.0.0",
+        "trim-newlines": "1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "2.0.0",
+        "array-unique": "0.2.1",
+        "braces": "1.8.5",
+        "expand-brackets": "0.1.5",
+        "extglob": "0.3.2",
+        "filename-regex": "2.0.1",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1",
+        "kind-of": "3.2.2",
+        "normalize-path": "2.1.1",
+        "object.omit": "2.0.1",
+        "parse-glob": "3.0.4",
+        "regex-cache": "0.4.4"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0"
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.37.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.21",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+      "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.37.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "1.1.11"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+      "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.2",
+        "duplexify": "3.6.1",
+        "end-of-stream": "1.4.1",
+        "flush-write-stream": "1.0.3",
+        "from2": "2.3.0",
+        "parallel-transform": "1.1.0",
+        "pump": "2.0.1",
+        "pumpify": "1.5.1",
+        "stream-each": "1.2.3",
+        "through2": "2.0.3"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "mixin-object": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+      "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+      "dev": true,
+      "requires": {
+        "for-in": "0.1.8",
+        "is-extendable": "0.1.1"
+      },
+      "dependencies": {
+        "for-in": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+          "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+          "dev": true
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "copy-concurrently": "1.0.5",
+        "fs-write-stream-atomic": "1.0.10",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "1.3.1",
+        "thunky": "1.0.3"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.11.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
+      "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "4.0.0",
+        "array-unique": "0.3.2",
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "fragment-cache": "0.2.1",
+        "is-windows": "1.0.2",
+        "kind-of": "6.0.2",
+        "object.pick": "1.3.0",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+      "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+      "dev": true
+    },
+    "netmask": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
+      "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=",
+      "dev": true,
+      "optional": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
+    "ng-zorro-antd": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/ng-zorro-antd/-/ng-zorro-antd-0.7.1.tgz",
+      "integrity": "sha512-GqeQ8BqOVu3ubKtavYsFti5niRKQwNgz6tMeULmKZdJAwS/ylAsDDmx5AB0bGLv4CrIgto9fUolRyxR8+dLYVw==",
+      "requires": {
+        "@angular/cdk": "5.2.5",
+        "date-fns": "1.29.0"
+      }
+    },
+    "ngx-echarts": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-2.3.1.tgz",
+      "integrity": "sha512-0aCnTOPN0hA/cTwhNvV113LvHZ3z17g6oUdVrQndZBy0xXX/WFt21eMnyjeMSi3tG+US4DvPyzBq3Ih1ew1waw=="
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+      "dev": true,
+      "requires": {
+        "lower-case": "1.1.4"
+      }
+    },
+    "node-forge": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
+      "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "fstream": "1.0.11",
+        "glob": "7.1.3",
+        "graceful-fs": "4.1.11",
+        "mkdirp": "0.5.1",
+        "nopt": "3.0.6",
+        "npmlog": "4.1.2",
+        "osenv": "0.1.5",
+        "request": "2.88.0",
+        "rimraf": "2.6.2",
+        "semver": "5.3.0",
+        "tar": "2.2.1",
+        "which": "1.3.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.7",
+            "mime-types": "2.1.21"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+          "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "5.5.2",
+            "har-schema": "2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "jsprim": "1.4.1",
+            "sshpk": "1.15.1"
+          }
+        },
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.1"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true,
+          "optional": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true,
+          "optional": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.7.0",
+            "aws4": "1.8.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.7",
+            "extend": "3.0.2",
+            "forever-agent": "0.6.1",
+            "form-data": "2.3.3",
+            "har-validator": "5.1.0",
+            "http-signature": "1.2.0",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.21",
+            "oauth-sign": "0.9.0",
+            "performance-now": "2.1.0",
+            "qs": "6.5.2",
+            "safe-buffer": "5.1.2",
+            "tough-cookie": "2.4.3",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.3.2"
+          }
+        },
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true,
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "psl": "1.1.29",
+            "punycode": "1.4.1"
+          }
+        }
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+      "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
+      "dev": true,
+      "requires": {
+        "assert": "1.4.1",
+        "browserify-zlib": "0.2.0",
+        "buffer": "4.9.1",
+        "console-browserify": "1.1.0",
+        "constants-browserify": "1.0.0",
+        "crypto-browserify": "3.12.0",
+        "domain-browser": "1.2.0",
+        "events": "1.1.1",
+        "https-browserify": "1.0.0",
+        "os-browserify": "0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "0.11.10",
+        "punycode": "1.4.1",
+        "querystring-es3": "0.2.1",
+        "readable-stream": "2.3.6",
+        "stream-browserify": "2.0.1",
+        "stream-http": "2.8.3",
+        "string_decoder": "1.1.1",
+        "timers-browserify": "2.0.10",
+        "tty-browserify": "0.0.0",
+        "url": "0.11.0",
+        "util": "0.10.4",
+        "vm-browserify": "0.0.4"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "node-modules-path": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz",
+      "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==",
+      "dev": true
+    },
+    "node-sass": {
+      "version": "4.9.4",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.4.tgz",
+      "integrity": "sha512-MXyurANsUoE4/6KmfMkwGcBzAnJQ5xJBGW7Ei6ea8KnUKuzHr/SguVBIi3uaUAHtZCPUYkvlJ3Ef5T5VAwVpaA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async-foreach": "0.1.3",
+        "chalk": "1.1.3",
+        "cross-spawn": "3.0.1",
+        "gaze": "1.1.3",
+        "get-stdin": "4.0.1",
+        "glob": "7.1.3",
+        "in-publish": "2.0.0",
+        "lodash.assign": "4.2.0",
+        "lodash.clonedeep": "4.5.0",
+        "lodash.mergewith": "4.6.1",
+        "meow": "3.7.0",
+        "mkdirp": "0.5.1",
+        "nan": "2.11.1",
+        "node-gyp": "3.8.0",
+        "npmlog": "4.1.2",
+        "request": "2.88.0",
+        "sass-graph": "2.2.4",
+        "stdout-stream": "1.4.1",
+        "true-case-path": "1.0.3"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true,
+          "optional": true
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.7",
+            "mime-types": "2.1.21"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+          "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "5.5.2",
+            "har-schema": "2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "jsprim": "1.4.1",
+            "sshpk": "1.15.1"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true,
+          "optional": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true,
+          "optional": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.7.0",
+            "aws4": "1.8.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.7",
+            "extend": "3.0.2",
+            "forever-agent": "0.6.1",
+            "form-data": "2.3.3",
+            "har-validator": "5.1.0",
+            "http-signature": "1.2.0",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.21",
+            "oauth-sign": "0.9.0",
+            "performance-now": "2.1.0",
+            "qs": "6.5.2",
+            "safe-buffer": "5.1.2",
+            "tough-cookie": "2.4.3",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.3.2"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true,
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "psl": "1.1.29",
+            "punycode": "1.4.1"
+          }
+        }
+      }
+    },
+    "nodemailer": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz",
+      "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "libmime": "3.0.0",
+        "mailcomposer": "4.0.1",
+        "nodemailer-direct-transport": "3.3.2",
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-smtp-pool": "2.8.2",
+        "nodemailer-smtp-transport": "2.7.2",
+        "socks": "1.1.9"
+      },
+      "dependencies": {
+        "smart-buffer": {
+          "version": "1.1.15",
+          "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
+          "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
+          "dev": true,
+          "optional": true
+        },
+        "socks": {
+          "version": "1.1.9",
+          "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz",
+          "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ip": "1.1.5",
+            "smart-buffer": "1.1.15"
+          }
+        }
+      }
+    },
+    "nodemailer-direct-transport": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz",
+      "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-fetch": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz",
+      "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=",
+      "dev": true
+    },
+    "nodemailer-shared": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz",
+      "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=",
+      "dev": true,
+      "requires": {
+        "nodemailer-fetch": "1.6.0"
+      }
+    },
+    "nodemailer-smtp-pool": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz",
+      "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-wellknown": "0.1.10",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-smtp-transport": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz",
+      "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-wellknown": "0.1.10",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-wellknown": {
+      "version": "0.1.10",
+      "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz",
+      "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=",
+      "dev": true
+    },
+    "nopt": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+      "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.1.1",
+        "osenv": "0.1.5"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "2.7.1",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.6.0",
+        "validate-npm-package-license": "3.0.4"
+      }
+    },
+    "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.1.0"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "2.0.1"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "dev": true,
+      "requires": {
+        "are-we-there-yet": "1.1.5",
+        "console-control-strings": "1.1.0",
+        "gauge": "2.7.4",
+        "set-blocking": "2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0"
+      }
+    },
+    "null-check": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+      "dev": true
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+      "dev": true,
+      "optional": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-component": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "0.1.1",
+        "define-property": "0.2.5",
+        "kind-of": "3.2.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        }
+      }
+    },
+    "object-keys": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "0.1.5",
+        "is-extendable": "0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "opn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
+      "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "1.1.0"
+      }
+    },
+    "optimist": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8",
+        "wordwrap": "0.0.2"
+      }
+    },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "deep-is": "0.1.3",
+        "fast-levenshtein": "2.0.6",
+        "levn": "0.3.0",
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2",
+        "wordwrap": "1.0.0"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "options": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+      "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
+      "dev": true
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "requires": {
+        "url-parse": "1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "1.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "dev": true,
+      "requires": {
+        "p-try": "1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "requires": {
+        "p-limit": "1.3.0"
+      }
+    },
+    "p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
+    },
+    "pac-proxy-agent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz",
+      "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "agent-base": "4.2.1",
+        "debug": "3.2.6",
+        "get-uri": "2.0.2",
+        "http-proxy-agent": "2.1.0",
+        "https-proxy-agent": "2.2.1",
+        "pac-resolver": "3.0.0",
+        "raw-body": "2.3.3",
+        "socks-proxy-agent": "4.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "pac-resolver": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz",
+      "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "co": "4.6.0",
+        "degenerator": "1.0.4",
+        "ip": "1.1.5",
+        "netmask": "1.0.6",
+        "thunkify": "2.1.2"
+      }
+    },
+    "pako": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "0.2.2",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.2"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.1",
+      "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+      "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "4.10.1",
+        "browserify-aes": "1.2.0",
+        "create-hash": "1.2.0",
+        "evp_bytestokey": "1.0.3",
+        "pbkdf2": "3.0.17"
+      }
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "0.3.0",
+        "is-dotfile": "1.0.3",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "1.3.2"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "parseqs": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+      "dev": true,
+      "requires": {
+        "better-assert": "1.0.2"
+      }
+    },
+    "parseuri": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+      "dev": true,
+      "requires": {
+        "better-assert": "1.0.2"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-proxy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz",
+      "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "inflection": "1.3.8"
+      },
+      "dependencies": {
+        "inflection": {
+          "version": "1.3.8",
+          "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz",
+          "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
+      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+      "dev": true,
+      "requires": {
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "ripemd160": "2.0.2",
+        "safe-buffer": "5.1.2",
+        "sha.js": "2.4.11"
+      }
+    },
+    "performance-now": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+      "dev": true,
+      "optional": true
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "2.0.4"
+      }
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "2.1.0"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.18",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.18.tgz",
+      "integrity": "sha512-KanzLOERzKoX3En5yTiV8K/arnU1ykYVokmtEn0PgCzqKZG9489tqW8ifp9+v3/VJZ5YDjvDt/PAP5WaPgk7FA==",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.1"
+      },
+      "dependencies": {
+        "async": {
+          "version": "1.5.2",
+          "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "postcss": {
+      "version": "6.0.23",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+      "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.1",
+        "source-map": "0.6.1",
+        "supports-color": "5.5.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.5.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-import": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
+      "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.23",
+        "postcss-value-parser": "3.3.1",
+        "read-cache": "1.0.0",
+        "resolve": "1.8.1"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz",
+      "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "4.0.0",
+        "import-cwd": "2.1.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz",
+      "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "postcss": "6.0.23",
+        "postcss-load-config": "2.0.0",
+        "schema-utils": "0.4.7"
+      }
+    },
+    "postcss-url": {
+      "version": "7.3.2",
+      "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz",
+      "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==",
+      "dev": true,
+      "requires": {
+        "mime": "1.6.0",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "postcss": "6.0.23",
+        "xxhashjs": "0.2.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "dev": true,
+      "requires": {
+        "renderkid": "2.0.2",
+        "utila": "0.4.0"
+      }
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asap": "2.0.6"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "promisify-call": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz",
+      "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "with-callback": "1.0.2"
+      }
+    },
+    "protractor": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz",
+      "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=",
+      "dev": true,
+      "requires": {
+        "@types/node": "6.0.118",
+        "@types/q": "0.0.32",
+        "@types/selenium-webdriver": "2.53.43",
+        "blocking-proxy": "0.0.5",
+        "chalk": "1.1.3",
+        "glob": "7.1.3",
+        "jasmine": "2.99.0",
+        "jasminewd2": "2.2.0",
+        "optimist": "0.6.1",
+        "q": "1.4.1",
+        "saucelabs": "1.3.0",
+        "selenium-webdriver": "3.0.1",
+        "source-map-support": "0.4.18",
+        "webdriver-js-extender": "1.0.0",
+        "webdriver-manager": "12.1.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "del": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+          "dev": true,
+          "requires": {
+            "globby": "5.0.0",
+            "is-path-cwd": "1.0.0",
+            "is-path-in-cwd": "1.0.1",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "rimraf": "2.6.2"
+          }
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.7",
+            "mime-types": "2.1.21"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.3",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true
+        },
+        "har-validator": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+          "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2",
+            "har-schema": "2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "jsprim": "1.4.1",
+            "sshpk": "1.15.1"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
+          "requires": {
+            "aws-sign2": "0.7.0",
+            "aws4": "1.8.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.7",
+            "extend": "3.0.2",
+            "forever-agent": "0.6.1",
+            "form-data": "2.3.3",
+            "har-validator": "5.1.0",
+            "http-signature": "1.2.0",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.21",
+            "oauth-sign": "0.9.0",
+            "performance-now": "2.1.0",
+            "qs": "6.5.2",
+            "safe-buffer": "5.1.2",
+            "tough-cookie": "2.4.3",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.3.2"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "requires": {
+            "psl": "1.1.29",
+            "punycode": "1.4.1"
+          }
+        },
+        "webdriver-manager": {
+          "version": "12.1.0",
+          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz",
+          "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==",
+          "dev": true,
+          "requires": {
+            "adm-zip": "0.4.11",
+            "chalk": "1.1.3",
+            "del": "2.2.2",
+            "glob": "7.1.3",
+            "ini": "1.3.5",
+            "minimist": "1.2.0",
+            "q": "1.4.1",
+            "request": "2.88.0",
+            "rimraf": "2.6.2",
+            "semver": "5.6.0",
+            "xml2js": "0.4.19"
+          }
+        }
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+      "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+      "dev": true,
+      "requires": {
+        "forwarded": "0.1.2",
+        "ipaddr.js": "1.8.0"
+      }
+    },
+    "proxy-agent": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.3.tgz",
+      "integrity": "sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "agent-base": "4.2.1",
+        "debug": "3.2.6",
+        "http-proxy-agent": "2.1.0",
+        "https-proxy-agent": "2.2.1",
+        "lru-cache": "4.1.3",
+        "pac-proxy-agent": "3.0.0",
+        "proxy-from-env": "1.0.0",
+        "socks-proxy-agent": "4.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "proxy-from-env": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+      "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
+      "dev": true,
+      "optional": true
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.1.29",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+      "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.2.0",
+        "parse-asn1": "5.1.1",
+        "randombytes": "2.0.6",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "once": "1.4.0"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "requires": {
+        "duplexify": "3.6.1",
+        "inherits": "2.0.3",
+        "pump": "2.0.1"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "q": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+      "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+      "dev": true
+    },
+    "qjobs": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+      "dev": true,
+      "optional": true
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+      "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
+      "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "4.0.0",
+        "kind-of": "6.0.2",
+        "math-random": "1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "2.0.6",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+      "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "unpipe": "1.0.0"
+      }
+    },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
+      "dev": true
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "1.1.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "1.1.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "1.1.2",
+        "read-pkg": "1.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.2",
+        "string_decoder": "1.1.1",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "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.3.6"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "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.3",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "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.1"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "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.1"
+              }
+            }
+          }
+        },
+        "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.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "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.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.2",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.13",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        }
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "2.1.0",
+        "strip-indent": "1.0.1"
+      }
+    },
+    "redis": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
+      "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "double-ended-queue": "2.1.0-0",
+        "redis-commands": "1.4.0",
+        "redis-parser": "2.6.0"
+      }
+    },
+    "redis-commands": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz",
+      "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==",
+      "dev": true,
+      "optional": true
+    },
+    "redis-parser": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
+      "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
+      "dev": true,
+      "optional": true
+    },
+    "reflect-metadata": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz",
+      "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==",
+      "dev": true
+    },
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "dev": true
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+      "dev": true
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2",
+        "safe-regex": "1.1.0"
+      }
+    },
+    "regexpu-core": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+      "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+      "dev": true,
+      "requires": {
+        "regenerate": "1.4.0",
+        "regjsgen": "0.2.0",
+        "regjsparser": "0.1.5"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "renderkid": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz",
+      "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==",
+      "dev": true,
+      "requires": {
+        "css-select": "1.2.0",
+        "dom-converter": "0.2.0",
+        "htmlparser2": "3.3.0",
+        "strip-ansi": "3.0.1",
+        "utila": "0.4.0"
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "request": {
+      "version": "2.81.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "aws-sign2": "0.6.0",
+        "aws4": "1.8.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.7",
+        "extend": "3.0.2",
+        "forever-agent": "0.6.1",
+        "form-data": "2.1.4",
+        "har-validator": "4.2.1",
+        "hawk": "3.1.3",
+        "http-signature": "1.1.1",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.21",
+        "oauth-sign": "0.8.2",
+        "performance-now": "0.2.0",
+        "qs": "6.4.0",
+        "safe-buffer": "5.1.2",
+        "stringstream": "0.0.6",
+        "tough-cookie": "2.3.4",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.3.2"
+      }
+    },
+    "requestretry": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz",
+      "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "extend": "3.0.2",
+        "lodash": "4.17.11",
+        "request": "2.81.0",
+        "when": "3.7.8"
+      },
+      "dependencies": {
+        "when": {
+          "version": "3.7.8",
+          "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+          "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+      "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+      "dev": true,
+      "requires": {
+        "path-parse": "1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "dev": true,
+      "requires": {
+        "align-text": "0.1.4"
+      }
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "3.0.4",
+        "inherits": "2.0.3"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0"
+      }
+    },
+    "rxjs": {
+      "version": "5.5.12",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+      "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+      "requires": {
+        "symbol-observable": "1.0.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "0.1.15"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sass-graph": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "7.1.3",
+        "lodash": "4.17.11",
+        "scss-tokenizer": "0.2.3",
+        "yargs": "7.1.0"
+      }
+    },
+    "sass-loader": {
+      "version": "6.0.7",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz",
+      "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "2.0.2",
+        "loader-utils": "1.1.0",
+        "lodash.tail": "4.1.1",
+        "neo-async": "2.6.0",
+        "pify": "3.0.0"
+      }
+    },
+    "saucelabs": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz",
+      "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=",
+      "dev": true,
+      "requires": {
+        "https-proxy-agent": "1.0.0"
+      },
+      "dependencies": {
+        "agent-base": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+          "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+          "dev": true,
+          "requires": {
+            "extend": "3.0.2",
+            "semver": "5.0.3"
+          }
+        },
+        "https-proxy-agent": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+          "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+          "dev": true,
+          "requires": {
+            "agent-base": "2.1.1",
+            "debug": "2.6.9",
+            "extend": "3.0.2"
+          }
+        },
+        "semver": {
+          "version": "5.0.3",
+          "resolved": "http://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+          "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+          "dev": true
+        }
+      }
+    },
+    "sax": {
+      "version": "0.5.8",
+      "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
+      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "0.4.7",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+      "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "6.5.4",
+        "ajv-keywords": "3.2.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "js-base64": "2.4.9",
+        "source-map": "0.4.4"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selenium-webdriver": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz",
+      "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=",
+      "dev": true,
+      "requires": {
+        "adm-zip": "0.4.11",
+        "rimraf": "2.6.2",
+        "tmp": "0.0.30",
+        "xml2js": "0.4.19"
+      },
+      "dependencies": {
+        "tmp": {
+          "version": "0.0.30",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
+          "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "1.0.2"
+          }
+        }
+      }
+    },
+    "selfsigned": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
+      "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.7.5"
+      }
+    },
+    "semver": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+      "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+      "dev": true
+    },
+    "semver-dsl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "5.6.0"
+      }
+    },
+    "semver-intersect": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
+      "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==",
+      "dev": true,
+      "requires": {
+        "semver": "5.6.0"
+      }
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "destroy": "1.0.4",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "1.6.3",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "2.3.0",
+        "range-parser": "1.2.0",
+        "statuses": "1.4.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+          "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
+      "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
+      "dev": true
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "1.0.3",
+        "http-errors": "1.6.3",
+        "mime-types": "2.1.21",
+        "parseurl": "1.3.2"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "parseurl": "1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "2.0.1",
+        "is-extendable": "0.1.1",
+        "is-plain-object": "2.0.4",
+        "split-string": "3.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "shallow-clone": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+      "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+      "dev": true,
+      "requires": {
+        "is-extendable": "0.1.1",
+        "kind-of": "5.1.0",
+        "mixin-object": "2.0.1"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "silent-error": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz",
+      "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9"
+      }
+    },
+    "slack-node": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz",
+      "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "requestretry": "1.13.0"
+      }
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "smart-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz",
+      "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==",
+      "dev": true
+    },
+    "smtp-connection": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz",
+      "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=",
+      "dev": true,
+      "requires": {
+        "httpntlm": "1.6.1",
+        "nodemailer-shared": "1.1.0"
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "0.11.2",
+        "debug": "2.6.9",
+        "define-property": "0.2.5",
+        "extend-shallow": "2.0.1",
+        "map-cache": "0.2.2",
+        "source-map": "0.5.7",
+        "source-map-resolve": "0.5.2",
+        "use": "3.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "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.1"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "snapdragon-util": "3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "sntp": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "socket.io": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+      "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "engine.io": "3.1.5",
+        "socket.io-adapter": "1.1.1",
+        "socket.io-client": "2.0.4",
+        "socket.io-parser": "3.1.3"
+      }
+    },
+    "socket.io-adapter": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+      "dev": true
+    },
+    "socket.io-client": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+      "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+      "dev": true,
+      "requires": {
+        "backo2": "1.0.2",
+        "base64-arraybuffer": "0.1.5",
+        "component-bind": "1.0.0",
+        "component-emitter": "1.2.1",
+        "debug": "2.6.9",
+        "engine.io-client": "3.1.6",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "object-component": "0.0.3",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "socket.io-parser": "3.1.3",
+        "to-array": "0.1.4"
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
+      "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "debug": "3.1.0",
+        "has-binary2": "1.0.3",
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "0.10.0",
+        "uuid": "3.3.2"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
+      "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "eventsource": "0.1.6",
+        "faye-websocket": "0.11.1",
+        "inherits": "2.0.3",
+        "json3": "3.3.2",
+        "url-parse": "1.4.3"
+      },
+      "dependencies": {
+        "faye-websocket": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+          "dev": true,
+          "requires": {
+            "websocket-driver": "0.7.0"
+          }
+        }
+      }
+    },
+    "socks": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz",
+      "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "smart-buffer": "4.0.1"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz",
+      "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==",
+      "dev": true,
+      "requires": {
+        "agent-base": "4.2.1",
+        "socks": "2.2.1"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "dev": true,
+      "requires": {
+        "atob": "2.1.2",
+        "decode-uri-component": "0.2.0",
+        "resolve-url": "0.2.1",
+        "source-map-url": "0.4.0",
+        "urix": "0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.7"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
+      "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "3.0.0",
+        "spdx-license-ids": "3.0.1"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "2.2.0",
+        "spdx-license-ids": "3.0.1"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
+      "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+      "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "handle-thing": "1.2.5",
+        "http-deceiver": "1.2.7",
+        "safe-buffer": "5.1.2",
+        "select-hose": "2.0.0",
+        "spdy-transport": "2.1.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
+      "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "detect-node": "2.0.4",
+        "hpack.js": "2.1.6",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.6",
+        "safe-buffer": "5.1.2",
+        "wbuf": "1.7.3"
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
+      "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
+      "dev": true,
+      "requires": {
+        "asn1": "0.2.4",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.2",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.2",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2",
+        "tweetnacl": "0.14.5"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "ssri": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+      "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "0.2.5",
+        "object-copy": "0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+      "dev": true
+    },
+    "stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "2.3.6"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "3.0.0",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "to-arraybuffer": "1.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "streamroller": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
+      "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
+      "dev": true,
+      "requires": {
+        "date-format": "1.2.0",
+        "debug": "3.2.6",
+        "mkdirp": "0.5.1",
+        "readable-stream": "2.3.6"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "dev": true,
+      "requires": {
+        "code-point-at": "1.1.0",
+        "is-fullwidth-code-point": "1.0.0",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "stringstream": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
+      "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
+      "dev": true,
+      "optional": true
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "0.2.1"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "style-loader": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz",
+      "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "stylus": {
+      "version": "0.54.5",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
+      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+      "dev": true,
+      "requires": {
+        "css-parse": "1.7.0",
+        "debug": "2.6.9",
+        "glob": "7.0.6",
+        "mkdirp": "0.5.1",
+        "sax": "0.5.8",
+        "source-map": "0.1.43"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "stylus-loader": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
+      "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "lodash.clonedeep": "4.5.0",
+        "when": "3.6.4"
+      }
+    },
+    "supports-color": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+      "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+      "dev": true,
+      "requires": {
+        "has-flag": "2.0.0"
+      }
+    },
+    "symbol-observable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+      "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+    },
+    "tapable": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+      "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
+      "dev": true
+    },
+    "tar": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "block-stream": "0.0.9",
+        "fstream": "1.0.11",
+        "inherits": "2.0.3"
+      }
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "through2": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6",
+        "xtend": "4.0.1"
+      }
+    },
+    "thunkify": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
+      "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
+      "dev": true,
+      "optional": true
+    },
+    "thunky": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
+      "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
+      "dev": true
+    },
+    "time-stamp": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.1.0.tgz",
+      "integrity": "sha512-lJbq6KsFhZJtN3fPUVje1tq/hHsJOKUUcUj/MGCiQR6qWBDcyi5kxL9J7/RnaEChCn0+L/DUN2WvemDrkk4i3Q==",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+      "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "1.0.5"
+      }
+    },
+    "timespan": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
+      "dev": true,
+      "optional": true
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "to-array": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+      "dev": true
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "regex-not": "1.0.2",
+        "safe-regex": "1.1.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"
+      },
+      "dependencies": {
+        "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.2.2"
+          }
+        }
+      }
+    },
+    "toposort": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
+      "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "punycode": "1.4.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "tree-kill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
+      "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
+      "dev": true
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "7.1.3"
+      }
+    },
+    "ts-node": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz",
+      "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "chalk": "2.4.1",
+        "diff": "3.5.0",
+        "make-error": "1.3.5",
+        "minimist": "1.2.0",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.5.9",
+        "tsconfig": "7.0.0",
+        "v8flags": "3.1.1",
+        "yn": "2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.5.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "1.1.1",
+            "source-map": "0.6.1"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "tsconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+      "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+      "dev": true,
+      "requires": {
+        "@types/strip-bom": "3.0.0",
+        "@types/strip-json-comments": "0.0.30",
+        "strip-bom": "3.0.0",
+        "strip-json-comments": "2.0.1"
+      },
+      "dependencies": {
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        }
+      }
+    },
+    "tsickle": {
+      "version": "0.27.5",
+      "resolved": "http://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz",
+      "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==",
+      "dev": true,
+      "requires": {
+        "minimist": "1.2.0",
+        "mkdirp": "0.5.1",
+        "source-map": "0.6.1",
+        "source-map-support": "0.5.9"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "1.1.1",
+            "source-map": "0.6.1"
+          }
+        }
+      }
+    },
+    "tslib": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+    },
+    "tslint": {
+      "version": "5.9.1",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz",
+      "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "builtin-modules": "1.1.1",
+        "chalk": "2.4.1",
+        "commander": "2.17.1",
+        "diff": "3.5.0",
+        "glob": "7.1.3",
+        "js-yaml": "3.12.0",
+        "minimatch": "3.0.4",
+        "resolve": "1.8.1",
+        "semver": "5.6.0",
+        "tslib": "1.9.3",
+        "tsutils": "2.29.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.5.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "tsscmp": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+      "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+      "dev": true,
+      "optional": true
+    },
+    "tsutils": {
+      "version": "2.29.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+      "dev": true,
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2"
+      }
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "2.1.21"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typescript": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
+      "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.9",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+      "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+      "dev": true,
+      "requires": {
+        "commander": "2.17.1",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "dev": true,
+      "optional": true
+    },
+    "uglifyjs-webpack-plugin": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
+      "dev": true,
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "schema-utils": "0.4.7",
+        "serialize-javascript": "1.5.0",
+        "source-map": "0.6.1",
+        "uglify-es": "3.3.9",
+        "webpack-sources": "1.3.0",
+        "worker-farm": "1.6.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "uglify-es": {
+          "version": "3.3.9",
+          "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+          "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+          "dev": true,
+          "requires": {
+            "commander": "2.13.0",
+            "source-map": "0.6.1"
+          }
+        }
+      }
+    },
+    "ultron": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+      "dev": true
+    },
+    "underscore": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+      "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "3.1.0",
+        "get-value": "2.0.6",
+        "is-extendable": "0.1.1",
+        "set-value": "0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-extendable": "0.1.1",
+            "is-plain-object": "2.0.4",
+            "to-object-path": "0.3.0"
+          }
+        }
+      }
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
+      "requires": {
+        "unique-slug": "2.0.1"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+      "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "0.3.1",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "2.0.6",
+            "has-values": "0.1.4",
+            "isobject": "2.1.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+      "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+      "dev": true
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "2.1.1"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-loader": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz",
+      "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "mime": "1.6.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
+      "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
+      "dev": true,
+      "requires": {
+        "querystringify": "2.1.0",
+        "requires-port": "1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "useragent": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
+      "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "2.2.4",
+        "tmp": "0.0.33"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
+          "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
+          "dev": true
+        }
+      }
+    },
+    "util": {
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "dev": true
+    },
+    "uws": {
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
+      "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
+      "dev": true,
+      "optional": true
+    },
+    "v8flags": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz",
+      "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "1.0.1"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "3.0.2",
+        "spdx-expression-parse": "3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "vlq": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+      "dev": true
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+      "dev": true
+    },
+    "watchpack": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
+      "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
+      "dev": true,
+      "requires": {
+        "chokidar": "2.0.4",
+        "graceful-fs": "4.1.11",
+        "neo-async": "2.6.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.10",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "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.3",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "chokidar": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+          "dev": true,
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.2",
+            "fsevents": "1.2.4",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "lodash.debounce": "4.0.8",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.2.1",
+            "upath": "1.1.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "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.1"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "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.1"
+              }
+            }
+          }
+        },
+        "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.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "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.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.2",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.13",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        }
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "webdriver-js-extender": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz",
+      "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=",
+      "dev": true,
+      "requires": {
+        "@types/selenium-webdriver": "2.53.43",
+        "selenium-webdriver": "2.53.3"
+      },
+      "dependencies": {
+        "adm-zip": {
+          "version": "0.4.4",
+          "resolved": "http://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
+          "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=",
+          "dev": true
+        },
+        "sax": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
+          "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=",
+          "dev": true
+        },
+        "selenium-webdriver": {
+          "version": "2.53.3",
+          "resolved": "http://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz",
+          "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=",
+          "dev": true,
+          "requires": {
+            "adm-zip": "0.4.4",
+            "rimraf": "2.6.2",
+            "tmp": "0.0.24",
+            "ws": "1.1.5",
+            "xml2js": "0.4.4"
+          }
+        },
+        "tmp": {
+          "version": "0.0.24",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
+          "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
+          "dev": true
+        },
+        "ultron": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+          "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+          "dev": true
+        },
+        "ws": {
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
+          "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+          "dev": true,
+          "requires": {
+            "options": "0.0.6",
+            "ultron": "1.0.2"
+          }
+        },
+        "xml2js": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
+          "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
+          "dev": true,
+          "requires": {
+            "sax": "0.6.1",
+            "xmlbuilder": "9.0.7"
+          }
+        }
+      }
+    },
+    "webpack": {
+      "version": "3.11.0",
+      "resolved": "http://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz",
+      "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==",
+      "dev": true,
+      "requires": {
+        "acorn": "5.7.3",
+        "acorn-dynamic-import": "2.0.2",
+        "ajv": "6.5.4",
+        "ajv-keywords": "3.2.0",
+        "async": "2.6.1",
+        "enhanced-resolve": "3.4.1",
+        "escope": "3.6.0",
+        "interpret": "1.1.0",
+        "json-loader": "0.5.7",
+        "json5": "0.5.1",
+        "loader-runner": "2.3.1",
+        "loader-utils": "1.1.0",
+        "memory-fs": "0.4.1",
+        "mkdirp": "0.5.1",
+        "node-libs-browser": "2.1.0",
+        "source-map": "0.5.7",
+        "supports-color": "4.5.0",
+        "tapable": "0.2.8",
+        "uglifyjs-webpack-plugin": "0.4.6",
+        "watchpack": "1.6.0",
+        "webpack-sources": "1.3.0",
+        "yargs": "8.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+          "dev": true,
+          "requires": {
+            "center-align": "0.1.3",
+            "right-align": "0.1.3",
+            "wordwrap": "0.0.2"
+          }
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "2.2.0",
+            "pify": "2.3.0",
+            "strip-bom": "3.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+          "dev": true,
+          "requires": {
+            "execa": "0.7.0",
+            "lcid": "1.0.0",
+            "mem": "1.1.0"
+          }
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "2.3.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "2.0.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "2.1.0",
+            "read-pkg": "2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          },
+          "dependencies": {
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "3.0.0"
+              }
+            }
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-to-browserify": "1.0.2",
+            "yargs": "3.10.0"
+          },
+          "dependencies": {
+            "yargs": {
+              "version": "3.10.0",
+              "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+              "dev": true,
+              "requires": {
+                "camelcase": "1.2.1",
+                "cliui": "2.1.0",
+                "decamelize": "1.2.0",
+                "window-size": "0.1.0"
+              }
+            }
+          }
+        },
+        "uglifyjs-webpack-plugin": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+          "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-js": "2.8.29",
+            "webpack-sources": "1.3.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+          "dev": true,
+          "requires": {
+            "camelcase": "4.1.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.3",
+            "os-locale": "2.1.0",
+            "read-pkg-up": "2.0.0",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "2.1.1",
+            "which-module": "2.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "7.0.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+              "dev": true
+            },
+            "cliui": {
+              "version": "3.2.0",
+              "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+              "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+              "dev": true,
+              "requires": {
+                "string-width": "1.0.2",
+                "strip-ansi": "3.0.1",
+                "wrap-ansi": "2.1.0"
+              },
+              "dependencies": {
+                "string-width": {
+                  "version": "1.0.2",
+                  "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                  "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                  "dev": true,
+                  "requires": {
+                    "code-point-at": "1.1.0",
+                    "is-fullwidth-code-point": "1.0.0",
+                    "strip-ansi": "3.0.1"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "dev": true,
+          "requires": {
+            "camelcase": "4.1.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+      "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "0.4.1",
+        "mime": "1.6.0",
+        "path-is-absolute": "1.0.1",
+        "range-parser": "1.2.0",
+        "time-stamp": "2.1.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz",
+      "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "array-includes": "3.0.3",
+        "bonjour": "3.5.0",
+        "chokidar": "2.0.4",
+        "compression": "1.7.3",
+        "connect-history-api-fallback": "1.5.0",
+        "debug": "3.2.6",
+        "del": "3.0.0",
+        "express": "4.16.4",
+        "html-entities": "1.2.1",
+        "http-proxy-middleware": "0.17.4",
+        "import-local": "1.0.0",
+        "internal-ip": "1.2.0",
+        "ip": "1.1.5",
+        "killable": "1.0.1",
+        "loglevel": "1.6.1",
+        "opn": "5.1.0",
+        "portfinder": "1.0.18",
+        "selfsigned": "1.10.4",
+        "serve-index": "1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.1.5",
+        "spdy": "3.4.7",
+        "strip-ansi": "3.0.1",
+        "supports-color": "5.5.0",
+        "webpack-dev-middleware": "1.12.2",
+        "yargs": "6.6.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.10",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "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.3",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+          "dev": true,
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.2",
+            "fsevents": "1.2.4",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "lodash.debounce": "4.0.8",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.2.1",
+            "upath": "1.1.0"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.1"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+              "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+              "dev": true
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "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"
+              }
+            },
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "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.1"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "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.1"
+              }
+            }
+          }
+        },
+        "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.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "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.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.2",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.13",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "6.6.0",
+          "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+          "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.3",
+            "os-locale": "1.4.0",
+            "read-pkg-up": "1.0.1",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "1.0.2",
+            "which-module": "1.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "4.2.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "4.2.1",
+          "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0"
+          }
+        }
+      }
+    },
+    "webpack-merge": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz",
+      "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.11"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+      "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+      "dev": true,
+      "requires": {
+        "source-list-map": "2.0.1",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-subresource-integrity": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.2.0.tgz",
+      "integrity": "sha512-bdMR4DRbINUFt+QhNfBFHURnCzT8mtHjXiclQWX/aXBpu2pM4nOb2qViyt84ZSFrVKEXkAbmz7mSoZQH/08xFg==",
+      "dev": true,
+      "requires": {
+        "webpack-sources": "1.3.0"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": "0.5.0",
+        "websocket-extensions": "0.1.3"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "when": {
+      "version": "3.6.4",
+      "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
+      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2"
+      }
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+      "dev": true
+    },
+    "with-callback": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz",
+      "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=",
+      "dev": true,
+      "optional": true
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+      "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "ws": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+      "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "1.0.0",
+        "safe-buffer": "5.1.2",
+        "ultron": "1.1.1"
+      }
+    },
+    "xml2js": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+      "dev": true,
+      "requires": {
+        "sax": "1.2.4",
+        "xmlbuilder": "9.0.7"
+      },
+      "dependencies": {
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+          "dev": true
+        }
+      }
+    },
+    "xmlbuilder": {
+      "version": "9.0.7",
+      "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+      "dev": true
+    },
+    "xmlhttprequest-ssl": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+      "dev": true
+    },
+    "xregexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
+      "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
+      "dev": true,
+      "optional": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    },
+    "xxhashjs": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
+      "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==",
+      "dev": true,
+      "requires": {
+        "cuint": "0.2.2"
+      }
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "3.0.0",
+        "cliui": "3.2.0",
+        "decamelize": "1.2.0",
+        "get-caller-file": "1.0.3",
+        "os-locale": "1.4.0",
+        "read-pkg-up": "1.0.1",
+        "require-directory": "2.1.1",
+        "require-main-filename": "1.0.1",
+        "set-blocking": "2.0.0",
+        "string-width": "1.0.2",
+        "which-module": "1.0.0",
+        "y18n": "3.2.1",
+        "yargs-parser": "5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "dev": true
+    },
+    "yn": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+      "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
+      "dev": true
+    },
+    "zone.js": {
+      "version": "0.8.26",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
+      "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
+    },
+    "zrender": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.0.4.tgz",
+      "integrity": "sha512-03Vd/BDl/cPXp8E61f5+Xbgr/a4vDyFA+uUtUc1s+5KgcPbyY2m+78R/9LQwkR6QwFYHG8qk25Q8ESGs/qpkZw=="
+    }
+  }
+}
diff --git a/usecaseui-portal/package.json b/usecaseui-portal/package.json
new file mode 100644 (file)
index 0000000..845a9e9
--- /dev/null
@@ -0,0 +1,55 @@
+{
+  "name": "usecase-ui",
+  "version": "0.0.0",
+  "license": "MIT",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build --prod --aot",
+    "test": "ng test",
+    "lint": "ng lint",
+    "e2e": "ng e2e"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^5.2.0",
+    "@angular/common": "^5.2.0",
+    "@angular/compiler": "^5.2.0",
+    "@angular/core": "^5.2.0",
+    "@angular/forms": "^5.2.0",
+    "@angular/http": "^5.2.0",
+    "@angular/platform-browser": "^5.2.0",
+    "@angular/platform-browser-dynamic": "^5.2.0",
+    "@angular/router": "^5.2.0",
+    "@ngx-translate/core": "^9.1.1",
+    "@ngx-translate/http-loader": "^2.0.1",
+    "core-js": "^2.4.1",
+    "d3": "^3.5.17",
+    "echarts": "^4.1.0",
+    "jquery": "^3.3.1",
+    "ng-zorro-antd": "^0.7.1",
+    "ngx-echarts": "^2.2.0",
+    "rxjs": "^5.5.6",
+    "zone.js": "^0.8.19"
+  },
+  "devDependencies": {
+    "@angular/cli": "~1.7.4",
+    "@angular/compiler-cli": "^5.2.0",
+    "@angular/language-service": "^5.2.0",
+    "@types/jasmine": "~2.8.3",
+    "@types/jasminewd2": "~2.0.2",
+    "@types/node": "~6.0.60",
+    "codelyzer": "^4.0.1",
+    "jasmine-core": "~2.8.0",
+    "jasmine-spec-reporter": "~4.2.1",
+    "karma": "~2.0.0",
+    "karma-chrome-launcher": "~2.2.0",
+    "karma-coverage-istanbul-reporter": "^1.2.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "^0.2.2",
+    "protractor": "~5.1.2",
+    "ts-node": "~4.1.0",
+    "tslint": "~5.9.1",
+    "typescript": "~2.5.3"
+  }
+}
diff --git a/usecaseui-portal/pom.xml b/usecaseui-portal/pom.xml
new file mode 100644 (file)
index 0000000..71a4d24
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>org.onap.usecase-ui</groupId>
+    <artifactId>usecase-ui</artifactId>
+    <version>1.2.0-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>usecaseui-portal</artifactId>
+  <packaging>pom</packaging>
+  <name>usecase-ui</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-clean-plugin</artifactId>
+        <version>3.1.0</version>
+        <executions>
+          <execution>
+            <id>clean dist folder</id>
+            <phase>clean</phase>
+            <goals>
+              <goal>clean</goal>
+            </goals>
+            <configuration>
+              <filesets>
+                <fileset>
+                  <directory>${project.basedir}/dist</directory>
+                </fileset>
+              </filesets>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>com.github.eirslett</groupId>
+        <artifactId>frontend-maven-plugin</artifactId>
+        <version>1.6</version>
+        <configuration>
+          <installDirectory>${project.basedir}</installDirectory>
+        </configuration>
+        <executions>
+          <execution>
+            <id>install node and npm</id>
+            <goals>
+              <goal>install-node-and-npm</goal>
+            </goals>
+            <configuration>
+              <nodeVersion>v8.11.4</nodeVersion>
+              <npmVersion>5.6.0</npmVersion>
+            </configuration>
+          </execution>
+
+          <execution>
+            <id>npm set progress off</id>
+            <goals>
+              <goal>npm</goal>
+            </goals>
+            <configuration>
+              <arguments>set progress=false</arguments>
+            </configuration>
+          </execution>
+
+          <execution>
+            <id>npm install</id>
+            <goals>
+              <goal>npm</goal>
+            </goals>
+            <configuration>
+              <arguments>install</arguments>
+            </configuration>
+          </execution>
+
+          <execution>
+            <id>npm run src build</id>
+            <goals>
+              <goal>npm</goal>
+            </goals>
+            <configuration>
+              <arguments>run build</arguments>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/usecaseui-portal/src/app/alarm/alarm.component.css b/usecaseui-portal/src/app/alarm/alarm.component.css
new file mode 100644 (file)
index 0000000..757a55b
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.select .query_criteria span {
+  display: inline-block;
+  font: 700 14px "Arial";
+  color: #4c5e70;
+}
+.select .query_criteria nz-dropdown {
+  vertical-align: middle;
+}
+.select .query_criteria nz-dropdown :hover {
+  border-color: #147dc2;
+}
+.select .query_criteria nz-dropdown button {
+  width: 165px;
+  height: 30px;
+  background-color: #eceff4;
+  text-align: left;
+  border-color: #9fa9ab;
+}
+.select .query_criteria nz-dropdown button span {
+  font-weight: 400;
+  display: inline-block;
+  width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding-top: 2px;
+}
+.select .query_criteria nz-dropdown button i {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+}
+.select .query_criteria .search {
+  margin-left: 20px;
+  height: 30px;
+  padding: 0 10px;
+}
+.select .query_criteria .search span {
+  color: #fff;
+  font-weight: 400;
+}
+::ng-deep .vertical-center-modal {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+::ng-deep .vertical-center-modal .ant-modal {
+  top: 0;
+}
+.content {
+  clear: both;
+  padding-top: 20px;
+}
+.content .title {
+  border-radius: 5px 5px 5px 5px;
+  background-color: #fff;
+  height: 106px;
+  border-bottom: 1px solid #f0f0f0;
+  margin-bottom: 20px;
+  clear: both;
+}
+.content .title ul {
+  display: flex;
+  display: -webkit-flex;
+  justify-content: space-around;
+  align-items: center;
+  padding: 0;
+  margin: 0;
+  height: 100%;
+  width: 70%;
+  float: left;
+}
+.content .title ul li {
+  list-style: none;
+  padding-left: 32px;
+  width: 100%;
+  border-left: 1px solid #eceff4;
+}
+.content .title ul li h5 {
+  font: 500 14px "Arial";
+  color: #3d4d65;
+}
+.content .title ul li p {
+  font: 500 24px "Arial";
+  color: #3fa8eb;
+  margin-bottom: 0;
+}
+.content .title ul li:nth-child(1) {
+  border: none;
+}
+.content .title .thumbnail {
+  width: 25%;
+  height: 90px;
+  float: left;
+  margin-top: 8px;
+}
+.content .tablelist {
+  background-color: #fff;
+  padding: 24px 10px 0px;
+  border-radius: 0 0 5px 5px;
+}
+.content .tablelist .action {
+  padding: 10px 0 0 20px;
+}
+.content .tablelist .action .details {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  background: url(../../assets/images/icon.png) center -113px;
+}
+.content .tablelist .action .details:hover {
+  background: url(../../assets/images/icon.png) no-repeat center -128px;
+}
diff --git a/usecaseui-portal/src/app/alarm/alarm.component.html b/usecaseui-portal/src/app/alarm/alarm.component.html
new file mode 100644 (file)
index 0000000..8f95de3
--- /dev/null
@@ -0,0 +1,113 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> <span (click)="detailHide()" style="cursor:pointer;">Alarm</span> <span *ngIf="detailshow">>
+        Details</span> </h3>
+<hr>
+<div class="select" [@showHideAnimate]="state">
+    <div class="query_criteria">
+        <span>Source Name: </span>
+        <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+            <button nz-button nz-dropdown><span>{{sourceNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+            <ul nz-menu>
+                <li nz-menu-item (click)="choseSourceName(item)" *ngFor="let item of sourceNameList">
+                    <a>{{item.name}}</a>
+                </li>
+            </ul>
+        </nz-dropdown>
+        &nbsp;&nbsp;
+        <span>Priority: </span>
+        <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+            <button nz-button nz-dropdown><span>{{prioritySelected}}</span> <i class="anticon anticon-down"></i></button>
+            <ul nz-menu>
+                <li nz-menu-item (click)="chosePriority(item)" *ngFor="let item of priorityList">
+                    <a>{{item}}</a>
+                </li>
+            </ul>
+        </nz-dropdown>
+        &nbsp;&nbsp;
+        <span>Status: </span>
+        <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+            <button nz-button nz-dropdown><span>{{statusSelected}}</span> <i class="anticon anticon-down"></i></button>
+            <ul nz-menu>
+                <li nz-menu-item (click)="choseStatus(item)" *ngFor="let item of statusList">
+                    <a>{{item}}</a>
+                </li>
+            </ul>
+        </nz-dropdown>
+        <br> <br>
+        <span>Report Time: </span>
+        <nz-range-picker [(ngModel)]="dateRange" (ngModelChange)="onChange($event)" nzShowTime></nz-range-picker>
+
+        <button class="search" nz-button [nzType]="'primary'" (click)="getAlarmFormData()"><i class="anticon anticon-search"></i><span>Search</span></button>
+    </div>
+</div>
+<nz-modal nzWrapClassName="vertical-center-modal" [(nzVisible)]="isVisibleMiddle" nzTitle="Alarm Chart" (nzOnCancel)="handleCancelMiddle()"
+    (nzOnOk)="handleOkMiddle()">
+    <app-line [initData]="alarmChartInitBig" [chartData]="alarmChartDataBig"></app-line>
+</nz-modal>
+<div class="content" [@showHideAnimate]="state">
+    <div class="title">
+        <ul>
+            <li>
+                <h5>All</h5>
+                <p>{{alarmList.all }}</p>
+            </li>
+            <li>
+                <h5>Closed</h5>
+                <p>{{alarmList.closed }}</p>
+            </li>
+            <li>
+                <h5>Action</h5>
+                <p>{{alarmList.Action }}</p>
+            </li>
+        </ul>
+        <div class="thumbnail" (click)="showModalMiddle()">
+            <app-line [initData]="alarmChartInit" [chartData]="alarmChartData"></app-line>
+        </div>
+    </div>
+    <div class="tablelist">
+        <nz-table #nzTable [nzData]="dataSet" [nzPageSize]="10" nzShowSizeChanger nzShowQuickJumper [nzPageSizeOptions]="[5,10,15,20]"
+            nzSize="middle">
+            <thead (nzSortChange)="sort($event)" nzSingleSort>
+                <tr>
+                    <th nzWidth="5%">NO</th>
+                    <th nzWidth="20%">Source Name</th>
+                    <th nzWidth="10%">Priority</th>
+                    <th nzWidth="20%">SpecificProblem</th>
+                    <th nzWidth="20%">Report Time</th>
+                    <th nzWidth="15%">Status</th>
+                    <th nzWidth="10%">Action</th>
+                </tr>
+            </thead>
+            <tbody>
+                <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+                <tr *ngFor="let item of list; let i = index; ">
+                    <td>{{i+1}}</td>
+                    <td>{{item.name}}</td>
+                    <td>{{item.age}}</td>
+                    <td>{{item.address}}</td>
+                    <td>{{item.address}}</td>
+                    <td>{{item.address}}</td>
+                    <td class="action"><a (click)="detailShow()"><i class="details"></i></a></td>
+                </tr>
+                <!-- </ng-template> -->
+            </tbody>
+        </nz-table>
+    </div>
+</div>
+<div [@showHideAnimate]="state2">
+    <app-details></app-details>
+</div>
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/alarm/alarm.component.less b/usecaseui-portal/src/app/alarm/alarm.component.less
new file mode 100644 (file)
index 0000000..2d05c70
--- /dev/null
@@ -0,0 +1,132 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.select {
+    .query_criteria {
+        span {
+            display: inline-block;
+            font: 700 14px "Arial";
+            color: #4c5e70;
+        }
+        nz-dropdown {
+            vertical-align: middle;
+            :hover{
+                border-color: #147dc2;
+            }
+            button {
+                width: 165px;
+                height: 30px;
+                background-color: #eceff4;
+                text-align: left;
+                border-color: #9fa9ab;
+                span {
+                    font-weight: 400;
+                    display: inline-block;
+                    width: 120px;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    padding-top: 2px;
+                }
+                i {
+                    position: absolute;
+                    top: 10px;
+                    right: 10px;
+                }
+            }
+            //下拉框中的样式在style.less中,下拉框是在body中额外临时生成的
+        }
+        .search {
+            margin-left: 20px;       
+            height: 30px;
+            padding: 0 10px;
+            span {
+                color: #fff;
+                font-weight: 400;
+            }
+        }
+    }
+   
+}
+// model style
+
+::ng-deep .vertical-center-modal {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+::ng-deep .vertical-center-modal .ant-modal {
+    top: 0;
+}
+
+.content {
+    clear: both;
+    padding-top: 20px;
+    .title {
+        border-radius: 5px 5px 5px 5px;
+        background-color: #fff;
+        height: 106px;
+        border-bottom: 1px solid #f0f0f0;
+        margin-bottom: 20px;
+        clear: both;
+        ul {
+            display: flex;
+            display: -webkit-flex; 
+            justify-content: space-around;
+            align-items: center;
+            padding: 0;
+            margin: 0;
+            height: 100%;
+            width: 70%;
+            float: left;
+            li {
+                list-style: none;
+                padding-left: 32px;
+                width: 100%;
+                border-left: 1px solid #eceff4;
+                h5 {
+                    font: 500 14px "Arial";
+                    color: #3d4d65;
+                }
+                p {
+                    font: 500 24px "Arial";
+                    color: #3fa8eb;
+                    margin-bottom: 0;
+                }
+            }
+            li:nth-child(1){
+                border: none;
+            }
+        }
+        .thumbnail {
+            width: 25%;
+            height: 90px;
+            float: left;
+            margin-top: 8px;
+        }
+    }
+    .tablelist {
+        background-color: #fff;
+        padding: 24px 10px 0px;
+        border-radius: 0 0 5px 5px;
+        .action{
+            padding: 10px 0 0 20px;
+            .details{
+                display: inline-block;
+                width: 16px;
+                height: 16px;
+                background: url(../../assets/images/icon.png) center -113px;
+                &:hover {
+                    background: url(../../assets/images/icon.png) no-repeat center -128px;
+                }
+            }
+        }
+    }
+}
diff --git a/usecaseui-portal/src/app/alarm/alarm.component.spec.ts b/usecaseui-portal/src/app/alarm/alarm.component.spec.ts
new file mode 100644 (file)
index 0000000..c7f5a73
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AlarmComponent } from './alarm.component';
+
+describe('AlarmComponent', () => {
+  let component: AlarmComponent;
+  let fixture: ComponentFixture<AlarmComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ AlarmComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(AlarmComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/alarm/alarm.component.ts b/usecaseui-portal/src/app/alarm/alarm.component.ts
new file mode 100644 (file)
index 0000000..72dd518
--- /dev/null
@@ -0,0 +1,380 @@
+import { Component, OnInit, Input, Output, EventEmitter, HostBinding } from '@angular/core';
+import { MyhttpService } from '../myhttp.service';
+import * as addDays from 'date-fns/add_days';
+import { showHideAnimate, slideToRight } from '../animates';
+
+@Component({
+  selector: 'app-alarm',
+  templateUrl: './alarm.component.html',
+  styleUrls: ['./alarm.component.less'],
+  animations: [
+    showHideAnimate, slideToRight
+  ]
+})
+export class AlarmComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState; //路由动画
+  public pageNumber:number=1;
+  public pageSize:number=5;
+  public name:string='';
+  public Priority:string ='';
+  public Status:string ='';
+  public Report:string ='';
+  list: any;
+
+
+  constructor(
+    private myhttp:MyhttpService) { }
+  isVisibleMiddle = false;
+
+  showModalMiddle(): void {
+    this.isVisibleMiddle = true;
+  }
+  handleOkMiddle(): void {
+    console.log('click ok');
+    this.isVisibleMiddle = false;
+  }
+  handleCancelMiddle(): void {
+    this.isVisibleMiddle = false;
+  }
+  ngOnInit() {
+    this.getAlarmFormData();
+  }
+
+  // 筛选框(下拉框)
+  // sourceNameList = ['aaaa','bbbb','cccc','dddddDDDDDDDDDDDDDDD'];
+  sourceNameList=[
+    {key:null,name:'请选择'},
+    {key:1,name:'aaaa'},
+    {key:2,name:'bbbb'},
+    {key:3,name:'cccc'},
+    {key:4,name:'dddddDDDDDDDDDDDDDDD'}
+  ]
+  sourceNameSelected = this.sourceNameList[0].name;
+  priorityList = ['aaaa','bbbb','cccc','ddddd'];
+  prioritySelected = this.priorityList[0];
+  statusList = ['aaaa','bbbb','cccc','ddddd'];
+  statusSelected = this.statusList[0];
+  choseSourceName(item){
+    console.log(item,'item1');
+    this.sourceNameSelected = item;
+  }
+  chosePriority(item){
+    console.log(item);
+    this.prioritySelected = item;
+  }
+  choseStatus(item){
+    console.log(item);
+    this.statusSelected = item;
+  }
+
+  // 日期筛选
+  dateRange =  [ addDays(new Date(), -30), new Date() ];
+
+  onChange(result: Date): void {
+    console.log('onChange: ', result);
+  }
+  // search(){
+  //   this.myhttp.getAlarmFormData().subscribe
+
+  // }
+  sort(e){
+
+  }
+  // 数量统计
+  alarmList = {
+    all:22439,
+    closed:37923,
+    Action: 12342
+  }
+
+  //折线图縮略圖
+  alarmChartData:Object;
+  alarmChartInit:Object = {
+    height:100,
+    width:290,
+    option:{
+      tooltip : {
+        show : false,
+        trigger: 'axis',
+      },
+      legend: {
+        show :false,
+        bottom: '0px',
+        data: ['All', 'Active', 'Closed']
+      },
+      series: [
+        {
+            name: 'All',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_one
+            data: [40, 45, 38, 52, 64, 58, 69, 87, 76, 33, 64, 87, 45, 76, 88, 56, 33, 76, 45, 65],
+            itemStyle: {
+              color: "#526b75"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        },
+        {
+            name: 'Active',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_two
+            data: [32, 43, 23, 45, 63, 24, 54, 22, 32, 42, 42, 22, 23, 43, 32, 34, 42, 33, 42, 12],
+            itemStyle: {
+              color: "#fb6e6e"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        },
+        {
+            name: 'Closed',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_two
+            data: [12, 23, 13, 25, 33, 14, 34, 12, 12, 22, 12, 12, 13, 23, 12, 24, 22, 13, 22, 5],
+            itemStyle: {
+              color: "#3fa8eb"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        }
+      ]
+    }
+  };
+  getAlarmChartData(){
+    let paramsObj = {
+      alarmSourceName:this.sourceNameSelected
+    }
+    this.myhttp.getHomePerformanceChartData(paramsObj)
+      .subscribe((data)=>{
+        this.alarmChartData = {
+          series:[
+            {data:data.CPU},
+            {data:data.CPU},
+            {data:data.Memory}
+          ]
+        }
+      },(err)=>{
+        console.log(err);
+      })
+  }
+  //折线图放大圖 
+  alarmChartDataBig:Object;
+  alarmChartInitBig:Object = {
+    height:240,
+    width:500,
+    option:{
+      tooltip : {
+        show : true,
+        trigger: 'axis',
+      },
+      legend: {
+        show :true,
+        bottom: '0px',
+        data: ['All', 'Active', 'Closed']
+      },
+      series: [
+        {
+            name: 'All',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_one
+            data: [40, 45, 38, 52, 64, 58, 69, 87, 76, 33, 64, 87, 45, 76, 88, 56, 33, 76, 45, 65],
+            itemStyle: {
+              color: "#526b75"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        },
+        {
+            name: 'Active',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_two
+            data: [32, 43, 23, 45, 63, 24, 54, 22, 32, 42, 42, 22, 23, 43, 32, 34, 42, 33, 42, 12],
+            itemStyle: {
+              color: "#fb6e6e"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        },
+        {
+            name: 'Closed',
+            type: 'line',
+            smooth: true,//将图变得平缓
+            showSymbol: false,
+            areaStyle: {
+              opacity: 0.8
+            },
+            //timeframe_two
+            data: [12, 23, 13, 25, 33, 14, 34, 12, 12, 22, 12, 12, 13, 23, 12, 24, 22, 13, 22, 5],
+            itemStyle: {
+              color: "#3fa8eb"
+            },
+            lineStyle: {
+              width: 1,
+              opacity: 0.5
+            }
+        }
+      ]
+    }
+  };
+  //表格数据
+  dataSet = [
+    {
+      name       : 'John Brown',
+      age        : 32,
+      expand     : false,
+      address    : 'New York No. 1',
+      description: 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.'
+    },
+    {
+      name       : 'Aim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Xim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'aoe Black',
+      age        : 32,
+      expand     : false,
+      address    : 'Sidney No. 1',
+      description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.'
+    }
+  ];
+
+  //详情页标题显示
+  detailshow = false;
+  // 显示隐藏动画
+  state = "show";
+  state2 = "hide";
+  detailShow() {
+    this.state = 'hide';
+    this.state2 = 'show';
+    this.detailshow = true;
+  }
+  detailHide() {
+    this.state = 'show';
+    this.state2 = 'hide';
+    this.detailshow = false;
+  }
+  getSelects:Object = {
+    countAll:0,
+    countClose:0,
+    countActive:0,
+    eventNameList:[],
+    sourceIdList:[],
+    reportingEntityNameList:[],
+    sourceNameList:[],
+};
+  getAlarmFormData(){
+    this.myhttp.getAlarmFormData(this.pageNumber,this.pageSize,this.name,this.Priority,this.Status,this.Report).subscribe((data)=>{
+      if(data.retCode ==200){
+        this.list = data.list;
+      }
+      console.log(data,'data');
+    })
+  }
+}
diff --git a/usecaseui-portal/src/app/animates.ts b/usecaseui-portal/src/app/animates.ts
new file mode 100644 (file)
index 0000000..cde7e56
--- /dev/null
@@ -0,0 +1,42 @@
+import { trigger, state, style, animate, transition } from '@angular/animations';
+
+// 路由动画
+export const slideToRight = trigger('routerAnimate', [
+    // 定义void表示空状态下
+    state('void', style({ position:'fixed', zIndex:'-1' })), //不明白为啥要加定位出场动画才生效
+    // * 表示任何状态
+    state('*', style({ })),
+    // 进场动画
+    transition(':enter', [
+        style({transform: 'translateX(-100%)'}),
+        animate('.5s ease-in-out')
+    ]),
+    // 出场动画
+    transition(':leave', [
+        animate('.5s ease-in-out',  style({transform: 'translateX(100%)'}) )
+    ])
+]);
+// 详情页显示隐藏动画
+export const showHideAnimate = trigger('showHideAnimate', [
+    state('show', style({
+      transform: 'scale(1)',
+      display:'block',
+    })),
+    state('hide', style({
+      transform: 'scale(0)',
+      display:'none'
+    })),
+    transition('show => hide', animate('300ms ease-in')),
+    transition('hide => show', animate('300ms ease-out'))
+]);
+// 详情页显示隐藏动画
+export const slideUpDown = trigger('slideUpDown', [
+    state('down', style({
+        height: "*"
+    })),
+    state('up', style({
+        height: "0"
+    })),
+    transition('down => up', animate('300ms ease-in')),
+    transition('up => down', animate('300ms ease-out'))
+]);
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/app-routing.module.ts b/usecaseui-portal/src/app/app-routing.module.ts
new file mode 100644 (file)
index 0000000..7fe7361
--- /dev/null
@@ -0,0 +1,41 @@
+import { NgModule }             from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+
+import { HomeComponent }        from './home/home.component';
+import { ServicesComponent }    from './services/services.component';
+import { ServicesListComponent }    from './services/services-list/services-list.component';
+import { OnboardVnfVmComponent } from './services/onboard-vnf-vm/onboard-vnf-vm.component';
+import { AlarmComponent }       from './alarm/alarm.component';
+import { PerformanceComponent } from './performance/performance.component';
+import { PerformanceVnfComponent } from './performance/performance-vnf/performance-vnf.component';
+import { PerformanceVmComponent } from './performance/performance-vm/performance-vm.component';
+
+import { CcvpnNetworkComponent } from './ccvpn-network/ccvpn-network.component';
+
+// import { DetailsComponent } from './details/details.component';
+
+const ServicesChildRoutes: Routes = [
+  { path: 'services-list', component: ServicesListComponent},
+  { path: 'onboard-vnf-vm', component: OnboardVnfVmComponent},
+  { path: '**', redirectTo: 'services-list' }
+]
+
+const routes: Routes = [
+  { path: 'home', component: HomeComponent},
+  // { path: 'services', component: ServicesComponent, children:ServicesChildRoutes}, //暂时不是子路由结构
+  { path: 'services/services-list', component: ServicesListComponent},
+  { path: 'services/onboard-vnf-vm', component: OnboardVnfVmComponent},
+  { path: 'alarm', component: AlarmComponent},
+  { path: 'performance', component: PerformanceComponent},
+  { path: 'performance/performance-vnf', component: PerformanceVnfComponent},
+  { path: 'performance/performance-vm', component: PerformanceVmComponent},
+  { path: 'network', component: CcvpnNetworkComponent },
+  { path: '**', redirectTo: 'home', pathMatch: 'full'}
+];
+
+@NgModule({
+  imports: [ RouterModule.forRoot(routes) ],
+  exports: [ RouterModule ]
+})
+export class AppRoutingModule {}
diff --git a/usecaseui-portal/src/app/app.component.css b/usecaseui-portal/src/app/app.component.css
new file mode 100644 (file)
index 0000000..f25d326
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+nz-layout nz-sider ul li {
+  margin: 0;
+  font-size: 16px;
+}
+nz-layout nz-sider ul li span {
+  font-size: 16px;
+}
+nz-layout nz-sider ul li i {
+  width: 16px;
+  height: 16px;
+}
+nz-layout nz-sider ul li .icon-services {
+  background: url(../assets/images/icon.png) no-repeat 0px -16px;
+}
+nz-layout nz-sider ul li ul li {
+  font-size: 12px;
+}
+nz-layout nz-sider ul hr {
+  margin: 0 auto;
+  background-color: #39434f;
+  height: 1px;
+  border: none;
+  width: 80%;
+}
diff --git a/usecaseui-portal/src/app/app.component.html b/usecaseui-portal/src/app/app.component.html
new file mode 100644 (file)
index 0000000..8e189e7
--- /dev/null
@@ -0,0 +1,80 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<nz-layout>
+  <nz-sider nzWidth='260' style="overflow: auto; height: 100vh; position: fixed; left: 0">
+    <ul nz-menu [nzTheme]="'dark'" [nzMode]="'inline'" style="width: 260px;">
+      <li nz-menu-item nzSelected> 
+        <a routerLink="home">
+          <span title>
+            <i class="anticon anticon-home"></i>
+            <span> {{"Home" | translate}} </span>
+          </span>
+        </a>
+      </li>
+      <hr>
+      <li nz-submenu>
+        <span title><i class="anticon anticon-home"></i> {{"Services" | translate}} </span>
+        <ul>
+          <li nz-menu-item><a routerLink='services/services-list'> {{"Services List" | translate}}</a></li>
+          <li nz-menu-item><a routerLink='services/onboard-vnf-vm'> Onboard VNF/VM </a></li>
+        </ul>
+      </li>
+      <!-- <hr>
+      <li nz-menu-item>
+        <a routerLink="alarm">
+          <span title>
+            <i class="anticon anticon-mail"></i>
+            <span> {{"Alarm" | translate}} </span>
+          </span>
+        </a>
+      </li>
+      <hr> -->
+      <li nz-submenu>
+        <span title><i class="anticon anticon-setting"></i> {{"Monitor" | translate}} </span>
+        <ul>
+          <li nz-menu-item><a routerLink='alarm'> {{"Alarm" | translate}} </a></li>
+          <li nz-menu-item><a routerLink='performance/performance-vnf'> {{"Performance" | translate}}</a></li>
+        </ul>
+      </li>
+      <hr>
+      <li nz-menu-item>
+        <a routerLink="network">
+          <span title>
+            <i class="anticon anticon-share-alt"></i>
+            <span> {{"Network" | translate}} </span>
+          </span>
+        </a>
+      </li>
+    </ul>
+    <button (click)="changeLanguage('zh')" >{{"zh" | translate}}</button>
+    <button (click)="changeLanguage('en')" >{{"en" | translate}}</button>
+    <select name="Language" id="" [(ngModel)]="selectLanguage" (change)="changeLanguage1()">
+      <option *ngFor="let item of Language"  value="{{item}}">{{item | translate}}</option>
+    </select>
+
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomRight'">
+      <button nz-button nz-dropdown><span>{{selectLanguage | translate}}</span> <i class="anticon anticon-down"></i></button>
+      <ul nz-menu>
+        <li nz-menu-item (click)="changeLanguage2(item)" *ngFor="let item of Language">
+          <a>{{item | translate}}</a>
+        </li>
+      </ul>
+    </nz-dropdown>
+  </nz-sider>
+  <nz-layout style="margin-left: 260px; padding: 20px 32px; height:100vh; position:relative;">
+      <router-outlet></router-outlet>
+  </nz-layout>
+</nz-layout>
diff --git a/usecaseui-portal/src/app/app.component.less b/usecaseui-portal/src/app/app.component.less
new file mode 100644 (file)
index 0000000..a805166
--- /dev/null
@@ -0,0 +1,32 @@
+nz-layout {
+    nz-sider {
+        ul {
+            li {
+                margin: 0;
+                font-size: 16px;
+                span {
+                    font-size: 16px;
+                }
+                i {
+                    width: 16px;
+                    height: 16px;
+                }
+                .icon-services {
+                    background: url(../assets/images/icon.png) no-repeat 0px -16px;
+                }
+                ul {
+                    li{
+                        font-size: 12px;
+                    }
+                }
+            }
+            hr {
+                margin: 0 auto;
+                background-color: #39434f;
+                height: 1px;
+                border: none;
+                width: 80%;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/app.component.spec.ts b/usecaseui-portal/src/app/app.component.spec.ts
new file mode 100644 (file)
index 0000000..bcbdf36
--- /dev/null
@@ -0,0 +1,27 @@
+import { TestBed, async } from '@angular/core/testing';
+import { AppComponent } from './app.component';
+describe('AppComponent', () => {
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        AppComponent
+      ],
+    }).compileComponents();
+  }));
+  it('should create the app', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app).toBeTruthy();
+  }));
+  it(`should have as title 'app'`, async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app.title).toEqual('app');
+  }));
+  it('should render title in a h1 tag', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    fixture.detectChanges();
+    const compiled = fixture.debugElement.nativeElement;
+    expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
+  }));
+});
diff --git a/usecaseui-portal/src/app/app.component.ts b/usecaseui-portal/src/app/app.component.ts
new file mode 100644 (file)
index 0000000..be13c1a
--- /dev/null
@@ -0,0 +1,34 @@
+import { Component } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
+
+
+@Component({
+  selector: 'app-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.less']
+})
+export class AppComponent {
+  constructor(private translate:TranslateService){
+    translate.addLangs(['en', 'zh']);
+    translate.setDefaultLang('en');
+    // translate.use('en');
+  }
+  changeLanguage(Language): void {
+    switch(Language){
+      case 'en':
+        this.translate.use('en');
+        break;
+      case 'zh':
+        this.translate.use('zh');
+    }
+  }
+  // 多语言
+  Language:String[] = ["zh","en"];
+  selectLanguage = "en";
+  changeLanguage1(){
+    this.translate.use(this.selectLanguage);
+  }
+  changeLanguage2(item){
+    this.translate.use(item);
+  }
+}
diff --git a/usecaseui-portal/src/app/app.module.ts b/usecaseui-portal/src/app/app.module.ts
new file mode 100644 (file)
index 0000000..7c24f11
--- /dev/null
@@ -0,0 +1,98 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { HttpClientModule } from '@angular/common/http';
+import { HttpClient } from '@angular/common/http';
+import { NgZorroAntdModule } from 'ng-zorro-antd';
+import { NZ_I18N, en_US } from 'ng-zorro-antd';
+import { NgxEchartsModule } from 'ngx-echarts';
+
+import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
+import {TranslateHttpLoader} from '@ngx-translate/http-loader';
+export function HttpLoaderFactory(httpClient: HttpClient) {
+  return new TranslateHttpLoader(httpClient, '../assets/i18n/', '.json');
+}
+
+import { AppRoutingModule } from './app-routing.module';
+
+//注册语言包
+import { registerLocaleData } from '@angular/common';
+import en from '@angular/common/locales/en';
+registerLocaleData(en);  
+
+//自定义组件
+import { AppComponent } from './app.component';
+import { HomeComponent } from './home/home.component';
+import { ServicesComponent } from './services/services.component';
+import { ServicesListComponent } from './services/services-list/services-list.component';
+import { OnboardVnfVmComponent } from './services/onboard-vnf-vm/onboard-vnf-vm.component';
+import { AlarmComponent } from './alarm/alarm.component';
+import { PerformanceComponent } from './performance/performance.component';
+import { PerformanceVnfComponent } from './performance/performance-vnf/performance-vnf.component';
+import { PerformanceVmComponent } from './performance/performance-vm/performance-vm.component';
+import { CcvpnNetworkComponent } from './ccvpn-network/ccvpn-network.component';
+import { CcvpnDetailComponent } from './ccvpn-detail/ccvpn-detail.component';
+import { CcvpnCreationComponent } from './ccvpn-creation/ccvpn-creation.component';
+
+import { DetailsComponent } from './components/details/details.component';
+import { GraphiclistComponent } from './components/graphiclist/graphiclist.component';
+
+import { BarComponent } from './components/charts/bar/bar.component';
+import { LineComponent } from './components/charts/line/line.component';
+import { PieComponent } from './components/charts/pie/pie.component';
+
+import {PathLocationStrategy, LocationStrategy, HashLocationStrategy} from '@angular/common';
+// 自定义服务
+import { MyhttpService } from './myhttp.service';
+import { networkHttpservice } from './networkHttpservice.service';
+
+@NgModule({
+  providers   : [ 
+    { provide: LocationStrategy, useClass: HashLocationStrategy },
+    { provide: NZ_I18N, useValue: en_US },
+    MyhttpService,
+    networkHttpservice 
+  ],
+  declarations: [
+    AppComponent,
+    HomeComponent,
+
+    ServicesComponent,
+    ServicesListComponent,
+    OnboardVnfVmComponent,
+
+    AlarmComponent,
+    
+    PerformanceComponent,
+    PerformanceVnfComponent,
+    PerformanceVmComponent,
+    DetailsComponent,
+    PieComponent,
+    LineComponent,
+    BarComponent,
+    GraphiclistComponent,
+
+    CcvpnNetworkComponent,
+    CcvpnDetailComponent,
+    CcvpnCreationComponent,
+  ],
+  imports: [
+    BrowserModule,
+    FormsModule,
+    HttpClientModule,
+    TranslateModule.forRoot({
+      loader: {
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [HttpClient]
+      }
+    }),
+    BrowserAnimationsModule,
+    NgZorroAntdModule.forRoot(),
+    NgxEchartsModule,
+    AppRoutingModule
+  ],
+  bootstrap: [ AppComponent ]
+})
+export class AppModule { }
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.css b/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.css
new file mode 100644 (file)
index 0000000..35fdbef
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px;
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 10px;
+}
+.model {
+    background-color: #fff;
+    height: 90%;
+    overflow-y: auto;
+}
+.model .back {
+    position: absolute;
+    top: 10px;
+    right: 20px;
+}
+.model .creation {
+    position: relative;
+    width: 60%;
+    height: 100%;
+    overflow-y: auto;
+    border-radius: 5px;
+    padding: 15px;
+}
+.model .creation h3.title {
+    height: 20px;
+    font: 700 20px/20px "Arial";
+    color: #666;
+}
+.model .creation h3 {
+    height: 20px;
+    font: 700 16px/20px "Arial";
+    margin: 5px 0px;
+    color: #000;
+}
+.model .creation .submit {
+    position: absolute;
+    top: 10px;
+    right: 20px;
+}
+/* SOTN VPN */
+.model .creation .sotnvpn ul li {
+    display: inline-block;
+    height: 35px;
+    width: 49.5%;
+}
+.model .creation .sotnvpn ul li span {
+    display: inline-block;
+    width: 110px;
+    font: 700 14px "Arial";
+    color: #3fa8eb;
+    vertical-align: middle;
+}
+.model .creation .sotnvpn ul li input {
+    width: 165px;
+}
+/* Site List */
+/* addsite model */
+.model .sitemodel {
+    position: absolute;
+    z-index: 10;
+    left: 10px;
+    top: 60px;
+    background-color: #fff;
+    box-shadow: 0px 0px 20px #000;
+    width: 60%;
+    max-height: 90%;
+    border-radius: 5px;
+    overflow-y: auto;
+}
+.model .sitemodel h3 {
+    height: 30px;
+    font: 700 16px/30px "Arial";
+    border-bottom: 1px solid #aaa;
+    padding-left: 10px;
+}
+.model .sitemodel h4 {
+    height: 30px;
+    font: 700 16px/30px "Arial";
+    padding-left: 10px;
+    background-color: #ddd;
+}
+.model .sitemodel .inputs {
+    padding: 10px 20px 0;
+}
+.model .sitemodel .inputs ul li {
+    display: inline-block;
+    height: 35px;
+    width: 49.5%;
+}
+.model .sitemodel .inputs ul li span {
+    display: inline-block;
+    width: 110px;
+    font: 700 14px "Arial";
+    color: #3fa8eb;
+    vertical-align: middle;
+}
+.model .sitemodel .inputs input {
+    width: 165px;
+}
+.model .sitemodel .action {
+    float: left;
+    padding: 10px;
+}
+
+.model nz-table tbody td i.anticon:hover {
+    color: #3fa8eb;
+    cursor: pointer;
+}
+
+/* site table */
+.model .site nz-table tbody td i.anticon:hover {
+    color: #3fa8eb;
+    cursor: pointer;
+}
+/* WAN Port */
+
+/* Site Group List */
+.model .sitegroup .sitegroupmodal {
+    position: absolute;
+    z-index: 10;
+    left: 200px;
+    top: 300px;
+    background-color: #fff;
+    box-shadow: 0px 0px 20px #000;
+    width: 330px;
+    border-radius: 5px;
+}
+.model .sitegroup .sitegroupmodal h3 {
+    height: 30px;
+    font: 700 16px/30px "Arial";
+    border-bottom: 1px solid #aaa;
+    padding-left: 10px;
+}
+.model .sitegroup .sitegroupmodal .inputs {
+    padding: 10px 20px 0;
+}
+.model .sitegroup .sitegroupmodal span {
+    display: inline-block;
+    width: 100px;
+    margin-bottom: 10px;
+}
+.model .sitegroup .sitegroupmodal .inputs input {
+    width: 165px;
+}
+.model .sitegroup .sitegroupmodal .action {
+    float: right;
+    padding: 10px;
+}
+
+
+/* 图 */
+.model .chart {
+    width: 40%;
+    padding: 10px;
+    height: 100%;
+    border-left: 10px solid #f3f3f3;
+}
+.model .chart #createChart {
+    width: 100%;
+    height: 80%;
+    margin-top: 20px;
+    position: relative;
+}
+.model .chart #createChart .siteNameP {
+    position: fixed;
+    border: 5px;
+    padding: 3px 5px;
+    color: #fff;
+    background: #999;
+    box-shadow: 0px 0px 20px #000;
+    max-width: 100px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
diff --git a/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.html b/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.html
new file mode 100644 (file)
index 0000000..1548623
--- /dev/null
@@ -0,0 +1,313 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> Services List </h3>
+<hr>
+<div class="model">
+  <!-- 创建数据 -->
+  <button class="back" nz-button (click)="goback()"><span><i class="anticon anticon-rollback"></i></span></button>
+  <div class="creation fl">
+      <h3 class="title">{{createParams.commonParams.templateType}} Instance Creation</h3>
+      <div class="sotnvpn clearfix">
+        <h3>SOTN VPN Info</h3>
+        <ul>
+          <li><span>Name:</span> <input nz-input [(ngModel)]="sotnInfo.name"></li>
+          <li><span>Description:</span> <input nz-input [(ngModel)]="sotnInfo.description"></li>
+          <li><span>Start Time:</span> 
+            <nz-date-picker [(ngModel)]="sotnInfo.startTime" 
+              (ngModelChange)="startTimeChange($event)"
+              nzPlaceHolder="start time"
+              nzShowTime>
+            </nz-date-picker>
+          </li>
+          <li><span>End Time:</span> 
+            <nz-date-picker [(ngModel)]="sotnInfo.endTime" 
+              (ngModelChange)="endTimeChange($event)"
+              nzPlaceHolder="end time"
+              nzShowTime>
+            </nz-date-picker>
+          </li>
+          <li><span>COS:</span> 
+            <nz-select style="width: 165px;" [(ngModel)]="sotnInfo.COS" nzAllowClear nzPlaceHolder="Choose">
+              <nz-option nzValue="premium" nzLabel="premium"></nz-option>
+              <nz-option nzValue="standard" nzLabel="standard"></nz-option>
+            </nz-select>
+          </li>
+          <li><span>Reroute Enabled:</span> <nz-switch [(ngModel)]="sotnInfo.reroute"></nz-switch> </li>
+          <li><span>Service Level Specification:</span> <input nz-input [(ngModel)]="sotnInfo.SLS"></li>
+          <li><span>Dual Link:</span>
+             <nz-select style="width: 165px;" [(ngModel)]="sotnInfo.dualLink" nzAllowClear nzPlaceHolder="Choose">
+              <nz-option nzValue="no_protection" nzLabel="no_protection"></nz-option>
+              <nz-option nzValue="static_1+1" nzLabel="static_1+1"></nz-option>
+              <nz-option nzValue="permanent_1+1" nzLabel="permanent_1+1"></nz-option>
+            </nz-select> 
+          </li>
+          <li><span>CIR:</span> <input nz-input [(ngModel)]="sotnInfo.CIR"></li>
+          <li><span>EIR:</span> <input nz-input [(ngModel)]="sotnInfo.EIR"></li>
+          <li><span>CBS:</span> <input nz-input [(ngModel)]="sotnInfo.CBS"></li>
+          <li><span>EBS:</span> <input nz-input [(ngModel)]="sotnInfo.EBS"></li>
+          <li><span>Color Aware:</span> <nz-switch [(ngModel)]="sotnInfo.colorAware"></nz-switch> </li>
+          <li><span>Coupling Flag:</span> <nz-switch [(ngModel)]="sotnInfo.couplingFlag"></nz-switch> </li>
+        </ul>
+      </div>
+    
+      <div class="site">
+        <h3>Site List</h3>
+        <button nz-button (click)="addSite()">Add Site</button>
+        <nz-table #siteTable [nzData]="siteTableData"  
+          [nzShowPagination]="false"
+          nzSize="small">
+          <thead>
+            <tr>
+              <th nzWidth="10%"> NO. </th>
+              <th nzWidth="15%"> Name </th>
+              <th nzWidth="15%"> Description </th>
+              <th nzWidth="15%"> Post Code </th>
+              <th nzWidth="15%"> Address </th>
+              <th nzWidth="15%"> VLAN </th>
+              <th nzWidth="15%"> Action </th>
+            </tr>
+          </thead>
+          <tbody>
+              <!-- <ng-template ngFor let-data [ngForOf]="siteTable.data" let-i="index"> -->
+              <tr *ngFor="let item of siteTable.data; let i = index; ">
+                  <td>{{i+1}}</td>
+                  <td>{{item.baseData.name}}</td>
+                  <td>{{item.baseData.description}}</td>
+                  <td>{{item.baseData.postcode}}</td>
+                  <td>{{item.baseData.address}}</td>
+                  <td>{{item.baseData.vlan}}</td>
+                  <td>
+                      <span class="action" (click)="editSite(i+1)"><i class="anticon anticon-edit"></i></span> &nbsp;
+                      <span class="action" (click)="deleteSite(i+1)"><i class="anticon anticon-delete"></i></span>
+                  </td>
+              </tr>
+              <!-- </ng-template> -->
+          </tbody>
+        </nz-table>
+      </div>
+      <div class="sitegroup" *ngIf="createParams.commonParams.templateType == 'CCVPN'">
+        <h3>Site_Group List</h3>
+        <button nz-button (click)="addSiteGroup()">Add Group</button>
+        <div class="sitegroupmodal" *ngIf="siteGroupModelShow">
+          <h3>Site_Group</h3>
+          <div class="inputs">
+            <span>Group Name:</span> <input nz-input [(ngModel)]="siteGroupModelData.name"> <br>
+            <span>Topology:</span>
+            <nz-select style="width: 165px;" [(ngModel)]="siteGroupModelData.topology" nzAllowClear nzPlaceHolder="Choose">
+              <nz-option nzValue="full-mesh" nzLabel="full-mesh"></nz-option>
+              <nz-option nzValue="hub-spoke" nzLabel="hub-spoke"></nz-option>
+            </nz-select>
+            <nz-table #groupModalTable [nzData]="siteGroupModalTableData" [nzLoading]="loading" [nzShowPagination]="false" nzSize="small">
+              <thead>
+                <tr>
+                  <th nzShowCheckbox [(nzChecked)]="allChecked" [nzIndeterminate]="indeterminate"  (nzCheckedChange)="groupModal_checkAll($event)"></th>
+                  <th> Site Name</th>
+                  <th> Role</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr *ngFor="let item of groupModalTable.data; let i = index;">
+                  <td nzShowCheckbox [nzDisabled]="item.disabled" [(nzChecked)]="item.checked" (nzCheckedChange)="refreshStatus($event)"></td>
+                  <td>{{ item.siteName }}</td>
+                  <td>
+                    <nz-select style="width: 80px;" [(ngModel)]="item.role" 
+                      nzAllowClear nzPlaceHolder="Choose" 
+                      [nzDisabled]="siteGroupModelData.topology != 'hub-spoke'">
+                      <nz-option nzValue="hub" nzLabel="hub"></nz-option>
+                      <nz-option nzValue="spoke" nzLabel="spoke"></nz-option>
+                    </nz-select> 
+                  </td>
+                </tr>
+              </tbody>
+            </nz-table>
+          </div>
+          <div class="action">
+            <button nz-button nzType="primary" (click)="addsitegroup_OK()">OK</button> 
+            <button nz-button nzType="primary" (click)="addsitegroup_cancel()">Cancel</button>
+          </div>  
+        </div>
+        <nz-table #siteGroupTable [nzData]="siteGroupTableData"  
+          [nzLoading]="loading"
+          [nzShowPagination]="false"
+          nzSize="small">
+          <thead>
+            <tr>
+              <th nzWidth="10%"> NO. </th>
+              <th nzWidth="20%"> Group Name </th>
+              <th nzWidth="20%"> Topology </th>
+              <th nzWidth="20%"> Sites </th>
+              <th nzWidth="15%"> Role </th>
+              <th nzWidth="15%"> Action </th>
+            </tr>
+          </thead>
+          <tbody>
+              <!-- <ng-template ngFor let-data [ngForOf]="siteGroupTable.data" let-i="index"> -->
+              <tr *ngFor="let item of siteGroupTable.data; let i = index; ">
+                  <td>{{i+1}}</td>
+                  <td>{{item.name}}</td>
+                  <td>{{item.topology}}</td>
+                  <td>{{item.sites}}</td>
+                  <td>{{item.role}}</td>
+                  <td>
+                      <span class="action" (click)="editGroupSite(i+1)"><i class="anticon anticon-edit"></i></span> &nbsp;
+                      <span class="action" (click)="deleteGroupSite(i+1)"><i class="anticon anticon-delete"></i></span>
+                  </td>
+              </tr>
+              <!-- </ng-template> -->
+          </tbody>
+        </nz-table>
+      </div>
+
+      <button class="submit" nz-button [nzType]="'primary'" (click)="submit()"><span>Create</span></button>
+  </div>
+  <!-- site模态框 -->
+  <div class="sitemodel" *ngIf="siteModelShow">
+    <h3>Site_Enterprise Service</h3>
+    <div class="inputs">
+      <ul>
+        <li><span>Name:</span> <input nz-input [(ngModel)]="siteBaseData.name"></li>
+        <li><span>Description:</span> <input nz-input [(ngModel)]="siteBaseData.description"></li>
+        <li *ngIf="createParams.commonParams.templateType == 'CCVPN'"><span>Type:</span> 
+          <nz-select style="width: 165px;" [(ngModel)]="siteBaseData.type" nzAllowClear nzPlaceHolder="Choose">
+              <nz-option nzValue="single-gateway" nzLabel="single-gateway"></nz-option>
+              <nz-option nzValue="dual-gateway" nzLabel="dual-gateway"></nz-option>
+          </nz-select>
+        </li>
+        <li *ngIf="createParams.commonParams.templateType == 'CCVPN'"><span>Role:</span> 
+          <nz-select style="width: 165px;" [(ngModel)]="siteBaseData.role" nzAllowClear nzPlaceHolder="Choose">
+              <nz-option nzValue="dsvpn-hub" nzLabel="dsvpn-hub"></nz-option>
+              <nz-option nzValue="sd-wan-edge" nzLabel="sd-wan-edge"></nz-option>
+          </nz-select>
+        </li>
+        <li><span>PostCode:</span> <input nz-input [(ngModel)]="siteBaseData.postcode"></li>
+        <li><span>VLAN:</span> <input nz-input [(ngModel)]="siteBaseData.vlan"></li>
+        <li><span>Address:</span>
+          <nz-select style="width: 165px;" [(ngModel)]="siteBaseData.address" nzAllowClear nzPlaceHolder="Choose">
+            <nz-option *ngFor="let item of siteModeAddress" nzValue="{{item}}" nzLabel="{{item}}"></nz-option>
+          </nz-select>
+        </li> 
+      </ul>
+    </div>
+    <div *ngIf="createParams.commonParams.templateType == 'CCVPN'">
+      <h4>CPE</h4>
+      <div class="inputs">
+        <ul>
+          <li><span>Name:</span> <input nz-input [(ngModel)]="siteCpeData.device_name"></li>
+          <li><span>Version:</span> <input nz-input [(ngModel)]="siteCpeData.device_version"></li>
+          <li><span>ESN:</span> <input nz-input [(ngModel)]="siteCpeData.device_esn"></li>
+          <li><span>Class:</span> 
+            <nz-select style="width: 165px;" [(ngModel)]="siteCpeData.device_class" nzAllowClear nzPlaceHolder="Choose">
+                <nz-option nzValue="VNF" nzLabel="VNF"></nz-option>
+                <nz-option nzValue="PNF" nzLabel="PNF"></nz-option>
+            </nz-select>
+          </li>
+          <li><span>System IP:</span> <input nz-input [(ngModel)]="siteCpeData.device_systemIp"></li>
+          <li><span>Vendor:</span> <input nz-input [(ngModel)]="siteCpeData.device_vendor"></li>
+          <li><span>Type:</span> <input nz-input [(ngModel)]="siteCpeData.device_type"></li>
+        </ul>
+      </div>
+      <h4>WAN Port</h4>
+      <div>
+        <nz-table #siteModalTable [nzData]="siteWanData"  
+          [nzLoading]="loading"
+          [nzShowPagination]="false"
+          nzSize="small">
+          <thead>
+            <tr>
+              <th nzWidth="10%"> NO. </th>
+              <th nzWidth="15%"> Name </th>
+              <th nzWidth="15%"> Description </th>
+              <th nzWidth="15%"> PortType </th>
+              <th nzWidth="18%"> PortNumber </th>
+              <th nzWidth="17%"> IPAddress </th>
+              <th nzWidth="10%"> Action </th>
+            </tr>
+          </thead>
+          <tbody>
+              <!-- <ng-template ngFor let-data [ngForOf]="siteModalTable.data" let-i="index"> -->
+              <tr *ngFor="let item of siteModalTable.data; let i = index; ">
+                  <td>{{i+1}}</td>
+                  <td>{{item.sitewanport_name}}</td>
+                  <td>{{item.sitewanport_description}}</td>
+                  <td>{{item.sitewanport_portType}}</td>
+                  <td>{{item.sitewanport_portNumber}}</td>
+                  <td>{{item.sitewanport_ipAddress}}</td>
+                  <td>
+                      <span class="action" (click)="editWanPort(i+1)"><i class="anticon anticon-edit"></i></span>
+                  </td>
+              </tr>
+              <!-- </ng-template> -->
+          </tbody>
+        </nz-table>            
+      </div>
+      <nz-modal [(nzVisible)]="wanPortModal" nzWidth="400" nzTitle="WAN Port Edit" (nzOnCancel)="wanPortModal_Cancel()" (nzOnOk)="wanPortModal_Ok()">
+        <ul class="wanPortModalList">
+          <li><span>Name:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_name"></li>
+          <!-- <li><span>Device Name:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_deviceName"></li> -->
+          <li><span>Description:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_description"></li>
+          <li><span>Port Type:</span> 
+            <nz-select style="width: 165px;" [(ngModel)]="siteWanParams.sitewanport_portType" nzAllowClear nzPlaceHolder="Choose">
+                <nz-option nzValue="GE" nzLabel="GE"></nz-option>
+                <nz-option nzValue="FE" nzLabel="FE"></nz-option>
+                <nz-option nzValue="XGE" nzLabel="XGE"></nz-option>
+                <nz-option nzValue="LTE" nzLabel="LTE"></nz-option>
+                <nz-option nzValue="xDSL(ATM)" nzLabel="xDSL(ATM)"></nz-option>
+                <nz-option nzValue="xSDL(PTM)" nzLabel="xSDL(PTM)"></nz-option>
+            </nz-select>
+          </li>
+          <li><span>Port Number:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_portNumber"></li>
+          <li><span>Ip Address:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_ipAddress"></li>
+          <li><span>Provider IP Address:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_providerIpAddress"></li>
+          <li><span>Transport Nerwork:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_transportNetworkName"></li>
+          <li><span>Input Bandwidth:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_inputBandwidth"></li>
+          <li><span>Output Bandwidth:</span> <input nz-input [(ngModel)]="siteWanParams.sitewanport_outputBandwidth"></li>
+        </ul>
+      </nz-modal>
+    </div>
+
+    <div class="action">
+      <button nz-button nzType="primary" (click)="addsite_OK()">OK</button> 
+      <button nz-button nzType="primary" (click)="addsite_cancel()">Cancel</button>
+    </div>  
+  </div>
+  <!-- 图 -->
+  <div class="chart fr">
+      Create Service
+      {{createParams.commonParams.templateType}}
+      <div id="createChart">
+        <svg width="100%" height="100%">
+          <line *ngFor="let item of lines" x1=50% y1="45%" [attr.x2]="item.x2" y2="72%" style="stroke:#3fa8eb;stroke-width:2"/>
+          <image xlink:href="./assets/images/cloud-site.png"
+                  x="25%" y="30%"  width="50%"/> 
+          <!-- <text dx="42%" dy="45%" style="font:700 18px 'Arial';fill:#666">{{createParams.commonParams.templateType}}</text> -->
+          <text dx="42%" dy="45%" style="font:700 18px 'Arial';fill:#666"></text>
+          <g *ngFor="let item of siteImage"
+            (mouseover)="showSite($event,item)"
+            (mousemove)="moveSite($event,item)"
+            (mouseout)="hideSite($event)">
+            <image  
+              xlink:href="./assets/images/site.png" 
+              [attr.x]="item.x" y="65%" width="80px"/> 
+            <text [attr.dx]="item.x + 25" dy="72%" style="font:700 16px 'Arial';fill:#666">{{ item.name }}</text>
+          </g>
+
+        </svg>
+        <!-- <p class="siteNameP" [ngStyle]="siteNameStyle">{{ siteName }}</p> -->
+      </div>
+  </div>
+
+</div>
diff --git a/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.spec.ts b/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.spec.ts
new file mode 100644 (file)
index 0000000..922bd9e
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CcvpnCreationComponent } from './ccvpn-creation.component';
+
+describe('CcvpnCreationComponent', () => {
+  let component: CcvpnCreationComponent;
+  let fixture: ComponentFixture<CcvpnCreationComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ CcvpnCreationComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CcvpnCreationComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.ts b/usecaseui-portal/src/app/ccvpn-creation/ccvpn-creation.component.ts
new file mode 100644 (file)
index 0000000..ffc354c
--- /dev/null
@@ -0,0 +1,548 @@
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { MyhttpService } from '../myhttp.service';
+
+@Component({
+  selector: 'app-ccvpn-creation',
+  templateUrl: './ccvpn-creation.component.html',
+  styleUrls: ['./ccvpn-creation.component.css']
+})
+export class CcvpnCreationComponent implements OnInit {
+
+  constructor(private myhttp:MyhttpService) { }
+
+  ngOnInit() {
+    this.getSiteAddressList();
+    this.getTemParameters();
+  }
+
+  @Input() createParams;
+  @Input() namesTranslate;  //输入项参数名字转换
+  @Output() closeCreate = new EventEmitter();
+
+  templateParameters = {};
+  getTemParameters(){ //获取模板参数
+    let chosedtemplates = Object.values(this.createParams.templates);
+    // console.log(this.createParams);
+    console.log(chosedtemplates);  //模板id数组
+    let types = ["sotnvpn","site","sdwanvpn"];
+    chosedtemplates.forEach((item,index)=>{
+      this.myhttp.getTemplateParameters(types[index],item)
+        .subscribe((data)=>{
+          if(index === 0){
+            this.templateParameters["sotnvpn"] = data;
+            this.sotnNames = data.inputs.map((item)=>{return item.name}); //云的真实名字
+          }else if(index === 1){
+            this.templateParameters["site"] = data;
+            let wanportnames = {};
+            this.siteNames = data.inputs.map((item)=>{return item.name}); //site中所有真实名字,没有分组,放在一起了
+            this.siteNames.forEach((item)=>{
+              if(item.includes("_device_")){
+                this.siteCpeNames.push(item);
+              }else if(item.includes("_sitewanport_")){
+                let firstName = item.split("_")[0];
+                wanportnames[firstName]?wanportnames[firstName].push(item):wanportnames[firstName]=[item];
+              }else {
+                this.siteBaseNames.push(item);
+              }
+            })
+            this.siteWanNames = Object.values(wanportnames);
+            this.siteWanNames.forEach((item)=>{
+              this.siteWanData.push(this.siteWanParams);  //根据wanport组添加表格中
+            })
+            // console.log(this.sotnNames)
+            // console.log(this.siteNames)
+            // console.log(this.siteBaseNames)
+            // console.log(this.siteCpeNames)
+            // console.log(this.siteWanNames)
+            // console.log(this.siteWanData)
+          }else if(index === 2){
+            this.templateParameters["sdwan"] = data;
+            this.siteGroupNames = data.inputs.map((item)=>{return item.name}); //sdwanvpn真实名字
+            // console.log(this.siteGroupNames);
+          }
+         
+        },(err)=>{
+
+        })
+    })
+
+  }
+  // SOTN VPN Info 输入参数
+  sotnInfo = {
+    name:null,description:null,
+    startTime:null,endTime:null,
+    COS:"premium",reroute:false,
+    SLS:null,dualLink:false,
+    CIR:null,EIR:null,
+    CBS:null,EBS:null,
+    colorAware:false,couplingFlag:false
+  }
+  sotnNames = [] //真实名字
+
+  startTimeChange(event){
+    console.log(event)
+  }
+  endTimeChange(event){
+    console.log(event)
+  }
+
+
+  // Site List
+  siteTableData = [
+
+  ]
+  siteModeAddress = [];//site地址,筛选框数据,本地配置文件
+  siteNames = [];//site中所有真实名字,未分组,模拟真实请求情况;
+
+  siteBaseData = {  //模态框数据,输入参数,绑定数据
+    name:null,
+    description:null,
+    type:null,
+    role:null,
+    postcode:null,
+    address:null,
+    vlan:null,
+    sotnVpnName:null, //SOTN VPN Info中name
+    controlPoint:null, //site group里面site的Role设置为spoke时,传递site group里面Role设置为hub的site name;否则传递空白
+    groupRole:null, //site group的role
+    groupName:null, //site group的name
+    emails:null,//  不显示传空
+    latitude:null,//
+    longitude:null,//
+    clientSignal:null//
+  };
+  siteBaseNames = [] //真实名字
+  // cpe 编辑
+  siteCpeData = {
+    device_name:null,
+    device_version:null,
+    device_esn:null,
+    device_class:null,
+    device_systemIp:null,
+    device_vendor:null,
+    device_type:null
+  };
+  siteCpeNames = [] //真实名字
+  // Wan Port 编辑
+  siteWanData = [];  //wan port 表格绑定数据
+  siteWanParams = {  //每一行数据详细参数,模态框
+    sitewanport_name:null,
+    sitewanport_deviceName:null,
+    sitewanport_description:null,
+    sitewanport_portType:null,
+    sitewanport_portNumber:null,
+    sitewanport_ipAddress:null,
+    sitewanport_providerIpAddress:null,
+    sitewanport_transportNetworkName:null,
+    sitewanport_inputBandwidth:null,
+    sitewanport_outputBandwidth:null
+  };
+  siteWanNames = [] //真实名字
+  wanPortModal = false;  //模态框显示隐藏
+  wanPortEditNum = 0;//编辑哪行
+  editWanPort(num){
+    this.wanPortModal = true;
+    this.wanPortEditNum = num;
+    this.siteWanParams = Object.assign({},this.siteWanData[num-1]);
+  }
+  wanPortModal_Ok(){
+    let inputsData = Object.assign({},this.siteWanParams); //新建对象,断开原引用,因为后面要清空模态框
+    inputsData.sitewanport_deviceName = this.siteCpeData.device_name;
+    this.siteWanData[this.wanPortEditNum-1] = inputsData; 
+    this.siteWanData = [...this.siteWanData]; //表格刷新
+    Object.keys(this.siteWanParams).forEach((item)=>{ //清空模态框
+      this.siteWanParams[item] = null;
+    })
+    this.wanPortModal = false;
+    console.log(this.siteWanData)
+  }
+  wanPortModal_Cancel(){
+    this.wanPortModal = false;
+  }
+
+
+  // 获取site地址,手动文件
+  getSiteAddressList(){
+    this.myhttp.getSiteAddress()
+      .subscribe((data)=>{
+        console.log(data);
+        this.siteModeAddress = data.map((item)=>{ return item.location});
+      },(err)=>{
+        console.log(err);
+      })
+  }
+  siteModelShow = false;
+  addSite(){
+    this.siteModelShow = true;
+    this.isEdit = 0;
+  }
+  // addsite模态框按钮
+  isEdit = 0; //编辑序号,No值,0表示增加
+  addsite_OK(){
+    this.siteBaseData.sotnVpnName = this.sotnInfo.name;
+    // let inputsData = Object.assign({},this.siteBaseData,this.siteCpeData,this.siteWanData); //新建对象,断开原引用,因为后面要清空模态框
+    let inputs = {};
+    inputs["baseData"] = Object.assign({},this.siteBaseData);
+    inputs["cpeData"] = Object.assign({},this.siteCpeData);
+    inputs["wanportData"] = this.siteWanData.map((item)=>{
+      return Object.assign({},item);
+    })
+    console.log(inputs);
+    if(this.isEdit){
+      // 编辑状态不增加
+      this.siteTableData[this.isEdit-1] = inputs; 
+      this.siteTableData = [...this.siteTableData]; //表格刷新
+      this.siteGroupTableData.forEach((item)=>{  //site修改名字后,更新组中sites值
+        if(item.sites.split(";").filter((d)=>{return d!=""}).includes(this.lastSiteName)){
+          item.sites = item.sites.replace(this.lastSiteName,this.siteBaseData.name);
+        }
+      })
+    }else{
+      // this.siteTableData.push(inputs);//使用 push 或者 splice 修改 nzData 失效 当加上[nzFrontPagination]="false" 时,生效
+      this.siteTableData = [...this.siteTableData,inputs];
+    }
+    
+    Object.keys(this.siteBaseData).forEach((item)=>{ //清空模态框
+      this.siteBaseData[item] = null;
+    })
+    Object.keys(this.siteCpeData).forEach((item)=>{ //清空模态框
+      this.siteCpeData[item] = null;
+    })
+    this.siteWanData.forEach((item)=>{
+      Object.keys(item).forEach((item2)=>{
+        item[item2] = null;
+      })
+    })
+    // console.log(this.siteTableData);
+    this.lastSiteName = null;
+    this.drawImage(this.siteTableData);
+    this.siteModelShow = false;
+  }
+  addsite_cancel(){
+    Object.keys(this.siteBaseData).forEach((item)=>{ //清空模态框
+      this.siteBaseData[item] = null;
+    })
+    Object.keys(this.siteCpeData).forEach((item)=>{ //清空模态框
+      this.siteCpeData[item] = null;
+    })
+    this.siteWanData.forEach((item)=>{
+      Object.keys(item).forEach((item2)=>{
+        item[item2] = null;
+      })
+    })
+    this.lastSiteName = null;
+    this.siteModelShow = false;
+  }
+  lastSiteName = null; //当site修改之后,若修改了名字,则需要更新group中sites的名字
+  editSite(num){ //编辑修改选中site信息
+    this.siteModelShow = true;
+    this.isEdit=num;
+    this.siteBaseData = Object.assign({},this.siteTableData[num-1].baseData);
+    this.siteCpeData = Object.assign({},this.siteTableData[num-1].cpeData);
+    this.siteWanData = this.siteTableData[num-1].wanportData.map((item)=>{return Object.assign({},item)});
+    this.lastSiteName = this.siteBaseData.name;
+  }
+  deleteSite(num){
+    let deleteSiteName = this.siteTableData[num-1].baseData.name;   //删除的site中name
+    let groupSites = [];
+    this.siteGroupTableData.forEach((item)=>{ groupSites.push(...item.sites.split(";").filter((d)=>{return d!=""})) });
+    if(groupSites.includes(deleteSiteName)){
+      alert("this site has in grouplist;can't delete!")
+      return false;
+    }
+    this.siteTableData = this.siteTableData.filter((d,i) => i !== num-1);
+    // this.siteTableData.splice(num-1,1); //模板中加上[nzFrontPagination]="false" 时,生效
+    this.drawImage(this.siteTableData);
+
+    // let groupIndex = this.siteGroupTableData.findIndex((item)=>{return item.sites.split(";").includes(deleteSiteName)});
+    // console.log(groupIndex)
+    // this.deleteGroupSite(groupIndex + 1); //删除时首行编号为1
+  }
+
+  // site节点图形描绘
+  lines=[];
+  siteImage=[];
+  drawImage(sitelist){
+    let cx = 200;
+    let cy = 200;
+    let r = 180;
+    let startAngle = -210 * (Math.PI/180);
+    let step = sitelist.length > 1 ? 120/(sitelist.length-1) * (Math.PI/180) : 1;
+
+    this.lines = sitelist.map((item,index)=>{
+      let x = cx + Math.cos(startAngle - step*index)*r;
+      let y = cy + Math.sin(startAngle - step*index)*r;
+      return {img:"line",site:item.baseData.name,x1:cx,y1:cy,x2:x,y2:y}
+    })
+    this.siteImage = this.lines.map((item)=>{
+      return {img:"site",name:item.site,x:item.x2 - 40,y:item.y2 - 40}
+    })
+  }
+
+  siteName=null;
+  siteNameStyle = {
+    'display':'none',
+    'left':'0',
+    'top':'0'
+  }
+  showSite($event,item){
+    this.siteName = item.name;
+    this.siteNameStyle.display = 'block';
+  }
+  moveSite($event,item){
+    this.siteNameStyle.left = $event.clientX  + "px";
+    this.siteNameStyle.top = $event.clientY - 35 + "px";
+  }
+  hideSite($event){
+    this.siteNameStyle.display = 'none'; 
+  }
+  // siteGroup List
+  siteGroupTableData = [
+
+  ]
+  siteGroupModelData = {
+    name:null,
+    topology:null,
+    sites:null,
+    role:null
+  }
+  siteGroupModelShow = false;
+  siteGroupModalTableData = [];// ==> siteTableData?
+  siteGroupNames=[];  //sdwanvpn真实名字
+
+  // 勾选框
+  allChecked = false;
+  indeterminate = false;
+  groupModal_checkAll(value){
+    this.siteGroupModalTableData.forEach(data => {
+      if (!data.disabled) {
+        data.checked = value;
+      }
+    });
+    this.refreshStatus();
+  }
+  refreshStatus(){
+    const allChecked = this.siteGroupModalTableData.filter(item => !item.disabled).every(item => item.checked === true);
+    const allUnChecked = this.siteGroupModalTableData.filter(item => !item.disabled).every(item => !item.checked);
+    this.allChecked = allChecked;
+    this.indeterminate = (!allChecked) && (!allUnChecked);
+  }
+
+  addSiteGroup(){
+    this.isGroupEdit = 0;
+    this.siteGroupModelShow = true;
+    let checkedSite = this.siteGroupTableData.map((item)=>{return item.sites}).join(";").split(";").filter((d)=>{return d!=""});//循环组中是否已经选用了某个site,若存在 则新组不可选
+    // console.log(checkedSite);
+    this.siteTableData.forEach((item,index)=>{ 
+      if(checkedSite.includes(item.baseData.name)){ 
+        this.siteGroupModalTableData.push({siteName:item.baseData.name,role:null,checked:false,disabled:true})
+      }else {
+        this.siteGroupModalTableData.push({siteName:item.baseData.name,role:null,checked:false,disabled:false})
+      }    
+    })
+  }
+  // addsiteGroup模态框按钮
+  addsitegroup_OK(){  //将模态框中的值赋给表中对应项--->将选中的site中的groupRole、groupName、controlPoint更新--->
+                      //拷贝数据判断是增加或编辑,更新表中数据---> 清除模态框中数据,便于下次添加,关闭模态框
+    console.log(this.siteGroupModalTableData);
+    this.siteGroupModelData.sites="";  //置空组成员名字,写成""方便+=  ,若为null +=时会转成 "null"
+    this.siteGroupModelData.role="";  //
+    let site_controlPoint = this.siteGroupModalTableData.map((item)=>{ if(item.checked&&item.role=="hub"){ return item.siteName}}).filter((item)=>{return item!=undefined});  
+    // console.log(site_controlPoint);
+    this.siteGroupModalTableData.forEach((item,index)=>{  //模态框中site顺序和 表中site顺序一致
+      if(item.checked){
+        this.siteGroupModelData.sites += item.siteName+";";
+        this.siteGroupModelData.role += item.role+";";
+        this.siteTableData[index].baseData.groupRole = item.role; //site group的role
+        this.siteTableData[index].baseData.groupName = this.siteGroupModelData.name; //site group的name
+        if(item.role == "spoke"){
+          this.siteTableData[index].baseData.controlPoint = site_controlPoint.join(); //site group里面site的Role设置为spoke时,传递site group里面Role设置为hub的site name;否则传递空白
+        }
+      }
+    })
+
+    let inputsData = {};
+    Object.assign(inputsData,this.siteGroupModelData);
+    if(this.isGroupEdit){
+      // 编辑状态不增加
+      this.siteGroupTableData[this.isGroupEdit-1] = inputsData; 
+      this.siteGroupTableData = [...this.siteGroupTableData]; //表格刷新
+    }else{
+      // this.siteTableData.push(inputsData);//使用 push 或者 splice 修改 nzData 失效
+      this.siteGroupTableData = [...this.siteGroupTableData,inputsData];
+    }
+
+    Object.keys(this.siteGroupModelData).forEach((item)=>{   
+      this.siteGroupModelData[item] = null;
+    })
+    this.siteGroupModalTableData = [];
+    this.siteGroupModelShow = false;
+  }
+  addsitegroup_cancel(){
+    this.siteGroupModalTableData = [];
+    this.siteGroupModelShow = false;
+  }
+  isGroupEdit = 0; //编辑序号,No值,0表示增加
+  editGroupSite(num){ //将当前编辑的行数据填入模态框--->获取当前编辑项sites名--->判断更新模态框中site项状态
+    this.siteGroupModelShow = true;
+    this.isGroupEdit=num;
+    this.siteGroupModelData = Object.assign({},this.siteGroupTableData[num-1]);
+    console.log(this.siteGroupModelData)
+    let editSites = this.siteGroupTableData[num-1].sites.split(";").filter((item)=>{return item!=""}); //获取组中的site名
+    // console.log(editSites);
+    let checkedSite = this.siteGroupTableData.map((item)=>{return item.sites}).join(";").split(";").filter((d)=>{return d!=""});//循环组中是否已经选用了某个site,若存在 则新组不可选
+    // console.log(checkedSite);
+    this.siteTableData.forEach((item,index)=>{ 
+      if(editSites.includes(item.baseData.name)){//先将编辑组中的site 中这三个值还原,否则减少某个site时 不会更新不选中的
+        item.baseData.groupRole = null; //site group的role
+        item.baseData.groupName = null; //site group的name
+        item.baseData.controlPoint = null;
+        this.siteGroupModalTableData.push({siteName:item.baseData.name,role:item.baseData.groupRole,checked:true,disabled:false})
+      }else
+      if(checkedSite.includes(item.baseData.name)){ 
+        this.siteGroupModalTableData.push({siteName:item.baseData.name,role:null,checked:false,disabled:true})
+      }else {
+        this.siteGroupModalTableData.push({siteName:item.baseData.name,role:null,checked:false,disabled:false})
+      }    
+    })
+      
+  }
+  deleteGroupSite(num){
+    let deleteSiteGroupsites = this.siteGroupTableData[num-1].sites.split(";").filter((item)=>{return item!=""}); //删除的site中name
+    this.siteGroupTableData = this.siteGroupTableData.filter((d,i) => i !== num-1);
+    this.siteTableData.forEach((item,index)=>{
+      if(deleteSiteGroupsites.includes(item.baseData.name)){ 
+        item.baseData.groupRole = null; //site group的role
+        item.baseData.groupName = null; //site group的name
+        item.baseData.controlPoint = null; 
+      }
+    })
+  }
+
+
+
+  // 提交创建数据
+  submit(){   
+    let globalCustomerId = this.createParams.commonParams.customer.id;
+    let globalServiceType = this.createParams.commonParams.serviceType;
+    let sotnInputs = {}; 
+    // 由于请求模板不一样,所以外层需要循环请求回来的真实名字,内层循环本地参数,将当前值赋给真实名字
+    this.sotnNames.forEach((name)=>{
+      for(let key in this.sotnInfo){
+        let nameParts = this.namesTranslate.sotnNameTranslate[key].split("_");
+        if(name.startsWith(nameParts[0])&&name.endsWith(nameParts[1])){
+          sotnInputs[name] = this.sotnInfo[key];
+          break;
+        }
+      }
+    })
+    console.log(sotnInputs);
+    let vpnbody = {
+        service:{
+          name:this.sotnInfo.name,
+          description:this.sotnInfo.description,
+          serviceInvariantUuid:this.templateParameters["sotnvpn"].invariantUUID,  //template.invariantUUID, //serviceDefId
+          serviceUuid:this.templateParameters["sotnvpn"].uuid,  //template.uuid, // uuid ?? templateId
+          globalSubscriberId:globalCustomerId,  //customer.id
+          serviceType:globalServiceType,  //serviceType.value
+          parameters:{
+            locationConstraints:[],
+            resources:[],
+            requestInputs:sotnInputs
+          }
+        }
+    }
+    
+    let sitebody = this.siteTableData.map((site)=>{
+      let siteInputs = {};
+      this.siteBaseNames.forEach((basename)=>{
+        for(let key in site.baseData){
+          let namePart = this.namesTranslate.siteNameTranslate.baseNames[key];
+          if(basename.endsWith(namePart)){
+            siteInputs[basename] = site.baseData[key];
+            break;
+          }
+        }
+      })
+      this.siteCpeNames.forEach((cpename)=>{
+        for(let key in site.cpeData){
+          let namePart = this.namesTranslate.siteNameTranslate.cpeNames[key];
+          if(cpename.endsWith(namePart)){
+            siteInputs[cpename] = site.cpeData[key];
+            break;
+          }
+        }
+      })
+      this.siteWanNames.forEach((item,index)=>{
+        item.forEach((wanportname)=>{
+          for(let key in site.wanportData[index]){
+            let namePart = this.namesTranslate.siteNameTranslate.wanportNames[key];
+            if(wanportname.endsWith(namePart)){
+              siteInputs[wanportname] = site.wanportData[index][key];
+              break;
+            }
+          }
+        })
+      })
+
+      return {
+        service:{
+          name:site.baseData.name,
+          description:site.baseData.description,
+          serviceInvariantUuid:this.templateParameters["site"].invariantUUID,
+          serviceUuid:this.templateParameters["site"].uuid,
+          globalSubscriberId:globalCustomerId,
+          serviceType:globalServiceType,
+          parameters:{
+            locationConstraints:[],
+            resources:[],
+            requestInputs:siteInputs
+          }
+        }
+      }
+    });
+    console.log(sitebody);
+
+    let groupbody = this.siteGroupTableData.map((item)=>{
+      let siteGroupInputs = {};
+      this.siteGroupNames.forEach((name)=>{
+        for(let key in item){
+          let nameParts = this.namesTranslate.siteGroupNameTranslate[key].split("_");
+          if(name.startsWith(nameParts[0])&&name.endsWith(nameParts[1])){
+            siteGroupInputs[name] = item[key];
+            break;
+          }
+        }
+      })
+      return {
+        service:{
+          name:item.name,
+          description:item.topology,
+          serviceInvariantUuid:this.templateParameters["sdwan"].invariantUUID,
+          serviceUuid:this.templateParameters["sdwan"].uuid,
+          globalSubscriberId:globalCustomerId,
+          serviceType:globalServiceType,
+          parameters:{
+            locationConstraints:[],
+            resources:[],
+            requestInputs:siteGroupInputs
+          }
+        }
+      }
+    })
+    console.log(groupbody);
+
+    let createObj = {
+      vpnbody:vpnbody,
+      sitebody:sitebody,
+      groupbody:groupbody
+    }
+    
+    this.closeCreate.emit(createObj);
+
+  }
+
+  goback(){
+    this.closeCreate.emit(); 
+  }
+}
diff --git a/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.css b/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.css
new file mode 100644 (file)
index 0000000..710bd10
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px;
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 10px;
+}
+.model {
+    background-color: #fff;
+    height: 90%;
+    overflow-y: auto;
+}
+.model .back {
+    position: absolute;
+    top: 10px;
+    right: 20px;
+}
+.model .detaildata {
+    position: relative;
+    width: 60%;
+    height: 100%;
+    overflow-y: auto;
+    border-radius: 5px;
+    padding: 15px;
+}
+.model .detaildata h3.title {
+    height: 20px;
+    font: 700 20px/20px "Arial";
+    color: #666;
+}
+.model .detaildata h3 {
+    height: 20px;
+    font: 700 16px/20px "Arial";
+    margin: 5px 0px;
+    color: #000;
+}
+/* SOTN VPN */
+.model .detaildata .sotnvpn ul li {
+    display: inline-block;
+    height: 35px;
+    width: 49.5%;
+}
+.model .detaildata .sotnvpn ul li span {
+    display: inline-block;
+    width: 110px;
+    font: 700 14px "Arial";
+    color: #3fa8eb;
+    vertical-align: middle;
+}
+/* site Detail */
+.model .detaildata .site .siteDetail {
+    position: fixed;
+    z-index: 10;
+    left: 260px;
+    top: 50px;
+    background-color: #fff;
+    box-shadow: 0px 0px 20px #000;
+    width: 50%;
+    max-height: 85%;
+    border-radius: 5px;
+    overflow-y: auto;
+}
+.model .detaildata .site h3 {
+    margin: 0;
+    height: 30px;
+    font: 700 16px/30px "Arial";
+    padding-left: 10px;
+    background-color: #ddd;
+}
+.model .detaildata .site h3 .closeDetail {
+    cursor: pointer;
+    padding: 2px 15px;
+    color: #3fa8eb;
+}
+.model .detaildata .site ul li {
+    padding-left: 5px;
+    display: inline-block;
+    height: 35px;
+    width: 32%;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+.model .detaildata .site ul li span {
+    display: inline-block;
+    width: 95px;
+    font: 700 14px "Arial";
+    color: #3fa8eb;
+    vertical-align: middle;
+}
+
+/* 图 */
+.model .chart {
+    width: 40%;
+    padding: 10px;
+    height: 100%;
+    border-left: 10px solid #f3f3f3;
+}
+.model .chart #detailChart {
+    position: relative;
+    width: 100%;
+    height: 80%;
+    margin-top: 20px;
+}
+.model .chart #detailChart .cloudcounty {
+    cursor: pointer;
+}
+
+.model .chart #detailChart .couldDetail {
+    position: absolute;
+    left: 50%;
+    top: 10px;
+    width: 80%;
+    transform: translate(-50%,0);
+    height: 160px;
+    background-color: #aaa;
+    border-radius: 5px;
+    box-shadow: 0px 0px 20px #000;
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.html b/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.html
new file mode 100644 (file)
index 0000000..33d56eb
--- /dev/null
@@ -0,0 +1,336 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> Services List </h3>
+<hr>
+<div class="model">
+  <!-- 详情数据 -->
+  <button class="back" nz-button (click)="goback()"><span><i class="anticon anticon-rollback"></i></span></button>
+  <div class="detaildata fl">
+      <h3 class="title">{{detailParams.sotnvpnSer['service-instance-name']}} Instance Detail</h3>
+      <div class="sotnvpn clearfix">
+        <h3>SOTN VPN Info</h3>
+        <ul>
+          <li><span>Name:</span> {{sotnVpnInfo.name}}</li>
+          <li><span>Description:</span> {{sotnVpnInfo.description}} </li>
+          <li><span>Start Time:</span> {{sotnVpnInfo.startTime}}</li>
+          <li><span>End Time:</span> {{sotnVpnInfo.endTime}} </li>
+          <li><span>COS:</span> {{sotnVpnInfo.COS}}</li>
+          <li><span>Reroute Enable:</span> {{sotnVpnInfo.reroute}} </li>
+          <li><span>Service Level Specification:</span> {{sotnVpnInfo.SLS}}</li>
+          <li><span>DualLink:</span> {{sotnVpnInfo.dualLink}} </li>
+          <li><span>CIR:</span> {{sotnVpnInfo.CIR}}</li>
+          <li><span>EIR:</span> {{sotnVpnInfo.EIR}} </li>
+          <li><span>CBS:</span> {{sotnVpnInfo.CBS}}</li>
+          <li><span>EBS:</span> {{sotnVpnInfo.EBS}} </li>
+          <li><span>Color Aware:</span> {{sotnVpnInfo.colorAware}}</li>
+          <li><span>Coupling Flag:</span> {{sotnVpnInfo.couplingFlag}} </li>
+        </ul>
+      </div>
+
+      <div class="site">
+        <h3>Site List</h3>
+        <nz-table #nzTable [nzData]="siteList"
+          [nzShowPagination]="false"
+          nzSize="small">
+          <thead>
+            <tr>
+              <th nzWidth="10%"> NO. </th>
+              <th nzWidth="15%"> Name </th>
+              <th nzWidth="20%"> Description </th>
+              <th nzWidth="15%"> Post Code </th>
+              <th nzWidth="15%"> Address </th>
+              <th nzWidth="15%"> VLAN </th>
+              <th nzWidth="10%"> Action </th>
+            </tr>
+          </thead>
+          <tbody>
+              <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+              <tr *ngFor="let item of nzTable.data; let i = index; ">
+                  <td>{{i+1}}</td>
+                  <td>{{item.baseNames.name}}</td>
+                  <td>{{item.baseNames.description}}</td>
+                  <td>{{item.baseNames.postcode}}</td>
+                  <td>{{item.baseNames.address}}</td>
+                  <td>{{item.baseNames.vlan}}</td>
+                  <td (click)="showSiteDetail(item)"> <a href="javascript:;">Detail</a> </td>
+              </tr>
+              <!-- </ng-template> -->
+          </tbody>
+        </nz-table>
+        <div class="siteDetail" *ngIf="siteDetail">
+          <h3>Site_Enterprise Service <span class="closeDetail fr" (click)="siteDetail=false">X</span></h3>
+          <ul>
+            <li><span>Name:</span> {{ siteDetailData.baseNames.name}}</li>
+            <li><span>Description:</span> {{ siteDetailData.baseNames.description }} </li>
+            <li *ngIf="detailParams.sotnvpnSer.Type == 'CCVPN'"><span>Type:</span> {{ siteDetailData.baseNames.type }} </li>
+            <li *ngIf="detailParams.sotnvpnSer.Type == 'CCVPN'"><span>Role:</span> {{ siteDetailData.baseNames.role }} </li>
+            <li><span>PostCode:</span> {{ siteDetailData.baseNames.postcode }} </li>
+            <li><span>VLAN:</span> {{ siteDetailData.baseNames.vlan }}</li>
+            <li><span>Address:</span> {{ siteDetailData.baseNames.address }}</li>
+            <li><span>ClientSignal:</span> {{ siteDetailData.baseNames.clientSignal }}</li>
+            <li><span>ControlPoint:</span> {{ siteDetailData.baseNames.controlPoint }}</li>
+            <li><span>Emails:</span> {{ siteDetailData.baseNames.emails }}</li>
+            <li><span>GroupName:</span> {{ siteDetailData.baseNames.groupName }}</li>
+            <li><span>GroupRole:</span> {{ siteDetailData.baseNames.groupRole }}</li>
+            <li><span>Latitude:</span> {{ siteDetailData.baseNames.latitude }}</li>
+            <li><span>Longitude:</span> {{ siteDetailData.baseNames.longitude }}</li>
+            <li><span>SotnVpnName:</span> {{ siteDetailData.baseNames.sotnVpnName }}</li>
+          </ul>
+          <div *ngIf="detailParams.sotnvpnSer.Type == 'CCVPN'">
+            <h3>CPE</h3>
+            <ul>
+              <li><span>Name:</span> {{siteDetailData.cpeNames.device_name}}</li>
+              <li><span>Version:</span> {{ siteDetailData.cpeNames.device_version }} </li>
+              <li><span>ESN:</span> {{ siteDetailData.cpeNames.device_esn }} </li>
+              <li><span>Class:</span> {{ siteDetailData.cpeNames.device_class }} </li>
+              <li><span>System IP:</span> {{ siteDetailData.cpeNames.device_systemIp }} </li>
+              <li><span>Vendor:</span> {{ siteDetailData.cpeNames.device_vendor }}</li>
+              <li><span>Type:</span> {{ siteDetailData.cpeNames.device_type }}</li>
+            </ul>
+            <h3>WAN Port</h3>
+            <nz-table #nzTable [nzData]="siteDetailData.wanportNames"
+              [nzShowPagination]="false"
+              nzSize="small">
+              <thead>
+                <tr>
+                  <th nzWidth="10%"> NO. </th>
+                  <th nzWidth="15%"> Name </th>
+                  <th nzWidth="20%"> Description </th>
+                  <th nzWidth="15%"> PortType </th>
+                  <th nzWidth="15%"> PortNumber </th>
+                  <th nzWidth="15%"> IPAddress </th>
+                  <th nzWidth="10%"> Action </th>
+                </tr>
+              </thead>
+              <tbody>
+                  <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+                  <tr *ngFor="let item of nzTable.data; let i = index; ">
+                      <td>{{i+1}}</td>
+                      <td>{{item.sitewanport_name}}</td>
+                      <td>{{item.sitewanport_description}}</td>
+                      <td>{{item.sitewanport_portType}}</td>
+                      <td>{{item.sitewanport_portNumber}}</td>
+                      <td>{{item.sitewanport_ipAddress}}</td>
+                      <td (click)="showWanportDetail(item)"> <a href="javascript:;">Detail</a> </td>
+                  </tr>
+                  <!-- </ng-template> -->
+              </tbody>
+            </nz-table>
+            <nz-modal [(nzVisible)]="wanPortModal" [nzTitle]="modalTitle" [nzContent]="modalContent" [nzFooter]="modalFooter" (nzOnCancel)="handleCancel()">
+              <ng-template #modalTitle>
+                WAN Port Detail
+              </ng-template>
+
+              <ng-template #modalContent>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Name </span> {{wanPortDetail.sitewanport_name}}</p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Description: </span> {{wanPortDetail.sitewanport_description}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Port Type: </span> {{wanPortDetail.sitewanport_portType}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Port Number: </span> {{wanPortDetail.sitewanport_portNumber}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Ip Address: </span> {{wanPortDetail.sitewanport_ipAddress}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Provider IP Address: </span> {{wanPortDetail.sitewanport_providerIpAddress}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Transport Nerwork: </span> {{wanPortDetail.sitewanport_transportNetworkName}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Input Bandwidth: </span> {{wanPortDetail.sitewanport_inputBandwidth}} </p>
+                <p> <span style="color:#3fa8eb;font:700 14px 'Arial';display:inline-block;width:200px;"> Output Bandwidth: </span> {{wanPortDetail.sitewanport_outputBandwidth}} </p>
+              </ng-template>
+
+              <ng-template #modalFooter>
+                <!-- <button nz-button nzType="primary" (click)="handleOk()" [nzLoading]="isConfirmLoading">Custom Submit</button> -->
+              </ng-template>
+            </nz-modal>
+          </div>
+
+        </div>
+      </div>
+
+      <div class="sitegroup" *ngIf="detailParams.sotnvpnSer.Type == 'CCVPN'">
+        <h3>Site_Group List</h3>
+        <nz-table #nzTable [nzData]="siteGroupList"
+          [nzLoading]="loading"
+          [nzShowPagination]="false"
+          nzSize="small">
+          <thead>
+            <tr>
+              <th nzWidth="10%"> NO. </th>
+              <th nzWidth="20%"> Group Name </th>
+              <th nzWidth="20%"> Topology </th>
+            </tr>
+          </thead>
+          <tbody>
+              <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+              <tr *ngFor="let item of nzTable.data; let i = index; ">
+                  <td>{{i+1}}</td>
+                  <td>{{item.name}}</td>
+                  <td>{{item.topology}}</td>
+              </tr>
+              <!-- </ng-template> -->
+          </tbody>
+        </nz-table>
+      </div>
+  </div>
+  <!-- 图 -->
+  <div class="chart fr">
+
+      <div id="detailChart">
+        <!-- <svg width="100%" height="100%">
+          <line *ngFor="let item of lines" [attr.x1]="item.x1" [attr.y1]="item.y1" [attr.x2]="item.x2" [attr.y2]="item.y2" style="stroke:#3fa8eb;stroke-width:2"/>
+          <image xlink:href="./assets/images/cloud-county.png"
+                 class="cloudcounty"
+                 (click)="toggleClick()"
+                 (mouseover)="hoverShowcould()"
+                 (mouseout)="hoverHidecould()"
+                 x="175" y="175" height="50px" width="50px"/>
+          <image *ngFor="let item of siteImage"
+                  xlink:href="./assets/images/cloud-city.png"
+                  [attr.x]="item.x" [attr.y]="item.y" height="50px" width="50px"/>
+        </svg>
+        <div class="couldDetail" *ngIf="hoverShow || clickShow">
+
+        </div> -->
+        <svg width="100%" height="100%" style="position: relative">
+          <!--背景大图-->
+          <image xlink:href="./assets/images/bigcloud.png"
+                 class="backgroundcloud"
+                 width="100%"
+                 style="position: absolute;z-index:-1">
+          </image>
+          <!--tp,site,domain之间的连线-->
+          <line *ngFor="let item of detailLines" [attr.x1]="item.x1" [attr.y1]="item.y1" [attr.x2]="item.x2" [attr.y2]="item.y2" style="stroke:#FFC000; stroke-width:2"></line>
+          <line *ngIf="detailSites" x1="45%" y1="30%" x2="75%" y2="20%" style="stroke:#FFC000; stroke-width:2"></line>
+          <!--本地domain-->
+          <g class="clouds">
+            <image xlink:href="./assets/images/domain.png"
+                   id="domain1"
+              width="20%"
+                   x="10%" y="10%"
+            ></image>
+            <text dx="12%" dy="16%" style="font-size: 14px; fill:#666;width: 20px;">
+             {{vpns[0].domain}}
+            </text>
+          </g>
+          <g *ngIf="vpns[1]" class="clouds">
+            <image xlink:href="./assets/images/domain.png"
+                   id="domain2"
+              width="20%"
+                   x="40%" y="13%"
+            ></image>
+            <text dx="43%" dy="19%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{vpns[1].domain}}
+            </text>
+          </g>
+          <!--domain1下连接的tp-->
+          <g class="clouds">
+            <image xlink:href="./assets/images/tp.png"
+                   class="tp"
+                   id="tp1"
+                   height="16" width="20"
+                   x="15%" y="25%"
+            ></image>
+            <text dx="18%" dy="27%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{vpns[0].sitetpname}}
+            </text>
+          </g>
+          <g class="clouds">
+            <image xlink:href="./assets/images/tp.png"
+                   class="tp"
+                   id="tp2"
+                   height="16" width="20"
+                   x="30%" y="10%"
+            ></image>
+            <text dx="30%" dy="6%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{vpns[0].othertpname}}
+            </text>
+          </g>
+          <!--domain2下连接的tp-->
+          <g *ngIf="vpns[1]" class="clouds">
+            <image xlink:href="./assets/images/tp.png"
+                   class="tp"
+                   id="tp3"
+                   height="16" width="20"
+                   x="40%" y="10%"
+            ></image>
+            <text dx="40%" dy="9%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{vpns[1].othertpname}}
+            </text>
+          </g>
+          <g *ngIf="vpns[1]" class="clouds">
+            <image xlink:href="./assets/images/tp.png"
+                   class="tp"
+                   id="tp4"
+                   height="16" width="20"
+                   x="43%" y="28%"
+            ></image>
+            <text dx="46%" dy="30%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{vpns[1].sitetpname}}
+            </text>
+          </g>
+          <!--外部云-->
+          <g class="clouds">
+            <image xlink:href="./assets/images/out-domain.png"
+                   id="extent-cloud"
+                   height="70.8" width="120"
+                   x="66%" y="12%"
+            ></image>
+            <text dx="68%" dy="18%" style="font-size: 14px; fill: #666;width: 20px;">
+              SP Partent Network
+            </text>
+          </g>
+          <!--本地的2个site-->
+          <g class="clouds">
+            <image xlink:href="./assets/images/site.png"
+                   id="site1"
+                   height="59" width="100"
+                   x="0%" y="48%"
+            ></image>
+            <text dx="2%" dy="53%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{localSite[0]["service-instance-name"]}}
+            </text>
+          </g>
+          <g *ngIf="!detailSites" class="clouds">
+            <image xlink:href="./assets/images/site.png"
+                   id="site2"
+                   height="59" width="100"
+                   x="25%" y="48%"
+            ></image>
+            <text dx="26%" dy="54%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{localSite[1]["service-instance-name"]}}
+            </text>
+          </g>
+          <!--外部的2个site-->
+          <g *ngIf="!detailSites" class="clouds">
+            <image xlink:href="./assets/images/site.png"
+                   id="site3"
+                   height="59" width="100"
+                   x="50%" y="48%"
+            ></image>
+            <text dx="52%" dy="54%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{outerSite[1]["service-instance-name"]}}
+            </text>
+          </g>
+          <g class="clouds">
+            <image xlink:href="./assets/images/site.png"
+                   id="site4"
+                   height="59" width="100"
+                   x="75%" y="48%"
+            ></image>
+            <text dx="80%" dy="54%" style="font-size: 14px; fill: #666;width: 20px;">
+              {{outerSite[0]["service-instance-name"]}}
+            </text>
+          </g>
+        </svg>
+      </div>
+  </div>
+
+</div>
diff --git a/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.spec.ts b/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.spec.ts
new file mode 100644 (file)
index 0000000..dc5d34d
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CcvpnDetailComponent } from './ccvpn-detail.component';
+
+describe('CcvpnDetailComponent', () => {
+  let component: CcvpnDetailComponent;
+  let fixture: ComponentFixture<CcvpnDetailComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ CcvpnDetailComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CcvpnDetailComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.ts b/usecaseui-portal/src/app/ccvpn-detail/ccvpn-detail.component.ts
new file mode 100644 (file)
index 0000000..c9d60ef
--- /dev/null
@@ -0,0 +1,368 @@
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { MyhttpService } from '../myhttp.service';
+import * as d3 from 'd3';
+
+@Component({
+  selector: 'app-ccvpn-detail',
+  templateUrl: './ccvpn-detail.component.html',
+  styleUrls: ['./ccvpn-detail.component.css']
+})
+export class CcvpnDetailComponent implements OnInit {
+
+  constructor(private myhttp:MyhttpService) { }
+
+  ngOnInit() {
+    // this.getDetails();
+    this.dataInit();
+    this.drawImages();
+  }
+
+  @Input() detailParams;
+  @Input() namesTranslate;
+  @Output() closeDetail = new EventEmitter();
+
+  sotnVpnInfo:any;
+  siteList=[];
+  siteGroupList=[];
+  dataInit(){
+    // 循环真实参数,对比名字转换配置文件,将真实参数名字改成通用名字
+    this.sotnVpnInfo = JSON.parse(this.detailParams.sotnvpnSer['input-parameters']).service.parameters.requestInputs;
+    for(let key in this.sotnVpnInfo){
+      for(let key2 in this.namesTranslate.sotnNameTranslate){
+        let partnames = this.namesTranslate.sotnNameTranslate[key2].split("_");
+        if(key.startsWith(partnames[0])&&key.endsWith(partnames[1])){
+          this.sotnVpnInfo[key2] = this.sotnVpnInfo[key];
+          break;
+        }
+      }        
+    }
+
+    this.siteList = this.detailParams.siteSer.map((item)=>{
+      return JSON.parse(item['input-parameters']).service.parameters.requestInputs;
+    })
+    this.siteList.forEach((oneSite,idex)=>{
+      oneSite["baseNames"]={};oneSite["cpeNames"]={};oneSite["wanportNames"]=[];
+      for(let key in oneSite){
+        let hasfind = false;
+        if(key == "baseNames" || key == "cpeNames" || key == "wanportNames"){ continue };
+        for(let key2 in this.namesTranslate.siteNameTranslate.baseNames){
+          if(key.endsWith(this.namesTranslate.siteNameTranslate.baseNames[key2])){
+            oneSite["baseNames"][key2] = oneSite[key];
+            hasfind = true;
+            break;
+          }
+        }
+        if(hasfind){ continue };
+        for(let key3 in this.namesTranslate.siteNameTranslate.cpeNames){
+          if(key.endsWith(this.namesTranslate.siteNameTranslate.cpeNames[key3])){
+            oneSite["cpeNames"][key3] = oneSite[key];
+            hasfind = true;
+            break;
+          }
+        }
+        if(hasfind){ continue };
+        let wanportStartName = key.split("_")[0];
+        // 先分组,后面再变换名字
+        let theItem =  oneSite["wanportNames"].find((item,index)=>{
+          if(item){
+            return Object.keys(item)[0].startsWith(wanportStartName)
+          }   
+        })
+        theItem?theItem[key]=oneSite[key]:oneSite["wanportNames"].push({[key]:oneSite[key]})
+      }
+      let wanportTs = Object.values(this.namesTranslate.siteNameTranslate.wanportNames);
+      oneSite["wanportNames"].forEach((item)=>{
+        for(let key in item){
+          let newName = wanportTs.find((name)=>{
+            return key.endsWith(name);
+          })
+          newName?item[newName]=item[key]:null;
+        }
+      })
+
+    })
+    
+    this.siteGroupList = this.detailParams.sdwanSer.map((item)=>{
+      return JSON.parse(item['input-parameters']).service.parameters.requestInputs;
+    })
+    this.siteGroupList.forEach((oneSiteGroup)=>{
+      for(let key in oneSiteGroup){
+        for(let key2 in this.namesTranslate.siteGroupNameTranslate){
+          let partnames = this.namesTranslate.siteGroupNameTranslate[key2].split("_");
+          if(key.startsWith(partnames[0])&&key.endsWith(partnames[1])){
+            oneSiteGroup[key2] = oneSiteGroup[key];
+            break;
+          }
+        }
+      }
+    })
+    console.log(this.siteList)
+    this.drawImage(this.siteList);
+  }
+
+  // site详情
+  siteDetailData={baseNames:{},cpeNames:{},wanportNames:[]};
+  siteDetail = false;
+  showSiteDetail(item){
+    this.siteDetail = true;
+    this.siteDetailData = item;
+  }
+
+  wanPortModal = false;
+  wanPortDetail = {};
+  showWanportDetail(item){
+    this.wanPortModal = true;
+    this.wanPortDetail = item;
+  }
+  handleCancel(){
+    this.wanPortModal = false;
+  }
+
+  // sitegroup详情
+
+  // site节点图形描绘
+  // site分类,根据site查tp pnf --> allotted-resource
+  localSite = [];//本地site
+  outerSite = [];//外部site
+  
+  getSiteAResource(){
+    return new Promise((res,rej)=>{
+      this.detailParams.siteSer.forEach((site)=>{
+        site["relationship-list"]["relationship"].find((item)=>{return item["related-to"]=="site-resource"})?this.localSite.push(site):this.outerSite.push(site);
+      })
+    
+      if(this.localSite[0]["service-instance-name"].startsWith("Dc")){
+        this.localSite.reverse();
+      }
+
+      if(this.outerSite[0]["service-instance-name"].startsWith("Dc")){
+        this.outerSite.reverse();
+      }
+
+      // 本地site获取tp pnf
+      this.localSite.forEach((site)=>{
+        let obj = {
+          customerId: this.detailParams.customer.id,
+          serviceType: this.detailParams.serviceType,
+          serviceId: site["service-instance-id"]
+        }
+        this.myhttp.getAllottedResource(obj)
+          .subscribe((data)=>{
+            // console.log(data);
+            let resource = data["allotted-resource"].find((item)=>{ return item["allotted-resource-name"]=="sotn ar"});
+            // console.log(resource);
+            let tps_pnfs = resource["relationship-list"]["relationship"].find((item)=>{ return item["related-to"]=="p-interface"})["relationship-data"];
+            // console.log(tps_pnfs);
+            // site.pnfname = tps_pnfs.find((item)=>{return item["relationship-key"]=="pnf.pnf-name"})["relationship-value"];
+            site.tpsitename = tps_pnfs.find((item)=>{return item["relationship-key"]=="p-interface.interface-name"})["relationship-value"];
+            // // 通过pnfname获取domain(network-resource);
+            // this.myhttp.getPnfDetail(site.pnfname)
+            //   .subscribe((data2)=>{
+            //     // console.log(data2);
+            //     let networkRelation = data2["relationship-list"]["relationship"].find((item)=>{ return item["related-to"]=="network-resource"})["relationship-data"];
+            //     site.domain = networkRelation.find((item)=>{return item["relationship-key"]=="network-resource.network-id"})["relationship-value"];
+            //     res("sites-domain");
+            //   })
+            res("sites-domain");
+          })
+      })
+    })   
+  }
+  //通过sotn 查vpn-id --> tp pnf --> allotted-resource
+  relation = {sotn:{
+    name:"sotn1",
+    vpns:[
+      {
+        name:"vpn1",
+        domain:"domain1",
+        site:"site1",
+        tps:[
+          {name:"tp1",lineto:"site1"},
+          {name:"tp2",lineto:"domain1"}
+        ]
+      },
+      {
+        name:"vpn2",
+        domain:"domain2",
+        site:"site2",
+        tps:[
+          {name:"tp3",lineto:"site2"},
+          {name:"tp4",lineto:"domain2"}
+        ]
+      }
+    ]
+  }};
+
+  vpns = [{name: "", tps: [], domain: "", sitetpname: "", othertpname: ""}];
+  getSotnAresource(){
+    return new Promise((res,rej)=>{
+      let connectivityId = this.detailParams.sotnvpnSer["relationship-list"]["relationship"]
+                            .find((item)=>{return item["related-to"]=="connectivity"})["relationship-data"]
+                            .find((item2)=>{return item2["relationship-key"]=="connectivity.connectivity-id"})["relationship-value"];
+      this.myhttp.getSotnConnectivity(connectivityId)
+        .subscribe((data)=>{
+          // console.log(data);  //默认一个connectivityId只能查到一个connectivity
+          let vpns = data.connectivity[0]["relationship-list"]["relationship"]
+                      .filter((item)=>{ return item["related-to"]=="vpn-binding"})
+                      .map((item2)=>{return item2["relationship-data"].find((item3)=>{return item3["relationship-key"]=="vpn-binding.vpn-id"})["relationship-value"]});         
+          console.log(vpns);
+          this.detailParams.sotnvpnSer.vpns = vpns.map((item)=>{return {name:item}});
+          this.detailParams.sotnvpnSer.vpns.forEach((vpn,index)=>{
+            this.myhttp.getVpnBinding(vpn.name)
+              .subscribe((data2)=>{
+                // console.log(data2); //默认一个vpnid只能查到一个vpnbinding
+                let tps_pnfs = data2["vpn-binding"][0]["relationship-list"]["relationship"]
+                                .filter((item)=>{ return item["related-to"]=="p-interface"})
+                                .map((item2)=>{return item2["relationship-data"]});
+                let pnfname = tps_pnfs.map((item)=>{return item.find((item2)=>{return item2["relationship-key"]=="pnf.pnf-name"})["relationship-value"]});
+                let tpnames = tps_pnfs.map((item)=>{return item.find((item2)=>{return item2["relationship-key"]=="p-interface.interface-name"})["relationship-value"]});
+                // console.log(pnfname)
+                // console.log(tpnames)
+                vpn.tps = tpnames;
+                // let thissite = this.localSite.find((item)=>{return item.pnfname == pnfname[0]}); //查找site上pnfname相同的项,即同domain
+                // console.log(thissite);
+                // thissite.tpsotnname = tpsotnnames.find((item)=>{return item!=thissite.tpsitename});
+                // 通过pnfname获取domain(network-resource);
+                this.myhttp.getPnfDetail(pnfname[0])
+                  .subscribe((data2)=>{
+                    // console.log(data2);
+                    let networkRelation = data2["relationship-list"]["relationship"].find((item)=>{ return item["related-to"]=="network-resource"})["relationship-data"];
+                    vpn.domain = networkRelation.find((item)=>{return item["relationship-key"]=="network-resource.network-id"})["relationship-value"];
+                    if(this.localSite[index]){
+                      vpn.sitetpname = this.localSite.find((site)=>{return tpnames.includes(site.tpsitename)}).tpsitename;
+                      console.log(tpnames)
+                      console.log(vpn.sitetpname)
+                      vpn.othertpname = tpnames.find((name)=>{return name != vpn.sitetpname});
+                    }else{
+                      vpn.sitetpname = this.localSite[0].tpsitename;
+                      vpn.othertpname = tpnames.find((name)=>{return name != vpn.sitetpname});
+                    }
+
+                    this.vpns = this.detailParams.sotnvpnSer.vpns;
+                    res("sotn-domain");
+                    // console.log(vpn);
+                  })
+               
+              })
+          })
+        })
+    })
+  }
+  
+  drawImages(){
+
+    this.getSiteAResource().then((data)=>{
+      console.log(data);
+      return this.getSotnAresource()
+    }).then((data)=>{
+      console.log(data);
+      console.log(this.localSite);
+      this.detailSites = this.detailParams.sotnvpnSer.Type == "CCVPN"?false:true;
+      this.detailParams.sotnvpnSer.Type == "CCVPN"?null:this.detailLines.length = this.detailLines.length-3;
+      // 当只有一个vpn的时候
+      if(this.detailParams.sotnvpnSer.Type == "CCVPN" && this.vpns.length == 1){
+        let line =  {
+            "x1":"32%","y1":"12%","x2":"32%","y2":"50%"//t2--site2   当本地云只有一朵的时候,tp2与本地site2相连 
+          }
+        this.detailLines.length = this.detailLines.length-6;
+        this.detailLines.push(line);
+        // 当本地site有两个的时候
+        if(this.localSite.length==2){
+          let line = {
+            "x1":"40%","y1":"52%","x2":"52%","y2":"52%"//site2--site3
+          }
+          this.detailLines.push(line);
+        }
+        // 当外部site有两个的时候
+        if(this.outerSite.length==2){
+          let line = {
+            "x1":"75%","y1":"20%","x2":"60%","y2":"50%"//out-domain--site3
+          }
+          this.detailLines.push(line);
+        }
+      }
+    })
+    // let allnodes = [this.getSiteAResource(),this.getSotnAresource()];
+    // Promise.all(allnodes).then((data)=>{
+    //   console.log(data)
+    //   console.log(this.localSite);
+
+
+    // })
+  }
+
+  detailSites=false;
+  detailLines=[ //详情拓扑图连线的坐标
+    {
+      "x1":"5%","y1":"50%","x2":"17%","y2":"25%"//site1--tp1
+    },
+    {
+      "x1":"22%","y1":"20%","x2":"17%","y2":"25%"//tp1--domian1
+    }
+    ,
+    {
+      "x1":"26%","y1":"15%","x2":"30%","y2":"12%"//domian1--tp2
+    },
+
+    {
+      "x1":"80%","y1":"20%","x2":"85%","y2":"50%"//out-domain--site4
+    },
+
+    {
+      "x1":"50%","y1":"22%","x2":"45%","y2":"28%"//tp4--domian2
+    },
+    {
+      "x1":"40%","y1":"11%","x2":"50%","y2":"15%"//domian2--tp3
+    },
+    {
+      "x1":"32%","y1":"11%","x2":"41%","y2":"11%"//tp2--tp3
+    },
+
+    {
+      "x1":"45%","y1":"30%","x2":"35%","y2":"50%"//site2--tp4
+    },
+    {
+      "x1":"75%","y1":"20%","x2":"60%","y2":"50%"//out-domain--site3
+    },
+    {
+      "x1":"40%","y1":"52%","x2":"52%","y2":"52%"//site2--site3
+    }
+  ];
+  lines=[];
+  siteImage=[];
+  drawImage(sitelist){
+    let cx = 200;
+    let cy = 200;
+    let r = 150;
+    let startAngle = -210 * (Math.PI/180);
+    let step = sitelist.length > 1 ? 120/(sitelist.length-1) * (Math.PI/180) : 1;
+
+    this.lines = sitelist.map((item,index)=>{
+      let x = cx + Math.cos(startAngle - step*index)*r;
+      let y = cy + Math.sin(startAngle - step*index)*r;
+      return {img:"line",x1:cx,y1:cy,x2:x,y2:y}
+    })
+    this.siteImage = this.lines.map((item)=>{
+      return {img:"site",x:item.x2 - 25,y:item.y2 - 25}
+    })
+    console.log(this.siteImage,this.lines)
+  }
+  clickShow = false;
+  hoverShow = false;
+  toggleClick(){
+    this.clickShow = !this.clickShow;
+  }
+  hoverShowcould(){
+    this.hoverShow = true;
+  }
+  hoverHidecould(){
+    this.hoverShow = false;
+  }
+
+
+
+  goback(){
+    this.closeDetail.emit();
+  }
+
+}
diff --git a/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.css b/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.css
new file mode 100644 (file)
index 0000000..2ac88d3
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.outer{
+  width: 20%;
+  float: left;
+}
+.content{
+  width: 100px;
+  margin: 30px 0;
+}
+
+.tips{
+  margin: 20px auto;
+  padding:0 5px;
+  width: 100%;
+  height: 40px;
+  line-height: 40px;
+  border: 1px gainsboro solid;
+  border-radius: 10px;
+}
+.submit,.delete,.add{
+  padding:10px 20px;
+  width: 100px;
+  margin: 0 auto;
+  background: dodgerblue;
+  border: none;
+  border-radius: 10px;
+  color: #fff;
+  cursor: pointer;
+}
+/*.line-click{*/
+  /*cursor: pointer !important;*/
+/*}*/
+
+
+#tpContainer{
+  width:100%;
+  /*height: 80%;*/
+  float: left;
+}
+.model {
+  padding: 15px;
+  height: 100%;
+  width: 100%;
+}
+.model .creation {
+  /*margin-top:-4%;*/
+  background-color: #fff;
+  /*float: left;*/
+  width: 20%;
+  position: absolute;
+  right: 1%;
+  border-radius: 5px;
+  box-shadow: 0 0 10px #9e9e9e;
+  padding: 10px;
+  height: 80vh;
+  overflow: auto;
+}
+.model .creation .v_color{
+  height: 17px;
+  float: left;
+  margin-left: -11px;
+  margin-top: 5px;
+  border-left: 4px #3fa8eb solid;
+}
+.w_font4{
+  font-weight: 400;
+}
+.title-span{
+  margin-left: 10%;
+  font-size: 12px;
+}
+.red-span{
+  color: red;
+  margin-right: 3px;
+}
+.choose li nz-select,.choose li input{
+  display: block !important;
+  margin: 5px 10% 15px;
+  width: 80%;
+}
+
+
+
diff --git a/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.html b/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.html
new file mode 100644 (file)
index 0000000..4fbe487
--- /dev/null
@@ -0,0 +1,135 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 class="model">
+  <!--图表-->
+  <div class="tips">
+    请根据以下操作,来配置您的网络
+  </div>
+  <button nz-button nzType="primary" style="margin-top: 2px;display: block" (click)="showForm()">Add Link</button>
+  <div id="tpContainer" style="overflow: hidden;"></div>
+  <!--弹出框-->
+  <div class="creation" id="d3_form" *ngIf="isVisible==true">
+    <span class="v_color"></span>
+    <h3 class="w_font4">Set Attribtes</h3>
+    <ul class="choose">
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Link Name </span>
+        <input nz-input [(ngModel)]="linkName" maxlength="20">
+      </li>
+    </ul>
+    <h4>Left Port</h4>
+    <ul class="choose">
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Network </span>
+        <nz-select [(ngModel)]="networkVal1" nzShowSearch nzAllowClear (ngModelChange)="network1Change($event)">
+          <nz-option *ngFor="let option of networkOption" [nzLabel]="option.network" [nzValue]="option.network"></nz-option>
+        </nz-select>
+      </li>
+      <li>
+       <span class="title-span"> <span class="red-span">*</span>Node </span>
+        <nz-select  [(ngModel)]="selectedNode1" nzShowSearch nzAllowClear (ngModelChange)="node1Change($event)">
+          <nz-option *ngFor="let node of nodeOption1[networkVal1]" [nzValue]="node" [nzLabel]="node"></nz-option>
+        </nz-select>
+      </li>
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Terminal Point </span>
+        <!-- <input  nz-input id="city-one" value=""> -->
+        <nz-select [(ngModel)]="selecteTpName1" nzShowSearch nzAllowClear>
+          <nz-option *ngFor="let tp of tpOption1" [nzValue]="tp" [nzLabel]="tp"></nz-option>
+        </nz-select>
+      </li>
+    </ul>
+    <h4>Right Port</h4>
+    <label nz-checkbox [(ngModel)]="inputshow">Partner Network</label>
+    <ul class="choose">
+      <li>
+        <span class="title-span"><span *ngIf="inputshow" class="red-span">*</span>Host Url</span>
+        <input nz-input [(ngModel)]="cloudUrl" [disabled]='!inputshow' [attr.disabled] ='!inputshow?true:undefined'>
+      </li>
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Network </span>
+        <input  nz-input *ngIf="inputshow" [(ngModel)]="cloudNetwork">
+        <nz-select *ngIf="!inputshow" [(ngModel)]="networkVal2" nzShowSearch nzAllowClear (ngModelChange)="network2Change($event)">
+          <nz-option *ngFor="let option of networkOption" [nzLabel]="option.network" [nzValue]="option.network"> </nz-option>
+        </nz-select>
+      </li>
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Node </span>
+        <input  nz-input *ngIf="inputshow" [(ngModel)]="cloudNode">
+        <nz-select *ngIf="!inputshow" [(ngModel)]="selectedNode2" nzShowSearch nzAllowClear (ngModelChange)="node2Change($event)">
+          <nz-option *ngFor="let node of nodeOption1[networkVal2]" [nzValue]="node" [nzLabel]="node"></nz-option>
+        </nz-select>
+      </li>
+      <li>
+        <span class="title-span"><span class="red-span">*</span>Terminal Point </span>
+        <input  nz-input *ngIf="inputshow" [(ngModel)]="cloudTp">
+        <nz-select *ngIf="!inputshow" [(ngModel)]="selecteTpName2" nzShowSearch nzAllowClear>
+          <nz-option *ngFor="let tp of tpOption2" [nzValue]="tp" [nzLabel]="tp"></nz-option>
+        </nz-select>
+      </li>
+    </ul>
+    <button nz-button nzType="primary" nzSize="small" style="width: 60px;" (click)="submitForm()">OK</button>
+    <button nz-button nzType="default" nzSize="small" style="width: 60px;" (click)="hideForm()">Cancel</button>
+  </div>
+  <div class="creation" id="delbox" *ngIf="delBoxisVisible==true">
+    <span class="v_color"></span>
+    <h3 class="w_font4">Set Attribtes</h3>
+    <ul class="choose">
+      <li>
+        <span class="title-span">Link Name </span>
+        <input nz-input [(ngModel)]="delLinkname" disabled="disabled">
+      </li>
+    </ul>
+    <h4>Left Port</h4>
+    <ul class="choose">
+      <li>
+        <span class="title-span">Network </span>
+        <input nz-input [(ngModel)]="delNetwork1" disabled="disabled">
+      </li>
+      <li>
+        <span class="title-span">Node </span>
+        <input nz-input [(ngModel)]="delNode1" disabled="disabled">
+      </li>
+      <li>
+        <span class="title-span">Terminal Point </span>
+        <input nz-input [(ngModel)]="delTp1" disabled="disabled">
+      </li>
+    </ul>
+    <h4>Right Port</h4>
+    <ul class="choose">
+      <li *ngIf="delcloud">
+        <span class="title-span">Host Url</span>
+        <input nz-input [(ngModel)]="delcloudUrl" disabled="disabled">
+      </li>
+      <li>
+        <span class="title-span">Network </span>
+        <input nz-input [(ngModel)]="delNetwork2" disabled="disabled">
+      </li>
+      <li>
+      <span class="title-span">Node </span>
+      <input nz-input [(ngModel)]="delNode2" disabled="disabled">
+      </li>
+      <li>
+        <span class="title-span">Terminal Point </span>
+        <input nz-input [(ngModel)]="delTp2" disabled="disabled">
+      </li>
+    </ul>
+    <button nz-button nzType="primary" nzSize="small" class="del-button" style="width: 90px;" (click)="delLink()" *ngIf="!delcloud">delete Link</button>
+    <button nz-button nzType="primary" nzSize="small" class="del-button" style="width: 90px;" (click)="delCloudLink()" *ngIf="delcloud">delete Link</button>
+    <button nz-button nzType="default" nzSize="small" class="del-button" style="width: 60px;" (click)="hideForm()">Cancel</button>
+  </div>
+</div>
+
diff --git a/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.spec.ts b/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.spec.ts
new file mode 100644 (file)
index 0000000..03cc506
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CcvpnNetworkComponent } from './ccvpn-network.component';
+
+describe('CcvpnNetworkComponent', () => {
+  let component: CcvpnNetworkComponent;
+  let fixture: ComponentFixture<CcvpnNetworkComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ CcvpnNetworkComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CcvpnNetworkComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.ts b/usecaseui-portal/src/app/ccvpn-network/ccvpn-network.component.ts
new file mode 100644 (file)
index 0000000..0174aa7
--- /dev/null
@@ -0,0 +1,1195 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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, EventEmitter, OnInit, Output} from '@angular/core';
+import * as d3 from 'd3';
+import * as $ from 'jquery';
+import {networkHttpservice} from '../networkHttpservice.service';
+
+@Component({
+  selector: 'app-ccvpn-network',
+  templateUrl: './ccvpn-network.component.html',
+  styleUrls: ['./ccvpn-network.component.css']
+})
+export class CcvpnNetworkComponent implements OnInit {
+
+  constructor(private myhttp: networkHttpservice) {
+  }
+
+  ngOnInit() {
+    var thisNg = this;
+    thisNg.getD3Data();
+
+
+    //本地云TP端口断开连线 ,直接点击线可删除连线
+    $('#tpContainer').on('click', '.line-local', function () {
+      thisNg.isVisible = false;
+      thisNg.delBoxisVisible = true;
+      thisNg.delcloud = false;
+
+      thisNg.delTp1 = $(this).attr('data-tp1');
+      thisNg.delTp2 = $(this).attr('data-tp2');
+      thisNg.delNode1 = $(this).attr('data-node1');
+      thisNg.delNode2 = $(this).attr('data-node2');
+      thisNg.delVersion = $(this).attr('data-version');
+      thisNg.delLinkname = $(this).attr('data-link');
+
+      thisNg.delLinkIndex = $(this);
+      let dataD3 = thisNg.d3Data;
+      for (let p = 0; p < dataD3.length; p++) {//判断两个tp端口分别属于哪个Domain network
+        if (dataD3[p]['name'] == thisNg.delTp1) {
+          thisNg.network.push(dataD3[p]['source']['name']);
+        }
+        if (dataD3[p]['name'] == thisNg.delTp2) {
+          thisNg.network.push(dataD3[p]['source']['name']);
+        }
+      }
+      thisNg.delNetwork1 = thisNg.network[0];
+      thisNg.delNetwork2 = thisNg.network[1];
+    });
+
+    //外部云 断开连线 ,直接点击线可删除连线
+    $('#tpContainer').on('click', '.cloudline', function () {
+      thisNg.isVisible = false;
+      thisNg.delBoxisVisible = true;
+      thisNg.delcloud = true;
+
+      thisNg.delTp1 = $(this).attr('data-tp1');
+      thisNg.delTp2 = $(this).attr('data-tp2');
+      thisNg.delNode1 = $(this).attr('data-node1');
+      thisNg.delNode2 = $(this).attr('data-node2');
+      thisNg.delVersion = $(this).attr('data-version');
+      thisNg.delNetwork1 = $(this).attr('data-network');
+      thisNg.delNetwork2 =$(this).attr('data-cloudnetwork');
+      thisNg.delcloudUrl =$(this).attr('data-url');
+      thisNg.delLinkname = $(this).attr('data-link');
+      thisNg.aaiId =$(this).attr('data-aaiid');
+      thisNg.getCloudUrl(thisNg.aaiId,thisNg);
+    });
+  }
+
+  addLinkDisabled = true;
+  isVisible = false;
+  outCloudShow = false;
+  inputshow = false;
+  delBoxisVisible = false;
+
+  d3Data = [];//D3渲染需要的数据
+  logicalLinks = [];//logicalLinks接口返回的已有的连线数据
+  linkName=null;//连线的名字link-name
+  networkOption = [];//表单network下拉选框填充的数据
+  nodeOption1 = {};//node下拉选框填充的数据
+  tpOption1 = [];//node下拉选框填充的数据
+  tpOption2 = [];//node下拉选框填充的数据
+  networkVal1 = null;//network1下拉框默认数据
+  networkVal2 = null;//network2下拉框默认数据
+  selectedNode1 = null;//node1下拉框默认数据
+  selectedNode2 = null;//node2下拉框默认数据
+  selecteTpName1 = null;//TP1下拉框默认数据
+  selecteTpName2 = null;//TP2下拉框默认数据
+  cloudUrl = null;//外部云URL地址
+  cloudNetwork = null;//外部云network名称
+  cloudNode = null;//外部云Node名称
+  cloudTp = null;//外部云Tp名称
+  dataCloud=[];//外部云的信息
+  dataCloudLink=[];
+  aaiId="";
+  charge=-200;
+
+  //删除连线时 右侧框显示的数据
+  delLinkname=null;
+  delNetwork1 = null;
+  delNode1 = null;
+  delTp1 = null;
+  delcloudUrl = null;
+  delNetwork2 = null;
+  delNode2 = null;
+  delTp2 = null;
+  delVersion = null;
+  delLinkIndex = null;
+  network = [];
+  delcloud = false;
+
+  winWidth = $('.content').width();
+  winHeight = $('.content').height();
+
+
+  imgmap = {
+    '1': '../assets/images/cloud-county1.png',
+    '2': '../assets/images/cloud-city1.png',
+    '3': '../assets/images/cloud-out.png',
+  };
+  tpoption = {
+    container: '#tpContainer',
+    data: '',
+    width: 1000,
+    height: this.winHeight
+  };
+
+  showForm(): void {
+    if (this.addLinkDisabled == false) {
+      this.isVisible = true;
+      this.delBoxisVisible = false;
+    }
+  }
+
+  hideForm(): void {
+    this.isVisible = false;
+    this.delBoxisVisible = false;
+    this.linkName=null;
+    this.networkVal1 = null;//初始化network1下拉框默认数据
+    this.networkVal2 = null;//初始化network2下拉框默认数据
+    this.selectedNode1 = null;//初始化node1下拉框默认数据
+    this.selectedNode2 = null;//初始化node2下拉框默认数据
+    this.selecteTpName1 = null;//初始化TP1下拉框默认数据
+    this.selecteTpName2 = null;//初始化TP2下拉框默认数据
+    // this.localUrl=null;//本地云URL地址
+    this.cloudUrl = null;//外部云URL地址
+    this.cloudNetwork = null;//外部云network名称
+    this.cloudNode = null;//外部云Node名称
+    this.cloudTp = null;//外部云Tp名称
+  }
+
+
+  tpName=null;
+  tpNameStyle = {
+    'display':'none',
+    'left':'0',
+    'top':'0'
+  };
+  showtp($event,item){
+    console.log(111111111)
+    this.tpName = item;
+    this.tpNameStyle.display = 'block';
+  }
+  movetp($event,item){
+    this.tpNameStyle.left = $event.clientX  + "px";
+    this.tpNameStyle.top = $event.clientY - 35 + "px";
+  }
+  hidetp($event){
+    this.tpNameStyle.display = 'none';
+  }
+
+  //获取云图数据
+  getD3Data() {
+    this.myhttp.getNetworkD3Data()
+      .subscribe((data) => {
+        if(data.length==0){
+          this.addLinkDisabled = false;
+          return;
+        };
+        for(let ii=0;ii<data.length;ii++){
+          if(data[ii]["aaiId"]!=""){
+            this.dataCloud=data.splice(ii,1)
+          }
+        }
+        for (var i = 0; i < data.length; i++) {
+          let name1 = {}, name2 = {};
+          let nodess = [];
+          name1['name'] = name2['network'] = data[i]['networkId'];
+          name1['type'] = '1';
+          name1['source'] = i;
+          this.d3Data.push(name1);
+          for (let c = 0; c < data[i]["pnfs"].length; c++) {
+            nodess.push(data[i]['pnfs'][c]['pnfName']);
+            this.nodeOption1[name2['network']] = nodess;
+          }
+          this.networkOption.push(name2);
+        }
+        console.log(this.networkOption)
+        for (var i = 0; i < data.length; i++) {
+          let tp_length = data[i]['tps'].length;
+          for (var h = 0; h < tp_length; h++) {
+            let name2 = {};
+            let interface_name = data[i]['tps'][h]['interface-name'];
+            name2['name'] = interface_name;
+            name2['type'] = '2';
+            name2['source'] = i;
+            this.d3Data.push(name2);
+          }
+        }
+        for (let b = 0; b < this.d3Data.length; b++) {
+          this.d3Data[b]['target'] = b;
+        }
+        this.initPosition(this.d3Data);
+        setTimeout(this.render(this.d3Data, this.imgmap,this.dataCloud,this.charge,data),0)
+      }, (err) => {
+        console.log(err);
+      });
+
+  }
+
+  //获取云图初始的连线状态 getlogicalLinksData
+  getLinksData() {
+    this.myhttp.getLogicalLinksData()
+      .subscribe((data) => {
+        console.log(data["status"])
+        if (data["status"]=="FAILED") {
+          return;
+        }
+        for (let i = 0; i < data["logical-link"].length; i++) {
+            if(data["logical-link"][i]["relationship-list"]["relationship"].length>2){
+                this.dataCloudLink=data["logical-link"].splice(i,1);
+            }
+        }
+        console.log(this.dataCloudLink)
+        for (let i = 0; i < data["logical-link"].length; i++) {
+          let textval = [];
+          textval[0] = data['logical-link'][i]['relationship-list']['relationship'][0]['relationship-data'][1]['relationship-value'];//tp1
+          textval[1] = data['logical-link'][i]['relationship-list']['relationship'][1]['relationship-data'][1]['relationship-value'];//tp2
+          textval[2] = data['logical-link'][i]['resource-version'];//version
+          textval[3] = data['logical-link'][i]['relationship-list']['relationship'][0]['relationship-data'][0]['relationship-value'];//node1
+          textval[4] = data['logical-link'][i]['relationship-list']['relationship'][1]['relationship-data'][0]['relationship-value'];//node2
+          textval[5] = data['logical-link'][i]['operational-status'];
+          textval[6] = data['logical-link'][i]['link-name'];
+          this.logicalLinks.push(textval);
+          this.chose(textval);
+        }
+        if(this.dataCloudLink.length>0){
+          this.getcloudLine(this.dataCloudLink)
+        }
+      }, (err) => {
+        console.log(err);
+      });
+  }
+
+  //D3云图渲染
+  render(nodes, imgmap,dataCloud,charge,dataD3) {
+    var thiss = this;
+    var _this = this.tpoption,
+      width = null,
+      height = _this.height;
+    if (_this.width > 800) {
+      width = _this.width;
+    } else {
+      width = 800;
+    }
+
+    var str="";
+    for(var i=0;i<10;i++){
+      str+="<div>这是div"+i+"</div>"
+    }
+
+    if(dataD3.length<=4){
+      charge=-850;
+    }else if(dataD3.length>4 && dataD3.length<=6) {
+      charge=-700;
+    }else if(dataD3.length>6 && dataD3.length<=10) {
+      charge=-600;
+    }else {
+      charge=-150;
+    }
+    var svg = d3.select(_this.container).append('svg')
+        .attr('width', width)
+        .attr('height', height)
+        .attr('id', 'content-svg')
+        .style('pointer-events', 'all'),
+      graph = svg.append('g').attr('class', 'graph').attr('id', 'graph'),
+
+      _g_nodes = graph.selectAll('g.node')
+        .data(nodes)
+        .enter()
+        .append('g')
+        .style('display', function (d) {
+          var display = 'block';
+          switch (d.type) {
+            case '1':
+              display = 'none';
+              break;
+            case '2':
+              display = 'none';
+              break;
+            default:
+              break;
+          }
+          return display;
+        })
+        .style('cursor', 'pointer')
+        .attr('class', 'node'),
+
+      _g_lines = graph.selectAll('line.line')
+        .data(nodes)
+        .enter()
+        .append('g')
+        .style('display', 'none')
+        .attr('class', 'line');
+
+
+    _g_lines.append('line')
+      .style('stroke', '#93c62d'
+      )
+      .style('stroke-width', 2);
+
+    _g_nodes.append('image')
+      .attr('width', function (d) {
+        var width = 40;
+        switch (d.type) {
+          case '1':
+            width = 4.4 * width;
+            break;
+          case '2':
+            width = 0.12 * width;
+            break;
+          default:
+            break;
+        }
+        return width;
+      })
+      .attr('height', function (d) {
+        var height = 20;
+        switch (d.type) {
+          case '1':
+            height = 3.5 * height;
+            break;
+          case '2':
+            height = 0.2 * height;
+            break;
+          default:
+            break;
+        }
+        return height;
+      })
+      .attr('xlink:href', function (d) {
+        return imgmap[d.type];
+      });
+
+    _g_nodes.append('text')
+      .text(function (d) {
+        return d.name;
+      })
+      .style('transform', function (d) {
+        var x = null;
+        var y = null;
+        switch (d.type) {
+          case '1':
+            x = 7;
+            y = -7;
+            break;
+          case '2':
+            x = 1;
+            y = -2;
+            break;
+          default:
+            break;
+        }
+        return 'translate(' + x + '%,' + y + '%)';
+      })
+      .style('font-size', function (d) {
+        var size = 14;
+        switch (d.type) {
+          case '1':
+            size = 14;
+            break;
+          case '2':
+            size = 12;
+            break;
+          default:
+            break;
+        }
+        return size;
+      })
+      .style('fill', function (d) {
+        var color = '#666';
+        switch (d.type) {
+          case '1':
+            color = '#666';
+            break;
+          case '2':
+            color = '#666';
+            break;
+          default:
+            break;
+        }
+        return color;
+      })
+      .style('font-weight', '500');
+
+
+    //线上添加自定义属性
+    _g_lines.each(function (d, i) {
+      var _this = d3.select(this);
+      if (d.name) {
+        _this.attr('data-text', d.name);
+      }
+    });
+    var force = d3.layout.force()
+      .size([1000,this.winHeight])
+      .linkDistance(5)
+      // .theta(0)
+      .charge(charge)
+      .nodes(nodes)
+      .links(nodes)
+      .start();
+    // let distanceMax2=1;
+    // force.distanceMax = function(_) {
+    //   return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
+    // };
+    //添加拖拽行为
+    // _g_nodes.call(this.getDragBehavior(force));
+
+
+    force.on('tick', function (d) {
+      nodes.forEach(function(d,i){
+
+        d.x = d.x - 25 < 0     ? 25 : d.x ;
+        d.x = d.x + 25 > width ? width - 25 : d.x ;
+        d.y = d.y - 15 < 0      ? 15 : d.y ;
+        d.y = d.y + 15> height ? height - 15 : d.y ;
+      });
+      if(force.alpha()<=0.1){
+
+
+        _g_nodes.style('display', function (d) {
+
+
+          var display = 'block';
+          switch (d.type) {
+            case '1':
+              display = 'block';
+              break;
+            case '2':
+              display = 'none';
+              break;
+            default:
+              break;
+          }
+          return display;
+        });
+
+      _g_lines.select('line')
+        .attr('x1', function (d) {
+          return d.source.x;
+        })
+        .attr('y1', function (d) {
+          return d.source.y;
+        })
+        .attr('x2', function (d) {
+          return d.target.x;
+        })
+        .attr('y2', function (d) {
+          return d.target.y;
+        });
+
+      _g_nodes.attr('transform', function (d) {
+        // console.log(d)
+        // if(d["type"]==1){
+        //   d["x"]=400;
+        //   d["y"]=400;
+        // }else {
+        //   d["x"]=d["x"];
+        //   d["y"]=d["y"]
+        // }
+        var image = d3.select(this).select('image')[0][0],
+          halfWidth = parseFloat(image.attributes[0]['value']) / 2,
+          halfHeight = parseFloat(image.attributes[1]['value']) / 2;
+
+
+        return 'translate(' + (d.x - halfWidth) + ',' + (d.y - halfHeight) + ')';
+      });
+
+      _g_nodes.select('text').attr('dy', function (d) {
+        var image = this.previousSibling,
+          height = parseFloat(image.attributes[1]['value']),
+          fontSize = 12;
+        return height + 1.5 * fontSize;
+      });
+
+
+      }
+
+    });
+
+    force.on('end', function () {
+
+      force.stop();
+      if(dataCloud.length>0){
+        thiss.getoutCloud(dataCloud,imgmap);
+      }
+      thiss.getLinksData();
+      thiss.addLinkDisabled = false;
+    });
+
+  };
+
+  //拓扑图拖拽效果
+  getDragBehavior(force) {
+
+    return d3.behavior.drag()
+      .origin(function (d) {
+        return d;
+      })
+      .on('dragstart', dragstart)
+      .on('drag', dragging)
+      .on('dragend', dragend);
+
+    function dragstart(d) {
+      d3.event.sourceEvent.stopPropagation();
+      d3.select(this).classed('dragging', true);
+      force.start();
+    }
+
+    function dragging(d) {
+      d.x = d3.event.x;
+      d.y = d3.event.y;
+    }
+
+    function dragend(d) {
+      d3.select(this).classed('dragging', false);
+    }
+
+  }
+
+  //初始化节点位置
+  initPosition(datas) {
+    let origin = [this.tpoption.width / 2, this.tpoption.height / 2];
+    let points = this.getVertices(origin, Math.min(this.tpoption.width/2, this.tpoption.height/2), datas.length);
+    datas.forEach((item, i) => {
+      item.x = points[i].x;
+      item.y = points[i].y;
+    });
+  }
+
+  //根据多边形获取定位点
+  getVertices(origin, r, n) {
+    if (typeof n !== 'number') return;
+    var ox = origin[0];
+    var oy = origin[1];
+    var angle = 30 * n / n;
+    var i = 0;
+    var points = [];
+    var tempAngle = 0;
+    while (i < n) {
+      tempAngle = (i * angle * Math.PI) / 180;
+      points.push({
+        x: ox - r * Math.sin(tempAngle),
+        y: oy - r * Math.cos(tempAngle),
+      });
+      i++;
+    }
+    return points;
+  }
+
+  //渲染外部云
+  getoutCloud(dataCloud,imgmap) {
+    var _this = this,
+      width;
+    let networkId=dataCloud[0]["networkId"];
+    if (_this.tpoption.width > 800) {
+      width = _this.tpoption.width;
+    } else {
+      width = 800;
+    }
+    var svg = d3.select('#content-svg');
+    svg.append('g').attr('class', 'out').attr('id', 'out').style({'display': 'block'}).attr('transform', 'translate(' + (width - 200) + ',0)');
+    var out = d3.select('#out');
+    out.append('image').style('width', '200').style('height', '118').attr('xlink:href', imgmap['3']);
+    out.append('text').text(networkId)
+      .style('transform', 'translate(0,0)')
+      .style('font-size', '16')
+      .style('font-weight', '400')
+      .attr('dx', '40')
+      .attr('dy', '70')
+      .style('fill', '#666');
+  }
+
+  //外部云连接
+  getcloudLine(dataCloudLink) {
+    let textval = [];
+    textval[0] = dataCloudLink[0]['relationship-list']['relationship'][0]['relationship-data'][1]['relationship-value'];//tp1
+    textval[1] = dataCloudLink[0]['relationship-list']['relationship'][1]['relationship-data'][1]['relationship-value'];//tp2
+    textval[2] = dataCloudLink[0]['resource-version'];//version
+    textval[3] = dataCloudLink[0]['relationship-list']['relationship'][0]['relationship-data'][0]['relationship-value'];//node1
+    textval[4] = dataCloudLink[0]['relationship-list']['relationship'][1]['relationship-data'][0]['relationship-value'];//node2
+    textval[5] = dataCloudLink[0]['operational-status'];//status
+    textval[6] = dataCloudLink[0]['relationship-list']['relationship'][2]['relationship-data'][0]['relationship-value'];//aaiId
+    textval[7] =this.dataCloud[0]["networkId"];
+    console.log(this.dataCloud);
+    let dataD3=this.d3Data;
+    for (let p = 0; p < dataD3.length; p++) {//判断两个tp端口分别属于哪个Domain network
+      if (dataD3[p]['name'] ==  textval[0]) {
+        textval[8] =dataD3[p]['source']['name'];//network1
+      }
+    }
+    textval[9] =dataCloudLink[0]["link-name"];
+
+    let lines_json = {};
+    var _this = this,
+      width;
+    if (_this.tpoption.width > 800) {
+      width = _this.tpoption.width;
+    } else {
+      width = 800;
+    }
+    for (let i = 0; i < $(".node").length; i++) {
+      if ($('.node').eq(i).find('text').html() == textval[0]) {
+        //获取二级的x,y坐标
+        $('.node').eq(i).show();
+        var translates = $('.node').eq(i).css('transform');
+        lines_json['x1'] = parseFloat(translates.substring(7).split(',')[4]);
+        lines_json['y1'] = parseFloat(translates.substring(7).split(',')[5]);
+        lines_json['x2'] = width - 100;
+        lines_json['y2'] = 100;
+      }
+    }
+    var x1 = lines_json['x1'];
+    var y1 = lines_json['y1'];
+    var x2 = lines_json['x2'];
+    var y2 = lines_json['y2'];
+    var color='#14bb58';
+    if(textval[5]=="up"){
+      color='#14bb58';
+    }else {
+      color='red';
+    }
+    var line = "<line class='line cloudline ' stroke='"+color+"' stroke-width='2' style='cursor:pointer'></line>";
+    var svg = d3.select('#graph');
+    $(".cloudline").remove();
+    $('#graph').prepend(line);
+    $('.cloudline').attr({
+      x1: x1 + 100,
+      y1: y1 + 10,
+      x2: x2,
+      y2: y2,
+      'data-tp1': textval[0],
+      'data-tp2': textval[1],
+      'data-version': textval[2],
+      'data-node1':textval[3],
+      'data-node2':textval[4],
+      'data-network':textval[8],
+      'data-cloudnetwork':textval[7],
+      'data-url':"",
+      'data-aaiid':textval[6],
+      "data-link":textval[9]
+    });
+    svg.html(svg.html());
+  }
+
+  //查询外部云host url地址
+  getCloudUrl(aaiId,thisNg){
+    this.myhttp.queryCloudUrl(aaiId)
+      .subscribe((data) => {
+        thisNg.delcloudUrl=data["service-url"];
+      }, (err) => {
+        console.log(err);
+      });
+  }
+
+
+  //右侧表单下拉选框数据填充 三级联动
+  //Left Port
+  network1Change(value: string): void {
+    this.selectedNode1 = this.nodeOption1[value][0];
+    this.getPInterfaces1();
+  }
+
+  node1Change(): void {
+    this.getPInterfaces1();
+  }
+
+  //获取指定node下的TP数据
+  getPInterfaces1() {
+    let params = {
+      pnfName: this.selectedNode1,
+    };
+    this.myhttp.getPInterfacesData1(params)
+      .subscribe((data) => {
+        this.tpOption1 = [];
+        for (let i = 0; i < data.length; i++) {
+          let tpName = data[i]['interface-name'];
+          this.tpOption1.push(tpName);
+        }
+        this.selecteTpName1 = this.tpOption1[0];
+      }, (err) => {
+        // console.log(err);
+      });
+  }
+
+  //Right Port
+  network2Change(value: string): void {
+    this.selectedNode2 = this.nodeOption1[value][0];
+    this.getPInterfaces2();
+  }
+
+  node2Change(): void {
+    this.getPInterfaces2();
+  }
+
+  //获取指定node下的TP数据
+  getPInterfaces2() {
+    let params = {
+      pnfName: this.selectedNode2,
+    };
+    this.myhttp.getPInterfacesData2(params)
+      .subscribe((data) => {
+        this.tpOption2 = [];
+        for (let i = 0; i < data.length; i++) {
+          let tpName = data[i]['interface-name'];
+          this.tpOption2.push(tpName);
+        }
+        this.selecteTpName2 = this.tpOption2[0];
+      }, (err) => {
+        // console.log(err);
+      });
+  }
+
+  //提交表单,连线
+  submitForm(): void {
+    //当页面ONAP未选中,即本地云端TP连线
+    var _thiss = this;
+    if (this.inputshow == false) {
+      if (this.linkName == null || this.networkVal1 == null || this.selectedNode1 == null || this.selecteTpName1 == null || this.networkVal2 == null || this.selectedNode2 == null || this.selecteTpName2 == null) {
+        alert('服务端口不能为空,请选择端口信息');
+        return;
+      } else if (this.networkVal1 == this.networkVal2) {
+        alert('同一云服务下的TP端口不能相连!');
+        return;
+      }
+      let tp_links = [],
+        tp1 = this.selecteTpName1,
+        tp2 = this.selecteTpName2;
+      for (let i = 0; i < $(".line-local").length; i++) {
+        let data_text1 = $('.line-local').eq(i).attr('data-tp1');
+        let data_text2 = $('.line-local').eq(i).attr('data-tp2');
+        tp_links.push(data_text1);
+        tp_links.push(data_text2);
+      }
+      if (tp_links.indexOf(tp1) != -1 || tp_links.indexOf(tp2) != -1) {
+        alert('此端口号连线已存在!');
+        return;
+      }
+      this.createTpLinks();
+
+    } else {
+      //当页面ONAP选中,即创建外部云,连线
+      if (this.linkName == null || this.networkVal1 == null || this.selectedNode1 == null || this.selecteTpName1 == null || this.cloudUrl == null || this.cloudNetwork == null || this.cloudNode == null || this.cloudTp == null) {
+        alert('服务端口信息不能为空,请填写完整的端口信息');
+        return;
+      }
+      let tp_links = [],
+        tp1 = this.selecteTpName1;
+      for (let i = 0; i < $(".line-local").length; i++) {
+        let data_text1 = $('.line-local').eq(i).attr('data-tp1');
+        tp_links.push(data_text1);
+      }
+      if (tp_links.indexOf(tp1) != -1) {
+        alert('此端口号连线已存在!');
+        return;
+      }
+      Promise
+        .all([this.createCloudNetwork(), this.createPnfs(), this.createCloudTp(), this.createCloudLinks()])
+        .then(function (results) {
+          console.log(results);
+          if (results.indexOf('FAIL') == -1) {
+            // _thiss.queryOutCloudLink();
+            _thiss.outCloudShow = true;
+            _thiss.outCloud(_thiss.imgmap);
+            setTimeout(_thiss.cloudLine(_thiss.networkVal1, _thiss.selectedNode1, _thiss.selecteTpName1, _thiss.cloudUrl, _thiss.cloudNetwork, _thiss.cloudNode, _thiss.cloudTp, 121211,"up",_thiss.linkName), 0);
+            _thiss.hideForm();
+          } else {
+            console.log('失败');
+          }
+        });
+
+    }
+  }
+
+  //创建tp连线 调用接口createLink
+  createTpLinks() {
+    let params = {
+      'link-name': this.linkName,
+      'in-maint': false,
+      'link-type': 'cross-link',
+      'speed-value': '10000',
+      'operational-status': 'up',
+      'relationship-list': {
+        'relationship': [
+          {
+            'related-to': this.selecteTpName1,
+            'related-link': '/aai/v13/network/pnfs/pnf/' + this.selectedNode1 + '/p-interfaces/p-interface/' + this.selecteTpName1
+          },
+          {
+            'related-to': this.selecteTpName2,
+            'related-link': '/aai/v13/network/pnfs/pnf/' + this.selectedNode2 + '/p-interfaces/p-interface/' + this.selecteTpName2
+          }
+        ]
+      }
+    };
+    this.myhttp.createLink(params)
+      .subscribe((data) => {
+        if (data["status"] == 'SUCCESS') {
+          this.queryAddLink();
+        }
+      }, (err) => {
+        // console.log(err);
+        alert('系统忙,连接失败!');
+      });
+  }
+
+  //创建tp连接线后马上查询新增的连线
+  queryAddLink() {
+    let linkName=this.linkName,
+      selecteTpName1 = this.selecteTpName1,
+      selecteTpName2 = this.selecteTpName2,
+      selectedNode1 = this.selectedNode1,
+      selectedNode2 = this.selectedNode2;
+    let params = {
+      'link-name': selecteTpName1 + '_' + selecteTpName2,
+    };
+    this.myhttp.querySpecificLinkInfo(params)
+      .subscribe((data) => {
+        let version = data['resource-version'],
+          operational_status = data['operational-status'];
+        let textval = [selecteTpName1, selecteTpName2, version, selectedNode1, selectedNode2, operational_status,linkName];
+        this.hideForm();
+        this.chose(textval);
+      }, (err) => {
+        // console.log(err);
+        alert('系统忙,连接失败!');
+      });
+  }
+
+  //两个TP之间的连线 坐标获取
+  chose(textval) {
+    var lines_json = {};
+    lines_json['tp1'] = textval[0];
+    lines_json['tp2'] = textval[1];
+    lines_json['version'] = textval[2];
+    lines_json['node1'] = textval[3];
+    lines_json['node2'] = textval[4];
+    lines_json['status'] = textval[5];
+    lines_json['linkname'] = textval[6];
+    for (let i = 0; i < $(".node").length; i++) {
+      if ($('.node').eq(i).find('text').html() == textval[0]) {
+        $('.node').eq(i).show();
+        //获取二级的x,y坐标
+        var translates = $('.node').eq(i).css('transform');
+        lines_json['x1'] = parseFloat(translates.substring(7).split(',')[4]);
+        lines_json['y1'] = parseFloat(translates.substring(7).split(',')[5]);
+      }
+      if ($('.node').eq(i).find('text').html() == textval[1]) {
+        $('.node').eq(i).show();
+        var translates = $('.node').eq(i).css('transform');
+        lines_json['x2'] = parseFloat(translates.substring(7).split(',')[4]);
+        lines_json['y2'] = parseFloat(translates.substring(7).split(',')[5]);
+      }
+    }
+
+    this.addLine(lines_json);
+  }
+
+  //两个TP之间的连线 连线渲染
+  addLine(lines) {
+    let tp1 = lines.tp1;
+    let tp2 = lines.tp2;
+    let version = lines.version;
+    let node1 = lines.node1;
+    let node2 = lines.node2;
+    let status = lines.status;
+    let linkname = lines.linkname;
+    let x1 = lines.x1;
+    let y1 = lines.y1 + 5;
+    let x2 = lines.x2;
+    let y2 = lines.y2 + 5;
+    let color = '#14bb58';
+    if (status == 'up') {
+      color = '#14bb58';
+    } else {
+      color = 'red';
+    }
+    let line = '<line class=\'line line-local \' stroke=\'' + color + '\' stroke-width=\'2\' style=\'cursor:pointer\'></line>';
+    let svg = d3.select('#graph');
+    $('#graph').prepend(line);
+    $('.line').first().attr({
+      x1: x1,
+      y1: y1,
+      x2: x2,
+      y2: y2,
+      'data-tp1': tp1,
+      'data-tp2': tp2,
+      'data-version': version,
+      'data-node1': node1,
+      'data-node2': node2,
+      "data-link":linkname
+    });
+    svg.html(svg.html());
+  }
+
+  //创建外部云连线后,马上查询连线
+  queryOutCloudLink() {
+    let networkVal1 = this.networkVal1,
+      selectedNode1 = this.selectedNode1,
+      selecteTpName1 = this.selecteTpName1,
+      cloudUrl = this.cloudUrl,
+      cloudNetWork = this.cloudNetwork,
+      cloudNode = this.cloudNode,
+      cloudTp = this.cloudTp,
+      linkname=this.linkName;
+    let params = {
+      'link-name': linkname,
+    };
+    this.myhttp.querySpecificLinkInfo(params)
+      .subscribe((data) => {
+        let version = data['resource-version'];
+        let status = data['operational-status'];
+        let link_name = data['link-name'];
+        this.outCloudShow = true;
+        this.outCloud(this.imgmap);
+        setTimeout(this.cloudLine(networkVal1, selectedNode1, selecteTpName1, cloudUrl, cloudNetWork, cloudNode, cloudTp, version,status,link_name), 0);
+      }, (err) => {
+        // console.log(err);
+        alert('系统忙,连接失败!');
+      });
+  }
+
+  //新增外部云
+  outCloud(imgmap) {
+    var _this = this,
+      width;
+    if (_this.tpoption.width > 800) {
+      width = _this.tpoption.width;
+    } else {
+      width = 800;
+    }
+    var svg = d3.select('#content-svg');
+    svg.append('g').attr('class', 'out').attr('id', 'out').style({'display': 'block'}).attr('transform', 'translate(' + (width - 200) + ',0)');
+    var out = d3.select('#out');
+    out.append('image').style('width', '200').style('height', '118').attr('xlink:href', imgmap['3']);
+    out.append('text').text('Partner Network')
+      .style('transform', 'translate(0,0)')
+      .style('font-size', '16')
+      .style('font-weight', 'bold')
+      .attr('dx', '40')
+      .attr('dy', '70')
+      .style('fill', '#fff');
+  }
+
+  //新增 外部云连接
+  cloudLine(networkVal1, selectedNode1, selecteTpName1, cloudUrl, cloudNetWork, cloudNode, cloudTp, version,status,link_name) {
+    let lines_json = {};
+    var _this = this,
+      width;
+    if (_this.tpoption.width > 800) {
+      width = _this.tpoption.width;
+    } else {
+      width = 800;
+    }
+    for (let i = 0; i < $(".node").length; i++) {
+      if ($('.node').eq(i).find('text').html() == networkVal1) {
+        //获取二级的x,y坐标
+        var translates = $('.node').eq(i).css('transform');
+        lines_json['x1'] = parseFloat(translates.substring(7).split(',')[4]);
+        lines_json['y1'] = parseFloat(translates.substring(7).split(',')[5]);
+        lines_json['x2'] = width - 100;
+        lines_json['y2'] = 100;
+      }
+    }
+    var x1 = lines_json['x1'];
+    var y1 = lines_json['y1'];
+    var x2 = lines_json['x2'];
+    var y2 = lines_json['y2'];
+    var color='#14bb58';
+    if(status=="up"){
+      color='#14bb58';
+    }else {
+      color='red';
+    }
+    var line = "<line class='line cloudline ' stroke='"+color+"' stroke-width='2' style='cursor:pointer'></line>";
+    var svg = d3.select('#graph');
+    $(".cloudline").remove();
+    $('#graph').prepend(line);
+    $('.cloudline').attr({
+      x1: x1 + 100,
+      y1: y1 + 10,
+      x2: x2,
+      y2: y2,
+      'data-tp1': selecteTpName1,
+      'data-tp2': cloudTp,
+      'data-version': version,
+      'data-node1':selectedNode1,
+      'data-node2':cloudNode,
+      'data-network':networkVal1,
+      'data-cloudnetwork':cloudNetWork,
+      'data-url':cloudUrl,
+      "data-link":link_name
+    });
+    svg.html(svg.html());
+  }
+
+  //创建外部云,连线时调用以下4个接口:createCloudNetwork,createPnfs,createCloudTp,createCloudLinks
+  createCloudNetwork() {
+    let _thiss = this;
+    let params = {
+      'selflink': this.cloudUrl,
+      'network-id': this.cloudNetwork,
+      'provider-id': '',
+      'client-id': '',
+      'te-topo-id': ''
+    };
+    var pro = new Promise(function (resolve, reject) {
+      //做一些异步操作
+      _thiss.myhttp.createNetwrok(params)
+        .subscribe((data) => {
+          resolve(data["status"]);
+        }, (err) => {
+          console.log(err);
+        });
+    });
+    return pro;
+  }
+
+  createPnfs() {
+    let _thiss = this;
+    let params= {
+      "pnf-name": this.cloudNode,
+      "pnf-id": "",
+      "in-maint": "",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": {
+          "related-to": "network-resource",
+          "relationship-label": "tosca.relationships.network.LinksTo",
+          "related-link": "/aai/v13/network/network-resources/network-resource/"+this.cloudNetwork,
+          "relationship-data": {
+            "relationship-key": "network-resource.network-id",
+            "relationship-value": this.cloudNetwork
+          }
+        }
+      }
+    };
+    var pro = new Promise(function (resolve, reject) {
+      //做一些异步操作
+      _thiss.myhttp.createNetwrok(params)
+        .subscribe((data) => {
+          resolve(data["status"]);
+        }, (err) => {
+          console.log(err);
+        });
+    });
+    return pro;
+  }
+
+  createCloudTp() {
+    let _thiss = this;
+    let params= {
+      "interface-name": this.cloudTp,
+      "speed-value": "100000",
+      "in-maint": "true",
+      "network-ref": "",
+      "transparent": "",
+      "operational-status": "up",
+    };
+    let cloudNodeName=this.cloudNode;
+
+    var pro = new Promise(function (resolve, reject) {
+      //做一些异步操作
+      _thiss.myhttp.createTp(params,cloudNodeName)
+        .subscribe((data) => {
+          resolve(data["status"]);
+        }, (err) => {
+          // console.log(err);
+        });
+    });
+    return pro;
+  }
+
+  createCloudLinks() {
+    let _thiss = this;
+    let params={
+      "link-name":  this.linkName,
+      "in-maint": "",
+      "link-type": "",
+      "speed-value": "",
+      "relationship-list": {
+        "relationship" : [
+          {
+            "related-to": this.selecteTpName1,
+            "related-link": "/aai/v13/network/pnfs/pnf/"+this.selectedNode1+"/p-interfaces/p-interface/"+this.selecteTpName1
+          },
+          {
+            "related-to": this.cloudTp,
+            "related-link": "/aai/v13/network/pnfs/pnf/"+this.cloudNode+"/p-interfaces/p-interface/"+this.cloudTp
+          }
+        ]
+      }
+    };
+    var pro = new Promise(function (resolve, reject) {
+      //做一些异步操作
+      _thiss.myhttp.createCloudLink(params)
+        .subscribe((data) => {
+          resolve(data["status"]);
+        }, (err) => {
+          // console.log(err);
+        });
+    });
+    return pro;
+  }
+
+  //本地云TP端口 删除连线 调用接口deleteLink
+  delLink(): void {
+    let deltp1 = this.delTp1,
+      deltp2 = this.delTp2,
+      version = this.delVersion,
+      delLinkIndex = this.delLinkIndex;
+    let params = {
+      'logical-link': this.delLinkname,
+      'resource-version': version,
+    };
+    this.myhttp.deleteLink(params)
+      .subscribe((data) => {
+        if (data["status"] == 'SUCCESS') {
+          this.delLine(deltp1, deltp2);
+          console.log(delLinkIndex)
+          delLinkIndex.remove();
+        }
+      }, (err) => {
+        console.log(err);
+      });
+  }
+
+  delLine(val1, val2) {
+    for (let i = 0; i < $(".node").length; i++) {
+      if ($('.node').eq(i).find('text').html() == val1) {
+        $('.node').eq(i).hide();
+      }
+      if ($('.node').eq(i).find('text').html() == val2) {
+        $('.node').eq(i).hide();
+      }
+    }
+    this.delBoxisVisible = false;
+  }
+
+  //外部云 删除连线 调用接口deleteCloudLine
+  delCloudLink() : void {
+    let deltp1 = this.delTp1,
+      deltp2 = this.delTp2,
+      version = this.delVersion;
+    let params = {
+      'logical-link': this.delLinkname,
+      'resource-version': version,
+    };
+    this.myhttp.deleteLink(params)
+      .subscribe((data) => {
+        console.log(data)
+        if (data["status"] == 'SUCCESS') {
+          this.delLine(deltp1, deltp2);
+          $('.cloudline').remove();
+        }
+      }, (err) => {
+        console.log(err);
+      });
+  }
+
+}
diff --git a/usecaseui-portal/src/app/components/charts/bar/bar.component.html b/usecaseui-portal/src/app/components/charts/bar/bar.component.html
new file mode 100644 (file)
index 0000000..a7cd067
--- /dev/null
@@ -0,0 +1,18 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<p>
+  bar works!
+</p>
diff --git a/usecaseui-portal/src/app/components/charts/bar/bar.component.less b/usecaseui-portal/src/app/components/charts/bar/bar.component.less
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/usecaseui-portal/src/app/components/charts/bar/bar.component.spec.ts b/usecaseui-portal/src/app/components/charts/bar/bar.component.spec.ts
new file mode 100644 (file)
index 0000000..d979ffb
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { BarComponent } from './bar.component';
+
+describe('BarComponent', () => {
+  let component: BarComponent;
+  let fixture: ComponentFixture<BarComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ BarComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(BarComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/components/charts/bar/bar.component.ts b/usecaseui-portal/src/app/components/charts/bar/bar.component.ts
new file mode 100644 (file)
index 0000000..fa9ecbb
--- /dev/null
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-bar',
+  templateUrl: './bar.component.html',
+  styleUrls: ['./bar.component.less']
+})
+export class BarComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}
diff --git a/usecaseui-portal/src/app/components/charts/line/line.component.html b/usecaseui-portal/src/app/components/charts/line/line.component.html
new file mode 100644 (file)
index 0000000..9a43e28
--- /dev/null
@@ -0,0 +1,22 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 echarts 
+[initOpts]="initOpts"
+[options]="lineOption" 
+[merge]="updateOption"
+(chartInit)="chartInit($event)">
+  Line Chart
+</div>
diff --git a/usecaseui-portal/src/app/components/charts/line/line.component.less b/usecaseui-portal/src/app/components/charts/line/line.component.less
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/usecaseui-portal/src/app/components/charts/line/line.component.spec.ts b/usecaseui-portal/src/app/components/charts/line/line.component.spec.ts
new file mode 100644 (file)
index 0000000..afe7065
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LineComponent } from './line.component';
+
+describe('LineComponent', () => {
+  let component: LineComponent;
+  let fixture: ComponentFixture<LineComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ LineComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(LineComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/components/charts/line/line.component.ts b/usecaseui-portal/src/app/components/charts/line/line.component.ts
new file mode 100644 (file)
index 0000000..8bc8ebd
--- /dev/null
@@ -0,0 +1,79 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { SimpleChanges } from '@angular/core/src/metadata/lifecycle_hooks';
+
+@Component({
+  selector: 'app-line',
+  templateUrl: './line.component.html',
+  styleUrls: ['./line.component.less']
+})
+export class LineComponent implements OnInit {
+  // 图形数据
+  @Input() chartData;
+  // 初始化数据
+  @Input() initData;
+
+  constructor() { }
+
+  ngOnInit() {
+    this.initOpts = {
+      renderer: 'canvas',
+      height: this.initData.height,
+      width: this.initData.width
+    };
+    this.lineOption ={
+      tooltip : this.initData.option.tooltip,
+      icon:'circle',
+      legend: this.initData.option.legend,
+      grid: {
+          left: '1%',
+          right: '3%',
+          top: '10%',
+          bottom: '10%',
+          containLabel: true
+      },
+      xAxis: {
+        axisTick: {
+          show: false,
+        },
+        axisLine:{
+          show: false
+        },
+          data: ['01','02','04','06','08','10','12','14','16','18','20','22','24']
+      },
+      yAxis: {
+        axisTick: {
+          show: false,
+        },
+        axisLine:{
+          show: false
+        }
+      },
+      series : this.initData.option.series
+    }
+  }
+
+  ngOnChanges(changes:SimpleChanges){
+
+    // 当有实例的时候再执行,相当于第一次不执行下面方法
+    if(this.chartIntance){
+      this.chartDataChange()
+    }
+  }
+  // 初始化图形高度
+  initOpts:any;
+  // 折线图配置
+  lineOption:any;
+  // 实例对象
+  chartIntance:any;
+  // 数据变化
+  updateOption:any;
+  chartDataChange(){
+    this.updateOption = this.chartData;
+  }
+  chartInit(chart){
+    this.chartIntance = chart;
+  }
+
+
+
+}
diff --git a/usecaseui-portal/src/app/components/charts/pie/pie.component.html b/usecaseui-portal/src/app/components/charts/pie/pie.component.html
new file mode 100644 (file)
index 0000000..5f1e94c
--- /dev/null
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 echarts 
+[initOpts]="initOpts"
+[options]="pieOption" 
+[merge]="updateOption"
+(chartInit)="chartInit($event)"
+(chartMouseOver)="pieMouseOver($event)"
+(chartMouseOut)="pieMouseOut($event)">
+  Pie Chart
+</div>
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/components/charts/pie/pie.component.less b/usecaseui-portal/src/app/components/charts/pie/pie.component.less
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/usecaseui-portal/src/app/components/charts/pie/pie.component.spec.ts b/usecaseui-portal/src/app/components/charts/pie/pie.component.spec.ts
new file mode 100644 (file)
index 0000000..528da25
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PieComponent } from './pie.component';
+
+describe('PieComponent', () => {
+  let component: PieComponent;
+  let fixture: ComponentFixture<PieComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PieComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PieComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/components/charts/pie/pie.component.ts b/usecaseui-portal/src/app/components/charts/pie/pie.component.ts
new file mode 100644 (file)
index 0000000..8a5e210
--- /dev/null
@@ -0,0 +1,104 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { SimpleChanges } from '@angular/core/src/metadata/lifecycle_hooks';
+
+@Component({
+  selector: 'app-pie',
+  templateUrl: './pie.component.html',
+  styleUrls: ['./pie.component.less']
+})
+export class PieComponent implements OnInit {
+  // 图形数据
+  @Input() chartData;
+  // 初始化数据
+  @Input() initData;
+
+  constructor() { }
+
+  ngOnInit() {
+    this.initOpts = {
+      renderer: 'canvas',
+      height: this.initData.height
+    };
+    this.pieOption = {
+      legend: this.initData.option.legend,
+      color:this.initData.option.color,
+      series : [
+          {
+              name: this.initData.option.series[0].name,
+              type: 'pie',
+              radius : this.initData.option.series[0].radius,
+              center: ['50%', '45%'],
+              legendHoverLink: false,
+              hoverOffset: 5,
+              avoidLabelOverlap: false,
+              label: this.initData.option.series[0].label,
+              data:[
+                  {value:1, name:'11'}
+              ],
+              itemStyle: {
+                  emphasis: {
+                      shadowBlur: 5,
+                      shadowOffsetX: 0,
+                      shadowColor: 'rgba(0, 0, 0, 0.5)'
+                  }
+              }
+          }
+      ]
+    }
+  }
+
+  ngOnChanges(changes:SimpleChanges){
+
+    // 当有实例的时候再执行,相当于第一次不执行下面方法
+    if(this.chartIntance){
+      this.chartDataChange()
+    }
+  }
+
+  // 初始化图形高度
+  initOpts:any;
+  // alarm饼图
+  pieOption:any;
+  // 实例对象
+  chartIntance:any;
+  // 数据变化
+  updateOption:any;
+  chartDataChange(){
+    this.updateOption = this.chartData;
+    // 要等到updateOption渲染完再执行
+    this.chartIntance.on('finished',()=>{
+      this.chartIntance.dispatchAction({
+        type:'highlight',
+        seriesIndex: 0,
+        dataIndex:0        
+      })
+      // 由于所有视图变化渲染都会执行,更新完注销此事件
+      this.chartIntance.off('finished')
+    })
+  }
+
+  chartInit(chart){
+    this.chartIntance = chart;
+  }
+  
+  pieMouseOver(e){
+    this.chartIntance.dispatchAction({
+      type:'downplay'
+    })
+    this.chartIntance.dispatchAction({
+      type:'highlight',
+      seriesIndex: 0,
+      dataIndex:e.dataIndex
+    })
+  }
+
+  pieMouseOut(e){
+    this.chartIntance.dispatchAction({
+      type:'highlight',
+      seriesIndex: 0,
+      dataIndex:e.dataIndex
+    })
+  }
+
+
+}
diff --git a/usecaseui-portal/src/app/components/details/details.component.css b/usecaseui-portal/src/app/components/details/details.component.css
new file mode 100644 (file)
index 0000000..0d450d2
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.content .header {
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 30px 28px 0;
+  position: relative;
+  margin-bottom: 30px;
+  border: 1px solid #e4e4e4;
+}
+.content .header hr {
+  margin: 0;
+  border: none;
+  height: 1px;
+  background-color: #e4e4e4;
+}
+.content .header h2 {
+  font: 700 24px/18px 'Times New Roman';
+  color: #3fa8eb;
+  text-align: center;
+  margin-bottom: 27px;
+}
+.content .header span.tildeimg {
+  position: absolute;
+  left: 50%;
+  top: 71px;
+  width: 60px;
+  height: 10px;
+  transform: translate(-30px, 0);
+  background: url(../../../assets/images/tildeimg.png) no-repeat center center;
+  background-color: #fff;
+}
+.content .header .headerlist {
+  display: flex;
+}
+.content .header .headerlist div {
+  width: 100%;
+}
+.content .header .headerlist div p {
+  font: 400 14px 'Arial';
+  color: #323437;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin: 18px 0 15px;
+}
+.content .header .headerlist div p span {
+  display: inline-block;
+  width: 50%;
+  text-align: right;
+  font: 700 14px 'Arial';
+  color: #3fa8eb;
+}
+.content hr {
+  margin: 0;
+  border: none;
+  height: 1px;
+  background-color: #e4e4e4;
+}
+.content button {
+  width: 88px;
+  height: 22px;
+  position: absolute;
+  left: 50%;
+  transform: translate(-44px, 0);
+  border: none;
+  outline: none;
+  cursor: pointer;
+  background-color: #fff;
+  background: url(../../../assets/images/open-close2.png) no-repeat center -22px;
+}
+.content button:hover {
+  background: url(../../../assets/images/open-close2.png) no-repeat center -66px;
+}
+.content .buttonActive {
+  transform: translate(-44px, -22px);
+  background: url(../../../assets/images/open-close2.png) no-repeat center 0px;
+}
+.content .buttonActive:hover {
+  background: url(../../../assets/images/open-close2.png) no-repeat center -44px;
+}
+.content h2.detailtitle {
+  font: 700 24px/18px 'Times New Roman';
+  color: #3fa8eb;
+  text-align: center;
+  margin-bottom: 15px;
+  padding-top: 25px;
+}
+.content .detailInformatioin {
+  overflow: hidden;
+}
diff --git a/usecaseui-portal/src/app/components/details/details.component.html b/usecaseui-portal/src/app/components/details/details.component.html
new file mode 100644 (file)
index 0000000..b5c576c
--- /dev/null
@@ -0,0 +1,68 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 class="content">
+    <div class="header">
+        <h2>HEADER INFORMATION</h2>
+        <hr> <span class="tildeimg"></span>
+        <div class="headerlist">
+            <div class="leftlist">
+                <p> <span>Version :</span> </p>
+                <p> <span>Domain :</span> </p>
+                <p> <span>Event Name :</span> Fault_IMSSBC_Backup MPU is down </p>
+                <p> <span>Event Id :</span> 15105642034 </p>
+                <p> <span>EventType :</span> </p>
+                <p> <span>NfcNamingCode :</span> </p>
+                <p> <span>NfNamingCode :</span> </p>
+                <p> <span>SourceName :</span> </p>
+                <p> <span>SourceId :</span> </p>
+                <p> <span>ReportingEntityName :</span> </p>
+                <p> <span>ReportingEntityId :</span> </p>
+            </div>
+            <div class="rightlist">
+                <p> <span>Priority :</span> Normal </p>
+                <p> <span>ReportTime :</span> </p>
+                <p> <span>ClearTime :</span> </p>
+                <p> <span>FaultFieldsVersion :</span> </p>
+                <p> <span>Event Servrity :</span> </p>
+                <p> <span>EventSourceType :</span> </p>
+                <p> <span>EventCategory :</span> </p>
+                <p> <span>AlarmCondition :</span> </p>
+                <p> <span>SpecificProblem :</span> </p>
+                <p> <span>Status :</span> </p>
+                <p> <span>AlarmInterfaceA :</span> </p>
+            </div>
+        </div>
+    </div>
+    <hr> 
+    <button [ngClass]="{'buttonActive':moredetailShow}" (click)="slideUpDown()"></button>
+    <h2 class="detailtitle">DETAIL INFORMATION</h2>
+    <div class="detailInformatioin" [@slideUpDown]='state'>
+        <nz-table #detailTable [nzData]="detailData" [nzShowPagination]="false" nzSize="small" [nzBordered]="true">
+            <thead>
+                <tr>
+                    <th nzWidth="18%">Item Name</th>
+                    <th >Item Value</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr *ngFor="let data of detailTable.data">
+                    <td>{{data.name}}</td>
+                    <td>{{data.value}}</td>
+                </tr>
+            </tbody>
+        </nz-table>
+    </div>
+</div>
diff --git a/usecaseui-portal/src/app/components/details/details.component.less b/usecaseui-portal/src/app/components/details/details.component.less
new file mode 100644 (file)
index 0000000..ad81d8a
--- /dev/null
@@ -0,0 +1,96 @@
+
+.content {
+    .header {
+        background-color: #fff;
+        border-radius: 5px;
+        padding: 30px 28px 0;
+        position: relative;
+        margin-bottom: 30px;
+        border: 1px solid #e4e4e4;
+        hr {
+            margin: 0;
+            border: none;
+            height: 1px;
+            background-color: #e4e4e4;
+        }
+        h2 {
+            font: 700 24px/18px 'Times New Roman';
+            color: #3fa8eb;
+            text-align: center;
+            margin-bottom: 27px;
+        }
+        span.tildeimg {
+            position: absolute;
+            left: 50%;
+            top: 71px;
+            width: 60px;
+            height: 10px;
+            transform: translate(-30px,0);
+            background: url(../../../assets/images/tildeimg.png) no-repeat center center;
+            background-color: #fff;
+        }
+        .headerlist {
+            display: flex;
+            div {
+                width: 100%;
+                p {
+                    font: 400 14px 'Arial';
+                    color: #323437;
+                    white-space: nowrap;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    margin: 18px 0 15px;
+                    span {
+                        display: inline-block;
+                        width: 50%;
+                        text-align: right;
+                        font: 700 14px 'Arial';
+                        color: #3fa8eb;
+                    }
+                }
+            }
+        }
+    }
+    hr {
+        margin: 0;
+        border: none;
+        height: 1px;
+        background-color: #e4e4e4;
+    }
+    button {
+        width: 88px;
+        height: 22px;
+        position: absolute;
+        left: 50%;
+        transform: translate(-44px,0);
+        border: none;
+        outline: none;
+        cursor: pointer;
+        background-color: #fff;
+        background: url(../../../assets/images/open-close2.png) no-repeat center -22px;
+        &:hover {
+            background: url(../../../assets/images/open-close2.png) no-repeat center -66px;
+        }
+    }
+    .buttonActive {
+        transform: translate(-44px,-22px);
+        background: url(../../../assets/images/open-close2.png) no-repeat center -0px;
+        &:hover {
+            background: url(../../../assets/images/open-close2.png) no-repeat center -44px;
+        }
+    }
+    h2.detailtitle {
+        font: 700 24px/18px 'Times New Roman';
+        color: #3fa8eb;
+        text-align: center;
+        margin-bottom: 15px;
+        padding-top: 25px; 
+    }
+    .detailInformatioin {
+        // transition: all 0.3s linear;
+        overflow: hidden;
+    }
+    .detailshow {
+
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/components/details/details.component.spec.ts b/usecaseui-portal/src/app/components/details/details.component.spec.ts
new file mode 100644 (file)
index 0000000..1d5cbeb
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DetailsComponent } from './details.component';
+
+describe('DetailsComponent', () => {
+  let component: DetailsComponent;
+  let fixture: ComponentFixture<DetailsComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ DetailsComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(DetailsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/components/details/details.component.ts b/usecaseui-portal/src/app/components/details/details.component.ts
new file mode 100644 (file)
index 0000000..f9e6474
--- /dev/null
@@ -0,0 +1,36 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { slideUpDown } from '../../animates';
+
+@Component({
+  selector: 'app-details',
+  templateUrl: './details.component.html',
+  styleUrls: ['./details.component.less'],
+  animations: [ slideUpDown ]
+})
+export class DetailsComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  ngOnChanges(changes){
+    console.log(changes);
+  }
+  // 详情显示
+  moredetailShow = false;
+  @Input() detailId;
+  detailData = [
+    {name:"DNS.AttDnsQuery",value:"0"},
+    {name:"DNS.SuccDnsQuery",value:"0"},
+    {name:"DNS.SuccDnsQuery",value:"0"},
+    {name:"DNS.SuccDnsQuery",value:"0"},
+    {name:"DNS.SuccDnsQuery",value:"0"},
+    {name:"sssssss",value:"1111"},
+  ]
+  state = 'up'
+  slideUpDown(){
+    this.moredetailShow = !this.moredetailShow;
+    this.state = this.state === 'up' ? 'down' : 'up';
+  }
+}
diff --git a/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.css b/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.css
new file mode 100644 (file)
index 0000000..7268b5d
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.content .title {
+  border-radius: 5px 5px 0 0;
+  background-color: #fff;
+  height: 106px;
+  border-bottom: 1px solid #f0f0f0;
+  margin-bottom: 0;
+}
+.content .title ul {
+  display: flex;
+  display: -webkit-flex;
+  justify-content: space-around;
+  align-items: center;
+  padding: 0;
+  margin: 0;
+  height: 100%;
+}
+.content .title ul li {
+  list-style: none;
+  padding-left: 32px;
+  width: 100%;
+  border-left: 1px solid #eceff4;
+}
+.content .title ul li h5 {
+  font: 500 14px "Arial";
+  color: #3d4d65;
+}
+.content .title ul li p {
+  font: 500 24px "Arial";
+  color: #3fa8eb;
+  margin-bottom: 0;
+}
+.content .title ul li:nth-child(1) {
+  border: none;
+}
+.content .chart {
+  background-color: #fff;
+  position: relative;
+  border-radius: 5px;
+  margin-bottom: 20px;
+  height: 106px;
+}
+.content .chart .select {
+  padding: 20px 50px;
+  width: 70%;
+  float: left;
+}
+.content .chart .select nz-dropdown {
+  margin-right: 20px;
+}
+.content .chart .select nz-dropdown a {
+  font: 700 12px "Arial";
+  color: #3d4d65;
+}
+.content .chart .select nz-dropdown a:hover {
+  color: #3fa8eb;
+}
+.content .chart .AlarmChart {
+  width: 25%;
+  padding-top: 7px;
+  float: left;
+}
+.content .tablelist {
+  background-color: #fff;
+  padding: 24px 10px 0px;
+  border-radius: 0 0 5px 5px;
+}
+.content .tablelist .action {
+  padding: 10px 0 0 20px;
+}
+.content .tablelist .action .details {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  background: url(../../../assets/images/icon.png) center -113px;
+}
+.content .tablelist .action .details:hover {
+  background: url(../../../assets/images/icon.png) no-repeat center -128px;
+}
diff --git a/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.html b/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.html
new file mode 100644 (file)
index 0000000..19c7d85
--- /dev/null
@@ -0,0 +1,79 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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 class="content">
+  <!-- <div class="title">
+    <ul>
+        <li><h5>CPU</h5> <p>{{alarmList.all }}</p></li>
+        <li><h5>Memory</h5> <p>{{alarmList.closed }}</p></li>
+        <li><h5>Disk</h5> <p>{{alarmList.alarm }}</p></li>
+    </ul>
+  </div> -->
+    <nz-modal nzWrapClassName="vertical-center-modal" [(nzVisible)]="isVisibleMiddle" nzTitle="Alarm Chart" (nzOnCancel)="handleCancelMiddle()" (nzOnOk)="handleOkMiddle()">
+        <app-line [initData]="alarmChartInitBig" [chartData]="alarmChartDataBig"></app-line>
+    </nz-modal>
+  <div class="chart">
+    <div class="select">
+        <nz-dropdown [nzTrigger]="'click'">
+            <a nz-dropdown>
+                {{MeasurementSelected}} <i class="anticon anticon-down"></i>
+            </a>
+            <ul nz-menu>
+              <li nz-menu-item (click)="choseMeasurement(item)" *ngFor="let item of MeasurementList">{{item}}</li>
+            </ul>
+        </nz-dropdown>
+        <nz-dropdown [nzTrigger]="'click'">
+            <a nz-dropdown>
+                {{ReportTimeSelected}} <i class="anticon anticon-down"></i>
+            </a>
+            <ul nz-menu>
+              <li nz-menu-item (click)="choseReportTime(item)" *ngFor="let item of ReportTimeList">{{item}}</li>
+            </ul>
+        </nz-dropdown>
+    </div>
+    <div class="AlarmChart" (click)="showModalMiddle()">
+        <app-line [initData]="alarmChartInit" [chartData]="alarmChartData"></app-line>
+    </div>
+    <!-- <button class="open-close" [ngClass]="{'open-close-active':alarmShow}" (click)="alarmShow=!alarmShow"></button> -->
+  </div>
+  <div class="tablelist">
+    <nz-table #nzTable [nzData]="dataSet" [nzPageSize]="10" nzShowSizeChanger [nzPageSizeOptions]="[5,10,15,20]" nzSize="middle">
+        <thead (nzSortChange)="sort($event)" nzSingleSort>
+            <tr>
+            <th nzWidth="5%">NO</th>
+            <th nzWidth="20%">Source Name</th>
+            <th nzWidth="10%">Priority</th>
+            <th nzWidth="20%">SpecificProblem</th>
+            <th nzWidth="20%">Report Time</th>
+            <th nzWidth="15%">Status</th>
+            <th nzWidth="10%">Action</th>
+            </tr>
+        </thead>
+        <tbody>
+            <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+            <tr *ngFor="let item of nzTable.data; let i = index; ">
+                <td>{{i+1}}</td>
+                <td>{{item.name}}</td>
+                <td>{{item.age}}</td>
+                <td>{{item.address}}</td>
+                <td>{{item.address}}</td>
+                <td>{{item.address}}</td>
+                <td><a class="action" (click)="detailShow(i+1)"><i class="details"></i></a></td>
+            </tr>
+            <!-- </ng-template> -->
+        </tbody>
+    </nz-table>
+  </div>
+</div>
diff --git a/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.less b/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.less
new file mode 100644 (file)
index 0000000..30fea32
--- /dev/null
@@ -0,0 +1,108 @@
+.content {
+    .title {
+        border-radius: 5px 5px 0 0;
+        background-color: #fff;
+        height: 106px;
+        border-bottom: 1px solid #f0f0f0;
+        margin-bottom: 0;
+        ul {
+            display: flex;
+            display: -webkit-flex; 
+            justify-content: space-around;
+            align-items: center;
+            padding: 0;
+            margin: 0;
+            height: 100%;
+            li {
+                list-style: none;
+                padding-left: 32px;
+                width: 100%;
+                border-left: 1px solid #eceff4;
+                h5 {
+                    font: 500 14px "Arial";
+                    color: #3d4d65;
+                }
+                p {
+                    font: 500 24px "Arial";
+                    color: #3fa8eb;
+                    margin-bottom: 0;
+                }
+            }
+            li:nth-child(1){
+                border: none;
+            }
+        }
+    }
+    .chart {
+        background-color: #fff;
+        position: relative;
+        border-radius: 5px;
+        margin-bottom: 20px;
+        height: 106px;
+        .select {
+            padding: 20px 50px;
+            width: 70%;
+            float: left;
+            nz-dropdown {
+                margin-right: 20px;
+                a {
+                    font: 700 12px "Arial";
+                    color: #3d4d65;
+                    &:hover {
+                        color: #3fa8eb;
+                    }
+                }
+            }
+        }
+        .AlarmChart {
+            // height: 0px;
+            // border-bottom: 1px solid #f5f5f5;
+            // transition: all 0.3s linear;
+            width: 25%;
+            padding-top: 7px;
+            float: left;
+        }
+        // .alarmChart-active {
+        //     height: 386px;
+        // }
+        // .open-close {
+        //     width: 50px;
+        //     height: 25px;
+        //     position: absolute;
+        //     left: 50%;
+        //     bottom: 0px;
+        //     transform: translate(-25px,0);
+        //     border: none;
+        //     outline: none;
+        //     cursor: pointer;
+        //     background-color: #fff;
+        //     background: url(../../../assets/images/open-close.png) no-repeat center -27px;
+        //     &:hover {
+        //         background: url(../../../assets/images/open-close.png) no-repeat center -79px;
+        //     }
+        // }
+        // .open-close-active {
+        //     background: url(../../../assets/images/open-close.png) center -1px;
+        //     &:hover {
+        //         background: url(../../../assets/images/open-close.png) no-repeat center -53px;
+        //     }
+        // }
+    }
+    .tablelist {
+        background-color: #fff;
+        padding: 24px 10px 0px;
+        border-radius: 0 0 5px 5px;
+        .action{
+            padding: 10px 0 0 20px;
+            .details{
+                display: inline-block;
+                width: 16px;
+                height: 16px;
+                background: url(../../../assets/images/icon.png) center -113px;
+                &:hover {
+                    background: url(../../../assets/images/icon.png) no-repeat center -128px;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.spec.ts b/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.spec.ts
new file mode 100644 (file)
index 0000000..013db38
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { GraphiclistComponent } from './graphiclist.component';
+
+describe('GraphiclistComponent', () => {
+  let component: GraphiclistComponent;
+  let fixture: ComponentFixture<GraphiclistComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ GraphiclistComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(GraphiclistComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.ts b/usecaseui-portal/src/app/components/graphiclist/graphiclist.component.ts
new file mode 100644 (file)
index 0000000..fc86ee0
--- /dev/null
@@ -0,0 +1,213 @@
+import { Component, OnInit, Input, Output, EventEmitter, HostBinding } from '@angular/core';
+
+@Component({
+  selector: 'app-graphiclist',
+  templateUrl: './graphiclist.component.html',
+  styleUrls: ['./graphiclist.component.less']
+})
+export class GraphiclistComponent implements OnInit {
+
+  constructor() { }
+  isVisibleMiddle = false;
+
+  showModalMiddle(): void {
+    this.isVisibleMiddle = true;
+  }
+  handleOkMiddle(): void {
+    console.log('click ok');
+    this.isVisibleMiddle = false;
+  }
+  handleCancelMiddle(): void {
+    this.isVisibleMiddle = false;
+  }
+
+  ngOnInit() {
+  }
+
+  // 筛选框(下拉框)
+  MeasurementList = ['aaaa','bbbb','cccc','dddddDDDD'];
+  MeasurementSelected = "Measurement";
+  ReportTimeList = ['aaaa','bbbb','cccc','ddddd'];
+  ReportTimeSelected = "ReportTime";  
+  choseMeasurement(item){
+    console.log(item);
+    this.MeasurementSelected = item;
+  }
+  choseReportTime(item){
+    console.log(item);
+    this.ReportTimeSelected = item;
+  }
+
+  sort(e){
+
+  }
+  // 数量统计
+  alarmList = {
+    all:22439,
+    closed:37923,
+    alarm: 12342
+  }
+
+   //折线图
+   alarmChartData:Object;
+   alarmChartInit:Object = {
+    height:100,
+    width:290,
+     option:{
+      tooltip : {
+        show : false,
+      },
+      legend: {
+        show :false,
+      },
+       series: [
+         {
+             name: 'Memory',
+             type: 'bar',
+             legendHoverLink: true,
+             barWidth: "25%",
+             //timeframe_one
+             data: [40, 45, 38, 52, 64, 58, 69, 87, 76, 33, 64, 87, 45],
+             itemStyle: {
+               color: "#3fa8eb"
+             },
+         }
+       ]
+     }
+   };
+   //折线图
+   alarmChartDataBig:Object;
+   alarmChartInitBig:Object = {
+    height:240,
+    width:500,
+     option:{
+       tooltip : {
+          show : true,
+          trigger: 'axis',
+        },
+       legend: {
+         bottom: 'bottom',
+         data: ['Memory']
+       },
+       series: [
+         {
+             name: 'Memory',
+             type: 'bar',
+             legendHoverLink: true,
+             barWidth: "25%",
+             //timeframe_one
+             data: [40, 45, 38, 52, 64, 58, 69, 87, 76, 33, 64, 87, 45],
+             itemStyle: {
+               color: "#3fa8eb"
+             },
+         }
+       ]
+     }
+   };
+
+  //表格数据
+  dataSet = [
+    {
+      name       : 'John Brown',
+      age        : 32,
+      expand     : false,
+      address    : 'New York No. 1',
+      description: 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.'
+    },
+    {
+      name       : 'Aim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Xim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'aoe Black',
+      age        : 32,
+      expand     : false,
+      address    : 'Sidney No. 1',
+      description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.'
+    }
+  ];
+
+  @Output() detailData = new EventEmitter();
+  detailShow(id){
+    let prems = {
+      id:id,
+      detailShow: true
+    }
+    this.detailData.emit(prems);
+
+  }
+
+}
diff --git a/usecaseui-portal/src/app/dataInterface.ts b/usecaseui-portal/src/app/dataInterface.ts
new file mode 100644 (file)
index 0000000..fe42594
--- /dev/null
@@ -0,0 +1,38 @@
+
+interface homeData {
+    services:{
+        number:number,
+        chartdata:Object[]
+    },
+    performance:{
+        per_Vnf:number,
+        per_VmPm:number
+    },
+    alarm:{
+        chartdata:Object[]
+    },
+    Vm_performance:{
+        names:string[]
+    }
+};
+
+interface homeVmLineData {
+    CPU:number[],
+    Memory:number[]
+}
+
+interface servicesSelectData {
+    customer:string[],
+    serviceType:string[]
+}
+
+interface servicesTableData {
+    total:number,
+    tableList:string[]
+}
+
+interface onboardTableData {
+    total:number,
+    tableList:string[]
+}
+export {homeData, homeVmLineData, servicesSelectData, servicesTableData, onboardTableData}
diff --git a/usecaseui-portal/src/app/home/home.component.css b/usecaseui-portal/src/app/home/home.component.css
new file mode 100644 (file)
index 0000000..d2e51e4
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.content .services {
+  float: left;
+  background-color: #fff;
+  width: 30%;
+  height: 628px;
+  border-radius: 5px;
+  padding: 28px 22px;
+}
+.content .services h4 {
+  font: 600 16px/16px "Arial";
+  color: #3d4d65;
+  margin-bottom: 58px;
+}
+.content .services h3 {
+  font: 400 48px/48px "Arial";
+  color: #3fa8eb;
+  text-align: center;
+}
+.content .services h3 span {
+  font-size: 14px;
+}
+.content .services p {
+  font: 400 14px/14px "Arial";
+  color: #54657e;
+  text-align: center;
+  margin-bottom: 48px;
+}
+.content .services .tip {
+  background-color: #eceff4;
+  color: #3d4d65;
+  font-size: 16px;
+  margin: 0 20px;
+  height: 35px;
+  line-height: 35px;
+  border-radius: 5px;
+}
+.content .rightcontent {
+  float: left;
+  padding-left: 15px;
+  width: 70%;
+}
+.content .rightcontent .rt-content {
+  height: 220px;
+  margin-bottom: 18px;
+}
+.content .rightcontent .rt-content .poerformance {
+  float: left;
+  background-color: #fff;
+  height: 100%;
+  width: 50%;
+  border-radius: 5px;
+  padding: 28px 26px;
+}
+.content .rightcontent .rt-content .poerformance h4 {
+  font: 600 16px/16px "Arial";
+  color: #3d4d65;
+  margin-bottom: 34px;
+}
+.content .rightcontent .rt-content .poerformance div {
+  height: 57px;
+  position: relative;
+  margin-bottom: 10px;
+}
+.content .rightcontent .rt-content .poerformance div h3 {
+  font: 600 25px/25px "Arial";
+  color: #3d4d65;
+  margin-bottom: 10px;
+}
+.content .rightcontent .rt-content .poerformance div p {
+  font: 400 12px/12px "Arial";
+  color: #54657e;
+}
+.content .rightcontent .rt-content .poerformance div img {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.content .rightcontent .rt-content .alarm {
+  float: left;
+  background-color: #fff;
+  height: 100%;
+  width: 48%;
+  margin-left: 2%;
+  border-radius: 5px;
+  position: relative;
+  padding: 28px 26px;
+}
+.content .rightcontent .rt-content .alarm h4 {
+  position: absolute;
+  font: 600 16px/16px "Arial";
+  color: #3d4d65;
+}
+.content .rightcontent .rb-content {
+  height: 390px;
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 24px 30px;
+  position: relative;
+}
+.content .rightcontent .rb-content h4 {
+  font: 600 16px/16px "Arial";
+  color: #3d4d65;
+}
+.content .rightcontent .rb-content nz-dropdown {
+  position: absolute;
+  top: 24px;
+  right: 30px;
+}
+.content .rightcontent .rb-content nz-dropdown button {
+  width: 170px;
+  height: 35px;
+  background-color: #eceff4;
+  text-align: left;
+  border-color: #cad3df;
+}
+.content .rightcontent .rb-content nz-dropdown button span {
+  display: inline-block;
+  width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 14px;
+}
+.content .rightcontent .rb-content nz-dropdown button i {
+  position: absolute;
+  top: 12px;
+  right: 12px;
+}
+.content .rightcontent .rb-content #pfVmChartLine {
+  width: 100%;
+  height: 318px;
+}
diff --git a/usecaseui-portal/src/app/home/home.component.html b/usecaseui-portal/src/app/home/home.component.html
new file mode 100644 (file)
index 0000000..b2fa5eb
--- /dev/null
@@ -0,0 +1,63 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> {{"Overall trend" | translate}}</h3>
+<hr>
+<div class="content">
+  <div class="services">
+    <h4>{{"SERVICES" | translate}}</h4>
+    <h3>{{serviceNumber}} <span>{{"services" | translate}}</span> </h3>
+    <p>{{serviceNumber}} {{"services has been created" | translate}}</p>
+    <app-pie [initData]="serviceChartInit" [chartData]="serviceChartData"></app-pie>
+    <p class="tip">View the details</p>
+  </div>
+
+  <div class="rightcontent">
+    <div class="rt-content">
+      <div class="poerformance">
+        <h4>{{"PERFORMANCE" | translate}}</h4>
+        <div class="pfVnf">
+          <h3 class="pfVnfNum">126</h3>
+          <p>Performance VNF</p>
+          <img src="../../assets/images/VNF.png" alt="VNF">
+        </div>
+        <div class="pfVmPm">
+          <h3 class="pfVmPmNum">286</h3>
+          <p>Performance VM/PM</p>
+          <img src="../../assets/images/VM.png" alt="VM/PM">
+        </div>
+      </div>
+      <div class="alarm">
+        <h4>{{"Alarm" | translate}}</h4>
+        <app-pie [initData]="alarmChartInit" [chartData]="alarmChartData"></app-pie>
+      </div>
+    </div>
+
+    <div class="rb-content">
+      <h4>{{"VM Performance" | translate}}</h4>
+      <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomRight'">
+        <button nz-button nz-dropdown><span>{{vmPerformanceNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+        <ul nz-menu>
+          <li nz-menu-item (click)="vmPerformanceNameSelect(item)" *ngFor="let item of vmPerformanceNames">
+            <a>{{item}}</a>
+          </li>
+        </ul>
+      </nz-dropdown>
+      <app-line [initData]="performanceChartInit" [chartData]="performanceChartData"></app-line>
+    </div>
+  </div>
+
+</div>
+
diff --git a/usecaseui-portal/src/app/home/home.component.less b/usecaseui-portal/src/app/home/home.component.less
new file mode 100644 (file)
index 0000000..89abafa
--- /dev/null
@@ -0,0 +1,145 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.content {
+    .services {
+        float: left;
+        background-color: #fff;
+        width: 30%;
+        height: 628px;
+        border-radius: 5px;
+        padding: 28px 22px;
+        h4 {
+            font: 600 16px/16px "Arial";
+            color: #3d4d65;
+            margin-bottom: 58px;
+        }
+        h3 {
+            font: 400 48px/48px "Arial";
+            color: #3fa8eb;
+            text-align: center;
+            span {
+                font-size: 14px;
+            }
+        }
+        p {
+            font: 400 14px/14px "Arial";
+            color: #54657e;
+            text-align: center;
+            margin-bottom: 48px;
+        }
+        .tip {
+            background-color: #eceff4;
+            color: #3d4d65;
+            font-size: 16px;
+            margin: 0 20px;
+            height: 35px;
+            line-height: 35px;
+            border-radius: 5px;
+        }
+    }
+    .rightcontent {
+        float: left;
+        padding-left: 15px;
+        width: 70%;
+        .rt-content {
+            height: 220px;
+            margin-bottom: 18px;
+            .poerformance {
+                float: left;              
+                background-color: #fff;
+                height: 100%;
+                width: 50%;
+                border-radius: 5px;
+                padding: 28px 26px;
+                h4 {
+                    font: 600 16px/16px "Arial";
+                    color: #3d4d65;
+                    margin-bottom: 34px;  
+                }
+                div {
+                    height: 57px;
+                    position: relative;
+                    margin-bottom: 10px;
+                    h3 {
+                        font: 600 25px/25px "Arial";
+                        color: #3d4d65;
+                        margin-bottom: 10px;
+                    }
+                    p {
+                        font: 400 12px/12px "Arial"; 
+                        color: #54657e
+                    }
+                    img {
+                        position: absolute;
+                        top: 0;
+                        right: 0;
+                    }
+                }
+            }
+            .alarm {
+                float: left;
+                background-color: #fff;
+                height: 100%;
+                width: 48%;
+                margin-left: 2%;
+                border-radius: 5px;
+                position: relative;
+                padding: 28px 26px;
+                h4 {
+                    position: absolute;
+                    font: 600 16px/16px "Arial";
+                    color: #3d4d65; 
+                }
+            }
+        }
+        .rb-content {
+            height: 390px;
+            background-color: #fff;
+            border-radius: 5px;
+            padding: 24px 30px;
+            position: relative;
+            h4 {
+                font: 600 16px/16px "Arial";
+                color: #3d4d65; 
+            }
+            nz-dropdown {
+                position: absolute;
+                top: 24px;
+                right: 30px;
+                button {
+                    width: 170px;
+                    height: 35px;
+                    background-color: #eceff4;
+                    text-align: left;
+                    border-color: #cad3df;
+                    span {
+                        display: inline-block;
+                        width: 120px;
+                        overflow: hidden;
+                        text-overflow: ellipsis;
+                        font-size: 14px;
+                    }
+                    i {
+                        position: absolute;
+                        top: 12px;
+                        right: 12px;
+                    }
+                }
+                //下拉框中的样式在style.less中,下拉框是在body中额外临时生成的
+            }
+            #pfVmChartLine {
+                width: 100%;
+                height: 318px;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/home/home.component.spec.ts b/usecaseui-portal/src/app/home/home.component.spec.ts
new file mode 100644 (file)
index 0000000..490e81b
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { HomeComponent } from './home.component';
+
+describe('HomeComponent', () => {
+  let component: HomeComponent;
+  let fixture: ComponentFixture<HomeComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ HomeComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(HomeComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/home/home.component.ts b/usecaseui-portal/src/app/home/home.component.ts
new file mode 100644 (file)
index 0000000..39fab25
--- /dev/null
@@ -0,0 +1,166 @@
+import { Component, OnInit, Input, Output, EventEmitter, HostBinding } from '@angular/core';
+import { MyhttpService } from '../myhttp.service';
+import { slideToRight } from '../animates';
+
+@Component({
+  selector: 'app-home',
+  templateUrl: './home.component.html',
+  styleUrls: ['./home.component.less'],
+  animations: [ slideToRight ]
+})
+export class HomeComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState;
+
+  constructor(private myhttp: MyhttpService) { }
+
+  ngOnInit() {
+    this.getHomeAllData();
+  }
+  
+  // alarm饼图
+  alarmChartData:Object;
+  alarmChartInit:Object = {
+    height: 164,
+    option:{
+      legend: {
+        orient: 'vertical',
+        left: '0px',
+        bottom: '0px',
+        data: ['Active','Closed']
+      },
+      color:["#fb6e6e","#526b75"],
+      series:[{
+        name:"告警信息",
+        radius : '55%',
+        label:{
+          normal:{
+            show: false,
+          },
+          emphasis: {
+            show: true,
+            formatter:'{b}\n{c},{d}%',
+          }
+        }
+      }]
+    }
+  };
+
+  // services饼图
+  serviceNumber:number = 0;
+  serviceChartData:Object;
+  serviceChartInit:Object = {
+    height: 300,
+    option:{
+      legend: {
+        orient: 'vertical',
+        left: '0px',
+        bottom: '0px',
+        data: ['Active','Closed']
+      },
+      color:["#3fa8eb","#1abb9b","#a4ead7"],
+      series:[{
+        name:"服务信息",
+        radius : ['45%','65%'],
+        avoidLabelOverlap: false,
+        label:{
+          normal:{
+            show: false,
+            position: 'center'
+          },
+          emphasis: {
+            show: true,
+            formatter:'{b}\n{c}',
+            textStyle: {
+                fontSize: '20',
+                fontWeight: 'bold'
+            }
+          }
+        },
+        labelLine: {
+          normal: {
+              show: false
+          }
+        },        
+      }]
+    }
+  };
+
+  // Performance线图
+  performanceChartData:Object;
+  performanceChartInit:Object = {
+    height:320,
+    option:{
+      legend: {
+        bottom: '0px',
+        data: ['CPU','Memory']
+      },
+      series : [
+        {
+            name: 'CPU',
+            type: 'line',
+            data:[20,23,14,12,34,25,22,42,52,35,34,13,13]
+        },
+        {
+            name: 'Memory',
+            type: 'line',
+            data:[10,23,24,22,14,15,32,12,12,32,14,23,23]
+        }
+      ]
+    }
+  };
+  getPerformanceChartData(){
+    let paramsObj = {
+      vmPerformanceName:this.vmPerformanceNameSelected
+    }
+    this.myhttp.getHomePerformanceChartData(paramsObj)
+      .subscribe((data)=>{
+        this.performanceChartData = {
+          series:[
+            {data:data.CPU},
+            {data:data.Memory}
+          ]
+        }
+      },(err)=>{
+        console.log(err);
+      })
+  }
+
+  // vm筛选框
+  vmPerformanceNames = ['performanceNameOne'];
+  vmPerformanceNameSelected = this.vmPerformanceNames[0];
+  vmPerformanceNameSelect(item){
+    if(this.vmPerformanceNameSelected != item){
+      console.log(item);
+      this.vmPerformanceNameSelected = item;
+      this.getPerformanceChartData()
+    } 
+  }
+
+  // 获取数据
+  getHomeAllData(){
+    this.myhttp.getAllHomeData()
+    .subscribe(
+      (data)=>{
+        console.log(data);
+        this.alarmChartData ={
+          series:[{
+            data:data.alarm.chartdata
+          }]
+        };
+        this.serviceNumber = data.services.number;
+        this.serviceChartData ={
+          series:[{
+            data:data.services.chartdata
+          }]
+        };
+        this.vmPerformanceNames = data.Vm_performance.names;
+        this.vmPerformanceNameSelected = this.vmPerformanceNames[0];
+        this.getPerformanceChartData();
+      },
+      (err)=>{
+        console.log(err);
+      }
+    )
+  }
+
+}
diff --git a/usecaseui-portal/src/app/myhttp.service.ts b/usecaseui-portal/src/app/myhttp.service.ts
new file mode 100644 (file)
index 0000000..09f13a4
--- /dev/null
@@ -0,0 +1,266 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs/Observable';
+import { homeData, homeVmLineData, servicesSelectData, servicesTableData, onboardTableData} from './dataInterface';
+
+
+
+@Injectable()
+export class MyhttpService {
+
+  constructor(private http: HttpClient) { }
+  
+  baseUrl = "./assets/json";
+  url={
+    allhome:this.baseUrl + "/homeAllData.json",
+    homeLineData:this.baseUrl + "/homePerformanceChartData.json",
+    serviceSelectList:this.baseUrl + "/servicesList.json",   //customer、serviceType
+    servicesTableData:this.baseUrl + "/servicesTableData.json",
+    onboardTableData:this.baseUrl + "/onboardTableData.json",
+
+    customers:this.baseUrl + "/customers.json?",
+    serviceType:this.baseUrl + "/serviceTypes.json?*_*",
+    servicesCategory:this.baseUrl + "/configuration_files/servicesCategory.json?",
+    serviceInstanceList:this.baseUrl + "/instanceTableData4.json?",
+    serviceTemplates:this.baseUrl + "/serviceTemplates2.json?",
+    templateCategory:this.baseUrl + "/configuration_files/templateCategory.json?",
+    templateParameters:this.baseUrl + "/*_*" + "ServiceTemplateParameters.json?",
+    addressData: this.baseUrl + "/siteAddressData.json?",
+    createService:this.baseUrl + "/createService.json?",
+    inputNamesTransform: this.baseUrl + "/configuration_files/inputNamesTranslate.json?",
+    deleteService: this.baseUrl + "/deleteService.json?",
+    progress:this.baseUrl + "/progress.json?",
+
+    allottedResource:this.baseUrl + "/allotted-resources2.json?",
+    pnfDetail:this.baseUrl + "/pnfdetail-domain.json?",
+    connectivity:this.baseUrl + "/sotn-connectivity2.json?",
+    vpnBinding:this.baseUrl + "/vpnbinding.json?",
+    alarmFormData:this.baseUrl + "/alarmFormData.json?"
+  }
+
+  // baseUrl = 'http://172.19.44.223/api/usecaseui-server/v1';
+  // baseUrl = '/api/usecaseui-server/v1';
+  // url={
+  //   allhome:this.baseUrl + "/alarm/getAlarmDataByStatus/0",
+  //   homeLineData:this.baseUrl + "/...........",
+  //   serviceSelectList:this.baseUrl + "/xxxxxxxxxxxxx",
+  //   servicesTableData:this.baseUrl + "/xxxxxxxx.json",
+  //   onboardTableData:this.baseUrl + "/xxxxxxx.json",
+
+
+  //   customers:this.baseUrl + "/uui-lcm/customers",
+  //   serviceType:this.baseUrl + "/uui-lcm/customers/" + "*_*" + "/service-subscriptions",
+  //   servicesCategory: "./assets/json/configuration_files/servicesCategory.json",
+  //   serviceInstanceList:this.baseUrl + '/uui-sotn/getServiceInstanceList',
+  //   serviceTemplates:this.baseUrl + "/uui-lcm/service-templates",
+  //   templateCategory: "./assets/json/configuration_files/templateCategory.json",
+  //   templateParameters:this.baseUrl + "/uui-lcm/service-templates/" + "*_*" +"?toscaModelPath=",
+  //   addressData: this.baseUrl + "/uui-sotn/getOssInvenory",
+  //   createService:this.baseUrl + "/uui-lcm/services",
+  //   inputNamesTransform: "./assets/json/configuration_files/inputNamesTranslate.json?",
+  //   deleteService: this.baseUrl + "/uui-lcm/services/",
+  //   progress:this.baseUrl + "/uui-lcm/services/" + "*_*" + "/operations/",
+
+  //   allottedResource:this.baseUrl + "/uui-sotn/getAllottedResources",
+  //   pnfDetail:this.baseUrl + "/uui-sotn/getPnfInfo/",
+  //   connectivity:this.baseUrl + "/uui-sotn/getConnectivityInfo/",
+  //   vpnBinding:this.baseUrl + "/uui-sotn/getPinterfaceByVpnId/"
+  // }
+
+  // home页数据
+  getAllHomeData() {
+    return this.http.get<homeData>(this.url.allhome);
+  }
+  //home页折线图数据
+  getHomePerformanceChartData(paramsObj){
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<homeVmLineData>(this.url.homeLineData,{params});
+  }
+
+  // servicesList数据
+  // getServicesSelectData():Observable<HttpResponse<servicesSelectData>>{
+  //   return this.http.get<servicesSelectData>(this.url.serviceSelectList,{observe:'response'});
+  // }
+  getServicesTableData(paramsObj):Observable<HttpResponse<servicesTableData>>{
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<servicesTableData>(this.url.servicesTableData,{observe:'response',params});
+  }
+
+  // onboard数据
+  getOnboardTableData(paramsObj):Observable<HttpResponse<onboardTableData>>{
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<onboardTableData>(this.url.onboardTableData,{observe:'response',params});
+  }
+
+
+
+
+
+  testObservable(){
+    let myObservable = new Observable((observer)=>{
+      observer.next(1);
+      observer.next((n)=>{
+        console.log(3+n);
+      })
+      setTimeout(()=>{
+        observer.next(66666)
+      },100)
+      observer.next(()=>{
+        setTimeout((n)=>{
+          console.log("9999---" + n);
+        },10)        
+      })
+      // observer.error(2);
+      // observer.complete();
+    });
+
+    myObservable.subscribe((e)=>{
+      if(typeof e == "function"){
+        e(5)
+      }
+      console.log(e);
+    },(err)=>{
+      console.log(err);
+    },()=>{
+      console.log(555);
+    })
+  }
+
+  //---------------------------------------------------------------------------------
+
+  // 获取所有customers
+  getAllCustomers(){
+    return this.http.get<any>(this.url.customers);
+    // return this.http.jsonp<Object[]>('http://127.0.0.1:5500/customers.json',"callback");// 测试用 :请求数据需要用回调函数包裹
+  }
+
+  // 获取相应的serviceType
+  getServiceTypes(customer){
+    let url = this.url.serviceType.replace("*_*",customer.id);
+    return this.http.get<any>(url);
+  }
+  // 获取服务分类信息,本地配置文件
+  getServicesCategory(){
+    return this.http.get<any>(this.url.servicesCategory);
+  }
+  // list表格数据
+  getInstanceTableData(paramsObj){
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(this.url.serviceInstanceList,{params});
+  }
+
+  // // 服务详情数据 
+  // getInstanceDetails(id){
+  //   let url = this.baseUrl + "/detailsData.json?id=" + id;
+  //   return this.http.get<instanceDetail>(url);
+  // }
+
+  // 获取所有模板类型
+  getAllServiceTemplates(){
+    return this.http.get<any>(this.url.serviceTemplates);
+  }
+
+  // 获取模板分类信息,本地配置文件
+  getTemplateCategory(){
+    return this.http.get<any>(this.url.servicesCategory);
+  }
+  // 获取模板输入项参数
+  getTemplateParameters(type,template){
+    let url = this.url.templateParameters.replace("*_*",type) + template.toscaModelURL;  //本地模拟
+    // let url = this.url.templateParameters.replace("*_*",template.uuid) + template.toscaModelURL;
+    return this.http.get<any>(url);
+  }
+  // siteAddress 地址
+  getSiteAddress(){
+    return this.http.get<any>(this.url.addressData);
+  }
+
+  // 创建接口
+  createInstance(requestBody){
+    return this.http.get<any>(this.url.createService);  //本地模拟
+    // return this.http.post<any>(this.url.createService,requestBody);
+  }
+
+  // 输入参数名字转换
+  inputNamesTransform(){
+    return this.http.get(this.url.inputNamesTransform);
+  }
+
+  // 删除接口
+  deleteInstance(obj){
+    let httpOptions = {
+      headers: new HttpHeaders({
+        'Content-Type':  'application/json',
+        'Accept':'application/json',
+        'Authorization':'Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA=='
+      }),
+      body:{
+        'globalSubscriberId': obj.globalSubscriberId,
+        'serviceType': obj.serviceType
+      }
+    };
+    return this.http.get<any>(this.url.deleteService);  //本地模拟
+    // return this.http.delete<any>(this.url.deleteService + obj.serviceInstanceId, httpOptions);
+  }
+
+  // 查询进度接口
+  getProgress(obj){
+    let url = this.url.progress.replace("*_*",obj.serviceId) + obj.operationId;
+    return this.http.get<any>(url);
+  }
+
+  // 获取allotted-resource  能获取tp和pnf值
+  getAllottedResource(obj){
+    let params = new HttpParams({fromObject:obj});
+    let url = this.url.allottedResource;
+    return this.http.get<any>(url,{params});
+  }
+  //通过pnf值获取对应的domain (network-resource)
+  getPnfDetail(name){
+    let url = this.url.pnfDetail + name;
+    return this.http.get<any>(url);
+  }
+  //通过sotn 获取connectivity ,查找vpn-id
+  getSotnConnectivity(id){
+    let url = this.url.connectivity + id;
+    return this.http.get<any>(url);
+  }
+  //通过vpn-id 查找tp和pnf
+  getVpnBinding(id){
+    let url = this.url.vpnBinding + id;
+    return this.http.get<any>(url);
+  }
+  // 时间格式化 毫秒转正常值
+  dateformater(vmstime){
+    if(!vmstime){
+        return ''
+    }
+    let mstime = Number((vmstime + '').slice(0,13));  
+    let time = new Date(mstime);
+    let year = time.getFullYear();
+    let month = time.getMonth() + 1;
+    let day = time.getDate();
+    let hours = time.getHours();
+    let minutes = time.getMinutes();
+    let seconds = time.getSeconds();
+    let formattime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
+    return formattime;
+  }
+
+  // alarm表格数据
+  // getAlarmFormData(pageNumber:number,pageSaze:number,name?:string,Priority?:string,Status?:string,Report?:string){
+  //   return this.http.post<any>(this.url.alarmFormData,{
+  //     pageNumber:pageNumber,
+  //     pageSaze:pageSaze,
+  //     name:name,
+  //     Priority:Priority,
+  //     Status:Status,
+  //     Report:Report 
+  //   });
+  // }
+
+
+  getAlarmFormData(pageNumber:number,pageSaze:number,name?:string,Priority?:string,Status?:string,Report?:string){
+    return this.http.get<any>(this.url.alarmFormData+'?pageNumber='+pageNumber+'?pageSaze'+pageSaze+'?name'+name+'?Priority'+Priority+'?Status'+Status+'?Report'+Report);
+  }
+}
diff --git a/usecaseui-portal/src/app/networkHttpservice.service.ts b/usecaseui-portal/src/app/networkHttpservice.service.ts
new file mode 100644 (file)
index 0000000..5e713d7
--- /dev/null
@@ -0,0 +1,99 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';
+
+interface tablelist {
+  total:number,
+  list:Object[]
+}
+interface d3list {
+  total:number,
+  list:Object[]
+}
+
+@Injectable()
+export class networkHttpservice {
+
+  constructor(private http:HttpClient) { }
+
+  baseUrl = "./assets/json/";
+  // list表格数据
+  getInstanceTableData(paramsObj){
+    let url = this.baseUrl + "instanceTableData.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<tablelist>(url,{params});
+  }
+  //d3数据
+  getNetworkD3Data(){
+    let url = this.baseUrl + "netWorkD3Data.json";
+    // let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url);
+  }
+  //初始化连线 logical-links
+  getLogicalLinksData(){
+    let url = this.baseUrl + "LogicalLinksData.json";
+    // let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url);
+  }
+  //查询指定的node对应的tp数据
+  getPInterfacesData1(paramsObj){
+    let url = this.baseUrl + "p_interfaces1.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  getPInterfacesData2(paramsObj){
+    let url = this.baseUrl + "p_interfaces2.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //创建连线接口
+  createLink(paramsObj){
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //查询指定的单个连接线 接口
+  querySpecificLinkInfo(paramsObj){
+    let url = this.baseUrl+ "specific_link _nfo.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+
+  //查询 外部云host this.url地址 接口
+  queryCloudUrl(paramsObj){
+    let url = this.baseUrl+ "url.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+
+  //创建外部云newwork接口
+  createNetwrok(paramsObj){
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //创建外部云pnf接口
+  createPnf(paramsObj){
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //创建外部云Tp接口
+  createTp(paramsObj,cloudNodeName){
+    console.log(cloudNodeName)
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //创建外部云link接口
+  createCloudLink(paramsObj){
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+  //删除连线
+  deleteLink(paramsObj){
+    let url = this.baseUrl+ "status.json";
+    let params = new HttpParams({fromObject:paramsObj});
+    return this.http.get<any>(url,{params});
+  }
+}
diff --git a/usecaseui-portal/src/app/networkHttpservice.service1.ts b/usecaseui-portal/src/app/networkHttpservice.service1.ts
new file mode 100644 (file)
index 0000000..edb4df7
--- /dev/null
@@ -0,0 +1,97 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';
+
+
+@Injectable()
+export class networkHttpservice {
+
+  constructor(private http:HttpClient) { }
+
+  // baseUrl = "./assets/json/";//本地环境
+  // url={
+  //   "getNetworkD3Data":this.baseUrl + "netWorkD3Data.json",
+  //   "getLogicalLinksData":this.baseUrl + "LogicalLinksData.json",
+  //   "getPInterfacesData1":this.baseUrl + "netWorkD3Data.json",
+  //   "getPInterfacesData2":this.baseUrl + "p_interfaces1.json",
+  //   "createLink":this.baseUrl + "status.json",
+  //   "querySpecificLinkInfo":this.baseUrl + "specific_link _nfo.json",
+  //   "queryCloudUrl":this.baseUrl + "url.json",
+  //   "createNetwrok":this.baseUrl + "status.json",
+  //   "createPnf":this.baseUrl + "status.json",
+  //   "createTp":this.baseUrl + "status.json",
+  //   "createCloudLink":this.baseUrl + "status.json",
+  //   "createCloudUrl":this.baseUrl + "status.json",
+  //   "deleteLink":this.baseUrl + "status.json",
+  // };
+  // baseUrl = "http://10.73.242.244:8082/uui-sotn/";//线上环境
+  // baseUrl = "http://172.19.44.223/api/usecaseui-server/v1/uui-sotn/";//线上环境
+  baseUrl = "/api/usecaseui-server/v1/uui-sotn/";//线上环境
+  url={
+    "getNetworkD3Data":this.baseUrl + "getNetWorkResources",
+    "getLogicalLinksData":this.baseUrl + "getLogicalLinks",
+    "getPInterfacesData1":this.baseUrl + "getPinterfaceByPnfName/",
+    "getPInterfacesData2":this.baseUrl + "getPinterfaceByPnfName/",
+    "createLink":this.baseUrl + "createLink/",
+    "querySpecificLinkInfo":this.baseUrl + "getSpecificLogicalLink/",
+    "queryCloudUrl":this.baseUrl + "getHostUrl/",
+    "createNetwrok":this.baseUrl + "createTopoNetwork/",
+    "createPnf":this.baseUrl + "createPnf/",
+    "createTp":this.baseUrl + "pnf/",
+    "createCloudLink":this.baseUrl + "createLink/",
+    "createCloudUrl":this.baseUrl + "createHostUrl/",
+    "deleteLink":this.baseUrl + "deleteLink/",
+  };
+  //d3数据
+  getNetworkD3Data(){
+    return this.http.get<any>(this.url["getNetworkD3Data"]);
+  }
+  //初始化连线 logical-links
+  getLogicalLinksData(){
+    return this.http.get<any>(this.url["getLogicalLinksData"]);
+  }
+  //查询指定的node对应的tp数据
+  getPInterfacesData1(paramsObj){
+    return this.http.get<any>(this.url['getPInterfacesData1']+paramsObj["pnfName"]);
+  }
+  getPInterfacesData2(paramsObj){
+    return this.http.get<any>(this.url["getPInterfacesData2"]+paramsObj["pnfName"]);
+  }
+  //创建连线接口
+  createLink(paramsObj){
+    return this.http.put<any>(this.url["createLink"]+paramsObj["link-name"],paramsObj);
+  }
+  //查询指定的单个连接线 接口
+  querySpecificLinkInfo(paramsObj){
+    return this.http.get<any>(this.url["querySpecificLinkInfo"]+paramsObj["link-name"]);
+  }
+  //查询 外部云host this.url地址 接口
+  queryCloudUrl(aaiId){
+    return this.http.get<any>(this.url["queryCloudUrl"]+aaiId);
+  }
+  //创建外部云newwork接口
+  createNetwrok(paramsObj){
+    return this.http.put<any>(this.url["createNetwrok"]+paramsObj["network-id"],paramsObj);
+  }
+  //创建外部云pnf接口
+  createPnf(paramsObj){
+    return this.http.put<any>(this.url["createPnf"]+paramsObj["pnf-name"],paramsObj);
+  }
+  //创建外部云Tp接口
+  createTp(paramsObj,cloudNodeName){
+    let str=cloudNodeName+"/p-interfaces/p-interface/"+paramsObj["interface-name"]+"/createTerminationPoint";
+    return this.http.put<any>(this.url["createTp"]+str,paramsObj);
+  }
+  //创建外部云link接口
+  createCloudLink(paramsObj){
+    return this.http.put<any>(this.url["createCloudLink"]+paramsObj["link-name"],paramsObj);
+  }
+  //创建外部云host url接口
+  createCloudUrl(paramsObj){
+    return this.http.put<any>(this.url["createCloudUrl"]+paramsObj["aai-id"],paramsObj);
+  }
+  //删除连线
+  deleteLink(paramsObj){
+    let str=paramsObj["logical-link"]+"/"+paramsObj["resource-version"];
+    return this.http.delete<any>((this.url["deleteLink"]+str));
+  }
+}
diff --git a/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.css b/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.css
new file mode 100644 (file)
index 0000000..079a409
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.select {
+  margin-bottom: 20px;
+}
+.select span {
+  display: inline-block;
+  font: 700 14px "Arial";
+  color: #4c5e70;
+}
+.select nz-dropdown {
+  vertical-align: middle;
+}
+.select nz-dropdown :hover {
+  border-color: #147dc2;
+}
+.select nz-dropdown button {
+  width: 165px;
+  height: 30px;
+  background-color: #eceff4;
+  text-align: left;
+  border-color: #9fa9ab;
+}
+.select nz-dropdown button span {
+  font-weight: 400;
+  display: inline-block;
+  width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding-top: 2px;
+}
+.select nz-dropdown button i {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+}
+.select .submit {
+  margin-left: 20px;
+  vertical-align: middle;
+  height: 30px;
+  padding: 0 10px;
+}
+.select .submit span {
+  color: #fff;
+  font-weight: 400;
+}
+.content {
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 12px;
+}
diff --git a/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.html b/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.html
new file mode 100644 (file)
index 0000000..76d2485
--- /dev/null
@@ -0,0 +1,79 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<!-- <h3 class="title">
+    <span (click)="performanceShow()" style="cursor:pointer;">Performance VM</span> 
+    <span (click)="graphicShow()" *ngIf="graphicshow">> Graphic list </span> 
+    <span *ngIf="detailshow">> Details </span> 
+</h3>
+<hr>
+<div class="select" [@showHideAnimate]="state">
+    <span>Source Name: </span>
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+        <button nz-button nz-dropdown><span>{{sourceNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+        <ul nz-menu>
+            <li nz-menu-item (click)="choseSourceName(item)" *ngFor="let item of sourceNameList">
+                <a>{{item}}</a>
+            </li>
+        </ul>
+    </nz-dropdown>
+    &nbsp;&nbsp;
+    <span>ReportingEntityName: </span>
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+        <button nz-button nz-dropdown><span>{{ReportingEntityNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+        <ul nz-menu>
+            <li nz-menu-item (click)="choseReportingEntityName(item)" *ngFor="let item of ReportingEntityNameList">
+                <a>{{item}}</a>
+            </li>
+        </ul>
+    </nz-dropdown>
+    <button class="submit" nz-button [nzType]="'primary'" (click)="submit()"><i class="anticon anticon-plus-circle-o"></i><span>Submit</span></button>
+</div>
+<div class="content" [@showHideAnimate]="state">
+    <nz-table #nzTable [nzData]="dataSet" [nzPageSize]="10" nzShowSizeChanger nzShowQuickJumper [nzPageSizeOptions]="[5,10,15,20]" nzSize="middle">
+        <thead (nzSortChange)="sort($event)" nzSingleSort>
+            <tr>
+            <th nzWidth="5%">NO</th>
+            <th nzWidth="20%">Source Name</th>
+            <th nzWidth="20%">ReportingEntityName</th>
+            <th nzWidth="10%">Type</th>
+            <th nzWidth="15%">CPU</th>
+            <th nzWidth="10%">Memory</th>
+            <th nzWidth="10%">Disk</th>
+            <th nzWidth="10%">Action</th>
+            </tr>
+        </thead>
+        <tbody> -->
+            <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+            <!-- <tr *ngFor="let item of nzTable.data; let i = index; ">
+                <td>{{i+1}}</td>
+                <td>{{item.name}}</td>
+                <td>{{item.address}}</td>
+                <td>{{item.age}}</td>
+                <td>{{item.address}}</td>
+                <td>{{item.age}}</td>
+                <td>{{item.age}}</td>
+                <td><a (click)="graphicShow()">Delete</a></td>
+            </tr> -->
+            <!-- </ng-template> -->
+        <!-- </tbody>
+    </nz-table>
+</div>
+<div [@showHideAnimate]="state2">
+    <app-graphiclist  (detailData)="detailShow($event)"></app-graphiclist>
+</div>
+<div [@showHideAnimate]="state3">
+    <app-details [detailId]="detailId"></app-details>
+</div> -->
diff --git a/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.less b/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.less
new file mode 100644 (file)
index 0000000..8a9005c
--- /dev/null
@@ -0,0 +1,61 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.select {
+    margin-bottom: 20px;
+    span {
+        display: inline-block;
+        font: 700 14px "Arial";
+        color: #4c5e70;
+    }
+    nz-dropdown {
+        vertical-align: middle;
+        :hover{
+            border-color: #147dc2;
+        }
+        button {
+            width: 165px;
+            height: 30px;
+            background-color: #eceff4;
+            text-align: left;
+            border-color: #9fa9ab;
+            span {
+                font-weight: 400;
+                display: inline-block;
+                width: 120px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                padding-top: 2px;
+            }
+            i {
+                position: absolute;
+                top: 10px;
+                right: 10px;
+            }
+        }
+        //下拉框中的样式在style.less中,下拉框是在body中额外临时生成的
+    }
+    .submit {
+        margin-left: 20px;
+        vertical-align: middle;       
+        height: 30px;
+        padding: 0 10px;
+        span {
+            color: #fff;
+            font-weight: 400;
+        }
+    }
+}
+.content {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 12px;
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.spec.ts b/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.spec.ts
new file mode 100644 (file)
index 0000000..fd441da
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PerformanceVmComponent } from './performance-vm.component';
+
+describe('PerformanceVmComponent', () => {
+  let component: PerformanceVmComponent;
+  let fixture: ComponentFixture<PerformanceVmComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PerformanceVmComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PerformanceVmComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.ts b/usecaseui-portal/src/app/performance/performance-vm/performance-vm.component.ts
new file mode 100644 (file)
index 0000000..1fb099c
--- /dev/null
@@ -0,0 +1,159 @@
+import { Component, OnInit, HostBinding } from '@angular/core';
+import { slideToRight, showHideAnimate } from '../../animates';
+
+@Component({
+  selector: 'app-performance-vm',
+  templateUrl: './performance-vm.component.html',
+  styleUrls: ['./performance-vm.component.less'],
+  animations: [ slideToRight, showHideAnimate ]
+})
+export class PerformanceVmComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState;
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+  // 筛选框(下拉框)
+  sourceNameList = ['aaaa','bbbb','cccc','dddddDDDDDDDDDDDDDDD'];
+  sourceNameSelected = this.sourceNameList[0];
+  ReportingEntityNameList = ['aaaa','bbbb','cccc','ddddd'];
+  ReportingEntityNameSelected = this.ReportingEntityNameList[0];  
+  choseSourceName(item){
+    console.log(item);
+    this.sourceNameSelected = item;
+  }
+  choseReportingEntityName(item){
+    console.log(item);
+    this.ReportingEntityNameSelected = item;
+  }
+
+  //表格数据
+  dataSet = [
+    {
+      name       : 'John Brown',
+      age        : 32,
+      expand     : false,
+      address    : 'New York No. 1',
+      description: 'My name is John Brown, I am 32 years old, living in New York No. 1 Lake Park.'
+    },
+    {
+      name       : 'Aim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Xim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'Jim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'cim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'bim Green',
+      age        : 42,
+      expand     : false,
+      address    : 'London No. 1',
+      description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.'
+    },
+    {
+      name       : 'aoe Black',
+      age        : 32,
+      expand     : false,
+      address    : 'Sidney No. 1',
+      description: 'My name is Joe Black, I am 32 years old, living in Sidney No. 1 Lake Park.'
+    }
+  ];
+  
+  //详情页标题显示
+  graphicshow = false;
+  detailshow = false;
+  // 显示隐藏动画
+  state = "show";
+  state2 = "hide";
+  state3 = "hide";
+  performanceShow() {
+    this.state = 'show';
+    this.state2 = 'hide';
+    this.state3 = 'hide';
+    this.graphicshow = false;
+    this.detailshow = false;
+  }
+  graphicShow() {
+    this.state = 'hide';
+    this.state2 = 'show';
+    this.state3 = 'hide';
+    this.graphicshow = true;
+    this.detailshow = false;
+  }
+  // 选中id
+  detailId:number;
+  detailShow(prems) {
+    this.state = 'hide';
+    this.state2 = 'hide';
+    this.state3 = 'show';
+    this.graphicshow = true;
+    this.detailshow = true;
+    console.log(prems);
+    this.detailId = prems.id;
+  }
+
+}
diff --git a/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.css b/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.css
new file mode 100644 (file)
index 0000000..4ed015f
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.select {
+  margin-bottom: 20px;
+}
+.select span {
+  display: inline-block;
+  font: 700 14px "Arial";
+  color: #4c5e70;
+}
+.select nz-dropdown {
+  vertical-align: middle;
+}
+.select nz-dropdown :hover {
+  border-color: #147dc2;
+}
+.select nz-dropdown button {
+  width: 165px;
+  height: 30px;
+  background-color: #eceff4;
+  text-align: left;
+  border-color: #9fa9ab;
+}
+.select nz-dropdown button span {
+  font-weight: 400;
+  display: inline-block;
+  width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding-top: 2px;
+}
+.select nz-dropdown button i {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+}
+.select .submit {
+  margin-left: 20px;
+  vertical-align: middle;
+  height: 30px;
+  padding: 0 10px;
+}
+.select .submit span {
+  color: #fff;
+  font-weight: 400;
+}
+.content {
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 12px;
+}
+.content .vnfs {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-around;
+}
+.content .vnfs .vnf {
+  width: 18%;
+  height: 200px;
+  margin: 5px;
+  padding: 20px;
+  border-radius: 2px;
+  text-align: center;
+  cursor: pointer;
+  transition: all 0.3s linear;
+}
+.content .vnfs .vnf:hover {
+  background-color: #f5f5f5;
+  transform: scale(1.02);
+}
+.content .vnfs .vnf h3 {
+  font-size: 14px;
+  color: #3fa8eb;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin-bottom: 0;
+}
+.content .vnfs .vnf .intro {
+  text-align: left;
+  font-size: 12px;
+  overflow: hidden;
+  display: -webkit-box;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+  word-wrap: break-word;
+  word-break: break-all;
+}
+.content .vnfs .empty {
+  width: 18%;
+  height: 200px;
+  margin: 5px;
+  border-radius: 2px;
+}
+.content .pages {
+  height: 25px;
+  margin: 20px 10px;
+  position: relative;
+}
+.content .pages nz-pagination {
+  float: right;
+}
diff --git a/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.html b/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.html
new file mode 100644 (file)
index 0000000..0b39870
--- /dev/null
@@ -0,0 +1,64 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title">
+    <span (click)="performanceShow()" style="cursor:pointer;">Performance VNF</span> 
+    <span (click)="graphicShow()" *ngIf="graphicshow">> Graphic list </span> 
+    <span *ngIf="detailshow">> Details </span> 
+</h3>
+<hr>
+<div class="select" [@showHideAnimate]="state">
+    <span>Source Name: </span>
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+        <button nz-button nz-dropdown><span>{{sourceNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+        <ul nz-menu>
+            <li nz-menu-item (click)="choseSourceName(item)" *ngFor="let item of sourceNameList">
+                <a>{{item}}</a>
+            </li>
+        </ul>
+    </nz-dropdown>
+    &nbsp;&nbsp;
+    <span>ReportingEntityName: </span>
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+        <button nz-button nz-dropdown><span>{{ReportingEntityNameSelected}}</span> <i class="anticon anticon-down"></i></button>
+        <ul nz-menu>
+            <li nz-menu-item (click)="choseReportingEntityName(item)" *ngFor="let item of ReportingEntityNameList">
+                <a>{{item}}</a>
+            </li>
+        </ul>
+    </nz-dropdown>
+    <button class="submit" nz-button [nzType]="'primary'" (click)="submit()"><i class="anticon anticon-plus-circle-o"></i><span>Submit</span></button>
+</div>
+<div class="content" [@showHideAnimate]="state">
+    <div class="vnfs">
+        <div class="vnf" *ngFor="let item of vnfsData" (click)="graphicShow()">
+            <img src="../../../assets/images/VNF3.png" alt="VNF3">
+            <h3>Mfvs_MMEManaxxdeafsfdf</h3>
+            <div class="intro">
+                Mfvs_MMEMa naxxdfdafa fafad a afeaf sfdff doafe oghaiod aaafeageageagfdavzvdagewag
+            </div>
+        </div>
+        <div class="empty" *ngFor="let empty of emptys"></div>   
+    </div>
+    <div class="pages">
+        <nz-pagination [(nzPageIndex)]="current" [nzTotal]="500" [nzSize]="'small'" [nzPageSize]="10" [nzPageSizeOptions]="[10,15,20,25,30]" nzShowSizeChanger nzShowQuickJumper></nz-pagination>
+    </div>
+</div>
+<div [@showHideAnimate]="state2">
+    <app-graphiclist  (detailData)="detailShow($event)"></app-graphiclist>
+</div>
+<div [@showHideAnimate]="state3">
+    <app-details [detailId]="detailId"></app-details>
+</div>
diff --git a/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.less b/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.less
new file mode 100644 (file)
index 0000000..977ef5c
--- /dev/null
@@ -0,0 +1,115 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.select {
+    margin-bottom: 20px;
+    span {
+        display: inline-block;
+        font: 700 14px "Arial";
+        color: #4c5e70;
+    }
+    nz-dropdown {
+        vertical-align: middle;
+        :hover{
+            border-color: #147dc2;
+        }
+        button {
+            width: 165px;
+            height: 30px;
+            background-color: #eceff4;
+            text-align: left;
+            border-color: #9fa9ab;
+            span {
+                font-weight: 400;
+                display: inline-block;
+                width: 120px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                padding-top: 2px;
+            }
+            i {
+                position: absolute;
+                top: 10px;
+                right: 10px;
+            }
+        }
+        //下拉框中的样式在style.less中,下拉框是在body中额外临时生成的
+    }
+    .submit {
+        margin-left: 20px;
+        vertical-align: middle;       
+        height: 30px;
+        padding: 0 10px;
+        span {
+            color: #fff;
+            font-weight: 400;
+        }
+    }
+}
+
+.content {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 12px;
+    .vnfs {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: space-around;
+        .vnf {
+            // width: 180px;
+            width: 18%;
+            height: 200px;
+            margin: 5px;
+            padding: 20px;
+            border-radius: 2px;
+            text-align: center;
+            cursor: pointer;
+            transition: all 0.3s linear;
+            &:hover {
+                background-color: #f5f5f5; 
+                transform: scale(1.02);       
+            }
+            h3 {
+                font-size: 14px;
+                color: #3fa8eb;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                margin-bottom: 0;
+            }
+            .intro {
+                text-align: left;
+                font-size: 12px;
+                overflow: hidden;
+                display: -webkit-box;
+                -webkit-line-clamp: 3;
+                -webkit-box-orient: vertical;
+                word-wrap:break-word;
+                word-break:break-all;
+            }
+        }
+        .empty {
+            // width: 180px;
+            width: 18%;
+            height: 200px;
+            margin: 5px;
+            border-radius: 2px;
+        }
+    }
+    .pages {
+        height: 25px;
+        margin: 20px 10px;
+        position: relative;
+        nz-pagination {
+            float: right;
+        }
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.spec.ts b/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.spec.ts
new file mode 100644 (file)
index 0000000..c535b73
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PerformanceVnfComponent } from './performance-vnf.component';
+
+describe('PerformanceVnfComponent', () => {
+  let component: PerformanceVnfComponent;
+  let fixture: ComponentFixture<PerformanceVnfComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PerformanceVnfComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PerformanceVnfComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.ts b/usecaseui-portal/src/app/performance/performance-vnf/performance-vnf.component.ts
new file mode 100644 (file)
index 0000000..d2e8d99
--- /dev/null
@@ -0,0 +1,92 @@
+import { Component, OnInit, HostBinding } from '@angular/core';
+import { slideToRight, showHideAnimate } from '../../animates';
+
+@Component({
+  selector: 'app-performance-vnf',
+  templateUrl: './performance-vnf.component.html',
+  styleUrls: ['./performance-vnf.component.less'],
+  animations: [ slideToRight, showHideAnimate ]
+})
+export class PerformanceVnfComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState;
+  constructor() { }
+
+  ngOnInit() {
+    let _this = this;
+    setTimeout(function(){
+      // 在路由切换时加载图片造成动画卡顿,先完成动画再加载图片
+      _this.vnfsData = [    
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"},
+        {name:"aaa",text:"oahgieango"}
+      ];
+      _this.emptys = new Array(15-_this.vnfsData.length);
+    },300)
+  }
+
+  // 筛选框(下拉框)
+  sourceNameList = ['aaaa','bbbb','cccc','dddddDDDDDDDDDDDDDDD'];
+  sourceNameSelected = this.sourceNameList[0];
+  ReportingEntityNameList = ['aaaa','bbbb','cccc','ddddd'];
+  ReportingEntityNameSelected = this.ReportingEntityNameList[0];  
+  choseSourceName(item){
+    console.log(item);
+    this.sourceNameSelected = item;
+  }
+  choseReportingEntityName(item){
+    console.log(item);
+    this.ReportingEntityNameSelected = item;
+  }
+
+  submit(){
+    
+  }
+  // vnfs数据
+  vnfsData = [];
+  emptys = []; //补空盒子用
+  // 分页 
+  current = 1;  //当前页码
+
+  //详情页标题显示
+  graphicshow = false;
+  detailshow = false;
+  // 显示隐藏动画
+  state = "show";
+  state2 = "hide";
+  state3 = "hide";
+  performanceShow() {
+    this.state = 'show';
+    this.state2 = 'hide';
+    this.state3 = 'hide';
+    this.graphicshow = false;
+    this.detailshow = false;
+  }
+  graphicShow() {
+    this.state = 'hide';
+    this.state2 = 'show';
+    this.state3 = 'hide';
+    this.graphicshow = true;
+    this.detailshow = false;
+  }
+  // 选中id
+  detailId:number;
+  detailShow(prems) {
+    this.state = 'hide';
+    this.state2 = 'hide';
+    this.state3 = 'show';
+    this.graphicshow = true;
+    this.detailshow = true;
+    console.log(prems);
+    this.detailId = prems.id;
+  }
+
+
+}
diff --git a/usecaseui-portal/src/app/performance/performance.component.css b/usecaseui-portal/src/app/performance/performance.component.css
new file mode 100644 (file)
index 0000000..cf63a82
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
diff --git a/usecaseui-portal/src/app/performance/performance.component.html b/usecaseui-portal/src/app/performance/performance.component.html
new file mode 100644 (file)
index 0000000..c092e87
--- /dev/null
@@ -0,0 +1,17 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> Performance </h3>
+<hr>
diff --git a/usecaseui-portal/src/app/performance/performance.component.less b/usecaseui-portal/src/app/performance/performance.component.less
new file mode 100644 (file)
index 0000000..2b1949a
--- /dev/null
@@ -0,0 +1,11 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
diff --git a/usecaseui-portal/src/app/performance/performance.component.spec.ts b/usecaseui-portal/src/app/performance/performance.component.spec.ts
new file mode 100644 (file)
index 0000000..1bdc919
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PerformanceComponent } from './performance.component';
+
+describe('PerformanceComponent', () => {
+  let component: PerformanceComponent;
+  let fixture: ComponentFixture<PerformanceComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ PerformanceComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(PerformanceComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/performance/performance.component.ts b/usecaseui-portal/src/app/performance/performance.component.ts
new file mode 100644 (file)
index 0000000..12405e9
--- /dev/null
@@ -0,0 +1,16 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-performance',
+  templateUrl: './performance.component.html',
+  styleUrls: ['./performance.component.less']
+})
+export class PerformanceComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+
+  }
+
+}
diff --git a/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.css b/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.css
new file mode 100644 (file)
index 0000000..a1cc645
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.list {
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 10px;
+}
+.list nz-table tbody td span.onboarding {
+  font-size: 12px;
+  color: #147dc2;
+}
+.list nz-table tbody td span.onboarded {
+  font-size: 14px;
+  color: #147dc2;
+}
+.list nz-table tbody td span.updating {
+  font-size: 12px;
+  color: blue;
+}
+.list nz-table tbody td span.deleting {
+  font-size: 12px;
+  color: red;
+}
+.list nz-table tbody td span.invalid {
+  font-size: 14px;
+  color: purple;
+}
+.list nz-table tbody td i.anticon {
+  cursor: pointer;
+  font-size: 18px;
+  padding: 2px;
+}
+.list nz-table tbody td i.anticon:hover {
+  color: #147dc2;
+}
diff --git a/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.html b/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.html
new file mode 100644 (file)
index 0000000..d5286a3
--- /dev/null
@@ -0,0 +1,61 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> Onboard VNF </h3>
+<hr>
+<div class="list">
+    <nz-table #nzTable [nzData]="tableData" 
+        nzShowSizeChanger
+        [nzFrontPagination]="false" 
+        [nzShowQuickJumper]="true" 
+        [nzPageSizeOptions]="[5,10,15,20]" 
+        [nzTotal]= 'total'
+        [(nzPageSize)]="pageSize" 
+        [(nzPageIndex)]='pageIndex'
+        [nzLoading]="loading"
+        nzSize="middle"
+        (nzPageIndexChange)="searchData()"
+        (nzPageSizeChange)="searchData(true)">
+        <thead (nzSortChange)="sort($event)" nzSingleSort>
+            <tr>
+            <th nzWidth="5%">NO</th>
+            <th nzWidth="20%" nzShowSort nzSortKey="name"> Name </th>
+            <th nzWidth="20%">Type</th>
+            <th nzWidth="15%">Version</th>
+            <th nzWidth="20%">Status</th>
+            <th nzWidth="15%">Action</th>
+            </tr>
+        </thead>
+        <tbody>
+            <!-- <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index"> -->
+            <tr *ngFor="let item of nzTable.data; let i = index; ">
+                <td>{{i+1}}</td>
+                <td>{{item.name}}</td>
+                <td>{{item.type}}</td>
+                <td>{{item.version}}</td>
+                <td>
+                    <span [ngClass]="{'onboarding':item.status=='Onboarding','onboarded':item.status=='Onboarded',
+                        'updating':item.status=='Updating','deleting':item.status=='Deleting','invalid':item.status=='Invalid'}">{{item.status}}</span>
+                    <nz-progress *ngIf="item.status!='Onboarded' && item.status!='Invalid'" [nzPercent]="item.progress"></nz-progress>
+                </td>
+                <td>
+                    <i class="anticon anticon-cloud-upload-o" (click)="updataService()"></i>
+                    <i class="anticon anticon-delete" (click)="deleteService()"></i>
+                </td>
+            </tr>
+            <!-- </ng-template> -->
+        </tbody>
+    </nz-table>
+</div>
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.less b/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.less
new file mode 100644 (file)
index 0000000..ab11873
--- /dev/null
@@ -0,0 +1,50 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.list {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 10px;
+    nz-table {
+        tbody {
+            td {
+                span.onboarding {
+                    font-size: 12px;
+                    color: #147dc2;
+                }
+                span.onboarded {
+                    font-size: 14px;
+                    color: #147dc2;
+                }
+                span.updating {
+                    font-size: 12px;
+                    color: blue;
+                }
+                span.deleting {
+                    font-size: 12px;
+                    color: red;
+                }
+                span.invalid {
+                    font-size: 14px;
+                    color: purple;
+                }
+                i.anticon {
+                    cursor: pointer;
+                    font-size: 18px;
+                    padding: 2px;
+                    &:hover{
+                        color: #147dc2;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.spec.ts b/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.spec.ts
new file mode 100644 (file)
index 0000000..0e49f65
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { OnboardVnfVmComponent } from './onboard-vnf-vm.component';
+
+describe('OnboardVnfVmComponent', () => {
+  let component: OnboardVnfVmComponent;
+  let fixture: ComponentFixture<OnboardVnfVmComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ OnboardVnfVmComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(OnboardVnfVmComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.ts b/usecaseui-portal/src/app/services/onboard-vnf-vm/onboard-vnf-vm.component.ts
new file mode 100644 (file)
index 0000000..c42b3ce
--- /dev/null
@@ -0,0 +1,61 @@
+import { Component, OnInit, HostBinding } from '@angular/core';
+import { MyhttpService } from '../../myhttp.service';
+import { slideToRight } from '../../animates';
+
+@Component({
+  selector: 'app-onboard-vnf-vm',
+  templateUrl: './onboard-vnf-vm.component.html',
+  styleUrls: ['./onboard-vnf-vm.component.less'],
+  animations: [ slideToRight ]
+})
+export class OnboardVnfVmComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState;
+  constructor(private myhttp: MyhttpService) { }
+
+  ngOnInit() {
+    this.getTableData();
+  }
+
+
+  //表格数据
+  tableData = [];
+  pageIndex = 1;
+  pageSize = 10;
+  total = 100;
+  loading = false;
+  sortName = null;
+  sortValue = null;
+  getTableData(){
+    // 查询参数: 当前页码,每页条数,排序方式
+    let paramsObj = {
+      pageIndex:this.pageIndex,
+      pageSize:this.pageSize,
+      nameSort:this.sortValue
+    }
+    this.myhttp.getOnboardTableData(paramsObj)
+      .subscribe((data)=>{
+        console.log(data);
+        this.total = data.body.total;
+        this.tableData = data.body.tableList;
+      },(err)=>{
+        console.log(err);
+      })
+  }
+  sort(sort: { key: string, value: string }): void {
+    console.log(sort);
+    this.sortName = sort.key;
+    this.sortValue = sort.value;
+    this.getTableData();
+  }
+  searchData(reset:boolean = false){
+    console.log(reset)
+    this.getTableData();
+  }
+  updataService(){
+    console.log("updataService!");
+  }
+  deleteService(){
+    console.log("deleteService!");
+  }
+
+}
diff --git a/usecaseui-portal/src/app/services/services-list/services-list.component.css b/usecaseui-portal/src/app/services/services-list/services-list.component.css
new file mode 100644 (file)
index 0000000..eaf8fdd
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+.title {
+  font: 700 18px/18px "思源黑体";
+  color: #4c5e70;
+  margin-bottom: 18px;
+}
+hr {
+  border: none;
+  height: 2px;
+  background-color: #dce1e7;
+  margin-bottom: 20px;
+}
+.action {
+  margin-bottom: 20px;
+}
+.action span {
+  display: inline-block;
+  font: 700 14px "Arial";
+  color: #4c5e70;
+}
+.action nz-dropdown {
+  vertical-align: middle;
+}
+.action nz-dropdown :hover {
+  border-color: #147dc2;
+}
+.action nz-dropdown button {
+  width: 165px;
+  height: 30px;
+  background-color: #eceff4;
+  text-align: left;
+  border-color: #9fa9ab;
+}
+.action nz-dropdown button span {
+  font-weight: 400;
+  display: inline-block;
+  width: 120px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding-top: 2px;
+}
+.action nz-dropdown button i {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+}
+.action .create {
+  float: right;
+  height: 30px;
+  padding: 0 10px;
+}
+.action .create span {
+  color: #fff;
+  font-weight: 400;
+}
+.list {
+  background-color: #fff;
+  border-radius: 5px;
+  padding: 10px;
+}
+.list nz-table tbody td span.active {
+  font-size: 14px;
+  color: #147dc2;
+}
+.list nz-table tbody td span.closed {
+  font-size: 14px;
+  color: red;
+}
+.list nz-table tbody td span.onboarding {
+  font-size: 12px;
+  color: #147dc2;
+}
+.list nz-table tbody td span.updating {
+  font-size: 12px;
+  color: blue;
+}
+.list nz-table tbody td span.deleting {
+  font-size: 12px;
+  color: red;
+}
+.list nz-table tbody td span.creating {
+  font-size: 12px;
+  color: green;
+}
+.list nz-table tbody td i.anticon {
+  cursor: pointer;
+  font-size: 18px;
+  padding: 2px;
+}
+.list nz-table tbody td i.anticon:hover {
+  color: #147dc2;
+}
+.list nz-table tbody tr.childtr td {
+  font-size: 12px;
+  color: #147dc2;
+}
+.detailComponent {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100vh;
+  background-color: #f3f3f3;
+  overflow-y: auto;
+  padding: 20px 32px;
+  z-index: 3;
+}
+.createComponent {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100vh;
+  background-color: #f3f3f3;
+  overflow-y: auto;
+  padding: 20px 32px;
+  z-index: 3;
+}
diff --git a/usecaseui-portal/src/app/services/services-list/services-list.component.html b/usecaseui-portal/src/app/services/services-list/services-list.component.html
new file mode 100644 (file)
index 0000000..e086652
--- /dev/null
@@ -0,0 +1,185 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<h3 class="title"> Services List </h3>
+<hr>
+<div class="action">
+  <span>Customer: </span>
+  <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+    <button nz-button nz-dropdown><span>{{customerSelected.name}}</span> <i class="anticon anticon-down"></i></button>
+    <ul nz-menu style="max-height: 200px; overflow: auto;">
+      <li nz-menu-item (click)="choseCustomer(item)" *ngFor="let item of customerList">
+        <a title="{{item.name}}" style="max-width: 165px; overflow: hidden; text-overflow: ellipsis;">{{item.name}}</a>
+      </li>
+    </ul>
+  </nz-dropdown>
+  
+  &nbsp;&nbsp;
+  <span>Service Type: </span>
+  <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+    <button nz-button nz-dropdown><span>{{serviceTypeSelected.name}}</span> <i class="anticon anticon-down"></i></button>
+    <ul nz-menu style="max-height: 200px; overflow: auto;">
+      <li nz-menu-item (click)="choseServiceType(item)" *ngFor="let item of serviceTypeList">
+        <a title="{{item.name}}" style="max-width: 165px; overflow: hidden; text-overflow: ellipsis;">{{item.name}}</a>
+      </li>
+    </ul>
+  </nz-dropdown>
+
+  <button class="create" nz-button [nzType]="'primary'" (click)="showModal()"><i class="anticon anticon-plus-circle-o"></i><span> Create </span></button>
+  <nz-modal [(nzVisible)]="isVisible" nzTitle="Create" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">
+    <p>Content one</p>
+    <p>Content two</p>
+    <p>Content three</p>
+  </nz-modal>
+  <button class="create" nz-button [nzType]="'primary'" (click)="showModal2()"><i class="anticon anticon-plus-circle-o"></i><span> Create </span></button>
+  <nz-modal [(nzVisible)]="isVisible2" nzTitle="Create" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk2()">
+    <span style="display:inline-block;width:70px;">Service: </span>
+    <nz-select style="width: 165px;" [(ngModel)]="templateTypeSelected" nzAllowClear (ngModelChange)="choseTemplateType()">
+      <!-- <nz-option *ngFor="let item of templateType" [nzValue]="item" [nzLabel]="item"></nz-option> -->
+      <nz-option nzValue="SOTN" nzLabel="SOTN"></nz-option>
+      <nz-option nzValue="CCVPN" nzLabel="CCVPN"></nz-option>
+    </nz-select>
+
+    <hr>
+    <span>SOTN VPN: </span>
+    <nz-select style="width: 165px;" [(ngModel)]="template1" nzAllowClear >
+      <nz-option *ngFor="let item of templates" [nzValue]="item" [nzLabel]="item.name"></nz-option>
+    </nz-select>
+
+    <span> SITE: </span>
+    <nz-select style="width: 165px;" [(ngModel)]="template2" nzAllowClear >
+      <nz-option *ngFor="let item of templates" [nzValue]="item" [nzLabel]="item.name"></nz-option>
+    </nz-select>
+    
+    <div *ngIf="templateTypeSelected == 'CCVPN'">
+      <br>
+      <span style="display:inline-block;width:70px;">SD-WAN: </span>
+      <nz-select style="width: 165px;" [(ngModel)]="template3" nzAllowClear >
+        <nz-option *ngFor="let item of templates" [nzValue]="item" [nzLabel]="item.name"></nz-option>
+      </nz-select>
+    </div>
+  </nz-modal>
+</div>
+<div class="list">
+    <nz-table *ngIf="1"
+      #nzTable [nzData]="tableData" 
+      nzShowSizeChanger 
+      [nzFrontPagination]="false" 
+      [nzShowQuickJumper]="true" 
+      [nzPageSizeOptions]="[5,10,15,20]" 
+      [nzTotal]= 'total'
+      [(nzPageSize)]="pageSize" 
+      [(nzPageIndex)]='pageIndex'
+      [nzLoading]="loading"
+      [nzSize]="'middle'"
+      [nzScroll]="{ y: '58vh' }"
+      (nzPageIndexChange)="searchData()"
+      (nzPageSizeChange)="searchData(true)">
+      <thead (nzSortChange)="sort($event)" nzSingleSort>
+        <tr>
+          <th nzWidth="5%">NO</th>
+          <th nzWidth="5%"></th>
+          <th nzWidth="20%" nzShowSort nzSortKey="name">Service Instance Id</th>
+          <th nzWidth="20%">Name</th>
+          <th nzWidth="15%">Type</th>
+          <th nzWidth="20%">Status</th>
+          <th nzWidth="15%">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <ng-template ngFor let-data [ngForOf]="nzTable.data" let-i="index">
+          <tr>
+            <td>{{i+1}}</td>
+            <td [nzShowExpand]="data.children[0]" [(nzExpand)]="data.expand"></td>
+            <td>{{data.serviceId}}</td>
+            <td>{{data.name}}</td>
+            <td>{{data.type}}</td>
+            <td>
+              <span [ngClass]="{'active':data.status=='Active','closed':data.status=='Closed','onboarding':data.status=='Onboarding',
+                    'updating':data.status=='Updating','deleting':data.status=='Deleting','creating':data.status=='Creating'}">{{data.status}}</span>
+              <nz-progress *ngIf="data.status!='Active' && data.status!='Closed'" [nzPercent]="data.progress"></nz-progress>
+            </td>
+            <td>
+              <i class="anticon anticon-setting" (click)="scaleService()"></i>
+              <i class="anticon anticon-cloud-upload-o" (click)="updataService()"></i>
+              <i class="anticon anticon-delete" (click)="deleteService()"></i>
+            </td>
+          </tr>
+          <tr class="childtr" [nzExpand]="data.expand" *ngFor="let item of data.children">
+            <td></td>
+            <td></td>
+            <td>{{item.serviceId}}</td>
+            <td>{{item.name}}</td>
+            <td colspan="3">{{item.type}}</td>
+          </tr>
+        </ng-template>
+      </tbody>
+    </nz-table>
+    <nz-table *ngIf="1"
+        #nzTable2 [nzData]="tableData2" 
+        nzShowSizeChanger
+        [nzFrontPagination]="true" 
+        [nzShowQuickJumper]="true" 
+        [nzPageSizeOptions]="[5,10,15,20]" 
+        [(nzPageSize)]="pageSize" 
+        [(nzPageIndex)]='pageIndex'
+        nzSize="middle"
+        [nzScroll]="{ y: '58vh' }">
+        <thead nzSingleSort>
+          <tr>
+            <th nzWidth="5%">NO.</th>
+            <th nzWidth="20%"> Instance ID </th>
+            <th nzWidth="20%">Instance Name</th>
+            <!-- <th nzWidth="10%">Type</th> -->
+            <th nzWidth="25%">Description</th>
+            <th nzWidth="15%">Status</th>
+            <th nzWidth="10%">Action</th>
+          </tr>
+        </thead>
+        <tbody>
+            <!-- <ng-template ngFor let-data [ngForOf]="nzTable2.data" let-i="index"> -->
+            <tr *ngFor="let item of nzTable2.data; let i = index; ">
+                <td>{{pageSize*(pageIndex-1) + i+1}}</td>
+                <td>{{item.sotnvpnSer['service-instance-id']}}</td>
+                <td>{{item.sotnvpnSer['service-instance-name']}}</td>
+                <!-- <td>{{item.type}}</td> -->
+                <td>{{item.sotnvpnSer.description}}</td>
+                <td>
+                    <span *ngIf="item.sotnvpnSer.status!='creating' && item.sotnvpnSer.status!='deleting'">{{item.sotnvpnSer.status}}</span>
+                    <span *ngIf="item.sotnvpnSer.status=='creating' || item.sotnvpnSer.status=='deleting'" [ngClass]="{'deleting':item.sotnvpnSer.status=='deleting','creating':item.sotnvpnSer.status=='creating'}">{{item.sotnvpnSer.status}}</span>
+                    <nz-progress *ngIf="item.sotnvpnSer.status=='creating' || item.sotnvpnSer.status=='deleting'" [nzPercent]="item.sotnvpnSer.rate"></nz-progress>
+                </td>
+                <td>
+                    <span title="detail" class="action" [ngClass]="{'cannotclick':item.sotnvpnSer.status=='deleting'||item.sotnvpnSer.status=='creating'}" 
+                      (click)="showDetail(item)"> <i class="anticon anticon-ellipsis"></i> </span>
+                    <span title="delete" class="action" [ngClass]="{'cannotclick':item.sotnvpnSer.status=='deleting'||item.sotnvpnSer.status=='creating'}" 
+                      (click)="deleteInstace(item)"> <i class="anticon anticon-delete"></i> </span>
+                </td>
+            </tr>
+            <!-- </ng-template> -->
+        </tbody>
+    </nz-table>
+</div>
+
+<div class="detailComponent" *ngIf="detailshow">
+  <app-ccvpn-detail [namesTranslate]="namesTranslate" [detailParams]="detailData" (closeDetail)="detailshow = false;"></app-ccvpn-detail>
+</div>
+<div class="createComponent" *ngIf="createshow">
+  <app-ccvpn-creation 
+    [createParams]="createData" 
+    [namesTranslate]="namesTranslate" 
+    (closeCreate)="closeCreate($event)">
+  </app-ccvpn-creation>
+</div>
diff --git a/usecaseui-portal/src/app/services/services-list/services-list.component.less b/usecaseui-portal/src/app/services/services-list/services-list.component.less
new file mode 100644 (file)
index 0000000..7e8ff80
--- /dev/null
@@ -0,0 +1,127 @@
+.title {
+    font: 700 18px/18px "思源黑体";
+    color: #4c5e70;
+    margin-bottom: 18px; 
+}
+hr {
+    border: none;
+    height: 2px;
+    background-color: #dce1e7;
+    margin-bottom: 20px;
+}
+.action {
+    margin-bottom: 20px;
+    span {
+        display: inline-block;
+        font: 700 14px "Arial";
+        color: #4c5e70;
+    }
+    nz-dropdown {
+        vertical-align: middle;
+        :hover{
+            border-color: #147dc2;
+        }
+        button {
+            width: 165px;
+            height: 30px;
+            background-color: #eceff4;
+            text-align: left;
+            border-color: #9fa9ab;
+            span {
+                font-weight: 400;
+                display: inline-block;
+                width: 120px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                padding-top: 2px;
+            }
+            i {
+                position: absolute;
+                top: 10px;
+                right: 10px;
+            }
+        }
+        //下拉框中的样式在style.less中,下拉框是在body中额外临时生成的
+    }
+    .create {
+        float: right;
+        height: 30px;
+        padding: 0 10px;
+        span {
+            color: #fff;
+            font-weight: 400;
+        }
+    }
+}
+.list {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 10px;
+    nz-table {
+        tbody {
+            td {
+                span.active {
+                    font-size: 14px;
+                    color: #147dc2;
+                }
+                span.closed {
+                    font-size: 14px;
+                    color: red;
+                }
+                span.onboarding{
+                    font-size: 12px;
+                    color: #147dc2;
+                }
+                span.updating{
+                    font-size: 12px;
+                    color: blue;
+                }
+                span.deleting {
+                    font-size: 12px;
+                    color: red;
+                }
+                span.creating {
+                    font-size: 12px;
+                    color: green;
+                }
+                i.anticon {
+                    cursor: pointer;
+                    font-size: 18px;
+                    padding: 2px;
+                    &:hover{
+                        color: #147dc2;
+                    }
+                }
+            }
+            tr.childtr {
+                td {
+                    font-size: 12px;
+                    color: #147dc2;
+                }
+            }
+        }
+    }
+}
+
+.detailComponent {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100vh;
+    background-color: #f3f3f3;
+    overflow-y: auto;
+    padding: 20px 32px;
+    z-index: 3;
+}
+.createComponent {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100vh;
+    background-color: #f3f3f3;
+    overflow-y: auto;
+    padding: 20px 32px;
+    z-index: 3;
+}
diff --git a/usecaseui-portal/src/app/services/services-list/services-list.component.spec.ts b/usecaseui-portal/src/app/services/services-list/services-list.component.spec.ts
new file mode 100644 (file)
index 0000000..61440dc
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ServicesListComponent } from './services-list.component';
+
+describe('ServicesListComponent', () => {
+  let component: ServicesListComponent;
+  let fixture: ComponentFixture<ServicesListComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ServicesListComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ServicesListComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/services/services-list/services-list.component.ts b/usecaseui-portal/src/app/services/services-list/services-list.component.ts
new file mode 100644 (file)
index 0000000..d893070
--- /dev/null
@@ -0,0 +1,511 @@
+import { Component, OnInit, HostBinding } from '@angular/core';
+import { MyhttpService } from '../../myhttp.service';
+import { slideToRight } from '../../animates';
+import { NzModalService } from 'ng-zorro-antd';
+
+@Component({
+  selector: 'app-services-list',
+  templateUrl: './services-list.component.html',
+  styleUrls: ['./services-list.component.less'],
+  animations: [ slideToRight ]
+})
+export class ServicesListComponent implements OnInit {
+  @HostBinding('@routerAnimate') routerAnimateState;
+  constructor(private myhttp: MyhttpService, private modalService: NzModalService) { }
+
+  ngOnInit() {
+    this.getallCustomers();
+    this.getTemplateSubTypes();
+    this.inputNamests();
+  }
+  // 筛选框(下拉框)customer servicetype
+  customerList = [];
+  customerSelected = {name:null,id:null};
+  serviceTypeList = [];
+  serviceTypeSelected = {name:null,id:null};
+
+  // 获取所有customer
+  getallCustomers(){
+    this.myhttp.getAllCustomers()
+      .subscribe((data)=>{
+        this.customerList = data.map((item)=>{return {name:item["subscriber-name"],id:item["global-customer-id"]}});
+        this.customerSelected = this.customerList[0];
+        this.choseCustomer(this.customerSelected);
+        // console.log(this.customers)
+      })
+  }
+
+  choseCustomer(item){
+    this.customerSelected = item;
+    this.myhttp.getServiceTypes(this.customerSelected)
+      .subscribe((data)=>{
+        this.serviceTypeList = data.map((item)=>{return {name:item["service-type"]}});
+        this.serviceTypeSelected = this.serviceTypeList[0];
+        this.choseServiceType(this.serviceTypeSelected);
+        // console.log(this.listServiceTypes);
+      })
+  }
+  choseServiceType(item){
+    this.serviceTypeSelected = item;
+    this.getTableData();
+  }
+
+  // 模态框(对话框) create
+  isVisible = false;
+  showModal(): void {
+    this.isVisible = true;
+  }
+  handleOk(): void {
+    console.log('Button ok clicked!');
+    this.isVisible = false;
+  }
+  handleCancel(): void {
+    console.log('Button cancel clicked!');
+    this.isVisible = false;
+    this.isVisible2 = false;
+  }
+
+  // 创建模态框2(对话框) create -------------------------------
+  isVisible2 = false;
+  showModal2(): void {
+    this.isVisible2 = true;
+    this.templates1 = [];  //多次创建会push累积名字,从新置空
+    this.templates2 = [];
+    this.templates3 = [];
+    this.getAlltemplates();
+  }
+  // 服务
+  templateTypeSelected = "SOTN";
+  choseTemplateType(){
+    // this.filterTemplates();//分类
+  }
+  // 模板
+  templates = []; templates1;templates2;templates3;
+    template1={name:null};
+    template2={name:null};
+    template3={name:null};
+  // 模板分类数据,创建、获取实例分类共用
+  templateSubTypes = {};  //子类,sotnvpn、site、sdwan
+  getTemplateSubTypes(){
+    this.myhttp.getServicesCategory()
+      .subscribe((data)=>{
+        this.templateSubTypes = data;
+      },(err)=>{
+        console.log("getTemplateTypes err")
+      })
+  }
+
+  getAlltemplates(){  //获取所有模板类型
+    this.myhttp.getAllServiceTemplates()
+      .subscribe((data)=>{
+        console.log(data)
+        this.templates = data;
+        this.template1 = data[0];
+        this.template2 = data[1];
+        this.template3 = data[2];
+        // this.filterTemplates();//分类
+      },(err)=>{
+
+      })
+  }
+  // filterTemplates(){ //模板类型分类,本地配置文件
+  //     this.templates1 = [];
+  //     this.templates2 = [];
+  //     this.templates3 = [];
+  //     this.templates.forEach((item)=>{
+  //       this.templateSubTypes[this.templateTypeSelected].sotnvpn.find((d)=>{
+  //         return d["model-invariant-id"] == item.uuid && d["model-version-id"] == item.invariantUUID 
+  //       })?this.templates1.push(item):null;
+  //       this.templateSubTypes[this.templateTypeSelected].site.find((d)=>{
+  //         return d["model-invariant-id"] == item.uuid && d["model-version-id"] == item.invariantUUID 
+  //       })?this.templates2.push(item):null;
+  //       if(this.templateTypeSelected=="CCVPN"){
+  //         this.templateSubTypes[this.templateTypeSelected].sdwan.find((d)=>{
+  //           return d["model-invariant-id"] == item.uuid && d["model-version-id"] == item.invariantUUID 
+  //         })?this.templates3.push(item):null;
+  //       }
+  //     })
+  //     this.template1 = this.templates1[0];
+  //     this.template2 = this.templates2[0];
+  //     if(this.templates3[0]){
+  //       this.template3 = this.templates3[0];
+  //     } 
+  // }
+
+
+  // 确定、取消
+  createshow = false;
+  createData:Object={};
+  handleOk2(): void {
+    console.log('Button ok clicked!');
+    this.isVisible2 = false;
+    let data1 = {commonParams:{customer:this.customerSelected, serviceType:this.serviceTypeSelected, templateType:"SOTN"},templates:{template1:this.template1,template2:this.template2}};
+    let data2 = {commonParams:{customer:this.customerSelected, serviceType:this.serviceTypeSelected, templateType:"CCVPN"},templates:{template1:this.template1,template2:this.template2,template3:this.template3}};
+    
+    this.createData = this.templateTypeSelected == "SOTN" ? data1 : data2;
+    this.createshow = true;
+  }
+  // handleCancel(): void {
+  //   console.log('Button cancel clicked!');
+  //   this.isVisible2 = false;
+  // }
+
+
+  //表格数据
+  tableData = [];
+  pageIndex = 1;
+  pageSize = 10;
+  total = 100;
+  loading = false;
+  sortName = null;
+  sortValue = null;
+  getTableData(){
+    // 查询参数: customer serviceType 当前页码,每页条数,排序方式
+    let paramsObj = {
+      customer:this.customerSelected,
+      serviceType:this.serviceTypeSelected,
+      pageIndex:this.pageIndex,
+      pageSize:this.pageSize,
+      serviceIdSort:this.sortValue
+    }
+    this.myhttp.getServicesTableData(paramsObj)
+      .subscribe((data)=>{
+        console.log(data);
+        this.total = data.body.total;
+        this.tableData = data.body.tableList;
+      },(err)=>{
+        console.log(err);
+      })
+  }
+  sort(sort: { key: string, value: string }): void {
+    console.log(sort);
+    this.sortName = sort.key;
+    this.sortValue = sort.value;
+    this.getTableData();
+  }
+  searchData(reset:boolean = false){
+    console.log(reset)
+    this.getTableData();
+  }
+
+  scaleService(){
+    console.log("scaleService!");
+  }
+  updataService(){
+    console.log("updataService!");
+  }
+  deleteService(){
+    console.log("deleteService!");
+  }
+
+  //表格数据
+  tableData2 = [];
+  getTableData2(){
+    let params = {
+      customerId:this.customerSelected.id,
+      serviceType:this.serviceTypeSelected
+    }
+    this.myhttp.getInstanceTableData(params)
+      .subscribe((data)=>{
+        this.pageIndex = 1;
+        this.tableData2 = [];
+        console.log(data)
+        // data.results.forEach((item)=>{ 
+        //   item["sotnvpnSer"] = item["service-subscription"]["service-instances"]["service-instance"].find((d)=>{ 
+        //     return this.templateSubTypes["SOTN"].sotnvpn.find((m)=>{ 
+        //       return d["model-invariant-id"]==m["model-invariant-id"] && d["model-version-id"]==m["model-version-id"]
+        //     })?item["Type"]="SOTN":null || this.templateSubTypes["CCVPN"].sotnvpn.find((m)=>{ 
+        //       return d["model-invariant-id"]==m["model-invariant-id"] && d["model-version-id"]==m["model-version-id"]
+        //     })?item["Type"]="CCVPN":null
+        //   })
+
+        //   if(item["sotnvpnSer"]){
+        //     this.tableData2.push(item);
+        //   }
+        // })
+
+        //---------数据结构有问题,模拟只有一组数据情况---------//
+        data["sotnvpnSer"] = data["service-instance"].find((d)=>{ 
+          return this.templateSubTypes["SOTN"].sotnvpn.find((m)=>{ 
+            return d["model-invariant-id"]==m["model-invariant-id"] && d["model-version-id"]==m["model-version-id"]
+          })?d["Type"]="SOTN":null || this.templateSubTypes["CCVPN"].sotnvpn.find((m)=>{ 
+            return d["model-invariant-id"]==m["model-invariant-id"] && d["model-version-id"]==m["model-version-id"]
+          })?d["Type"]="CCVPN":null
+        })
+        let inputParams = JSON.parse(data["sotnvpnSer"]["input-parameters"]).service.parameters.requestInputs;
+        let descriptionName = Object.keys(inputParams).find((item)=>{ return item.endsWith("_description")});
+        data["sotnvpnSer"]["description"] = inputParams[descriptionName];
+        data["sotnvpnSer"]["status"] = "Active";
+        this.tableData2.push(data);
+
+        console.log(this.tableData2)
+      },(err)=>{
+        console.log(err);
+      })
+  }
+
+  // 显示详情
+  detailshow = false;
+  detailData:Object;
+  showDetail(service){
+    service["siteSer"]=[];
+    service["sdwanSer"]=[];
+    service["customer"]=this.customerSelected;
+    service["serviceType"] = this.serviceTypeSelected;
+    // service["service-subscription"]["service-instances"]["service-instance"].forEach((item)=>{
+    //   this.templateSubTypes[service.Type].site.find((d)=>{
+    //     return d["model-invariant-id"] == item["model-invariant-id"] && d["model-version-id"] == item["model-version-id"] 
+    //   })?service["siteSer"].push(item):null;
+    //   if(service.Type=="CCVPN"){
+    //     this.templateSubTypes[service.Type].sdwan.find((d)=>{
+    //       return d["model-invariant-id"] == item["model-invariant-id"] && d["model-version-id"] == item["model-version-id"] 
+    //     })?service["sdwanSer"].push(item):null;
+    //   }
+    // })
+    service["service-instance"].forEach((item)=>{
+      this.templateSubTypes[service.sotnvpnSer.Type].site.find((d)=>{
+        return d["model-invariant-id"] == item["model-invariant-id"] && d["model-version-id"] == item["model-version-id"] 
+      })?service["siteSer"].push(item):null;
+      if(service.sotnvpnSer.Type=="CCVPN"){
+        this.templateSubTypes[service.sotnvpnSer.Type].sdwan.find((d)=>{
+          return d["model-invariant-id"] == item["model-invariant-id"] && d["model-version-id"] == item["model-version-id"] 
+        })?service["sdwanSer"].push(item):null;
+      }
+    })
+    this.detailshow = true;
+    this.detailData = service;
+    console.log(service);
+  }
+  // 删除 确认模态框
+  deleteInstace(service){
+    // 创建确认框
+    this.modalService.confirm({
+      nzTitle     : 'Are you sure delete this instance?',
+      nzContent   : `Instance ID: <b class="deleteModelContent"> ${service.sotnvpnSer["service-instance-id"]}</b>`,
+      nzOkText    : 'Yes',
+      nzOkType    : 'danger',
+      nzOnOk      : () => {
+        console.log(service);
+        let allprogress = {};  //所有进度值,以operationId为键
+        let querypros = [];  //所有查询
+        service.sotnvpnSer.rate = 0;
+        service.sotnvpnSer.status = "deleting";
+        // let deletePros = service["service-subscription"]["service-instances"]["service-instance"].map((item)=>{
+        //   let id = item["service-instance-id"];
+        //   return new Promise((res,rej)=>{
+        //     this.myhttp.deleteInstance(id)
+        //     .subscribe((data)=>{
+        //       let obj = {serviceId:id,operationId:data.operationId}
+        //       let updata = (prodata)=>{
+        //         allprogress[prodata.operationId] = prodata.progress;
+        //         let average = ((arr)=>{return eval(arr.join("+"))/arr.length})(Object.values(allprogress));
+        //         service.sotnvpnSer["rate"]=average;
+        //       }
+        //       querypros.push(this.queryProgress(obj,updata));
+        //       res();
+        //     })
+        //   })  
+        // })
+        let deletePros = service["service-instance"].map((item)=>{
+          let params = {
+            globalSubscriberId:this.customerSelected.id,
+            serviceType:this.serviceTypeSelected,
+            serviceInstanceId:item["service-instance-id"]
+          }
+          return new Promise((res,rej)=>{
+            this.myhttp.deleteInstance(params)
+            .subscribe((data)=>{
+              let obj = {serviceId:params.serviceInstanceId,operationId:data.operationId}
+              let updata = (prodata)=>{
+                allprogress[prodata.operationId] = prodata.progress;
+                let average = ((arr)=>{return eval(arr.join("+"))/arr.length})(Object.values(allprogress));
+                service.sotnvpnSer["rate"]=average;
+              }
+              querypros.push(this.queryProgress(obj,updata));
+              res();
+            })
+          })  
+        })
+        console.log(deletePros)
+        Promise.all(deletePros).then(()=>{
+          Promise.all(querypros).then((data)=>{
+            console.log(data);
+            service.sotnvpnSer.rate = 100;
+            service.sotnvpnSer.status = "deleted";
+            setTimeout(()=>{
+              this.getTableData();
+            },1000)
+          })
+        })
+
+      },
+      nzCancelText: 'No',
+      nzOnCancel  : () => console.log('Cancel')
+    });
+  }
+
+
+  closeCreate(obj){
+    if(!obj){
+      this.createshow = false; //关闭创建窗口
+      return false;
+    }
+    this.createshow = false; //关闭创建窗口
+    console.log(obj);
+    let newData; //主表格中新创建的服务数据
+    let stageNum = 0; //不同阶段进度,用于后续服务进度相加;
+    // --------------------------------------------------------------------------
+        // obj.groupbody.map((group)=>{  //所有创建
+        //   return this.createService(group)
+        // })
+        // obj.sitebody.map((group)=>{  //所有创建
+        //   console.log(group)
+        //   return this.createService(group)
+        // })
+    // -----------------------------------------------------------------------------
+    this.createService(obj.vpnbody).then((data)=>{
+      console.log(data)
+      newData = {  //主表格中新创建的服务数据
+        'service-instance-id':data["serviceId"],
+        'service-instance-name':obj.vpnbody.service.name,
+        description:obj.vpnbody.service.description,
+        status:"creating",
+        rate:0,
+      }
+      this.tableData2 = [{sotnvpnSer:newData},...this.tableData2];
+      let updata = (prodata)=>{
+        newData.rate = Math.floor(prodata.progress/3);   
+      }
+      let queryParams = {serviceId:data["serviceId"],operationId:data["operationId"]};
+      return this.queryProgress(queryParams,updata);
+    }).then((data)=>{
+      console.log(data);
+      stageNum = newData.rate; //阶段进度值更新;
+      let allprogress = {};  //所有进度值,以operationId为键
+      let querypros = [];  //所有查询
+      let createPros = obj.groupbody.map((group)=>{  //所有创建
+        return this.createService(group).then((data)=>{
+          console.log(data);
+          let updata = (prodata)=>{
+            allprogress[prodata.operationId] = prodata.progress;
+            let average = ((arr)=>{return eval(arr.join("+"))/arr.length})(Object.values(allprogress)) 
+            newData.rate = Math.floor(average/3) + stageNum;
+          }
+          let queryParams = {serviceId:data["serviceId"],operationId:data["operationId"]};
+          querypros.push(this.queryProgress(queryParams,updata))
+        })
+      })
+
+      return new Promise((res)=>{
+        Promise.all(createPros).then(()=>{  //所有创建好之后querypros中查询进度才全都添加完毕
+          Promise.all(querypros).then((data)=>{
+            console.log(data);
+            res("site--begin");
+          })
+        }) 
+      })
+    }).then((data)=>{
+      console.log(data);
+      stageNum = newData.rate; //阶段进度值更新;
+      let allprogress = {};
+      let querypros = [];  //所有查询
+      let createPros = obj.sitebody.map((group)=>{  //所有创建
+        return this.createService(group).then((data)=>{
+          console.log(data);
+          let updata = (prodata)=>{
+            allprogress[prodata.operationId] = prodata.progress;
+            let average =((arr)=>{return eval(arr.join("+"))/arr.length})(Object.values(allprogress)) 
+            newData.rate = Math.floor(average/3) + stageNum;
+          }
+          let queryParams = {serviceId:data["serviceId"],operationId:data["operationId"]};
+          querypros.push(this.queryProgress(queryParams,updata))
+        })
+      })
+      console.log(createPros);
+      Promise.all(createPros).then(()=>{  //所有创建好之后querypros中查询进度才全都添加完毕
+        Promise.all(querypros).then((data)=>{
+          console.log(data);
+          newData.rate = 100;
+          newData.status = "completed";
+          setTimeout(()=>{
+            this.getTableData();
+          },1000)
+        })
+      }) 
+    })
+
+  }
+
+  createService(params){
+    let mypromise = new Promise((res,rej)=>{
+      this.myhttp.createInstance(params)
+        .subscribe((data)=>{
+          
+          res(data.service);
+        })
+    })
+    return mypromise;
+  }
+  queryProgress(obj,callback){
+    let mypromise = new Promise((res,rej)=>{
+      // let data = {
+      //   operationStatus:{
+      //     "operationId": "XXXXXX",
+      //     "operation": "create|delete|update|scale",
+      //     "result": "finished|error|processing",
+      //     "reason": "",
+      //     "userId": "",
+      //     "operationContent": "Be creating pop.",
+      //     "progress": 0,
+      //     "operateAt": "",
+      //     "finishedAt": "" 
+      //   }
+      // }
+      let requery = ()=>{
+        this.myhttp.getProgress(obj)
+          .subscribe((data)=>{
+            if(data.operationStatus.progress==undefined){
+              console.log(data);
+              setTimeout(()=>{
+                requery();
+              },5000)
+              return false;
+            }
+            if(data.operationStatus.progress < 100){
+              callback(data.operationStatus);
+              setTimeout(()=>{
+                requery();
+              },5000)
+            }else {
+              res(data.operationStatus);
+            }     
+          })
+        // setTimeout(()=>{
+        //   console.log(data.operationStatus.progress)
+        //   data.operationStatus.progress++;        
+        //   if(data.operationStatus.progress<100){
+        //     callback(data.operationStatus);
+        //     requery()
+        //   }else{
+        //     callback(data.operationStatus);
+        //     res(data.operationStatus)
+        //   }
+        // },100)
+      }
+      requery();
+    })
+    return mypromise;
+  }
+
+
+  // 名字转换参数匹配 --> 传给子组件用
+  namesTranslate:Object;
+  inputNamests(){
+    this.myhttp.inputNamesTransform()
+      .subscribe((data)=>{
+        this.namesTranslate = data;
+      })
+  }
+
+}
diff --git a/usecaseui-portal/src/app/services/services.component.html b/usecaseui-portal/src/app/services/services.component.html
new file mode 100644 (file)
index 0000000..c4fddfc
--- /dev/null
@@ -0,0 +1,18 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<p>
+  services works!
+</p>
diff --git a/usecaseui-portal/src/app/services/services.component.less b/usecaseui-portal/src/app/services/services.component.less
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/usecaseui-portal/src/app/services/services.component.spec.ts b/usecaseui-portal/src/app/services/services.component.spec.ts
new file mode 100644 (file)
index 0000000..2e76b9f
--- /dev/null
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ServicesComponent } from './services.component';
+
+describe('ServicesComponent', () => {
+  let component: ServicesComponent;
+  let fixture: ComponentFixture<ServicesComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ServicesComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ServicesComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/usecaseui-portal/src/app/services/services.component.ts b/usecaseui-portal/src/app/services/services.component.ts
new file mode 100644 (file)
index 0000000..eec235b
--- /dev/null
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-services',
+  templateUrl: './services.component.html',
+  styleUrls: ['./services.component.less']
+})
+export class ServicesComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}
diff --git a/usecaseui-portal/src/assets/i18n/en.json b/usecaseui-portal/src/assets/i18n/en.json
new file mode 100644 (file)
index 0000000..9b191f8
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "Language":"--:",
+    "zh":"Chinese",
+    "en":"English",
+
+  "app-component":"--:",
+    "Home":"Home",
+    "Services":"Services",
+    "Services List":"Services List",
+    "Alarm":"Alarm",
+    "Performance":"Performance",
+    "Monitor":"Monitor",
+    "Network":"Network",
+
+  "home-component":"--:",
+    "Overall trend":"Overall trend",
+    "SERVICES":"SERVICES",
+    "services":"services",
+    "services has been created":"services has been created",
+    "PERFORMANCE":"PERFORMANCE",
+    "VM Performance":"VM Performance"
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/i18n/zh.json b/usecaseui-portal/src/assets/i18n/zh.json
new file mode 100644 (file)
index 0000000..c360c82
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "Language":"--:",
+    "zh":"中文",
+    "en":"英文",
+    
+  "app-component":"--:",
+    "Home":"首页",
+    "Services":"服务",
+    "Services List":"服务列表",
+    "Alarm":"告警",
+    "Monitor":"监控",
+    "Performance":"性能",
+    "Network":"网云",
+
+  "home-component":"--:",
+    "Overall trend":"总体趋势",
+    "SERVICES":"服务",
+    "services":"条服务",
+    "services has been created":"条已创建的服务",
+    "PERFORMANCE":"性能",
+    "VM Performance":"VM 性能"
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/images/VM.png b/usecaseui-portal/src/assets/images/VM.png
new file mode 100644 (file)
index 0000000..72b31a5
Binary files /dev/null and b/usecaseui-portal/src/assets/images/VM.png differ
diff --git a/usecaseui-portal/src/assets/images/VNF.png b/usecaseui-portal/src/assets/images/VNF.png
new file mode 100644 (file)
index 0000000..21b64db
Binary files /dev/null and b/usecaseui-portal/src/assets/images/VNF.png differ
diff --git a/usecaseui-portal/src/assets/images/VNF1.png b/usecaseui-portal/src/assets/images/VNF1.png
new file mode 100644 (file)
index 0000000..0d37beb
Binary files /dev/null and b/usecaseui-portal/src/assets/images/VNF1.png differ
diff --git a/usecaseui-portal/src/assets/images/VNF2.png b/usecaseui-portal/src/assets/images/VNF2.png
new file mode 100644 (file)
index 0000000..70a43a7
Binary files /dev/null and b/usecaseui-portal/src/assets/images/VNF2.png differ
diff --git a/usecaseui-portal/src/assets/images/VNF3.png b/usecaseui-portal/src/assets/images/VNF3.png
new file mode 100644 (file)
index 0000000..e590434
Binary files /dev/null and b/usecaseui-portal/src/assets/images/VNF3.png differ
diff --git a/usecaseui-portal/src/assets/images/bigcloud.png b/usecaseui-portal/src/assets/images/bigcloud.png
new file mode 100644 (file)
index 0000000..23bf737
Binary files /dev/null and b/usecaseui-portal/src/assets/images/bigcloud.png differ
diff --git a/usecaseui-portal/src/assets/images/cloud-city1.png b/usecaseui-portal/src/assets/images/cloud-city1.png
new file mode 100644 (file)
index 0000000..051f774
Binary files /dev/null and b/usecaseui-portal/src/assets/images/cloud-city1.png differ
diff --git a/usecaseui-portal/src/assets/images/cloud-county1.png b/usecaseui-portal/src/assets/images/cloud-county1.png
new file mode 100644 (file)
index 0000000..feb6a4a
Binary files /dev/null and b/usecaseui-portal/src/assets/images/cloud-county1.png differ
diff --git a/usecaseui-portal/src/assets/images/cloud-out.png b/usecaseui-portal/src/assets/images/cloud-out.png
new file mode 100644 (file)
index 0000000..aeec4fd
Binary files /dev/null and b/usecaseui-portal/src/assets/images/cloud-out.png differ
diff --git a/usecaseui-portal/src/assets/images/cloud-site.png b/usecaseui-portal/src/assets/images/cloud-site.png
new file mode 100644 (file)
index 0000000..97db051
Binary files /dev/null and b/usecaseui-portal/src/assets/images/cloud-site.png differ
diff --git a/usecaseui-portal/src/assets/images/domain.png b/usecaseui-portal/src/assets/images/domain.png
new file mode 100644 (file)
index 0000000..68027b2
Binary files /dev/null and b/usecaseui-portal/src/assets/images/domain.png differ
diff --git a/usecaseui-portal/src/assets/images/icon.png b/usecaseui-portal/src/assets/images/icon.png
new file mode 100644 (file)
index 0000000..3c6f04e
Binary files /dev/null and b/usecaseui-portal/src/assets/images/icon.png differ
diff --git a/usecaseui-portal/src/assets/images/loading.gif b/usecaseui-portal/src/assets/images/loading.gif
new file mode 100644 (file)
index 0000000..57a6df2
Binary files /dev/null and b/usecaseui-portal/src/assets/images/loading.gif differ
diff --git a/usecaseui-portal/src/assets/images/open-close.png b/usecaseui-portal/src/assets/images/open-close.png
new file mode 100644 (file)
index 0000000..27e8f30
Binary files /dev/null and b/usecaseui-portal/src/assets/images/open-close.png differ
diff --git a/usecaseui-portal/src/assets/images/open-close2.png b/usecaseui-portal/src/assets/images/open-close2.png
new file mode 100644 (file)
index 0000000..0dd0086
Binary files /dev/null and b/usecaseui-portal/src/assets/images/open-close2.png differ
diff --git a/usecaseui-portal/src/assets/images/out-domain.png b/usecaseui-portal/src/assets/images/out-domain.png
new file mode 100644 (file)
index 0000000..6bcdd55
Binary files /dev/null and b/usecaseui-portal/src/assets/images/out-domain.png differ
diff --git a/usecaseui-portal/src/assets/images/site.png b/usecaseui-portal/src/assets/images/site.png
new file mode 100644 (file)
index 0000000..b63bc2e
Binary files /dev/null and b/usecaseui-portal/src/assets/images/site.png differ
diff --git a/usecaseui-portal/src/assets/images/tildeimg.png b/usecaseui-portal/src/assets/images/tildeimg.png
new file mode 100644 (file)
index 0000000..e39a315
Binary files /dev/null and b/usecaseui-portal/src/assets/images/tildeimg.png differ
diff --git a/usecaseui-portal/src/assets/images/tp.png b/usecaseui-portal/src/assets/images/tp.png
new file mode 100644 (file)
index 0000000..9daf005
Binary files /dev/null and b/usecaseui-portal/src/assets/images/tp.png differ
diff --git a/usecaseui-portal/src/assets/json/LogicalLinksData.json b/usecaseui-portal/src/assets/json/LogicalLinksData.json
new file mode 100644 (file)
index 0000000..99487f9
--- /dev/null
@@ -0,0 +1,168 @@
+{
+  "logical-link": [
+    {
+      "link-name": "cross-link-1",
+      "in-maint": false,
+      "link-type": "cross-link",
+      "resource-version": "1536029865021",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf2000/p-interfaces/p-interface/nodeId-78.78.78.78-ltpId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf2000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-78.78.78.78-ltpId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          },
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf1000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-79.79.79.79-ltpId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "link-name": "cross-link-3",
+      "in-maint": false,
+      "link-type": "cross-link",
+      "resource-version": "1536029865021",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf2000/p-interfaces/p-interface/nodeId-78.78.78.78-ltpId-3",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf2000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-78.78.78.78-ltpId-3"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          },
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-3",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf1000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-79.79.79.79-ltpId-3"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "link-name": "cross-link-2",
+      "in-maint": false,
+      "link-type": "cross-link",
+      "resource-version": "1536029865021",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf3000/p-interfaces/p-interface/nodeId-80.80.80.80-ltpId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf3000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-80.80.80.80-ltpId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          },
+          {
+            "related-to": "p-interface",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf-cloud/p-interfaces/p-interface/cloud-tp",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf-cloud"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "cloud-tp"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          },
+          {
+            "related-to": "ext-aai-network",
+            "relationship-label": "org.onap.relationships.inventory.BelongsTo",
+            "related-link": "/aai/v13/network/ext-aai-networks/ext-aai-network/gongjie666",
+            "relationship-data": [
+              {
+                "relationship-key": "ext-aai-network.aai-id",
+                "relationship-value": "gongjie666"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/usecaseui-portal/src/assets/json/alarmFormData.json b/usecaseui-portal/src/assets/json/alarmFormData.json
new file mode 100644 (file)
index 0000000..fc97ae0
--- /dev/null
@@ -0,0 +1,371 @@
+{
+    "totalRecolds": 22, 
+    "list": [
+        {
+            "id": 11, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-1001", 
+            "sourceName": "shentao-test-1001", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 12, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-1002", 
+            "sourceName": "shentao-test-1002", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 13, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-1003", 
+            "sourceName": "shentao-test-1003", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 14, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-2001", 
+            "sourceName": "shentao-test-2001", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 15, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-2002", 
+            "sourceName": "shentao-test-2002", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 16, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-2003", 
+            "sourceName": "shentao-test-2003", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1513630880000000", 
+            "lastEpochMicroSec": "1513630880000000", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 17, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-2004", 
+            "sourceName": "vnf_a_1", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 18, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-2005", 
+            "sourceName": "shentao-test-2005", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 19, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-3001", 
+            "sourceName": "shentao-test-3001", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 20, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-3003", 
+            "sourceName": "vnf_a_3", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 21, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailureCleared", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "shentao-test-3004", 
+            "sourceName": "vnf_a_3", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "Multi-Cloud", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "112", 
+            "lastEpochMicroSecCleared": "112", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }, 
+        {
+            "id": 22, 
+            "version": "3", 
+            "eventName": "Fault_MultiCloud_VMFailure", 
+            "domain": "fault", 
+            "eventId": "ab305d54-85b4-a31b-7db2-fb6b9e546015", 
+            "eventType": null, 
+            "nfcNamingCode": null, 
+            "nfNamingCode": null, 
+            "sourceId": "vnf_a_20180205_2", 
+            "sourceName": "vnf_b_3", 
+            "reportingEntityId": null, 
+            "reportingEntityName": "vnf_a_20180205_2", 
+            "priority": "High", 
+            "startEpochMicrosec": "1516784364860", 
+            "lastEpochMicroSec": "1516784364860", 
+            "startEpochMicrosecCleared": "", 
+            "lastEpochMicroSecCleared": "", 
+            "sequence": "0", 
+            "faultFieldsVersion": "2", 
+            "eventServrity": "CRITICAL", 
+            "eventSourceType": "other", 
+            "eventCategory": null, 
+            "alarmCondition": "Guest_Os_Failure", 
+            "specificProblem": "Fault_MultiCloud_VMFailure", 
+            "vfStatus": "Active", 
+            "alarmInterfaceA": "aaaa", 
+            "status": "active"
+        }
+    ], 
+    "countActive": 12, 
+    "reportingEntityNameList": [
+        "vnf_a_20180205_2", 
+        "Multi-Cloud"
+    ], 
+    "sourceNameList": [
+        "shentao-test-2001", 
+        "shentao-test-3001", 
+        "shentao-test-1001", 
+        "shentao-test-2002", 
+        "vnf_a_3", 
+        "shentao-test-1002", 
+        "shentao-test-2003", 
+        "vnf_b_3", 
+        "shentao-test-1003", 
+        "vnf_a_1", 
+        "shentao-test-2005"
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/allotted-resources.json b/usecaseui-portal/src/assets/json/allotted-resources.json
new file mode 100644 (file)
index 0000000..0b39894
--- /dev/null
@@ -0,0 +1,122 @@
+{
+    "allotted-resource": [
+        {
+            "id": "1114feec-1aef-4890-abba-f8f3a906935f",
+            "description": "1114feec-1aef-4890-abba-f8f3a906935f",
+            "selflink": "",
+            "model-invariant-id": "f714feec-1aef-4890-abba-f8f3a906935f",
+            "model-version-id": "709919b7-75fd-4e49-8398-67853323ff55",
+            "resource-version": "1535708424249",
+            "orchestration-status": "",
+            "operational-status": "",
+            "type": "",
+            "role": "spoke",
+            "allotted-resource-name": "sdwan ar",
+            "access-provider-id": "",
+            "access-client-id": "",
+            "access-topology-id": "",
+            "access-node-id": "",
+            "access-ltp-id": "",
+            "cvlan": "",
+            "vpn-name": "SDWANVPNInfra",
+            "relationship-list": {
+                "relationship": [
+                    {
+                        "related-to": "service-instance",
+                        "relationship-label": "org.onap.relationships.inventory.Uses",
+                        "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/35e88f8e-473f-4d88-92f8-6739a42baa23",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "customer.global-customer-id",
+                                "relationship-value": "Democcy"
+                            },
+                            {
+                                "relationship-key": "service-subscription.service-type",
+                                "relationship-value": "CCVPN"
+                            },
+                            {
+                                "relationship-key": "service-instance.service-instance-id",
+                                "relationship-value": "35e88f8e-473f-4d88-92f8-6739a42baa23"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "service-instance.service-instance-name",
+                                "property-value": "SDWANVPNInfra1"
+                            }
+                        ]
+                    }
+                ]
+            }
+        },
+        {
+            "id": "aa14feec-1aef-4890-abba-f8f3a906935f",
+            "description": "aa14feec-1aef-4890-abba-f8f3a906935f",
+            "selflink": "",
+            "model-invariant-id": "97c4a3c6-2943-41af-8717-2f3183f944be",
+            "model-version-id": "44b777ee-9793-465d-8053-d8e86d2e2362",
+            "resource-version": "1536135116833",
+            "orchestration-status": "",
+            "operational-status": "",
+            "type": "",
+            "role": "",
+            "allotted-resource-name": "ston ar",
+            "access-provider-id": "1000",
+            "access-client-id": "3333",
+            "access-topology-id": "100",
+            "access-node-id": "10.10.10.10",
+            "access-ltp-id": "1",
+            "cvlan": "",
+            "vpn-name": "SOTNVPNInfra",
+            "relationship-list": {
+                "relationship": [
+                    {
+                        "related-to": "service-instance",
+                        "relationship-label": "org.onap.relationships.inventory.Uses",
+                        "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "customer.global-customer-id",
+                                "relationship-value": "Democcy"
+                            },
+                            {
+                                "relationship-key": "service-subscription.service-type",
+                                "relationship-value": "CCVPN"
+                            },
+                            {
+                                "relationship-key": "service-instance.service-instance-id",
+                                "relationship-value": "32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "service-instance.service-instance-name",
+                                "property-value": "SOTNVPNInfra"
+                            }
+                        ]
+                    },
+                    {
+                        "related-to": "p-interface",
+                        "relationship-label": "org.onap.relationships.inventory.Uses",
+                        "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-2",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "pnf.pnf-name",
+                                "relationship-value": "pnf1000"
+                            },
+                            {
+                                "relationship-key": "p-interface.interface-name",
+                                "relationship-value": "nodeId-79.79.79.79-ltpId-2"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "p-interface.prov-status"
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/allotted-resources2.json b/usecaseui-portal/src/assets/json/allotted-resources2.json
new file mode 100644 (file)
index 0000000..29262e5
--- /dev/null
@@ -0,0 +1 @@
+{"allotted-resource":[{"id":"8beee9a7-abf0-4c98-8073-1d4d03e50033","description":"sdwan-attachment","selflink":"","model-invariant-id":"3d369bb8-5546-41d4-a3e7-a2557295ae40","model-version-id":"78ed8099-90a5-49b4-a400-89f38a7cbe6e","resource-version":"1537857961665","orchestration-status":"","operational-status":"","type":"","role":"spoke","allotted-resource-name":"sdwan ar","access-provider-id":"","access-client-id":"","access-topology-id":"","access-node-id":"","access-ltp-id":"","cvlan":"","vpn-name":"SDWANVPNInfra","relationship-list":{"relationship":[{"related-to":"service-instance","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/15e88f8e-473f-4d88-92f8-6739a42baa2g","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"15e88f8e-473f-4d88-92f8-6739a42baa2g"}],"related-to-property":[{"property-key":"service-instance.service-instance-name","property-value":"SDWANVPNInfra"}]}]}},{"id":"28f2b69e-c489-48fa-b974-166104eb15c9","description":"sotn-attachment","selflink":"","model-invariant-id":"d92ce7ca-ca87-4830-972e-83ae9857ded7","model-version-id":"3704879e-b07e-4a15-b8fd-f047f966a261","resource-version":"1537858263268","orchestration-status":"","operational-status":"","type":"","role":"spoke","allotted-resource-name":"sotn ar","access-provider-id":"","access-client-id":"","access-topology-id":"","access-node-id":"","access-ltp-id":"","cvlan":"","vpn-name":"SOTNVPNInfra","relationship-list":{"relationship":[{"related-to":"service-instance","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}],"related-to-property":[{"property-key":"service-instance.service-instance-name","property-value":"SOTNVPNInfra"}]},{"related-to":"p-interface","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/network/pnfs/pnf/11.11.11.11/p-interfaces/p-interface/nodeId-11.11.11.11-ltpId-36","relationship-data":[{"relationship-key":"pnf.pnf-name","relationship-value":"11.11.11.11"},{"relationship-key":"p-interface.interface-name","relationship-value":"nodeId-79.79.79.79-ltpId-2"}],"related-to-property":[{"property-key":"p-interface.prov-status"}]}]}}]}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/configuration_files/inputNamesTranslate.json b/usecaseui-portal/src/assets/json/configuration_files/inputNamesTranslate.json
new file mode 100644 (file)
index 0000000..9a91307
--- /dev/null
@@ -0,0 +1,63 @@
+{
+    "sotnNameTranslate":{
+        "name":"sotnconnectivity_name",
+        "description":"sotnconnectivity_description",
+        "startTime":"sotnconnectivity_startTime",
+        "endTime":"sotnconnectivity_endTime",
+        "COS":"sotnconnectivity_COS",
+        "reroute":"sotnconnectivity_reroute",
+        "SLS":"sotnconnectivity_SLS",
+        "dualLink":"sotnconnectivity_dualLink",
+        "CIR":"sotnconnectivity_cir",
+        "EIR":"sotnconnectivity_eir",
+        "CBS":"sotnconnectivity_cbs",
+        "EBS":"sotnconnectivity_ebs",
+        "colorAware":"sotnconnectivity_colorAware",
+        "couplingFlag":"sotnconnectivity_couplingFlag"
+    },
+    "siteNameTranslate":{
+        "baseNames":{
+            "name":"site_name",
+            "description":"site_description",
+            "type":"site_type",
+            "role":"site_role",
+            "postcode":"site_postcode",
+            "address":"site_address",
+            "vlan":"sotncondition_cVLAN",
+            "sotnVpnName":"sotncondition_sotnVpnName", 
+            "controlPoint":"site_controlPoint", 
+            "groupRole":"sdwancondition_role", 
+            "groupName":"sdwancondition_sdwanVpnName",
+            "emails":"site_emails",
+            "latitude":"site_latitude",
+            "longitude":"site_longitude",
+            "clientSignal":"sotncondition_clientSignal"
+        },
+        "cpeNames":{
+            "device_name":"device_name",
+            "device_version":"device_version",
+            "device_esn":"device_esn",
+            "device_class":"device_class",
+            "device_systemIp":"device_systemIp",
+            "device_vendor":"device_vendor",
+            "device_type":"device_type"
+        },
+        "wanportNames":{
+            "sitewanport_name":"sitewanport_name",
+            "sitewanport_deviceName":"sitewanport_deviceName",
+            "sitewanport_description":"sitewanport_description",
+            "sitewanport_portType":"sitewanport_portType",
+            "sitewanport_portNumber":"sitewanport_portNumber",
+            "sitewanport_ipAddress":"sitewanport_ipAddress",
+            "sitewanport_providerIpAddress":"sitewanport_providerIpAddress",
+            "sitewanport_transportNetworkName":"sitewanport_transportNetworkName",
+            "sitewanport_inputBandwidth":"sitewanport_inputBandwidth",
+            "sitewanport_outputBandwidth":"sitewanport_outputBandwidth"
+        }
+    },
+    "siteGroupNameTranslate":{
+        "name":"sdwanconnectivity_name",
+        "topology":"sdwanconnectivity_topology"
+    }
+
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/configuration_files/servicesCategory.json b/usecaseui-portal/src/assets/json/configuration_files/servicesCategory.json
new file mode 100644 (file)
index 0000000..574a8bb
--- /dev/null
@@ -0,0 +1,34 @@
+
+{
+    "SOTN":{
+        "sotnvpn":[
+            {"model-invariant-id": "21886a96-0664-47a3-beae-766952f2059f","model-version-id": "4ca96a53-2e18-4297-8dc7-5776fdf6871b"}
+        ],
+        "site":[
+            {"model-invariant-id": "342ff5e8-5592-4455-a537-a81172c9d541","model-version-id": "ea8bb4d2-00ea-4aeb-ad76-20ac8cb1c99c"},
+            {"model-invariant-id": "a7029145-4294-4664-b619-00dc959a1ff6","model-version-id": "cb756ffb-8d91-49fb-86f7-12ceb2b13158"}
+        ]
+    },
+    "CCVPN":{
+        "sotnvpn":[
+            {"model-invariant-id": "21886a96-0664-47a3-beae-766952f2059f","model-version-id": "54836196-c411-4690-af98-900c1c3aadd7"},
+            {"model-invariant-id": "21886a96-0664-47a3-beae-766952f2059f","model-version-id": "4ca96a53-2e18-4297-8dc7-5776fdf6871b"},
+            {"model-invariant-id": "35661c6e-4a15-4990-8d8a-d247ddcf0110","model-version-id": "f38e13a7-6ba6-4f06-901d-02206faa2687"},
+            {"model-invariant-id": "bafa365f-4056-4ad3-a039-d6b3e3e0fd35","model-version-id": "fdbb8ddd-3325-4840-a156-9ad601b9366c"}
+        ],
+        "site":[
+            {"model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70","model-version-id": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838"},
+            {"model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70","model-version-id": "4b4b3ef8-6747-4111-b9e0-81cf251c0068"},
+            {"model-invariant-id": "a7029145-4294-4664-b619-00dc959a1ff6","model-version-id": "cb756ffb-8d91-49fb-86f7-12ceb2b13158"},
+            {"model-invariant-id": "313abb16-d454-4a64-a39d-2ed4bb7713a3","model-version-id": "95f9c7aa-8a0e-4568-86f7-ab980a4556a1"},
+            {"model-invariant-id": "499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id": "8ec97da1-1e0a-4198-9c9a-3da2c60d7974"}
+        ],
+        "sdwan":[
+            {"model-invariant-id": "88dcb2f0-085b-4548-8b93-0882e37d25d8","model-version-id": "462f84e5-f0e5-44c5-ab95-38fb4bf77064"},
+            {"model-invariant-id": "88dcb2f0-085b-4548-8b93-0882e37d25d8","model-version-id": "d0a4af63-570c-40b3-a26f-ef11366f0a03"},
+            {"model-invariant-id": "2cefdc20-a29d-4792-a151-3653a6a20d45","model-version-id": "a306b8d6-3873-46fe-921a-623e279d5548"},
+            {"model-invariant-id": "e2b217d6-7cac-4156-9f44-f9b010b350a6","model-version-id": "20d9e7dc-f030-4230-af79-ba0bde7cbe2e"}
+        ]
+    }
+}
+
diff --git a/usecaseui-portal/src/assets/json/configuration_files/templateCategory.json b/usecaseui-portal/src/assets/json/configuration_files/templateCategory.json
new file mode 100644 (file)
index 0000000..dca4279
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "sotnvpntypes":["uuidxxx","uuidxxxx"],
+    "sitetypes":["uuidaaa","uuidaaaa"],
+    "sdwantypes":["uuidbbb","uuidbbbb"]
+}
+
diff --git a/usecaseui-portal/src/assets/json/createService.json b/usecaseui-portal/src/assets/json/createService.json
new file mode 100644 (file)
index 0000000..f1d6448
--- /dev/null
@@ -0,0 +1,7 @@
+
+{
+    "service":{
+        "serviceId":"044377e5-3dd4-4f84-86a0-02dab3c43bc5",
+        "operationId":"1e606677-7864-4bec-b50c-adcd858e4cd8"
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/customers.json b/usecaseui-portal/src/assets/json/customers.json
new file mode 100644 (file)
index 0000000..9c66eff
--- /dev/null
@@ -0,0 +1,82 @@
+
+
+[
+    {
+      "global-customer-id": "Democcy",
+      "subscriber-name": "Democcy",
+      "subscriber-type": "INFRA",
+      "resource-version": "1535601196964"
+    },
+    {
+      "global-customer-id": "support",
+      "subscriber-name": "testccccccccsssssssssseeeeeeeeeee",
+      "subscriber-type": "CUST",
+      "resource-version": "1536069070995"
+    },
+    {
+      "global-customer-id": "Demonstration",
+      "subscriber-name": "Demonstration",
+      "subscriber-type": "INFRA",
+      "resource-version": "1535080521665"
+    },
+    {
+      "global-customer-id": "Orange",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1535865156826"
+    },
+    {
+      "global-customer-id": "Orange5",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1529978907607"
+    },
+    {
+      "global-customer-id": "wale",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1536058660948"
+    },
+    {
+      "global-customer-id": "kiwi",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1536042103511"
+    },
+    {
+      "global-customer-id": "Apple",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1535971300786"
+    },
+    {
+      "global-customer-id": "Tiger",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1535977578133"
+    },
+    {
+      "global-customer-id": "Deer",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1535988232470"
+    },
+    {
+      "global-customer-id": "Bear",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1536041229105"
+    },
+    {
+      "global-customer-id": "Panda",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1536038628045"
+    },
+    {
+      "global-customer-id": "Lion",
+      "subscriber-name": "test",
+      "subscriber-type": "CUST",
+      "resource-version": "1535986050695"
+    }
+]
diff --git a/usecaseui-portal/src/assets/json/deleteService.json b/usecaseui-portal/src/assets/json/deleteService.json
new file mode 100644 (file)
index 0000000..19a7ab5
--- /dev/null
@@ -0,0 +1,4 @@
+
+{
+    "operationId":"1e606677-7864-4bec-b50c-adcd858e4cd8"
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/detailsData.json b/usecaseui-portal/src/assets/json/detailsData.json
new file mode 100644 (file)
index 0000000..41ee87b
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "sotnVpnInfo":{
+        "name":"xdwgwe","description":"hahahah",
+        "startTime":"2017-07-03","endTime":"2018-07-05",
+        "COS":"premium","reroute":"Yes",
+        "SLS":"sfsadf","dualLink":"Yes",
+        "CIR":"dafdafd","EIR":"sddddddd",
+        "CBS":"dafdaf","EBS":"qqqqqqqwwwwwww",
+        "colorAware":"Yes","couplingFlag":"No"
+    },
+    "siteList":[
+        {"name":"xiaoming","description":"congming","postcode":"xxxx","address":"beijing","sotnVpnName":"buzhid","vlan":"aaa"},
+        {"name":"xiaogang","description":"congming","postcode":"xxxx","address":"guangzhou","sotnVpnName":"buzhid","vlan":"aaa"}
+    ],
+    "siteGroupList":[
+        {"id":"123","name":"sssiy","topology":"hahahha","sites":"xxxxx","rloe":"eeexxxx"},
+        {"id":"3333","name":"sssiy","topology":"hahahha","sites":"xxxxx","rloe":"eeexxxx"}
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/homeAllData.json b/usecaseui-portal/src/assets/json/homeAllData.json
new file mode 100644 (file)
index 0000000..ce4e5d6
--- /dev/null
@@ -0,0 +1,23 @@
+{   
+    "services":{
+      "number":200,
+      "chartdata":[
+        {"value":125, "name":"user1"},
+        {"value":290, "name":"user2"},
+        {"value":220, "name":"user3"}
+      ]
+    },
+    "performance":{
+      "per_Vnf":154,
+      "per_VmPm":325
+    },
+    "alarm":{
+      "chartdata":[
+        {"value":325,"name":"Active"},
+        {"value":200,"name":"Closed"}
+      ]
+    },
+    "Vm_performance":{
+      "names":["aaaaa","bbbbb","ccccc","ddddd","eeeee"]
+    }
+}
diff --git a/usecaseui-portal/src/assets/json/homePerformanceChartData.json b/usecaseui-portal/src/assets/json/homePerformanceChartData.json
new file mode 100644 (file)
index 0000000..c384889
--- /dev/null
@@ -0,0 +1,4 @@
+{   
+  "CPU":[30,43,24,32,34,35,42,62,52,35,34,33,43],
+  "Memory":[24,23,24,12,34,15,22,22,32,15,24,13,23]
+}
diff --git a/usecaseui-portal/src/assets/json/instanceTableData.json b/usecaseui-portal/src/assets/json/instanceTableData.json
new file mode 100644 (file)
index 0000000..73f1287
--- /dev/null
@@ -0,0 +1,505 @@
+{
+  "service-instance": [
+    {
+      "service-instance-id": "35e88f8e-473f-4d88-92f8-6739a42baa23",
+      "service-instance-name": "SDWANVPNInfra1",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "88dcb2f0-085b-4548-8b93-0882e37d25d8",
+      "model-version-id": "462f84e5-f0e5-44c5-ab95-38fb4bf77064",
+      "resource-version": "1535687551051",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"88dcb2f0-085b-4548-8b93-0882e37d25d8\",\n        \"serviceUuid\":\"462f84e5-f0e5-44c5-ab95-38fb4bf77064\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"CMCCVPN\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sdwan-vpn",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/sdwan-vpns/sdwan-vpn/4efe6dff-acfc-4d13-a3fd-1177d3c08e89",
+            "relationship-data": [
+              {
+                "relationship-key": "sdwan-vpn.sdwan-vpn-id",
+                "relationship-value": "4efe6dff-acfc-4d13-a3fd-1177d3c08e89"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sdwan-vpn.sdwan-vpn-name",
+                "property-value": "vdfvpn"
+              }
+            ]
+          },
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d00",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d00"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d00"
+              }
+            ]
+          },
+          {
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.Uses",
+            "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/189b87a5-72fe-4197-a307-6929c3831f81/allotted-resources/allotted-resource/2214feec-1aef-4890-abba-f8f3a906935f",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "Democcy"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "CCVPN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "189b87a5-72fe-4197-a307-6929c3831f81"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "2214feec-1aef-4890-abba-f8f3a906935f"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "allotted-resource.description",
+                "property-value": "2214feec-1aef-4890-abba-f8f3a906935f"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "sdwan ar"
+              }
+            ]
+          },
+          {
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.Uses",
+            "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/089b87a5-72fe-4197-a307-6929c3831f80/allotted-resources/allotted-resource/1114feec-1aef-4890-abba-f8f3a906935f",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "Democcy"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "CCVPN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "089b87a5-72fe-4197-a307-6929c3831f80"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "1114feec-1aef-4890-abba-f8f3a906935f"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "allotted-resource.description",
+                "property-value": "1114feec-1aef-4890-abba-f8f3a906935f"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "sdwan ar"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "15e88f8e-473f-4d88-92f8-6739a42baa2g",
+      "service-instance-name": "SDWANVPNInfra",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "88dcb2f0-085b-4548-8b93-0882e37d25d8",
+      "model-version-id": "462f84e5-f0e5-44c5-ab95-38fb4bf77064",
+      "resource-version": "1535687578298",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"88dcb2f0-085b-4548-8b93-0882e37d25d8\",\n        \"serviceUuid\":\"462f84e5-f0e5-44c5-ab95-38fb4bf77064\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"CMCCVPN\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sdwan-vpn",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/sdwan-vpns/sdwan-vpn/4efe6dff-acfc-4d13-a3fd-1177d3c08e86",
+            "relationship-data": [
+              {
+                "relationship-key": "sdwan-vpn.sdwan-vpn-id",
+                "relationship-value": "4efe6dff-acfc-4d13-a3fd-1177d3c08e86"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sdwan-vpn.sdwan-vpn-name",
+                "property-value": "cmccvpn"
+              }
+            ]
+          },
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d11",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d11"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d11"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "089b87a5-72fe-4197-a307-6929c3831f80",
+      "service-instance-name": "SiteBeijing",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+      "model-version-id": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838",
+      "resource-version": "1535686434430",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SiteService\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"5c13f3fb-2744-4635-9f1f-c59c92dc8f70\",\n        \"serviceUuid\":\"3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE1\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d22",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d22"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d22"
+              }
+            ]
+          },
+          {
+            "related-to": "device",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/devices/device/6e0d83f3-f4f5-4a24-9462-712b52ac6700",
+            "relationship-data": [
+              {
+                "relationship-key": "device.device-id",
+                "relationship-value": "6e0d83f3-f4f5-4a24-9462-712b52ac6700"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "device.device-name"
+              }
+            ]
+          },
+          {
+            "related-to": "wan-port-config",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/wan-port-configs/wan-port-config/aaa3e552-08c4-4697-aeeb-d8d3e09ce58e",
+            "relationship-data": [
+              {
+                "relationship-key": "wan-port-config.wan-port-config-id",
+                "relationship-value": "aaa3e552-08c4-4697-aeeb-d8d3e09ce58e"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "wan-port-config.wan-port-config-name",
+                "property-value": "mpls"
+              }
+            ]
+          },
+          {
+            "related-to": "site-resource",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/site-resources/site-resource/aa2de9d8-d76b-4134-b5f1-41e79056adbe",
+            "relationship-data": [
+              {
+                "relationship-key": "site-resource.site-resource-id",
+                "relationship-value": "aa2de9d8-d76b-4134-b5f1-41e79056adbe"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "site-resource.site-resource-name",
+                "property-value": "cmcc-spokesite"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "189b87a5-72fe-4197-a307-6929c3831f81",
+      "service-instance-name": "SiteBeijingDC",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+      "model-version-id": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838",
+      "resource-version": "1535686458510",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SiteService\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"5c13f3fb-2744-4635-9f1f-c59c92dc8f70\",\n        \"serviceUuid\":\"3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE2\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d33",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d33"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d33"
+              }
+            ]
+          },
+          {
+            "related-to": "site-resource",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/site-resources/site-resource/bb2de9d8-d76b-4134-b5f1-41e79056adbe",
+            "relationship-data": [
+              {
+                "relationship-key": "site-resource.site-resource-id",
+                "relationship-value": "bb2de9d8-d76b-4134-b5f1-41e79056adbe"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "site-resource.site-resource-name",
+                "property-value": "cmcc-hubsite"
+              }
+            ]
+          },
+          {
+            "related-to": "device",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/devices/device/6e0d83f3-f4f5-4a24-9462-712b52ac6711",
+            "relationship-data": [
+              {
+                "relationship-key": "device.device-id",
+                "relationship-value": "6e0d83f3-f4f5-4a24-9462-712b52ac6711"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "device.device-name",
+                "property-value": "cmcc_hub"
+              }
+            ]
+          },
+          {
+            "related-to": "wan-port-config",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/wan-port-configs/wan-port-config/bba3e552-08c4-4697-aeeb-d8d3e09ce58e",
+            "relationship-data": [
+              {
+                "relationship-key": "wan-port-config.wan-port-config-id",
+                "relationship-value": "bba3e552-08c4-4697-aeeb-d8d3e09ce58e"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "wan-port-config.wan-port-config-name",
+                "property-value": "mpls"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "289b87a5-72fe-4197-a307-6929c3831f82",
+      "service-instance-name": "SiteLondonDC",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+      "model-version-id": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838",
+      "resource-version": "1535686481928",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SiteService\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"5c13f3fb-2744-4635-9f1f-c59c92dc8f70\",\n        \"serviceUuid\":\"3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE3\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d44",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d44"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d44"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "389b87a5-72fe-4197-a307-6929c3831f83",
+      "service-instance-name": "SiteLondon",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+      "model-version-id": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838",
+      "resource-version": "1535686521672",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SiteService\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"5c13f3fb-2744-4635-9f1f-c59c92dc8f70\",\n        \"serviceUuid\":\"3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE4\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d55",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d55"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d55"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0",
+      "service-instance-name": "SOTNVPNInfra",
+      "service-type": "E2E Service",
+      "service-role": "E2E Service",
+      "model-invariant-id": "21886a96-0664-47a3-beae-766952f2059f",
+      "model-version-id": "54836196-c411-4690-af98-900c1c3aadd7",
+      "resource-version": "1535685742159",
+      "input-parameters": "{\n    \"service\":{\n        \"name\":\"SOTNVPNInfra\",\n        \"description\":\"SOTNVPNInfra\",\n        \"serviceInvariantUuid\":\"21886a96-0664-47a3-beae-766952f2059f\",\n        \"serviceUuid\":\"54836196-c411-4690-af98-900c1c3aadd7\",\n        \"globalSubscriberId\":\"Demonstration\",\n        \"serviceType\":\"CCVPN\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SOTNConnectivity 0\",\n                    \"resourceInvariantUuid\":\"1b9c677d-fddf-4b70-938b-925a7fa57d43\",\n                    \"resourceUuid\":\"218df3c3-50dd-4c26-9e36-4771387bb771\",\n                    \"resourceCustomizationUuid\":\"b44071c8-04fd-4d6b-b6af-772cbfaa1129\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"c3612284-6c67-4d8c-8b41-b699cc90e76d\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sotnconnectivity0_eir\":\"1000\",\n                \"sotnconnectivity0_cir\":\"1000\",\n                \"sotnconnectivity0_endTime\":\"2018-8-8 10:00\",\n                \"sotnconnectivity0_ebs\":\"1000\",\n                \"sotnconnectivity0_startTime\":\"2018-8-1 10:00\",\n                \"sotnconnectivity0_dualLink\":\"true\",\n                \"sotnconnectivity0_reroute\":\"false\",\n                \"sotnconnectivity0_cbs\":\"1000\",\n                \"sotnconnectivity0_name\":\"SOTN L2\",\n                \"sotnconnectivity0_SLS\":\"\",\n                \"sotnconnectivity0_description\":\"\",\n                \"sotnconnectivity0_couplingFlag\":\"\",\n                \"sotnconnectivity0_colorAware\":\"\",\n                \"sotnconnectivity0_COS\":\"standard\"\n            }\n        }\n    }\n}",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "sp-partner",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/business/sp-partners/sp-partner/1b9c677d-fddf-4b70-938b-925a7fa57d99",
+            "relationship-data": [
+              {
+                "relationship-key": "sp-partner.sp-partner-id",
+                "relationship-value": "1b9c677d-fddf-4b70-938b-925a7fa57d99"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "sp-partner.sp-partner-id",
+                "property-value": "1b9c677d-fddf-4b70-938b-925a7fa57d99"
+              }
+            ]
+          },
+          {
+            "related-to": "connectivity",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/connectivities/connectivity/4efe6dff-acfc-4d13-a3fd-1177d3c08e84",
+            "relationship-data": [
+              {
+                "relationship-key": "connectivity.connectivity-id",
+                "relationship-value": "4efe6dff-acfc-4d13-a3fd-1177d3c08e84"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "connectivity.etht-svc-name",
+                "property-value": "SOTNVPNInfra"
+              }
+            ]
+          },
+          {
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.Uses",
+            "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/189b87a5-72fe-4197-a307-6929c3831f81/allotted-resources/allotted-resource/bb14feec-1aef-4890-abba-f8f3a906935f",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "Democcy"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "CCVPN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "189b87a5-72fe-4197-a307-6929c3831f81"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "bb14feec-1aef-4890-abba-f8f3a906935f"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "allotted-resource.description",
+                "property-value": "bb14feec-1aef-4890-abba-f8f3a906935f"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "ston ar"
+              }
+            ]
+          },
+          {
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.Uses",
+            "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/089b87a5-72fe-4197-a307-6929c3831f80/allotted-resources/allotted-resource/aa14feec-1aef-4890-abba-f8f3a906935f",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "Democcy"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "CCVPN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "089b87a5-72fe-4197-a307-6929c3831f80"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "aa14feec-1aef-4890-abba-f8f3a906935f"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "allotted-resource.description",
+                "property-value": "aa14feec-1aef-4890-abba-f8f3a906935f"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "ston ar"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/instanceTableData2.json b/usecaseui-portal/src/assets/json/instanceTableData2.json
new file mode 100644 (file)
index 0000000..d29f5f5
--- /dev/null
@@ -0,0 +1,388 @@
+{
+    "results": [
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"sotn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "uuidxxx",
+                  "service-instance-name": "dddd1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"sotn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"sotn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "uuidaaaa",
+                  "service-instance-name": "dddd6",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"ccvpn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"ccvpn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },      
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"ccvpn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },      
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"ccvpn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      },
+      {
+        "service-subscription": {
+          "service-type": "{service-type}",
+          "temp-ub-sub-account-id": "some sub account",
+          "service-type-id":"ccvpn",
+          "service-instances": {
+              "service-instance": [
+                {
+                  "service-instance-id": "some id 1",
+                  "service-instance-name": "some name 1",
+                  "environment-context": "some context 1",
+                  "workload-context": "some workload 1",
+                  "input-parameters": "request parameters 1",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 2",
+                  "service-instance-name": "some name 2",
+                  "environment-context": "some context 2",
+                  "workload-context": "some workload 2",
+                  "input-parameters": "request parameters 2",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                },
+                {
+                  "service-instance-id": "some id 3",
+                  "service-instance-name": "some name 3",
+                  "environment-context": "some context 3",
+                  "workload-context": "some workload 3",
+                  "input-parameters": "request parameters 3",
+                  "relationship-list": {
+                      "relationship" : [
+                      ]
+                  }
+                }
+              ]
+          },
+          "relationship-list": {
+              "relationship" : [
+              ]
+          }
+        }
+      }
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/instanceTableData3.json b/usecaseui-portal/src/assets/json/instanceTableData3.json
new file mode 100644 (file)
index 0000000..9877728
--- /dev/null
@@ -0,0 +1,2 @@
+
+{"service-instance":[{"service-instance-id":"8e07f832-3f50-4657-9b44-010049e8b488","service-instance-name":"SOTNVPNInfra","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"bafa365f-4056-4ad3-a039-d6b3e3e0fd35","model-version-id":"fdbb8ddd-3325-4840-a156-9ad601b9366c","resource-version":"1537769390960","input-parameters":"{\n    \"service\":{\n        \"name\":\"SOTNVPNInfra\",\n        \"description\":\"SOTNVPNInfra\",\n        \"serviceInvariantUuid\":\"bafa365f-4056-4ad3-a039-d6b3e3e0fd35\",\n        \"serviceUuid\":\"fdbb8ddd-3325-4840-a156-9ad601b9366c\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SOTNConnectivity 0\",\n                    \"resourceInvariantUuid\":\"1b9c677d-fddf-4b70-938b-925a7fa57d43\",\n                    \"resourceUuid\":\"218df3c3-50dd-4c26-9e36-4771387bb771\",\n                    \"resourceCustomizationUuid\":\"b44071c8-04fd-4d6b-b6af-772cbfaa1129\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"c3612284-6c67-4d8c-8b41-b699cc90e76d\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sotnconnectivity0_eir\":\"1000\",\n                \"sotnconnectivity0_cir\":\"1000\",\n                \"sotnconnectivity0_endTime\":\"2018-8-8 10:00\",\n                \"sotnconnectivity0_ebs\":\"1000\",\n                \"sotnconnectivity0_startTime\":\"2018-8-1 10:00\",\n                \"sotnconnectivity0_dualLink\":\"true\",\n                \"sotnconnectivity0_reroute\":\"false\",\n                \"sotnconnectivity0_cbs\":\"1000\",\n                \"sotnconnectivity0_name\":\"SOTN L2\",\n                \"sotnconnectivity0_SLS\":\"\",\n                \"sotnconnectivity0_description\":\"\",\n                \"sotnconnectivity0_couplingFlag\":\"\",\n                \"sotnconnectivity0_colorAware\":\"\",\n                \"sotnconnectivity0_COS\":\"standard\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"connectivity","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/connectivities/connectivity/2e359c75-2af3-4fea-9550-a893edeab8b5","relationship-data":[{"relationship-key":"connectivity.connectivity-id","relationship-value":"2e359c75-2af3-4fea-9550-a893edeab8b5"}],"related-to-property":[{"property-key":"connectivity.etht-svc-name","property-value":"vpn1"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}]}]}},{"service-instance-id":"a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205","service-instance-name":"DcLondon","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537769721422","input-parameters":"{\n    \"service\":{\n        \"name\":\"DcLondon\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"device","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/devices/device/2cacf49c-7c09-4155-b18a-4468dce34083","relationship-data":[{"relationship-key":"device.device-id","relationship-value":"2cacf49c-7c09-4155-b18a-4468dce34083"}],"related-to-property":[{"property-key":"device.device-name","property-value":"TravelDevice"}]},{"related-to":"site-resource","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/site-resources/site-resource/f288d54e-be09-46d3-bb1f-38729ec74bb5","relationship-data":[{"relationship-key":"site-resource.site-resource-id","relationship-value":"f288d54e-be09-46d3-bb1f-38729ec74bb5"}],"related-to-property":[{"property-key":"site-resource.site-resource-name","property-value":"travelSite"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/99866f05-9749-456e-8909-61eebf08373e","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"99866f05-9749-456e-8909-61eebf08373e"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"intenet"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/afab2cc0-28c9-4fd3-bf03-01c8034f8191","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"afab2cc0-28c9-4fd3-bf03-01c8034f8191"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"mpls"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/167a285b-0875-41ff-8ed1-1178db6f3133","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"167a285b-0875-41ff-8ed1-1178db6f3133"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"167a285b-0875-41ff-8ed1-1178db6f3133"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/0ea94797-3772-40ff-b6fb-69f06c533be3/allotted-resources/allotted-resource/d519761d-c89c-4164-86c7-8f74952eea65","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"0ea94797-3772-40ff-b6fb-69f06c533be3"},{"relationship-key":"allotted-resource.id","relationship-value":"d519761d-c89c-4164-86c7-8f74952eea65"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/8e07f832-3f50-4657-9b44-010049e8b488/allotted-resources/allotted-resource/65f21c28-8b19-4769-8f08-174e2afa5488","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"8e07f832-3f50-4657-9b44-010049e8b488"},{"relationship-key":"allotted-resource.id","relationship-value":"65f21c28-8b19-4769-8f08-174e2afa5488"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"ston ar"}]}]}},{"service-instance-id":"0ea94797-3772-40ff-b6fb-69f06c533be3","service-instance-name":"SDWANVPNInfra","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"e2b217d6-7cac-4156-9f44-f9b010b350a6","model-version-id":"20d9e7dc-f030-4230-af79-ba0bde7cbe2e","resource-version":"1537769801383","input-parameters":"{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"e2b217d6-7cac-4156-9f44-f9b010b350a6\",\n        \"serviceUuid\":\"20d9e7dc-f030-4230-af79-ba0bde7cbe2e\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"CMCCVPN\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sdwan-vpn","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/sdwan-vpns/sdwan-vpn/0d8707cd-9d27-4503-a0b0-e9b1b1a83b1e","relationship-data":[{"relationship-key":"sdwan-vpn.sdwan-vpn-id","relationship-value":"0d8707cd-9d27-4503-a0b0-e9b1b1a83b1e"}],"related-to-property":[{"property-key":"sdwan-vpn.sdwan-vpn-name"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/15e88f8e-473f-4d88-92f8-6739a42baa2g","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"15e88f8e-473f-4d88-92f8-6739a42baa2g"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"15e88f8e-473f-4d88-92f8-6739a42baa2g"}]}]}},{"service-instance-id":"f08067b8-a07b-4c41-b750-5f9b35281e67","service-instance-name":"siteFangshanQu","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537779181775","selflink":"restconf/config/GENERIC-RESOURCE-API:services/service/506b87a5-72fe-4197-a307-6929c3871ab2/service-data/service-topology/","input-parameters":"{\n    \"service\":{\n        \"name\":\"siteFangshanQu\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/506b87a5-72fe-4197-a307-6929c3871ab2","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"506b87a5-72fe-4197-a307-6929c3871ab2"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"506b87a5-72fe-4197-a307-6929c3871ab2"}]}]}},{"service-instance-id":"6a6478d1-f62f-439c-8f16-6038a44af8c3","service-instance-name":"SDWANVPNInfra-2","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"e2b217d6-7cac-4156-9f44-f9b010b350a6","model-version-id":"20d9e7dc-f030-4230-af79-ba0bde7cbe2e","resource-version":"1537779569094","input-parameters":"{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra-2\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"e2b217d6-7cac-4156-9f44-f9b010b350a6\",\n        \"serviceUuid\":\"20d9e7dc-f030-4230-af79-ba0bde7cbe2e\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"CMCCVPN\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/de888731-eac8-454c-bbb2-927a85ba2d1c","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"de888731-eac8-454c-bbb2-927a85ba2d1c"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"de888731-eac8-454c-bbb2-927a85ba2d1c"}]}]}},{"service-instance-id":"fd0b9f0a-0d5c-4f69-a3dc-fb9cabde9db8","service-instance-name":"DcXichengQuBeijing","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537779392307","selflink":"restconf/config/GENERIC-RESOURCE-API:services/service/289b87a5-72fe-4197-a307-6929c3831f82/service-data/service-topology/","input-parameters":"{\n    \"service\":{\n        \"name\":\"DcXichengQuBeijing\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/289b87a5-72fe-4197-a307-6929c3831f82","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"289b87a5-72fe-4197-a307-6929c3831f82"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"289b87a5-72fe-4197-a307-6929c3831f82"}]}]}},{"service-instance-id":"2d55a540-f6d3-4108-9bb4-290574b87a6c","service-instance-name":"siteLondon","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537770265132","input-parameters":"{\n    \"service\":{\n        \"name\":\"siteLondon\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"CMCCVPN\",\n                \"sitevf_site_address\":\"beijing beiqing road\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_CPE\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"CMCC_CPE\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/52ae7944-12b3-4766-848e-e43088947af9","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"52ae7944-12b3-4766-848e-e43088947af9"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"intenet"}]},{"related-to":"site-resource","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/site-resources/site-resource/a22193fc-d1b5-41a7-9033-14339838b0c5","relationship-data":[{"relationship-key":"site-resource.site-resource-id","relationship-value":"a22193fc-d1b5-41a7-9033-14339838b0c5"}],"related-to-property":[{"property-key":"site-resource.site-resource-name","property-value":"travelSite"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/9fc7c231-1b71-49e6-8390-e92b707e7615","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"9fc7c231-1b71-49e6-8390-e92b707e7615"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"mpls"}]},{"related-to":"device","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/devices/device/f0cf1e06-7be8-4602-83cb-60d87d8e7ef3","relationship-data":[{"relationship-key":"device.device-id","relationship-value":"f0cf1e06-7be8-4602-83cb-60d87d8e7ef3"}],"related-to-property":[{"property-key":"device.device-name","property-value":"CentSpokeDevice"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/3addd6b9-b05f-4841-881c-1ce2c753513f","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"3addd6b9-b05f-4841-881c-1ce2c753513f"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"3addd6b9-b05f-4841-881c-1ce2c753513f"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/0ea94797-3772-40ff-b6fb-69f06c533be3/allotted-resources/allotted-resource/f1523ca9-6b56-482e-b3a4-a2f8dcbfba12","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"0ea94797-3772-40ff-b6fb-69f06c533be3"},{"relationship-key":"allotted-resource.id","relationship-value":"f1523ca9-6b56-482e-b3a4-a2f8dcbfba12"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/8e07f832-3f50-4657-9b44-010049e8b488/allotted-resources/allotted-resource/d1a6b573-0595-4468-bab9-02465c295618","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"8e07f832-3f50-4657-9b44-010049e8b488"},{"relationship-key":"allotted-resource.id","relationship-value":"d1a6b573-0595-4468-bab9-02465c295618"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sotn ar"}]}]}}]}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/instanceTableData4.json b/usecaseui-portal/src/assets/json/instanceTableData4.json
new file mode 100644 (file)
index 0000000..ad8767e
--- /dev/null
@@ -0,0 +1 @@
+{"service-instance":[{"service-instance-id":"8e07f832-3f50-4657-9b44-010049e8b488","service-instance-name":"SOTNVPNInfra","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"bafa365f-4056-4ad3-a039-d6b3e3e0fd35","model-version-id":"fdbb8ddd-3325-4840-a156-9ad601b9366c","resource-version":"1537769390960","input-parameters":"{\n    \"service\":{\n        \"name\":\"SOTNVPNInfra\",\n        \"description\":\"SOTNVPNInfra\",\n        \"serviceInvariantUuid\":\"bafa365f-4056-4ad3-a039-d6b3e3e0fd35\",\n        \"serviceUuid\":\"fdbb8ddd-3325-4840-a156-9ad601b9366c\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SOTNConnectivity 0\",\n                    \"resourceInvariantUuid\":\"1b9c677d-fddf-4b70-938b-925a7fa57d43\",\n                    \"resourceUuid\":\"218df3c3-50dd-4c26-9e36-4771387bb771\",\n                    \"resourceCustomizationUuid\":\"b44071c8-04fd-4d6b-b6af-772cbfaa1129\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"c3612284-6c67-4d8c-8b41-b699cc90e76d\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sotnconnectivity0_eir\":\"1000\",\n                \"sotnconnectivity0_cir\":\"1000\",\n                \"sotnconnectivity0_endTime\":\"2018-8-8 10:00\",\n                \"sotnconnectivity0_ebs\":\"1000\",\n                \"sotnconnectivity0_startTime\":\"2018-8-1 10:00\",\n                \"sotnconnectivity0_dualLink\":\"true\",\n                \"sotnconnectivity0_reroute\":\"false\",\n                \"sotnconnectivity0_cbs\":\"1000\",\n                \"sotnconnectivity0_name\":\"SOTN L2\",\n                \"sotnconnectivity0_SLS\":\"\",\n                \"sotnconnectivity0_description\":\"\",\n                \"sotnconnectivity0_couplingFlag\":\"\",\n                \"sotnconnectivity0_colorAware\":\"\",\n                \"sotnconnectivity0_COS\":\"standard\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"connectivity","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/connectivities/connectivity/2e359c75-2af3-4fea-9550-a893edeab8b5","relationship-data":[{"relationship-key":"connectivity.connectivity-id","relationship-value":"2e359c75-2af3-4fea-9550-a893edeab8b5"}],"related-to-property":[{"property-key":"connectivity.etht-svc-name","property-value":"vpn1"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/2d55a540-f6d3-4108-9bb4-290574b87a6c/allotted-resources/allotted-resource/666085a7-132e-4a32-b9de-e58ecea3476a","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"2d55a540-f6d3-4108-9bb4-290574b87a6c"},{"relationship-key":"allotted-resource.id","relationship-value":"666085a7-132e-4a32-b9de-e58ecea3476a"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sotn ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205/allotted-resources/allotted-resource/562adc96-7fbe-435e-bd6d-ff4b8a0a7920","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205"},{"relationship-key":"allotted-resource.id","relationship-value":"562adc96-7fbe-435e-bd6d-ff4b8a0a7920"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sotn ar"}]}]}},{"service-instance-id":"a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205","service-instance-name":"DcLondon","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537866016457","input-parameters":"{\n    \"service\":{\n        \"name\":\"DcLondon\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"SDWANVPNInfra\",\n                \"sitevf_site_address\":\"University College London,Gower Street,London\",\n                \"sitevf_site_controlPoint\":\"VDF_VCPE\",\n                \"sitevf_site_description\":\"VDF_vGW\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"DcLondon\",\n                \"sitevf_site_postcode\":\"N200095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"device","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/devices/device/2cacf49c-7c09-4155-b18a-4468dce34083","relationship-data":[{"relationship-key":"device.device-id","relationship-value":"2cacf49c-7c09-4155-b18a-4468dce34083"}],"related-to-property":[{"property-key":"device.device-name","property-value":"TravelDevice"}]},{"related-to":"site-resource","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/site-resources/site-resource/f288d54e-be09-46d3-bb1f-38729ec74bb5","relationship-data":[{"relationship-key":"site-resource.site-resource-id","relationship-value":"f288d54e-be09-46d3-bb1f-38729ec74bb5"}],"related-to-property":[{"property-key":"site-resource.site-resource-name","property-value":"travelSite"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/99866f05-9749-456e-8909-61eebf08373e","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"99866f05-9749-456e-8909-61eebf08373e"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"intenet"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/afab2cc0-28c9-4fd3-bf03-01c8034f8191","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"afab2cc0-28c9-4fd3-bf03-01c8034f8191"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"mpls"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/167a285b-0875-41ff-8ed1-1178db6f3133","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"167a285b-0875-41ff-8ed1-1178db6f3133"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"167a285b-0875-41ff-8ed1-1178db6f3133"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/0ea94797-3772-40ff-b6fb-69f06c533be3/allotted-resources/allotted-resource/d519761d-c89c-4164-86c7-8f74952eea65","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"0ea94797-3772-40ff-b6fb-69f06c533be3"},{"relationship-key":"allotted-resource.id","relationship-value":"d519761d-c89c-4164-86c7-8f74952eea65"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/8e07f832-3f50-4657-9b44-010049e8b488/allotted-resources/allotted-resource/65f21c28-8b19-4769-8f08-174e2afa5488","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"8e07f832-3f50-4657-9b44-010049e8b488"},{"relationship-key":"allotted-resource.id","relationship-value":"65f21c28-8b19-4769-8f08-174e2afa5488"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"ston ar"}]}]}},{"service-instance-id":"0ea94797-3772-40ff-b6fb-69f06c533be3","service-instance-name":"SDWANVPNInfra","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"e2b217d6-7cac-4156-9f44-f9b010b350a6","model-version-id":"20d9e7dc-f030-4230-af79-ba0bde7cbe2e","resource-version":"1537864894560","input-parameters":"{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"e2b217d6-7cac-4156-9f44-f9b010b350a6\",\n        \"serviceUuid\":\"20d9e7dc-f030-4230-af79-ba0bde7cbe2e\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"SDWANVPNInfra\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sdwan-vpn","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/sdwan-vpns/sdwan-vpn/0d8707cd-9d27-4503-a0b0-e9b1b1a83b1e","relationship-data":[{"relationship-key":"sdwan-vpn.sdwan-vpn-id","relationship-value":"0d8707cd-9d27-4503-a0b0-e9b1b1a83b1e"}],"related-to-property":[{"property-key":"sdwan-vpn.sdwan-vpn-name"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/15e88f8e-473f-4d88-92f8-6739a42baa2g","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"15e88f8e-473f-4d88-92f8-6739a42baa2g"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"15e88f8e-473f-4d88-92f8-6739a42baa2g"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/2d55a540-f6d3-4108-9bb4-290574b87a6c/allotted-resources/allotted-resource/c797bba9-eb90-4825-b1c2-adbd1a31101f","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"2d55a540-f6d3-4108-9bb4-290574b87a6c"},{"relationship-key":"allotted-resource.id","relationship-value":"c797bba9-eb90-4825-b1c2-adbd1a31101f"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205/allotted-resources/allotted-resource/9a7329e6-8961-4008-9dbe-adeacfcd20da","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"a6d69c62-75b5-4f04-8cd7-9ca5dfcc4205"},{"relationship-key":"allotted-resource.id","relationship-value":"9a7329e6-8961-4008-9dbe-adeacfcd20da"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]}]}},{"service-instance-id":"f08067b8-a07b-4c41-b750-5f9b35281e67","service-instance-name":"siteFangshanQu","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537867265890","selflink":"restconf/config/GENERIC-RESOURCE-API:services/service/506b87a5-72fe-4197-a307-6929c3871ab2/service-data/service-topology/","input-parameters":"{\n    \"service\":{\n        \"name\":\"siteFangshanQu\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"SDWANVPNInfra-2\",\n                \"sitevf_site_address\":\"CMCC International Data Center,Hongkong\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_vGW\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"siteFangshanQu\",\n                \"sitevf_site_postcode\":\"999077\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/506b87a5-72fe-4197-a307-6929c3871ab2","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"506b87a5-72fe-4197-a307-6929c3871ab2"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"506b87a5-72fe-4197-a307-6929c3871ab2"}]}]}},{"service-instance-id":"6a6478d1-f62f-439c-8f16-6038a44af8c3","service-instance-name":"SDWANVPNInfra-2","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"e2b217d6-7cac-4156-9f44-f9b010b350a6","model-version-id":"20d9e7dc-f030-4230-af79-ba0bde7cbe2e","resource-version":"1537779569094","input-parameters":"{\n    \"service\":{\n        \"name\":\"SDWANVPNInfra-2\",\n        \"description\":\"SDWANVPNInfra\",\n        \"serviceInvariantUuid\":\"e2b217d6-7cac-4156-9f44-f9b010b350a6\",\n        \"serviceUuid\":\"20d9e7dc-f030-4230-af79-ba0bde7cbe2e\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SDWANConnectivity 0\",\n                    \"resourceInvariantUuid\":\"f99a9a23-c88e-44ff-a4dc-22b88675d278\",\n                    \"resourceUuid\":\"7baa7742-3a13-4288-8330-868015adc340\",\n                    \"resourceCustomizationUuid\":\"94ec574b-2306-4cbd-8214-09662b040f73\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF 0\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"a7baba5d-6ac3-42b5-b47d-070841303ab1\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"sdwanconnectivity0_name\":\"CMCCVPN\",\n                \"sdwanconnectivity0_topology\":\"hub-spoke\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/de888731-eac8-454c-bbb2-927a85ba2d1c","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"de888731-eac8-454c-bbb2-927a85ba2d1c"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"de888731-eac8-454c-bbb2-927a85ba2d1c"}]}]}},{"service-instance-id":"fd0b9f0a-0d5c-4f69-a3dc-fb9cabde9db8","service-instance-name":"DcXichengQuBeijing","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537867379064","selflink":"restconf/config/GENERIC-RESOURCE-API:services/service/289b87a5-72fe-4197-a307-6929c3831f82/service-data/service-topology/","input-parameters":"{\n    \"service\":{\n        \"name\":\"DcXichengQuBeijing\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"SDWANVPNInfra\",\n                \"sitevf_site_address\":\"Chuangxin Building,Tianningsi,Xicheng,Beijing\",\n                \"sitevf_site_controlPoint\":\"CMCC_VCPE\",\n                \"sitevf_site_description\":\"CMCC_vGW\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"DcXichengQuBeijing\",\n                \"sitevf_site_postcode\":\"100095\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/289b87a5-72fe-4197-a307-6929c3831f82","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"289b87a5-72fe-4197-a307-6929c3831f82"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"289b87a5-72fe-4197-a307-6929c3831f82"}]}]}},{"service-instance-id":"2d55a540-f6d3-4108-9bb4-290574b87a6c","service-instance-name":"siteLondon","service-type":"E2E Service","service-role":"E2E Service","model-invariant-id":"499e5e60-c8b2-4ea6-8c4e-7739420673a9","model-version-id":"8ec97da1-1e0a-4198-9c9a-3da2c60d7974","resource-version":"1537866122803","input-parameters":"{\n    \"service\":{\n        \"name\":\"siteLondon\",\n        \"description\":\"SiteService\",\n        \"serviceInvariantUuid\":\"499e5e60-c8b2-4ea6-8c4e-7739420673a9\",\n        \"serviceUuid\":\"8ec97da1-1e0a-4198-9c9a-3da2c60d7974\",\n        \"globalSubscriberId\":\"demo\",\n        \"serviceType\":\"ccvpn\",\n        \"parameters\":{\n            \"locationConstraints\":[\n\n            ],\n            \"resources\":[\n                {\n                    \"resourceName\":\"SiteVF\",\n                    \"resourceInvariantUuid\":\"0c0e1cbe-6e01-4f9e-8c45-a9700ebc14df\",\n                    \"resourceUuid\":\"4ad2d390-5c51-45f5-9710-b467a4ec7a73\",\n                    \"resourceCustomizationUuid\":\"66590e07-0777-415c-af44-36347cf3ddd3\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"mpls\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"205456e7-3dc0-40c4-8cb0-28e6c1877042\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"deviceVF\",\n                    \"resourceInvariantUuid\":\"c726490a-0ce2-4bc7-abea-dade66bfb13d\",\n                    \"resourceUuid\":\"0e2de9d8-d76b-4134-b5f1-41e79056adbe\",\n                    \"resourceCustomizationUuid\":\"5bc1373e-9a36-4a00-8c62-784e0bc417ad\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sdwanvpnattachmentVF\",\n                    \"resourceInvariantUuid\":\"f714feec-1aef-4890-abba-f8f3a906935f\",\n                    \"resourceUuid\":\"709919b7-75fd-4e49-8398-67853323ff55\",\n                    \"resourceCustomizationUuid\":\"debd988f-fe04-4940-a5cb-37f61d84eab4\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"internet\",\n                    \"resourceInvariantUuid\":\"97a3e552-08c4-4697-aeeb-d8d3e09ce58e\",\n                    \"resourceUuid\":\"63d8e1af-32dc-4c71-891d-e3f7b6a976d2\",\n                    \"resourceCustomizationUuid\":\"64b8e8ba-62b9-4db6-b420-1ca7067d63e0\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"sotnvpnattachmentvF\",\n                    \"resourceInvariantUuid\":\"97c4a3c6-2943-41af-8717-2f3183f944be\",\n                    \"resourceUuid\":\"44b777ee-9793-465d-8053-d8e86d2e2362\",\n                    \"resourceCustomizationUuid\":\"37aeb073-c75d-4cf6-a7fa-a1af862ef58a\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                },\n                {\n                    \"resourceName\":\"SPPartnerVF\",\n                    \"resourceInvariantUuid\":\"072f9238-15b0-4bc5-a5f5-f18548739470\",\n                    \"resourceUuid\":\"81b9430b-8abe-45d6-8bf9-f41a8f5c735f\",\n                    \"resourceCustomizationUuid\":\"cd0b4b9c-66c6-49c5-b346-7580e4b6c394\",\n                    \"parameters\":{\n                        \"locationConstraints\":[\n\n                        ],\n                        \"resources\":[\n\n                        ],\n                        \"requestInputs\":{\n\n                        }\n                    }\n                }\n            ],\n            \"requestInputs\":{\n                \"devicevf_device_class\":\"PNF\",\n                \"devicevf_device_esn\":\"2102351BTJ10HB000075\",\n                \"devicevf_device_name\":\"50.47\",\n                \"devicevf_device_systemIp\":\"192.168.1.47\",\n                \"devicevf_device_type\":\"AR161EW\",\n                \"devicevf_device_vendor\":\"huawei\",\n                \"devicevf_device_version\":\"1.0\",\n                \"internet_sitewanport_description\":\"internet\",\n                \"internet_sitewanport_deviceName\":\"50.47\",\n                \"internet_sitewanport_inputBandwidth\":\"100\",\n                \"internet_sitewanport_ipAddress\":\"100.2.30.9\",\n                \"internet_sitewanport_name\":\"internet\",\n                \"internet_sitewanport_outputBandwidth\":\"100\",\n                \"internet_sitewanport_portNumber\":\"0/0/2\",\n                \"internet_sitewanport_portType\":\"GE\",\n                \"internet_sitewanport_providerIpAddress\":\"100.2.30.10\",\n                \"internet_sitewanport_transportNetworkName\":\"internet\",\n                \"mpls_sitewanport_description\":\"mpls\",\n                \"mpls_sitewanport_deviceName\":\"50.47\",\n                \"mpls_sitewanport_inputBandwidth\":\"100\",\n                \"mpls_sitewanport_ipAddress\":\"10.2.30.7\",\n                \"mpls_sitewanport_name\":\"mpls\",\n                \"mpls_sitewanport_outputBandwidth\":\"100\",\n                \"mpls_sitewanport_portNumber\":\"0/0/1\",\n                \"mpls_sitewanport_portType\":\"GE\",\n                \"mpls_sitewanport_providerIpAddress\":\"10.2.30.8\",\n                \"mpls_sitewanport_transportNetworkName\":\"internet\",\n                \"sdwanvpnattachmentvf_sdwancondition_role\":\"spoke\",\n                \"sdwanvpnattachmentvf_sdwancondition_sdwanVpnName\":\"SDWANVPNInfra-2\",\n                \"sitevf_site_address\":\"VDF International Data Center,Hongkong\",\n                \"sitevf_site_controlPoint\":\"VDF_VCPE\",\n                \"sitevf_site_description\":\"VDF_vGW\",\n                \"sitevf_site_emails\":\"\",\n                \"sitevf_site_latitude\":\"\",\n                \"sitevf_site_longitude\":\"\",\n                \"sitevf_site_name\":\"siteLondon\",\n                \"sitevf_site_postcode\":\"999077\",\n                \"sitevf_site_role\":\"sd-wan-edge\",\n                \"sitevf_site_type\":\"single-gateway\",\n                \"sotnvpnattachmentvf_sotncondition_clientSignal\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_cVLAN\":\"\",\n                \"sotnvpnattachmentvf_sotncondition_sotnVpnName\":\"SOTN L2\"\n            }\n        }\n    }\n}","relationship-list":{"relationship":[{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/52ae7944-12b3-4766-848e-e43088947af9","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"52ae7944-12b3-4766-848e-e43088947af9"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"intenet"}]},{"related-to":"site-resource","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/site-resources/site-resource/a22193fc-d1b5-41a7-9033-14339838b0c5","relationship-data":[{"relationship-key":"site-resource.site-resource-id","relationship-value":"a22193fc-d1b5-41a7-9033-14339838b0c5"}],"related-to-property":[{"property-key":"site-resource.site-resource-name","property-value":"travelSite"}]},{"related-to":"wan-port-config","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/wan-port-configs/wan-port-config/9fc7c231-1b71-49e6-8390-e92b707e7615","relationship-data":[{"relationship-key":"wan-port-config.wan-port-config-id","relationship-value":"9fc7c231-1b71-49e6-8390-e92b707e7615"}],"related-to-property":[{"property-key":"wan-port-config.wan-port-config-name","property-value":"mpls"}]},{"related-to":"device","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/devices/device/f0cf1e06-7be8-4602-83cb-60d87d8e7ef3","relationship-data":[{"relationship-key":"device.device-id","relationship-value":"f0cf1e06-7be8-4602-83cb-60d87d8e7ef3"}],"related-to-property":[{"property-key":"device.device-name","property-value":"CentSpokeDevice"}]},{"related-to":"sp-partner","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/sp-partners/sp-partner/3addd6b9-b05f-4841-881c-1ce2c753513f","relationship-data":[{"relationship-key":"sp-partner.sp-partner-id","relationship-value":"3addd6b9-b05f-4841-881c-1ce2c753513f"}],"related-to-property":[{"property-key":"sp-partner.sp-partner-id","property-value":"3addd6b9-b05f-4841-881c-1ce2c753513f"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/0ea94797-3772-40ff-b6fb-69f06c533be3/allotted-resources/allotted-resource/f1523ca9-6b56-482e-b3a4-a2f8dcbfba12","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"0ea94797-3772-40ff-b6fb-69f06c533be3"},{"relationship-key":"allotted-resource.id","relationship-value":"f1523ca9-6b56-482e-b3a4-a2f8dcbfba12"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sdwan-attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sdwan ar"}]},{"related-to":"allotted-resource","relationship-label":"org.onap.relationships.inventory.Uses","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/8e07f832-3f50-4657-9b44-010049e8b488/allotted-resources/allotted-resource/d1a6b573-0595-4468-bab9-02465c295618","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"8e07f832-3f50-4657-9b44-010049e8b488"},{"relationship-key":"allotted-resource.id","relationship-value":"d1a6b573-0595-4468-bab9-02465c295618"}],"related-to-property":[{"property-key":"allotted-resource.description","property-value":"sotn attachment"},{"property-key":"allotted-resource.allotted-resource-name","property-value":"sotn ar"}]}]}}]}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/netWorkD3Data.json b/usecaseui-portal/src/assets/json/netWorkD3Data.json
new file mode 100644 (file)
index 0000000..0dbfd93
--- /dev/null
@@ -0,0 +1,94 @@
+[
+    {
+        "networkId": "1000",
+        "pnfs": [
+            {
+                "pnfName": "pnf1000"
+            }
+        ],
+        "tps": [
+            {
+                "interface-name": "nodeId-78.78.78.78-ltpId-5"
+            },
+            {
+                "interface-name": "nodeId-78.78.78.78-ltpId-4"
+            },
+            {
+                "interface-name": "nodeId-78.78.78.78-ltpId-1"
+            },
+            {
+                "interface-name": "nodeId-78.78.78.78-ltpId-3"
+            },
+            {
+                "interface-name": "nodeId-78.78.78.78-ltpId-2"
+            }
+        ],
+      "aaiId":""
+    },
+    {
+        "networkId": "2000",
+        "pnfs": [
+            {
+                "pnfName": "pnf2000"
+            }
+        ],
+        "tps": [
+            {
+                "interface-name": "nodeId-79.79.79.79-ltpId-5"
+            },
+            {
+                "interface-name": "nodeId-79.79.79.79-ltpId-4"
+            },
+            {
+                "interface-name": "nodeId-79.79.79.79-ltpId-1"
+            },
+            {
+                "interface-name": "nodeId-79.79.79.79-ltpId-3"
+            },
+            {
+                "interface-name": "nodeId-79.79.79.79-ltpId-2"
+            }
+        ],
+      "aaiId":""
+    },
+  {
+    "networkId": "3000",
+    "pnfs": [
+      {
+        "pnfName": "pnf3000"
+      }
+    ],
+    "tps": [
+      {
+        "interface-name": "nodeId-80.80.80.80-ltpId-5"
+      },
+      {
+        "interface-name": "nodeId-80.80.80.80-ltpId-4"
+      },
+      {
+        "interface-name": "nodeId-80.80.80.80-ltpId-1"
+      },
+      {
+        "interface-name": "nodeId-80.80.80.80-ltpId-3"
+      },
+      {
+        "interface-name": "nodeId-80.80.80.80-ltpId-2"
+      }
+    ],
+    "aaiId":""
+  },
+  {
+    "networkId": "cloud-network",
+    "pnfs": [
+      {
+        "pnfName": "pnf-cloud"
+      }
+    ],
+    "tps": [
+      {
+        "interface-name": "cloud-tp"
+      }
+    ],
+    "aaiId":"gongjie666"
+  }
+]
diff --git a/usecaseui-portal/src/assets/json/netWorkD3Data2.json b/usecaseui-portal/src/assets/json/netWorkD3Data2.json
new file mode 100644 (file)
index 0000000..1ab0782
--- /dev/null
@@ -0,0 +1,246 @@
+[
+    {
+      "network-resource": {
+        "network-id": "成都市",
+        "pnfs": {
+          "pnf": [
+            {
+              "pnf-name": "双流区"
+            },
+            {
+              "pnf-name": "武侯区"
+            },
+            {
+              "pnf-name": "金牛区"
+            }
+          ]
+        },
+        "tp": [
+          {
+            "p-interface": {
+              "interface-name": "东升街",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "浆洗街",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "抚琴街",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        ],
+        "relationship-list": {
+          "relationship": [
+            {
+              "related-to": "vpn-binding",
+              "related-link": "url of vpn-binding",
+              "relationship-data": {
+                "relationship-key": "vpn-binding.vpn-id",
+                "relationship-value": "some id"
+              }
+            }
+          ]
+        }
+      }
+    },
+    {
+      "network-resource": {
+        "network-id": "重庆市",
+        "pnfs": {
+          "pnf": [
+            {
+              "pnf-name": "沙坪坝区"
+            },
+            {
+              "pnf-name": "南岸区"
+            },
+            {
+              "pnf-name": "江北区"
+            }
+          ]
+        },
+        "tp": [
+          {
+            "p-interface": {
+              "interface-name": "万州",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "南川",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "武隆",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "江津",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "合川",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          },
+          {
+            "p-interface": {
+              "interface-name": "巫山",
+              "network-ref": "some ref",
+              "transparent": "some value",
+              "speed-value": "some speed",
+              "relationship-list": {
+                "relationship": [
+                  {
+                    "related-to": "logical-link",
+                    "related-link": "url of logical-link",
+                    "relationship-data": {
+                      "relationship-key": "logical-link.link-name",
+                      "relationship-value": "some name"
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        ],
+        "relationship-list": {
+          "relationship": [
+            {
+              "related-to": "vpn-binding",
+              "related-link": "url of vpn-binding",
+              "relationship-data": {
+                "relationship-key": "vpn-binding.vpn-id",
+                "relationship-value": "some id"
+              }
+            }
+          ]
+        }
+      }
+    }
+  ]
diff --git a/usecaseui-portal/src/assets/json/onboardTableData.json b/usecaseui-portal/src/assets/json/onboardTableData.json
new file mode 100644 (file)
index 0000000..56e5b32
--- /dev/null
@@ -0,0 +1,103 @@
+{   
+    "total":245,
+    "tableList":[
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Onboarding",
+        "progress": 35
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Onboarding",
+        "progress": 86
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Onboarded",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Onboarded",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      },
+      {
+        "name":"Demo_vims_zte",
+        "type":"NS",
+        "version":"1.0",
+        "status":"Invalid",
+        "progress": 100
+      }
+    ]
+}
diff --git a/usecaseui-portal/src/assets/json/p_interfaces1.json b/usecaseui-portal/src/assets/json/p_interfaces1.json
new file mode 100644 (file)
index 0000000..399c21b
--- /dev/null
@@ -0,0 +1,17 @@
+[
+  {
+    "interface-name": "nodeId-78.78.78.78-ltpId-5"
+  },
+  {
+    "interface-name": "nodeId-78.78.78.78-ltpId-4"
+  },
+  {
+    "interface-name": "nodeId-78.78.78.78-ltpId-3"
+  },
+  {
+    "interface-name": "nodeId-78.78.78.78-ltpId-2"
+  },
+  {
+    "interface-name": "nodeId-78.78.78.78-ltpId-1"
+  }
+]
diff --git a/usecaseui-portal/src/assets/json/p_interfaces2.json b/usecaseui-portal/src/assets/json/p_interfaces2.json
new file mode 100644 (file)
index 0000000..4baf8b8
--- /dev/null
@@ -0,0 +1,17 @@
+[
+  {
+    "interface-name": "nodeId-79.79.79.79-ltpId-5"
+  },
+  {
+    "interface-name": "nodeId-79.79.79.79-ltpId-4"
+  },
+  {
+    "interface-name": "nodeId-79.79.79.79-ltpId-3"
+  },
+  {
+    "interface-name": "nodeId-79.79.79.79-ltpId-2"
+  },
+  {
+    "interface-name": "nodeId-79.79.79.79-ltpId-1"
+  }
+]
diff --git a/usecaseui-portal/src/assets/json/pnfdetail-domain.json b/usecaseui-portal/src/assets/json/pnfdetail-domain.json
new file mode 100644 (file)
index 0000000..c337bd9
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "pnf-name": "pnf1000",
+  "pnf-id": "79.79.79.79",
+  "in-maint": true,
+  "resource-version": "1536028638695",
+  "admin-status": "up",
+  "operational-status": "up",
+  "relationship-list": {
+    "relationship": [
+      {
+        "related-to": "network-resource",
+        "relationship-label": "tosca.relationships.network.LinksTo",
+        "related-link": "/aai/v13/network/network-resources/network-resource/1000",
+        "relationship-data": [
+          {
+            "relationship-key": "network-resource.network-id",
+            "relationship-value": "1000"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "network-resource.network-id",
+            "property-value": "1000"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/progress.json b/usecaseui-portal/src/assets/json/progress.json
new file mode 100644 (file)
index 0000000..1a36c1e
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "operationStatus":{
+        "operationId": "XXXXXX",
+        "operation": "create|delete|update|scale",
+        "result": "finished|error|processing",
+        "reason": "",
+        "userId": "",
+        "operationContent": "Be creating pop.",
+        "progress": 0,
+        "operateAt": "",
+        "finishedAt": "" 
+    }
+}
diff --git a/usecaseui-portal/src/assets/json/sdwanvpnServiceTemplateParameters.json b/usecaseui-portal/src/assets/json/sdwanvpnServiceTemplateParameters.json
new file mode 100644 (file)
index 0000000..cabf0e1
--- /dev/null
@@ -0,0 +1,57 @@
+{
+    "invariantUUID": "88dcb2f0-085b-4548-8b93-0882e37d25d8",
+    "uuid": "462f84e5-f0e5-44c5-ab95-38fb4bf77064",
+    "name": "SDWANVPNInfraService",
+    "type": "Service",
+    "version": "null",
+    "description": "SDWAN VPN Infra",
+    "category": "E2E Service",
+    "subcategory": "null",
+    "customizationUuid": "null",
+    "inputs": [
+        {
+            "name": "sdwanconnectivity0_topology",
+            "type": "string",
+            "description": "full mesh, hub-spoke",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sdwanconnectivity0_name",
+            "type": "string",
+            "description": "the name of this VPM object",
+            "isRequired": "true",
+            "defaultValue": "null"
+        }
+    ],
+    "nestedTemplates": [
+        {
+            "invariantUUID": "f99a9a23-c88e-44ff-a4dc-22b88675d278",
+            "uuid": "7baa7742-3a13-4288-8330-868015adc340",
+            "name": "SDWANConnectivity",
+            "type": "VL",
+            "version": "1.0",
+            "description": "Represents SDWAN Connectivity.",
+            "category": "Generic",
+            "subcategory": "Infrastructure",
+            "customizationUuid": "94ec574b-2306-4cbd-8214-09662b040f73",
+            "inputs": [
+                {
+                    "name": "sdwanconnectivity0_topology",
+                    "type": "string",
+                    "description": "full mesh, hub-spoke",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sdwanconnectivity0_name",
+                    "type": "string",
+                    "description": "the name of this VPM object",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                }
+            ],
+            "nestedTemplates": []
+        }
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/serviceTemplates.json b/usecaseui-portal/src/assets/json/serviceTemplates.json
new file mode 100644 (file)
index 0000000..8de26a7
--- /dev/null
@@ -0,0 +1,19 @@
+
+[
+    {"name":"template1","uuid":"uuidxxx","invariantUUID":"dddd1","version":"1.20"},
+    {"name":"template2","uuid":"uuidxxx","invariantUUID":"dddd2","version":"1.20"},
+    {"name":"template3","uuid":"uuidxxxx","invariantUUID":"dddd3","version":"1.20"},
+    {"name":"template4","uuid":"uuidaaa","invariantUUID":"dddd4","version":"1.20"},
+    {"name":"template5","uuid":"uuidaaa","invariantUUID":"dddd5","version":"1.20"},
+    {"name":"template6","uuid":"uuidaaaa","invariantUUID":"dddd6","version":"1.20"},
+    {"name":"template7","uuid":"uuidbbb","invariantUUID":"dddd7","version":"1.20"},
+    {"name":"template8","uuid":"uuidbbb","invariantUUID":"dddd8","version":"1.20"},
+    {"name":"template9","uuid":"uuidbbbb","invariantUUID":"dddd9","version":"1.20"},
+    {"name":"template10","uuid":"uuidaaaa","invariantUUID":"dddd10","version":"1.20"},
+    {"name":"template11","uuid":"uuidxxx","invariantUUID":"dddd11","version":"1.20"},
+    {"name":"template12","uuid":"uuidccc","invariantUUID":"dddd12","version":"1.20"},
+    {"name":"template13","uuid":"uuidccc","invariantUUID":"dddd13","version":"1.20"},
+    {"name":"template14","uuid":"uuidccc","invariantUUID":"dddd14","version":"1.20"},
+    {"name":"template15","uuid":"uuidxxx","invariantUUID":"dddd15","version":"1.20"},
+    {"name":"template16","uuid":"uuidbbbb","invariantUUID":"dddd16","version":"1.20"}
+]
diff --git a/usecaseui-portal/src/assets/json/serviceTemplates2.json b/usecaseui-portal/src/assets/json/serviceTemplates2.json
new file mode 100644 (file)
index 0000000..9320278
--- /dev/null
@@ -0,0 +1,43 @@
+
+[
+    {
+        "uuid": "d0a4af63-570c-40b3-a26f-ef11366f0a03",
+        "invariantUUID": "88dcb2f0-085b-4548-8b93-0882e37d25d8",
+        "name": "SDWANVPNInfraService",
+        "version": "2.0",
+        "toscaModelURL": "/sdc/v1/catalog/services/d0a4af63-570c-40b3-a26f-ef11366f0a03/toscaModel",
+        "category": "E2E Service"
+    },
+    {
+        "uuid": "4ca96a53-2e18-4297-8dc7-5776fdf6871b",
+        "invariantUUID": "21886a96-0664-47a3-beae-766952f2059f",
+        "name": "SOTNVPNInfraService",
+        "version": "2.0",
+        "toscaModelURL": "/sdc/v1/catalog/services/4ca96a53-2e18-4297-8dc7-5776fdf6871b/toscaModel",
+        "category": "E2E Service"
+    },
+    {
+        "uuid": "ea8bb4d2-00ea-4aeb-ad76-20ac8cb1c99c",
+        "invariantUUID": "342ff5e8-5592-4455-a537-a81172c9d541",
+        "name": "sowsiteservice",
+        "version": "3.0",
+        "toscaModelURL": "/sdc/v1/catalog/services/ea8bb4d2-00ea-4aeb-ad76-20ac8cb1c99c/toscaModel",
+        "category": "E2E Service"
+    },
+    {
+        "uuid": "cb756ffb-8d91-49fb-86f7-12ceb2b13158",
+        "invariantUUID": "a7029145-4294-4664-b619-00dc959a1ff6",
+        "name": "SiteServiceV3",
+        "version": "1.0",
+        "toscaModelURL": "/sdc/v1/catalog/services/cb756ffb-8d91-49fb-86f7-12ceb2b13158/toscaModel",
+        "category": "E2E Service"
+    },
+    {
+        "uuid": "4b4b3ef8-6747-4111-b9e0-81cf251c0068",
+        "invariantUUID": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+        "name": "SiteService",
+        "version": "2.0",
+        "toscaModelURL": "/sdc/v1/catalog/services/4b4b3ef8-6747-4111-b9e0-81cf251c0068/toscaModel",
+        "category": "E2E Service"
+    }
+]
diff --git a/usecaseui-portal/src/assets/json/serviceTypes.json b/usecaseui-portal/src/assets/json/serviceTypes.json
new file mode 100644 (file)
index 0000000..cb1c20a
--- /dev/null
@@ -0,0 +1,18 @@
+
+[
+    {
+        "service-type": "CCVPN",
+        "temp-ub-sub-account-id": "sotnaccount",
+        "resource-version": "1535601345780"
+    },
+    {
+        "service-type": "SOTN",
+        "temp-ub-sub-account-id": "sotnaccount",
+        "resource-version": "1535601330040"
+    },
+    {
+        "service-type": "CCVPN1",
+        "temp-ub-sub-account-id": "sotnaccount",
+        "resource-version": "1536111036667"
+    }
+]
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/servicesList.json b/usecaseui-portal/src/assets/json/servicesList.json
new file mode 100644 (file)
index 0000000..61ddb7a
--- /dev/null
@@ -0,0 +1,4 @@
+{   
+    "customer":["aaaaa","bbbbb","ccccc","ddddd"],
+    "serviceType":["aaaaa","bbbbbb","cccc","ddddddd"]
+}
diff --git a/usecaseui-portal/src/assets/json/servicesTableData.json b/usecaseui-portal/src/assets/json/servicesTableData.json
new file mode 100644 (file)
index 0000000..07d4cbe
--- /dev/null
@@ -0,0 +1,127 @@
+{   
+    "total":365,
+    "tableList":[
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Active",
+        "progress": 100, 
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Closed",
+        "progress": 100,
+        "expand" : false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Onboarding",
+        "progress": 50,
+        "expand" : false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Deleting",
+        "progress": 25,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Updating",
+        "progress": 45,
+        "expand": false,
+        "children":[
+          
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Creating",
+        "progress": 60,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Creating",
+        "progress": 60,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Creating",
+        "progress": 60,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Creating",
+        "progress": 60,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      },
+      {
+        "serviceId":"foeigiaaegaf",
+        "name":"demo-test5",
+        "type":"voLTE type",
+        "status":"Creating",
+        "progress": 60,
+        "expand": false,
+        "children":[
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"},
+          {"serviceId":"aaasageafefdafda","name":"demo-test5","type":"Network Service"}
+        ]
+      }
+    ]
+}
diff --git a/usecaseui-portal/src/assets/json/siteAddressData.json b/usecaseui-portal/src/assets/json/siteAddressData.json
new file mode 100644 (file)
index 0000000..4b080f5
--- /dev/null
@@ -0,0 +1,39 @@
+[
+    {
+        "location" : "Chuangxin Building,Tianningsi,Xicheng,Beijing",
+        "access-provider-id": "3333",
+        "access-client-id": "4444",
+        "access-topology-id": "11",
+        "access-node-id": "10.10.10.10",
+        "access-ltp-id": "1",
+        "host" : ""
+    },
+    {
+        "location" : "CMCC International Data Center,Hongkong",
+        "access-provider-id": "3333",
+        "access-client-id": "4444",
+        "access-topology-id": "11",
+        "access-node-id": "10.10.10.10",
+        "access-ltp-id": "2",
+        "host" : ""
+    },
+    {
+        "location" : "VDF International Data Center,Hongkong",
+        "access-provider-id": "pid000",
+        "access-client-id": "cid000",
+        "access-topology-id": "tid000",
+        "access-node-id": "11.11.11.11",
+        "access-ltp-id": "2",
+        "host" : "http://10.10.10.10"
+    },
+    {
+        "location" : "University College London,Gower Street,London",
+        "access-provider-id": "5555",
+        "access-client-id": "6666",
+        "access-topology-id": "22",
+        "access-node-id": "11.11.11.11",
+        "access-ltp-id": "2",
+        "host" : "http://10.10.10.10"
+    }
+]
+
diff --git a/usecaseui-portal/src/assets/json/siteServiceTemplateParameters.json b/usecaseui-portal/src/assets/json/siteServiceTemplateParameters.json
new file mode 100644 (file)
index 0000000..53368e3
--- /dev/null
@@ -0,0 +1,308 @@
+{
+    "invariantUUID": "5c13f3fb-2744-4635-9f1f-c59c92dc8f70",
+    "uuid": "3a76b1f5-fb0d-4b6b-82d5-0e8a4ebc3838",
+    "name": "SiteService",
+    "type": "Service",
+    "version": "null",
+    "description": "Site Service",
+    "category": "E2E Service",
+    "subcategory": "null",
+    "customizationUuid": "null",
+    "inputs": [
+        {
+            "name": "internet_sitewanport_deviceName",
+            "type": "string",
+            "description": "The device name in the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_description",
+            "type": "string",
+            "description": "The description of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_type",
+            "type": "string",
+            "description": "The gateway option is used for SDWAN connectivity",
+            "isRequired": "true",
+            "defaultValue": "Single Gateway"
+        },
+        {
+            "name": "sitevf_site_longitude",
+            "type": "string",
+            "description": "The longitude of the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_outputBandwidth",
+            "type": "string",
+            "description": "The output bandwidth of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_esn",
+            "type": "string",
+            "description": "Device serial number",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_role",
+            "type": "string",
+            "description": "This is used for SDWAN only",
+            "isRequired": "true",
+            "defaultValue": "dsvpn-hub"
+        },
+        {
+            "name": "internet_sitewanport_providerIpAddress",
+            "type": "string",
+            "description": "The provider IP address of the provider CE",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnvpnattachmentvf_sotncondition_cVLAN",
+            "type": "string",
+            "description": "The cvlan for the site used for ethernet type connectivity.",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_address",
+            "type": "string",
+            "description": "the address of this site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_portType",
+            "type": "string",
+            "description": "the port type of the device.1 GE, 2 FE, 3 XGE, 4 LTE, 5 xDSL(ATM), 6 xSDL(PTM)",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_transportNetworkName",
+            "type": "string",
+            "description": "The transport network of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_inputBandwidth",
+            "type": "string",
+            "description": "The input bandwidth of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_portNumber",
+            "type": "string",
+            "description": "the port number of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_description",
+            "type": "string",
+            "description": "The description of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_transportNetworkName",
+            "type": "string",
+            "description": "The transport network of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_latitude",
+            "type": "string",
+            "description": "The latitude of the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_controlPoint",
+            "type": "string",
+            "description": "The control point of the site,only for sd-wan-edge",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_outputBandwidth",
+            "type": "string",
+            "description": "The output bandwidth of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_name",
+            "type": "string",
+            "description": "the name of this site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_description",
+            "type": "string",
+            "description": "The description of the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnvpnattachmentvf_sotncondition_clientSignal",
+            "type": "string",
+            "description": "The client signal for the site used for client type connectivity.",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_portType",
+            "type": "string",
+            "description": "the port type of the device.1 GE, 2 FE, 3 XGE, 4 LTE, 5 xDSL(ATM), 6 xSDL(PTM)",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_name",
+            "type": "string",
+            "description": "The name of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_deviceName",
+            "type": "string",
+            "description": "The device name in the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_providerIpAddress",
+            "type": "string",
+            "description": "The provider IP address of the provider CE",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_inputBandwidth",
+            "type": "string",
+            "description": "The input bandwidth of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_emails",
+            "type": "string",
+            "description": "the emails of this site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_class",
+            "type": "string",
+            "description": "The class should be VNF/PNF",
+            "isRequired": "true",
+            "defaultValue": "PNF"
+        },
+        {
+            "name": "sdwanvpnattachmentvf_sdwancondition_role",
+            "type": "string",
+            "description": "the role of the site.hub/spoke.",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_ipAddress",
+            "type": "string",
+            "description": "The public IP of the WAN Port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_name",
+            "type": "string",
+            "description": "the name of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName",
+            "type": "string",
+            "description": "The device Id of the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_portNumber",
+            "type": "string",
+            "description": "the port number of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnvpnattachmentvf_sotncondition_sotnVpnName",
+            "type": "string",
+            "description": "References the SOTN VPN Infra service",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_type",
+            "type": "string",
+            "description": "The type of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sitevf_site_postcode",
+            "type": "string",
+            "description": "The postcode of the site",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_version",
+            "type": "string",
+            "description": "The version of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_vendor",
+            "type": "string",
+            "description": "The vendor of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "mpls_sitewanport_name",
+            "type": "string",
+            "description": "The name of the WAN port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "devicevf_device_systemIp",
+            "type": "string",
+            "description": "The system ip of the device",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "internet_sitewanport_ipAddress",
+            "type": "string",
+            "description": "The public IP of the WAN Port",
+            "isRequired": "true",
+            "defaultValue": "null"
+        }
+    ],
+    "nestedTemplates": []
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/sotn-connectivity.json b/usecaseui-portal/src/assets/json/sotn-connectivity.json
new file mode 100644 (file)
index 0000000..6ac0a45
--- /dev/null
@@ -0,0 +1,94 @@
+{
+    "connectivity": [
+        {
+            "connectivity-id": "4efe6dff-acfc-4d13-a3fd-1177d3c08e84",
+            "bandwidth-profile-name": "vpn1",
+            "vpn-type": "ethernet",
+            "color-aware": "c1",
+            "coupling-flag": "c2",
+            "etht-svc-name": "SOTNVPNInfra",
+            "access-provider-id": "10",
+            "access-client-id": "10",
+            "access-topology-id": "10",
+            "access-node-id": "10.10.10.10",
+            "access-ltp-id": "14",
+            "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/10/service-data/networks/network/3efe6dff-acfc-4d13-a3fd-1177d3c08e88/network-data/",
+            "operational-status": "Created",
+            "model-customization-id": "b44071c8-04fd-4d6b-b6af-772cbfaa1129",
+            "model-invariant-id": "1b9c677d-fddf-4b70-938b-925a7fa57d43",
+            "model-version-id": "218df3c3-50dd-4c26-9e36-4771387bb771",
+            "resource-version": "1535684533349",
+            "relationship-list": {
+                "relationship": [
+                    {
+                        "related-to": "vpn-binding",
+                        "relationship-label": "org.onap.relationships.inventory.PartOf",
+                        "related-link": "/aai/v13/network/vpn-bindings/vpn-binding/pnf1000-vpn1",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "vpn-binding.vpn-id",
+                                "relationship-value": "pnf1000-vpn1"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "vpn-binding.vpn-name",
+                                "property-value": "pnf1000-vpn1"
+                            },
+                            {
+                                "property-key": "vpn-binding.vpn-type",
+                                "property-value": "ethernet"
+                            }
+                        ]
+                    },
+                    {
+                        "related-to": "service-instance",
+                        "relationship-label": "org.onap.relationships.inventory.PartOf",
+                        "related-link": "/aai/v13/business/customers/customer/Democcy/service-subscriptions/service-subscription/CCVPN/service-instances/service-instance/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "customer.global-customer-id",
+                                "relationship-value": "Democcy"
+                            },
+                            {
+                                "relationship-key": "service-subscription.service-type",
+                                "relationship-value": "CCVPN"
+                            },
+                            {
+                                "relationship-key": "service-instance.service-instance-id",
+                                "relationship-value": "32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "service-instance.service-instance-name",
+                                "property-value": "SOTNVPNInfra"
+                            }
+                        ]
+                    },
+                    {
+                        "related-to": "vpn-binding",
+                        "relationship-label": "org.onap.relationships.inventory.PartOf",
+                        "related-link": "/aai/v13/network/vpn-bindings/vpn-binding/pnf2000-vpn1",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "vpn-binding.vpn-id",
+                                "relationship-value": "pnf2000-vpn1"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "vpn-binding.vpn-name",
+                                "property-value": "pnf2000-vpn1"
+                            },
+                            {
+                                "property-key": "vpn-binding.vpn-type",
+                                "property-value": "ethernet"
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/sotn-connectivity2.json b/usecaseui-portal/src/assets/json/sotn-connectivity2.json
new file mode 100644 (file)
index 0000000..7bd55bf
--- /dev/null
@@ -0,0 +1 @@
+{"connectivity":[{"connectivity-id":"4424ea5a-3603-4040-baa9-4046ed533fe5","bandwidth-profile-name":"vpn1","vpn-type":"ethernet","color-aware":"true","coupling-flag":"true","etht-svc-name":"vpn1","access-provider-id":"","access-client-id":"","access-topology-id":"","access-node-id":"","access-ltp-id":"","connectivity-selflink":"restconf/config/GENERIC-RESOURCE-API:services/service/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0/service-data/networks/network/4424ea5a-3603-4040-baa9-4046ed533fe5/network-data/","operational-status":"Active","model-customization-id":"2bafc8aa-c60c-4a17-a658-db4cbca07fac","model-invariant-id":"5d0ada6b-de04-4624-9410-3baab839cd6f","model-version-id":"15e21930-3248-4148-b071-a2a9be1f9889","resource-version":"1537623789475","relationship-list":{"relationship":[{"related-to":"vpn-binding","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/vpn-bindings/vpn-binding/11.11.11.11-vpn1","relationship-data":[{"relationship-key":"vpn-binding.vpn-id","relationship-value":"11.11.11.11-vpn1"}],"related-to-property":[{"property-key":"vpn-binding.vpn-name","property-value":"11.11.11.11-vpn1"},{"property-key":"vpn-binding.vpn-type","property-value":"ethernet"}]},{"related-to":"service-instance","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/business/customers/customer/demo/service-subscriptions/service-subscription/ccvpn/service-instances/service-instance/32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0","relationship-data":[{"relationship-key":"customer.global-customer-id","relationship-value":"demo"},{"relationship-key":"service-subscription.service-type","relationship-value":"ccvpn"},{"relationship-key":"service-instance.service-instance-id","relationship-value":"32cd906f-ee7a-4ecf-b1c3-2fce4d59f8c0"}],"related-to-property":[{"property-key":"service-instance.service-instance-name","property-value":"SOTNVPNInfra"}]},{"related-to":"vpn-binding","relationship-label":"org.onap.relationships.inventory.PartOf","related-link":"/aai/v13/network/vpn-bindings/vpn-binding/12.12.12.12-vpn1","relationship-data":[{"relationship-key":"vpn-binding.vpn-id","relationship-value":"12.12.12.12-vpn1"}],"related-to-property":[{"property-key":"vpn-binding.vpn-name","property-value":"12.12.12.12-vpn1"},{"property-key":"vpn-binding.vpn-type","property-value":"ethernet"}]}]}}]}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/sotnvpnServiceTemplateParameters.json b/usecaseui-portal/src/assets/json/sotnvpnServiceTemplateParameters.json
new file mode 100644 (file)
index 0000000..21abcda
--- /dev/null
@@ -0,0 +1,225 @@
+{
+    "invariantUUID": "21886a96-0664-47a3-beae-766952f2059f",
+    "uuid": "54836196-c411-4690-af98-900c1c3aadd7",
+    "name": "SOTNVPNInfraService",
+    "type": "Service",
+    "version": "null",
+    "description": "SOTN VPN Infra Service",
+    "category": "E2E Service",
+    "subcategory": "null",
+    "customizationUuid": "null",
+    "inputs": [
+        {
+            "name": "sotnconnectivity0_eir",
+            "type": "string",
+            "description": "The eir for SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_cir",
+            "type": "string",
+            "description": "The cir for SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_endTime",
+            "type": "string",
+            "description": "End Time",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_ebs",
+            "type": "string",
+            "description": "The ebs for SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_startTime",
+            "type": "string",
+            "description": "Start Time",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_dualLink",
+            "type": "boolean",
+            "description": "is Active/standby enabled",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_reroute",
+            "type": "boolean",
+            "description": "Whether to support automatic rerouting",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_cbs",
+            "type": "string",
+            "description": "The cbs for SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_name",
+            "type": "string",
+            "description": "the name of the SOTN connectivity",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_SLS",
+            "type": "string",
+            "description": "Business Service Level",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_description",
+            "type": "string",
+            "description": "The description of the SOTN connectivity",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_couplingFlag",
+            "type": "boolean",
+            "description": "The couplingFlag for SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_colorAware",
+            "type": "boolean",
+            "description": "The colorAware of the SOTN connectivity. Only for Ethernet type",
+            "isRequired": "true",
+            "defaultValue": "null"
+        },
+        {
+            "name": "sotnconnectivity0_COS",
+            "type": "string",
+            "description": "Business Class of Service of VPN",
+            "isRequired": "true",
+            "defaultValue": "standard"
+        }
+    ],
+    "nestedTemplates": [
+        {
+            "invariantUUID": "1b9c677d-fddf-4b70-938b-925a7fa57d43",
+            "uuid": "218df3c3-50dd-4c26-9e36-4771387bb771",
+            "name": "SOTNConnectivity",
+            "type": "VL",
+            "version": "1.0",
+            "description": "Represents a sotn Connectivity",
+            "category": "Generic",
+            "subcategory": "Infrastructure",
+            "customizationUuid": "b44071c8-04fd-4d6b-b6af-772cbfaa1129",
+            "inputs": [
+                {
+                    "name": "sotnconnectivity0_eir",
+                    "type": "string",
+                    "description": "The eir for SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_cir",
+                    "type": "string",
+                    "description": "The cir for SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_endTime",
+                    "type": "string",
+                    "description": "End Time",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_ebs",
+                    "type": "string",
+                    "description": "The ebs for SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_startTime",
+                    "type": "string",
+                    "description": "Start Time",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_dualLink",
+                    "type": "boolean",
+                    "description": "is Active/standby enabled",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_reroute",
+                    "type": "boolean",
+                    "description": "Whether to support automatic rerouting",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_cbs",
+                    "type": "string",
+                    "description": "The cbs for SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_name",
+                    "type": "string",
+                    "description": "the name of the SOTN connectivity",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_SLS",
+                    "type": "string",
+                    "description": "Business Service Level",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_description",
+                    "type": "string",
+                    "description": "The description of the SOTN connectivity",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_couplingFlag",
+                    "type": "boolean",
+                    "description": "The couplingFlag for SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_colorAware",
+                    "type": "boolean",
+                    "description": "The colorAware of the SOTN connectivity. Only for Ethernet type",
+                    "isRequired": "true",
+                    "defaultValue": "null"
+                },
+                {
+                    "name": "sotnconnectivity0_COS",
+                    "type": "string",
+                    "description": "Business Class of Service of VPN",
+                    "isRequired": "true",
+                    "defaultValue": "standard"
+                }
+            ],
+            "nestedTemplates": []
+        }
+    ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/assets/json/specific_link _nfo.json b/usecaseui-portal/src/assets/json/specific_link _nfo.json
new file mode 100644 (file)
index 0000000..e991140
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "link-name": "nodeId-79.79.79.79-ltpId-4_nodeId-78.78.78.78-ltpId-4",
+  "in-maint": false,
+  "link-type": "some type",
+  "speed-value": "some speed",
+  "resource-version": "1536212883031",
+  "operational-status": "up",
+  "relationship-list": {
+    "relationship": [
+      {
+        "related-to": "p-interface",
+        "relationship-label": "tosca.relationships.network.LinksTo",
+        "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-4",
+        "relationship-data": [
+          {
+            "relationship-key": "pnf.pnf-name",
+            "relationship-value": "pnf1000"
+          },
+          {
+            "relationship-key": "p-interface.interface-name",
+            "relationship-value": "nodeId-79.79.79.79-ltpId-4"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "p-interface.prov-status"
+          }
+        ]
+      },
+      {
+        "related-to": "p-interface",
+        "relationship-label": "tosca.relationships.network.LinksTo",
+        "related-link": "/aai/v13/network/pnfs/pnf/pnf2000/p-interfaces/p-interface/nodeId-78.78.78.78-ltpId-4",
+        "relationship-data": [
+          {
+            "relationship-key": "pnf.pnf-name",
+            "relationship-value": "pnf2000"
+          },
+          {
+            "relationship-key": "p-interface.interface-name",
+            "relationship-value": "nodeId-78.78.78.78-ltpId-4"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "p-interface.prov-status"
+          }
+        ]
+      }
+    ]
+  }
+}
diff --git a/usecaseui-portal/src/assets/json/status.json b/usecaseui-portal/src/assets/json/status.json
new file mode 100644 (file)
index 0000000..eeff6f3
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "status":"SUCCESS"
+}
diff --git a/usecaseui-portal/src/assets/json/status2.json b/usecaseui-portal/src/assets/json/status2.json
new file mode 100644 (file)
index 0000000..05e0a4f
--- /dev/null
@@ -0,0 +1 @@
+"fail"
diff --git a/usecaseui-portal/src/assets/json/url.json b/usecaseui-portal/src/assets/json/url.json
new file mode 100644 (file)
index 0000000..e84b42d
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "esr-system-info-id": "gongjie666",
+  "service-url": "http://10.10.10.10:8080/",
+  "user-name": "demo",
+  "password": "demo123456!",
+  "system-type": "ONAP",
+  "resource-version": "1536221798873"
+}
diff --git a/usecaseui-portal/src/assets/json/vpnbinding.json b/usecaseui-portal/src/assets/json/vpnbinding.json
new file mode 100644 (file)
index 0000000..04ff2a6
--- /dev/null
@@ -0,0 +1,82 @@
+{
+  "vpn-binding": [
+    {
+      "vpn-id": "pnf1000-vpn1",
+      "vpn-name": "pnf1000-vpn1",
+      "vpn-type": "ethernet",
+      "access-provider-id": "5555",
+      "access-client-id": "6666",
+      "access-topology-id": "100",
+      "src-access-node-id": "10.10.10.10",
+      "src-access-ltp-id": "14",
+      "dst-access-node-id": "10.10.10.10",
+      "dst-access-ltp-id": "2",
+      "operational-status": "Created",
+      "model-customization-id": "",
+      "model-invariant-id": "",
+      "model-version-id": "",
+      "resource-version": "1536135677693",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "connectivity",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v13/network/connectivities/connectivity/4efe6dff-acfc-4d13-a3fd-1177d3c08e84",
+            "relationship-data": [
+              {
+                "relationship-key": "connectivity.connectivity-id",
+                "relationship-value": "4efe6dff-acfc-4d13-a3fd-1177d3c08e84"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "connectivity.etht-svc-name",
+                "property-value": "SOTNVPNInfra"
+              }
+            ]
+          },
+          {
+            "related-to": "p-interface",
+            "relationship-label": "org.onap.relationships.inventory.BindsTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf1000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-79.79.79.79-ltpId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          },
+          {
+            "related-to": "p-interface",
+            "relationship-label": "org.onap.relationships.inventory.BindsTo",
+            "related-link": "/aai/v13/network/pnfs/pnf/pnf1000/p-interfaces/p-interface/nodeId-79.79.79.79-ltpId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "pnf1000"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "nodeId-79.79.79.79-ltpId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/environments/environment.prod.ts b/usecaseui-portal/src/environments/environment.prod.ts
new file mode 100644 (file)
index 0000000..3612073
--- /dev/null
@@ -0,0 +1,3 @@
+export const environment = {
+  production: true
+};
diff --git a/usecaseui-portal/src/environments/environment.ts b/usecaseui-portal/src/environments/environment.ts
new file mode 100644 (file)
index 0000000..b7f639a
--- /dev/null
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+  production: false
+};
diff --git a/usecaseui-portal/src/favicon.ico b/usecaseui-portal/src/favicon.ico
new file mode 100644 (file)
index 0000000..8081c7c
Binary files /dev/null and b/usecaseui-portal/src/favicon.ico differ
diff --git a/usecaseui-portal/src/index.html b/usecaseui-portal/src/index.html
new file mode 100644 (file)
index 0000000..f828149
--- /dev/null
@@ -0,0 +1,29 @@
+<!--
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>Uui2</title>
+  <base href="/">
+
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="icon" type="image/x-icon" href="favicon.ico">
+</head>
+<body>
+  <app-root></app-root>
+</body>
+</html>
diff --git a/usecaseui-portal/src/main.ts b/usecaseui-portal/src/main.ts
new file mode 100644 (file)
index 0000000..91ec6da
--- /dev/null
@@ -0,0 +1,12 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+  .catch(err => console.log(err));
diff --git a/usecaseui-portal/src/my-theme.css b/usecaseui-portal/src/my-theme.css
new file mode 100644 (file)
index 0000000..ac66bcc
--- /dev/null
@@ -0,0 +1,18190 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */
+/* stylelint-disable at-rule-no-unknown */
+@font-face {
+  font-family: "Monospaced Number";
+  src: local("Tahoma");
+  unicode-range: U+30-39;
+}
+@font-face {
+  font-family: "Chinese Quote";
+  src: local("PingFang SC"), local("SimSun");
+  unicode-range: U+2018, U+2019, U+201c, U+201d;
+}
+html,
+body {
+  width: 100%;
+  height: 100%;
+}
+input::-ms-clear,
+input::-ms-reveal {
+  display: none;
+}
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  -ms-overflow-style: scrollbar;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+article,
+aside,
+dialog,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+  display: block;
+}
+body {
+  margin: 0;
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+}
+[tabindex="-1"]:focus {
+  outline: none !important;
+}
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 0;
+  margin-bottom: .5em;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+}
+p {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  text-decoration: underline dotted;
+  cursor: help;
+  border-bottom: 0;
+}
+address {
+  margin-bottom: 1em;
+  font-style: normal;
+  line-height: inherit;
+}
+input[type="text"],
+input[type="password"],
+input[type="number"],
+textarea {
+  -webkit-appearance: none;
+}
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+dt {
+  font-weight: 500;
+}
+dd {
+  margin-bottom: .5em;
+  margin-left: 0;
+}
+blockquote {
+  margin: 0 0 1em;
+}
+dfn {
+  font-style: italic;
+}
+b,
+strong {
+  font-weight: bolder;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sub {
+  bottom: -0.25em;
+}
+sup {
+  top: -0.5em;
+}
+a {
+  color: #1890ff;
+  background-color: transparent;
+  text-decoration: none;
+  outline: none;
+  cursor: pointer;
+  transition: color .3s;
+  -webkit-text-decoration-skip: objects;
+}
+a:focus {
+  text-decoration: underline;
+  text-decoration-skip: ink;
+}
+a:hover {
+  color: #40a9ff;
+}
+a:active {
+  color: #096dd9;
+}
+a:active,
+a:hover {
+  outline: 0;
+  text-decoration: none;
+}
+a[disabled] {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+  pointer-events: none;
+}
+pre,
+code,
+kbd,
+samp {
+  font-family: Consolas, Menlo, Courier, monospace;
+  font-size: 1em;
+}
+pre {
+  margin-top: 0;
+  margin-bottom: 1em;
+  overflow: auto;
+}
+figure {
+  margin: 0 0 1em;
+}
+img {
+  vertical-align: middle;
+  border-style: none;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+a,
+area,
+button,
+[role="button"],
+input:not([type=range]),
+label,
+select,
+summary,
+textarea {
+  touch-action: manipulation;
+}
+table {
+  border-collapse: collapse;
+}
+caption {
+  padding-top: .75em;
+  padding-bottom: .3em;
+  color: rgba(0, 0, 0, 0.45);
+  text-align: left;
+  caption-side: bottom;
+}
+th {
+  text-align: inherit;
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+  color: inherit;
+}
+button,
+input {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  -webkit-appearance: listbox;
+}
+textarea {
+  overflow: auto;
+  resize: vertical;
+}
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  padding: 0;
+  margin-bottom: .5em;
+  font-size: 1.5em;
+  line-height: inherit;
+  color: inherit;
+  white-space: normal;
+}
+progress {
+  vertical-align: baseline;
+}
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+[type="search"] {
+  outline-offset: -2px;
+  -webkit-appearance: none;
+}
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button;
+}
+output {
+  display: inline-block;
+}
+summary {
+  display: list-item;
+}
+template {
+  display: none;
+}
+[hidden] {
+  display: none !important;
+}
+mark {
+  padding: .2em;
+  background-color: #feffe6;
+}
+::selection {
+  background: #1890ff;
+  color: #fff;
+}
+.clearfix {
+  zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  content: " ";
+  display: table;
+}
+.clearfix:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+@font-face {
+  font-family: 'anticon';
+  src: url('https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.eot');
+  /* IE9*/
+  src: url('https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.woff') format('woff'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ url('https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.ttf') format('truetype'), /* iOS 4.1- */ url('https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i.svg#iconfont') format('svg');
+}
+.anticon {
+  display: inline-block;
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  line-height: 1;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.anticon:before {
+  display: block;
+  font-family: "anticon" !important;
+}
+.anticon-step-forward:before {
+  content: "\e600";
+}
+.anticon-step-backward:before {
+  content: "\e601";
+}
+.anticon-forward:before {
+  content: "\e602";
+}
+.anticon-backward:before {
+  content: "\e603";
+}
+.anticon-caret-right:before {
+  content: "\e604";
+}
+.anticon-caret-left:before {
+  content: "\e605";
+}
+.anticon-caret-down:before {
+  content: "\e606";
+}
+.anticon-caret-up:before {
+  content: "\e607";
+}
+.anticon-right-circle:before {
+  content: "\e608";
+}
+.anticon-circle-right:before {
+  content: "\e608";
+}
+.anticon-caret-circle-right:before {
+  content: "\e608";
+}
+.anticon-left-circle:before {
+  content: "\e609";
+}
+.anticon-circle-left:before {
+  content: "\e609";
+}
+.anticon-caret-circle-left:before {
+  content: "\e609";
+}
+.anticon-up-circle:before {
+  content: "\e60a";
+}
+.anticon-circle-up:before {
+  content: "\e60a";
+}
+.anticon-caret-circle-up:before {
+  content: "\e60a";
+}
+.anticon-down-circle:before {
+  content: "\e60b";
+}
+.anticon-circle-down:before {
+  content: "\e60b";
+}
+.anticon-caret-circle-down:before {
+  content: "\e60b";
+}
+.anticon-right-circle-o:before {
+  content: "\e60c";
+}
+.anticon-circle-o-right:before {
+  content: "\e60c";
+}
+.anticon-caret-circle-o-right:before {
+  content: "\e60c";
+}
+.anticon-left-circle-o:before {
+  content: "\e60d";
+}
+.anticon-circle-o-left:before {
+  content: "\e60d";
+}
+.anticon-caret-circle-o-left:before {
+  content: "\e60d";
+}
+.anticon-up-circle-o:before {
+  content: "\e60e";
+}
+.anticon-circle-o-up:before {
+  content: "\e60e";
+}
+.anticon-caret-circle-o-up:before {
+  content: "\e60e";
+}
+.anticon-down-circle-o:before {
+  content: "\e60f";
+}
+.anticon-circle-o-down:before {
+  content: "\e60f";
+}
+.anticon-caret-circle-o-down:before {
+  content: "\e60f";
+}
+.anticon-verticle-left:before {
+  content: "\e610";
+}
+.anticon-verticle-right:before {
+  content: "\e611";
+}
+.anticon-rollback:before {
+  content: "\e612";
+}
+.anticon-retweet:before {
+  content: "\e613";
+}
+.anticon-shrink:before {
+  content: "\e614";
+}
+.anticon-arrows-alt:before {
+  content: "\e615";
+}
+.anticon-arrow-salt:before {
+  content: "\e615";
+}
+.anticon-reload:before {
+  content: "\e616";
+}
+.anticon-double-right:before {
+  content: "\e617";
+}
+.anticon-double-left:before {
+  content: "\e618";
+}
+.anticon-arrow-down:before {
+  content: "\e619";
+}
+.anticon-arrow-up:before {
+  content: "\e61a";
+}
+.anticon-arrow-right:before {
+  content: "\e61b";
+}
+.anticon-arrow-left:before {
+  content: "\e61c";
+}
+.anticon-down:before {
+  content: "\e61d";
+}
+.anticon-up:before {
+  content: "\e61e";
+}
+.anticon-right:before {
+  content: "\e61f";
+}
+.anticon-left:before {
+  content: "\e620";
+}
+.anticon-minus-square-o:before {
+  content: "\e621";
+}
+.anticon-minus-circle:before {
+  content: "\e622";
+}
+.anticon-minus-circle-o:before {
+  content: "\e623";
+}
+.anticon-minus:before {
+  content: "\e624";
+}
+.anticon-plus-circle-o:before {
+  content: "\e625";
+}
+.anticon-plus-circle:before {
+  content: "\e626";
+}
+.anticon-plus:before {
+  content: "\e627";
+}
+.anticon-info-circle:before {
+  content: "\e628";
+}
+.anticon-info-circle-o:before {
+  content: "\e629";
+}
+.anticon-info:before {
+  content: "\e62a";
+}
+.anticon-exclamation:before {
+  content: "\e62b";
+}
+.anticon-exclamation-circle:before {
+  content: "\e62c";
+}
+.anticon-exclamation-circle-o:before {
+  content: "\e62d";
+}
+.anticon-close-circle:before {
+  content: "\e62e";
+}
+.anticon-cross-circle:before {
+  content: "\e62e";
+}
+.anticon-close-circle-o:before {
+  content: "\e62f";
+}
+.anticon-cross-circle-o:before {
+  content: "\e62f";
+}
+.anticon-check-circle:before {
+  content: "\e630";
+}
+.anticon-check-circle-o:before {
+  content: "\e631";
+}
+.anticon-check:before {
+  content: "\e632";
+}
+.anticon-close:before {
+  content: "\e633";
+}
+.anticon-cross:before {
+  content: "\e633";
+}
+.anticon-customer-service:before {
+  content: "\e634";
+}
+.anticon-customerservice:before {
+  content: "\e634";
+}
+.anticon-credit-card:before {
+  content: "\e635";
+}
+.anticon-code-o:before {
+  content: "\e636";
+}
+.anticon-book:before {
+  content: "\e637";
+}
+.anticon-bars:before {
+  content: "\e639";
+}
+.anticon-question:before {
+  content: "\e63a";
+}
+.anticon-question-circle:before {
+  content: "\e63b";
+}
+.anticon-question-circle-o:before {
+  content: "\e63c";
+}
+.anticon-pause:before {
+  content: "\e63d";
+}
+.anticon-pause-circle:before {
+  content: "\e63e";
+}
+.anticon-pause-circle-o:before {
+  content: "\e63f";
+}
+.anticon-clock-circle:before {
+  content: "\e640";
+}
+.anticon-clock-circle-o:before {
+  content: "\e641";
+}
+.anticon-swap:before {
+  content: "\e642";
+}
+.anticon-swap-left:before {
+  content: "\e643";
+}
+.anticon-swap-right:before {
+  content: "\e644";
+}
+.anticon-plus-square-o:before {
+  content: "\e645";
+}
+.anticon-frown:before {
+  content: "\e646";
+}
+.anticon-frown-circle:before {
+  content: "\e646";
+}
+.anticon-ellipsis:before {
+  content: "\e647";
+}
+.anticon-copy:before {
+  content: "\e648";
+}
+.anticon-menu-fold:before {
+  content: "\e9ac";
+}
+.anticon-mail:before {
+  content: "\e659";
+}
+.anticon-logout:before {
+  content: "\e65a";
+}
+.anticon-link:before {
+  content: "\e65b";
+}
+.anticon-area-chart:before {
+  content: "\e65c";
+}
+.anticon-line-chart:before {
+  content: "\e65d";
+}
+.anticon-home:before {
+  content: "\e65e";
+}
+.anticon-laptop:before {
+  content: "\e65f";
+}
+.anticon-star:before {
+  content: "\e660";
+}
+.anticon-star-o:before {
+  content: "\e661";
+}
+.anticon-folder:before {
+  content: "\e662";
+}
+.anticon-filter:before {
+  content: "\e663";
+}
+.anticon-file:before {
+  content: "\e664";
+}
+.anticon-exception:before {
+  content: "\e665";
+}
+.anticon-meh:before {
+  content: "\e666";
+}
+.anticon-meh-circle:before {
+  content: "\e666";
+}
+.anticon-meh-o:before {
+  content: "\e667";
+}
+.anticon-shopping-cart:before {
+  content: "\e668";
+}
+.anticon-save:before {
+  content: "\e669";
+}
+.anticon-user:before {
+  content: "\e66a";
+}
+.anticon-video-camera:before {
+  content: "\e66b";
+}
+.anticon-to-top:before {
+  content: "\e66c";
+}
+.anticon-team:before {
+  content: "\e66d";
+}
+.anticon-tablet:before {
+  content: "\e66e";
+}
+.anticon-solution:before {
+  content: "\e66f";
+}
+.anticon-search:before {
+  content: "\e670";
+}
+.anticon-share-alt:before {
+  content: "\e671";
+}
+.anticon-setting:before {
+  content: "\e672";
+}
+.anticon-poweroff:before {
+  content: "\e6d5";
+}
+.anticon-picture:before {
+  content: "\e674";
+}
+.anticon-phone:before {
+  content: "\e675";
+}
+.anticon-paper-clip:before {
+  content: "\e676";
+}
+.anticon-notification:before {
+  content: "\e677";
+}
+.anticon-mobile:before {
+  content: "\e678";
+}
+.anticon-menu-unfold:before {
+  content: "\e9ad";
+}
+.anticon-inbox:before {
+  content: "\e67a";
+}
+.anticon-lock:before {
+  content: "\e67b";
+}
+.anticon-qrcode:before {
+  content: "\e67c";
+}
+.anticon-play-circle:before {
+  content: "\e6d0";
+}
+.anticon-play-circle-o:before {
+  content: "\e6d1";
+}
+.anticon-tag:before {
+  content: "\e6d2";
+}
+.anticon-tag-o:before {
+  content: "\e6d3";
+}
+.anticon-tags:before {
+  content: "\e67d";
+}
+.anticon-tags-o:before {
+  content: "\e67e";
+}
+.anticon-cloud-o:before {
+  content: "\e67f";
+}
+.anticon-cloud:before {
+  content: "\e680";
+}
+.anticon-cloud-upload:before {
+  content: "\e681";
+}
+.anticon-cloud-download:before {
+  content: "\e682";
+}
+.anticon-cloud-download-o:before {
+  content: "\e683";
+}
+.anticon-cloud-upload-o:before {
+  content: "\e684";
+}
+.anticon-environment:before {
+  content: "\e685";
+}
+.anticon-environment-o:before {
+  content: "\e686";
+}
+.anticon-eye:before {
+  content: "\e687";
+}
+.anticon-eye-o:before {
+  content: "\e688";
+}
+.anticon-camera:before {
+  content: "\e689";
+}
+.anticon-camera-o:before {
+  content: "\e68a";
+}
+.anticon-windows:before {
+  content: "\e68b";
+}
+.anticon-apple:before {
+  content: "\e68c";
+}
+.anticon-apple-o:before {
+  content: "\e6d4";
+}
+.anticon-android:before {
+  content: "\e938";
+}
+.anticon-android-o:before {
+  content: "\e68d";
+}
+.anticon-aliwangwang:before {
+  content: "\e68e";
+}
+.anticon-aliwangwang-o:before {
+  content: "\e68f";
+}
+.anticon-export:before {
+  content: "\e691";
+}
+.anticon-edit:before {
+  content: "\e692";
+}
+.anticon-circle-down-o:before {
+  content: "\e693";
+}
+.anticon-circle-down-:before {
+  content: "\e694";
+}
+.anticon-appstore-o:before {
+  content: "\e695";
+}
+.anticon-appstore:before {
+  content: "\e696";
+}
+.anticon-scan:before {
+  content: "\e697";
+}
+.anticon-file-text:before {
+  content: "\e698";
+}
+.anticon-folder-open:before {
+  content: "\e699";
+}
+.anticon-hdd:before {
+  content: "\e69a";
+}
+.anticon-ie:before {
+  content: "\e69b";
+}
+.anticon-file-jpg:before {
+  content: "\e69c";
+}
+.anticon-like:before {
+  content: "\e64c";
+}
+.anticon-like-o:before {
+  content: "\e69d";
+}
+.anticon-dislike:before {
+  content: "\e64b";
+}
+.anticon-dislike-o:before {
+  content: "\e69e";
+}
+.anticon-delete:before {
+  content: "\e69f";
+}
+.anticon-enter:before {
+  content: "\e6a0";
+}
+.anticon-pushpin-o:before {
+  content: "\e6a1";
+}
+.anticon-pushpin:before {
+  content: "\e6a2";
+}
+.anticon-heart:before {
+  content: "\e6a3";
+}
+.anticon-heart-o:before {
+  content: "\e6a4";
+}
+.anticon-pay-circle:before {
+  content: "\e6a5";
+}
+.anticon-pay-circle-o:before {
+  content: "\e6a6";
+}
+.anticon-smile:before {
+  content: "\e6a7";
+}
+.anticon-smile-circle:before {
+  content: "\e6a7";
+}
+.anticon-smile-o:before {
+  content: "\e6a8";
+}
+.anticon-frown-o:before {
+  content: "\e6a9";
+}
+.anticon-calculator:before {
+  content: "\e6aa";
+}
+.anticon-message:before {
+  content: "\e6ab";
+}
+.anticon-chrome:before {
+  content: "\e6ac";
+}
+.anticon-github:before {
+  content: "\e6ad";
+}
+.anticon-file-unknown:before {
+  content: "\e6af";
+}
+.anticon-file-excel:before {
+  content: "\e6b0";
+}
+.anticon-file-ppt:before {
+  content: "\e6b1";
+}
+.anticon-file-word:before {
+  content: "\e6b2";
+}
+.anticon-file-pdf:before {
+  content: "\e6b3";
+}
+.anticon-desktop:before {
+  content: "\e6b4";
+}
+.anticon-upload:before {
+  content: "\e6b6";
+}
+.anticon-download:before {
+  content: "\e6b7";
+}
+.anticon-pie-chart:before {
+  content: "\e6b8";
+}
+.anticon-unlock:before {
+  content: "\e6ba";
+}
+.anticon-calendar:before {
+  content: "\e6bb";
+}
+.anticon-windows-o:before {
+  content: "\e6bc";
+}
+.anticon-dot-chart:before {
+  content: "\e6bd";
+}
+.anticon-bar-chart:before {
+  content: "\e6be";
+}
+.anticon-code:before {
+  content: "\e6bf";
+}
+.anticon-api:before {
+  content: "\e951";
+}
+.anticon-plus-square:before {
+  content: "\e6c0";
+}
+.anticon-minus-square:before {
+  content: "\e6c1";
+}
+.anticon-close-square:before {
+  content: "\e6c2";
+}
+.anticon-close-square-o:before {
+  content: "\e6c3";
+}
+.anticon-check-square:before {
+  content: "\e6c4";
+}
+.anticon-check-square-o:before {
+  content: "\e6c5";
+}
+.anticon-fast-backward:before {
+  content: "\e6c6";
+}
+.anticon-fast-forward:before {
+  content: "\e6c7";
+}
+.anticon-up-square:before {
+  content: "\e6c8";
+}
+.anticon-down-square:before {
+  content: "\e6c9";
+}
+.anticon-left-square:before {
+  content: "\e6ca";
+}
+.anticon-right-square:before {
+  content: "\e6cb";
+}
+.anticon-right-square-o:before {
+  content: "\e6cc";
+}
+.anticon-left-square-o:before {
+  content: "\e6cd";
+}
+.anticon-down-square-o:before {
+  content: "\e6ce";
+}
+.anticon-up-square-o:before {
+  content: "\e6cf";
+}
+.anticon-loading:before {
+  content: "\e64d";
+}
+.anticon-loading-3-quarters:before {
+  content: "\e6ae";
+}
+.anticon-bulb:before {
+  content: "\e649";
+}
+.anticon-select:before {
+  content: "\e64a";
+}
+.anticon-addfile:before,
+.anticon-file-add:before {
+  content: "\e910";
+}
+.anticon-addfolder:before,
+.anticon-folder-add:before {
+  content: "\e914";
+}
+.anticon-switcher:before {
+  content: "\e913";
+}
+.anticon-rocket:before {
+  content: "\e90f";
+}
+.anticon-dingding:before {
+  content: "\e923";
+}
+.anticon-dingding-o:before {
+  content: "\e925";
+}
+.anticon-bell:before {
+  content: "\e64e";
+}
+.anticon-disconnect:before {
+  content: "\e64f";
+}
+.anticon-database:before {
+  content: "\e650";
+}
+.anticon-compass:before {
+  content: "\e6db";
+}
+.anticon-barcode:before {
+  content: "\e652";
+}
+.anticon-hourglass:before {
+  content: "\e653";
+}
+.anticon-key:before {
+  content: "\e654";
+}
+.anticon-flag:before {
+  content: "\e655";
+}
+.anticon-layout:before {
+  content: "\e656";
+}
+.anticon-login:before {
+  content: "\e657";
+}
+.anticon-printer:before {
+  content: "\e673";
+}
+.anticon-sound:before {
+  content: "\e6e9";
+}
+.anticon-usb:before {
+  content: "\e6d7";
+}
+.anticon-skin:before {
+  content: "\e6d8";
+}
+.anticon-tool:before {
+  content: "\e6d9";
+}
+.anticon-sync:before {
+  content: "\e6da";
+}
+.anticon-wifi:before {
+  content: "\e6d6";
+}
+.anticon-car:before {
+  content: "\e6dc";
+}
+.anticon-copyright:before {
+  content: "\e6de";
+}
+.anticon-schedule:before {
+  content: "\e6df";
+}
+.anticon-user-add:before {
+  content: "\e6ed";
+}
+.anticon-user-delete:before {
+  content: "\e6e0";
+}
+.anticon-usergroup-add:before {
+  content: "\e6dd";
+}
+.anticon-usergroup-delete:before {
+  content: "\e6e1";
+}
+.anticon-man:before {
+  content: "\e6e2";
+}
+.anticon-woman:before {
+  content: "\e6ec";
+}
+.anticon-shop:before {
+  content: "\e6e3";
+}
+.anticon-gift:before {
+  content: "\e6e4";
+}
+.anticon-idcard:before {
+  content: "\e6e5";
+}
+.anticon-medicine-box:before {
+  content: "\e6e6";
+}
+.anticon-red-envelope:before {
+  content: "\e6e7";
+}
+.anticon-coffee:before {
+  content: "\e6e8";
+}
+.anticon-trademark:before {
+  content: "\e651";
+}
+.anticon-safety:before {
+  content: "\e6ea";
+}
+.anticon-wallet:before {
+  content: "\e6eb";
+}
+.anticon-bank:before {
+  content: "\e6ee";
+}
+.anticon-trophy:before {
+  content: "\e6ef";
+}
+.anticon-contacts:before {
+  content: "\e6f0";
+}
+.anticon-global:before {
+  content: "\e6f1";
+}
+.anticon-shake:before {
+  content: "\e94f";
+}
+.anticon-fork:before {
+  content: "\e6f2";
+}
+.anticon-dashboard:before {
+  content: "\e99a";
+}
+.anticon-profile:before {
+  content: "\e999";
+}
+.anticon-table:before {
+  content: "\e998";
+}
+.anticon-warning:before {
+  content: "\e997";
+}
+.anticon-form:before {
+  content: "\e996";
+}
+.anticon-spin:before {
+  display: inline-block;
+  animation: loadingCircle 1s infinite linear;
+}
+.anticon-weibo-square:before {
+  content: "\e6f5";
+}
+.anticon-weibo-circle:before {
+  content: "\e6f4";
+}
+.anticon-taobao-circle:before {
+  content: "\e6f3";
+}
+.anticon-html5:before {
+  content: "\e9c7";
+}
+.anticon-weibo:before {
+  content: "\e9c6";
+}
+.anticon-twitter:before {
+  content: "\e9c5";
+}
+.anticon-wechat:before {
+  content: "\e9c4";
+}
+.anticon-youtube:before {
+  content: "\e9c3";
+}
+.anticon-alipay-circle:before {
+  content: "\e9c2";
+}
+.anticon-taobao:before {
+  content: "\e9c1";
+}
+.anticon-skype:before {
+  content: "\e9c0";
+}
+.anticon-qq:before {
+  content: "\e9bf";
+}
+.anticon-medium-workmark:before {
+  content: "\e9be";
+}
+.anticon-gitlab:before {
+  content: "\e9bd";
+}
+.anticon-medium:before {
+  content: "\e9bc";
+}
+.anticon-linkedin:before {
+  content: "\e9bb";
+}
+.anticon-google-plus:before {
+  content: "\e9ba";
+}
+.anticon-dropbox:before {
+  content: "\e9b9";
+}
+.anticon-facebook:before {
+  content: "\e9b8";
+}
+.anticon-codepen:before {
+  content: "\e9b7";
+}
+.anticon-amazon:before {
+  content: "\e9b6";
+}
+.anticon-google:before {
+  content: "\e9b5";
+}
+.anticon-codepen-circle:before {
+  content: "\e9b4";
+}
+.anticon-alipay:before {
+  content: "\e9b3";
+}
+.anticon-ant-design:before {
+  content: "\e9b2";
+}
+.anticon-aliyun:before {
+  content: "\e9f4";
+}
+.anticon-zhihu:before {
+  content: "\e703";
+}
+.anticon-file-markdown:before {
+  content: "\e704";
+}
+.anticon-slack:before {
+  content: "\e705";
+}
+.anticon-slack-square:before {
+  content: "\e706";
+}
+.anticon-behance:before {
+  content: "\e707";
+}
+.anticon-behance-square:before {
+  content: "\e708";
+}
+.anticon-dribbble:before {
+  content: "\e709";
+}
+.anticon-dribbble-square:before {
+  content: "\e70a";
+}
+.anticon-instagram:before {
+  content: "\e70b";
+}
+.anticon-yuque:before {
+  content: "\e70c";
+}
+.fade-enter,
+.fade-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.fade-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.fade-enter.fade-enter-active,
+.fade-appear.fade-appear-active {
+  animation-name: antFadeIn;
+  animation-play-state: running;
+}
+.fade-leave.fade-leave-active {
+  animation-name: antFadeOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.fade-enter,
+.fade-appear {
+  opacity: 0;
+  animation-timing-function: linear;
+}
+.fade-leave {
+  animation-timing-function: linear;
+}
+@keyframes antFadeIn {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes antFadeOut {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+.move-up-enter,
+.move-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-up-enter.move-up-enter-active,
+.move-up-appear.move-up-appear-active {
+  animation-name: antMoveUpIn;
+  animation-play-state: running;
+}
+.move-up-leave.move-up-leave-active {
+  animation-name: antMoveUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.move-up-enter,
+.move-up-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.move-up-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.move-down-enter,
+.move-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-down-enter.move-down-enter-active,
+.move-down-appear.move-down-appear-active {
+  animation-name: antMoveDownIn;
+  animation-play-state: running;
+}
+.move-down-leave.move-down-leave-active {
+  animation-name: antMoveDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.move-down-enter,
+.move-down-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.move-down-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.move-left-enter,
+.move-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-left-enter.move-left-enter-active,
+.move-left-appear.move-left-appear-active {
+  animation-name: antMoveLeftIn;
+  animation-play-state: running;
+}
+.move-left-leave.move-left-leave-active {
+  animation-name: antMoveLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.move-left-enter,
+.move-left-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.move-left-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.move-right-enter,
+.move-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.move-right-enter.move-right-enter-active,
+.move-right-appear.move-right-appear-active {
+  animation-name: antMoveRightIn;
+  animation-play-state: running;
+}
+.move-right-leave.move-right-leave-active {
+  animation-name: antMoveRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.move-right-enter,
+.move-right-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.move-right-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+@keyframes antMoveDownIn {
+  0% {
+    transform-origin: 0 0;
+    transform: translateY(100%);
+    opacity: 0;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateY(0%);
+    opacity: 1;
+  }
+}
+@keyframes antMoveDownOut {
+  0% {
+    transform-origin: 0 0;
+    transform: translateY(0%);
+    opacity: 1;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateY(100%);
+    opacity: 0;
+  }
+}
+@keyframes antMoveLeftIn {
+  0% {
+    transform-origin: 0 0;
+    transform: translateX(-100%);
+    opacity: 0;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateX(0%);
+    opacity: 1;
+  }
+}
+@keyframes antMoveLeftOut {
+  0% {
+    transform-origin: 0 0;
+    transform: translateX(0%);
+    opacity: 1;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateX(-100%);
+    opacity: 0;
+  }
+}
+@keyframes antMoveRightIn {
+  0% {
+    opacity: 0;
+    transform-origin: 0 0;
+    transform: translateX(100%);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 0 0;
+    transform: translateX(0%);
+  }
+}
+@keyframes antMoveRightOut {
+  0% {
+    transform-origin: 0 0;
+    transform: translateX(0%);
+    opacity: 1;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateX(100%);
+    opacity: 0;
+  }
+}
+@keyframes antMoveUpIn {
+  0% {
+    transform-origin: 0 0;
+    transform: translateY(-100%);
+    opacity: 0;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateY(0%);
+    opacity: 1;
+  }
+}
+@keyframes antMoveUpOut {
+  0% {
+    transform-origin: 0 0;
+    transform: translateY(0%);
+    opacity: 1;
+  }
+  100% {
+    transform-origin: 0 0;
+    transform: translateY(-100%);
+    opacity: 0;
+  }
+}
+@keyframes loadingCircle {
+  0% {
+    transform-origin: 50% 50%;
+    transform: rotate(0deg);
+  }
+  100% {
+    transform-origin: 50% 50%;
+    transform: rotate(360deg);
+  }
+}
+.slide-up-enter,
+.slide-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-up-enter.slide-up-enter-active,
+.slide-up-appear.slide-up-appear-active {
+  animation-name: antSlideUpIn;
+  animation-play-state: running;
+}
+.slide-up-leave.slide-up-leave-active {
+  animation-name: antSlideUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.slide-up-enter,
+.slide-up-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.slide-up-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.slide-down-enter,
+.slide-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-down-enter.slide-down-enter-active,
+.slide-down-appear.slide-down-appear-active {
+  animation-name: antSlideDownIn;
+  animation-play-state: running;
+}
+.slide-down-leave.slide-down-leave-active {
+  animation-name: antSlideDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.slide-down-enter,
+.slide-down-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.slide-down-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.slide-left-enter,
+.slide-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-left-enter.slide-left-enter-active,
+.slide-left-appear.slide-left-appear-active {
+  animation-name: antSlideLeftIn;
+  animation-play-state: running;
+}
+.slide-left-leave.slide-left-leave-active {
+  animation-name: antSlideLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.slide-left-enter,
+.slide-left-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.slide-left-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.slide-right-enter,
+.slide-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.slide-right-enter.slide-right-enter-active,
+.slide-right-appear.slide-right-appear-active {
+  animation-name: antSlideRightIn;
+  animation-play-state: running;
+}
+.slide-right-leave.slide-right-leave-active {
+  animation-name: antSlideRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.slide-right-enter,
+.slide-right-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.slide-right-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+@keyframes antSlideUpIn {
+  0% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleY(0.8);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleY(1);
+  }
+}
+@keyframes antSlideUpOut {
+  0% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleY(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleY(0.8);
+  }
+}
+@keyframes antSlideDownIn {
+  0% {
+    opacity: 0;
+    transform-origin: 100% 100%;
+    transform: scaleY(0.8);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 100% 100%;
+    transform: scaleY(1);
+  }
+}
+@keyframes antSlideDownOut {
+  0% {
+    opacity: 1;
+    transform-origin: 100% 100%;
+    transform: scaleY(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 100% 100%;
+    transform: scaleY(0.8);
+  }
+}
+@keyframes antSlideLeftIn {
+  0% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleX(0.8);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleX(1);
+  }
+}
+@keyframes antSlideLeftOut {
+  0% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleX(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleX(0.8);
+  }
+}
+@keyframes antSlideRightIn {
+  0% {
+    opacity: 0;
+    transform-origin: 100% 0%;
+    transform: scaleX(0.8);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 100% 0%;
+    transform: scaleX(1);
+  }
+}
+@keyframes antSlideRightOut {
+  0% {
+    opacity: 1;
+    transform-origin: 100% 0%;
+    transform: scaleX(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 100% 0%;
+    transform: scaleX(0.8);
+  }
+}
+.swing-enter,
+.swing-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.swing-enter.swing-enter-active,
+.swing-appear.swing-appear-active {
+  animation-name: antSwingIn;
+  animation-play-state: running;
+}
+@keyframes antSwingIn {
+  0%,
+  100% {
+    transform: translateX(0);
+  }
+  20% {
+    transform: translateX(-10px);
+  }
+  40% {
+    transform: translateX(10px);
+  }
+  60% {
+    transform: translateX(-5px);
+  }
+  80% {
+    transform: translateX(5px);
+  }
+}
+.zoom-enter,
+.zoom-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-enter.zoom-enter-active,
+.zoom-appear.zoom-appear-active {
+  animation-name: antZoomIn;
+  animation-play-state: running;
+}
+.zoom-leave.zoom-leave-active {
+  animation-name: antZoomOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-enter,
+.zoom-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-big-enter,
+.zoom-big-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-big-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-big-enter.zoom-big-enter-active,
+.zoom-big-appear.zoom-big-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.zoom-big-leave.zoom-big-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-big-enter,
+.zoom-big-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-big-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-big-fast-enter,
+.zoom-big-fast-appear {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-big-fast-leave {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-big-fast-enter.zoom-big-fast-enter-active,
+.zoom-big-fast-appear.zoom-big-fast-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.zoom-big-fast-leave.zoom-big-fast-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-big-fast-enter,
+.zoom-big-fast-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-big-fast-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-up-enter,
+.zoom-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-up-enter.zoom-up-enter-active,
+.zoom-up-appear.zoom-up-appear-active {
+  animation-name: antZoomUpIn;
+  animation-play-state: running;
+}
+.zoom-up-leave.zoom-up-leave-active {
+  animation-name: antZoomUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-up-enter,
+.zoom-up-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-up-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-down-enter,
+.zoom-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-down-enter.zoom-down-enter-active,
+.zoom-down-appear.zoom-down-appear-active {
+  animation-name: antZoomDownIn;
+  animation-play-state: running;
+}
+.zoom-down-leave.zoom-down-leave-active {
+  animation-name: antZoomDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-down-enter,
+.zoom-down-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-down-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-left-enter,
+.zoom-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-left-enter.zoom-left-enter-active,
+.zoom-left-appear.zoom-left-appear-active {
+  animation-name: antZoomLeftIn;
+  animation-play-state: running;
+}
+.zoom-left-leave.zoom-left-leave-active {
+  animation-name: antZoomLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-left-enter,
+.zoom-left-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-left-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.zoom-right-enter,
+.zoom-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.zoom-right-enter.zoom-right-enter-active,
+.zoom-right-appear.zoom-right-appear-active {
+  animation-name: antZoomRightIn;
+  animation-play-state: running;
+}
+.zoom-right-leave.zoom-right-leave-active {
+  animation-name: antZoomRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.zoom-right-enter,
+.zoom-right-appear {
+  transform: scale(0);
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.zoom-right-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+@keyframes antZoomIn {
+  0% {
+    opacity: 0;
+    transform: scale(0.2);
+  }
+  100% {
+    opacity: 1;
+    transform: scale(1);
+  }
+}
+@keyframes antZoomOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform: scale(0.2);
+  }
+}
+@keyframes antZoomBigIn {
+  0% {
+    opacity: 0;
+    transform: scale(0.8);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+@keyframes antZoomBigOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform: scale(0.8);
+  }
+}
+@keyframes antZoomUpIn {
+  0% {
+    opacity: 0;
+    transform-origin: 50% 0%;
+    transform: scale(0.8);
+  }
+  100% {
+    transform-origin: 50% 0%;
+    transform: scale(1);
+  }
+}
+@keyframes antZoomUpOut {
+  0% {
+    transform-origin: 50% 0%;
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 50% 0%;
+    transform: scale(0.8);
+  }
+}
+@keyframes antZoomLeftIn {
+  0% {
+    opacity: 0;
+    transform-origin: 0% 50%;
+    transform: scale(0.8);
+  }
+  100% {
+    transform-origin: 0% 50%;
+    transform: scale(1);
+  }
+}
+@keyframes antZoomLeftOut {
+  0% {
+    transform-origin: 0% 50%;
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 0% 50%;
+    transform: scale(0.8);
+  }
+}
+@keyframes antZoomRightIn {
+  0% {
+    opacity: 0;
+    transform-origin: 100% 50%;
+    transform: scale(0.8);
+  }
+  100% {
+    transform-origin: 100% 50%;
+    transform: scale(1);
+  }
+}
+@keyframes antZoomRightOut {
+  0% {
+    transform-origin: 100% 50%;
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 100% 50%;
+    transform: scale(0.8);
+  }
+}
+@keyframes antZoomDownIn {
+  0% {
+    opacity: 0;
+    transform-origin: 50% 100%;
+    transform: scale(0.8);
+  }
+  100% {
+    transform-origin: 50% 100%;
+    transform: scale(1);
+  }
+}
+@keyframes antZoomDownOut {
+  0% {
+    transform-origin: 50% 100%;
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 50% 100%;
+    transform: scale(0.8);
+  }
+}
+.ant-motion-collapse {
+  overflow: hidden;
+}
+.ant-motion-collapse-active {
+  transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
+nz-affix {
+  display: block;
+}
+.ant-affix {
+  position: fixed;
+  z-index: 10;
+}
+.ant-alert {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  padding: 8px 15px 8px 37px;
+  border-radius: 4px;
+}
+.ant-alert.ant-alert-no-icon {
+  padding: 8px 15px;
+}
+.ant-alert-icon {
+  top: 12.5px;
+  left: 16px;
+  position: absolute;
+}
+.ant-alert-description {
+  font-size: 14px;
+  line-height: 22px;
+  display: none;
+}
+.ant-alert-success {
+  border: 1px solid #b7eb8f;
+  background-color: #f6ffed;
+}
+.ant-alert-success .ant-alert-icon {
+  color: #52c41a;
+}
+.ant-alert-info {
+  border: 1px solid #91d5ff;
+  background-color: #e6f7ff;
+}
+.ant-alert-info .ant-alert-icon {
+  color: #1890ff;
+}
+.ant-alert-warning {
+  border: 1px solid #ffe58f;
+  background-color: #fffbe6;
+}
+.ant-alert-warning .ant-alert-icon {
+  color: #faad14;
+}
+.ant-alert-error {
+  border: 1px solid #ffa39e;
+  background-color: #fff1f0;
+}
+.ant-alert-error .ant-alert-icon {
+  color: #f5222d;
+}
+.ant-alert-close-icon {
+  font-size: 12px;
+  position: absolute;
+  right: 16px;
+  top: 8px;
+  line-height: 22px;
+  overflow: hidden;
+  cursor: pointer;
+}
+.ant-alert-close-icon .anticon-cross {
+  color: rgba(0, 0, 0, 0.45);
+  transition: color .3s;
+}
+.ant-alert-close-icon .anticon-cross:hover {
+  color: #404040;
+}
+.ant-alert-close-text {
+  position: absolute;
+  right: 16px;
+}
+.ant-alert-with-description {
+  padding: 15px 15px 15px 64px;
+  position: relative;
+  border-radius: 4px;
+  color: #54657e;
+  line-height: 1.5;
+}
+.ant-alert-with-description.ant-alert-no-icon {
+  padding: 15px;
+}
+.ant-alert-with-description .ant-alert-icon {
+  position: absolute;
+  top: 16px;
+  left: 24px;
+  font-size: 24px;
+}
+.ant-alert-with-description .ant-alert-close-icon {
+  position: absolute;
+  top: 16px;
+  right: 16px;
+  cursor: pointer;
+  font-size: 14px;
+}
+.ant-alert-with-description .ant-alert-message {
+  font-size: 16px;
+  color: rgba(0, 0, 0, 0.85);
+  display: block;
+  margin-bottom: 4px;
+}
+.ant-alert-with-description .ant-alert-description {
+  display: block;
+}
+.ant-alert.ant-alert-close {
+  height: 0 !important;
+  margin: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+  transform-origin: 50% 0;
+}
+.ant-alert-slide-up-leave {
+  animation: antAlertSlideUpOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+  animation-fill-mode: both;
+}
+.ant-alert-banner {
+  border-radius: 0;
+  border: 0;
+  margin-bottom: 0;
+}
+@keyframes antAlertSlideUpIn {
+  0% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleY(0);
+  }
+  100% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleY(1);
+  }
+}
+@keyframes antAlertSlideUpOut {
+  0% {
+    opacity: 1;
+    transform-origin: 0% 0%;
+    transform: scaleY(1);
+  }
+  100% {
+    opacity: 0;
+    transform-origin: 0% 0%;
+    transform: scaleY(0);
+  }
+}
+.ant-anchor {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  padding-left: 2px;
+}
+.ant-anchor-wrapper {
+  background-color: #fff;
+  overflow: auto;
+  padding-left: 4px;
+  margin-left: -4px;
+}
+.ant-anchor-ink {
+  position: absolute;
+  height: 100%;
+  left: 0;
+  top: 0;
+}
+.ant-anchor-ink:before {
+  content: ' ';
+  position: relative;
+  width: 2px;
+  height: 100%;
+  display: block;
+  background-color: #e8e8e8;
+  margin: 0 auto;
+}
+.ant-anchor-ink-ball {
+  display: none;
+  position: absolute;
+  width: 8px;
+  height: 8px;
+  border-radius: 8px;
+  border: 2px solid #1890ff;
+  background-color: #fff;
+  left: 50%;
+  transition: top 0.3s ease-in-out;
+  transform: translateX(-50%);
+}
+.ant-anchor-ink-ball.visible {
+  display: inline-block;
+}
+.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball {
+  display: none;
+}
+.ant-anchor-link {
+  padding: 8px 0 8px 16px;
+  line-height: 1;
+}
+.ant-anchor-link-title {
+  display: block;
+  position: relative;
+  transition: all .3s;
+  color: #54657e;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin-bottom: 8px;
+}
+.ant-anchor-link-title:only-child {
+  margin-bottom: 0;
+}
+.ant-anchor-link-active > .ant-anchor-link-title {
+  color: #1890ff;
+}
+.ant-anchor-link .ant-anchor-link {
+  padding-top: 6px;
+  padding-bottom: 6px;
+}
+.ant-select-auto-complete {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-select-auto-complete.ant-select .ant-select-selection {
+  border: 0;
+  box-shadow: none;
+}
+.ant-select-auto-complete.ant-select .ant-select-selection__rendered {
+  margin-left: 0;
+  margin-right: 0;
+  height: 100%;
+  line-height: 32px;
+}
+.ant-select-auto-complete.ant-select .ant-select-selection__placeholder {
+  margin-left: 12px;
+  margin-right: 12px;
+}
+.ant-select-auto-complete.ant-select .ant-select-selection--single {
+  height: auto;
+}
+.ant-select-auto-complete.ant-select .ant-select-search--inline {
+  position: static;
+  float: left;
+}
+.ant-select-auto-complete.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered {
+  margin-right: 0 !important;
+}
+.ant-select-auto-complete.ant-select .ant-input {
+  background: transparent;
+  border-width: 1px;
+  line-height: 1.5;
+  height: 32px;
+}
+.ant-select-auto-complete.ant-select .ant-input:focus,
+.ant-select-auto-complete.ant-select .ant-input:hover {
+  border-color: #40a9ff;
+}
+.ant-select-auto-complete.ant-select-lg .ant-select-selection__rendered {
+  line-height: 40px;
+}
+.ant-select-auto-complete.ant-select-lg .ant-input {
+  padding-top: 6px;
+  padding-bottom: 6px;
+  height: 40px;
+}
+.ant-select-auto-complete.ant-select-sm .ant-select-selection__rendered {
+  line-height: 24px;
+}
+.ant-select-auto-complete.ant-select-sm .ant-input {
+  padding-top: 1px;
+  padding-bottom: 1px;
+  height: 24px;
+}
+.ant-avatar {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+  text-align: center;
+  background: #ccc;
+  color: #fff;
+  white-space: nowrap;
+  position: relative;
+  overflow: hidden;
+  vertical-align: middle;
+  width: 32px;
+  height: 32px;
+  line-height: 32px;
+  border-radius: 16px;
+}
+.ant-avatar-image {
+  background: transparent;
+}
+.ant-avatar > * {
+  line-height: 32px;
+}
+.ant-avatar.ant-avatar-icon {
+  font-size: 18px;
+}
+.ant-avatar-lg {
+  width: 40px;
+  height: 40px;
+  line-height: 40px;
+  border-radius: 20px;
+}
+.ant-avatar-lg > * {
+  line-height: 40px;
+}
+.ant-avatar-lg.ant-avatar-icon {
+  font-size: 24px;
+}
+.ant-avatar-sm {
+  width: 24px;
+  height: 24px;
+  line-height: 24px;
+  border-radius: 12px;
+}
+.ant-avatar-sm > * {
+  line-height: 24px;
+}
+.ant-avatar-sm.ant-avatar-icon {
+  font-size: 14px;
+}
+.ant-avatar-square {
+  border-radius: 4px;
+}
+.ant-avatar > img {
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+.ant-back-top {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  z-index: 10;
+  position: fixed;
+  right: 100px;
+  bottom: 50px;
+  height: 40px;
+  width: 40px;
+  cursor: pointer;
+}
+.ant-back-top-content {
+  height: 40px;
+  width: 40px;
+  border-radius: 20px;
+  background-color: rgba(0, 0, 0, 0.45);
+  color: #fff;
+  text-align: center;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  overflow: hidden;
+}
+.ant-back-top-content:hover {
+  background-color: #54657e;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-back-top-icon {
+  margin: 12px auto;
+  width: 14px;
+  height: 16px;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat;
+}
+@media screen and (max-width: 768px) {
+  .ant-back-top {
+    right: 60px;
+  }
+}
+@media screen and (max-width: 480px) {
+  .ant-back-top {
+    right: 20px;
+  }
+}
+.ant-badge {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  line-height: 1;
+  vertical-align: middle;
+}
+.ant-badge-count {
+  position: absolute;
+  transform: translateX(-50%);
+  top: -10px;
+  height: 20px;
+  border-radius: 10px;
+  min-width: 20px;
+  background: #f5222d;
+  color: #fff;
+  line-height: 20px;
+  text-align: center;
+  padding: 0 6px;
+  font-size: 12px;
+  font-weight: normal;
+  white-space: nowrap;
+  transform-origin: -10% center;
+  box-shadow: 0 0 0 1px #fff;
+}
+.ant-badge-count a,
+.ant-badge-count a:hover {
+  color: #fff;
+}
+.ant-badge-multiple-words {
+  padding: 0 8px;
+}
+.ant-badge-dot {
+  position: absolute;
+  transform: translateX(-50%);
+  transform-origin: 0 center;
+  top: -3px;
+  height: 6px;
+  width: 6px;
+  border-radius: 100%;
+  background: #f5222d;
+  z-index: 10;
+  box-shadow: 0 0 0 1px #fff;
+}
+.ant-badge-status {
+  line-height: inherit;
+  vertical-align: baseline;
+}
+.ant-badge-status-dot {
+  width: 6px;
+  height: 6px;
+  display: inline-block;
+  border-radius: 50%;
+  vertical-align: middle;
+  position: relative;
+  top: -1px;
+}
+.ant-badge-status-success {
+  background-color: #52c41a;
+}
+.ant-badge-status-processing {
+  background-color: #1890ff;
+  position: relative;
+}
+.ant-badge-status-processing:after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 50%;
+  border: 1px solid #1890ff;
+  content: '';
+  animation: antStatusProcessing 1.2s infinite ease-in-out;
+}
+.ant-badge-status-default {
+  background-color: #d9d9d9;
+}
+.ant-badge-status-error {
+  background-color: #f5222d;
+}
+.ant-badge-status-warning {
+  background-color: #faad14;
+}
+.ant-badge-status-text {
+  color: #54657e;
+  font-size: 14px;
+  margin-left: 8px;
+}
+.ant-badge-zoom-appear,
+.ant-badge-zoom-enter {
+  animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);
+  animation-fill-mode: both;
+}
+.ant-badge-zoom-leave {
+  animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6);
+  animation-fill-mode: both;
+}
+.ant-badge-not-a-wrapper .ant-scroll-number {
+  top: auto;
+  display: block;
+  position: relative;
+  transform: none !important;
+}
+@keyframes antStatusProcessing {
+  0% {
+    transform: scale(0.8);
+    opacity: 0.5;
+  }
+  100% {
+    transform: scale(2.4);
+    opacity: 0;
+  }
+}
+.ant-scroll-number {
+  overflow: hidden;
+}
+.ant-scroll-number-only {
+  display: inline-block;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  height: 20px;
+}
+.ant-scroll-number-only > p {
+  height: 20px;
+  margin: 0;
+}
+@keyframes antZoomBadgeIn {
+  0% {
+    opacity: 0;
+    transform: scale(0) translateX(-50%);
+  }
+  100% {
+    transform: scale(1) translateX(-50%);
+  }
+}
+@keyframes antZoomBadgeOut {
+  0% {
+    transform: scale(1) translateX(-50%);
+  }
+  100% {
+    opacity: 0;
+    transform: scale(0) translateX(-50%);
+  }
+}
+.ant-breadcrumb {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  color: rgba(0, 0, 0, 0.45);
+  font-size: 14px;
+}
+.ant-breadcrumb .anticon {
+  font-size: 12px;
+}
+.ant-breadcrumb a {
+  color: rgba(0, 0, 0, 0.45);
+  transition: color .3s;
+}
+.ant-breadcrumb a:hover {
+  color: #40a9ff;
+}
+.ant-breadcrumb > span:last-child {
+  color: #54657e;
+}
+.ant-breadcrumb > span:last-child .ant-breadcrumb-separator {
+  display: none;
+}
+.ant-breadcrumb-separator {
+  margin: 0 8px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-breadcrumb-link > .anticon + span {
+  margin-left: 4px;
+}
+.ant-btn {
+  line-height: 1.5;
+  display: inline-block;
+  font-weight: 400;
+  text-align: center;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 0 15px;
+  font-size: 14px;
+  border-radius: 4px;
+  height: 32px;
+  user-select: none;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  position: relative;
+  color: #54657e;
+  background-color: #fff;
+  border-color: #d9d9d9;
+}
+.ant-btn > .anticon {
+  line-height: 1;
+}
+.ant-btn,
+.ant-btn:active,
+.ant-btn:focus {
+  outline: 0;
+}
+.ant-btn:not([disabled]):hover {
+  text-decoration: none;
+}
+.ant-btn:not([disabled]):active {
+  outline: 0;
+  transition: none;
+}
+.ant-btn.disabled,
+.ant-btn[disabled] {
+  cursor: not-allowed;
+}
+.ant-btn.disabled > *,
+.ant-btn[disabled] > * {
+  pointer-events: none;
+}
+.ant-btn-lg {
+  padding: 0 15px;
+  font-size: 16px;
+  border-radius: 4px;
+  height: 40px;
+}
+.ant-btn-sm {
+  padding: 0 7px;
+  font-size: 14px;
+  border-radius: 4px;
+  height: 24px;
+}
+.ant-btn > a:only-child {
+  color: currentColor;
+}
+.ant-btn > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn:hover,
+.ant-btn:focus {
+  color: #40a9ff;
+  background-color: #fff;
+  border-color: #40a9ff;
+}
+.ant-btn:hover > a:only-child,
+.ant-btn:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn:hover > a:only-child:after,
+.ant-btn:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn:active,
+.ant-btn.active {
+  color: #096dd9;
+  background-color: #fff;
+  border-color: #096dd9;
+}
+.ant-btn:active > a:only-child,
+.ant-btn.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn:active > a:only-child:after,
+.ant-btn.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn.disabled,
+.ant-btn[disabled],
+.ant-btn.disabled:hover,
+.ant-btn[disabled]:hover,
+.ant-btn.disabled:focus,
+.ant-btn[disabled]:focus,
+.ant-btn.disabled:active,
+.ant-btn[disabled]:active,
+.ant-btn.disabled.active,
+.ant-btn[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn.disabled > a:only-child,
+.ant-btn[disabled] > a:only-child,
+.ant-btn.disabled:hover > a:only-child,
+.ant-btn[disabled]:hover > a:only-child,
+.ant-btn.disabled:focus > a:only-child,
+.ant-btn[disabled]:focus > a:only-child,
+.ant-btn.disabled:active > a:only-child,
+.ant-btn[disabled]:active > a:only-child,
+.ant-btn.disabled.active > a:only-child,
+.ant-btn[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn.disabled > a:only-child:after,
+.ant-btn[disabled] > a:only-child:after,
+.ant-btn.disabled:hover > a:only-child:after,
+.ant-btn[disabled]:hover > a:only-child:after,
+.ant-btn.disabled:focus > a:only-child:after,
+.ant-btn[disabled]:focus > a:only-child:after,
+.ant-btn.disabled:active > a:only-child:after,
+.ant-btn[disabled]:active > a:only-child:after,
+.ant-btn.disabled.active > a:only-child:after,
+.ant-btn[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn:hover,
+.ant-btn:focus,
+.ant-btn:active,
+.ant-btn.active {
+  background: #fff;
+}
+.ant-btn > i,
+.ant-btn > span {
+  pointer-events: none;
+}
+.ant-btn-primary {
+  color: #fff;
+  background-color: #1890ff;
+  border-color: #1890ff;
+}
+.ant-btn-primary > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-primary:hover,
+.ant-btn-primary:focus {
+  color: #fff;
+  background-color: #40a9ff;
+  border-color: #40a9ff;
+}
+.ant-btn-primary:hover > a:only-child,
+.ant-btn-primary:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary:hover > a:only-child:after,
+.ant-btn-primary:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-primary:active,
+.ant-btn-primary.active {
+  color: #fff;
+  background-color: #096dd9;
+  border-color: #096dd9;
+}
+.ant-btn-primary:active > a:only-child,
+.ant-btn-primary.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary:active > a:only-child:after,
+.ant-btn-primary.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-primary.disabled,
+.ant-btn-primary[disabled],
+.ant-btn-primary.disabled:hover,
+.ant-btn-primary[disabled]:hover,
+.ant-btn-primary.disabled:focus,
+.ant-btn-primary[disabled]:focus,
+.ant-btn-primary.disabled:active,
+.ant-btn-primary[disabled]:active,
+.ant-btn-primary.disabled.active,
+.ant-btn-primary[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-primary.disabled > a:only-child,
+.ant-btn-primary[disabled] > a:only-child,
+.ant-btn-primary.disabled:hover > a:only-child,
+.ant-btn-primary[disabled]:hover > a:only-child,
+.ant-btn-primary.disabled:focus > a:only-child,
+.ant-btn-primary[disabled]:focus > a:only-child,
+.ant-btn-primary.disabled:active > a:only-child,
+.ant-btn-primary[disabled]:active > a:only-child,
+.ant-btn-primary.disabled.active > a:only-child,
+.ant-btn-primary[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary.disabled > a:only-child:after,
+.ant-btn-primary[disabled] > a:only-child:after,
+.ant-btn-primary.disabled:hover > a:only-child:after,
+.ant-btn-primary[disabled]:hover > a:only-child:after,
+.ant-btn-primary.disabled:focus > a:only-child:after,
+.ant-btn-primary[disabled]:focus > a:only-child:after,
+.ant-btn-primary.disabled:active > a:only-child:after,
+.ant-btn-primary[disabled]:active > a:only-child:after,
+.ant-btn-primary.disabled.active > a:only-child:after,
+.ant-btn-primary[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) {
+  border-right-color: #40a9ff;
+  border-left-color: #40a9ff;
+}
+.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled {
+  border-color: #d9d9d9;
+}
+.ant-btn-group .ant-btn-primary:first-child:not(:last-child) {
+  border-right-color: #40a9ff;
+}
+.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] {
+  border-right-color: #d9d9d9;
+}
+.ant-btn-group .ant-btn-primary:last-child:not(:first-child),
+.ant-btn-group .ant-btn-primary + .ant-btn-primary {
+  border-left-color: #40a9ff;
+}
+.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],
+.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {
+  border-left-color: #d9d9d9;
+}
+.ant-btn-ghost {
+  color: #54657e;
+  background-color: transparent;
+  border-color: #d9d9d9;
+}
+.ant-btn-ghost > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-ghost:hover,
+.ant-btn-ghost:focus {
+  color: #40a9ff;
+  background-color: transparent;
+  border-color: #40a9ff;
+}
+.ant-btn-ghost:hover > a:only-child,
+.ant-btn-ghost:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost:hover > a:only-child:after,
+.ant-btn-ghost:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-ghost:active,
+.ant-btn-ghost.active {
+  color: #096dd9;
+  background-color: transparent;
+  border-color: #096dd9;
+}
+.ant-btn-ghost:active > a:only-child,
+.ant-btn-ghost.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost:active > a:only-child:after,
+.ant-btn-ghost.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-ghost.disabled,
+.ant-btn-ghost[disabled],
+.ant-btn-ghost.disabled:hover,
+.ant-btn-ghost[disabled]:hover,
+.ant-btn-ghost.disabled:focus,
+.ant-btn-ghost[disabled]:focus,
+.ant-btn-ghost.disabled:active,
+.ant-btn-ghost[disabled]:active,
+.ant-btn-ghost.disabled.active,
+.ant-btn-ghost[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-ghost.disabled > a:only-child,
+.ant-btn-ghost[disabled] > a:only-child,
+.ant-btn-ghost.disabled:hover > a:only-child,
+.ant-btn-ghost[disabled]:hover > a:only-child,
+.ant-btn-ghost.disabled:focus > a:only-child,
+.ant-btn-ghost[disabled]:focus > a:only-child,
+.ant-btn-ghost.disabled:active > a:only-child,
+.ant-btn-ghost[disabled]:active > a:only-child,
+.ant-btn-ghost.disabled.active > a:only-child,
+.ant-btn-ghost[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost.disabled > a:only-child:after,
+.ant-btn-ghost[disabled] > a:only-child:after,
+.ant-btn-ghost.disabled:hover > a:only-child:after,
+.ant-btn-ghost[disabled]:hover > a:only-child:after,
+.ant-btn-ghost.disabled:focus > a:only-child:after,
+.ant-btn-ghost[disabled]:focus > a:only-child:after,
+.ant-btn-ghost.disabled:active > a:only-child:after,
+.ant-btn-ghost[disabled]:active > a:only-child:after,
+.ant-btn-ghost.disabled.active > a:only-child:after,
+.ant-btn-ghost[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-dashed {
+  color: #54657e;
+  background-color: #fff;
+  border-color: #d9d9d9;
+  border-style: dashed;
+}
+.ant-btn-dashed > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-dashed:hover,
+.ant-btn-dashed:focus {
+  color: #40a9ff;
+  background-color: #fff;
+  border-color: #40a9ff;
+}
+.ant-btn-dashed:hover > a:only-child,
+.ant-btn-dashed:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed:hover > a:only-child:after,
+.ant-btn-dashed:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-dashed:active,
+.ant-btn-dashed.active {
+  color: #096dd9;
+  background-color: #fff;
+  border-color: #096dd9;
+}
+.ant-btn-dashed:active > a:only-child,
+.ant-btn-dashed.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed:active > a:only-child:after,
+.ant-btn-dashed.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-dashed.disabled,
+.ant-btn-dashed[disabled],
+.ant-btn-dashed.disabled:hover,
+.ant-btn-dashed[disabled]:hover,
+.ant-btn-dashed.disabled:focus,
+.ant-btn-dashed[disabled]:focus,
+.ant-btn-dashed.disabled:active,
+.ant-btn-dashed[disabled]:active,
+.ant-btn-dashed.disabled.active,
+.ant-btn-dashed[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-dashed.disabled > a:only-child,
+.ant-btn-dashed[disabled] > a:only-child,
+.ant-btn-dashed.disabled:hover > a:only-child,
+.ant-btn-dashed[disabled]:hover > a:only-child,
+.ant-btn-dashed.disabled:focus > a:only-child,
+.ant-btn-dashed[disabled]:focus > a:only-child,
+.ant-btn-dashed.disabled:active > a:only-child,
+.ant-btn-dashed[disabled]:active > a:only-child,
+.ant-btn-dashed.disabled.active > a:only-child,
+.ant-btn-dashed[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed.disabled > a:only-child:after,
+.ant-btn-dashed[disabled] > a:only-child:after,
+.ant-btn-dashed.disabled:hover > a:only-child:after,
+.ant-btn-dashed[disabled]:hover > a:only-child:after,
+.ant-btn-dashed.disabled:focus > a:only-child:after,
+.ant-btn-dashed[disabled]:focus > a:only-child:after,
+.ant-btn-dashed.disabled:active > a:only-child:after,
+.ant-btn-dashed[disabled]:active > a:only-child:after,
+.ant-btn-dashed.disabled.active > a:only-child:after,
+.ant-btn-dashed[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-danger {
+  color: #f5222d;
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-danger > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-danger:hover {
+  color: #fff;
+  background-color: #ff4d4f;
+  border-color: #ff4d4f;
+}
+.ant-btn-danger:hover > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:hover > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-danger:focus {
+  color: #ff4d4f;
+  background-color: #fff;
+  border-color: #ff4d4f;
+}
+.ant-btn-danger:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-danger:active,
+.ant-btn-danger.active {
+  color: #fff;
+  background-color: #cf1322;
+  border-color: #cf1322;
+}
+.ant-btn-danger:active > a:only-child,
+.ant-btn-danger.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:active > a:only-child:after,
+.ant-btn-danger.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-danger.disabled,
+.ant-btn-danger[disabled],
+.ant-btn-danger.disabled:hover,
+.ant-btn-danger[disabled]:hover,
+.ant-btn-danger.disabled:focus,
+.ant-btn-danger[disabled]:focus,
+.ant-btn-danger.disabled:active,
+.ant-btn-danger[disabled]:active,
+.ant-btn-danger.disabled.active,
+.ant-btn-danger[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-danger.disabled > a:only-child,
+.ant-btn-danger[disabled] > a:only-child,
+.ant-btn-danger.disabled:hover > a:only-child,
+.ant-btn-danger[disabled]:hover > a:only-child,
+.ant-btn-danger.disabled:focus > a:only-child,
+.ant-btn-danger[disabled]:focus > a:only-child,
+.ant-btn-danger.disabled:active > a:only-child,
+.ant-btn-danger[disabled]:active > a:only-child,
+.ant-btn-danger.disabled.active > a:only-child,
+.ant-btn-danger[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger.disabled > a:only-child:after,
+.ant-btn-danger[disabled] > a:only-child:after,
+.ant-btn-danger.disabled:hover > a:only-child:after,
+.ant-btn-danger[disabled]:hover > a:only-child:after,
+.ant-btn-danger.disabled:focus > a:only-child:after,
+.ant-btn-danger[disabled]:focus > a:only-child:after,
+.ant-btn-danger.disabled:active > a:only-child:after,
+.ant-btn-danger[disabled]:active > a:only-child:after,
+.ant-btn-danger.disabled.active > a:only-child:after,
+.ant-btn-danger[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-circle,
+.ant-btn-circle-outline {
+  width: 32px;
+  padding: 0;
+  font-size: 16px;
+  border-radius: 50%;
+  height: 32px;
+}
+.ant-btn-circle.ant-btn-lg,
+.ant-btn-circle-outline.ant-btn-lg {
+  width: 40px;
+  padding: 0;
+  font-size: 18px;
+  border-radius: 50%;
+  height: 40px;
+}
+.ant-btn-circle.ant-btn-sm,
+.ant-btn-circle-outline.ant-btn-sm {
+  width: 24px;
+  padding: 0;
+  font-size: 14px;
+  border-radius: 50%;
+  height: 24px;
+}
+.ant-btn:before {
+  position: absolute;
+  top: -1px;
+  left: -1px;
+  bottom: -1px;
+  right: -1px;
+  background: #fff;
+  opacity: 0.35;
+  content: '';
+  border-radius: inherit;
+  z-index: 1;
+  transition: opacity .2s;
+  pointer-events: none;
+  display: none;
+}
+.ant-btn .anticon {
+  transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-btn.ant-btn-loading:before {
+  display: block;
+}
+.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) {
+  padding-left: 29px;
+  pointer-events: none;
+  position: relative;
+}
+.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon {
+  margin-left: -14px;
+}
+.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) {
+  padding-left: 24px;
+}
+.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon {
+  margin-left: -17px;
+}
+.ant-btn-group {
+  position: relative;
+  display: inline-block;
+}
+.ant-btn-group > .ant-btn {
+  position: relative;
+  line-height: 30px;
+}
+.ant-btn-group > .ant-btn:hover,
+.ant-btn-group > .ant-btn:focus,
+.ant-btn-group > .ant-btn:active,
+.ant-btn-group > .ant-btn.active {
+  z-index: 2;
+}
+.ant-btn-group > .ant-btn:disabled {
+  z-index: 0;
+}
+.ant-btn-group-lg > .ant-btn {
+  padding: 0 15px;
+  font-size: 16px;
+  border-radius: 4px;
+  height: 40px;
+  line-height: 38px;
+}
+.ant-btn-group-sm > .ant-btn {
+  padding: 0 7px;
+  font-size: 14px;
+  border-radius: 4px;
+  height: 24px;
+  line-height: 22px;
+}
+.ant-btn-group-sm > .ant-btn > .anticon {
+  font-size: 14px;
+}
+.ant-btn-group .ant-btn + .ant-btn,
+.ant-btn + .ant-btn-group,
+.ant-btn-group span + .ant-btn,
+.ant-btn-group .ant-btn + span,
+.ant-btn-group + .ant-btn,
+.ant-btn-group + .ant-btn-group {
+  margin-left: -1px;
+}
+.ant-btn-group .ant-btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.ant-btn-group > .ant-btn:first-child,
+.ant-btn-group > span:first-child > .ant-btn {
+  margin-left: 0;
+}
+.ant-btn-group > .ant-btn:first-child:not(:last-child),
+.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-btn-group > .ant-btn:last-child:not(:first-child),
+.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-btn-group > .ant-btn-group {
+  float: left;
+}
+.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn {
+  border-radius: 0;
+}
+.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+  padding-right: 8px;
+}
+.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+  padding-left: 8px;
+}
+.ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.ant-btn:focus > span,
+.ant-btn:active > span {
+  position: relative;
+}
+.ant-btn > .anticon + span,
+.ant-btn > span + .anticon {
+  margin-left: 8px;
+}
+.ant-btn-clicked:after {
+  content: '';
+  position: absolute;
+  top: -1px;
+  left: -1px;
+  bottom: -1px;
+  right: -1px;
+  border-radius: inherit;
+  border: 0 solid #1890ff;
+  opacity: 0.4;
+  animation: buttonEffect .4s;
+  display: block;
+}
+.ant-btn-danger.ant-btn-clicked:after {
+  border-color: #f5222d;
+}
+.ant-btn-background-ghost {
+  background: transparent !important;
+  border-color: #fff;
+  color: #fff;
+}
+.ant-btn-background-ghost.ant-btn-primary {
+  color: #1890ff;
+  background-color: transparent;
+  border-color: #1890ff;
+}
+.ant-btn-background-ghost.ant-btn-primary > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary:hover,
+.ant-btn-background-ghost.ant-btn-primary:focus {
+  color: #40a9ff;
+  background-color: transparent;
+  border-color: #40a9ff;
+}
+.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary:active,
+.ant-btn-background-ghost.ant-btn-primary.active {
+  color: #096dd9;
+  background-color: transparent;
+  border-color: #096dd9;
+}
+.ant-btn-background-ghost.ant-btn-primary:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled,
+.ant-btn-background-ghost.ant-btn-primary[disabled],
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger {
+  color: #f5222d;
+  background-color: transparent;
+  border-color: #f5222d;
+}
+.ant-btn-background-ghost.ant-btn-danger > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover,
+.ant-btn-background-ghost.ant-btn-danger:focus {
+  color: #ff4d4f;
+  background-color: transparent;
+  border-color: #ff4d4f;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger:active,
+.ant-btn-background-ghost.ant-btn-danger.active {
+  color: #cf1322;
+  background-color: transparent;
+  border-color: #cf1322;
+}
+.ant-btn-background-ghost.ant-btn-danger:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled,
+.ant-btn-background-ghost.ant-btn-danger[disabled],
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-btn-two-chinese-chars:first-letter {
+  letter-spacing: .34em;
+}
+.ant-btn-two-chinese-chars > * {
+  letter-spacing: .34em;
+  margin-right: -0.34em;
+}
+@keyframes buttonEffect {
+  to {
+    opacity: 0;
+    top: -6px;
+    left: -6px;
+    bottom: -6px;
+    right: -6px;
+    border-width: 6px;
+  }
+}
+a.ant-btn {
+  line-height: 30px;
+}
+a.ant-btn-lg {
+  line-height: 38px;
+}
+a.ant-btn-sm {
+  line-height: 22px;
+}
+.ant-fullcalendar {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  outline: none;
+  border-top: 1px solid #d9d9d9;
+}
+.ant-fullcalendar-month-select {
+  margin-left: 5px;
+}
+.ant-fullcalendar-header {
+  padding: 11px 16px 11px 0;
+  text-align: right;
+}
+.ant-fullcalendar-header .ant-select-dropdown {
+  text-align: left;
+}
+.ant-fullcalendar-header .ant-radio-group {
+  margin-left: 8px;
+  text-align: left;
+}
+.ant-fullcalendar-header label.ant-radio-button {
+  height: 22px;
+  line-height: 20px;
+  padding: 0 10px;
+}
+.ant-fullcalendar-date-panel {
+  position: relative;
+  outline: none;
+}
+.ant-fullcalendar-calendar-body {
+  padding: 8px 12px;
+}
+.ant-fullcalendar table {
+  border-collapse: collapse;
+  max-width: 100%;
+  background-color: transparent;
+  width: 100%;
+  height: 256px;
+}
+.ant-fullcalendar table,
+.ant-fullcalendar th,
+.ant-fullcalendar td {
+  border: 0;
+}
+.ant-fullcalendar td {
+  position: relative;
+}
+.ant-fullcalendar-calendar-table {
+  border-spacing: 0;
+  margin-bottom: 0;
+}
+.ant-fullcalendar-column-header {
+  line-height: 18px;
+  padding: 0;
+  width: 33px;
+  text-align: center;
+}
+.ant-fullcalendar-column-header .ant-fullcalendar-column-header-inner {
+  display: block;
+  font-weight: normal;
+}
+.ant-fullcalendar-week-number-header .ant-fullcalendar-column-header-inner {
+  display: none;
+}
+.ant-fullcalendar-month,
+.ant-fullcalendar-date {
+  text-align: center;
+  transition: all .3s;
+}
+.ant-fullcalendar-value {
+  display: block;
+  margin: 0 auto;
+  color: #54657e;
+  border-radius: 2px;
+  width: 24px;
+  height: 24px;
+  padding: 0;
+  background: transparent;
+  line-height: 24px;
+  transition: all .3s;
+}
+.ant-fullcalendar-value:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-fullcalendar-value:active {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-fullcalendar-month-panel-cell .ant-fullcalendar-value {
+  width: 48px;
+}
+.ant-fullcalendar-today .ant-fullcalendar-value,
+.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value {
+  box-shadow: 0 0 0 1px #1890ff inset;
+}
+.ant-fullcalendar-selected-day .ant-fullcalendar-value,
+.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.ant-fullcalendar-last-month-cell .ant-fullcalendar-value,
+.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-fullcalendar-month-panel-table {
+  table-layout: fixed;
+  width: 100%;
+  border-collapse: separate;
+}
+.ant-fullcalendar-content {
+  position: absolute;
+  width: 100%;
+  left: 0;
+  bottom: -9px;
+}
+.ant-fullcalendar-fullscreen {
+  border-top: 0;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-table {
+  table-layout: fixed;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-header .ant-radio-group {
+  margin-left: 16px;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-header label.ant-radio-button {
+  height: 32px;
+  line-height: 30px;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date {
+  text-align: left;
+  margin: 0 4px;
+  display: block;
+  color: #54657e;
+  height: 116px;
+  padding: 4px 8px;
+  border-top: 2px solid #e8e8e8;
+  transition: background .3s;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active {
+  background: #bae7ff;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-column-header {
+  text-align: right;
+  padding-right: 12px;
+  padding-bottom: 5px;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-value {
+  text-align: right;
+  background: transparent;
+  width: auto;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value {
+  color: #54657e;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date {
+  border-top-color: #1890ff;
+  background: transparent;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value {
+  box-shadow: none;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date {
+  background: #e6f7ff;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value {
+  color: #1890ff;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-content {
+  height: 90px;
+  overflow-y: auto;
+  position: static;
+  width: auto;
+  left: auto;
+  bottom: auto;
+}
+.ant-fullcalendar-disabled-cell .ant-fullcalendar-date,
+.ant-fullcalendar-disabled-cell .ant-fullcalendar-date:hover {
+  cursor: not-allowed;
+}
+.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date,
+.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover {
+  background: transparent;
+}
+.ant-fullcalendar-disabled-cell .ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.25);
+  border-radius: 0;
+  width: auto;
+  cursor: not-allowed;
+}
+.ant-card {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  background: #fff;
+  border-radius: 2px;
+  position: relative;
+  transition: all .3s;
+}
+.ant-card-hoverable {
+  cursor: pointer;
+}
+.ant-card-hoverable:hover {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);
+  border-color: rgba(0, 0, 0, 0.09);
+}
+.ant-card-bordered {
+  border: 1px solid #e8e8e8;
+}
+.ant-card-head {
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+  padding: 0 24px;
+  border-radius: 2px 2px 0 0;
+  zoom: 1;
+  margin-bottom: -1px;
+  min-height: 48px;
+}
+.ant-card-head:before,
+.ant-card-head:after {
+  content: " ";
+  display: table;
+}
+.ant-card-head:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-head:before,
+.ant-card-head:after {
+  content: " ";
+  display: table;
+}
+.ant-card-head:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-head-wrapper {
+  display: flex;
+}
+.ant-card-head-title {
+  font-size: 16px;
+  padding: 16px 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+  display: inline-block;
+  flex: 1;
+}
+.ant-card-head .ant-tabs {
+  margin-bottom: -17px;
+  clear: both;
+}
+.ant-card-head .ant-tabs-bar {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-card-extra {
+  float: right;
+  padding: 17.5px 0;
+  text-align: right;
+  margin-left: auto;
+}
+.ant-card-body {
+  padding: 24px;
+  zoom: 1;
+}
+.ant-card-body:before,
+.ant-card-body:after {
+  content: " ";
+  display: table;
+}
+.ant-card-body:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-body:before,
+.ant-card-body:after {
+  content: " ";
+  display: table;
+}
+.ant-card-body:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-contain-grid .ant-card-body {
+  margin: -1px 0 0 -1px;
+  padding: 0;
+}
+.ant-card-grid {
+  border-radius: 0;
+  border: 0;
+  box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset;
+  width: 33.33%;
+  float: left;
+  padding: 24px;
+  transition: all .3s;
+}
+.ant-card-grid:hover {
+  position: relative;
+  z-index: 1;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-card-contain-tabs .ant-card-head-title {
+  padding-bottom: 0;
+  min-height: 32px;
+}
+.ant-card-contain-tabs .ant-card-extra {
+  padding-bottom: 0;
+}
+.ant-card-cover > * {
+  width: 100%;
+  display: block;
+}
+.ant-card-actions {
+  border-top: 1px solid #e8e8e8;
+  background: #fafafa;
+  zoom: 1;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.ant-card-actions:before,
+.ant-card-actions:after {
+  content: " ";
+  display: table;
+}
+.ant-card-actions:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-actions:before,
+.ant-card-actions:after {
+  content: " ";
+  display: table;
+}
+.ant-card-actions:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-actions > li {
+  float: left;
+  text-align: center;
+  margin: 12px 0;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-actions > li > span {
+  display: inline-block;
+  font-size: 14px;
+  cursor: pointer;
+  line-height: 22px;
+  min-width: 32px;
+  position: relative;
+}
+.ant-card-actions > li > span:hover {
+  color: #1890ff;
+  transition: color .3s;
+}
+.ant-card-actions > li > span > .anticon {
+  font-size: 16px;
+}
+.ant-card-actions > li > span a {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-actions > li > span a:hover {
+  color: #1890ff;
+}
+.ant-card-actions > li:not(:last-child) {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-card-wider-padding .ant-card-head {
+  padding: 0 32px;
+}
+.ant-card-wider-padding .ant-card-body {
+  padding: 24px 32px;
+}
+.ant-card-padding-transition .ant-card-head,
+.ant-card-padding-transition .ant-card-body {
+  transition: padding .3s;
+}
+.ant-card-padding-transition .ant-card-extra {
+  transition: right .3s;
+}
+.ant-card-type-inner .ant-card-head {
+  padding: 0 24px;
+  background: #fafafa;
+}
+.ant-card-type-inner .ant-card-head-title {
+  padding: 12px 0;
+  font-size: 14px;
+}
+.ant-card-type-inner .ant-card-body {
+  padding: 16px 24px;
+}
+.ant-card-type-inner .ant-card-extra {
+  padding: 13.5px 0;
+}
+.ant-card-meta {
+  margin: -4px 0;
+  zoom: 1;
+}
+.ant-card-meta:before,
+.ant-card-meta:after {
+  content: " ";
+  display: table;
+}
+.ant-card-meta:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-meta:before,
+.ant-card-meta:after {
+  content: " ";
+  display: table;
+}
+.ant-card-meta:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-card-meta-avatar {
+  padding-right: 16px;
+  float: left;
+}
+.ant-card-meta-detail {
+  overflow: hidden;
+}
+.ant-card-meta-detail > div:not(:last-child) {
+  margin-bottom: 8px;
+}
+.ant-card-meta-title {
+  font-size: 16px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+}
+.ant-card-meta-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-loading .ant-card-body {
+  user-select: none;
+  padding: 0;
+}
+.ant-card-loading-content {
+  padding: 24px;
+}
+.ant-card-loading-content p {
+  margin: 0;
+}
+.ant-card-loading-block {
+  display: inline-block;
+  margin: 5px 2% 0 0;
+  height: 14px;
+  border-radius: 2px;
+  background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2));
+  animation: card-loading 1.4s ease infinite;
+  background-size: 600% 600%;
+}
+@keyframes card-loading {
+  0%,
+  100% {
+    background-position: 0 50%;
+  }
+  50% {
+    background-position: 100% 50%;
+  }
+}
+.ant-carousel {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-carousel .slick-slider {
+  position: relative;
+  display: block;
+  box-sizing: border-box;
+  -webkit-touch-callout: none;
+  -ms-touch-action: pan-y;
+  touch-action: pan-y;
+  -webkit-tap-highlight-color: transparent;
+}
+.ant-carousel .slick-list {
+  position: relative;
+  overflow: hidden;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.ant-carousel .slick-list:focus {
+  outline: none;
+}
+.ant-carousel .slick-list.dragging {
+  cursor: pointer;
+}
+.ant-carousel .slick-slider .slick-track,
+.ant-carousel .slick-slider .slick-list {
+  transform: translate3d(0, 0, 0);
+}
+.ant-carousel .slick-track {
+  position: relative;
+  left: 0;
+  top: 0;
+  display: block;
+}
+.ant-carousel .slick-track:before,
+.ant-carousel .slick-track:after {
+  content: "";
+  display: table;
+}
+.ant-carousel .slick-track:after {
+  clear: both;
+}
+.slick-loading .ant-carousel .slick-track {
+  visibility: hidden;
+}
+.ant-carousel .slick-slide {
+  float: left;
+  height: 100%;
+  min-height: 1px;
+  display: none;
+}
+[dir="rtl"] .ant-carousel .slick-slide {
+  float: right;
+}
+.ant-carousel .slick-slide img {
+  display: block;
+}
+.ant-carousel .slick-slide.slick-loading img {
+  display: none;
+}
+.ant-carousel .slick-slide.dragging img {
+  pointer-events: none;
+}
+.ant-carousel .slick-initialized .slick-slide {
+  display: block;
+}
+.ant-carousel .slick-loading .slick-slide {
+  visibility: hidden;
+}
+.ant-carousel .slick-vertical .slick-slide {
+  display: block;
+  height: auto;
+  border: 1px solid transparent;
+}
+.ant-carousel .slick-arrow.slick-hidden {
+  display: none;
+}
+.ant-carousel .slick-prev,
+.ant-carousel .slick-next {
+  position: absolute;
+  display: block;
+  height: 20px;
+  width: 20px;
+  line-height: 0;
+  font-size: 0;
+  cursor: pointer;
+  background: transparent;
+  color: transparent;
+  top: 50%;
+  margin-top: -10px;
+  padding: 0;
+  border: 0;
+  outline: none;
+}
+.ant-carousel .slick-prev:hover,
+.ant-carousel .slick-next:hover,
+.ant-carousel .slick-prev:focus,
+.ant-carousel .slick-next:focus {
+  outline: none;
+  background: transparent;
+  color: transparent;
+}
+.ant-carousel .slick-prev:hover:before,
+.ant-carousel .slick-next:hover:before,
+.ant-carousel .slick-prev:focus:before,
+.ant-carousel .slick-next:focus:before {
+  opacity: 1;
+}
+.ant-carousel .slick-prev.slick-disabled:before,
+.ant-carousel .slick-next.slick-disabled:before {
+  opacity: 0.25;
+}
+.ant-carousel .slick-prev {
+  left: -25px;
+}
+.ant-carousel .slick-prev:before {
+  content: "←";
+}
+.ant-carousel .slick-next {
+  right: -25px;
+}
+.ant-carousel .slick-next:before {
+  content: "→";
+}
+.ant-carousel .slick-dots {
+  position: absolute;
+  bottom: 12px;
+  list-style: none;
+  display: block;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 3px;
+}
+.ant-carousel .slick-dots li {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+  margin: 0 2px;
+  padding: 0;
+}
+.ant-carousel .slick-dots li button {
+  border: 0;
+  cursor: pointer;
+  background: #fff;
+  opacity: 0.3;
+  display: block;
+  width: 16px;
+  height: 3px;
+  border-radius: 1px;
+  outline: none;
+  font-size: 0;
+  color: transparent;
+  transition: all .5s;
+  padding: 0;
+}
+.ant-carousel .slick-dots li button:hover,
+.ant-carousel .slick-dots li button:focus {
+  opacity: 0.75;
+}
+.ant-carousel .slick-dots li.slick-active button {
+  background: #fff;
+  opacity: 1;
+  width: 24px;
+}
+.ant-carousel .slick-dots li.slick-active button:hover,
+.ant-carousel .slick-dots li.slick-active button:focus {
+  opacity: 1;
+}
+.ant-carousel-vertical .slick-dots {
+  width: 3px;
+  bottom: auto;
+  right: 12px;
+  top: 50%;
+  transform: translateY(-50%);
+  height: auto;
+}
+.ant-carousel-vertical .slick-dots li {
+  margin: 0 2px;
+  vertical-align: baseline;
+}
+.ant-carousel-vertical .slick-dots li button {
+  width: 3px;
+  height: 16px;
+}
+.ant-carousel-vertical .slick-dots li.slick-active button {
+  width: 3px;
+  height: 24px;
+}
+.ant-cascader {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-cascader-input.ant-input {
+  background-color: transparent !important;
+  cursor: pointer;
+  width: 100%;
+  display: block;
+}
+.ant-cascader-picker {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  cursor: pointer;
+  background-color: #fff;
+  border-radius: 4px;
+  outline: 0;
+}
+.ant-cascader-picker-with-value .ant-cascader-picker-label {
+  color: transparent;
+}
+.ant-cascader-picker-disabled {
+  cursor: not-allowed;
+  background: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-picker-disabled .ant-cascader-input {
+  cursor: not-allowed;
+}
+.ant-cascader-picker:focus .ant-cascader-input {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-cascader-picker-label {
+  position: absolute;
+  left: 0;
+  height: 20px;
+  line-height: 20px;
+  top: 50%;
+  margin-top: -10px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  width: 100%;
+  padding: 0 12px;
+}
+.ant-cascader-picker-clear {
+  opacity: 0;
+  position: absolute;
+  right: 12px;
+  z-index: 2;
+  background: #fff;
+  top: 50%;
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.25);
+  width: 12px;
+  height: 12px;
+  margin-top: -6px;
+  line-height: 12px;
+  cursor: pointer;
+  transition: color 0.3s ease, opacity 0.15s ease;
+}
+.ant-cascader-picker-clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-cascader-picker:hover .ant-cascader-picker-clear {
+  opacity: 1;
+}
+.ant-cascader-picker-arrow {
+  position: absolute;
+  z-index: 1;
+  top: 50%;
+  right: 12px;
+  width: 12px;
+  height: 12px;
+  font-size: 12px;
+  margin-top: -6px;
+  line-height: 12px;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-picker-arrow:before {
+  transition: transform .2s;
+}
+.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand:before {
+  transform: rotate(180deg);
+}
+.ant-cascader-picker-small .ant-cascader-picker-clear,
+.ant-cascader-picker-small .ant-cascader-picker-arrow {
+  right: 8px;
+}
+.ant-cascader-menus {
+  font-size: 14px;
+  background: #fff;
+  position: absolute;
+  z-index: 1050;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  white-space: nowrap;
+}
+.ant-cascader-menus ul,
+.ant-cascader-menus ol {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.ant-cascader-menus-empty,
+.ant-cascader-menus-hidden {
+  display: none;
+}
+.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft,
+.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft {
+  animation-name: antSlideUpIn;
+}
+.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft,
+.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft {
+  animation-name: antSlideDownIn;
+}
+.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft {
+  animation-name: antSlideUpOut;
+}
+.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft {
+  animation-name: antSlideDownOut;
+}
+.ant-cascader-menu {
+  display: inline-block;
+  vertical-align: top;
+  min-width: 111px;
+  height: 180px;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  border-right: 1px solid #e8e8e8;
+  overflow: auto;
+}
+.ant-cascader-menu:first-child {
+  border-radius: 4px 0 0 4px;
+}
+.ant-cascader-menu:last-child {
+  border-right-color: transparent;
+  margin-right: -1px;
+  border-radius: 0 4px 4px 0;
+}
+.ant-cascader-menu:only-child {
+  border-radius: 4px;
+}
+.ant-cascader-menu-item {
+  padding: 5px 12px;
+  line-height: 22px;
+  cursor: pointer;
+  white-space: nowrap;
+  transition: all 0.3s;
+}
+.ant-cascader-menu-item:hover {
+  background: #e6f7ff;
+}
+.ant-cascader-menu-item-disabled {
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-menu-item-disabled:hover {
+  background: transparent;
+}
+.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),
+.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover {
+  background: #f5f5f5;
+  font-weight: 600;
+}
+.ant-cascader-menu-item-expand {
+  position: relative;
+  padding-right: 24px;
+}
+.ant-cascader-menu-item-expand:after {
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e61f";
+  display: inline-block;
+  font-size: 12px;
+  font-size: 8px \9;
+  transform: scale(0.66666667) rotate(0deg);
+  color: rgba(0, 0, 0, 0.45);
+  position: absolute;
+  right: 12px;
+}
+:root .ant-cascader-menu-item-expand:after {
+  font-size: 12px;
+}
+.ant-cascader-menu-item-loading:after {
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e64d";
+  animation: loadingCircle 1s infinite linear;
+}
+.ant-cascader-menu-item .ant-cascader-menu-item-keyword {
+  color: #f5222d;
+}
+@keyframes antCheckboxEffect {
+  0% {
+    transform: scale(1);
+    opacity: 0.5;
+  }
+  100% {
+    transform: scale(1.6);
+    opacity: 0;
+  }
+}
+.ant-checkbox {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  display: inline-block;
+  line-height: 1;
+  position: relative;
+  vertical-align: middle;
+  top: -0.09em;
+}
+.ant-checkbox-wrapper:hover .ant-checkbox-inner,
+.ant-checkbox:hover .ant-checkbox-inner,
+.ant-checkbox-input:focus + .ant-checkbox-inner {
+  border-color: #1890ff;
+}
+.ant-checkbox-checked:after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 2px;
+  border: 1px solid #1890ff;
+  content: '';
+  animation: antCheckboxEffect 0.36s ease-in-out;
+  animation-fill-mode: both;
+  visibility: hidden;
+}
+.ant-checkbox:hover:after,
+.ant-checkbox-wrapper:hover .ant-checkbox:after {
+  visibility: visible;
+}
+.ant-checkbox-inner {
+  position: relative;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 16px;
+  height: 16px;
+  border: 1px solid #d9d9d9;
+  border-radius: 2px;
+  background-color: #fff;
+  transition: all .3s;
+}
+.ant-checkbox-inner:after {
+  transform: rotate(45deg) scale(0);
+  position: absolute;
+  left: 4.57142857px;
+  top: 1.14285714px;
+  display: table;
+  width: 5.71428571px;
+  height: 9.14285714px;
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+  content: ' ';
+  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6);
+}
+.ant-checkbox-input {
+  position: absolute;
+  left: 0;
+  z-index: 1;
+  cursor: pointer;
+  opacity: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+}
+.ant-checkbox-indeterminate .ant-checkbox-inner:after {
+  content: ' ';
+  transform: scale(1);
+  position: absolute;
+  left: 2.42857143px;
+  top: 5.92857143px;
+  width: 9.14285714px;
+  height: 1.14285714px;
+}
+.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-checkbox-checked .ant-checkbox-inner:after {
+  transform: rotate(45deg) scale(1);
+  position: absolute;
+  display: table;
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+  content: ' ';
+  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;
+}
+.ant-checkbox-checked .ant-checkbox-inner,
+.ant-checkbox-indeterminate .ant-checkbox-inner {
+  background-color: #1890ff;
+  border-color: #1890ff;
+}
+.ant-checkbox-disabled {
+  cursor: not-allowed;
+}
+.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after {
+  animation-name: none;
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-checkbox-disabled .ant-checkbox-input {
+  cursor: not-allowed;
+}
+.ant-checkbox-disabled .ant-checkbox-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-checkbox-disabled .ant-checkbox-inner:after {
+  animation-name: none;
+  border-color: #f5f5f5;
+}
+.ant-checkbox-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-checkbox-wrapper {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  line-height: unset;
+  cursor: pointer;
+  display: inline-block;
+}
+.ant-checkbox-wrapper + .ant-checkbox-wrapper {
+  margin-left: 8px;
+}
+.ant-checkbox-wrapper + span,
+.ant-checkbox + span {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.ant-checkbox-group {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+}
+.ant-checkbox-group-item {
+  display: inline-block;
+  margin-right: 8px;
+}
+.ant-checkbox-group-item:last-child {
+  margin-right: 0;
+}
+.ant-checkbox-group-item + .ant-checkbox-group-item {
+  margin-left: 0;
+}
+.ant-collapse {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  background-color: #fafafa;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  border-bottom: 0;
+}
+.ant-collapse > .ant-collapse-item {
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-collapse > .ant-collapse-item:last-child,
+.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header {
+  border-radius: 0 0 4px 4px;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header {
+  line-height: 22px;
+  padding: 12px 0 12px 40px;
+  color: rgba(0, 0, 0, 0.85);
+  cursor: pointer;
+  position: relative;
+  transition: all .3s;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow {
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  line-height: 1;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  transform: rotate(0);
+  font-size: 12px;
+  position: absolute;
+  display: inline-block;
+  line-height: 46px;
+  vertical-align: top;
+  transition: transform 0.24s;
+  top: 0;
+  left: 16px;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow:before {
+  display: block;
+  font-family: "anticon" !important;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow:before {
+  content: "\E61F";
+}
+.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header {
+  padding-left: 12px;
+}
+.ant-collapse-anim-active {
+  transition: height 0.2s cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+.ant-collapse-content {
+  overflow: hidden;
+  color: #54657e;
+  padding: 0 16px;
+  background-color: #fff;
+  border-top: 1px solid #d9d9d9;
+}
+.ant-collapse-content > .ant-collapse-content-box {
+  padding-top: 16px;
+  padding-bottom: 16px;
+}
+.ant-collapse-content-inactive {
+  display: none;
+}
+.ant-collapse-item:last-child > .ant-collapse-content {
+  border-radius: 0 0 4px 4px;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header[aria-expanded="true"] .arrow {
+  transform: rotate(90deg);
+}
+.ant-collapse-borderless {
+  background-color: #fff;
+  border: 0;
+}
+.ant-collapse-borderless > .ant-collapse-item {
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-collapse-borderless > .ant-collapse-item:last-child,
+.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header {
+  border-radius: 0;
+}
+.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content {
+  background-color: transparent;
+  border-top: 0;
+}
+.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box {
+  padding-top: 4px;
+}
+.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header,
+.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow {
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.cdk-overlay-container {
+  pointer-events: none;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 100%;
+  position: fixed;
+  z-index: 1000;
+}
+.cdk-overlay-backdrop {
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-tap-highlight-color: transparent;
+  transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
+  opacity: 0;
+  position: absolute;
+  pointer-events: auto;
+  z-index: 1000;
+}
+.cdk-overlay-pane {
+  position: absolute;
+  pointer-events: auto;
+  z-index: 1000;
+}
+.ant-table-td-right-sticky + .ant-table-td-right-sticky {
+  box-shadow: none;
+}
+.ant-table-th-right-sticky + .ant-table-th-right-sticky {
+  box-shadow: none;
+}
+.ant-table-th-left-sticky,
+.ant-table-th-right-sticky,
+.ant-table-td-right-sticky,
+.ant-table-td-left-sticky {
+  position: sticky;
+  z-index: 1;
+}
+.ant-table-td-left-sticky,
+.ant-table-td-right-sticky {
+  background: #fff;
+}
+.ant-table-scroll-position-middle .ant-table-th-left-sticky,
+.ant-table-scroll-position-middle .ant-table-td-left-sticky {
+  box-shadow: 6px 0 6px 0px rgba(0, 0, 0, 0.05);
+}
+.ant-table-scroll-position-middle .ant-table-th-right-sticky,
+.ant-table-scroll-position-middle .ant-table-td-right-sticky {
+  box-shadow: -6px 0 6px 0px rgba(0, 0, 0, 0.05);
+}
+.ant-table-scroll-position-left .ant-table-th-right-sticky,
+.ant-table-scroll-position-left .ant-table-td-right-sticky {
+  box-shadow: -6px 0 6px 0px rgba(0, 0, 0, 0.05);
+}
+.ant-table-scroll-position-right .ant-table-th-left-sticky,
+.ant-table-scroll-position-right .ant-table-td-left-sticky {
+  box-shadow: 6px 0 6px 0px rgba(0, 0, 0, 0.05);
+}
+.ant-table-bordered.ant-table-scroll-position-middle .ant-table-th-left-sticky,
+.ant-table-bordered.ant-table-scroll-position-middle .ant-table-td-left-sticky {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-table-bordered.ant-table-scroll-position-middle .ant-table-th-right-sticky,
+.ant-table-bordered.ant-table-scroll-position-middle .ant-table-td-right-sticky {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-bordered.ant-table-scroll-position-left .ant-table-th-right-sticky,
+.ant-table-bordered.ant-table-scroll-position-left .ant-table-td-right-sticky {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-bordered.ant-table-scroll-position-right .ant-table-th-left-sticky,
+.ant-table-bordered.ant-table-scroll-position-right .ant-table-td-left-sticky {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-calendar-picker-container {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: absolute;
+  z-index: 1050;
+}
+.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topLeft,
+.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topRight,
+.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topLeft,
+.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topRight {
+  animation-name: antSlideDownIn;
+}
+.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomLeft,
+.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomRight,
+.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomLeft,
+.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomRight {
+  animation-name: antSlideUpIn;
+}
+.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topLeft,
+.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topRight {
+  animation-name: antSlideDownOut;
+}
+.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomLeft,
+.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomRight {
+  animation-name: antSlideUpOut;
+}
+.ant-calendar-picker {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  outline: none;
+  transition: opacity 0.3s;
+}
+.ant-calendar-picker-input {
+  outline: none;
+  display: block;
+}
+.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled) {
+  border-color: #1890ff;
+}
+.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled) {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-calendar-picker-clear,
+.ant-calendar-picker-icon {
+  position: absolute;
+  width: 14px;
+  height: 14px;
+  right: 12px;
+  top: 50%;
+  margin-top: -7px;
+  line-height: 14px;
+  font-size: 12px;
+  transition: all .3s;
+  user-select: none;
+}
+.ant-calendar-picker-clear {
+  opacity: 0;
+  z-index: 1;
+  color: rgba(0, 0, 0, 0.25);
+  background: #fff;
+  pointer-events: none;
+  cursor: pointer;
+}
+.ant-calendar-picker-clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-picker:hover .ant-calendar-picker-clear {
+  opacity: 1;
+  pointer-events: auto;
+}
+.ant-calendar-picker-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-picker-icon:after {
+  content: "\e6bb";
+  font-family: "anticon";
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.25);
+  display: inline-block;
+  line-height: 1;
+}
+.ant-calendar-picker-small .ant-calendar-picker-clear,
+.ant-calendar-picker-small .ant-calendar-picker-icon {
+  right: 8px;
+}
+.ant-calendar {
+  position: relative;
+  outline: none;
+  width: 280px;
+  border: 1px solid #fff;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+  line-height: 1.5;
+}
+.ant-calendar-input-wrap {
+  height: 34px;
+  padding: 6px 10px;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-input {
+  border: 0;
+  width: 100%;
+  cursor: auto;
+  outline: 0;
+  height: 22px;
+  color: #54657e;
+  background: #fff;
+}
+.ant-calendar-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-calendar-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-week-number {
+  width: 286px;
+}
+.ant-calendar-week-number-cell {
+  text-align: center;
+}
+.ant-calendar-header {
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  user-select: none;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-header a:hover {
+  color: #40a9ff;
+}
+.ant-calendar-header .ant-calendar-century-select,
+.ant-calendar-header .ant-calendar-decade-select,
+.ant-calendar-header .ant-calendar-year-select,
+.ant-calendar-header .ant-calendar-month-select {
+  padding: 0 2px;
+  font-weight: 500;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.85);
+  line-height: 40px;
+}
+.ant-calendar-header .ant-calendar-century-select-arrow,
+.ant-calendar-header .ant-calendar-decade-select-arrow,
+.ant-calendar-header .ant-calendar-year-select-arrow,
+.ant-calendar-header .ant-calendar-month-select-arrow {
+  display: none;
+}
+.ant-calendar-header .ant-calendar-prev-century-btn,
+.ant-calendar-header .ant-calendar-next-century-btn,
+.ant-calendar-header .ant-calendar-prev-decade-btn,
+.ant-calendar-header .ant-calendar-next-decade-btn,
+.ant-calendar-header .ant-calendar-prev-month-btn,
+.ant-calendar-header .ant-calendar-next-month-btn,
+.ant-calendar-header .ant-calendar-prev-year-btn,
+.ant-calendar-header .ant-calendar-next-year-btn {
+  position: absolute;
+  top: 0;
+  color: rgba(0, 0, 0, 0.45);
+  font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif;
+  padding: 0 5px;
+  font-size: 16px;
+  display: inline-block;
+  line-height: 40px;
+}
+.ant-calendar-header .ant-calendar-prev-century-btn,
+.ant-calendar-header .ant-calendar-prev-decade-btn,
+.ant-calendar-header .ant-calendar-prev-year-btn {
+  left: 7px;
+}
+.ant-calendar-header .ant-calendar-prev-century-btn:after,
+.ant-calendar-header .ant-calendar-prev-decade-btn:after,
+.ant-calendar-header .ant-calendar-prev-year-btn:after {
+  content: '«';
+}
+.ant-calendar-header .ant-calendar-next-century-btn,
+.ant-calendar-header .ant-calendar-next-decade-btn,
+.ant-calendar-header .ant-calendar-next-year-btn {
+  right: 7px;
+}
+.ant-calendar-header .ant-calendar-next-century-btn:after,
+.ant-calendar-header .ant-calendar-next-decade-btn:after,
+.ant-calendar-header .ant-calendar-next-year-btn:after {
+  content: '»';
+}
+.ant-calendar-header .ant-calendar-prev-month-btn {
+  left: 29px;
+}
+.ant-calendar-header .ant-calendar-prev-month-btn:after {
+  content: '‹';
+}
+.ant-calendar-header .ant-calendar-next-month-btn {
+  right: 29px;
+}
+.ant-calendar-header .ant-calendar-next-month-btn:after {
+  content: '›';
+}
+.ant-calendar-body {
+  padding: 8px 12px;
+}
+.ant-calendar table {
+  border-collapse: collapse;
+  max-width: 100%;
+  background-color: transparent;
+  width: 100%;
+}
+.ant-calendar table,
+.ant-calendar th,
+.ant-calendar td {
+  border: 0;
+  text-align: center;
+}
+.ant-calendar-calendar-table {
+  border-spacing: 0;
+  margin-bottom: 0;
+}
+.ant-calendar-column-header {
+  line-height: 18px;
+  width: 33px;
+  padding: 6px 0;
+  text-align: center;
+}
+.ant-calendar-column-header .ant-calendar-column-header-inner {
+  display: block;
+  font-weight: normal;
+}
+.ant-calendar-week-number-header .ant-calendar-column-header-inner {
+  display: none;
+}
+.ant-calendar-cell {
+  padding: 3px 0;
+  height: 30px;
+}
+.ant-calendar-date {
+  display: block;
+  margin: 0 auto;
+  color: #54657e;
+  border-radius: 2px;
+  width: 24px;
+  height: 24px;
+  line-height: 22px;
+  border: 1px solid transparent;
+  padding: 0;
+  background: transparent;
+  text-align: center;
+  transition: background 0.3s ease;
+}
+.ant-calendar-date-panel {
+  position: relative;
+}
+.ant-calendar-date:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-calendar-date:active {
+  color: #fff;
+  background: #40a9ff;
+}
+.ant-calendar-today .ant-calendar-date {
+  border-color: #1890ff;
+  font-weight: bold;
+  color: #1890ff;
+}
+.ant-calendar-last-month-cell .ant-calendar-date,
+.ant-calendar-next-month-btn-day .ant-calendar-date {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-selected-day .ant-calendar-date {
+  background: #1890ff;
+  color: #fff;
+  border: 1px solid transparent;
+}
+.ant-calendar-selected-day .ant-calendar-date:hover {
+  background: #1890ff;
+}
+.ant-calendar-disabled-cell .ant-calendar-date {
+  cursor: not-allowed;
+  color: #bcbcbc;
+  background: #f5f5f5;
+  border-radius: 0;
+  width: auto;
+  border: 1px solid transparent;
+}
+.ant-calendar-disabled-cell .ant-calendar-date:hover {
+  background: #f5f5f5;
+}
+.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date {
+  position: relative;
+  margin-right: 5px;
+  padding-left: 5px;
+}
+.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before {
+  content: " ";
+  position: absolute;
+  top: -1px;
+  left: 5px;
+  width: 24px;
+  height: 24px;
+  border: 1px solid #bcbcbc;
+  border-radius: 2px;
+}
+.ant-calendar-disabled-cell-first-of-row .ant-calendar-date {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-calendar-disabled-cell-last-of-row .ant-calendar-date {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.ant-calendar-footer {
+  border-top: 1px solid #e8e8e8;
+  line-height: 38px;
+  padding: 0 12px;
+}
+.ant-calendar-footer:empty {
+  border-top: 0;
+}
+.ant-calendar-footer-btn {
+  text-align: center;
+  display: block;
+}
+.ant-calendar-footer-extra + .ant-calendar-footer-btn {
+  border-top: 1px solid #e8e8e8;
+  margin: 0 -12px;
+  padding: 0 12px;
+}
+.ant-calendar .ant-calendar-today-btn,
+.ant-calendar .ant-calendar-clear-btn {
+  display: inline-block;
+  text-align: center;
+  margin: 0 0 0 8px;
+}
+.ant-calendar .ant-calendar-today-btn-disabled,
+.ant-calendar .ant-calendar-clear-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-calendar .ant-calendar-today-btn:only-child,
+.ant-calendar .ant-calendar-clear-btn:only-child {
+  margin: 0;
+}
+.ant-calendar .ant-calendar-clear-btn {
+  display: none;
+  position: absolute;
+  right: 5px;
+  text-indent: -76px;
+  overflow: hidden;
+  width: 20px;
+  height: 20px;
+  text-align: center;
+  line-height: 20px;
+  top: 7px;
+  margin: 0;
+}
+.ant-calendar .ant-calendar-clear-btn:after {
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e62e";
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.25);
+  display: inline-block;
+  line-height: 1;
+  width: 20px;
+  text-indent: 43px;
+  transition: color 0.3s ease;
+}
+.ant-calendar .ant-calendar-clear-btn:hover:after {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar .ant-calendar-ok-btn {
+  display: inline-block;
+  font-weight: 400;
+  text-align: center;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 0 15px;
+  height: 32px;
+  user-select: none;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  position: relative;
+  color: #fff;
+  background-color: #1890ff;
+  border-color: #1890ff;
+  padding: 0 7px;
+  font-size: 14px;
+  border-radius: 4px;
+  height: 24px;
+  line-height: 22px;
+}
+.ant-calendar .ant-calendar-ok-btn > .anticon {
+  line-height: 1;
+}
+.ant-calendar .ant-calendar-ok-btn,
+.ant-calendar .ant-calendar-ok-btn:active,
+.ant-calendar .ant-calendar-ok-btn:focus {
+  outline: 0;
+}
+.ant-calendar .ant-calendar-ok-btn:not([disabled]):hover {
+  text-decoration: none;
+}
+.ant-calendar .ant-calendar-ok-btn:not([disabled]):active {
+  outline: 0;
+  transition: none;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled,
+.ant-calendar .ant-calendar-ok-btn[disabled] {
+  cursor: not-allowed;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled > *,
+.ant-calendar .ant-calendar-ok-btn[disabled] > * {
+  pointer-events: none;
+}
+.ant-calendar .ant-calendar-ok-btn-lg {
+  padding: 0 15px;
+  font-size: 16px;
+  border-radius: 4px;
+  height: 40px;
+}
+.ant-calendar .ant-calendar-ok-btn-sm {
+  padding: 0 7px;
+  font-size: 14px;
+  border-radius: 4px;
+  height: 24px;
+}
+.ant-calendar .ant-calendar-ok-btn > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn:hover,
+.ant-calendar .ant-calendar-ok-btn:focus {
+  color: #fff;
+  background-color: #40a9ff;
+  border-color: #40a9ff;
+}
+.ant-calendar .ant-calendar-ok-btn:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn:focus > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn:focus > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn:active,
+.ant-calendar .ant-calendar-ok-btn.active {
+  color: #fff;
+  background-color: #096dd9;
+  border-color: #096dd9;
+}
+.ant-calendar .ant-calendar-ok-btn:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.active > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled,
+.ant-calendar .ant-calendar-ok-btn[disabled],
+.ant-calendar .ant-calendar-ok-btn.disabled:hover,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus,
+.ant-calendar .ant-calendar-ok-btn.disabled:active,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active,
+.ant-calendar .ant-calendar-ok-btn.disabled.active,
+.ant-calendar .ant-calendar-ok-btn[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  cursor: not-allowed;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child:after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: transparent;
+}
+.ant-calendar-range-picker-input {
+  background-color: transparent;
+  border: 0;
+  height: 99%;
+  outline: 0;
+  width: 44%;
+  text-align: center;
+}
+.ant-calendar-range-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-calendar-range-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range-picker-input[disabled] {
+  cursor: not-allowed;
+}
+.ant-calendar-range-picker-separator {
+  color: rgba(0, 0, 0, 0.45);
+  width: 10px;
+  display: inline-block;
+  height: 100%;
+  vertical-align: top;
+}
+.ant-calendar-range {
+  width: 552px;
+  overflow: hidden;
+}
+.ant-calendar-range .ant-calendar-date-panel::after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+.ant-calendar-range-part {
+  width: 50%;
+  position: relative;
+}
+.ant-calendar-range-left {
+  float: left;
+}
+.ant-calendar-range-left .ant-calendar-time-picker-inner {
+  border-right: 1.5px solid #e8e8e8;
+}
+.ant-calendar-range-right {
+  float: right;
+}
+.ant-calendar-range-right .ant-calendar-time-picker-inner {
+  border-left: 1.5px solid #e8e8e8;
+}
+.ant-calendar-range-middle {
+  position: absolute;
+  left: 50%;
+  width: 20px;
+  margin-left: -132px;
+  text-align: center;
+  height: 34px;
+  line-height: 34px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-range-right .ant-calendar-date-input-wrap {
+  margin-left: -118px;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-range-middle {
+  margin-left: -12px;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-range-right .ant-calendar-date-input-wrap {
+  margin-left: 0;
+}
+.ant-calendar-range .ant-calendar-input-wrap {
+  position: relative;
+  height: 34px;
+}
+.ant-calendar-range .ant-calendar-input,
+.ant-calendar-range .ant-calendar-time-picker-input {
+  position: relative;
+  display: inline-block;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  transition: all .3s;
+  height: 24px;
+  border: 0;
+  box-shadow: none;
+  padding-left: 0;
+  padding-right: 0;
+}
+.ant-calendar-range .ant-calendar-input::-moz-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-calendar-range .ant-calendar-input:-ms-input-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range .ant-calendar-input:hover,
+.ant-calendar-range .ant-calendar-time-picker-input:hover {
+  border-color: #40a9ff;
+}
+.ant-calendar-range .ant-calendar-input:focus,
+.ant-calendar-range .ant-calendar-time-picker-input:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-calendar-range .ant-calendar-input-disabled,
+.ant-calendar-range .ant-calendar-time-picker-input-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-range .ant-calendar-input-disabled:hover,
+.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-calendar-range .ant-calendar-input,
+textarea.ant-calendar-range .ant-calendar-time-picker-input {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-calendar-range .ant-calendar-input-lg,
+.ant-calendar-range .ant-calendar-time-picker-input-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-calendar-range .ant-calendar-input-sm,
+.ant-calendar-range .ant-calendar-time-picker-input-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-calendar-range .ant-calendar-input:focus,
+.ant-calendar-range .ant-calendar-time-picker-input:focus {
+  box-shadow: none;
+}
+.ant-calendar-range .ant-calendar-time-picker-icon {
+  display: none;
+}
+.ant-calendar-range.ant-calendar-week-number {
+  width: 574px;
+}
+.ant-calendar-range.ant-calendar-week-number .ant-calendar-range-part {
+  width: 286px;
+}
+.ant-calendar-range .ant-calendar-year-panel,
+.ant-calendar-range .ant-calendar-month-panel,
+.ant-calendar-range .ant-calendar-decade-panel {
+  top: 34px;
+}
+.ant-calendar-range .ant-calendar-month-panel .ant-calendar-year-panel {
+  top: 0;
+}
+.ant-calendar-range .ant-calendar-decade-panel-table,
+.ant-calendar-range .ant-calendar-year-panel-table,
+.ant-calendar-range .ant-calendar-month-panel-table {
+  height: 208px;
+}
+.ant-calendar-range .ant-calendar-in-range-cell {
+  border-radius: 0;
+  position: relative;
+}
+.ant-calendar-range .ant-calendar-in-range-cell > div {
+  position: relative;
+  z-index: 1;
+}
+.ant-calendar-range .ant-calendar-in-range-cell:before {
+  content: '';
+  display: block;
+  background: #e6f7ff;
+  border-radius: 0;
+  border: 0;
+  position: absolute;
+  top: 4px;
+  bottom: 4px;
+  left: 0;
+  right: 0;
+}
+div.ant-calendar-range-quick-selector {
+  text-align: left;
+}
+div.ant-calendar-range-quick-selector > a {
+  margin-right: 8px;
+}
+.ant-calendar-range .ant-calendar-header,
+.ant-calendar-range .ant-calendar-month-panel-header,
+.ant-calendar-range .ant-calendar-year-panel-header {
+  border-bottom: 0;
+}
+.ant-calendar-range .ant-calendar-body,
+.ant-calendar-range .ant-calendar-month-panel-body,
+.ant-calendar-range .ant-calendar-year-panel-body {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker {
+  height: 207px;
+  width: 100%;
+  top: 68px;
+  z-index: 2;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-panel {
+  height: 267px;
+  margin-top: -34px;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner {
+  padding-top: 40px;
+  height: 100%;
+  background: none;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox {
+  display: inline-block;
+  height: 100%;
+  background-color: #fff;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select {
+  height: 100%;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select ul {
+  max-height: 100%;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn {
+  margin-right: 8px;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-today-btn {
+  margin: 8px 12px;
+  height: 22px;
+  line-height: 22px;
+}
+.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker {
+  height: 247px;
+}
+.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker-panel {
+  height: 281px;
+}
+.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body {
+  border-top-color: transparent;
+}
+.ant-calendar-time-picker {
+  position: absolute;
+  width: 100%;
+  top: 40px;
+  background-color: #fff;
+}
+.ant-calendar-time-picker-panel {
+  z-index: 1050;
+  position: absolute;
+  width: 100%;
+}
+.ant-calendar-time-picker-inner {
+  display: inline-block;
+  position: relative;
+  outline: none;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: #fff;
+  background-clip: padding-box;
+  line-height: 1.5;
+  overflow: hidden;
+  width: 100%;
+}
+.ant-calendar-time-picker-combobox {
+  width: 100%;
+}
+.ant-calendar-time-picker-column-1,
+.ant-calendar-time-picker-column-1 .ant-calendar-time-picker-select {
+  width: 100%;
+}
+.ant-calendar-time-picker-column-2 .ant-calendar-time-picker-select {
+  width: 50%;
+}
+.ant-calendar-time-picker-column-3 .ant-calendar-time-picker-select {
+  width: 33.33%;
+}
+.ant-calendar-time-picker-column-4 .ant-calendar-time-picker-select {
+  width: 25%;
+}
+.ant-calendar-time-picker-input-wrap {
+  display: none;
+}
+.ant-calendar-time-picker-select {
+  float: left;
+  font-size: 14px;
+  border-right: 1px solid #e8e8e8;
+  box-sizing: border-box;
+  overflow: hidden;
+  position: relative;
+  height: 226px;
+}
+.ant-calendar-time-picker-select:hover {
+  overflow-y: auto;
+}
+.ant-calendar-time-picker-select:first-child {
+  border-left: 0;
+  margin-left: 0;
+}
+.ant-calendar-time-picker-select:last-child {
+  border-right: 0;
+}
+.ant-calendar-time-picker-select ul {
+  list-style: none;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  max-height: 206px;
+}
+.ant-calendar-time-picker-select li {
+  text-align: center;
+  list-style: none;
+  box-sizing: content-box;
+  margin: 0;
+  width: 100%;
+  height: 24px;
+  line-height: 24px;
+  cursor: pointer;
+  user-select: none;
+  transition: background 0.3s ease;
+}
+.ant-calendar-time-picker-select li:last-child:after {
+  content: '';
+  height: 202px;
+  display: block;
+}
+.ant-calendar-time-picker-select li:hover {
+  background: #e6f7ff;
+}
+li.ant-calendar-time-picker-select-option-selected {
+  background: #f5f5f5;
+  font-weight: bold;
+}
+li.ant-calendar-time-picker-select-option-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-calendar-time-picker-select-option-disabled:hover {
+  background: transparent;
+  cursor: not-allowed;
+}
+.ant-calendar-time .ant-calendar-day-select {
+  padding: 0 2px;
+  font-weight: 500;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.85);
+  line-height: 34px;
+}
+.ant-calendar-time .ant-calendar-footer {
+  position: relative;
+  height: auto;
+}
+.ant-calendar-time .ant-calendar-footer-btn {
+  text-align: right;
+}
+.ant-calendar-time .ant-calendar-footer .ant-calendar-today-btn {
+  float: left;
+  margin: 0;
+}
+.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn {
+  display: inline-block;
+  margin-right: 8px;
+}
+.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-month-panel {
+  position: absolute;
+  top: 1px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 10;
+  border-radius: 4px;
+  background: #fff;
+  outline: none;
+}
+.ant-calendar-month-panel > div {
+  height: 100%;
+}
+.ant-calendar-month-panel-hidden {
+  display: none;
+}
+.ant-calendar-month-panel-header {
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  user-select: none;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-month-panel-header a:hover {
+  color: #40a9ff;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select {
+  padding: 0 2px;
+  font-weight: 500;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.85);
+  line-height: 40px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select-arrow,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select-arrow,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select-arrow,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select-arrow {
+  display: none;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn {
+  position: absolute;
+  top: 0;
+  color: rgba(0, 0, 0, 0.45);
+  font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif;
+  padding: 0 5px;
+  font-size: 16px;
+  display: inline-block;
+  line-height: 40px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn {
+  left: 7px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn:after,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn:after,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn:after {
+  content: '«';
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn {
+  right: 7px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn:after,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn:after,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn:after {
+  content: '»';
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn {
+  left: 29px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn:after {
+  content: '‹';
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn {
+  right: 29px;
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn:after {
+  content: '›';
+}
+.ant-calendar-month-panel-body {
+  height: calc(100% - 40px);
+}
+.ant-calendar-month-panel-table {
+  table-layout: fixed;
+  width: 100%;
+  height: 100%;
+  border-collapse: separate;
+}
+.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-month-panel-cell {
+  text-align: center;
+}
+.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month,
+.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover {
+  cursor: not-allowed;
+  color: #bcbcbc;
+  background: #f5f5f5;
+}
+.ant-calendar-month-panel-month {
+  display: inline-block;
+  margin: 0 auto;
+  color: #54657e;
+  background: transparent;
+  text-align: center;
+  height: 24px;
+  line-height: 24px;
+  padding: 0 8px;
+  border-radius: 2px;
+  transition: background 0.3s ease;
+}
+.ant-calendar-month-panel-month:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-calendar-year-panel {
+  position: absolute;
+  top: 1px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 10;
+  border-radius: 4px;
+  background: #fff;
+  outline: none;
+}
+.ant-calendar-year-panel > div {
+  height: 100%;
+}
+.ant-calendar-year-panel-hidden {
+  display: none;
+}
+.ant-calendar-year-panel-header {
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  user-select: none;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-year-panel-header a:hover {
+  color: #40a9ff;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select {
+  padding: 0 2px;
+  font-weight: 500;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.85);
+  line-height: 40px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select-arrow,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select-arrow,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select-arrow,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select-arrow {
+  display: none;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn {
+  position: absolute;
+  top: 0;
+  color: rgba(0, 0, 0, 0.45);
+  font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif;
+  padding: 0 5px;
+  font-size: 16px;
+  display: inline-block;
+  line-height: 40px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn {
+  left: 7px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn:after,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn:after,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn:after {
+  content: '«';
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn {
+  right: 7px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn:after,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn:after,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn:after {
+  content: '»';
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn {
+  left: 29px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn:after {
+  content: '‹';
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn {
+  right: 29px;
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn:after {
+  content: '›';
+}
+.ant-calendar-year-panel-body {
+  height: calc(100% - 40px);
+}
+.ant-calendar-year-panel-table {
+  table-layout: fixed;
+  width: 100%;
+  height: 100%;
+  border-collapse: separate;
+}
+.ant-calendar-year-panel-cell {
+  text-align: center;
+}
+.ant-calendar-year-panel-year {
+  display: inline-block;
+  margin: 0 auto;
+  color: #54657e;
+  background: transparent;
+  text-align: center;
+  height: 24px;
+  line-height: 24px;
+  padding: 0 8px;
+  border-radius: 2px;
+  transition: background 0.3s ease;
+}
+.ant-calendar-year-panel-year:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year,
+.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year {
+  user-select: none;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-decade-panel {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 10;
+  background: #fff;
+  border-radius: 4px;
+  outline: none;
+}
+.ant-calendar-decade-panel-hidden {
+  display: none;
+}
+.ant-calendar-decade-panel-header {
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  user-select: none;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-decade-panel-header a:hover {
+  color: #40a9ff;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select {
+  padding: 0 2px;
+  font-weight: 500;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.85);
+  line-height: 40px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select-arrow,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select-arrow,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select-arrow,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select-arrow {
+  display: none;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn {
+  position: absolute;
+  top: 0;
+  color: rgba(0, 0, 0, 0.45);
+  font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif;
+  padding: 0 5px;
+  font-size: 16px;
+  display: inline-block;
+  line-height: 40px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn {
+  left: 7px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn:after,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn:after,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn:after {
+  content: '«';
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn {
+  right: 7px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn:after,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn:after,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn:after {
+  content: '»';
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn {
+  left: 29px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn:after {
+  content: '‹';
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn {
+  right: 29px;
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn:after {
+  content: '›';
+}
+.ant-calendar-decade-panel-body {
+  height: calc(100% - 40px);
+}
+.ant-calendar-decade-panel-table {
+  table-layout: fixed;
+  width: 100%;
+  height: 100%;
+  border-collapse: separate;
+}
+.ant-calendar-decade-panel-cell {
+  text-align: center;
+  white-space: nowrap;
+}
+.ant-calendar-decade-panel-decade {
+  display: inline-block;
+  margin: 0 auto;
+  color: #54657e;
+  background: transparent;
+  text-align: center;
+  height: 24px;
+  line-height: 24px;
+  padding: 0 6px;
+  border-radius: 2px;
+  transition: background 0.3s ease;
+}
+.ant-calendar-decade-panel-decade:hover {
+  background: #e6f7ff;
+  cursor: pointer;
+}
+.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade,
+.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade {
+  user-select: none;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-month .ant-calendar-month-header-wrap {
+  position: relative;
+  height: 288px;
+}
+.ant-calendar-month .ant-calendar-month-panel,
+.ant-calendar-month .ant-calendar-year-panel {
+  top: 0;
+  height: 100%;
+}
+.ant-calendar-week-number-cell {
+  opacity: 0.5;
+}
+.ant-calendar-week-number .ant-calendar-body tr {
+  transition: all .3s;
+  cursor: pointer;
+}
+.ant-calendar-week-number .ant-calendar-body tr:hover {
+  background: #e6f7ff;
+}
+.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week {
+  background: #bae7ff;
+  font-weight: bold;
+}
+.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date,
+.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date {
+  background: transparent;
+  color: #54657e;
+}
+.ant-divider {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  background: #e8e8e8;
+}
+.ant-divider,
+.ant-divider-vertical {
+  margin: 0 8px;
+  display: inline-block;
+  height: 0.9em;
+  width: 1px;
+  vertical-align: middle;
+  position: relative;
+  top: -0.06em;
+}
+.ant-divider-horizontal {
+  display: block;
+  height: 1px;
+  width: 100%;
+  margin: 24px 0;
+}
+.ant-divider-horizontal.ant-divider-with-text {
+  display: table;
+  white-space: nowrap;
+  text-align: center;
+  background: transparent;
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  font-size: 16px;
+  margin: 16px 0;
+}
+.ant-divider-horizontal.ant-divider-with-text:before,
+.ant-divider-horizontal.ant-divider-with-text:after {
+  content: '';
+  display: table-cell;
+  position: relative;
+  top: 50%;
+  width: 50%;
+  border-top: 1px solid #e8e8e8;
+  transform: translateY(50%);
+}
+.ant-divider-inner-text {
+  display: inline-block;
+  padding: 0 24px;
+}
+.ant-divider-horizontal.ant-divider-with-text-left {
+  display: table;
+  white-space: nowrap;
+  text-align: center;
+  background: transparent;
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  font-size: 14px;
+  margin: 16px 0;
+}
+.ant-divider-horizontal.ant-divider-with-text-left:before {
+  content: '';
+  display: table-cell;
+  position: relative;
+  top: 50%;
+  width: 5%;
+  border-top: 1px solid #e8e8e8;
+  transform: translateY(50%);
+}
+.ant-divider-horizontal.ant-divider-with-text-left:after {
+  content: '';
+  display: table-cell;
+  position: relative;
+  top: 50%;
+  width: 95%;
+  border-top: 1px solid #e8e8e8;
+  transform: translateY(50%);
+}
+.ant-divider-horizontal.ant-divider-with-text-left-inner-text {
+  display: inline-block;
+  padding: 0 10px;
+}
+.ant-divider-horizontal.ant-divider-with-text-right {
+  display: table;
+  white-space: nowrap;
+  text-align: center;
+  background: transparent;
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  font-size: 14px;
+  margin: 16px 0;
+}
+.ant-divider-horizontal.ant-divider-with-text-right:before {
+  content: '';
+  display: table-cell;
+  position: relative;
+  top: 50%;
+  width: 95%;
+  border-top: 1px solid #e8e8e8;
+  transform: translateY(50%);
+}
+.ant-divider-horizontal.ant-divider-with-text-right:after {
+  content: '';
+  display: table-cell;
+  position: relative;
+  top: 50%;
+  width: 5%;
+  border-top: 1px solid #e8e8e8;
+  transform: translateY(50%);
+}
+.ant-divider-horizontal.ant-divider-with-text-right-inner-text {
+  display: inline-block;
+  padding: 0 10px;
+}
+.ant-divider-dashed {
+  background: none;
+  border-top: 1px dashed #e8e8e8;
+}
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed {
+  border-top: 0;
+}
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before,
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after {
+  border-style: dashed none none;
+}
+.ant-dropdown {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: absolute;
+  left: -9999px;
+  top: -9999px;
+  z-index: 1050;
+  display: block;
+}
+.ant-dropdown-wrap {
+  position: relative;
+}
+.ant-dropdown-wrap .ant-btn > .anticon-down {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+}
+:root .ant-dropdown-wrap .ant-btn > .anticon-down {
+  font-size: 12px;
+}
+.ant-dropdown-wrap .anticon-down:before {
+  transition: transform .2s;
+}
+.ant-dropdown-wrap-open .anticon-down:before {
+  transform: rotate(180deg);
+}
+.ant-dropdown-hidden,
+.ant-dropdown-menu-hidden {
+  display: none;
+}
+.ant-dropdown-menu {
+  outline: none;
+  position: relative;
+  list-style-type: none;
+  padding: 0;
+  margin: 0;
+  text-align: left;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+}
+.ant-dropdown-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+  padding: 5px 12px;
+  transition: all .3s;
+}
+.ant-dropdown-menu-submenu-popup {
+  position: absolute;
+  z-index: 1050;
+}
+.ant-dropdown-menu-item,
+.ant-dropdown-menu-submenu-title {
+  padding: 5px 12px;
+  margin: 0;
+  clear: both;
+  font-size: 14px;
+  font-weight: normal;
+  color: #54657e;
+  white-space: nowrap;
+  cursor: pointer;
+  transition: all .3s;
+  line-height: 22px;
+}
+.ant-dropdown-menu-item > a,
+.ant-dropdown-menu-submenu-title > a {
+  color: #54657e;
+  display: block;
+  padding: 5px 12px;
+  margin: -5px -12px;
+  transition: all .3s;
+}
+.ant-dropdown-menu-item > a:focus,
+.ant-dropdown-menu-submenu-title > a:focus {
+  text-decoration: none;
+}
+.ant-dropdown-menu-item-selected,
+.ant-dropdown-menu-submenu-title-selected,
+.ant-dropdown-menu-item-selected > a,
+.ant-dropdown-menu-submenu-title-selected > a {
+  color: #1890ff;
+  background-color: #e6f7ff;
+}
+.ant-dropdown-menu-item:hover,
+.ant-dropdown-menu-submenu-title:hover {
+  background-color: #e6f7ff;
+}
+.ant-dropdown-menu-item-disabled,
+.ant-dropdown-menu-submenu-title-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-dropdown-menu-item-disabled:hover,
+.ant-dropdown-menu-submenu-title-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+  cursor: not-allowed;
+}
+.ant-dropdown-menu-item:first-child,
+.ant-dropdown-menu-submenu-title:first-child,
+.ant-dropdown-menu-item:first-child > a,
+.ant-dropdown-menu-submenu-title:first-child > a {
+  border-radius: 4px 4px 0 0;
+}
+.ant-dropdown-menu-item:last-child,
+.ant-dropdown-menu-submenu-title:last-child,
+.ant-dropdown-menu-item:last-child > a,
+.ant-dropdown-menu-submenu-title:last-child > a {
+  border-radius: 0 0 4px 4px;
+}
+.ant-dropdown-menu-item:only-child,
+.ant-dropdown-menu-submenu-title:only-child,
+.ant-dropdown-menu-item:only-child > a,
+.ant-dropdown-menu-submenu-title:only-child > a {
+  border-radius: 4px;
+}
+.ant-dropdown-menu-item-divider,
+.ant-dropdown-menu-submenu-title-divider {
+  height: 1px;
+  overflow: hidden;
+  background-color: #e8e8e8;
+  line-height: 0;
+}
+.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow,
+.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow {
+  position: absolute;
+  right: 8px;
+}
+.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,
+.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after {
+  font-family: "anticon" !important;
+  font-style: normal;
+  content: "\e61f";
+  color: rgba(0, 0, 0, 0.45);
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+}
+:root .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,
+:root .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after {
+  font-size: 12px;
+}
+.ant-dropdown-menu-submenu-title {
+  padding-right: 26px;
+}
+.ant-dropdown-menu-submenu-title:first-child,
+.ant-dropdown-menu-submenu-title:last-child {
+  border-radius: 0;
+}
+.ant-dropdown-menu-submenu-vertical {
+  position: relative;
+}
+.ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu {
+  top: 0;
+  left: 100%;
+  position: absolute;
+  min-width: 100%;
+  margin-left: 4px;
+  transform-origin: 0 0;
+}
+.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,
+.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-dropdown-menu-submenu:first-child .ant-dropdown-menu-submenu-title {
+  border-radius: 4px 4px 0 0;
+}
+.ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title {
+  border-radius: 0 0 4px 4px;
+}
+.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft,
+.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft,
+.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter,
+.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter,
+.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight,
+.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight {
+  animation-name: antSlideUpIn;
+}
+.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft,
+.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft,
+.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter,
+.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter,
+.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight,
+.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight {
+  animation-name: antSlideDownIn;
+}
+.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft,
+.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter,
+.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight {
+  animation-name: antSlideUpOut;
+}
+.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft,
+.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter,
+.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight {
+  animation-name: antSlideDownOut;
+}
+.ant-dropdown-trigger .anticon-down,
+.ant-dropdown-link .anticon-down {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+}
+:root .ant-dropdown-trigger .anticon-down,
+:root .ant-dropdown-link .anticon-down {
+  font-size: 12px;
+}
+.ant-dropdown-button {
+  white-space: nowrap;
+}
+.ant-dropdown-button.ant-btn-group > .ant-btn:last-child:not(:first-child) {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.ant-dropdown-button .anticon-down {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+}
+:root .ant-dropdown-button .anticon-down {
+  font-size: 12px;
+}
+.ant-dropdown-menu-dark,
+.ant-dropdown-menu-dark .ant-dropdown-menu {
+  background: #2a3542;
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a {
+  color: rgba(255, 255, 255, 0.65);
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow:after {
+  color: rgba(255, 255, 255, 0.65);
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover {
+  color: #fff;
+  background: transparent;
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a {
+  background: #1890ff;
+  color: #fff;
+}
+.ant-form {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-form legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 16px;
+  line-height: inherit;
+  color: rgba(0, 0, 0, 0.45);
+  border: 0;
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-form label {
+  font-size: 14px;
+}
+.ant-form input[type="search"] {
+  box-sizing: border-box;
+}
+.ant-form input[type="radio"],
+.ant-form input[type="checkbox"] {
+  line-height: normal;
+}
+.ant-form input[type="file"] {
+  display: block;
+}
+.ant-form input[type="range"] {
+  display: block;
+  width: 100%;
+}
+.ant-form select[multiple],
+.ant-form select[size] {
+  height: auto;
+}
+.ant-form input[type="file"]:focus,
+.ant-form input[type="radio"]:focus,
+.ant-form input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.ant-form output {
+  display: block;
+  padding-top: 15px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+}
+.ant-form-item-required:before {
+  display: inline-block;
+  margin-right: 4px;
+  content: "*";
+  font-family: SimSun;
+  line-height: 1;
+  font-size: 14px;
+  color: #f5222d;
+}
+.ant-form-hide-required-mark .ant-form-item-required:before {
+  display: none;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled {
+  cursor: not-allowed;
+}
+.ant-radio-inline.disabled,
+.ant-radio-vertical.disabled,
+.ant-checkbox-inline.disabled,
+.ant-checkbox-vertical.disabled {
+  cursor: not-allowed;
+}
+.ant-radio.disabled label,
+.ant-checkbox.disabled label {
+  cursor: not-allowed;
+}
+.ant-form-item {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  margin-bottom: 24px;
+  vertical-align: top;
+  transition: margin 0.15s steps(1);
+}
+.ant-form-item label {
+  position: relative;
+}
+.ant-form-item label > .anticon {
+  vertical-align: top;
+  font-size: 14px;
+}
+.ant-form-item-control > .ant-form-item:last-child,
+.ant-form-item [class^="ant-col-"] > .ant-form-item:only-child {
+  margin-bottom: -24px;
+}
+.ant-form-item-control {
+  line-height: 39.9999px;
+  position: relative;
+  zoom: 1;
+}
+.ant-form-item-control:before,
+.ant-form-item-control:after {
+  content: " ";
+  display: table;
+}
+.ant-form-item-control:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-form-item-control:before,
+.ant-form-item-control:after {
+  content: " ";
+  display: table;
+}
+.ant-form-item-control:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-form-item-children {
+  position: relative;
+}
+.ant-form-item-with-help {
+  margin-bottom: 5px;
+  transition: none;
+}
+.ant-form-item-label {
+  text-align: right;
+  vertical-align: middle;
+  line-height: 39.9999px;
+  display: inline-block;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ant-form-item-label label {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-form-item-label label:after {
+  content: ":";
+  margin: 0 8px 0 2px;
+  position: relative;
+  top: -0.5px;
+}
+.ant-form-item .ant-switch {
+  margin: 2px 0 4px;
+}
+.ant-form-item-no-colon .ant-form-item-label label:after {
+  content: " ";
+}
+.ant-form-explain,
+.ant-form-extra {
+  color: rgba(0, 0, 0, 0.45);
+  line-height: 1.5;
+  transition: color 0.15s cubic-bezier(0.215, 0.61, 0.355, 1);
+  margin-top: -2px;
+}
+.ant-form-extra {
+  padding-top: 4px;
+}
+.ant-form-text {
+  display: inline-block;
+  padding-right: 8px;
+}
+.ant-form-split {
+  display: block;
+  text-align: center;
+}
+form .has-feedback .ant-input {
+  padding-right: 24px;
+}
+form .has-feedback > .ant-select .ant-select-arrow,
+form .has-feedback > .ant-select .ant-select-selection__clear,
+form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow,
+form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection__clear {
+  right: 28px;
+}
+form .has-feedback > .ant-select .ant-select-selection-selected-value,
+form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value {
+  padding-right: 42px;
+}
+form .has-feedback .ant-cascader-picker-arrow {
+  margin-right: 17px;
+}
+form .has-feedback .ant-cascader-picker-clear {
+  right: 28px;
+}
+form .has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix {
+  right: 28px;
+}
+form .has-feedback .ant-calendar-picker-icon,
+form .has-feedback .ant-time-picker-icon,
+form .has-feedback .ant-calendar-picker-clear,
+form .has-feedback .ant-time-picker-clear {
+  right: 28px;
+}
+form textarea.ant-input {
+  height: auto;
+}
+form .ant-upload {
+  background: transparent;
+}
+form input[type="radio"],
+form input[type="checkbox"] {
+  width: 14px;
+  height: 14px;
+}
+form .ant-radio-inline,
+form .ant-checkbox-inline {
+  display: inline-block;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer;
+  margin-left: 8px;
+}
+form .ant-radio-inline:first-child,
+form .ant-checkbox-inline:first-child {
+  margin-left: 0;
+}
+form .ant-checkbox-vertical,
+form .ant-radio-vertical {
+  display: block;
+}
+form .ant-checkbox-vertical + .ant-checkbox-vertical,
+form .ant-radio-vertical + .ant-radio-vertical {
+  margin-left: 0;
+}
+form .ant-input-number + .ant-form-text {
+  margin-left: 8px;
+}
+form .ant-select,
+form .ant-cascader-picker {
+  width: 100%;
+}
+form .ant-input-group .ant-select,
+form .ant-input-group .ant-cascader-picker {
+  width: auto;
+}
+form .ant-input-group-wrapper {
+  vertical-align: middle;
+  position: relative;
+  top: -1px;
+}
+.ant-input-group-wrap .ant-select-selection {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group-wrap .ant-select-selection:hover {
+  border-color: #d9d9d9;
+}
+.ant-input-group-wrap .ant-select-selection--single {
+  margin-left: -1px;
+  height: 40px;
+  background-color: #eee;
+}
+.ant-input-group-wrap .ant-select-selection--single .ant-select-selection__rendered {
+  padding-left: 8px;
+  padding-right: 25px;
+  line-height: 30px;
+}
+.ant-input-group-wrap .ant-select-open .ant-select-selection {
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-form-vertical .ant-form-item-label,
+.ant-col-24.ant-form-item-label,
+.ant-col-xl-24.ant-form-item-label {
+  padding: 0 0 8px;
+  margin: 0;
+  display: block;
+  text-align: left;
+  line-height: 1.5;
+}
+.ant-form-vertical .ant-form-item-label label:after,
+.ant-col-24.ant-form-item-label label:after,
+.ant-col-xl-24.ant-form-item-label label:after {
+  display: none;
+}
+.ant-form-vertical .ant-form-item {
+  padding-bottom: 8px;
+}
+.ant-form-vertical .ant-form-item-control {
+  line-height: 1.5;
+}
+.ant-form-vertical .ant-form-explain,
+.ant-form-vertical .ant-form-extra {
+  margin-top: 2px;
+  margin-bottom: -4px;
+}
+@media (max-width: 575px) {
+  .ant-form-item-label,
+  .ant-form-item-control-wrapper {
+    display: block;
+    width: 100%;
+  }
+  .ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-form-item-label label:after {
+    display: none;
+  }
+  .ant-col-xs-24.ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-col-xs-24.ant-form-item-label label:after {
+    display: none;
+  }
+}
+@media (max-width: 767px) {
+  .ant-col-sm-24.ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-col-sm-24.ant-form-item-label label:after {
+    display: none;
+  }
+}
+@media (max-width: 991px) {
+  .ant-col-md-24.ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-col-md-24.ant-form-item-label label:after {
+    display: none;
+  }
+}
+@media (max-width: 1199px) {
+  .ant-col-lg-24.ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-col-lg-24.ant-form-item-label label:after {
+    display: none;
+  }
+}
+@media (max-width: 1599px) {
+  .ant-col-xl-24.ant-form-item-label {
+    padding: 0 0 8px;
+    margin: 0;
+    display: block;
+    text-align: left;
+    line-height: 1.5;
+  }
+  .ant-col-xl-24.ant-form-item-label label:after {
+    display: none;
+  }
+}
+.ant-form-inline .ant-form-item {
+  display: inline-block;
+  margin-right: 16px;
+  margin-bottom: 0;
+}
+.ant-form-inline .ant-form-item-with-help {
+  margin-bottom: 24px;
+}
+.ant-form-inline .ant-form-item > .ant-form-item-control-wrapper,
+.ant-form-inline .ant-form-item > .ant-form-item-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.ant-form-inline .ant-form-text {
+  display: inline-block;
+}
+.ant-form-inline .has-feedback {
+  display: inline-block;
+}
+.ant-form-inline .ant-form-explain {
+  position: absolute;
+}
+.has-success.has-feedback .ant-form-item-children:after,
+.has-warning.has-feedback .ant-form-item-children:after,
+.has-error.has-feedback .ant-form-item-children:after,
+.is-validating.has-feedback .ant-form-item-children:after {
+  position: absolute;
+  top: 50%;
+  right: 0;
+  visibility: visible;
+  pointer-events: none;
+  width: 32px;
+  height: 20px;
+  line-height: 20px;
+  margin-top: -10px;
+  text-align: center;
+  font-size: 14px;
+  animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46);
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "";
+  z-index: 1;
+}
+.has-success.has-feedback .ant-form-item-children:after {
+  animation-name: diffZoomIn1 !important;
+  content: '\e630';
+  color: #52c41a;
+}
+.has-warning .ant-form-explain,
+.has-warning .ant-form-split {
+  color: #faad14;
+}
+.has-warning .ant-input,
+.has-warning .ant-input:hover {
+  border-color: #faad14;
+}
+.has-warning .ant-input:focus {
+  border-color: #ffc53d;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+}
+.has-warning .ant-input:not([disabled]):hover {
+  border-color: #faad14;
+}
+.has-warning .ant-calendar-picker-open .ant-calendar-picker-input {
+  border-color: #ffc53d;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+}
+.has-warning .ant-input-prefix {
+  color: #faad14;
+}
+.has-warning .ant-input-group-addon {
+  color: #faad14;
+  border-color: #faad14;
+  background-color: #fff;
+}
+.has-warning .has-feedback {
+  color: #faad14;
+}
+.has-warning.has-feedback .ant-form-item-children:after {
+  content: '\e62c';
+  color: #faad14;
+  animation-name: diffZoomIn3 !important;
+}
+.has-warning .ant-select-selection {
+  border-color: #faad14;
+}
+.has-warning .ant-select-open .ant-select-selection,
+.has-warning .ant-select-focused .ant-select-selection {
+  border-color: #ffc53d;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+}
+.has-warning .ant-calendar-picker-icon:after,
+.has-warning .ant-time-picker-icon:after,
+.has-warning .ant-picker-icon:after,
+.has-warning .ant-select-arrow,
+.has-warning .ant-cascader-picker-arrow {
+  color: #faad14;
+}
+.has-warning .ant-input-number,
+.has-warning .ant-time-picker-input {
+  border-color: #faad14;
+}
+.has-warning .ant-input-number-focused,
+.has-warning .ant-time-picker-input-focused,
+.has-warning .ant-input-number:focus,
+.has-warning .ant-time-picker-input:focus {
+  border-color: #ffc53d;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+}
+.has-warning .ant-input-number:not([disabled]):hover,
+.has-warning .ant-time-picker-input:not([disabled]):hover {
+  border-color: #faad14;
+}
+.has-warning .ant-cascader-picker:focus .ant-cascader-input {
+  border-color: #ffc53d;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+}
+.has-error .ant-form-explain,
+.has-error .ant-form-split {
+  color: #f5222d;
+}
+.has-error .ant-input,
+.has-error .ant-input:hover {
+  border-color: #f5222d;
+}
+.has-error .ant-input:focus {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.has-error .ant-input:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-calendar-picker-open .ant-calendar-picker-input {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.has-error .ant-input-prefix {
+  color: #f5222d;
+}
+.has-error .ant-input-group-addon {
+  color: #f5222d;
+  border-color: #f5222d;
+  background-color: #fff;
+}
+.has-error .has-feedback {
+  color: #f5222d;
+}
+.has-error.has-feedback .ant-form-item-children:after {
+  content: '\e62e';
+  color: #f5222d;
+  animation-name: diffZoomIn2 !important;
+}
+.has-error .ant-select-selection {
+  border-color: #f5222d;
+}
+.has-error .ant-select-open .ant-select-selection,
+.has-error .ant-select-focused .ant-select-selection {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.has-error .ant-select.ant-select-auto-complete .ant-input:focus {
+  border-color: #f5222d;
+}
+.has-error .ant-input-group-addon .ant-select-selection {
+  border-color: transparent;
+  box-shadow: none;
+}
+.has-error .ant-calendar-picker-icon:after,
+.has-error .ant-time-picker-icon:after,
+.has-error .ant-picker-icon:after,
+.has-error .ant-select-arrow,
+.has-error .ant-cascader-picker-arrow {
+  color: #f5222d;
+}
+.has-error .ant-input-number,
+.has-error .ant-time-picker-input {
+  border-color: #f5222d;
+}
+.has-error .ant-input-number-focused,
+.has-error .ant-time-picker-input-focused,
+.has-error .ant-input-number:focus,
+.has-error .ant-time-picker-input:focus {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.has-error .ant-input-number:not([disabled]):hover,
+.has-error .ant-time-picker-input:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-mention-wrapper .ant-mention-editor,
+.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor,
+.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.has-error .ant-cascader-picker:focus .ant-cascader-input {
+  border-color: #ff4d4f;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+}
+.is-validating.has-feedback .ant-form-item-children:after {
+  display: inline-block;
+  animation: loadingCircle 1s infinite linear;
+  content: "\e64d";
+  color: #1890ff;
+}
+.ant-advanced-search-form .ant-form-item {
+  margin-bottom: 24px;
+}
+.show-help-enter,
+.show-help-appear {
+  animation-duration: 0.15s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.show-help-leave {
+  animation-duration: 0.15s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.show-help-enter.show-help-enter-active,
+.show-help-appear.show-help-appear-active {
+  animation-name: antShowHelpIn;
+  animation-play-state: running;
+}
+.show-help-leave.show-help-leave-active {
+  animation-name: antShowHelpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.show-help-enter,
+.show-help-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.show-help-leave {
+  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+@keyframes antShowHelpIn {
+  0% {
+    opacity: 0;
+    transform: translateY(-5px);
+  }
+  100% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+@keyframes antShowHelpOut {
+  to {
+    opacity: 0;
+    transform: translateY(-5px);
+  }
+}
+@keyframes diffZoomIn1 {
+  0% {
+    transform: scale(0);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+@keyframes diffZoomIn2 {
+  0% {
+    transform: scale(0);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+@keyframes diffZoomIn3 {
+  0% {
+    transform: scale(0);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+.ant-row {
+  position: relative;
+  margin-left: 0;
+  margin-right: 0;
+  height: auto;
+  zoom: 1;
+  display: block;
+  box-sizing: border-box;
+}
+.ant-row:before,
+.ant-row:after {
+  content: " ";
+  display: table;
+}
+.ant-row:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-row:before,
+.ant-row:after {
+  content: " ";
+  display: table;
+}
+.ant-row:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-row-flex {
+  display: flex;
+  flex-flow: row wrap;
+}
+.ant-row-flex:before,
+.ant-row-flex:after {
+  display: flex;
+}
+.ant-row-flex-start {
+  justify-content: flex-start;
+}
+.ant-row-flex-center {
+  justify-content: center;
+}
+.ant-row-flex-end {
+  justify-content: flex-end;
+}
+.ant-row-flex-space-between {
+  justify-content: space-between;
+}
+.ant-row-flex-space-around {
+  justify-content: space-around;
+}
+.ant-row-flex-top {
+  align-items: flex-start;
+}
+.ant-row-flex-middle {
+  align-items: center;
+}
+.ant-row-flex-bottom {
+  align-items: flex-end;
+}
+.ant-col {
+  position: relative;
+  display: block;
+}
+.ant-col-1, .ant-col-xs-1, .ant-col-sm-1, .ant-col-md-1, .ant-col-lg-1, .ant-col-2, .ant-col-xs-2, .ant-col-sm-2, .ant-col-md-2, .ant-col-lg-2, .ant-col-3, .ant-col-xs-3, .ant-col-sm-3, .ant-col-md-3, .ant-col-lg-3, .ant-col-4, .ant-col-xs-4, .ant-col-sm-4, .ant-col-md-4, .ant-col-lg-4, .ant-col-5, .ant-col-xs-5, .ant-col-sm-5, .ant-col-md-5, .ant-col-lg-5, .ant-col-6, .ant-col-xs-6, .ant-col-sm-6, .ant-col-md-6, .ant-col-lg-6, .ant-col-7, .ant-col-xs-7, .ant-col-sm-7, .ant-col-md-7, .ant-col-lg-7, .ant-col-8, .ant-col-xs-8, .ant-col-sm-8, .ant-col-md-8, .ant-col-lg-8, .ant-col-9, .ant-col-xs-9, .ant-col-sm-9, .ant-col-md-9, .ant-col-lg-9, .ant-col-10, .ant-col-xs-10, .ant-col-sm-10, .ant-col-md-10, .ant-col-lg-10, .ant-col-11, .ant-col-xs-11, .ant-col-sm-11, .ant-col-md-11, .ant-col-lg-11, .ant-col-12, .ant-col-xs-12, .ant-col-sm-12, .ant-col-md-12, .ant-col-lg-12, .ant-col-13, .ant-col-xs-13, .ant-col-sm-13, .ant-col-md-13, .ant-col-lg-13, .ant-col-14, .ant-col-xs-14, .ant-col-sm-14, .ant-col-md-14, .ant-col-lg-14, .ant-col-15, .ant-col-xs-15, .ant-col-sm-15, .ant-col-md-15, .ant-col-lg-15, .ant-col-16, .ant-col-xs-16, .ant-col-sm-16, .ant-col-md-16, .ant-col-lg-16, .ant-col-17, .ant-col-xs-17, .ant-col-sm-17, .ant-col-md-17, .ant-col-lg-17, .ant-col-18, .ant-col-xs-18, .ant-col-sm-18, .ant-col-md-18, .ant-col-lg-18, .ant-col-19, .ant-col-xs-19, .ant-col-sm-19, .ant-col-md-19, .ant-col-lg-19, .ant-col-20, .ant-col-xs-20, .ant-col-sm-20, .ant-col-md-20, .ant-col-lg-20, .ant-col-21, .ant-col-xs-21, .ant-col-sm-21, .ant-col-md-21, .ant-col-lg-21, .ant-col-22, .ant-col-xs-22, .ant-col-sm-22, .ant-col-md-22, .ant-col-lg-22, .ant-col-23, .ant-col-xs-23, .ant-col-sm-23, .ant-col-md-23, .ant-col-lg-23, .ant-col-24, .ant-col-xs-24, .ant-col-sm-24, .ant-col-md-24, .ant-col-lg-24 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 0;
+  padding-right: 0;
+}
+.ant-col-1, .ant-col-2, .ant-col-3, .ant-col-4, .ant-col-5, .ant-col-6, .ant-col-7, .ant-col-8, .ant-col-9, .ant-col-10, .ant-col-11, .ant-col-12, .ant-col-13, .ant-col-14, .ant-col-15, .ant-col-16, .ant-col-17, .ant-col-18, .ant-col-19, .ant-col-20, .ant-col-21, .ant-col-22, .ant-col-23, .ant-col-24 {
+  float: left;
+  flex: 0 0 auto;
+}
+.ant-col-24 {
+  display: block;
+  box-sizing: border-box;
+  width: 100%;
+}
+.ant-col-push-24 {
+  left: 100%;
+}
+.ant-col-pull-24 {
+  right: 100%;
+}
+.ant-col-offset-24 {
+  margin-left: 100%;
+}
+.ant-col-order-24 {
+  order: 24;
+}
+.ant-col-23 {
+  display: block;
+  box-sizing: border-box;
+  width: 95.83333333%;
+}
+.ant-col-push-23 {
+  left: 95.83333333%;
+}
+.ant-col-pull-23 {
+  right: 95.83333333%;
+}
+.ant-col-offset-23 {
+  margin-left: 95.83333333%;
+}
+.ant-col-order-23 {
+  order: 23;
+}
+.ant-col-22 {
+  display: block;
+  box-sizing: border-box;
+  width: 91.66666667%;
+}
+.ant-col-push-22 {
+  left: 91.66666667%;
+}
+.ant-col-pull-22 {
+  right: 91.66666667%;
+}
+.ant-col-offset-22 {
+  margin-left: 91.66666667%;
+}
+.ant-col-order-22 {
+  order: 22;
+}
+.ant-col-21 {
+  display: block;
+  box-sizing: border-box;
+  width: 87.5%;
+}
+.ant-col-push-21 {
+  left: 87.5%;
+}
+.ant-col-pull-21 {
+  right: 87.5%;
+}
+.ant-col-offset-21 {
+  margin-left: 87.5%;
+}
+.ant-col-order-21 {
+  order: 21;
+}
+.ant-col-20 {
+  display: block;
+  box-sizing: border-box;
+  width: 83.33333333%;
+}
+.ant-col-push-20 {
+  left: 83.33333333%;
+}
+.ant-col-pull-20 {
+  right: 83.33333333%;
+}
+.ant-col-offset-20 {
+  margin-left: 83.33333333%;
+}
+.ant-col-order-20 {
+  order: 20;
+}
+.ant-col-19 {
+  display: block;
+  box-sizing: border-box;
+  width: 79.16666667%;
+}
+.ant-col-push-19 {
+  left: 79.16666667%;
+}
+.ant-col-pull-19 {
+  right: 79.16666667%;
+}
+.ant-col-offset-19 {
+  margin-left: 79.16666667%;
+}
+.ant-col-order-19 {
+  order: 19;
+}
+.ant-col-18 {
+  display: block;
+  box-sizing: border-box;
+  width: 75%;
+}
+.ant-col-push-18 {
+  left: 75%;
+}
+.ant-col-pull-18 {
+  right: 75%;
+}
+.ant-col-offset-18 {
+  margin-left: 75%;
+}
+.ant-col-order-18 {
+  order: 18;
+}
+.ant-col-17 {
+  display: block;
+  box-sizing: border-box;
+  width: 70.83333333%;
+}
+.ant-col-push-17 {
+  left: 70.83333333%;
+}
+.ant-col-pull-17 {
+  right: 70.83333333%;
+}
+.ant-col-offset-17 {
+  margin-left: 70.83333333%;
+}
+.ant-col-order-17 {
+  order: 17;
+}
+.ant-col-16 {
+  display: block;
+  box-sizing: border-box;
+  width: 66.66666667%;
+}
+.ant-col-push-16 {
+  left: 66.66666667%;
+}
+.ant-col-pull-16 {
+  right: 66.66666667%;
+}
+.ant-col-offset-16 {
+  margin-left: 66.66666667%;
+}
+.ant-col-order-16 {
+  order: 16;
+}
+.ant-col-15 {
+  display: block;
+  box-sizing: border-box;
+  width: 62.5%;
+}
+.ant-col-push-15 {
+  left: 62.5%;
+}
+.ant-col-pull-15 {
+  right: 62.5%;
+}
+.ant-col-offset-15 {
+  margin-left: 62.5%;
+}
+.ant-col-order-15 {
+  order: 15;
+}
+.ant-col-14 {
+  display: block;
+  box-sizing: border-box;
+  width: 58.33333333%;
+}
+.ant-col-push-14 {
+  left: 58.33333333%;
+}
+.ant-col-pull-14 {
+  right: 58.33333333%;
+}
+.ant-col-offset-14 {
+  margin-left: 58.33333333%;
+}
+.ant-col-order-14 {
+  order: 14;
+}
+.ant-col-13 {
+  display: block;
+  box-sizing: border-box;
+  width: 54.16666667%;
+}
+.ant-col-push-13 {
+  left: 54.16666667%;
+}
+.ant-col-pull-13 {
+  right: 54.16666667%;
+}
+.ant-col-offset-13 {
+  margin-left: 54.16666667%;
+}
+.ant-col-order-13 {
+  order: 13;
+}
+.ant-col-12 {
+  display: block;
+  box-sizing: border-box;
+  width: 50%;
+}
+.ant-col-push-12 {
+  left: 50%;
+}
+.ant-col-pull-12 {
+  right: 50%;
+}
+.ant-col-offset-12 {
+  margin-left: 50%;
+}
+.ant-col-order-12 {
+  order: 12;
+}
+.ant-col-11 {
+  display: block;
+  box-sizing: border-box;
+  width: 45.83333333%;
+}
+.ant-col-push-11 {
+  left: 45.83333333%;
+}
+.ant-col-pull-11 {
+  right: 45.83333333%;
+}
+.ant-col-offset-11 {
+  margin-left: 45.83333333%;
+}
+.ant-col-order-11 {
+  order: 11;
+}
+.ant-col-10 {
+  display: block;
+  box-sizing: border-box;
+  width: 41.66666667%;
+}
+.ant-col-push-10 {
+  left: 41.66666667%;
+}
+.ant-col-pull-10 {
+  right: 41.66666667%;
+}
+.ant-col-offset-10 {
+  margin-left: 41.66666667%;
+}
+.ant-col-order-10 {
+  order: 10;
+}
+.ant-col-9 {
+  display: block;
+  box-sizing: border-box;
+  width: 37.5%;
+}
+.ant-col-push-9 {
+  left: 37.5%;
+}
+.ant-col-pull-9 {
+  right: 37.5%;
+}
+.ant-col-offset-9 {
+  margin-left: 37.5%;
+}
+.ant-col-order-9 {
+  order: 9;
+}
+.ant-col-8 {
+  display: block;
+  box-sizing: border-box;
+  width: 33.33333333%;
+}
+.ant-col-push-8 {
+  left: 33.33333333%;
+}
+.ant-col-pull-8 {
+  right: 33.33333333%;
+}
+.ant-col-offset-8 {
+  margin-left: 33.33333333%;
+}
+.ant-col-order-8 {
+  order: 8;
+}
+.ant-col-7 {
+  display: block;
+  box-sizing: border-box;
+  width: 29.16666667%;
+}
+.ant-col-push-7 {
+  left: 29.16666667%;
+}
+.ant-col-pull-7 {
+  right: 29.16666667%;
+}
+.ant-col-offset-7 {
+  margin-left: 29.16666667%;
+}
+.ant-col-order-7 {
+  order: 7;
+}
+.ant-col-6 {
+  display: block;
+  box-sizing: border-box;
+  width: 25%;
+}
+.ant-col-push-6 {
+  left: 25%;
+}
+.ant-col-pull-6 {
+  right: 25%;
+}
+.ant-col-offset-6 {
+  margin-left: 25%;
+}
+.ant-col-order-6 {
+  order: 6;
+}
+.ant-col-5 {
+  display: block;
+  box-sizing: border-box;
+  width: 20.83333333%;
+}
+.ant-col-push-5 {
+  left: 20.83333333%;
+}
+.ant-col-pull-5 {
+  right: 20.83333333%;
+}
+.ant-col-offset-5 {
+  margin-left: 20.83333333%;
+}
+.ant-col-order-5 {
+  order: 5;
+}
+.ant-col-4 {
+  display: block;
+  box-sizing: border-box;
+  width: 16.66666667%;
+}
+.ant-col-push-4 {
+  left: 16.66666667%;
+}
+.ant-col-pull-4 {
+  right: 16.66666667%;
+}
+.ant-col-offset-4 {
+  margin-left: 16.66666667%;
+}
+.ant-col-order-4 {
+  order: 4;
+}
+.ant-col-3 {
+  display: block;
+  box-sizing: border-box;
+  width: 12.5%;
+}
+.ant-col-push-3 {
+  left: 12.5%;
+}
+.ant-col-pull-3 {
+  right: 12.5%;
+}
+.ant-col-offset-3 {
+  margin-left: 12.5%;
+}
+.ant-col-order-3 {
+  order: 3;
+}
+.ant-col-2 {
+  display: block;
+  box-sizing: border-box;
+  width: 8.33333333%;
+}
+.ant-col-push-2 {
+  left: 8.33333333%;
+}
+.ant-col-pull-2 {
+  right: 8.33333333%;
+}
+.ant-col-offset-2 {
+  margin-left: 8.33333333%;
+}
+.ant-col-order-2 {
+  order: 2;
+}
+.ant-col-1 {
+  display: block;
+  box-sizing: border-box;
+  width: 4.16666667%;
+}
+.ant-col-push-1 {
+  left: 4.16666667%;
+}
+.ant-col-pull-1 {
+  right: 4.16666667%;
+}
+.ant-col-offset-1 {
+  margin-left: 4.16666667%;
+}
+.ant-col-order-1 {
+  order: 1;
+}
+.ant-col-0 {
+  display: none;
+}
+.ant-col-push-0 {
+  left: auto;
+}
+.ant-col-pull-0 {
+  right: auto;
+}
+.ant-col-push-0 {
+  left: auto;
+}
+.ant-col-pull-0 {
+  right: auto;
+}
+.ant-col-offset-0 {
+  margin-left: 0;
+}
+.ant-col-order-0 {
+  order: 0;
+}
+.ant-col-xs-1, .ant-col-xs-2, .ant-col-xs-3, .ant-col-xs-4, .ant-col-xs-5, .ant-col-xs-6, .ant-col-xs-7, .ant-col-xs-8, .ant-col-xs-9, .ant-col-xs-10, .ant-col-xs-11, .ant-col-xs-12, .ant-col-xs-13, .ant-col-xs-14, .ant-col-xs-15, .ant-col-xs-16, .ant-col-xs-17, .ant-col-xs-18, .ant-col-xs-19, .ant-col-xs-20, .ant-col-xs-21, .ant-col-xs-22, .ant-col-xs-23, .ant-col-xs-24 {
+  float: left;
+  flex: 0 0 auto;
+}
+.ant-col-xs-24 {
+  display: block;
+  box-sizing: border-box;
+  width: 100%;
+}
+.ant-col-xs-push-24 {
+  left: 100%;
+}
+.ant-col-xs-pull-24 {
+  right: 100%;
+}
+.ant-col-xs-offset-24 {
+  margin-left: 100%;
+}
+.ant-col-xs-order-24 {
+  order: 24;
+}
+.ant-col-xs-23 {
+  display: block;
+  box-sizing: border-box;
+  width: 95.83333333%;
+}
+.ant-col-xs-push-23 {
+  left: 95.83333333%;
+}
+.ant-col-xs-pull-23 {
+  right: 95.83333333%;
+}
+.ant-col-xs-offset-23 {
+  margin-left: 95.83333333%;
+}
+.ant-col-xs-order-23 {
+  order: 23;
+}
+.ant-col-xs-22 {
+  display: block;
+  box-sizing: border-box;
+  width: 91.66666667%;
+}
+.ant-col-xs-push-22 {
+  left: 91.66666667%;
+}
+.ant-col-xs-pull-22 {
+  right: 91.66666667%;
+}
+.ant-col-xs-offset-22 {
+  margin-left: 91.66666667%;
+}
+.ant-col-xs-order-22 {
+  order: 22;
+}
+.ant-col-xs-21 {
+  display: block;
+  box-sizing: border-box;
+  width: 87.5%;
+}
+.ant-col-xs-push-21 {
+  left: 87.5%;
+}
+.ant-col-xs-pull-21 {
+  right: 87.5%;
+}
+.ant-col-xs-offset-21 {
+  margin-left: 87.5%;
+}
+.ant-col-xs-order-21 {
+  order: 21;
+}
+.ant-col-xs-20 {
+  display: block;
+  box-sizing: border-box;
+  width: 83.33333333%;
+}
+.ant-col-xs-push-20 {
+  left: 83.33333333%;
+}
+.ant-col-xs-pull-20 {
+  right: 83.33333333%;
+}
+.ant-col-xs-offset-20 {
+  margin-left: 83.33333333%;
+}
+.ant-col-xs-order-20 {
+  order: 20;
+}
+.ant-col-xs-19 {
+  display: block;
+  box-sizing: border-box;
+  width: 79.16666667%;
+}
+.ant-col-xs-push-19 {
+  left: 79.16666667%;
+}
+.ant-col-xs-pull-19 {
+  right: 79.16666667%;
+}
+.ant-col-xs-offset-19 {
+  margin-left: 79.16666667%;
+}
+.ant-col-xs-order-19 {
+  order: 19;
+}
+.ant-col-xs-18 {
+  display: block;
+  box-sizing: border-box;
+  width: 75%;
+}
+.ant-col-xs-push-18 {
+  left: 75%;
+}
+.ant-col-xs-pull-18 {
+  right: 75%;
+}
+.ant-col-xs-offset-18 {
+  margin-left: 75%;
+}
+.ant-col-xs-order-18 {
+  order: 18;
+}
+.ant-col-xs-17 {
+  display: block;
+  box-sizing: border-box;
+  width: 70.83333333%;
+}
+.ant-col-xs-push-17 {
+  left: 70.83333333%;
+}
+.ant-col-xs-pull-17 {
+  right: 70.83333333%;
+}
+.ant-col-xs-offset-17 {
+  margin-left: 70.83333333%;
+}
+.ant-col-xs-order-17 {
+  order: 17;
+}
+.ant-col-xs-16 {
+  display: block;
+  box-sizing: border-box;
+  width: 66.66666667%;
+}
+.ant-col-xs-push-16 {
+  left: 66.66666667%;
+}
+.ant-col-xs-pull-16 {
+  right: 66.66666667%;
+}
+.ant-col-xs-offset-16 {
+  margin-left: 66.66666667%;
+}
+.ant-col-xs-order-16 {
+  order: 16;
+}
+.ant-col-xs-15 {
+  display: block;
+  box-sizing: border-box;
+  width: 62.5%;
+}
+.ant-col-xs-push-15 {
+  left: 62.5%;
+}
+.ant-col-xs-pull-15 {
+  right: 62.5%;
+}
+.ant-col-xs-offset-15 {
+  margin-left: 62.5%;
+}
+.ant-col-xs-order-15 {
+  order: 15;
+}
+.ant-col-xs-14 {
+  display: block;
+  box-sizing: border-box;
+  width: 58.33333333%;
+}
+.ant-col-xs-push-14 {
+  left: 58.33333333%;
+}
+.ant-col-xs-pull-14 {
+  right: 58.33333333%;
+}
+.ant-col-xs-offset-14 {
+  margin-left: 58.33333333%;
+}
+.ant-col-xs-order-14 {
+  order: 14;
+}
+.ant-col-xs-13 {
+  display: block;
+  box-sizing: border-box;
+  width: 54.16666667%;
+}
+.ant-col-xs-push-13 {
+  left: 54.16666667%;
+}
+.ant-col-xs-pull-13 {
+  right: 54.16666667%;
+}
+.ant-col-xs-offset-13 {
+  margin-left: 54.16666667%;
+}
+.ant-col-xs-order-13 {
+  order: 13;
+}
+.ant-col-xs-12 {
+  display: block;
+  box-sizing: border-box;
+  width: 50%;
+}
+.ant-col-xs-push-12 {
+  left: 50%;
+}
+.ant-col-xs-pull-12 {
+  right: 50%;
+}
+.ant-col-xs-offset-12 {
+  margin-left: 50%;
+}
+.ant-col-xs-order-12 {
+  order: 12;
+}
+.ant-col-xs-11 {
+  display: block;
+  box-sizing: border-box;
+  width: 45.83333333%;
+}
+.ant-col-xs-push-11 {
+  left: 45.83333333%;
+}
+.ant-col-xs-pull-11 {
+  right: 45.83333333%;
+}
+.ant-col-xs-offset-11 {
+  margin-left: 45.83333333%;
+}
+.ant-col-xs-order-11 {
+  order: 11;
+}
+.ant-col-xs-10 {
+  display: block;
+  box-sizing: border-box;
+  width: 41.66666667%;
+}
+.ant-col-xs-push-10 {
+  left: 41.66666667%;
+}
+.ant-col-xs-pull-10 {
+  right: 41.66666667%;
+}
+.ant-col-xs-offset-10 {
+  margin-left: 41.66666667%;
+}
+.ant-col-xs-order-10 {
+  order: 10;
+}
+.ant-col-xs-9 {
+  display: block;
+  box-sizing: border-box;
+  width: 37.5%;
+}
+.ant-col-xs-push-9 {
+  left: 37.5%;
+}
+.ant-col-xs-pull-9 {
+  right: 37.5%;
+}
+.ant-col-xs-offset-9 {
+  margin-left: 37.5%;
+}
+.ant-col-xs-order-9 {
+  order: 9;
+}
+.ant-col-xs-8 {
+  display: block;
+  box-sizing: border-box;
+  width: 33.33333333%;
+}
+.ant-col-xs-push-8 {
+  left: 33.33333333%;
+}
+.ant-col-xs-pull-8 {
+  right: 33.33333333%;
+}
+.ant-col-xs-offset-8 {
+  margin-left: 33.33333333%;
+}
+.ant-col-xs-order-8 {
+  order: 8;
+}
+.ant-col-xs-7 {
+  display: block;
+  box-sizing: border-box;
+  width: 29.16666667%;
+}
+.ant-col-xs-push-7 {
+  left: 29.16666667%;
+}
+.ant-col-xs-pull-7 {
+  right: 29.16666667%;
+}
+.ant-col-xs-offset-7 {
+  margin-left: 29.16666667%;
+}
+.ant-col-xs-order-7 {
+  order: 7;
+}
+.ant-col-xs-6 {
+  display: block;
+  box-sizing: border-box;
+  width: 25%;
+}
+.ant-col-xs-push-6 {
+  left: 25%;
+}
+.ant-col-xs-pull-6 {
+  right: 25%;
+}
+.ant-col-xs-offset-6 {
+  margin-left: 25%;
+}
+.ant-col-xs-order-6 {
+  order: 6;
+}
+.ant-col-xs-5 {
+  display: block;
+  box-sizing: border-box;
+  width: 20.83333333%;
+}
+.ant-col-xs-push-5 {
+  left: 20.83333333%;
+}
+.ant-col-xs-pull-5 {
+  right: 20.83333333%;
+}
+.ant-col-xs-offset-5 {
+  margin-left: 20.83333333%;
+}
+.ant-col-xs-order-5 {
+  order: 5;
+}
+.ant-col-xs-4 {
+  display: block;
+  box-sizing: border-box;
+  width: 16.66666667%;
+}
+.ant-col-xs-push-4 {
+  left: 16.66666667%;
+}
+.ant-col-xs-pull-4 {
+  right: 16.66666667%;
+}
+.ant-col-xs-offset-4 {
+  margin-left: 16.66666667%;
+}
+.ant-col-xs-order-4 {
+  order: 4;
+}
+.ant-col-xs-3 {
+  display: block;
+  box-sizing: border-box;
+  width: 12.5%;
+}
+.ant-col-xs-push-3 {
+  left: 12.5%;
+}
+.ant-col-xs-pull-3 {
+  right: 12.5%;
+}
+.ant-col-xs-offset-3 {
+  margin-left: 12.5%;
+}
+.ant-col-xs-order-3 {
+  order: 3;
+}
+.ant-col-xs-2 {
+  display: block;
+  box-sizing: border-box;
+  width: 8.33333333%;
+}
+.ant-col-xs-push-2 {
+  left: 8.33333333%;
+}
+.ant-col-xs-pull-2 {
+  right: 8.33333333%;
+}
+.ant-col-xs-offset-2 {
+  margin-left: 8.33333333%;
+}
+.ant-col-xs-order-2 {
+  order: 2;
+}
+.ant-col-xs-1 {
+  display: block;
+  box-sizing: border-box;
+  width: 4.16666667%;
+}
+.ant-col-xs-push-1 {
+  left: 4.16666667%;
+}
+.ant-col-xs-pull-1 {
+  right: 4.16666667%;
+}
+.ant-col-xs-offset-1 {
+  margin-left: 4.16666667%;
+}
+.ant-col-xs-order-1 {
+  order: 1;
+}
+.ant-col-xs-0 {
+  display: none;
+}
+.ant-col-push-0 {
+  left: auto;
+}
+.ant-col-pull-0 {
+  right: auto;
+}
+.ant-col-xs-push-0 {
+  left: auto;
+}
+.ant-col-xs-pull-0 {
+  right: auto;
+}
+.ant-col-xs-offset-0 {
+  margin-left: 0;
+}
+.ant-col-xs-order-0 {
+  order: 0;
+}
+@media (min-width: 576px) {
+  .ant-col-sm-1, .ant-col-sm-2, .ant-col-sm-3, .ant-col-sm-4, .ant-col-sm-5, .ant-col-sm-6, .ant-col-sm-7, .ant-col-sm-8, .ant-col-sm-9, .ant-col-sm-10, .ant-col-sm-11, .ant-col-sm-12, .ant-col-sm-13, .ant-col-sm-14, .ant-col-sm-15, .ant-col-sm-16, .ant-col-sm-17, .ant-col-sm-18, .ant-col-sm-19, .ant-col-sm-20, .ant-col-sm-21, .ant-col-sm-22, .ant-col-sm-23, .ant-col-sm-24 {
+    float: left;
+    flex: 0 0 auto;
+  }
+  .ant-col-sm-24 {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  .ant-col-sm-push-24 {
+    left: 100%;
+  }
+  .ant-col-sm-pull-24 {
+    right: 100%;
+  }
+  .ant-col-sm-offset-24 {
+    margin-left: 100%;
+  }
+  .ant-col-sm-order-24 {
+    order: 24;
+  }
+  .ant-col-sm-23 {
+    display: block;
+    box-sizing: border-box;
+    width: 95.83333333%;
+  }
+  .ant-col-sm-push-23 {
+    left: 95.83333333%;
+  }
+  .ant-col-sm-pull-23 {
+    right: 95.83333333%;
+  }
+  .ant-col-sm-offset-23 {
+    margin-left: 95.83333333%;
+  }
+  .ant-col-sm-order-23 {
+    order: 23;
+  }
+  .ant-col-sm-22 {
+    display: block;
+    box-sizing: border-box;
+    width: 91.66666667%;
+  }
+  .ant-col-sm-push-22 {
+    left: 91.66666667%;
+  }
+  .ant-col-sm-pull-22 {
+    right: 91.66666667%;
+  }
+  .ant-col-sm-offset-22 {
+    margin-left: 91.66666667%;
+  }
+  .ant-col-sm-order-22 {
+    order: 22;
+  }
+  .ant-col-sm-21 {
+    display: block;
+    box-sizing: border-box;
+    width: 87.5%;
+  }
+  .ant-col-sm-push-21 {
+    left: 87.5%;
+  }
+  .ant-col-sm-pull-21 {
+    right: 87.5%;
+  }
+  .ant-col-sm-offset-21 {
+    margin-left: 87.5%;
+  }
+  .ant-col-sm-order-21 {
+    order: 21;
+  }
+  .ant-col-sm-20 {
+    display: block;
+    box-sizing: border-box;
+    width: 83.33333333%;
+  }
+  .ant-col-sm-push-20 {
+    left: 83.33333333%;
+  }
+  .ant-col-sm-pull-20 {
+    right: 83.33333333%;
+  }
+  .ant-col-sm-offset-20 {
+    margin-left: 83.33333333%;
+  }
+  .ant-col-sm-order-20 {
+    order: 20;
+  }
+  .ant-col-sm-19 {
+    display: block;
+    box-sizing: border-box;
+    width: 79.16666667%;
+  }
+  .ant-col-sm-push-19 {
+    left: 79.16666667%;
+  }
+  .ant-col-sm-pull-19 {
+    right: 79.16666667%;
+  }
+  .ant-col-sm-offset-19 {
+    margin-left: 79.16666667%;
+  }
+  .ant-col-sm-order-19 {
+    order: 19;
+  }
+  .ant-col-sm-18 {
+    display: block;
+    box-sizing: border-box;
+    width: 75%;
+  }
+  .ant-col-sm-push-18 {
+    left: 75%;
+  }
+  .ant-col-sm-pull-18 {
+    right: 75%;
+  }
+  .ant-col-sm-offset-18 {
+    margin-left: 75%;
+  }
+  .ant-col-sm-order-18 {
+    order: 18;
+  }
+  .ant-col-sm-17 {
+    display: block;
+    box-sizing: border-box;
+    width: 70.83333333%;
+  }
+  .ant-col-sm-push-17 {
+    left: 70.83333333%;
+  }
+  .ant-col-sm-pull-17 {
+    right: 70.83333333%;
+  }
+  .ant-col-sm-offset-17 {
+    margin-left: 70.83333333%;
+  }
+  .ant-col-sm-order-17 {
+    order: 17;
+  }
+  .ant-col-sm-16 {
+    display: block;
+    box-sizing: border-box;
+    width: 66.66666667%;
+  }
+  .ant-col-sm-push-16 {
+    left: 66.66666667%;
+  }
+  .ant-col-sm-pull-16 {
+    right: 66.66666667%;
+  }
+  .ant-col-sm-offset-16 {
+    margin-left: 66.66666667%;
+  }
+  .ant-col-sm-order-16 {
+    order: 16;
+  }
+  .ant-col-sm-15 {
+    display: block;
+    box-sizing: border-box;
+    width: 62.5%;
+  }
+  .ant-col-sm-push-15 {
+    left: 62.5%;
+  }
+  .ant-col-sm-pull-15 {
+    right: 62.5%;
+  }
+  .ant-col-sm-offset-15 {
+    margin-left: 62.5%;
+  }
+  .ant-col-sm-order-15 {
+    order: 15;
+  }
+  .ant-col-sm-14 {
+    display: block;
+    box-sizing: border-box;
+    width: 58.33333333%;
+  }
+  .ant-col-sm-push-14 {
+    left: 58.33333333%;
+  }
+  .ant-col-sm-pull-14 {
+    right: 58.33333333%;
+  }
+  .ant-col-sm-offset-14 {
+    margin-left: 58.33333333%;
+  }
+  .ant-col-sm-order-14 {
+    order: 14;
+  }
+  .ant-col-sm-13 {
+    display: block;
+    box-sizing: border-box;
+    width: 54.16666667%;
+  }
+  .ant-col-sm-push-13 {
+    left: 54.16666667%;
+  }
+  .ant-col-sm-pull-13 {
+    right: 54.16666667%;
+  }
+  .ant-col-sm-offset-13 {
+    margin-left: 54.16666667%;
+  }
+  .ant-col-sm-order-13 {
+    order: 13;
+  }
+  .ant-col-sm-12 {
+    display: block;
+    box-sizing: border-box;
+    width: 50%;
+  }
+  .ant-col-sm-push-12 {
+    left: 50%;
+  }
+  .ant-col-sm-pull-12 {
+    right: 50%;
+  }
+  .ant-col-sm-offset-12 {
+    margin-left: 50%;
+  }
+  .ant-col-sm-order-12 {
+    order: 12;
+  }
+  .ant-col-sm-11 {
+    display: block;
+    box-sizing: border-box;
+    width: 45.83333333%;
+  }
+  .ant-col-sm-push-11 {
+    left: 45.83333333%;
+  }
+  .ant-col-sm-pull-11 {
+    right: 45.83333333%;
+  }
+  .ant-col-sm-offset-11 {
+    margin-left: 45.83333333%;
+  }
+  .ant-col-sm-order-11 {
+    order: 11;
+  }
+  .ant-col-sm-10 {
+    display: block;
+    box-sizing: border-box;
+    width: 41.66666667%;
+  }
+  .ant-col-sm-push-10 {
+    left: 41.66666667%;
+  }
+  .ant-col-sm-pull-10 {
+    right: 41.66666667%;
+  }
+  .ant-col-sm-offset-10 {
+    margin-left: 41.66666667%;
+  }
+  .ant-col-sm-order-10 {
+    order: 10;
+  }
+  .ant-col-sm-9 {
+    display: block;
+    box-sizing: border-box;
+    width: 37.5%;
+  }
+  .ant-col-sm-push-9 {
+    left: 37.5%;
+  }
+  .ant-col-sm-pull-9 {
+    right: 37.5%;
+  }
+  .ant-col-sm-offset-9 {
+    margin-left: 37.5%;
+  }
+  .ant-col-sm-order-9 {
+    order: 9;
+  }
+  .ant-col-sm-8 {
+    display: block;
+    box-sizing: border-box;
+    width: 33.33333333%;
+  }
+  .ant-col-sm-push-8 {
+    left: 33.33333333%;
+  }
+  .ant-col-sm-pull-8 {
+    right: 33.33333333%;
+  }
+  .ant-col-sm-offset-8 {
+    margin-left: 33.33333333%;
+  }
+  .ant-col-sm-order-8 {
+    order: 8;
+  }
+  .ant-col-sm-7 {
+    display: block;
+    box-sizing: border-box;
+    width: 29.16666667%;
+  }
+  .ant-col-sm-push-7 {
+    left: 29.16666667%;
+  }
+  .ant-col-sm-pull-7 {
+    right: 29.16666667%;
+  }
+  .ant-col-sm-offset-7 {
+    margin-left: 29.16666667%;
+  }
+  .ant-col-sm-order-7 {
+    order: 7;
+  }
+  .ant-col-sm-6 {
+    display: block;
+    box-sizing: border-box;
+    width: 25%;
+  }
+  .ant-col-sm-push-6 {
+    left: 25%;
+  }
+  .ant-col-sm-pull-6 {
+    right: 25%;
+  }
+  .ant-col-sm-offset-6 {
+    margin-left: 25%;
+  }
+  .ant-col-sm-order-6 {
+    order: 6;
+  }
+  .ant-col-sm-5 {
+    display: block;
+    box-sizing: border-box;
+    width: 20.83333333%;
+  }
+  .ant-col-sm-push-5 {
+    left: 20.83333333%;
+  }
+  .ant-col-sm-pull-5 {
+    right: 20.83333333%;
+  }
+  .ant-col-sm-offset-5 {
+    margin-left: 20.83333333%;
+  }
+  .ant-col-sm-order-5 {
+    order: 5;
+  }
+  .ant-col-sm-4 {
+    display: block;
+    box-sizing: border-box;
+    width: 16.66666667%;
+  }
+  .ant-col-sm-push-4 {
+    left: 16.66666667%;
+  }
+  .ant-col-sm-pull-4 {
+    right: 16.66666667%;
+  }
+  .ant-col-sm-offset-4 {
+    margin-left: 16.66666667%;
+  }
+  .ant-col-sm-order-4 {
+    order: 4;
+  }
+  .ant-col-sm-3 {
+    display: block;
+    box-sizing: border-box;
+    width: 12.5%;
+  }
+  .ant-col-sm-push-3 {
+    left: 12.5%;
+  }
+  .ant-col-sm-pull-3 {
+    right: 12.5%;
+  }
+  .ant-col-sm-offset-3 {
+    margin-left: 12.5%;
+  }
+  .ant-col-sm-order-3 {
+    order: 3;
+  }
+  .ant-col-sm-2 {
+    display: block;
+    box-sizing: border-box;
+    width: 8.33333333%;
+  }
+  .ant-col-sm-push-2 {
+    left: 8.33333333%;
+  }
+  .ant-col-sm-pull-2 {
+    right: 8.33333333%;
+  }
+  .ant-col-sm-offset-2 {
+    margin-left: 8.33333333%;
+  }
+  .ant-col-sm-order-2 {
+    order: 2;
+  }
+  .ant-col-sm-1 {
+    display: block;
+    box-sizing: border-box;
+    width: 4.16666667%;
+  }
+  .ant-col-sm-push-1 {
+    left: 4.16666667%;
+  }
+  .ant-col-sm-pull-1 {
+    right: 4.16666667%;
+  }
+  .ant-col-sm-offset-1 {
+    margin-left: 4.16666667%;
+  }
+  .ant-col-sm-order-1 {
+    order: 1;
+  }
+  .ant-col-sm-0 {
+    display: none;
+  }
+  .ant-col-push-0 {
+    left: auto;
+  }
+  .ant-col-pull-0 {
+    right: auto;
+  }
+  .ant-col-sm-push-0 {
+    left: auto;
+  }
+  .ant-col-sm-pull-0 {
+    right: auto;
+  }
+  .ant-col-sm-offset-0 {
+    margin-left: 0;
+  }
+  .ant-col-sm-order-0 {
+    order: 0;
+  }
+}
+@media (min-width: 768px) {
+  .ant-col-md-1, .ant-col-md-2, .ant-col-md-3, .ant-col-md-4, .ant-col-md-5, .ant-col-md-6, .ant-col-md-7, .ant-col-md-8, .ant-col-md-9, .ant-col-md-10, .ant-col-md-11, .ant-col-md-12, .ant-col-md-13, .ant-col-md-14, .ant-col-md-15, .ant-col-md-16, .ant-col-md-17, .ant-col-md-18, .ant-col-md-19, .ant-col-md-20, .ant-col-md-21, .ant-col-md-22, .ant-col-md-23, .ant-col-md-24 {
+    float: left;
+    flex: 0 0 auto;
+  }
+  .ant-col-md-24 {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  .ant-col-md-push-24 {
+    left: 100%;
+  }
+  .ant-col-md-pull-24 {
+    right: 100%;
+  }
+  .ant-col-md-offset-24 {
+    margin-left: 100%;
+  }
+  .ant-col-md-order-24 {
+    order: 24;
+  }
+  .ant-col-md-23 {
+    display: block;
+    box-sizing: border-box;
+    width: 95.83333333%;
+  }
+  .ant-col-md-push-23 {
+    left: 95.83333333%;
+  }
+  .ant-col-md-pull-23 {
+    right: 95.83333333%;
+  }
+  .ant-col-md-offset-23 {
+    margin-left: 95.83333333%;
+  }
+  .ant-col-md-order-23 {
+    order: 23;
+  }
+  .ant-col-md-22 {
+    display: block;
+    box-sizing: border-box;
+    width: 91.66666667%;
+  }
+  .ant-col-md-push-22 {
+    left: 91.66666667%;
+  }
+  .ant-col-md-pull-22 {
+    right: 91.66666667%;
+  }
+  .ant-col-md-offset-22 {
+    margin-left: 91.66666667%;
+  }
+  .ant-col-md-order-22 {
+    order: 22;
+  }
+  .ant-col-md-21 {
+    display: block;
+    box-sizing: border-box;
+    width: 87.5%;
+  }
+  .ant-col-md-push-21 {
+    left: 87.5%;
+  }
+  .ant-col-md-pull-21 {
+    right: 87.5%;
+  }
+  .ant-col-md-offset-21 {
+    margin-left: 87.5%;
+  }
+  .ant-col-md-order-21 {
+    order: 21;
+  }
+  .ant-col-md-20 {
+    display: block;
+    box-sizing: border-box;
+    width: 83.33333333%;
+  }
+  .ant-col-md-push-20 {
+    left: 83.33333333%;
+  }
+  .ant-col-md-pull-20 {
+    right: 83.33333333%;
+  }
+  .ant-col-md-offset-20 {
+    margin-left: 83.33333333%;
+  }
+  .ant-col-md-order-20 {
+    order: 20;
+  }
+  .ant-col-md-19 {
+    display: block;
+    box-sizing: border-box;
+    width: 79.16666667%;
+  }
+  .ant-col-md-push-19 {
+    left: 79.16666667%;
+  }
+  .ant-col-md-pull-19 {
+    right: 79.16666667%;
+  }
+  .ant-col-md-offset-19 {
+    margin-left: 79.16666667%;
+  }
+  .ant-col-md-order-19 {
+    order: 19;
+  }
+  .ant-col-md-18 {
+    display: block;
+    box-sizing: border-box;
+    width: 75%;
+  }
+  .ant-col-md-push-18 {
+    left: 75%;
+  }
+  .ant-col-md-pull-18 {
+    right: 75%;
+  }
+  .ant-col-md-offset-18 {
+    margin-left: 75%;
+  }
+  .ant-col-md-order-18 {
+    order: 18;
+  }
+  .ant-col-md-17 {
+    display: block;
+    box-sizing: border-box;
+    width: 70.83333333%;
+  }
+  .ant-col-md-push-17 {
+    left: 70.83333333%;
+  }
+  .ant-col-md-pull-17 {
+    right: 70.83333333%;
+  }
+  .ant-col-md-offset-17 {
+    margin-left: 70.83333333%;
+  }
+  .ant-col-md-order-17 {
+    order: 17;
+  }
+  .ant-col-md-16 {
+    display: block;
+    box-sizing: border-box;
+    width: 66.66666667%;
+  }
+  .ant-col-md-push-16 {
+    left: 66.66666667%;
+  }
+  .ant-col-md-pull-16 {
+    right: 66.66666667%;
+  }
+  .ant-col-md-offset-16 {
+    margin-left: 66.66666667%;
+  }
+  .ant-col-md-order-16 {
+    order: 16;
+  }
+  .ant-col-md-15 {
+    display: block;
+    box-sizing: border-box;
+    width: 62.5%;
+  }
+  .ant-col-md-push-15 {
+    left: 62.5%;
+  }
+  .ant-col-md-pull-15 {
+    right: 62.5%;
+  }
+  .ant-col-md-offset-15 {
+    margin-left: 62.5%;
+  }
+  .ant-col-md-order-15 {
+    order: 15;
+  }
+  .ant-col-md-14 {
+    display: block;
+    box-sizing: border-box;
+    width: 58.33333333%;
+  }
+  .ant-col-md-push-14 {
+    left: 58.33333333%;
+  }
+  .ant-col-md-pull-14 {
+    right: 58.33333333%;
+  }
+  .ant-col-md-offset-14 {
+    margin-left: 58.33333333%;
+  }
+  .ant-col-md-order-14 {
+    order: 14;
+  }
+  .ant-col-md-13 {
+    display: block;
+    box-sizing: border-box;
+    width: 54.16666667%;
+  }
+  .ant-col-md-push-13 {
+    left: 54.16666667%;
+  }
+  .ant-col-md-pull-13 {
+    right: 54.16666667%;
+  }
+  .ant-col-md-offset-13 {
+    margin-left: 54.16666667%;
+  }
+  .ant-col-md-order-13 {
+    order: 13;
+  }
+  .ant-col-md-12 {
+    display: block;
+    box-sizing: border-box;
+    width: 50%;
+  }
+  .ant-col-md-push-12 {
+    left: 50%;
+  }
+  .ant-col-md-pull-12 {
+    right: 50%;
+  }
+  .ant-col-md-offset-12 {
+    margin-left: 50%;
+  }
+  .ant-col-md-order-12 {
+    order: 12;
+  }
+  .ant-col-md-11 {
+    display: block;
+    box-sizing: border-box;
+    width: 45.83333333%;
+  }
+  .ant-col-md-push-11 {
+    left: 45.83333333%;
+  }
+  .ant-col-md-pull-11 {
+    right: 45.83333333%;
+  }
+  .ant-col-md-offset-11 {
+    margin-left: 45.83333333%;
+  }
+  .ant-col-md-order-11 {
+    order: 11;
+  }
+  .ant-col-md-10 {
+    display: block;
+    box-sizing: border-box;
+    width: 41.66666667%;
+  }
+  .ant-col-md-push-10 {
+    left: 41.66666667%;
+  }
+  .ant-col-md-pull-10 {
+    right: 41.66666667%;
+  }
+  .ant-col-md-offset-10 {
+    margin-left: 41.66666667%;
+  }
+  .ant-col-md-order-10 {
+    order: 10;
+  }
+  .ant-col-md-9 {
+    display: block;
+    box-sizing: border-box;
+    width: 37.5%;
+  }
+  .ant-col-md-push-9 {
+    left: 37.5%;
+  }
+  .ant-col-md-pull-9 {
+    right: 37.5%;
+  }
+  .ant-col-md-offset-9 {
+    margin-left: 37.5%;
+  }
+  .ant-col-md-order-9 {
+    order: 9;
+  }
+  .ant-col-md-8 {
+    display: block;
+    box-sizing: border-box;
+    width: 33.33333333%;
+  }
+  .ant-col-md-push-8 {
+    left: 33.33333333%;
+  }
+  .ant-col-md-pull-8 {
+    right: 33.33333333%;
+  }
+  .ant-col-md-offset-8 {
+    margin-left: 33.33333333%;
+  }
+  .ant-col-md-order-8 {
+    order: 8;
+  }
+  .ant-col-md-7 {
+    display: block;
+    box-sizing: border-box;
+    width: 29.16666667%;
+  }
+  .ant-col-md-push-7 {
+    left: 29.16666667%;
+  }
+  .ant-col-md-pull-7 {
+    right: 29.16666667%;
+  }
+  .ant-col-md-offset-7 {
+    margin-left: 29.16666667%;
+  }
+  .ant-col-md-order-7 {
+    order: 7;
+  }
+  .ant-col-md-6 {
+    display: block;
+    box-sizing: border-box;
+    width: 25%;
+  }
+  .ant-col-md-push-6 {
+    left: 25%;
+  }
+  .ant-col-md-pull-6 {
+    right: 25%;
+  }
+  .ant-col-md-offset-6 {
+    margin-left: 25%;
+  }
+  .ant-col-md-order-6 {
+    order: 6;
+  }
+  .ant-col-md-5 {
+    display: block;
+    box-sizing: border-box;
+    width: 20.83333333%;
+  }
+  .ant-col-md-push-5 {
+    left: 20.83333333%;
+  }
+  .ant-col-md-pull-5 {
+    right: 20.83333333%;
+  }
+  .ant-col-md-offset-5 {
+    margin-left: 20.83333333%;
+  }
+  .ant-col-md-order-5 {
+    order: 5;
+  }
+  .ant-col-md-4 {
+    display: block;
+    box-sizing: border-box;
+    width: 16.66666667%;
+  }
+  .ant-col-md-push-4 {
+    left: 16.66666667%;
+  }
+  .ant-col-md-pull-4 {
+    right: 16.66666667%;
+  }
+  .ant-col-md-offset-4 {
+    margin-left: 16.66666667%;
+  }
+  .ant-col-md-order-4 {
+    order: 4;
+  }
+  .ant-col-md-3 {
+    display: block;
+    box-sizing: border-box;
+    width: 12.5%;
+  }
+  .ant-col-md-push-3 {
+    left: 12.5%;
+  }
+  .ant-col-md-pull-3 {
+    right: 12.5%;
+  }
+  .ant-col-md-offset-3 {
+    margin-left: 12.5%;
+  }
+  .ant-col-md-order-3 {
+    order: 3;
+  }
+  .ant-col-md-2 {
+    display: block;
+    box-sizing: border-box;
+    width: 8.33333333%;
+  }
+  .ant-col-md-push-2 {
+    left: 8.33333333%;
+  }
+  .ant-col-md-pull-2 {
+    right: 8.33333333%;
+  }
+  .ant-col-md-offset-2 {
+    margin-left: 8.33333333%;
+  }
+  .ant-col-md-order-2 {
+    order: 2;
+  }
+  .ant-col-md-1 {
+    display: block;
+    box-sizing: border-box;
+    width: 4.16666667%;
+  }
+  .ant-col-md-push-1 {
+    left: 4.16666667%;
+  }
+  .ant-col-md-pull-1 {
+    right: 4.16666667%;
+  }
+  .ant-col-md-offset-1 {
+    margin-left: 4.16666667%;
+  }
+  .ant-col-md-order-1 {
+    order: 1;
+  }
+  .ant-col-md-0 {
+    display: none;
+  }
+  .ant-col-push-0 {
+    left: auto;
+  }
+  .ant-col-pull-0 {
+    right: auto;
+  }
+  .ant-col-md-push-0 {
+    left: auto;
+  }
+  .ant-col-md-pull-0 {
+    right: auto;
+  }
+  .ant-col-md-offset-0 {
+    margin-left: 0;
+  }
+  .ant-col-md-order-0 {
+    order: 0;
+  }
+}
+@media (min-width: 992px) {
+  .ant-col-lg-1, .ant-col-lg-2, .ant-col-lg-3, .ant-col-lg-4, .ant-col-lg-5, .ant-col-lg-6, .ant-col-lg-7, .ant-col-lg-8, .ant-col-lg-9, .ant-col-lg-10, .ant-col-lg-11, .ant-col-lg-12, .ant-col-lg-13, .ant-col-lg-14, .ant-col-lg-15, .ant-col-lg-16, .ant-col-lg-17, .ant-col-lg-18, .ant-col-lg-19, .ant-col-lg-20, .ant-col-lg-21, .ant-col-lg-22, .ant-col-lg-23, .ant-col-lg-24 {
+    float: left;
+    flex: 0 0 auto;
+  }
+  .ant-col-lg-24 {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  .ant-col-lg-push-24 {
+    left: 100%;
+  }
+  .ant-col-lg-pull-24 {
+    right: 100%;
+  }
+  .ant-col-lg-offset-24 {
+    margin-left: 100%;
+  }
+  .ant-col-lg-order-24 {
+    order: 24;
+  }
+  .ant-col-lg-23 {
+    display: block;
+    box-sizing: border-box;
+    width: 95.83333333%;
+  }
+  .ant-col-lg-push-23 {
+    left: 95.83333333%;
+  }
+  .ant-col-lg-pull-23 {
+    right: 95.83333333%;
+  }
+  .ant-col-lg-offset-23 {
+    margin-left: 95.83333333%;
+  }
+  .ant-col-lg-order-23 {
+    order: 23;
+  }
+  .ant-col-lg-22 {
+    display: block;
+    box-sizing: border-box;
+    width: 91.66666667%;
+  }
+  .ant-col-lg-push-22 {
+    left: 91.66666667%;
+  }
+  .ant-col-lg-pull-22 {
+    right: 91.66666667%;
+  }
+  .ant-col-lg-offset-22 {
+    margin-left: 91.66666667%;
+  }
+  .ant-col-lg-order-22 {
+    order: 22;
+  }
+  .ant-col-lg-21 {
+    display: block;
+    box-sizing: border-box;
+    width: 87.5%;
+  }
+  .ant-col-lg-push-21 {
+    left: 87.5%;
+  }
+  .ant-col-lg-pull-21 {
+    right: 87.5%;
+  }
+  .ant-col-lg-offset-21 {
+    margin-left: 87.5%;
+  }
+  .ant-col-lg-order-21 {
+    order: 21;
+  }
+  .ant-col-lg-20 {
+    display: block;
+    box-sizing: border-box;
+    width: 83.33333333%;
+  }
+  .ant-col-lg-push-20 {
+    left: 83.33333333%;
+  }
+  .ant-col-lg-pull-20 {
+    right: 83.33333333%;
+  }
+  .ant-col-lg-offset-20 {
+    margin-left: 83.33333333%;
+  }
+  .ant-col-lg-order-20 {
+    order: 20;
+  }
+  .ant-col-lg-19 {
+    display: block;
+    box-sizing: border-box;
+    width: 79.16666667%;
+  }
+  .ant-col-lg-push-19 {
+    left: 79.16666667%;
+  }
+  .ant-col-lg-pull-19 {
+    right: 79.16666667%;
+  }
+  .ant-col-lg-offset-19 {
+    margin-left: 79.16666667%;
+  }
+  .ant-col-lg-order-19 {
+    order: 19;
+  }
+  .ant-col-lg-18 {
+    display: block;
+    box-sizing: border-box;
+    width: 75%;
+  }
+  .ant-col-lg-push-18 {
+    left: 75%;
+  }
+  .ant-col-lg-pull-18 {
+    right: 75%;
+  }
+  .ant-col-lg-offset-18 {
+    margin-left: 75%;
+  }
+  .ant-col-lg-order-18 {
+    order: 18;
+  }
+  .ant-col-lg-17 {
+    display: block;
+    box-sizing: border-box;
+    width: 70.83333333%;
+  }
+  .ant-col-lg-push-17 {
+    left: 70.83333333%;
+  }
+  .ant-col-lg-pull-17 {
+    right: 70.83333333%;
+  }
+  .ant-col-lg-offset-17 {
+    margin-left: 70.83333333%;
+  }
+  .ant-col-lg-order-17 {
+    order: 17;
+  }
+  .ant-col-lg-16 {
+    display: block;
+    box-sizing: border-box;
+    width: 66.66666667%;
+  }
+  .ant-col-lg-push-16 {
+    left: 66.66666667%;
+  }
+  .ant-col-lg-pull-16 {
+    right: 66.66666667%;
+  }
+  .ant-col-lg-offset-16 {
+    margin-left: 66.66666667%;
+  }
+  .ant-col-lg-order-16 {
+    order: 16;
+  }
+  .ant-col-lg-15 {
+    display: block;
+    box-sizing: border-box;
+    width: 62.5%;
+  }
+  .ant-col-lg-push-15 {
+    left: 62.5%;
+  }
+  .ant-col-lg-pull-15 {
+    right: 62.5%;
+  }
+  .ant-col-lg-offset-15 {
+    margin-left: 62.5%;
+  }
+  .ant-col-lg-order-15 {
+    order: 15;
+  }
+  .ant-col-lg-14 {
+    display: block;
+    box-sizing: border-box;
+    width: 58.33333333%;
+  }
+  .ant-col-lg-push-14 {
+    left: 58.33333333%;
+  }
+  .ant-col-lg-pull-14 {
+    right: 58.33333333%;
+  }
+  .ant-col-lg-offset-14 {
+    margin-left: 58.33333333%;
+  }
+  .ant-col-lg-order-14 {
+    order: 14;
+  }
+  .ant-col-lg-13 {
+    display: block;
+    box-sizing: border-box;
+    width: 54.16666667%;
+  }
+  .ant-col-lg-push-13 {
+    left: 54.16666667%;
+  }
+  .ant-col-lg-pull-13 {
+    right: 54.16666667%;
+  }
+  .ant-col-lg-offset-13 {
+    margin-left: 54.16666667%;
+  }
+  .ant-col-lg-order-13 {
+    order: 13;
+  }
+  .ant-col-lg-12 {
+    display: block;
+    box-sizing: border-box;
+    width: 50%;
+  }
+  .ant-col-lg-push-12 {
+    left: 50%;
+  }
+  .ant-col-lg-pull-12 {
+    right: 50%;
+  }
+  .ant-col-lg-offset-12 {
+    margin-left: 50%;
+  }
+  .ant-col-lg-order-12 {
+    order: 12;
+  }
+  .ant-col-lg-11 {
+    display: block;
+    box-sizing: border-box;
+    width: 45.83333333%;
+  }
+  .ant-col-lg-push-11 {
+    left: 45.83333333%;
+  }
+  .ant-col-lg-pull-11 {
+    right: 45.83333333%;
+  }
+  .ant-col-lg-offset-11 {
+    margin-left: 45.83333333%;
+  }
+  .ant-col-lg-order-11 {
+    order: 11;
+  }
+  .ant-col-lg-10 {
+    display: block;
+    box-sizing: border-box;
+    width: 41.66666667%;
+  }
+  .ant-col-lg-push-10 {
+    left: 41.66666667%;
+  }
+  .ant-col-lg-pull-10 {
+    right: 41.66666667%;
+  }
+  .ant-col-lg-offset-10 {
+    margin-left: 41.66666667%;
+  }
+  .ant-col-lg-order-10 {
+    order: 10;
+  }
+  .ant-col-lg-9 {
+    display: block;
+    box-sizing: border-box;
+    width: 37.5%;
+  }
+  .ant-col-lg-push-9 {
+    left: 37.5%;
+  }
+  .ant-col-lg-pull-9 {
+    right: 37.5%;
+  }
+  .ant-col-lg-offset-9 {
+    margin-left: 37.5%;
+  }
+  .ant-col-lg-order-9 {
+    order: 9;
+  }
+  .ant-col-lg-8 {
+    display: block;
+    box-sizing: border-box;
+    width: 33.33333333%;
+  }
+  .ant-col-lg-push-8 {
+    left: 33.33333333%;
+  }
+  .ant-col-lg-pull-8 {
+    right: 33.33333333%;
+  }
+  .ant-col-lg-offset-8 {
+    margin-left: 33.33333333%;
+  }
+  .ant-col-lg-order-8 {
+    order: 8;
+  }
+  .ant-col-lg-7 {
+    display: block;
+    box-sizing: border-box;
+    width: 29.16666667%;
+  }
+  .ant-col-lg-push-7 {
+    left: 29.16666667%;
+  }
+  .ant-col-lg-pull-7 {
+    right: 29.16666667%;
+  }
+  .ant-col-lg-offset-7 {
+    margin-left: 29.16666667%;
+  }
+  .ant-col-lg-order-7 {
+    order: 7;
+  }
+  .ant-col-lg-6 {
+    display: block;
+    box-sizing: border-box;
+    width: 25%;
+  }
+  .ant-col-lg-push-6 {
+    left: 25%;
+  }
+  .ant-col-lg-pull-6 {
+    right: 25%;
+  }
+  .ant-col-lg-offset-6 {
+    margin-left: 25%;
+  }
+  .ant-col-lg-order-6 {
+    order: 6;
+  }
+  .ant-col-lg-5 {
+    display: block;
+    box-sizing: border-box;
+    width: 20.83333333%;
+  }
+  .ant-col-lg-push-5 {
+    left: 20.83333333%;
+  }
+  .ant-col-lg-pull-5 {
+    right: 20.83333333%;
+  }
+  .ant-col-lg-offset-5 {
+    margin-left: 20.83333333%;
+  }
+  .ant-col-lg-order-5 {
+    order: 5;
+  }
+  .ant-col-lg-4 {
+    display: block;
+    box-sizing: border-box;
+    width: 16.66666667%;
+  }
+  .ant-col-lg-push-4 {
+    left: 16.66666667%;
+  }
+  .ant-col-lg-pull-4 {
+    right: 16.66666667%;
+  }
+  .ant-col-lg-offset-4 {
+    margin-left: 16.66666667%;
+  }
+  .ant-col-lg-order-4 {
+    order: 4;
+  }
+  .ant-col-lg-3 {
+    display: block;
+    box-sizing: border-box;
+    width: 12.5%;
+  }
+  .ant-col-lg-push-3 {
+    left: 12.5%;
+  }
+  .ant-col-lg-pull-3 {
+    right: 12.5%;
+  }
+  .ant-col-lg-offset-3 {
+    margin-left: 12.5%;
+  }
+  .ant-col-lg-order-3 {
+    order: 3;
+  }
+  .ant-col-lg-2 {
+    display: block;
+    box-sizing: border-box;
+    width: 8.33333333%;
+  }
+  .ant-col-lg-push-2 {
+    left: 8.33333333%;
+  }
+  .ant-col-lg-pull-2 {
+    right: 8.33333333%;
+  }
+  .ant-col-lg-offset-2 {
+    margin-left: 8.33333333%;
+  }
+  .ant-col-lg-order-2 {
+    order: 2;
+  }
+  .ant-col-lg-1 {
+    display: block;
+    box-sizing: border-box;
+    width: 4.16666667%;
+  }
+  .ant-col-lg-push-1 {
+    left: 4.16666667%;
+  }
+  .ant-col-lg-pull-1 {
+    right: 4.16666667%;
+  }
+  .ant-col-lg-offset-1 {
+    margin-left: 4.16666667%;
+  }
+  .ant-col-lg-order-1 {
+    order: 1;
+  }
+  .ant-col-lg-0 {
+    display: none;
+  }
+  .ant-col-push-0 {
+    left: auto;
+  }
+  .ant-col-pull-0 {
+    right: auto;
+  }
+  .ant-col-lg-push-0 {
+    left: auto;
+  }
+  .ant-col-lg-pull-0 {
+    right: auto;
+  }
+  .ant-col-lg-offset-0 {
+    margin-left: 0;
+  }
+  .ant-col-lg-order-0 {
+    order: 0;
+  }
+}
+@media (min-width: 1200px) {
+  .ant-col-xl-1, .ant-col-xl-2, .ant-col-xl-3, .ant-col-xl-4, .ant-col-xl-5, .ant-col-xl-6, .ant-col-xl-7, .ant-col-xl-8, .ant-col-xl-9, .ant-col-xl-10, .ant-col-xl-11, .ant-col-xl-12, .ant-col-xl-13, .ant-col-xl-14, .ant-col-xl-15, .ant-col-xl-16, .ant-col-xl-17, .ant-col-xl-18, .ant-col-xl-19, .ant-col-xl-20, .ant-col-xl-21, .ant-col-xl-22, .ant-col-xl-23, .ant-col-xl-24 {
+    float: left;
+    flex: 0 0 auto;
+  }
+  .ant-col-xl-24 {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  .ant-col-xl-push-24 {
+    left: 100%;
+  }
+  .ant-col-xl-pull-24 {
+    right: 100%;
+  }
+  .ant-col-xl-offset-24 {
+    margin-left: 100%;
+  }
+  .ant-col-xl-order-24 {
+    order: 24;
+  }
+  .ant-col-xl-23 {
+    display: block;
+    box-sizing: border-box;
+    width: 95.83333333%;
+  }
+  .ant-col-xl-push-23 {
+    left: 95.83333333%;
+  }
+  .ant-col-xl-pull-23 {
+    right: 95.83333333%;
+  }
+  .ant-col-xl-offset-23 {
+    margin-left: 95.83333333%;
+  }
+  .ant-col-xl-order-23 {
+    order: 23;
+  }
+  .ant-col-xl-22 {
+    display: block;
+    box-sizing: border-box;
+    width: 91.66666667%;
+  }
+  .ant-col-xl-push-22 {
+    left: 91.66666667%;
+  }
+  .ant-col-xl-pull-22 {
+    right: 91.66666667%;
+  }
+  .ant-col-xl-offset-22 {
+    margin-left: 91.66666667%;
+  }
+  .ant-col-xl-order-22 {
+    order: 22;
+  }
+  .ant-col-xl-21 {
+    display: block;
+    box-sizing: border-box;
+    width: 87.5%;
+  }
+  .ant-col-xl-push-21 {
+    left: 87.5%;
+  }
+  .ant-col-xl-pull-21 {
+    right: 87.5%;
+  }
+  .ant-col-xl-offset-21 {
+    margin-left: 87.5%;
+  }
+  .ant-col-xl-order-21 {
+    order: 21;
+  }
+  .ant-col-xl-20 {
+    display: block;
+    box-sizing: border-box;
+    width: 83.33333333%;
+  }
+  .ant-col-xl-push-20 {
+    left: 83.33333333%;
+  }
+  .ant-col-xl-pull-20 {
+    right: 83.33333333%;
+  }
+  .ant-col-xl-offset-20 {
+    margin-left: 83.33333333%;
+  }
+  .ant-col-xl-order-20 {
+    order: 20;
+  }
+  .ant-col-xl-19 {
+    display: block;
+    box-sizing: border-box;
+    width: 79.16666667%;
+  }
+  .ant-col-xl-push-19 {
+    left: 79.16666667%;
+  }
+  .ant-col-xl-pull-19 {
+    right: 79.16666667%;
+  }
+  .ant-col-xl-offset-19 {
+    margin-left: 79.16666667%;
+  }
+  .ant-col-xl-order-19 {
+    order: 19;
+  }
+  .ant-col-xl-18 {
+    display: block;
+    box-sizing: border-box;
+    width: 75%;
+  }
+  .ant-col-xl-push-18 {
+    left: 75%;
+  }
+  .ant-col-xl-pull-18 {
+    right: 75%;
+  }
+  .ant-col-xl-offset-18 {
+    margin-left: 75%;
+  }
+  .ant-col-xl-order-18 {
+    order: 18;
+  }
+  .ant-col-xl-17 {
+    display: block;
+    box-sizing: border-box;
+    width: 70.83333333%;
+  }
+  .ant-col-xl-push-17 {
+    left: 70.83333333%;
+  }
+  .ant-col-xl-pull-17 {
+    right: 70.83333333%;
+  }
+  .ant-col-xl-offset-17 {
+    margin-left: 70.83333333%;
+  }
+  .ant-col-xl-order-17 {
+    order: 17;
+  }
+  .ant-col-xl-16 {
+    display: block;
+    box-sizing: border-box;
+    width: 66.66666667%;
+  }
+  .ant-col-xl-push-16 {
+    left: 66.66666667%;
+  }
+  .ant-col-xl-pull-16 {
+    right: 66.66666667%;
+  }
+  .ant-col-xl-offset-16 {
+    margin-left: 66.66666667%;
+  }
+  .ant-col-xl-order-16 {
+    order: 16;
+  }
+  .ant-col-xl-15 {
+    display: block;
+    box-sizing: border-box;
+    width: 62.5%;
+  }
+  .ant-col-xl-push-15 {
+    left: 62.5%;
+  }
+  .ant-col-xl-pull-15 {
+    right: 62.5%;
+  }
+  .ant-col-xl-offset-15 {
+    margin-left: 62.5%;
+  }
+  .ant-col-xl-order-15 {
+    order: 15;
+  }
+  .ant-col-xl-14 {
+    display: block;
+    box-sizing: border-box;
+    width: 58.33333333%;
+  }
+  .ant-col-xl-push-14 {
+    left: 58.33333333%;
+  }
+  .ant-col-xl-pull-14 {
+    right: 58.33333333%;
+  }
+  .ant-col-xl-offset-14 {
+    margin-left: 58.33333333%;
+  }
+  .ant-col-xl-order-14 {
+    order: 14;
+  }
+  .ant-col-xl-13 {
+    display: block;
+    box-sizing: border-box;
+    width: 54.16666667%;
+  }
+  .ant-col-xl-push-13 {
+    left: 54.16666667%;
+  }
+  .ant-col-xl-pull-13 {
+    right: 54.16666667%;
+  }
+  .ant-col-xl-offset-13 {
+    margin-left: 54.16666667%;
+  }
+  .ant-col-xl-order-13 {
+    order: 13;
+  }
+  .ant-col-xl-12 {
+    display: block;
+    box-sizing: border-box;
+    width: 50%;
+  }
+  .ant-col-xl-push-12 {
+    left: 50%;
+  }
+  .ant-col-xl-pull-12 {
+    right: 50%;
+  }
+  .ant-col-xl-offset-12 {
+    margin-left: 50%;
+  }
+  .ant-col-xl-order-12 {
+    order: 12;
+  }
+  .ant-col-xl-11 {
+    display: block;
+    box-sizing: border-box;
+    width: 45.83333333%;
+  }
+  .ant-col-xl-push-11 {
+    left: 45.83333333%;
+  }
+  .ant-col-xl-pull-11 {
+    right: 45.83333333%;
+  }
+  .ant-col-xl-offset-11 {
+    margin-left: 45.83333333%;
+  }
+  .ant-col-xl-order-11 {
+    order: 11;
+  }
+  .ant-col-xl-10 {
+    display: block;
+    box-sizing: border-box;
+    width: 41.66666667%;
+  }
+  .ant-col-xl-push-10 {
+    left: 41.66666667%;
+  }
+  .ant-col-xl-pull-10 {
+    right: 41.66666667%;
+  }
+  .ant-col-xl-offset-10 {
+    margin-left: 41.66666667%;
+  }
+  .ant-col-xl-order-10 {
+    order: 10;
+  }
+  .ant-col-xl-9 {
+    display: block;
+    box-sizing: border-box;
+    width: 37.5%;
+  }
+  .ant-col-xl-push-9 {
+    left: 37.5%;
+  }
+  .ant-col-xl-pull-9 {
+    right: 37.5%;
+  }
+  .ant-col-xl-offset-9 {
+    margin-left: 37.5%;
+  }
+  .ant-col-xl-order-9 {
+    order: 9;
+  }
+  .ant-col-xl-8 {
+    display: block;
+    box-sizing: border-box;
+    width: 33.33333333%;
+  }
+  .ant-col-xl-push-8 {
+    left: 33.33333333%;
+  }
+  .ant-col-xl-pull-8 {
+    right: 33.33333333%;
+  }
+  .ant-col-xl-offset-8 {
+    margin-left: 33.33333333%;
+  }
+  .ant-col-xl-order-8 {
+    order: 8;
+  }
+  .ant-col-xl-7 {
+    display: block;
+    box-sizing: border-box;
+    width: 29.16666667%;
+  }
+  .ant-col-xl-push-7 {
+    left: 29.16666667%;
+  }
+  .ant-col-xl-pull-7 {
+    right: 29.16666667%;
+  }
+  .ant-col-xl-offset-7 {
+    margin-left: 29.16666667%;
+  }
+  .ant-col-xl-order-7 {
+    order: 7;
+  }
+  .ant-col-xl-6 {
+    display: block;
+    box-sizing: border-box;
+    width: 25%;
+  }
+  .ant-col-xl-push-6 {
+    left: 25%;
+  }
+  .ant-col-xl-pull-6 {
+    right: 25%;
+  }
+  .ant-col-xl-offset-6 {
+    margin-left: 25%;
+  }
+  .ant-col-xl-order-6 {
+    order: 6;
+  }
+  .ant-col-xl-5 {
+    display: block;
+    box-sizing: border-box;
+    width: 20.83333333%;
+  }
+  .ant-col-xl-push-5 {
+    left: 20.83333333%;
+  }
+  .ant-col-xl-pull-5 {
+    right: 20.83333333%;
+  }
+  .ant-col-xl-offset-5 {
+    margin-left: 20.83333333%;
+  }
+  .ant-col-xl-order-5 {
+    order: 5;
+  }
+  .ant-col-xl-4 {
+    display: block;
+    box-sizing: border-box;
+    width: 16.66666667%;
+  }
+  .ant-col-xl-push-4 {
+    left: 16.66666667%;
+  }
+  .ant-col-xl-pull-4 {
+    right: 16.66666667%;
+  }
+  .ant-col-xl-offset-4 {
+    margin-left: 16.66666667%;
+  }
+  .ant-col-xl-order-4 {
+    order: 4;
+  }
+  .ant-col-xl-3 {
+    display: block;
+    box-sizing: border-box;
+    width: 12.5%;
+  }
+  .ant-col-xl-push-3 {
+    left: 12.5%;
+  }
+  .ant-col-xl-pull-3 {
+    right: 12.5%;
+  }
+  .ant-col-xl-offset-3 {
+    margin-left: 12.5%;
+  }
+  .ant-col-xl-order-3 {
+    order: 3;
+  }
+  .ant-col-xl-2 {
+    display: block;
+    box-sizing: border-box;
+    width: 8.33333333%;
+  }
+  .ant-col-xl-push-2 {
+    left: 8.33333333%;
+  }
+  .ant-col-xl-pull-2 {
+    right: 8.33333333%;
+  }
+  .ant-col-xl-offset-2 {
+    margin-left: 8.33333333%;
+  }
+  .ant-col-xl-order-2 {
+    order: 2;
+  }
+  .ant-col-xl-1 {
+    display: block;
+    box-sizing: border-box;
+    width: 4.16666667%;
+  }
+  .ant-col-xl-push-1 {
+    left: 4.16666667%;
+  }
+  .ant-col-xl-pull-1 {
+    right: 4.16666667%;
+  }
+  .ant-col-xl-offset-1 {
+    margin-left: 4.16666667%;
+  }
+  .ant-col-xl-order-1 {
+    order: 1;
+  }
+  .ant-col-xl-0 {
+    display: none;
+  }
+  .ant-col-push-0 {
+    left: auto;
+  }
+  .ant-col-pull-0 {
+    right: auto;
+  }
+  .ant-col-xl-push-0 {
+    left: auto;
+  }
+  .ant-col-xl-pull-0 {
+    right: auto;
+  }
+  .ant-col-xl-offset-0 {
+    margin-left: 0;
+  }
+  .ant-col-xl-order-0 {
+    order: 0;
+  }
+}
+@media (min-width: 1600px) {
+  .ant-col-xxl-1, .ant-col-xxl-2, .ant-col-xxl-3, .ant-col-xxl-4, .ant-col-xxl-5, .ant-col-xxl-6, .ant-col-xxl-7, .ant-col-xxl-8, .ant-col-xxl-9, .ant-col-xxl-10, .ant-col-xxl-11, .ant-col-xxl-12, .ant-col-xxl-13, .ant-col-xxl-14, .ant-col-xxl-15, .ant-col-xxl-16, .ant-col-xxl-17, .ant-col-xxl-18, .ant-col-xxl-19, .ant-col-xxl-20, .ant-col-xxl-21, .ant-col-xxl-22, .ant-col-xxl-23, .ant-col-xxl-24 {
+    float: left;
+    flex: 0 0 auto;
+  }
+  .ant-col-xxl-24 {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+  }
+  .ant-col-xxl-push-24 {
+    left: 100%;
+  }
+  .ant-col-xxl-pull-24 {
+    right: 100%;
+  }
+  .ant-col-xxl-offset-24 {
+    margin-left: 100%;
+  }
+  .ant-col-xxl-order-24 {
+    order: 24;
+  }
+  .ant-col-xxl-23 {
+    display: block;
+    box-sizing: border-box;
+    width: 95.83333333%;
+  }
+  .ant-col-xxl-push-23 {
+    left: 95.83333333%;
+  }
+  .ant-col-xxl-pull-23 {
+    right: 95.83333333%;
+  }
+  .ant-col-xxl-offset-23 {
+    margin-left: 95.83333333%;
+  }
+  .ant-col-xxl-order-23 {
+    order: 23;
+  }
+  .ant-col-xxl-22 {
+    display: block;
+    box-sizing: border-box;
+    width: 91.66666667%;
+  }
+  .ant-col-xxl-push-22 {
+    left: 91.66666667%;
+  }
+  .ant-col-xxl-pull-22 {
+    right: 91.66666667%;
+  }
+  .ant-col-xxl-offset-22 {
+    margin-left: 91.66666667%;
+  }
+  .ant-col-xxl-order-22 {
+    order: 22;
+  }
+  .ant-col-xxl-21 {
+    display: block;
+    box-sizing: border-box;
+    width: 87.5%;
+  }
+  .ant-col-xxl-push-21 {
+    left: 87.5%;
+  }
+  .ant-col-xxl-pull-21 {
+    right: 87.5%;
+  }
+  .ant-col-xxl-offset-21 {
+    margin-left: 87.5%;
+  }
+  .ant-col-xxl-order-21 {
+    order: 21;
+  }
+  .ant-col-xxl-20 {
+    display: block;
+    box-sizing: border-box;
+    width: 83.33333333%;
+  }
+  .ant-col-xxl-push-20 {
+    left: 83.33333333%;
+  }
+  .ant-col-xxl-pull-20 {
+    right: 83.33333333%;
+  }
+  .ant-col-xxl-offset-20 {
+    margin-left: 83.33333333%;
+  }
+  .ant-col-xxl-order-20 {
+    order: 20;
+  }
+  .ant-col-xxl-19 {
+    display: block;
+    box-sizing: border-box;
+    width: 79.16666667%;
+  }
+  .ant-col-xxl-push-19 {
+    left: 79.16666667%;
+  }
+  .ant-col-xxl-pull-19 {
+    right: 79.16666667%;
+  }
+  .ant-col-xxl-offset-19 {
+    margin-left: 79.16666667%;
+  }
+  .ant-col-xxl-order-19 {
+    order: 19;
+  }
+  .ant-col-xxl-18 {
+    display: block;
+    box-sizing: border-box;
+    width: 75%;
+  }
+  .ant-col-xxl-push-18 {
+    left: 75%;
+  }
+  .ant-col-xxl-pull-18 {
+    right: 75%;
+  }
+  .ant-col-xxl-offset-18 {
+    margin-left: 75%;
+  }
+  .ant-col-xxl-order-18 {
+    order: 18;
+  }
+  .ant-col-xxl-17 {
+    display: block;
+    box-sizing: border-box;
+    width: 70.83333333%;
+  }
+  .ant-col-xxl-push-17 {
+    left: 70.83333333%;
+  }
+  .ant-col-xxl-pull-17 {
+    right: 70.83333333%;
+  }
+  .ant-col-xxl-offset-17 {
+    margin-left: 70.83333333%;
+  }
+  .ant-col-xxl-order-17 {
+    order: 17;
+  }
+  .ant-col-xxl-16 {
+    display: block;
+    box-sizing: border-box;
+    width: 66.66666667%;
+  }
+  .ant-col-xxl-push-16 {
+    left: 66.66666667%;
+  }
+  .ant-col-xxl-pull-16 {
+    right: 66.66666667%;
+  }
+  .ant-col-xxl-offset-16 {
+    margin-left: 66.66666667%;
+  }
+  .ant-col-xxl-order-16 {
+    order: 16;
+  }
+  .ant-col-xxl-15 {
+    display: block;
+    box-sizing: border-box;
+    width: 62.5%;
+  }
+  .ant-col-xxl-push-15 {
+    left: 62.5%;
+  }
+  .ant-col-xxl-pull-15 {
+    right: 62.5%;
+  }
+  .ant-col-xxl-offset-15 {
+    margin-left: 62.5%;
+  }
+  .ant-col-xxl-order-15 {
+    order: 15;
+  }
+  .ant-col-xxl-14 {
+    display: block;
+    box-sizing: border-box;
+    width: 58.33333333%;
+  }
+  .ant-col-xxl-push-14 {
+    left: 58.33333333%;
+  }
+  .ant-col-xxl-pull-14 {
+    right: 58.33333333%;
+  }
+  .ant-col-xxl-offset-14 {
+    margin-left: 58.33333333%;
+  }
+  .ant-col-xxl-order-14 {
+    order: 14;
+  }
+  .ant-col-xxl-13 {
+    display: block;
+    box-sizing: border-box;
+    width: 54.16666667%;
+  }
+  .ant-col-xxl-push-13 {
+    left: 54.16666667%;
+  }
+  .ant-col-xxl-pull-13 {
+    right: 54.16666667%;
+  }
+  .ant-col-xxl-offset-13 {
+    margin-left: 54.16666667%;
+  }
+  .ant-col-xxl-order-13 {
+    order: 13;
+  }
+  .ant-col-xxl-12 {
+    display: block;
+    box-sizing: border-box;
+    width: 50%;
+  }
+  .ant-col-xxl-push-12 {
+    left: 50%;
+  }
+  .ant-col-xxl-pull-12 {
+    right: 50%;
+  }
+  .ant-col-xxl-offset-12 {
+    margin-left: 50%;
+  }
+  .ant-col-xxl-order-12 {
+    order: 12;
+  }
+  .ant-col-xxl-11 {
+    display: block;
+    box-sizing: border-box;
+    width: 45.83333333%;
+  }
+  .ant-col-xxl-push-11 {
+    left: 45.83333333%;
+  }
+  .ant-col-xxl-pull-11 {
+    right: 45.83333333%;
+  }
+  .ant-col-xxl-offset-11 {
+    margin-left: 45.83333333%;
+  }
+  .ant-col-xxl-order-11 {
+    order: 11;
+  }
+  .ant-col-xxl-10 {
+    display: block;
+    box-sizing: border-box;
+    width: 41.66666667%;
+  }
+  .ant-col-xxl-push-10 {
+    left: 41.66666667%;
+  }
+  .ant-col-xxl-pull-10 {
+    right: 41.66666667%;
+  }
+  .ant-col-xxl-offset-10 {
+    margin-left: 41.66666667%;
+  }
+  .ant-col-xxl-order-10 {
+    order: 10;
+  }
+  .ant-col-xxl-9 {
+    display: block;
+    box-sizing: border-box;
+    width: 37.5%;
+  }
+  .ant-col-xxl-push-9 {
+    left: 37.5%;
+  }
+  .ant-col-xxl-pull-9 {
+    right: 37.5%;
+  }
+  .ant-col-xxl-offset-9 {
+    margin-left: 37.5%;
+  }
+  .ant-col-xxl-order-9 {
+    order: 9;
+  }
+  .ant-col-xxl-8 {
+    display: block;
+    box-sizing: border-box;
+    width: 33.33333333%;
+  }
+  .ant-col-xxl-push-8 {
+    left: 33.33333333%;
+  }
+  .ant-col-xxl-pull-8 {
+    right: 33.33333333%;
+  }
+  .ant-col-xxl-offset-8 {
+    margin-left: 33.33333333%;
+  }
+  .ant-col-xxl-order-8 {
+    order: 8;
+  }
+  .ant-col-xxl-7 {
+    display: block;
+    box-sizing: border-box;
+    width: 29.16666667%;
+  }
+  .ant-col-xxl-push-7 {
+    left: 29.16666667%;
+  }
+  .ant-col-xxl-pull-7 {
+    right: 29.16666667%;
+  }
+  .ant-col-xxl-offset-7 {
+    margin-left: 29.16666667%;
+  }
+  .ant-col-xxl-order-7 {
+    order: 7;
+  }
+  .ant-col-xxl-6 {
+    display: block;
+    box-sizing: border-box;
+    width: 25%;
+  }
+  .ant-col-xxl-push-6 {
+    left: 25%;
+  }
+  .ant-col-xxl-pull-6 {
+    right: 25%;
+  }
+  .ant-col-xxl-offset-6 {
+    margin-left: 25%;
+  }
+  .ant-col-xxl-order-6 {
+    order: 6;
+  }
+  .ant-col-xxl-5 {
+    display: block;
+    box-sizing: border-box;
+    width: 20.83333333%;
+  }
+  .ant-col-xxl-push-5 {
+    left: 20.83333333%;
+  }
+  .ant-col-xxl-pull-5 {
+    right: 20.83333333%;
+  }
+  .ant-col-xxl-offset-5 {
+    margin-left: 20.83333333%;
+  }
+  .ant-col-xxl-order-5 {
+    order: 5;
+  }
+  .ant-col-xxl-4 {
+    display: block;
+    box-sizing: border-box;
+    width: 16.66666667%;
+  }
+  .ant-col-xxl-push-4 {
+    left: 16.66666667%;
+  }
+  .ant-col-xxl-pull-4 {
+    right: 16.66666667%;
+  }
+  .ant-col-xxl-offset-4 {
+    margin-left: 16.66666667%;
+  }
+  .ant-col-xxl-order-4 {
+    order: 4;
+  }
+  .ant-col-xxl-3 {
+    display: block;
+    box-sizing: border-box;
+    width: 12.5%;
+  }
+  .ant-col-xxl-push-3 {
+    left: 12.5%;
+  }
+  .ant-col-xxl-pull-3 {
+    right: 12.5%;
+  }
+  .ant-col-xxl-offset-3 {
+    margin-left: 12.5%;
+  }
+  .ant-col-xxl-order-3 {
+    order: 3;
+  }
+  .ant-col-xxl-2 {
+    display: block;
+    box-sizing: border-box;
+    width: 8.33333333%;
+  }
+  .ant-col-xxl-push-2 {
+    left: 8.33333333%;
+  }
+  .ant-col-xxl-pull-2 {
+    right: 8.33333333%;
+  }
+  .ant-col-xxl-offset-2 {
+    margin-left: 8.33333333%;
+  }
+  .ant-col-xxl-order-2 {
+    order: 2;
+  }
+  .ant-col-xxl-1 {
+    display: block;
+    box-sizing: border-box;
+    width: 4.16666667%;
+  }
+  .ant-col-xxl-push-1 {
+    left: 4.16666667%;
+  }
+  .ant-col-xxl-pull-1 {
+    right: 4.16666667%;
+  }
+  .ant-col-xxl-offset-1 {
+    margin-left: 4.16666667%;
+  }
+  .ant-col-xxl-order-1 {
+    order: 1;
+  }
+  .ant-col-xxl-0 {
+    display: none;
+  }
+  .ant-col-push-0 {
+    left: auto;
+  }
+  .ant-col-pull-0 {
+    right: auto;
+  }
+  .ant-col-xxl-push-0 {
+    left: auto;
+  }
+  .ant-col-xxl-pull-0 {
+    right: auto;
+  }
+  .ant-col-xxl-offset-0 {
+    margin-left: 0;
+  }
+  .ant-col-xxl-order-0 {
+    order: 0;
+  }
+}
+.ant-input {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  transition: all .3s;
+}
+.ant-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input:hover {
+  border-color: #40a9ff;
+}
+.ant-input:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-input-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-input {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-input-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-input-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-input-group {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: table;
+  border-collapse: separate;
+  border-spacing: 0;
+  width: 100%;
+}
+.ant-input-group[class*="col-"] {
+  float: none;
+  padding-left: 0;
+  padding-right: 0;
+}
+.ant-input-group > [class*="col-"] {
+  padding-right: 8px;
+}
+.ant-input-group > [class*="col-"]:last-child {
+  padding-right: 0;
+}
+.ant-input-group-addon,
+.ant-input-group-wrap,
+.ant-input-group > .ant-input {
+  display: table-cell;
+}
+.ant-input-group-addon:not(:first-child):not(:last-child),
+.ant-input-group-wrap:not(:first-child):not(:last-child),
+.ant-input-group > .ant-input:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.ant-input-group-addon,
+.ant-input-group-wrap {
+  width: 1px;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.ant-input-group-wrap > * {
+  display: block !important;
+}
+.ant-input-group .ant-input {
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.ant-input-group .ant-input:focus {
+  z-index: 1;
+}
+.ant-input-group-addon {
+  padding: 0 11px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #54657e;
+  text-align: center;
+  background-color: #fafafa;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  position: relative;
+  transition: all .3s;
+}
+.ant-input-group-addon .ant-select {
+  margin: -5px -11px;
+}
+.ant-input-group-addon .ant-select .ant-select-selection {
+  background-color: inherit;
+  margin: -1px;
+  border: 1px solid transparent;
+  box-shadow: none;
+}
+.ant-input-group-addon .ant-select-open .ant-select-selection,
+.ant-input-group-addon .ant-select-focused .ant-select-selection {
+  color: #1890ff;
+}
+.ant-input-group-addon > i:only-child:after {
+  position: absolute;
+  content: '';
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.ant-input-group > .ant-input:first-child,
+.ant-input-group-addon:first-child {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group > .ant-input:first-child .ant-select .ant-select-selection,
+.ant-input-group-addon:first-child .ant-select .ant-select-selection {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group-addon:first-child {
+  border-right: 0;
+}
+.ant-input-group-addon:last-child {
+  border-left: 0;
+}
+.ant-input-group > .ant-input:last-child,
+.ant-input-group-addon:last-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group > .ant-input:last-child .ant-select .ant-select-selection,
+.ant-input-group-addon:last-child .ant-select .ant-select-selection {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group-lg .ant-input,
+.ant-input-group-lg > .ant-input-group-addon {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-input-group-sm .ant-input,
+.ant-input-group-sm > .ant-input-group-addon {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-input-group-lg .ant-select-selection--single {
+  height: 40px;
+}
+.ant-input-group-sm .ant-select-selection--single {
+  height: 24px;
+}
+.ant-input-group .ant-input-affix-wrapper {
+  display: table-cell;
+  width: 100%;
+  float: left;
+}
+.ant-input-group.ant-input-group-compact {
+  display: block;
+  zoom: 1;
+}
+.ant-input-group.ant-input-group-compact:before,
+.ant-input-group.ant-input-group-compact:after {
+  content: " ";
+  display: table;
+}
+.ant-input-group.ant-input-group-compact:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-input-group.ant-input-group-compact:before,
+.ant-input-group.ant-input-group-compact:after {
+  content: " ";
+  display: table;
+}
+.ant-input-group.ant-input-group-compact:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-input-group.ant-input-group-compact > * {
+  border-radius: 0;
+  border-right-width: 0;
+  vertical-align: top;
+  float: none;
+  display: inline-block;
+}
+.ant-input-group.ant-input-group-compact .ant-input {
+  float: none;
+  z-index: auto;
+}
+.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input {
+  border-radius: 0;
+  border-right-width: 0;
+}
+.ant-input-group.ant-input-group-compact > *:first-child,
+.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-input-group.ant-input-group-compact > *:last-child,
+.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-right-width: 1px;
+}
+.ant-input-group-wrapper {
+  display: inline-block;
+  vertical-align: top;
+  width: 100%;
+}
+.ant-input-affix-wrapper {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  width: 100%;
+}
+.ant-input-affix-wrapper .ant-input {
+  z-index: 1;
+}
+.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) {
+  border-color: #40a9ff;
+}
+.ant-input-affix-wrapper .ant-input-prefix,
+.ant-input-affix-wrapper .ant-input-suffix {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  z-index: 2;
+  line-height: 0;
+  color: #54657e;
+}
+.ant-input-affix-wrapper .ant-input-prefix :not(.anticon),
+.ant-input-affix-wrapper .ant-input-suffix :not(.anticon) {
+  line-height: 1.5;
+}
+.ant-input-affix-wrapper .ant-input-prefix {
+  left: 12px;
+}
+.ant-input-affix-wrapper .ant-input-suffix {
+  right: 12px;
+}
+.ant-input-affix-wrapper .ant-input:not(:first-child) {
+  padding-left: 30px;
+}
+.ant-input-affix-wrapper .ant-input:not(:last-child) {
+  padding-right: 30px;
+}
+.ant-input-affix-wrapper .ant-input {
+  min-height: 100%;
+}
+.ant-input-search-icon {
+  pointer-events: none;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-input-search:not(.ant-input-search-small) > .ant-input-suffix {
+  right: 12px;
+}
+.ant-input-search > .ant-input-suffix > .ant-input-search-button {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.ant-input-search > .ant-input-suffix > .ant-input-search-button > .anticon-search {
+  font-size: 16px;
+}
+.ant-input-search.ant-input-search-enter-button > .ant-input {
+  padding-right: 46px;
+}
+.ant-input-search.ant-input-search-enter-button > .ant-input-suffix {
+  right: 0;
+}
+.ant-input-number {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  box-sizing: border-box;
+  list-style: none;
+  position: relative;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  transition: all .3s;
+  margin: 0;
+  padding: 0;
+  display: inline-block;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  width: 90px;
+}
+.ant-input-number::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-input-number:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number:hover {
+  border-color: #40a9ff;
+}
+.ant-input-number:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-input-number-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-number-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-input-number {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-input-number-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-input-number-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-input-number-handler {
+  text-align: center;
+  line-height: 0;
+  height: 50%;
+  overflow: hidden;
+  color: rgba(0, 0, 0, 0.45);
+  position: relative;
+  transition: all 0.1s linear;
+  display: block;
+  width: 100%;
+  font-weight: bold;
+}
+.ant-input-number-handler:active {
+  background: #f4f4f4;
+}
+.ant-input-number-handler:hover .ant-input-number-handler-up-inner,
+.ant-input-number-handler:hover .ant-input-number-handler-down-inner {
+  color: #40a9ff;
+}
+.ant-input-number-handler-up-inner,
+.ant-input-number-handler-down-inner {
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  line-height: 1;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  line-height: 12px;
+  user-select: none;
+  position: absolute;
+  width: 12px;
+  height: 12px;
+  transition: all 0.1s linear;
+  display: inline-block;
+  font-size: 12px;
+  font-size: 7px \9;
+  transform: scale(0.58333333) rotate(0deg);
+  right: 4px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-input-number-handler-up-inner:before,
+.ant-input-number-handler-down-inner:before {
+  display: block;
+  font-family: "anticon" !important;
+}
+:root .ant-input-number-handler-up-inner,
+:root .ant-input-number-handler-down-inner {
+  font-size: 12px;
+}
+.ant-input-number:hover {
+  border-color: #40a9ff;
+}
+.ant-input-number-focused {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-input-number-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-number-disabled:hover {
+  border-color: #e6d8d8;
+}
+.ant-input-number-disabled .ant-input-number-input {
+  cursor: not-allowed;
+  background-color: #f5f5f5;
+}
+.ant-input-number-disabled .ant-input-number-handler-wrap {
+  display: none;
+}
+.ant-input-number-input {
+  width: 100%;
+  text-align: left;
+  outline: 0;
+  -moz-appearance: textfield;
+  height: 30px;
+  transition: all 0.3s linear;
+  color: #54657e;
+  background-color: #fff;
+  border: 0;
+  border-radius: 4px;
+  padding: 0 11px;
+  display: block;
+}
+.ant-input-number-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-input-number-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number-input[disabled] {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-number-input[disabled]:hover {
+  border-color: #e6d8d8;
+}
+.ant-input-number-lg {
+  padding: 0;
+  font-size: 16px;
+}
+.ant-input-number-lg input {
+  height: 38px;
+}
+.ant-input-number-sm {
+  padding: 0;
+}
+.ant-input-number-sm input {
+  height: 22px;
+  padding: 0 7px;
+}
+.ant-input-number-handler-wrap {
+  border-left: 1px solid #d9d9d9;
+  width: 22px;
+  height: 100%;
+  background: #fff;
+  position: absolute;
+  top: 0;
+  right: 0;
+  opacity: 0;
+  border-radius: 0 4px 4px 0;
+  transition: opacity 0.24s linear 0.1s;
+  z-index: 2;
+}
+.ant-input-number-handler-wrap:hover .ant-input-number-handler {
+  height: 40%;
+}
+.ant-input-number:hover .ant-input-number-handler-wrap {
+  opacity: 1;
+}
+.ant-input-number-handler-up {
+  cursor: pointer;
+}
+.ant-input-number-handler-up-inner {
+  top: 50%;
+  margin-top: -6px;
+}
+.ant-input-number-handler-up-inner:before {
+  text-align: center;
+  content: "\e61e";
+}
+.ant-input-number-handler-up:hover {
+  height: 60% !important;
+}
+.ant-input-number-handler-down {
+  border-top: 1px solid #d9d9d9;
+  top: -1px;
+  cursor: pointer;
+}
+.ant-input-number-handler-down-inner {
+  top: 50%;
+  margin-top: -6px;
+}
+.ant-input-number-handler-down-inner:before {
+  text-align: center;
+  content: "\e61d";
+}
+.ant-input-number-handler-down:hover {
+  height: 60% !important;
+}
+.ant-input-number-handler-up-disabled,
+.ant-input-number-handler-down-disabled {
+  cursor: not-allowed;
+}
+.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,
+.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-layout {
+  display: flex;
+  flex-direction: column;
+  flex: auto;
+  background: #f0f2f5;
+}
+.ant-layout,
+.ant-layout * {
+  box-sizing: border-box;
+}
+.ant-layout.ant-layout-has-sider {
+  flex-direction: row;
+}
+.ant-layout.ant-layout-has-sider > .ant-layout,
+.ant-layout.ant-layout-has-sider > .ant-layout-content {
+  overflow-x: hidden;
+}
+.ant-layout-header,
+.ant-layout-footer {
+  flex: 0 0 auto;
+}
+.ant-layout-header {
+  background: #2a3542;
+  padding: 0 50px;
+  height: 64px;
+  line-height: 64px;
+}
+.ant-layout-footer {
+  background: #f0f2f5;
+  padding: 24px 50px;
+  color: #54657e;
+  font-size: 14px;
+}
+.ant-layout-content {
+  flex: auto;
+}
+.ant-layout-sider {
+  transition: all .2s;
+  position: relative;
+  background: #2a3542;
+  /* fix firefox can't set width smaller than content on flex item */
+  min-width: 0;
+}
+.ant-layout-sider-children {
+  height: 100%;
+  padding-top: 0.1px;
+  margin-top: -0.1px;
+}
+.ant-layout-sider-has-trigger {
+  padding-bottom: 48px;
+}
+.ant-layout-sider-right {
+  order: 1;
+}
+.ant-layout-sider-trigger {
+  position: fixed;
+  text-align: center;
+  bottom: 0;
+  cursor: pointer;
+  height: 48px;
+  line-height: 48px;
+  color: #fff;
+  background: #002140;
+  z-index: 1;
+  transition: all .2s;
+}
+.ant-layout-sider-zero-width > * {
+  overflow: hidden;
+}
+.ant-layout-sider-zero-width-trigger {
+  position: absolute;
+  top: 64px;
+  right: -36px;
+  text-align: center;
+  width: 36px;
+  height: 42px;
+  line-height: 42px;
+  background: #2a3542;
+  color: #fff;
+  font-size: 18px;
+  border-radius: 0 4px 4px 0;
+  cursor: pointer;
+  transition: background .3s ease;
+}
+.ant-layout-sider-zero-width-trigger:hover {
+  background: #3f4955;
+}
+.ant-list {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+}
+.ant-list * {
+  outline: none;
+}
+.ant-list-pagination {
+  margin-top: 24px;
+  text-align: right;
+}
+.ant-list-more {
+  margin-top: 12px;
+  text-align: center;
+}
+.ant-list-more button {
+  padding-left: 32px;
+  padding-right: 32px;
+}
+.ant-list-spin {
+  text-align: center;
+  min-height: 40px;
+}
+.ant-list-empty-text {
+  color: rgba(0, 0, 0, 0.45);
+  font-size: 14px;
+  padding: 16px;
+  text-align: center;
+}
+.ant-list-item {
+  align-items: center;
+  display: flex;
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+.ant-list-item-meta {
+  align-items: flex-start;
+  display: flex;
+  flex: 1;
+  font-size: 0;
+}
+.ant-list-item-meta-avatar {
+  margin-right: 16px;
+}
+.ant-list-item-meta-content {
+  flex: 1 0;
+}
+.ant-list-item-meta-title {
+  color: #54657e;
+  margin-bottom: 4px;
+  font-size: 14px;
+  line-height: 22px;
+}
+.ant-list-item-meta-title > a {
+  color: #54657e;
+  transition: all .3s;
+}
+.ant-list-item-meta-title > a:hover {
+  color: #1890ff;
+}
+.ant-list-item-meta-description {
+  color: rgba(0, 0, 0, 0.45);
+  font-size: 14px;
+  line-height: 22px;
+}
+.ant-list-item-content {
+  display: flex;
+  flex: 1;
+  justify-content: flex-end;
+}
+.ant-list-item-content-single {
+  justify-content: flex-start;
+}
+.ant-list-item-action {
+  font-size: 0;
+  flex: 0 0 auto;
+  margin-left: 48px;
+  padding: 0;
+  list-style: none;
+}
+.ant-list-item-action > li {
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.45);
+  cursor: pointer;
+  padding: 0 8px;
+  position: relative;
+  font-size: 14px;
+  line-height: 22px;
+  text-align: center;
+}
+.ant-list-item-action > li:first-child {
+  padding-left: 0;
+}
+.ant-list-item-action-split {
+  background-color: #e8e8e8;
+  margin-top: -7px;
+  position: absolute;
+  top: 50%;
+  right: 0;
+  width: 1px;
+  height: 14px;
+}
+.ant-list-item-main {
+  display: flex;
+  flex: 1;
+}
+.ant-list-header,
+.ant-list-footer {
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+.ant-list-empty {
+  color: rgba(0, 0, 0, 0.45);
+  padding: 16px 0;
+  font-size: 12px;
+  text-align: center;
+}
+.ant-list-split .ant-list-item {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-split .ant-list-item:last-child {
+  border-bottom: none;
+}
+.ant-list-split .ant-list-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-loading .ant-list-spin-nested-loading {
+  min-height: 32px;
+}
+.ant-list-something-after-last-item .ant-list-item:last-child {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-lg .ant-list-item {
+  padding-top: 16px;
+  padding-bottom: 16px;
+}
+.ant-list-sm .ant-list-item {
+  padding-top: 8px;
+  padding-bottom: 8px;
+}
+.ant-list-vertical .ant-list-item {
+  display: block;
+}
+.ant-list-vertical .ant-list-item-extra-wrap {
+  display: flex;
+}
+.ant-list-vertical .ant-list-item-main {
+  display: block;
+  flex: 1;
+}
+.ant-list-vertical .ant-list-item-extra {
+  margin-left: 58px;
+}
+.ant-list-vertical .ant-list-item-meta {
+  margin-bottom: 16px;
+}
+.ant-list-vertical .ant-list-item-meta-avatar {
+  display: none;
+}
+.ant-list-vertical .ant-list-item-meta-title {
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+  font-size: 16px;
+  line-height: 24px;
+}
+.ant-list-vertical .ant-list-item-content {
+  display: block;
+  color: #54657e;
+  font-size: 14px;
+  margin-bottom: 16px;
+}
+.ant-list-vertical .ant-list-item-action {
+  margin-left: auto;
+}
+.ant-list-vertical .ant-list-item-action > li {
+  padding: 0 16px;
+}
+.ant-list-vertical .ant-list-item-action > li:first-child {
+  padding-left: 0;
+}
+.ant-list-grid .ant-list-item {
+  border-bottom: none;
+  padding-top: 0;
+  padding-bottom: 0;
+  margin-bottom: 20px;
+}
+.ant-list-grid .ant-list-item-content {
+  display: block;
+}
+.ant-list-bordered {
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+}
+.ant-list-bordered .ant-list-header {
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.ant-list-bordered .ant-list-footer {
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.ant-list-bordered .ant-list-item {
+  border-bottom: 1px solid #e8e8e8;
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.ant-list-bordered .ant-list-pagination {
+  margin: 16px 24px;
+}
+.ant-list-bordered.ant-list-sm .ant-list-item {
+  padding-left: 16px;
+  padding-right: 16px;
+}
+.ant-list-bordered.ant-list-sm .ant-list-header,
+.ant-list-bordered.ant-list-sm .ant-list-footer {
+  padding: 8px 16px;
+}
+.ant-list-bordered.ant-list-lg .ant-list-header,
+.ant-list-bordered.ant-list-lg .ant-list-footer {
+  padding: 16px 24px;
+}
+@media screen and (max-width: 768px) {
+  .ant-list-item-action {
+    margin-left: 24px;
+  }
+  .ant-list-vertical .ant-list-item-extra {
+    margin-left: 24px;
+  }
+}
+@media screen and (max-width: 480px) {
+  .ant-list-item {
+    flex-wrap: wrap;
+  }
+  .ant-list-item-action {
+    margin-left: 12px;
+  }
+  .ant-list-vertical .ant-list-item-extra-wrap {
+    flex-wrap: wrap-reverse;
+  }
+  .ant-list-vertical .ant-list-item-main {
+    min-width: 220px;
+  }
+  .ant-list-vertical .ant-list-item-extra {
+    margin-left: 0;
+  }
+}
+.ant-mention-wrapper {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  vertical-align: middle;
+}
+.ant-mention-wrapper .ant-mention-editor {
+  position: relative;
+  display: inline-block;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  transition: all .3s;
+  min-height: 32px;
+  height: auto;
+  line-height: 1.5;
+  padding: 0;
+  display: block;
+}
+.ant-mention-wrapper .ant-mention-editor::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-mention-wrapper .ant-mention-editor:hover {
+  border-color: #40a9ff;
+}
+.ant-mention-wrapper .ant-mention-editor:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-mention-wrapper .ant-mention-editor-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-wrapper .ant-mention-editor-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-mention-wrapper .ant-mention-editor {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-mention-wrapper .ant-mention-editor-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-mention-wrapper .ant-mention-editor-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-mention-wrapper .ant-mention-editor-wrapper {
+  overflow-y: auto;
+  height: auto;
+}
+.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-mention-wrapper.disabled .ant-mention-editor {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-wrapper.disabled .ant-mention-editor:hover {
+  border-color: #e6d8d8;
+}
+.ant-mention-wrapper .public-DraftEditorPlaceholder-root {
+  position: absolute;
+  pointer-events: none;
+}
+.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner {
+  color: #bfbfbf;
+  opacity: 1;
+  outline: none;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  height: auto;
+  padding: 5px 11px;
+}
+.ant-mention-wrapper .DraftEditor-editorContainer .public-DraftEditor-content {
+  height: auto;
+  padding: 5px 11px;
+}
+.ant-mention-dropdown {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  margin-top: 1.5em;
+  max-height: 250px;
+  min-width: 120px;
+  background-color: #fff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  z-index: 1050;
+  left: -9999px;
+  top: -9999px;
+  position: absolute;
+  outline: none;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.ant-mention-dropdown-placement-top {
+  margin-top: -0.1em;
+}
+.ant-mention-dropdown-notfound.ant-mention-dropdown-item {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading {
+  color: #1890ff;
+  text-align: center;
+  display: block;
+}
+.ant-mention-dropdown-item {
+  position: relative;
+  display: block;
+  padding: 5px 12px;
+  line-height: 22px;
+  font-weight: normal;
+  color: #54657e;
+  white-space: nowrap;
+  cursor: pointer;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  transition: background 0.3s;
+}
+.ant-mention-dropdown-item:hover {
+  background-color: #e6f7ff;
+}
+.ant-mention-dropdown-item.focus,
+.ant-mention-dropdown-item-active {
+  background-color: #e6f7ff;
+}
+.ant-mention-dropdown-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-mention-dropdown-item-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+  cursor: not-allowed;
+}
+.ant-mention-dropdown-item-selected,
+.ant-mention-dropdown-item-selected:hover {
+  background-color: #f5f5f5;
+  font-weight: bold;
+  color: #54657e;
+}
+.ant-mention-dropdown-item-divider {
+  height: 1px;
+  margin: 1px 0;
+  overflow: hidden;
+  background-color: #e8e8e8;
+  line-height: 0;
+}
+.ant-menu {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  outline: none;
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  color: #54657e;
+  background: #fff;
+  line-height: 0;
+  transition: background .3s, width .2s;
+  zoom: 1;
+}
+.ant-menu:before,
+.ant-menu:after {
+  content: " ";
+  display: table;
+}
+.ant-menu:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-menu:before,
+.ant-menu:after {
+  content: " ";
+  display: table;
+}
+.ant-menu:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-menu ul,
+.ant-menu ol {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.ant-menu-hidden {
+  display: none;
+}
+.ant-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+  font-size: 14px;
+  line-height: 1.5;
+  padding: 8px 16px;
+  transition: all .3s;
+}
+.ant-menu-submenu,
+.ant-menu-submenu-inline {
+  transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-item:active,
+.ant-menu-submenu-title:active {
+  background: #e6f7ff;
+}
+.ant-menu-submenu .ant-menu-sub {
+  cursor: initial;
+  transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-item > a {
+  display: block;
+  color: #54657e;
+}
+.ant-menu-item > a:hover {
+  color: #3fa8eb;
+}
+.ant-menu-item > a:focus {
+  text-decoration: none;
+}
+.ant-menu-item > a:before {
+  position: absolute;
+  background-color: transparent;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  content: '';
+}
+.ant-menu-item-divider {
+  height: 1px;
+  overflow: hidden;
+  background-color: #e8e8e8;
+  line-height: 0;
+}
+.ant-menu-item:hover,
+.ant-menu-item-active,
+.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,
+.ant-menu-submenu-active,
+.ant-menu-submenu-title:hover {
+  color: #3fa8eb;
+}
+.ant-menu-horizontal .ant-menu-item,
+.ant-menu-horizontal .ant-menu-submenu {
+  margin-top: -1px;
+}
+.ant-menu-horizontal > .ant-menu-item:hover,
+.ant-menu-horizontal > .ant-menu-item-active,
+.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover {
+  background-color: transparent;
+}
+.ant-menu-item-selected {
+  color: #3fa8eb;
+}
+.ant-menu-item-selected > a,
+.ant-menu-item-selected > a:hover {
+  color: #3fa8eb;
+}
+.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
+  background-color: #e6f7ff;
+}
+.ant-menu-inline,
+.ant-menu-vertical,
+.ant-menu-vertical-left {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-menu-vertical-right {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-menu-vertical.ant-menu-sub,
+.ant-menu-vertical-left.ant-menu-sub,
+.ant-menu-vertical-right.ant-menu-sub {
+  border-right: 0;
+  padding: 0;
+  transform-origin: 0 0;
+}
+.ant-menu-vertical.ant-menu-sub .ant-menu-item,
+.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,
+.ant-menu-vertical-right.ant-menu-sub .ant-menu-item {
+  border-right: 0;
+  margin-left: 0;
+  left: 0;
+}
+.ant-menu-vertical.ant-menu-sub .ant-menu-item:after,
+.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,
+.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after {
+  border-right: 0;
+}
+.ant-menu-vertical.ant-menu-sub > .ant-menu-item,
+.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item,
+.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item,
+.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu,
+.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu,
+.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu {
+  transform-origin: 0 0;
+}
+.ant-menu-horizontal.ant-menu-sub,
+.ant-menu-vertical.ant-menu-sub,
+.ant-menu-vertical-left.ant-menu-sub,
+.ant-menu-vertical-right.ant-menu-sub {
+  min-width: 160px;
+}
+.ant-menu-item,
+.ant-menu-submenu-title {
+  cursor: pointer;
+  margin: 0;
+  padding: 0 20px;
+  position: relative;
+  display: block;
+  white-space: nowrap;
+  transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-item .anticon,
+.ant-menu-submenu-title .anticon {
+  min-width: 14px;
+  margin-right: 10px;
+  transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-item .anticon + span,
+.ant-menu-submenu-title .anticon + span {
+  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  opacity: 1;
+}
+.ant-menu > .ant-menu-item-divider {
+  height: 1px;
+  margin: 1px 0;
+  overflow: hidden;
+  padding: 0;
+  line-height: 0;
+  background-color: #e8e8e8;
+}
+.ant-menu-submenu-popup {
+  position: absolute;
+  border-radius: 4px;
+  z-index: 1050;
+}
+.ant-menu-submenu > .ant-menu {
+  background-color: #fff;
+  border-radius: 4px;
+}
+.ant-menu-submenu > .ant-menu-submenu-title:after {
+  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow {
+  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  position: absolute;
+  top: 50%;
+  right: 16px;
+  width: 10px;
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after {
+  content: '';
+  position: absolute;
+  vertical-align: baseline;
+  background: #fff;
+  background-image: linear-gradient(to right, #54657e, #54657e);
+  width: 6px;
+  height: 1.5px;
+  border-radius: 2px;
+  transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before {
+  transform: rotate(45deg) translateY(-2px);
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after {
+  transform: rotate(-45deg) translateY(2px);
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before {
+  background: linear-gradient(to right, #3fa8eb, #3fa8eb);
+}
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before {
+  transform: rotate(-45deg) translateX(2px);
+}
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after {
+  transform: rotate(45deg) translateX(-2px);
+}
+.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow {
+  transform: translateY(-2px);
+}
+.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after {
+  transform: rotate(-45deg) translateX(-2px);
+}
+.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before {
+  transform: rotate(45deg) translateX(2px);
+}
+.ant-menu-vertical .ant-menu-submenu-selected,
+.ant-menu-vertical-left .ant-menu-submenu-selected,
+.ant-menu-vertical-right .ant-menu-submenu-selected {
+  color: #3fa8eb;
+}
+.ant-menu-vertical .ant-menu-submenu-selected > a,
+.ant-menu-vertical-left .ant-menu-submenu-selected > a,
+.ant-menu-vertical-right .ant-menu-submenu-selected > a {
+  color: #3fa8eb;
+}
+.ant-menu-horizontal {
+  border: 0;
+  border-bottom: 1px solid #e8e8e8;
+  box-shadow: none;
+  line-height: 46px;
+}
+.ant-menu-horizontal > .ant-menu-item,
+.ant-menu-horizontal > .ant-menu-submenu {
+  position: relative;
+  top: 1px;
+  float: left;
+  border-bottom: 2px solid transparent;
+}
+.ant-menu-horizontal > .ant-menu-item:hover,
+.ant-menu-horizontal > .ant-menu-submenu:hover,
+.ant-menu-horizontal > .ant-menu-item-active,
+.ant-menu-horizontal > .ant-menu-submenu-active,
+.ant-menu-horizontal > .ant-menu-item-open,
+.ant-menu-horizontal > .ant-menu-submenu-open,
+.ant-menu-horizontal > .ant-menu-item-selected,
+.ant-menu-horizontal > .ant-menu-submenu-selected {
+  border-bottom: 2px solid #3fa8eb;
+  color: #3fa8eb;
+}
+.ant-menu-horizontal > .ant-menu-item > a,
+.ant-menu-horizontal > .ant-menu-submenu > a {
+  display: block;
+  color: #54657e;
+}
+.ant-menu-horizontal > .ant-menu-item > a:hover,
+.ant-menu-horizontal > .ant-menu-submenu > a:hover {
+  color: #3fa8eb;
+}
+.ant-menu-horizontal:after {
+  content: "\20";
+  display: block;
+  height: 0;
+  clear: both;
+}
+.ant-menu-vertical .ant-menu-item,
+.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-vertical-right .ant-menu-item,
+.ant-menu-inline .ant-menu-item {
+  position: relative;
+}
+.ant-menu-vertical .ant-menu-item:after,
+.ant-menu-vertical-left .ant-menu-item:after,
+.ant-menu-vertical-right .ant-menu-item:after,
+.ant-menu-inline .ant-menu-item:after {
+  content: "";
+  position: absolute;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  border-right: 3px solid #3fa8eb;
+  transform: scaleY(0.0001);
+  opacity: 0;
+  transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+.ant-menu-vertical .ant-menu-item,
+.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-vertical-right .ant-menu-item,
+.ant-menu-inline .ant-menu-item,
+.ant-menu-vertical .ant-menu-submenu-title,
+.ant-menu-vertical-left .ant-menu-submenu-title,
+.ant-menu-vertical-right .ant-menu-submenu-title,
+.ant-menu-inline .ant-menu-submenu-title {
+  padding: 0 16px;
+  font-size: 14px;
+  line-height: 50px;
+  height: 50px;
+  margin-top: 4px;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.ant-menu-vertical .ant-menu-submenu,
+.ant-menu-vertical-left .ant-menu-submenu,
+.ant-menu-vertical-right .ant-menu-submenu,
+.ant-menu-inline .ant-menu-submenu {
+  padding-bottom: 0.01px;
+}
+.ant-menu-vertical .ant-menu-item:not(:last-child),
+.ant-menu-vertical-left .ant-menu-item:not(:last-child),
+.ant-menu-vertical-right .ant-menu-item:not(:last-child),
+.ant-menu-inline .ant-menu-item:not(:last-child) {
+  margin-bottom: 8px;
+}
+.ant-menu-vertical > .ant-menu-item,
+.ant-menu-vertical-left > .ant-menu-item,
+.ant-menu-vertical-right > .ant-menu-item,
+.ant-menu-inline > .ant-menu-item,
+.ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title,
+.ant-menu-vertical-left > .ant-menu-submenu > .ant-menu-submenu-title,
+.ant-menu-vertical-right > .ant-menu-submenu > .ant-menu-submenu-title,
+.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {
+  line-height: 50px;
+  height: 50px;
+}
+.ant-menu-inline {
+  width: 100%;
+}
+.ant-menu-inline .ant-menu-selected:after,
+.ant-menu-inline .ant-menu-item-selected:after {
+  transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);
+  opacity: 1;
+  transform: scaleY(1);
+}
+.ant-menu-inline .ant-menu-item,
+.ant-menu-inline .ant-menu-submenu-title {
+  width: calc(100% + 1px);
+}
+.ant-menu-inline .ant-menu-submenu-title {
+  padding-right: 34px;
+}
+.ant-menu-inline-collapsed {
+  width: 80px;
+}
+.ant-menu-inline-collapsed > .ant-menu-item,
+.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item,
+.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {
+  left: 0;
+  text-overflow: clip;
+  padding: 0 32px !important;
+}
+.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-submenu-arrow,
+.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-submenu-arrow,
+.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow {
+  display: none;
+}
+.ant-menu-inline-collapsed > .ant-menu-item .anticon,
+.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon,
+.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon {
+  font-size: 16px;
+  line-height: 50px;
+  margin: 0;
+}
+.ant-menu-inline-collapsed > .ant-menu-item .anticon + span,
+.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon + span,
+.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span {
+  max-width: 0;
+  display: inline-block;
+  opacity: 0;
+}
+.ant-menu-inline-collapsed-tooltip {
+  pointer-events: none;
+}
+.ant-menu-inline-collapsed-tooltip .anticon {
+  display: none;
+}
+.ant-menu-inline-collapsed-tooltip a {
+  color: rgba(255, 255, 255, 0.85);
+}
+.ant-menu-inline-collapsed .ant-menu-item-group-title {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  padding-left: 4px;
+  padding-right: 4px;
+}
+.ant-menu-item-group-list {
+  margin: 0;
+  padding: 0;
+}
+.ant-menu-item-group-list .ant-menu-item,
+.ant-menu-item-group-list .ant-menu-submenu-title {
+  padding: 0 16px 0 28px;
+}
+.ant-menu-root.ant-menu-vertical,
+.ant-menu-root.ant-menu-vertical-left,
+.ant-menu-root.ant-menu-vertical-right,
+.ant-menu-root.ant-menu-inline {
+  box-shadow: none;
+}
+.ant-menu-sub.ant-menu-inline {
+  padding: 0;
+  border: 0;
+  box-shadow: none;
+  border-radius: 0;
+}
+.ant-menu-sub.ant-menu-inline > .ant-menu-item,
+.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {
+  line-height: 50px;
+  height: 50px;
+  list-style-type: disc;
+  list-style-position: inside;
+}
+.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title {
+  padding-left: 32px;
+}
+.ant-menu-item-disabled,
+.ant-menu-submenu-disabled {
+  color: rgba(0, 0, 0, 0.25) !important;
+  cursor: not-allowed;
+  background: none;
+  border-color: transparent !important;
+}
+.ant-menu-item-disabled > a,
+.ant-menu-submenu-disabled > a {
+  color: rgba(0, 0, 0, 0.25) !important;
+  pointer-events: none;
+}
+.ant-menu-item-disabled > .ant-menu-submenu-title,
+.ant-menu-submenu-disabled > .ant-menu-submenu-title {
+  color: rgba(0, 0, 0, 0.25) !important;
+  cursor: not-allowed;
+}
+.ant-menu-dark,
+.ant-menu-dark .ant-menu-sub {
+  color: #fff;
+  background: #2a3542;
+}
+.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow {
+  opacity: .45;
+  transition: all .3s;
+}
+.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before {
+  background: #fff;
+}
+.ant-menu-dark.ant-menu-submenu-popup {
+  background: transparent;
+}
+.ant-menu-dark .ant-menu-inline.ant-menu-sub {
+  background: #2a3542;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset;
+}
+.ant-menu-dark.ant-menu-horizontal {
+  border-bottom-color: #2a3542;
+}
+.ant-menu-dark.ant-menu-horizontal > .ant-menu-item,
+.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu {
+  border-color: #2a3542;
+  border-bottom: 0;
+}
+.ant-menu-dark .ant-menu-item,
+.ant-menu-dark .ant-menu-item-group-title,
+.ant-menu-dark .ant-menu-item > a {
+  color: #fff;
+}
+.ant-menu-dark.ant-menu-inline,
+.ant-menu-dark.ant-menu-vertical,
+.ant-menu-dark.ant-menu-vertical-left,
+.ant-menu-dark.ant-menu-vertical-right {
+  border-right: 0;
+}
+.ant-menu-dark.ant-menu-inline .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical-right .ant-menu-item {
+  border-right: 0;
+  margin-left: 0;
+  left: 0;
+}
+.ant-menu-dark.ant-menu-inline .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after {
+  border-right: 0;
+}
+.ant-menu-dark.ant-menu-inline .ant-menu-item,
+.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title {
+  width: 100%;
+}
+.ant-menu-dark .ant-menu-item:hover,
+.ant-menu-dark .ant-menu-item-active,
+.ant-menu-dark .ant-menu-submenu-active,
+.ant-menu-dark .ant-menu-submenu-open,
+.ant-menu-dark .ant-menu-submenu-selected,
+.ant-menu-dark .ant-menu-submenu-title:hover {
+  background-color: transparent;
+  color: #3fa8eb;
+}
+.ant-menu-dark .ant-menu-item:hover > a,
+.ant-menu-dark .ant-menu-item-active > a,
+.ant-menu-dark .ant-menu-submenu-active > a,
+.ant-menu-dark .ant-menu-submenu-open > a,
+.ant-menu-dark .ant-menu-submenu-selected > a,
+.ant-menu-dark .ant-menu-submenu-title:hover > a {
+  color: #3fa8eb;
+}
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow {
+  opacity: 1;
+}
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before {
+  background: #3fa8eb;
+}
+.ant-menu-dark .ant-menu-item-selected {
+  border-right: 0;
+  color: #3fa8eb;
+}
+.ant-menu-dark .ant-menu-item-selected:after {
+  border-right: 0;
+}
+.ant-menu-dark .ant-menu-item-selected > a,
+.ant-menu-dark .ant-menu-item-selected > a:hover {
+  color: #3fa8eb;
+}
+.ant-menu.ant-menu-dark .ant-menu-item-selected,
+.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected {
+  background-color: #3d4a59;
+}
+.ant-menu-dark .ant-menu-item-disabled,
+.ant-menu-dark .ant-menu-submenu-disabled,
+.ant-menu-dark .ant-menu-item-disabled > a,
+.ant-menu-dark .ant-menu-submenu-disabled > a {
+  opacity: 0.8;
+  color: rgba(255, 255, 255, 0.35) !important;
+}
+.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title,
+.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title {
+  color: rgba(255, 255, 255, 0.35) !important;
+}
+.ant-message {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: fixed;
+  z-index: 1010;
+  width: 100%;
+  top: 16px;
+  left: 0;
+  pointer-events: none;
+}
+.ant-message-notice {
+  padding: 8px;
+  text-align: center;
+}
+.ant-message-notice:first-child {
+  margin-top: -8px;
+}
+.ant-message-notice-content {
+  padding: 10px 16px;
+  border-radius: 4px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  background: #fff;
+  display: inline-block;
+  pointer-events: all;
+}
+.ant-message-success .anticon {
+  color: #52c41a;
+}
+.ant-message-error .anticon {
+  color: #f5222d;
+}
+.ant-message-warning .anticon {
+  color: #faad14;
+}
+.ant-message-info .anticon,
+.ant-message-loading .anticon {
+  color: #1890ff;
+}
+.ant-message .anticon {
+  margin-right: 8px;
+  font-size: 16px;
+  top: 1px;
+  position: relative;
+}
+.ant-message-notice.move-up-leave.move-up-leave-active {
+  animation-name: MessageMoveOut;
+  overflow: hidden;
+  animation-duration: .3s;
+}
+@keyframes MessageMoveOut {
+  0% {
+    opacity: 1;
+    max-height: 150px;
+    padding: 8px;
+  }
+  100% {
+    opacity: 0;
+    max-height: 0;
+    padding: 0;
+  }
+}
+.ant-modal {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  width: auto;
+  margin: 0 auto;
+  top: 100px;
+  padding-bottom: 24px;
+}
+.ant-modal-wrap {
+  position: fixed;
+  overflow: auto;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1000;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.ant-modal-title {
+  margin: 0;
+  font-size: 16px;
+  line-height: 22px;
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-modal-content {
+  position: relative;
+  background-color: #fff;
+  border: 0;
+  border-radius: 4px;
+  background-clip: padding-box;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+.ant-modal-close {
+  cursor: pointer;
+  border: 0;
+  background: transparent;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 10;
+  font-weight: 700;
+  line-height: 1;
+  text-decoration: none;
+  transition: color .3s;
+  color: rgba(0, 0, 0, 0.45);
+  outline: 0;
+  padding: 0;
+}
+.ant-modal-close-x {
+  display: block;
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  text-rendering: auto;
+  width: 56px;
+  height: 56px;
+  line-height: 56px;
+  font-size: 16px;
+}
+.ant-modal-close-x:before {
+  content: "\e633";
+  display: block;
+  font-family: "anticon" !important;
+}
+.ant-modal-close:focus,
+.ant-modal-close:hover {
+  color: #444;
+  text-decoration: none;
+}
+.ant-modal-header {
+  padding: 16px 24px;
+  border-radius: 4px 4px 0 0;
+  background: #fff;
+  color: #54657e;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-modal-body {
+  padding: 24px;
+  font-size: 14px;
+  line-height: 1.5;
+}
+.ant-modal-footer {
+  border-top: 1px solid #e8e8e8;
+  padding: 10px 16px;
+  text-align: right;
+  border-radius: 0 0 4px 4px;
+}
+.ant-modal-footer button + button {
+  margin-left: 8px;
+  margin-bottom: 0;
+}
+.ant-modal.zoom-enter,
+.ant-modal.zoom-appear {
+  animation-duration: 0.3s;
+  transform: none;
+  opacity: 0;
+}
+.ant-modal-mask {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  background-color: #373737;
+  background-color: rgba(0, 0, 0, 0.65);
+  height: 100%;
+  z-index: 1000;
+  filter: alpha(opacity=50);
+}
+.ant-modal-mask-hidden {
+  display: none;
+}
+.ant-modal-open {
+  overflow: hidden;
+}
+@media (max-width: 768px) {
+  .ant-modal {
+    width: auto !important;
+    margin: 10px;
+  }
+  .vertical-center-modal .ant-modal {
+    flex: 1;
+  }
+}
+.ant-confirm .ant-modal-header {
+  display: none;
+}
+.ant-confirm .ant-modal-close {
+  display: none;
+}
+.ant-confirm .ant-modal-body {
+  padding: 32px 32px 24px;
+}
+.ant-confirm-body-wrapper {
+  zoom: 1;
+}
+.ant-confirm-body-wrapper:before,
+.ant-confirm-body-wrapper:after {
+  content: " ";
+  display: table;
+}
+.ant-confirm-body-wrapper:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-confirm-body-wrapper:before,
+.ant-confirm-body-wrapper:after {
+  content: " ";
+  display: table;
+}
+.ant-confirm-body-wrapper:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-confirm-body .ant-confirm-title {
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+  font-size: 16px;
+  line-height: 22px;
+}
+.ant-confirm-body .ant-confirm-content {
+  margin-left: 38px;
+  font-size: 14px;
+  color: #54657e;
+  margin-top: 8px;
+}
+.ant-confirm-body > .anticon {
+  font-size: 22px;
+  margin-right: 16px;
+  float: left;
+  min-height: 48px;
+}
+.ant-confirm .ant-confirm-btns {
+  margin-top: 24px;
+  float: right;
+}
+.ant-confirm .ant-confirm-btns button + button {
+  margin-left: 8px;
+  margin-bottom: 0;
+}
+.ant-confirm-error .ant-confirm-body > .anticon {
+  color: #f5222d;
+}
+.ant-confirm-warning .ant-confirm-body > .anticon,
+.ant-confirm-confirm .ant-confirm-body > .anticon {
+  color: #faad14;
+}
+.ant-confirm-info .ant-confirm-body > .anticon {
+  color: #1890ff;
+}
+.ant-confirm-success .ant-confirm-body > .anticon {
+  color: #52c41a;
+}
+.ant-notification {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: fixed;
+  z-index: 1010;
+  width: 384px;
+  max-width: calc(100vw - 32px);
+  margin-right: 24px;
+}
+.ant-notification-topLeft,
+.ant-notification-bottomLeft {
+  margin-left: 24px;
+  margin-right: 0;
+}
+.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,
+.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,
+.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,
+.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active {
+  animation-name: NotificationLeftFadeIn;
+}
+.ant-notification-notice {
+  padding: 16px 24px;
+  border-radius: 4px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  background: #fff;
+  line-height: 1.5;
+  position: relative;
+  margin-bottom: 16px;
+  overflow: hidden;
+}
+.ant-notification-notice-message {
+  font-size: 16px;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 8px;
+  line-height: 24px;
+  display: inline-block;
+}
+.ant-notification-notice-message-single-line-auto-margin {
+  width: calc(384px - 24px * 2 - 24px - 48px - 100%);
+  background-color: transparent;
+  pointer-events: none;
+  display: block;
+  max-width: 4px;
+}
+.ant-notification-notice-message-single-line-auto-margin:before {
+  content: '';
+  display: block;
+  padding-bottom: 100%;
+}
+.ant-notification-notice-description {
+  font-size: 14px;
+}
+.ant-notification-notice-closable .ant-notification-notice-message {
+  padding-right: 24px;
+}
+.ant-notification-notice-with-icon .ant-notification-notice-message {
+  font-size: 16px;
+  margin-left: 48px;
+  margin-bottom: 4px;
+}
+.ant-notification-notice-with-icon .ant-notification-notice-description {
+  margin-left: 48px;
+  font-size: 14px;
+}
+.ant-notification-notice-icon {
+  position: absolute;
+  font-size: 24px;
+  line-height: 24px;
+  margin-left: 4px;
+}
+.ant-notification-notice-icon-success {
+  color: #52c41a;
+}
+.ant-notification-notice-icon-info {
+  color: #1890ff;
+}
+.ant-notification-notice-icon-warning {
+  color: #faad14;
+}
+.ant-notification-notice-icon-error {
+  color: #f5222d;
+}
+.ant-notification-notice-close-x:after {
+  font-size: 14px;
+  content: "\e633";
+  font-family: "anticon";
+  cursor: pointer;
+}
+.ant-notification-notice-close {
+  position: absolute;
+  right: 22px;
+  top: 16px;
+  color: rgba(0, 0, 0, 0.45);
+  outline: none;
+}
+a.ant-notification-notice-close:focus {
+  text-decoration: none;
+}
+.ant-notification-notice-close:hover {
+  color: #404040;
+}
+.ant-notification-notice-btn {
+  float: right;
+  margin-top: 16px;
+}
+.ant-notification .notification-fade-effect {
+  animation-duration: 0.24s;
+  animation-fill-mode: both;
+  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-notification-fade-enter,
+.ant-notification-fade-appear {
+  opacity: 0;
+  animation-duration: 0.24s;
+  animation-fill-mode: both;
+  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
+  animation-play-state: paused;
+}
+.ant-notification-fade-leave {
+  animation-duration: 0.24s;
+  animation-fill-mode: both;
+  animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1);
+  animation-duration: 0.2s;
+  animation-play-state: paused;
+}
+.ant-notification-fade-enter.ant-notification-fade-enter-active,
+.ant-notification-fade-appear.ant-notification-fade-appear-active {
+  animation-name: NotificationFadeIn;
+  animation-play-state: running;
+}
+.ant-notification-fade-leave.ant-notification-fade-leave-active {
+  animation-name: NotificationFadeOut;
+  animation-play-state: running;
+}
+@keyframes NotificationFadeIn {
+  0% {
+    opacity: 0;
+    left: 384px;
+  }
+  100% {
+    left: 0;
+    opacity: 1;
+  }
+}
+@keyframes NotificationLeftFadeIn {
+  0% {
+    opacity: 0;
+    right: 384px;
+  }
+  100% {
+    right: 0;
+    opacity: 1;
+  }
+}
+@keyframes NotificationFadeOut {
+  0% {
+    opacity: 1;
+    margin-bottom: 16px;
+    padding-top: 16px 24px;
+    padding-bottom: 16px 24px;
+    max-height: 150px;
+  }
+  100% {
+    opacity: 0;
+    margin-bottom: 0;
+    padding-top: 0;
+    padding-bottom: 0;
+    max-height: 0;
+  }
+}
+.ant-pagination {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-pagination ul,
+.ant-pagination ol {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-pagination:after {
+  content: " ";
+  display: block;
+  height: 0;
+  clear: both;
+  overflow: hidden;
+  visibility: hidden;
+}
+.ant-pagination-total-text {
+  display: inline-block;
+  vertical-align: middle;
+  height: 32px;
+  line-height: 30px;
+  margin-right: 8px;
+}
+.ant-pagination-item {
+  cursor: pointer;
+  border-radius: 4px;
+  user-select: none;
+  min-width: 32px;
+  height: 32px;
+  line-height: 30px;
+  text-align: center;
+  list-style: none;
+  display: inline-block;
+  vertical-align: middle;
+  border: 1px solid #d9d9d9;
+  background-color: #fff;
+  margin-right: 8px;
+  font-family: Arial;
+  outline: 0;
+}
+.ant-pagination-item a {
+  text-decoration: none;
+  color: #54657e;
+  transition: none;
+  margin: 0 6px;
+}
+.ant-pagination-item:focus,
+.ant-pagination-item:hover {
+  transition: all .3s;
+  border-color: #1890ff;
+}
+.ant-pagination-item:focus a,
+.ant-pagination-item:hover a {
+  color: #1890ff;
+}
+.ant-pagination-item-active {
+  border-color: #1890ff;
+  font-weight: 500;
+}
+.ant-pagination-item-active a {
+  color: #1890ff;
+}
+.ant-pagination-item-active:focus,
+.ant-pagination-item-active:hover {
+  border-color: #40a9ff;
+}
+.ant-pagination-item-active:focus a,
+.ant-pagination-item-active:hover a {
+  color: #40a9ff;
+}
+.ant-pagination-jump-prev,
+.ant-pagination-jump-next {
+  outline: 0;
+}
+.ant-pagination-jump-prev:after,
+.ant-pagination-jump-next:after {
+  content: "•••";
+  display: block;
+  letter-spacing: 2px;
+  color: rgba(0, 0, 0, 0.25);
+  text-align: center;
+}
+.ant-pagination-jump-prev:focus:after,
+.ant-pagination-jump-next:focus:after,
+.ant-pagination-jump-prev:hover:after,
+.ant-pagination-jump-next:hover:after {
+  color: #1890ff;
+  display: inline-block;
+  font-size: 12px;
+  font-size: 8px \9;
+  transform: scale(0.66666667) rotate(0deg);
+  letter-spacing: -1px;
+  font-family: "anticon";
+}
+:root .ant-pagination-jump-prev:focus:after,
+:root .ant-pagination-jump-next:focus:after,
+:root .ant-pagination-jump-prev:hover:after,
+:root .ant-pagination-jump-next:hover:after {
+  font-size: 12px;
+}
+.ant-pagination-jump-prev:focus:after,
+.ant-pagination-jump-prev:hover:after {
+  content: "\e620\e620";
+}
+.ant-pagination-jump-next:focus:after,
+.ant-pagination-jump-next:hover:after {
+  content: "\e61f\e61f";
+}
+.ant-pagination-prev,
+.ant-pagination-jump-prev,
+.ant-pagination-jump-next {
+  margin-right: 8px;
+}
+.ant-pagination-prev,
+.ant-pagination-next,
+.ant-pagination-jump-prev,
+.ant-pagination-jump-next {
+  font-family: Arial;
+  cursor: pointer;
+  color: #54657e;
+  border-radius: 4px;
+  list-style: none;
+  min-width: 32px;
+  height: 32px;
+  line-height: 32px;
+  text-align: center;
+  transition: all .3s;
+  display: inline-block;
+  vertical-align: middle;
+}
+.ant-pagination-prev,
+.ant-pagination-next {
+  outline: 0;
+}
+.ant-pagination-prev a,
+.ant-pagination-next a {
+  color: #54657e;
+  user-select: none;
+}
+.ant-pagination-prev:hover a,
+.ant-pagination-next:hover a {
+  border-color: #40a9ff;
+}
+.ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination-next .ant-pagination-item-link {
+  border: 1px solid #d9d9d9;
+  background-color: #fff;
+  border-radius: 4px;
+  outline: none;
+  display: block;
+  transition: all .3s;
+}
+.ant-pagination-prev .ant-pagination-item-link:after,
+.ant-pagination-next .ant-pagination-item-link:after {
+  font-size: 12px;
+  display: block;
+  height: 30px;
+  font-family: "anticon";
+  text-align: center;
+  font-weight: 500;
+}
+.ant-pagination-prev:focus .ant-pagination-item-link,
+.ant-pagination-next:focus .ant-pagination-item-link,
+.ant-pagination-prev:hover .ant-pagination-item-link,
+.ant-pagination-next:hover .ant-pagination-item-link {
+  border-color: #1890ff;
+  color: #1890ff;
+}
+.ant-pagination-prev .ant-pagination-item-link:after {
+  content: "\e620";
+  display: block;
+}
+.ant-pagination-next .ant-pagination-item-link:after {
+  content: "\e61f";
+  display: block;
+}
+.ant-pagination-disabled,
+.ant-pagination-disabled:hover,
+.ant-pagination-disabled:focus {
+  cursor: not-allowed;
+}
+.ant-pagination-disabled a,
+.ant-pagination-disabled:hover a,
+.ant-pagination-disabled:focus a,
+.ant-pagination-disabled .ant-pagination-item-link,
+.ant-pagination-disabled:hover .ant-pagination-item-link,
+.ant-pagination-disabled:focus .ant-pagination-item-link {
+  border-color: #d9d9d9;
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-pagination-slash {
+  margin: 0 10px 0 5px;
+}
+.ant-pagination-options {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 16px;
+}
+.ant-pagination-options-size-changer.ant-select {
+  display: inline-block;
+  margin-right: 8px;
+}
+.ant-pagination-options-quick-jumper {
+  display: inline-block;
+  vertical-align: top;
+  height: 32px;
+  line-height: 32px;
+}
+.ant-pagination-options-quick-jumper input {
+  position: relative;
+  display: inline-block;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  transition: all .3s;
+  margin: 0 8px;
+  width: 50px;
+}
+.ant-pagination-options-quick-jumper input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-pagination-options-quick-jumper input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-pagination-options-quick-jumper input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-pagination-options-quick-jumper input:hover {
+  border-color: #40a9ff;
+}
+.ant-pagination-options-quick-jumper input:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-pagination-options-quick-jumper input-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-pagination-options-quick-jumper input-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-pagination-options-quick-jumper input {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-pagination-options-quick-jumper input-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-pagination-options-quick-jumper input-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-pagination-simple .ant-pagination-prev,
+.ant-pagination-simple .ant-pagination-next {
+  height: 24px;
+  line-height: 24px;
+  vertical-align: top;
+}
+.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link {
+  border: 0;
+  height: 24px;
+}
+.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after,
+.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after {
+  height: 24px;
+  line-height: 24px;
+}
+.ant-pagination-simple .ant-pagination-simple-pager {
+  display: inline-block;
+  margin-right: 8px;
+  height: 24px;
+}
+.ant-pagination-simple .ant-pagination-simple-pager input {
+  margin-right: 8px;
+  box-sizing: border-box;
+  background-color: #fff;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  outline: none;
+  padding: 0 6px;
+  height: 100%;
+  text-align: center;
+  transition: border-color 0.3s;
+}
+.ant-pagination-simple .ant-pagination-simple-pager input:hover {
+  border-color: #1890ff;
+}
+.ant-pagination.mini .ant-pagination-total-text,
+.ant-pagination.mini .ant-pagination-simple-pager {
+  height: 24px;
+  line-height: 24px;
+}
+.ant-pagination.mini .ant-pagination-item {
+  margin: 0;
+  min-width: 24px;
+  height: 24px;
+  line-height: 22px;
+}
+.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) {
+  background: transparent;
+  border-color: transparent;
+}
+.ant-pagination.mini .ant-pagination-prev,
+.ant-pagination.mini .ant-pagination-next {
+  margin: 0;
+  min-width: 24px;
+  height: 24px;
+  line-height: 24px;
+}
+.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link {
+  border-color: transparent;
+  background: transparent;
+}
+.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link:after,
+.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link:after {
+  height: 24px;
+  line-height: 24px;
+}
+.ant-pagination.mini .ant-pagination-jump-prev,
+.ant-pagination.mini .ant-pagination-jump-next {
+  height: 24px;
+  line-height: 24px;
+  margin-right: 0;
+}
+.ant-pagination.mini .ant-pagination-options {
+  margin-left: 2px;
+}
+.ant-pagination.mini .ant-pagination-options-quick-jumper {
+  height: 24px;
+  line-height: 24px;
+}
+.ant-pagination.mini .ant-pagination-options-quick-jumper input {
+  padding: 1px 7px;
+  height: 24px;
+  width: 44px;
+}
+@media only screen and (max-width: 992px) {
+  .ant-pagination-item-after-jump-prev,
+  .ant-pagination-item-before-jump-next {
+    display: none;
+  }
+}
+@media only screen and (max-width: 576px) {
+  .ant-pagination-options {
+    display: none;
+  }
+}
+.ant-popover {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1030;
+  cursor: auto;
+  user-select: text;
+  white-space: normal;
+  font-weight: normal;
+  text-align: left;
+}
+.ant-popover:after {
+  content: "";
+  position: absolute;
+  background: rgba(255, 255, 255, 0.01);
+}
+.ant-popover-hidden {
+  display: none;
+}
+.ant-popover-placement-top,
+.ant-popover-placement-topLeft,
+.ant-popover-placement-topRight {
+  padding-bottom: 9px;
+}
+.ant-popover-placement-right,
+.ant-popover-placement-rightTop,
+.ant-popover-placement-rightBottom {
+  padding-left: 9px;
+}
+.ant-popover-placement-bottom,
+.ant-popover-placement-bottomLeft,
+.ant-popover-placement-bottomRight {
+  padding-top: 9px;
+}
+.ant-popover-placement-left,
+.ant-popover-placement-leftTop,
+.ant-popover-placement-leftBottom {
+  padding-right: 9px;
+}
+.ant-popover-inner {
+  background-color: #fff;
+  background-clip: padding-box;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-popover-title {
+  min-width: 177px;
+  margin: 0;
+  padding: 5px 16px 4px;
+  min-height: 32px;
+  border-bottom: 1px solid #e8e8e8;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+}
+.ant-popover-inner-content {
+  padding: 12px 16px;
+  color: #54657e;
+}
+.ant-popover-message {
+  padding: 4px 0 12px;
+  font-size: 14px;
+  color: #54657e;
+}
+.ant-popover-message > .anticon {
+  color: #faad14;
+  line-height: 1.6;
+  position: absolute;
+}
+.ant-popover-message-title {
+  padding-left: 22px;
+}
+.ant-popover-buttons {
+  text-align: right;
+  margin-bottom: 4px;
+}
+.ant-popover-buttons button {
+  margin-left: 8px;
+}
+.ant-popover-arrow {
+  background: #fff;
+  width: 7.07106781px;
+  height: 7.07106781px;
+  transform: rotate(45deg);
+  position: absolute;
+  display: block;
+  border-color: transparent;
+  border-style: solid;
+}
+.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow {
+  bottom: 6px;
+  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow {
+  left: 50%;
+  transform: translateX(-50%) rotate(45deg);
+}
+.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow {
+  left: 16px;
+}
+.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow {
+  right: 16px;
+}
+.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow {
+  left: 6px;
+  box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow {
+  top: 50%;
+  transform: translateY(-50%) rotate(45deg);
+}
+.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow {
+  top: 12px;
+}
+.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow {
+  bottom: 12px;
+}
+.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow {
+  top: 6px;
+  box-shadow: -1px -1px 4px rgba(0, 0, 0, 0.06);
+}
+.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow {
+  left: 50%;
+  transform: translateX(-50%) rotate(45deg);
+}
+.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow {
+  left: 16px;
+}
+.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow {
+  right: 16px;
+}
+.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow {
+  right: 6px;
+  box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow {
+  top: 50%;
+  transform: translateY(-50%) rotate(45deg);
+}
+.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow {
+  top: 12px;
+}
+.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow {
+  bottom: 12px;
+}
+.ant-progress {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+}
+.ant-progress-line {
+  width: 100%;
+  font-size: 14px;
+  position: relative;
+}
+.ant-progress-small.ant-progress-line,
+.ant-progress-small.ant-progress-line .ant-progress-text .anticon {
+  font-size: 12px;
+}
+.ant-progress-outer {
+  display: inline-block;
+  width: 100%;
+  margin-right: 0;
+  padding-right: 0;
+}
+.ant-progress-show-info .ant-progress-outer {
+  padding-right: calc(2em + 8px);
+  margin-right: calc(-2em - 8px);
+}
+.ant-progress-inner {
+  display: inline-block;
+  width: 100%;
+  background-color: #f5f5f5;
+  border-radius: 100px;
+  vertical-align: middle;
+  position: relative;
+}
+.ant-progress-circle-trail {
+  stroke: #f5f5f5;
+}
+.ant-progress-circle-path {
+  stroke: #1890ff;
+  animation: ant-progress-appear 0.3s;
+}
+.ant-progress-success-bg,
+.ant-progress-bg {
+  border-radius: 100px;
+  background-color: #1890ff;
+  transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;
+  position: relative;
+}
+.ant-progress-success-bg {
+  background-color: #52c41a;
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.ant-progress-text {
+  word-break: normal;
+  width: 2em;
+  text-align: left;
+  font-size: 1em;
+  margin-left: 8px;
+  vertical-align: middle;
+  display: inline-block;
+  color: rgba(0, 0, 0, 0.45);
+  line-height: 1;
+}
+.ant-progress-text .anticon {
+  font-size: 14px;
+}
+.ant-progress-status-active .ant-progress-bg:before {
+  content: "";
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  border-radius: 10px;
+  animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;
+}
+.ant-progress-status-exception .ant-progress-bg {
+  background-color: #f5222d;
+}
+.ant-progress-status-exception .ant-progress-text {
+  color: #f5222d;
+}
+.ant-progress-status-exception .ant-progress-circle-path {
+  stroke: #f5222d;
+}
+.ant-progress-status-success .ant-progress-bg {
+  background-color: #52c41a;
+}
+.ant-progress-status-success .ant-progress-text {
+  color: #52c41a;
+}
+.ant-progress-status-success .ant-progress-circle-path {
+  stroke: #52c41a;
+}
+.ant-progress-circle .ant-progress-inner {
+  position: relative;
+  line-height: 1;
+  background-color: transparent;
+}
+.ant-progress-circle .ant-progress-text {
+  display: block;
+  position: absolute;
+  width: 100%;
+  text-align: center;
+  line-height: 1;
+  top: 50%;
+  transform: translateY(-50%);
+  left: 0;
+  margin: 0;
+  color: #54657e;
+}
+.ant-progress-circle .ant-progress-text .anticon {
+  font-size: 1.16666667em;
+}
+.ant-progress-circle.ant-progress-status-exception .ant-progress-text {
+  color: #f5222d;
+}
+.ant-progress-circle.ant-progress-status-success .ant-progress-text {
+  color: #52c41a;
+}
+@keyframes ant-progress-active {
+  0% {
+    opacity: 0.1;
+    width: 0;
+  }
+  20% {
+    opacity: 0.5;
+    width: 0;
+  }
+  100% {
+    opacity: 0;
+    width: 100%;
+  }
+}
+.ant-radio-group {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+  line-height: unset;
+}
+.ant-radio-wrapper {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+  position: relative;
+  white-space: nowrap;
+  margin-right: 8px;
+  cursor: pointer;
+}
+.ant-radio {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  white-space: nowrap;
+  outline: none;
+  display: inline-block;
+  position: relative;
+  line-height: 1;
+  vertical-align: text-bottom;
+  cursor: pointer;
+}
+.ant-radio-wrapper:hover .ant-radio .ant-radio-inner,
+.ant-radio:hover .ant-radio-inner,
+.ant-radio-focused .ant-radio-inner {
+  border-color: #1890ff;
+}
+.ant-radio-checked:after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 50%;
+  border: 1px solid #1890ff;
+  content: '';
+  animation: antRadioEffect 0.36s ease-in-out;
+  animation-fill-mode: both;
+  visibility: hidden;
+}
+.ant-radio:hover:after,
+.ant-radio-wrapper:hover .ant-radio:after {
+  visibility: visible;
+}
+.ant-radio-inner {
+  position: relative;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 16px;
+  height: 16px;
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 100px;
+  border-color: #d9d9d9;
+  background-color: #fff;
+  transition: all 0.3s;
+}
+.ant-radio-inner:after {
+  position: absolute;
+  width: 8px;
+  height: 8px;
+  left: 3px;
+  top: 3px;
+  border-radius: 4px;
+  display: table;
+  border-top: 0;
+  border-left: 0;
+  content: ' ';
+  background-color: #1890ff;
+  opacity: 0;
+  transform: scale(0);
+  transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-radio-input {
+  position: absolute;
+  left: 0;
+  z-index: 1;
+  cursor: pointer;
+  opacity: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+}
+.ant-radio-checked .ant-radio-inner {
+  border-color: #1890ff;
+}
+.ant-radio-checked .ant-radio-inner:after {
+  transform: scale(0.875);
+  opacity: 1;
+  transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-radio-disabled .ant-radio-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-radio-disabled .ant-radio-inner:after {
+  background-color: #ccc;
+}
+.ant-radio-disabled .ant-radio-input {
+  cursor: not-allowed;
+}
+.ant-radio-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+span.ant-radio + * {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.ant-radio-button-wrapper {
+  margin: 0;
+  height: 32px;
+  line-height: 30px;
+  color: #54657e;
+  display: inline-block;
+  transition: all 0.3s ease;
+  cursor: pointer;
+  border: 1px solid #d9d9d9;
+  border-left: 0;
+  border-top-width: 1.02px;
+  background: #fff;
+  padding: 0 15px;
+  position: relative;
+}
+.ant-radio-button-wrapper a {
+  color: #54657e;
+}
+.ant-radio-button-wrapper > .ant-radio-button {
+  margin-left: 0;
+  display: block;
+  width: 0;
+  height: 0;
+}
+.ant-radio-group-large .ant-radio-button-wrapper {
+  height: 40px;
+  line-height: 38px;
+  font-size: 16px;
+}
+.ant-radio-group-small .ant-radio-button-wrapper {
+  height: 24px;
+  line-height: 22px;
+  padding: 0 7px;
+}
+.ant-radio-button-wrapper:not(:first-child)::before {
+  content: "";
+  display: block;
+  top: 0;
+  left: -1px;
+  width: 1px;
+  height: 100%;
+  position: absolute;
+  background-color: #d9d9d9;
+}
+.ant-radio-button-wrapper:first-child {
+  border-radius: 4px 0 0 4px;
+  border-left: 1px solid #d9d9d9;
+}
+.ant-radio-button-wrapper:last-child {
+  border-radius: 0 4px 4px 0;
+}
+.ant-radio-button-wrapper:first-child:last-child {
+  border-radius: 4px;
+}
+.ant-radio-button-wrapper:hover,
+.ant-radio-button-wrapper-focused {
+  color: #1890ff;
+  position: relative;
+}
+.ant-radio-button-wrapper .ant-radio-inner,
+.ant-radio-button-wrapper input[type="checkbox"],
+.ant-radio-button-wrapper input[type="radio"] {
+  opacity: 0;
+  width: 0;
+  height: 0;
+}
+.ant-radio-button-wrapper-checked {
+  background: #fff;
+  border-color: #1890ff;
+  color: #1890ff;
+  box-shadow: -1px 0 0 0 #1890ff;
+  z-index: 1;
+}
+.ant-radio-button-wrapper-checked::before {
+  background-color: #1890ff !important;
+  opacity: 0.1;
+}
+.ant-radio-button-wrapper-checked:first-child {
+  border-color: #1890ff;
+  box-shadow: none !important;
+}
+.ant-radio-button-wrapper-checked:hover {
+  border-color: #40a9ff;
+  box-shadow: -1px 0 0 0 #40a9ff;
+  color: #40a9ff;
+}
+.ant-radio-button-wrapper-checked:active {
+  border-color: #096dd9;
+  box-shadow: -1px 0 0 0 #096dd9;
+  color: #096dd9;
+}
+.ant-radio-button-wrapper-disabled {
+  border-color: #d9d9d9;
+  background-color: #f5f5f5;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-radio-button-wrapper-disabled:first-child,
+.ant-radio-button-wrapper-disabled:hover {
+  border-color: #d9d9d9;
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-radio-button-wrapper-disabled:first-child {
+  border-left-color: #d9d9d9;
+}
+.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked {
+  color: #fff;
+  background-color: #e6e6e6;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+@keyframes antRadioEffect {
+  0% {
+    transform: scale(1);
+    opacity: 0.5;
+  }
+  100% {
+    transform: scale(1.6);
+    opacity: 0;
+  }
+}
+.ant-rate {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  line-height: unset;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  font-size: 20px;
+  display: inline-block;
+  color: #fadb14;
+  outline: none;
+}
+.ant-rate-disabled .ant-rate-star {
+  cursor: not-allowed;
+}
+.ant-rate-disabled .ant-rate-star:hover {
+  transform: scale(1);
+}
+.ant-rate-star {
+  margin: 0;
+  padding: 0;
+  display: inline-block;
+  margin-right: 8px;
+  position: relative;
+  transition: all .3s;
+  color: inherit;
+  cursor: pointer;
+}
+.ant-rate-star-first,
+.ant-rate-star-second {
+  user-select: none;
+  transition: all .3s;
+  color: #e8e8e8;
+}
+.ant-rate-star-focused,
+.ant-rate-star:hover {
+  transform: scale(1.1);
+}
+.ant-rate-star-first {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 50%;
+  height: 100%;
+  overflow: hidden;
+  opacity: 0;
+}
+.ant-rate-star-half .ant-rate-star-first,
+.ant-rate-star-half .ant-rate-star-second {
+  opacity: 1;
+}
+.ant-rate-star-half .ant-rate-star-first,
+.ant-rate-star-full .ant-rate-star-second {
+  color: inherit;
+}
+.ant-rate-text {
+  margin-left: 8px;
+  display: inline-block;
+  font-size: 14px;
+}
+.ant-select {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+  position: relative;
+}
+.ant-select ul,
+.ant-select ol {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.ant-select > ul > li > a {
+  padding: 0;
+  background-color: #fff;
+}
+.ant-select-arrow {
+  display: inline-block;
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  position: absolute;
+  top: 50%;
+  right: 11px;
+  line-height: 1;
+  margin-top: -6px;
+  transform-origin: 50% 50%;
+  color: rgba(0, 0, 0, 0.25);
+  font-size: 12px;
+}
+.ant-select-arrow:before {
+  display: block;
+  font-family: "anticon" !important;
+}
+.ant-select-arrow * {
+  display: none;
+}
+.ant-select-arrow:before {
+  content: '\e61d';
+  transition: transform .3s;
+}
+.ant-select-selection {
+  outline: none;
+  user-select: none;
+  box-sizing: border-box;
+  display: block;
+  background-color: #fff;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  border-top-width: 1.02px;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-select-selection:hover {
+  border-color: #40a9ff;
+}
+.ant-select-focused .ant-select-selection,
+.ant-select-selection:focus,
+.ant-select-selection:active {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-select-selection__clear {
+  display: inline-block;
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  text-rendering: auto;
+  opacity: 0;
+  position: absolute;
+  right: 11px;
+  z-index: 1;
+  background: #fff;
+  top: 50%;
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.25);
+  width: 12px;
+  height: 12px;
+  margin-top: -6px;
+  line-height: 12px;
+  cursor: pointer;
+  transition: color 0.3s ease, opacity 0.15s ease;
+}
+.ant-select-selection__clear:before {
+  display: block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e62e";
+}
+.ant-select-selection__clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-select-selection:hover .ant-select-selection__clear {
+  opacity: 1;
+}
+.ant-select-selection-selected-value {
+  float: left;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 100%;
+  padding-right: 20px;
+}
+.ant-select-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-disabled .ant-select-selection {
+  background: #f5f5f5;
+  cursor: not-allowed;
+}
+.ant-select-disabled .ant-select-selection:hover,
+.ant-select-disabled .ant-select-selection:focus,
+.ant-select-disabled .ant-select-selection:active {
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-select-disabled .ant-select-selection__clear {
+  display: none;
+  visibility: hidden;
+  pointer-events: none;
+}
+.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice {
+  background: #f5f5f5;
+  color: #aaa;
+  padding-right: 10px;
+}
+.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice__remove {
+  display: none;
+}
+.ant-select-selection--single {
+  height: 32px;
+  position: relative;
+  cursor: pointer;
+}
+.ant-select-selection__rendered {
+  display: block;
+  margin-left: 11px;
+  margin-right: 11px;
+  position: relative;
+  line-height: 30px;
+}
+.ant-select-selection__rendered:after {
+  content: '.';
+  visibility: hidden;
+  pointer-events: none;
+  display: inline-block;
+  width: 0;
+}
+.ant-select-lg {
+  font-size: 16px;
+}
+.ant-select-lg .ant-select-selection--single {
+  height: 40px;
+}
+.ant-select-lg .ant-select-selection__rendered {
+  line-height: 38px;
+}
+.ant-select-lg .ant-select-selection--multiple {
+  min-height: 40px;
+}
+.ant-select-lg .ant-select-selection--multiple .ant-select-selection__rendered li {
+  height: 32px;
+  line-height: 32px;
+}
+.ant-select-lg .ant-select-selection--multiple .ant-select-selection__clear {
+  top: 20px;
+}
+.ant-select-sm .ant-select-selection--single {
+  height: 24px;
+}
+.ant-select-sm .ant-select-selection__rendered {
+  line-height: 22px;
+  margin: 0 7px;
+}
+.ant-select-sm .ant-select-selection--multiple {
+  min-height: 24px;
+}
+.ant-select-sm .ant-select-selection--multiple .ant-select-selection__rendered li {
+  height: 16px;
+  line-height: 14px;
+}
+.ant-select-sm .ant-select-selection--multiple .ant-select-selection__clear {
+  top: 12px;
+}
+.ant-select-sm .ant-select-selection__clear,
+.ant-select-sm .ant-select-arrow {
+  right: 8px;
+}
+.ant-select-disabled .ant-select-selection__choice__remove {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: default;
+}
+.ant-select-disabled .ant-select-selection__choice__remove:hover {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-search__field__wrap {
+  display: inline-block;
+  position: relative;
+}
+.ant-select-selection__placeholder,
+.ant-select-search__field__placeholder {
+  position: absolute;
+  top: 50%;
+  left: 0;
+  right: 9px;
+  color: #bfbfbf;
+  line-height: 20px;
+  height: 20px;
+  max-width: 100%;
+  margin-top: -10px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  text-align: left;
+}
+.ant-select-search__field__placeholder {
+  left: 12px;
+}
+.ant-select-search__field__mirror {
+  position: absolute;
+  top: 0;
+  left: -9999px;
+  white-space: pre;
+  pointer-events: none;
+}
+.ant-select-search--inline {
+  position: absolute;
+  height: 100%;
+  width: 100%;
+}
+.ant-select-search--inline .ant-select-search__field__wrap {
+  width: 100%;
+  height: 100%;
+}
+.ant-select-search--inline .ant-select-search__field {
+  border-width: 0;
+  font-size: 100%;
+  height: 100%;
+  width: 100%;
+  background: transparent;
+  outline: 0;
+  border-radius: 4px;
+  line-height: 1;
+}
+.ant-select-search--inline > i {
+  float: right;
+}
+.ant-select-selection--multiple {
+  min-height: 32px;
+  cursor: text;
+  padding-bottom: 3px;
+  zoom: 1;
+}
+.ant-select-selection--multiple:before,
+.ant-select-selection--multiple:after {
+  content: " ";
+  display: table;
+}
+.ant-select-selection--multiple:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-select-selection--multiple:before,
+.ant-select-selection--multiple:after {
+  content: " ";
+  display: table;
+}
+.ant-select-selection--multiple:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-select-selection--multiple .ant-select-search--inline {
+  float: left;
+  position: static;
+  width: auto;
+  padding: 0;
+  max-width: 100%;
+}
+.ant-select-selection--multiple .ant-select-search--inline .ant-select-search__field {
+  max-width: 100%;
+  width: 0.75em;
+}
+.ant-select-selection--multiple .ant-select-selection__rendered {
+  margin-left: 5px;
+  margin-bottom: -3px;
+  height: auto;
+}
+.ant-select-selection--multiple .ant-select-selection__placeholder {
+  margin-left: 6px;
+}
+.ant-select-selection--multiple > ul > li,
+.ant-select-selection--multiple .ant-select-selection__rendered > ul > li {
+  margin-top: 3px;
+  height: 24px;
+  line-height: 22px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice {
+  color: #54657e;
+  background-color: #fafafa;
+  border: 1px solid #e8e8e8;
+  border-radius: 2px;
+  cursor: default;
+  float: left;
+  margin-right: 4px;
+  max-width: 99%;
+  position: relative;
+  overflow: hidden;
+  transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  padding: 0 20px 0 10px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__disabled {
+  padding: 0 10px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__content {
+  display: inline-block;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  max-width: 100%;
+  transition: margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove {
+  font-style: normal;
+  vertical-align: baseline;
+  text-align: center;
+  text-transform: none;
+  line-height: 1;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  color: rgba(0, 0, 0, 0.45);
+  line-height: inherit;
+  cursor: pointer;
+  font-weight: bold;
+  transition: all .3s;
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+  position: absolute;
+  right: 4px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove:before {
+  display: block;
+  font-family: "anticon" !important;
+}
+:root .ant-select-selection--multiple .ant-select-selection__choice__remove {
+  font-size: 12px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove:hover {
+  color: #404040;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove:before {
+  content: "\e633";
+}
+.ant-select-selection--multiple .ant-select-selection__clear {
+  top: 16px;
+}
+.ant-select-allow-clear .ant-select-selection--multiple .ant-select-selection__rendered {
+  margin-right: 20px;
+}
+.ant-select-open .ant-select-arrow:before {
+  transform: rotate(180deg);
+}
+.ant-select-open .ant-select-selection {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-select-combobox .ant-select-arrow {
+  display: none;
+}
+.ant-select-combobox .ant-select-search--inline {
+  height: 100%;
+  width: 100%;
+  float: none;
+}
+.ant-select-combobox .ant-select-search__field__wrap {
+  width: 100%;
+  height: 100%;
+}
+.ant-select-combobox .ant-select-search__field {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  z-index: 1;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  box-shadow: none;
+}
+.ant-select-combobox.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered {
+  margin-right: 20px;
+}
+.ant-select-dropdown {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  color: #54657e;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  background-color: #fff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  box-sizing: border-box;
+  z-index: 1050;
+  left: -9999px;
+  top: -9999px;
+  position: absolute;
+  outline: none;
+  font-size: 14px;
+}
+.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft,
+.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft {
+  animation-name: antSlideUpIn;
+}
+.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft,
+.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft {
+  animation-name: antSlideDownIn;
+}
+.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft {
+  animation-name: antSlideUpOut;
+}
+.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft {
+  animation-name: antSlideDownOut;
+}
+.ant-select-dropdown-hidden {
+  display: none;
+}
+.ant-select-dropdown-menu {
+  outline: none;
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none;
+  max-height: 250px;
+  overflow: auto;
+}
+.ant-select-dropdown-menu-item-group-list {
+  margin: 0;
+  padding: 0;
+}
+.ant-select-dropdown-menu-item-group-list > .ant-select-dropdown-menu-item {
+  padding-left: 20px;
+}
+.ant-select-dropdown-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+  padding: 0 12px;
+  height: 32px;
+  line-height: 32px;
+  font-size: 12px;
+}
+.ant-select-dropdown-menu-item {
+  position: relative;
+  display: block;
+  padding: 5px 12px;
+  line-height: 22px;
+  font-weight: normal;
+  color: #54657e;
+  white-space: nowrap;
+  cursor: pointer;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  transition: background 0.3s ease;
+}
+.ant-select-dropdown-menu-item:hover {
+  background-color: #e6f7ff;
+}
+.ant-select-dropdown-menu-item:first-child {
+  border-radius: 4px 4px 0 0;
+}
+.ant-select-dropdown-menu-item:last-child {
+  border-radius: 0 0 4px 4px;
+}
+.ant-select-dropdown-menu-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-select-dropdown-menu-item-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+  cursor: not-allowed;
+}
+.ant-select-dropdown-menu-item-selected,
+.ant-select-dropdown-menu-item-selected:hover {
+  background-color: #fafafa;
+  font-weight: 600;
+  color: #54657e;
+}
+.ant-select-dropdown-menu-item-active {
+  background-color: #e6f7ff;
+}
+.ant-select-dropdown-menu-item-divider {
+  height: 1px;
+  margin: 1px 0;
+  overflow: hidden;
+  background-color: #e8e8e8;
+  line-height: 0;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:after {
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e632";
+  color: transparent;
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+  transition: all 0.2s ease;
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  right: 12px;
+  font-weight: bold;
+  text-shadow: 0 0.1px 0, 0.1px 0 0, 0 -0.1px 0, -0.1px 0;
+}
+:root .ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:after {
+  font-size: 12px;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover:after {
+  color: #ddd;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-disabled:after {
+  display: none;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:after,
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover:after {
+  color: #1890ff;
+  display: inline-block;
+}
+.ant-select-dropdown-container-open .ant-select-dropdown,
+.ant-select-dropdown-open .ant-select-dropdown {
+  display: block;
+}
+.ant-slider {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  margin: 14px 6px 10px;
+  padding: 4px 0;
+  height: 12px;
+  cursor: pointer;
+}
+.ant-slider-vertical {
+  width: 12px;
+  height: 100%;
+  margin: 6px 10px;
+  padding: 0 4px;
+}
+.ant-slider-vertical .ant-slider-rail {
+  height: 100%;
+  width: 4px;
+}
+.ant-slider-vertical .ant-slider-track {
+  width: 4px;
+}
+.ant-slider-vertical .ant-slider-handle {
+  margin-left: -5px;
+  margin-bottom: -7px;
+}
+.ant-slider-vertical .ant-slider-mark {
+  top: 0;
+  left: 12px;
+  width: 18px;
+  height: 100%;
+}
+.ant-slider-vertical .ant-slider-mark-text {
+  left: 4px;
+  white-space: nowrap;
+}
+.ant-slider-vertical .ant-slider-step {
+  width: 4px;
+  height: 100%;
+}
+.ant-slider-vertical .ant-slider-dot {
+  top: auto;
+  left: 2px;
+  margin-bottom: -4px;
+}
+.ant-slider-with-marks {
+  margin-bottom: 28px;
+}
+.ant-slider-rail {
+  position: absolute;
+  width: 100%;
+  height: 4px;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+  transition: background-color 0.3s;
+}
+.ant-slider-track {
+  position: absolute;
+  height: 4px;
+  border-radius: 4px;
+  background-color: #91d5ff;
+  transition: background-color 0.3s ease;
+}
+.ant-slider-handle {
+  position: absolute;
+  margin-left: -7px;
+  margin-top: -5px;
+  width: 14px;
+  height: 14px;
+  cursor: pointer;
+  border-radius: 50%;
+  border: solid 2px #91d5ff;
+  background-color: #fff;
+  transition: border-color 0.3s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);
+}
+.ant-slider-handle:focus {
+  border-color: #46a6ff;
+  box-shadow: 0 0 0 5px #8cc8ff;
+  outline: none;
+}
+.ant-slider-handle.ant-tooltip-open {
+  border-color: #1890ff;
+}
+.ant-slider:hover .ant-slider-rail {
+  background-color: #e1e1e1;
+}
+.ant-slider:hover .ant-slider-track {
+  background-color: #69c0ff;
+}
+.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {
+  border-color: #69c0ff;
+}
+.ant-slider-mark {
+  position: absolute;
+  top: 14px;
+  left: 0;
+  width: 100%;
+  font-size: 14px;
+}
+.ant-slider-mark-text {
+  position: absolute;
+  display: inline-block;
+  vertical-align: middle;
+  text-align: center;
+  cursor: pointer;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-slider-mark-text-active {
+  color: #54657e;
+}
+.ant-slider-step {
+  position: absolute;
+  width: 100%;
+  height: 4px;
+  background: transparent;
+}
+.ant-slider-dot {
+  position: absolute;
+  top: -2px;
+  margin-left: -4px;
+  width: 8px;
+  height: 8px;
+  border: 2px solid #e8e8e8;
+  background-color: #fff;
+  cursor: pointer;
+  border-radius: 50%;
+  vertical-align: middle;
+}
+.ant-slider-dot:first-child {
+  margin-left: -4px;
+}
+.ant-slider-dot:last-child {
+  margin-left: -4px;
+}
+.ant-slider-dot-active {
+  border-color: #8cc8ff;
+}
+.ant-slider-disabled {
+  cursor: not-allowed;
+}
+.ant-slider-disabled .ant-slider-track {
+  background-color: rgba(0, 0, 0, 0.25) !important;
+}
+.ant-slider-disabled .ant-slider-handle,
+.ant-slider-disabled .ant-slider-dot {
+  border-color: rgba(0, 0, 0, 0.25) !important;
+  background-color: #fff;
+  cursor: not-allowed;
+  box-shadow: none;
+}
+.ant-slider-disabled .ant-slider-mark-text,
+.ant-slider-disabled .ant-slider-dot {
+  cursor: not-allowed !important;
+}
+.ant-spin {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  color: #1890ff;
+  vertical-align: middle;
+  text-align: center;
+  opacity: 0;
+  position: absolute;
+  transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+  display: none;
+}
+.ant-spin-spinning {
+  opacity: 1;
+  position: static;
+  display: inline-block;
+}
+.ant-spin-nested-loading {
+  position: relative;
+}
+.ant-spin-nested-loading > div > .ant-spin {
+  position: absolute;
+  height: 100%;
+  max-height: 320px;
+  width: 100%;
+  z-index: 4;
+}
+.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  margin: -10px;
+}
+.ant-spin-nested-loading > div > .ant-spin .ant-spin-text {
+  position: absolute;
+  top: 50%;
+  width: 100%;
+  padding-top: 5px;
+  text-shadow: 0 1px 2px #fff;
+}
+.ant-spin-nested-loading > div > .ant-spin.ant-spin-show-text .ant-spin-dot {
+  margin-top: -20px;
+}
+.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-dot {
+  margin: -7px;
+}
+.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-text {
+  padding-top: 2px;
+}
+.ant-spin-nested-loading > div > .ant-spin-sm.ant-spin-show-text .ant-spin-dot {
+  margin-top: -17px;
+}
+.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-dot {
+  margin: -16px;
+}
+.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-text {
+  padding-top: 11px;
+}
+.ant-spin-nested-loading > div > .ant-spin-lg.ant-spin-show-text .ant-spin-dot {
+  margin-top: -26px;
+}
+.ant-spin-container {
+  position: relative;
+  zoom: 1;
+}
+.ant-spin-container:before,
+.ant-spin-container:after {
+  content: " ";
+  display: table;
+}
+.ant-spin-container:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-spin-container:before,
+.ant-spin-container:after {
+  content: " ";
+  display: table;
+}
+.ant-spin-container:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-spin-blur {
+  overflow: hidden;
+  opacity: 0.7;
+  -webkit-filter: blur(0.5px);
+  filter: blur(0.5px);
+  /* autoprefixer: off */
+  filter: progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, MakeShadow\=false);
+  -webkit-transform: translateZ(0);
+}
+.ant-spin-blur:after {
+  content: '';
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  background: #fff;
+  opacity: 0.3;
+  transition: all .3s;
+  z-index: 10;
+}
+.ant-spin-tip {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-spin-dot {
+  position: relative;
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+}
+.ant-spin-dot i {
+  width: 9px;
+  height: 9px;
+  border-radius: 100%;
+  background-color: #1890ff;
+  transform: scale(0.75);
+  display: block;
+  position: absolute;
+  opacity: 0.3;
+  animation: antSpinMove 1s infinite linear alternate;
+  transform-origin: 50% 50%;
+}
+.ant-spin-dot i:nth-child(1) {
+  left: 0;
+  top: 0;
+}
+.ant-spin-dot i:nth-child(2) {
+  right: 0;
+  top: 0;
+  animation-delay: 0.4s;
+}
+.ant-spin-dot i:nth-child(3) {
+  right: 0;
+  bottom: 0;
+  animation-delay: 0.8s;
+}
+.ant-spin-dot i:nth-child(4) {
+  left: 0;
+  bottom: 0;
+  animation-delay: 1.2s;
+}
+.ant-spin-dot-spin {
+  transform: rotate(45deg);
+  animation: antRotate 1.2s infinite linear;
+}
+.ant-spin-sm .ant-spin-dot {
+  width: 14px;
+  height: 14px;
+}
+.ant-spin-sm .ant-spin-dot i {
+  width: 6px;
+  height: 6px;
+}
+.ant-spin-lg .ant-spin-dot {
+  width: 32px;
+  height: 32px;
+}
+.ant-spin-lg .ant-spin-dot i {
+  width: 14px;
+  height: 14px;
+}
+.ant-spin.ant-spin-show-text .ant-spin-text {
+  display: block;
+}
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+  /* IE10+ */
+  .ant-spin-blur {
+    background: #fff;
+    opacity: 0.5;
+  }
+}
+@keyframes antSpinMove {
+  to {
+    opacity: 1;
+  }
+}
+@keyframes antRotate {
+  to {
+    transform: rotate(405deg);
+  }
+}
+.ant-steps {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  font-size: 0;
+  width: 100%;
+  display: flex;
+}
+.ant-steps-item {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  flex: 1;
+  overflow: hidden;
+}
+.ant-steps-item:last-child {
+  flex: none;
+}
+.ant-steps-item:last-child .ant-steps-item-tail,
+.ant-steps-item:last-child .ant-steps-item-title:after {
+  display: none;
+}
+.ant-steps-item-icon,
+.ant-steps-item-content {
+  display: inline-block;
+  vertical-align: top;
+}
+.ant-steps-item-icon {
+  border: 1px solid rgba(0, 0, 0, 0.25);
+  width: 32px;
+  height: 32px;
+  line-height: 32px;
+  text-align: center;
+  border-radius: 32px;
+  font-size: 16px;
+  margin-right: 8px;
+  transition: background-color 0.3s, border-color 0.3s;
+  font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+.ant-steps-item-icon > .ant-steps-icon {
+  line-height: 1;
+  top: -1px;
+  color: #1890ff;
+  position: relative;
+}
+.ant-steps-item-tail {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  top: 12px;
+  padding: 0 10px;
+}
+.ant-steps-item-tail:after {
+  content: '';
+  display: inline-block;
+  background: #e8e8e8;
+  height: 1px;
+  border-radius: 1px;
+  width: 100%;
+  transition: background .3s;
+}
+.ant-steps-item-title {
+  font-size: 16px;
+  color: #54657e;
+  display: inline-block;
+  padding-right: 16px;
+  position: relative;
+  line-height: 32px;
+}
+.ant-steps-item-title:after {
+  content: '';
+  height: 1px;
+  width: 9999px;
+  background: #e8e8e8;
+  display: block;
+  position: absolute;
+  top: 16px;
+  left: 100%;
+}
+.ant-steps-item-description {
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait .ant-steps-item-icon {
+  border-color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+}
+.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: rgba(0, 0, 0, 0.25);
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process .ant-steps-item-icon {
+  border-color: #1890ff;
+  background-color: #fff;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: #1890ff;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: #1890ff;
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-description {
+  color: #54657e;
+}
+.ant-steps-item-process > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process .ant-steps-item-icon {
+  background: #1890ff;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: #fff;
+}
+.ant-steps-item-process .ant-steps-item-title {
+  font-weight: 500;
+}
+.ant-steps-item-finish .ant-steps-item-icon {
+  border-color: #1890ff;
+  background-color: #fff;
+}
+.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon {
+  color: #1890ff;
+}
+.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: #1890ff;
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title {
+  color: #54657e;
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #1890ff;
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-finish > .ant-steps-item-tail:after {
+  background-color: #1890ff;
+}
+.ant-steps-item-error .ant-steps-item-icon {
+  border-color: #f5222d;
+  background-color: #fff;
+}
+.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon {
+  color: #f5222d;
+}
+.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title {
+  color: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-description {
+  color: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after {
+  background: #f5222d;
+}
+.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {
+  margin-right: 16px;
+  white-space: nowrap;
+}
+.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child {
+  margin-right: 0;
+}
+.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title {
+  padding-right: 0;
+}
+.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail {
+  display: none;
+}
+.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description {
+  max-width: 140px;
+}
+.ant-steps-item-custom .ant-steps-item-icon {
+  background: none;
+  border: 0;
+  width: auto;
+  height: auto;
+}
+.ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {
+  font-size: 24px;
+  line-height: 32px;
+  top: 0;
+  left: 0.5px;
+  width: 32px;
+  height: 32px;
+}
+.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: #1890ff;
+}
+.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item {
+  margin-right: 12px;
+}
+.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child {
+  margin-right: 0;
+}
+.ant-steps-small .ant-steps-item-icon {
+  width: 24px;
+  height: 24px;
+  line-height: 24px;
+  text-align: center;
+  border-radius: 24px;
+  font-size: 12px;
+}
+.ant-steps-small .ant-steps-item-title {
+  font-size: 14px;
+  line-height: 24px;
+  padding-right: 12px;
+}
+.ant-steps-small .ant-steps-item-title:after {
+  top: 12px;
+}
+.ant-steps-small .ant-steps-item-description {
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-small .ant-steps-item-tail {
+  top: 8px;
+  padding: 0 8px;
+}
+.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon {
+  width: inherit;
+  height: inherit;
+  line-height: inherit;
+  border-radius: 0;
+  border: 0;
+  background: none;
+}
+.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon {
+  font-size: 24px;
+  line-height: 24px;
+  transform: none;
+}
+.ant-steps-vertical {
+  display: block;
+}
+.ant-steps-vertical .ant-steps-item {
+  display: block;
+  overflow: visible;
+}
+.ant-steps-vertical .ant-steps-item-icon {
+  float: left;
+  margin-right: 16px;
+}
+.ant-steps-vertical .ant-steps-item-content {
+  min-height: 48px;
+  overflow: hidden;
+  display: block;
+}
+.ant-steps-vertical .ant-steps-item-title {
+  line-height: 32px;
+}
+.ant-steps-vertical .ant-steps-item-description {
+  padding-bottom: 12px;
+}
+.ant-steps-vertical > .ant-steps-item > .ant-steps-item-tail {
+  position: absolute;
+  left: 16px;
+  top: 0;
+  height: 100%;
+  width: 1px;
+  padding: 38px 0 6px;
+}
+.ant-steps-vertical > .ant-steps-item > .ant-steps-item-tail:after {
+  height: 100%;
+  width: 1px;
+}
+.ant-steps-vertical > .ant-steps-item:not(:last-child) > .ant-steps-item-tail {
+  display: block;
+}
+.ant-steps-vertical > .ant-steps-item > .ant-steps-item-content > .ant-steps-item-title:after {
+  display: none;
+}
+.ant-steps-vertical.ant-steps-small .ant-steps-item-tail {
+  position: absolute;
+  left: 12px;
+  top: 0;
+  padding: 30px 0 6px;
+}
+.ant-steps-vertical.ant-steps-small .ant-steps-item-title {
+  line-height: 24px;
+}
+@media (max-width: 480px) {
+  .ant-steps-horizontal.ant-steps-label-horizontal {
+    display: block;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item {
+    display: block;
+    overflow: visible;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon {
+    float: left;
+    margin-right: 16px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-content {
+    min-height: 48px;
+    overflow: hidden;
+    display: block;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-title {
+    line-height: 32px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-description {
+    padding-bottom: 12px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-tail {
+    position: absolute;
+    left: 16px;
+    top: 0;
+    height: 100%;
+    width: 1px;
+    padding: 38px 0 6px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-tail:after {
+    height: 100%;
+    width: 1px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item:not(:last-child) > .ant-steps-item-tail {
+    display: block;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-content > .ant-steps-item-title:after {
+    display: none;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-tail {
+    position: absolute;
+    left: 12px;
+    top: 0;
+    padding: 30px 0 6px;
+  }
+  .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-title {
+    line-height: 24px;
+  }
+}
+.ant-steps-label-vertical .ant-steps-item {
+  overflow: visible;
+}
+.ant-steps-label-vertical .ant-steps-item-tail {
+  padding: 0 24px;
+  margin-left: 48px;
+}
+.ant-steps-label-vertical .ant-steps-item-content {
+  display: block;
+  text-align: center;
+  margin-top: 8px;
+  width: 140px;
+}
+.ant-steps-label-vertical .ant-steps-item-icon {
+  display: inline-block;
+  margin-left: 36px;
+}
+.ant-steps-label-vertical .ant-steps-item-title {
+  padding-right: 0;
+}
+.ant-steps-label-vertical .ant-steps-item-title:after {
+  display: none;
+}
+.ant-steps-label-vertical .ant-steps-item-description {
+  text-align: left;
+}
+.ant-steps-dot .ant-steps-item-title {
+  line-height: 1.5;
+}
+.ant-steps-dot .ant-steps-item-tail {
+  width: 100%;
+  top: 2px;
+  margin: 0 0 0 70px;
+  padding: 0;
+}
+.ant-steps-dot .ant-steps-item-tail:after {
+  height: 3px;
+  width: calc(100% - 20px);
+  margin-left: 12px;
+}
+.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {
+  left: 2px;
+}
+.ant-steps-dot .ant-steps-item-icon {
+  padding-right: 0;
+  width: 8px;
+  height: 8px;
+  line-height: 8px;
+  border: 0;
+  margin-left: 67px;
+  background: transparent;
+}
+.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot {
+  float: left;
+  width: 100%;
+  height: 100%;
+  border-radius: 100px;
+  position: relative;
+  transition: all .3s;
+  /* expand hover area */
+}
+.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after {
+  content: "";
+  background: rgba(0, 0, 0, 0.001);
+  width: 60px;
+  height: 32px;
+  position: absolute;
+  top: -12px;
+  left: -26px;
+}
+.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon {
+  width: 10px;
+  height: 10px;
+  line-height: 10px;
+}
+.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon .ant-steps-icon-dot {
+  top: -1px;
+}
+.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon {
+  margin-left: 0;
+  margin-top: 8px;
+}
+.ant-steps-vertical.ant-steps-dot .ant-steps-item-tail {
+  margin: 0;
+  left: -9px;
+  top: 2px;
+  padding: 22px 0 4px;
+}
+.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot {
+  left: 0;
+}
+.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot {
+  left: -2px;
+}
+.ant-switch {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  box-sizing: border-box;
+  height: 22px;
+  min-width: 44px;
+  line-height: 20px;
+  vertical-align: middle;
+  border-radius: 100px;
+  border: 1px solid transparent;
+  background-color: rgba(0, 0, 0, 0.25);
+  cursor: pointer;
+  transition: all 0.36s;
+  user-select: none;
+}
+.ant-switch-inner {
+  color: #fff;
+  font-size: 12px;
+  margin-left: 24px;
+  margin-right: 6px;
+  display: block;
+}
+.ant-switch:before,
+.ant-switch:after {
+  position: absolute;
+  width: 18px;
+  height: 18px;
+  left: 1px;
+  top: 1px;
+  border-radius: 18px;
+  background-color: #fff;
+  content: " ";
+  cursor: pointer;
+  transition: all 0.36s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-switch:after {
+  box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
+}
+.ant-switch:active:before,
+.ant-switch:active:after {
+  width: 24px;
+}
+.ant-switch:before {
+  content: "\e64d";
+  font-family: anticon;
+  animation: loadingCircle 1s infinite linear;
+  text-align: center;
+  background: transparent;
+  z-index: 1;
+  display: none;
+  font-size: 12px;
+}
+.ant-switch-loading:before {
+  display: inline-block;
+  color: #54657e;
+}
+.ant-switch-checked.ant-switch-loading:before {
+  color: #1890ff;
+}
+.ant-switch:focus {
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  outline: 0;
+}
+.ant-switch:focus:hover {
+  box-shadow: none;
+}
+.ant-switch-small {
+  height: 16px;
+  min-width: 28px;
+  line-height: 14px;
+}
+.ant-switch-small .ant-switch-inner {
+  margin-left: 18px;
+  margin-right: 3px;
+  font-size: 12px;
+}
+.ant-switch-small:before,
+.ant-switch-small:after {
+  width: 12px;
+  height: 12px;
+}
+.ant-switch-small:active:before,
+.ant-switch-small:active:after {
+  width: 16px;
+}
+.ant-switch-small.ant-switch-checked:before,
+.ant-switch-small.ant-switch-checked:after {
+  left: 100%;
+  margin-left: -12.5px;
+}
+.ant-switch-small.ant-switch-checked .ant-switch-inner {
+  margin-left: 3px;
+  margin-right: 18px;
+}
+.ant-switch-small:active.ant-switch-checked:before,
+.ant-switch-small:active.ant-switch-checked:after {
+  margin-left: -16.5px;
+}
+.ant-switch-small.ant-switch-loading:before {
+  animation: AntSwitchSmallLoadingCircle 1s infinite linear;
+  font-weight: bold;
+}
+.ant-switch-checked {
+  background-color: #1890ff;
+}
+.ant-switch-checked .ant-switch-inner {
+  margin-left: 6px;
+  margin-right: 24px;
+}
+.ant-switch-checked:before,
+.ant-switch-checked:after {
+  left: 100%;
+  margin-left: -19px;
+}
+.ant-switch-checked:active:before,
+.ant-switch-checked:active:after {
+  margin-left: -25px;
+}
+.ant-switch-loading,
+.ant-switch-disabled {
+  pointer-events: none;
+  opacity: 0.4;
+}
+@keyframes AntSwitchSmallLoadingCircle {
+  0% {
+    transform-origin: 50% 50%;
+    transform: rotate(0deg) scale(0.66667);
+  }
+  100% {
+    transform-origin: 50% 50%;
+    transform: rotate(360deg) scale(0.66667);
+  }
+}
+.ant-table-wrapper {
+  zoom: 1;
+}
+.ant-table-wrapper:before,
+.ant-table-wrapper:after {
+  content: " ";
+  display: table;
+}
+.ant-table-wrapper:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-table-wrapper:before,
+.ant-table-wrapper:after {
+  content: " ";
+  display: table;
+}
+.ant-table-wrapper:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-table {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  border-radius: 4px 4px 0 0;
+  clear: both;
+}
+.ant-table-body {
+  transition: opacity .3s;
+}
+.ant-table table {
+  width: 100%;
+  border-collapse: separate;
+  border-spacing: 0;
+  text-align: left;
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-thead > tr > th {
+  background: #fafafa;
+  transition: background .3s ease;
+  text-align: left;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-thead > tr > th:first-child {
+  border-top-left-radius: 4px;
+}
+.ant-table-thead > tr > th:last-child {
+  border-top-right-radius: 4px;
+}
+.ant-table-thead > tr > th[colspan] {
+  text-align: center;
+  border-bottom: 0;
+}
+.ant-table-thead > tr > th .anticon-filter,
+.ant-table-thead > tr > th .ant-table-filter-icon {
+  position: relative;
+  margin-left: 8px;
+  font-size: 14px;
+  cursor: pointer;
+  color: rgba(0, 0, 0, 0.45);
+  transition: all .3s;
+  width: 14px;
+  font-weight: normal;
+  vertical-align: text-bottom;
+}
+.ant-table-thead > tr > th .anticon-filter:hover,
+.ant-table-thead > tr > th .ant-table-filter-icon:hover {
+  color: #54657e;
+}
+.ant-table-thead > tr > th .ant-table-column-sorter + .anticon-filter {
+  margin-left: 4px;
+}
+.ant-table-thead > tr > th .ant-table-filter-selected.anticon-filter {
+  color: #1890ff;
+}
+.ant-table-thead > tr > th.ant-table-column-has-filters {
+  overflow: hidden;
+}
+.ant-table-tbody > tr > td {
+  border-bottom: 1px solid #e8e8e8;
+  transition: all .3s;
+}
+.ant-table-thead > tr,
+.ant-table-tbody > tr {
+  transition: all .3s;
+}
+.ant-table-thead > tr.ant-table-row-hover > td,
+.ant-table-tbody > tr.ant-table-row-hover > td,
+.ant-table-thead > tr:hover > td,
+.ant-table-tbody > tr:hover > td {
+  background: #e6f7ff;
+}
+.ant-table-thead > tr:hover {
+  background: none;
+}
+.ant-table-footer {
+  padding: 16px 16px;
+  background: #fafafa;
+  border-radius: 0 0 4px 4px;
+  position: relative;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-table-footer:before {
+  content: '';
+  height: 1px;
+  background: #fafafa;
+  position: absolute;
+  top: -1px;
+  width: 100%;
+  left: 0;
+}
+.ant-table.ant-table-bordered .ant-table-footer {
+  border: 1px solid #e8e8e8;
+}
+.ant-table-title {
+  padding: 16px 0;
+  position: relative;
+  top: 1px;
+  border-radius: 4px 4px 0 0;
+}
+.ant-table.ant-table-bordered .ant-table-title {
+  border: 1px solid #e8e8e8;
+  padding-left: 16px;
+  padding-right: 16px;
+}
+.ant-table-title + .ant-table-content {
+  position: relative;
+  border-radius: 4px 4px 0 0;
+  overflow: hidden;
+}
+.ant-table-bordered .ant-table-title + .ant-table-content,
+.ant-table-bordered .ant-table-title + .ant-table-content table {
+  border-radius: 0;
+}
+.ant-table-without-column-header .ant-table-title + .ant-table-content,
+.ant-table-without-column-header table {
+  border-radius: 0;
+}
+.ant-table-tbody > tr.ant-table-row-selected td {
+  background: #fafafa;
+}
+.ant-table-thead > tr > th.ant-table-column-sort {
+  background: #f5f5f5;
+}
+.ant-table-thead > tr > th,
+.ant-table-tbody > tr > td {
+  padding: 16px 16px;
+  word-break: break-all;
+}
+.ant-table-thead > tr > th.ant-table-selection-column-custom {
+  padding-left: 16px;
+  padding-right: 0;
+}
+.ant-table-thead > tr > th.ant-table-selection-column,
+.ant-table-tbody > tr > td.ant-table-selection-column {
+  text-align: center;
+  min-width: 62px;
+  width: 62px;
+}
+.ant-table-thead > tr > th.ant-table-selection-column .ant-radio-wrapper,
+.ant-table-tbody > tr > td.ant-table-selection-column .ant-radio-wrapper {
+  margin-right: 0;
+}
+.ant-table-expand-icon-th,
+.ant-table-row-expand-icon-cell {
+  text-align: center;
+  min-width: 50px;
+  width: 50px;
+}
+.ant-table-header {
+  background: #fafafa;
+  overflow: hidden;
+}
+.ant-table-header table {
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-loading {
+  position: relative;
+}
+.ant-table-loading .ant-table-body {
+  background: #fff;
+  opacity: 0.5;
+}
+.ant-table-loading .ant-table-spin-holder {
+  height: 20px;
+  line-height: 20px;
+  left: 50%;
+  top: 50%;
+  margin-left: -30px;
+  position: absolute;
+}
+.ant-table-loading .ant-table-with-pagination {
+  margin-top: -20px;
+}
+.ant-table-loading .ant-table-without-pagination {
+  margin-top: 10px;
+}
+.ant-table-column-sorter {
+  position: relative;
+  margin-left: 8px;
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  vertical-align: middle;
+  text-align: center;
+  font-weight: normal;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-table-column-sorter-up,
+.ant-table-column-sorter-down {
+  line-height: 6px;
+  display: block;
+  width: 14px;
+  height: 6px;
+  cursor: pointer;
+  position: relative;
+}
+.ant-table-column-sorter-up:hover .anticon,
+.ant-table-column-sorter-down:hover .anticon {
+  color: #69c0ff;
+}
+.ant-table-column-sorter-up.on .anticon-caret-up,
+.ant-table-column-sorter-down.on .anticon-caret-up,
+.ant-table-column-sorter-up.on .anticon-caret-down,
+.ant-table-column-sorter-down.on .anticon-caret-down {
+  color: #1890ff;
+}
+.ant-table-column-sorter-up:after,
+.ant-table-column-sorter-down:after {
+  position: absolute;
+  content: '';
+  height: 30px;
+  width: 14px;
+  left: 0;
+}
+.ant-table-column-sorter-up:after {
+  bottom: 0;
+}
+.ant-table-column-sorter-down:after {
+  top: 0;
+}
+.ant-table-column-sorter .anticon-caret-up,
+.ant-table-column-sorter .anticon-caret-down {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 8px \9;
+  transform: scale(0.66666667) rotate(0deg);
+  line-height: 4px;
+  height: 4px;
+  transition: all .3s;
+}
+:root .ant-table-column-sorter .anticon-caret-up,
+:root .ant-table-column-sorter .anticon-caret-down {
+  font-size: 12px;
+}
+.ant-table-bordered .ant-table-header > table,
+.ant-table-bordered .ant-table-body > table,
+.ant-table-bordered .ant-table-fixed-left table,
+.ant-table-bordered .ant-table-fixed-right table {
+  border: 1px solid #e8e8e8;
+  border-right: 0;
+  border-bottom: 0;
+}
+.ant-table-bordered.ant-table-empty .ant-table-placeholder {
+  border-left: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-header > table {
+  border-bottom: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-body > table {
+  border-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner > table {
+  border-top: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder {
+  border: 0;
+}
+.ant-table-bordered .ant-table-thead > tr > th {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-bordered .ant-table-thead > tr > th,
+.ant-table-bordered .ant-table-tbody > tr > td {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-placeholder {
+  position: relative;
+  padding: 16px 16px;
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+  text-align: center;
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.45);
+  z-index: 1;
+}
+.ant-table-placeholder .anticon {
+  margin-right: 4px;
+}
+.ant-table-pagination.ant-pagination {
+  margin: 16px 0;
+  float: right;
+}
+.ant-table-filter-dropdown {
+  min-width: 96px;
+  margin-left: -8px;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-filter-dropdown .ant-dropdown-menu {
+  border: 0;
+  box-shadow: none;
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-filter-dropdown .ant-dropdown-menu-without-submenu {
+  max-height: 400px;
+  overflow-x: hidden;
+}
+.ant-table-filter-dropdown .ant-dropdown-menu-item > label + span {
+  padding-right: 0;
+}
+.ant-table-filter-dropdown .ant-dropdown-menu-sub {
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after {
+  color: #1890ff;
+  font-weight: bold;
+  text-shadow: 0 0 2px #bae7ff;
+}
+.ant-table-filter-dropdown .ant-dropdown-menu-item {
+  overflow: hidden;
+}
+.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-item:last-child,
+.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title {
+  border-radius: 0;
+}
+.ant-table-filter-dropdown-btns {
+  overflow: hidden;
+  padding: 7px 8px;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-table-filter-dropdown-link {
+  color: #1890ff;
+}
+.ant-table-filter-dropdown-link:hover {
+  color: #40a9ff;
+}
+.ant-table-filter-dropdown-link:active {
+  color: #096dd9;
+}
+.ant-table-filter-dropdown-link.confirm {
+  float: left;
+}
+.ant-table-filter-dropdown-link.clear {
+  float: right;
+}
+.ant-table-selection-select-all-custom {
+  margin-right: 4px !important;
+}
+.ant-table-selection .anticon-down {
+  color: rgba(0, 0, 0, 0.45);
+  transition: all .3s;
+}
+.ant-table-selection-menu {
+  min-width: 96px;
+  margin-top: 5px;
+  margin-left: -30px;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-selection-menu .ant-action-down {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-table-selection-down {
+  cursor: pointer;
+  padding: 0;
+  display: inline-block;
+  line-height: 1;
+}
+.ant-table-selection-down:hover .anticon-down {
+  color: #666;
+}
+.ant-table-row-expand-icon {
+  cursor: pointer;
+  display: inline-block;
+  width: 17px;
+  height: 17px;
+  text-align: center;
+  line-height: 14px;
+  border: 1px solid #e8e8e8;
+  user-select: none;
+  background: #fff;
+}
+.ant-table-row-expanded:after {
+  content: '-';
+}
+.ant-table-row-collapsed:after {
+  content: '+';
+}
+.ant-table-row-spaced {
+  visibility: hidden;
+}
+.ant-table-row-spaced:after {
+  content: '.';
+}
+.ant-table-row[class*="ant-table-row-level-0"] .ant-table-selection-column > span {
+  display: inline-block;
+}
+tr.ant-table-expanded-row,
+tr.ant-table-expanded-row:hover {
+  background: #fbfbfb;
+}
+.ant-table .ant-table-row-indent + .ant-table-row-expand-icon {
+  margin-right: 8px;
+}
+.ant-table-scroll {
+  overflow: auto;
+  overflow-x: hidden;
+}
+.ant-table-scroll table {
+  width: auto;
+  min-width: 100%;
+}
+.ant-table-body-inner {
+  height: 100%;
+}
+.ant-table-fixed-header > .ant-table-content > .ant-table-scroll > .ant-table-body {
+  position: relative;
+  background: #fff;
+}
+.ant-table-fixed-header .ant-table-body-inner {
+  overflow: scroll;
+}
+.ant-table-fixed-header .ant-table-scroll .ant-table-header {
+  overflow: scroll;
+  padding-bottom: 20px;
+  margin-bottom: -20px;
+}
+.ant-table-fixed-left,
+.ant-table-fixed-right {
+  position: absolute;
+  top: 0;
+  overflow: hidden;
+  transition: box-shadow 0.3s ease;
+  border-radius: 0;
+}
+.ant-table-fixed-left table,
+.ant-table-fixed-right table {
+  width: auto;
+  background: #fff;
+}
+.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed,
+.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed {
+  border-radius: 0;
+}
+.ant-table-fixed-left {
+  left: 0;
+  box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15);
+}
+.ant-table-fixed-left .ant-table-header {
+  overflow-y: hidden;
+}
+.ant-table-fixed-left .ant-table-body-inner {
+  margin-right: -20px;
+  padding-right: 20px;
+}
+.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-inner {
+  padding-right: 0;
+}
+.ant-table-fixed-left,
+.ant-table-fixed-left table {
+  border-radius: 4px 0 0 0;
+}
+.ant-table-fixed-left .ant-table-thead > tr > th:last-child {
+  border-top-right-radius: 0;
+}
+.ant-table-fixed-right {
+  right: 0;
+  box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15);
+}
+.ant-table-fixed-right,
+.ant-table-fixed-right table {
+  border-radius: 0 4px 0 0;
+}
+.ant-table-fixed-right .ant-table-expanded-row {
+  color: transparent;
+  pointer-events: none;
+}
+.ant-table-fixed-right .ant-table-thead > tr > th:first-child {
+  border-top-left-radius: 0;
+}
+.ant-table.ant-table-scroll-position-left .ant-table-fixed-left {
+  box-shadow: none;
+}
+.ant-table.ant-table-scroll-position-right .ant-table-fixed-right {
+  box-shadow: none;
+}
+.ant-table-middle > .ant-table-title,
+.ant-table-middle > .ant-table-footer {
+  padding: 12px 8px;
+}
+.ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td,
+.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td {
+  padding: 12px 8px;
+}
+.ant-table-small {
+  border: 1px solid #e8e8e8;
+  border-radius: 4px;
+}
+.ant-table-small > .ant-table-title,
+.ant-table-small > .ant-table-footer {
+  padding: 8px 8px;
+}
+.ant-table-small > .ant-table-title {
+  border-bottom: 1px solid #e8e8e8;
+  top: 0;
+}
+.ant-table-small > .ant-table-content > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-body > table,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table {
+  border: 0;
+  padding: 0 8px;
+}
+.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td {
+  padding: 8px 8px;
+}
+.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th {
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table {
+  padding: 0;
+}
+.ant-table-small > .ant-table-content .ant-table-header {
+  background: #fff;
+}
+.ant-table-small > .ant-table-content .ant-table-placeholder,
+.ant-table-small > .ant-table-content .ant-table-row:last-child td {
+  border-bottom: 0;
+}
+.ant-table-small.ant-table-bordered {
+  border-right: 0;
+}
+.ant-table-small.ant-table-bordered .ant-table-title {
+  border: 0;
+  border-bottom: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-content {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-footer {
+  border: 0;
+  border-top: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-footer:before {
+  display: none;
+}
+.ant-table-small.ant-table-bordered .ant-table-placeholder {
+  border-left: 0;
+  border-bottom: 0;
+}
+.ant-table-small.ant-table-bordered .ant-table-thead > tr > th:last-child,
+.ant-table-small.ant-table-bordered .ant-table-tbody > tr > td:last-child {
+  border-right: none;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-container {
+  height: 40px;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-ink-bar {
+  visibility: hidden;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  margin: 0;
+  border: 1px solid #e8e8e8;
+  border-bottom: 0;
+  border-radius: 4px 4px 0 0;
+  background: #fafafa;
+  margin-right: 2px;
+  padding: 0 16px;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  line-height: 38px;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active {
+  background: #fff;
+  border-color: #e8e8e8;
+  color: #1890ff;
+  padding-bottom: 1px;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-inactive {
+  padding: 0;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-bottom: 0;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .anticon-close {
+  color: rgba(0, 0, 0, 0.45);
+  transition: all .3s;
+  font-size: 12px;
+  margin-left: 3px;
+  margin-right: -5px;
+  overflow: hidden;
+  vertical-align: middle;
+  width: 16px;
+  height: 16px;
+  height: 14px;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .anticon-close:hover {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-tabs.ant-tabs-card .ant-tabs-content > .ant-tabs-tabpane,
+.ant-tabs.ant-tabs-editable-card .ant-tabs-content > .ant-tabs-tabpane {
+  transition: none !important;
+}
+.ant-tabs.ant-tabs-card .ant-tabs-content > .ant-tabs-tabpane-inactive,
+.ant-tabs.ant-tabs-editable-card .ant-tabs-content > .ant-tabs-tabpane-inactive {
+  overflow: hidden;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab:hover .anticon-close {
+  opacity: 1;
+}
+.ant-tabs-extra-content {
+  line-height: 40px;
+}
+.ant-tabs-extra-content .ant-tabs-new-tab {
+  width: 20px;
+  height: 20px;
+  line-height: 20px;
+  text-align: center;
+  cursor: pointer;
+  border-radius: 2px;
+  border: 1px solid #e8e8e8;
+  font-size: 12px;
+  color: #54657e;
+  transition: all .3s;
+}
+.ant-tabs-extra-content .ant-tabs-new-tab:hover {
+  color: #1890ff;
+  border-color: #1890ff;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-container {
+  height: auto;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  border-bottom: 1px solid #e8e8e8;
+  margin-bottom: 8px;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active {
+  padding-bottom: 4px;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab:last-child {
+  margin-bottom: 8px;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-new-tab {
+  width: 90%;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-right: 0;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab {
+  border-right: 0;
+  border-radius: 4px 0 0 4px;
+  margin-right: 1px;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab-active {
+  margin-right: -1px;
+  padding-right: 18px;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-left: 0;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab {
+  border-left: 0;
+  border-radius: 0 4px 4px 0;
+  margin-left: 1px;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab-active {
+  margin-left: -1px;
+  padding-left: 18px;
+}
+.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab {
+  border-bottom: 1px solid #e8e8e8;
+  border-top: 0;
+  border-radius: 0 0 4px 4px;
+}
+.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab-active {
+  color: #1890ff;
+  padding-bottom: 0;
+  padding-top: 1px;
+}
+.ant-tabs {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  overflow: hidden;
+  zoom: 1;
+}
+.ant-tabs:before,
+.ant-tabs:after {
+  content: " ";
+  display: table;
+}
+.ant-tabs:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-tabs:before,
+.ant-tabs:after {
+  content: " ";
+  display: table;
+}
+.ant-tabs:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-tabs-ink-bar {
+  z-index: 1;
+  position: absolute;
+  left: 0;
+  bottom: 1px;
+  box-sizing: border-box;
+  height: 2px;
+  background-color: #1890ff;
+  transform-origin: 0 0;
+}
+.ant-tabs-bar {
+  border-bottom: 1px solid #e8e8e8;
+  margin: 0 0 16px 0;
+  outline: none;
+  transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-tabs-nav-container {
+  overflow: hidden;
+  font-size: 14px;
+  line-height: 1.5;
+  box-sizing: border-box;
+  position: relative;
+  white-space: nowrap;
+  margin-bottom: -1px;
+  transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  zoom: 1;
+}
+.ant-tabs-nav-container:before,
+.ant-tabs-nav-container:after {
+  content: " ";
+  display: table;
+}
+.ant-tabs-nav-container:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-tabs-nav-container:before,
+.ant-tabs-nav-container:after {
+  content: " ";
+  display: table;
+}
+.ant-tabs-nav-container:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-tabs-nav-container-scrolling {
+  padding-left: 32px;
+  padding-right: 32px;
+}
+.ant-tabs-bottom .ant-tabs-bar {
+  border-bottom: none;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-tabs-bottom .ant-tabs-ink-bar {
+  bottom: auto;
+  top: 1px;
+}
+.ant-tabs-bottom .ant-tabs-nav-container {
+  margin-bottom: 0;
+  margin-top: -1px;
+}
+.ant-tabs-tab-prev,
+.ant-tabs-tab-next {
+  user-select: none;
+  z-index: 2;
+  width: 0;
+  height: 100%;
+  cursor: pointer;
+  border: 0;
+  background-color: transparent;
+  position: absolute;
+  text-align: center;
+  color: rgba(0, 0, 0, 0.45);
+  transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  opacity: 0;
+  pointer-events: none;
+}
+.ant-tabs-tab-prev.ant-tabs-tab-arrow-show,
+.ant-tabs-tab-next.ant-tabs-tab-arrow-show {
+  opacity: 1;
+  width: 32px;
+  height: 100%;
+  pointer-events: auto;
+}
+.ant-tabs-tab-prev:hover,
+.ant-tabs-tab-next:hover {
+  color: #54657e;
+}
+.ant-tabs-tab-prev-icon,
+.ant-tabs-tab-next-icon {
+  font-style: normal;
+  font-weight: bold;
+  font-variant: normal;
+  line-height: inherit;
+  vertical-align: baseline;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  text-align: center;
+  text-transform: none;
+}
+.ant-tabs-tab-prev-icon:before,
+.ant-tabs-tab-next-icon:before {
+  display: block;
+  font-family: "anticon" !important;
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+}
+:root .ant-tabs-tab-prev-icon:before,
+:root .ant-tabs-tab-next-icon:before {
+  font-size: 12px;
+}
+.ant-tabs-tab-btn-disabled {
+  cursor: not-allowed;
+}
+.ant-tabs-tab-btn-disabled,
+.ant-tabs-tab-btn-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tabs-tab-next {
+  right: 2px;
+}
+.ant-tabs-tab-next-icon:before {
+  content: "\e61f";
+}
+.ant-tabs-tab-prev {
+  left: 0;
+}
+.ant-tabs-tab-prev-icon:before {
+  content: "\e620";
+}
+:root .ant-tabs-tab-prev {
+  filter: none;
+}
+.ant-tabs-nav-wrap {
+  overflow: hidden;
+  margin-bottom: -1px;
+}
+.ant-tabs-nav-scroll {
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ant-tabs-nav {
+  box-sizing: border-box;
+  padding-left: 0;
+  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  position: relative;
+  margin: 0;
+  list-style: none;
+  display: inline-block;
+}
+.ant-tabs-nav:before,
+.ant-tabs-nav:after {
+  display: table;
+  content: " ";
+}
+.ant-tabs-nav:after {
+  clear: both;
+}
+.ant-tabs-nav .ant-tabs-tab-disabled {
+  pointer-events: none;
+  cursor: default;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tabs-nav .ant-tabs-tab {
+  display: inline-block;
+  height: 100%;
+  margin: 0 32px 0 0;
+  padding: 12px 16px;
+  box-sizing: border-box;
+  position: relative;
+  transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  cursor: pointer;
+  text-decoration: none;
+}
+.ant-tabs-nav .ant-tabs-tab:last-child {
+  margin-right: 0;
+}
+.ant-tabs-nav .ant-tabs-tab:hover {
+  color: #40a9ff;
+}
+.ant-tabs-nav .ant-tabs-tab:active {
+  color: #096dd9;
+}
+.ant-tabs-nav .ant-tabs-tab .anticon {
+  margin-right: 8px;
+}
+.ant-tabs-nav .ant-tabs-tab-active {
+  color: #1890ff;
+  font-weight: 500;
+}
+.ant-tabs-large .ant-tabs-nav-container {
+  font-size: 16px;
+}
+.ant-tabs-large .ant-tabs-tab {
+  padding: 16px;
+}
+.ant-tabs-small .ant-tabs-nav-container {
+  font-size: 14px;
+}
+.ant-tabs-small .ant-tabs-tab {
+  padding: 8px 16px;
+}
+.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content {
+  width: 100%;
+}
+.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content > .ant-tabs-tabpane {
+  flex-shrink: 0;
+  width: 100%;
+  transition: opacity .45s;
+  opacity: 1;
+}
+.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content > .ant-tabs-tabpane-inactive {
+  opacity: 0;
+  height: 0;
+  padding: 0 !important;
+  pointer-events: none;
+}
+.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content-animated {
+  display: flex;
+  flex-direction: row;
+  will-change: margin-left;
+  transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-tabs-vertical > .ant-tabs-bar {
+  border-bottom: 0;
+  height: 100%;
+}
+.ant-tabs-vertical > .ant-tabs-bar-tab-prev,
+.ant-tabs-vertical > .ant-tabs-bar-tab-next {
+  width: 32px;
+  height: 0;
+  transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-tabs-vertical > .ant-tabs-bar-tab-prev.ant-tabs-tab-arrow-show,
+.ant-tabs-vertical > .ant-tabs-bar-tab-next.ant-tabs-tab-arrow-show {
+  width: 100%;
+  height: 32px;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab {
+  float: none;
+  margin: 0 0 16px 0;
+  padding: 8px 24px;
+  display: block;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab:last-child {
+  margin-bottom: 0;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-extra-content {
+  text-align: center;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-scroll {
+  width: auto;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container,
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-wrap {
+  height: 100%;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container {
+  margin-bottom: 0;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container.ant-tabs-nav-container-scrolling {
+  padding: 32px 0;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-bottom: 0;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav {
+  width: 100%;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-ink-bar {
+  width: 2px;
+  left: auto;
+  height: auto;
+  top: 0;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-next {
+  width: 100%;
+  bottom: 0;
+  height: 32px;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-next-icon:before {
+  content: "\e61d";
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-prev {
+  top: 0;
+  width: 100%;
+  height: 32px;
+}
+.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-prev-icon:before {
+  content: "\e61e";
+}
+.ant-tabs-vertical > .ant-tabs-content {
+  overflow: hidden;
+  width: auto;
+  margin-top: 0 !important;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar {
+  float: left;
+  border-right: 1px solid #e8e8e8;
+  margin-right: -1px;
+  margin-bottom: 0;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab {
+  text-align: right;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-container {
+  margin-right: -1px;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-right: -1px;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-ink-bar {
+  right: 1px;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-content {
+  padding-left: 24px;
+  border-left: 1px solid #e8e8e8;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar {
+  float: right;
+  border-left: 1px solid #e8e8e8;
+  margin-left: -1px;
+  margin-bottom: 0;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-container {
+  margin-left: -1px;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-wrap {
+  margin-left: -1px;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-ink-bar {
+  left: 1px;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-content {
+  padding-right: 24px;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-tabs-bottom > .ant-tabs-bar {
+  margin-bottom: 0;
+  margin-top: 16px;
+}
+.ant-tabs-top .ant-tabs-ink-bar-animated,
+.ant-tabs-bottom .ant-tabs-ink-bar-animated {
+  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.ant-tabs-left .ant-tabs-ink-bar-animated,
+.ant-tabs-right .ant-tabs-ink-bar-animated {
+  transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+.no-flex > .ant-tabs-content-animated,
+.ant-tabs-no-animation > .ant-tabs-content-animated,
+.ant-tabs-vertical > .ant-tabs-content-animated {
+  transform: none !important;
+  margin-left: 0 !important;
+}
+.no-flex > .ant-tabs-content > .ant-tabs-tabpane-inactive,
+.ant-tabs-no-animation > .ant-tabs-content > .ant-tabs-tabpane-inactive,
+.ant-tabs-vertical > .ant-tabs-content > .ant-tabs-tabpane-inactive {
+  display: none;
+}
+.ant-tag {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+  line-height: 20px;
+  height: 22px;
+  padding: 0 7px;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  background: #fafafa;
+  font-size: 12px;
+  transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+  opacity: 1;
+  margin-right: 8px;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.ant-tag:hover {
+  opacity: 0.85;
+}
+.ant-tag,
+.ant-tag a,
+.ant-tag a:hover {
+  color: #54657e;
+}
+.ant-tag > a:first-child:last-child {
+  display: inline-block;
+  margin: 0 -8px;
+  padding: 0 8px;
+}
+.ant-tag .anticon-cross {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+  cursor: pointer;
+  margin-left: 3px;
+  transition: all .3s;
+  color: rgba(0, 0, 0, 0.45);
+  font-weight: bold;
+}
+:root .ant-tag .anticon-cross {
+  font-size: 12px;
+}
+.ant-tag .anticon-cross:hover {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-tag-has-color {
+  border-color: transparent;
+}
+.ant-tag-has-color,
+.ant-tag-has-color a,
+.ant-tag-has-color a:hover,
+.ant-tag-has-color .anticon-cross,
+.ant-tag-has-color .anticon-cross:hover {
+  color: #fff;
+}
+.ant-tag-checkable {
+  background-color: transparent;
+  border-color: transparent;
+}
+.ant-tag-checkable:not(.ant-tag-checkable-checked):hover {
+  color: #1890ff;
+}
+.ant-tag-checkable:active,
+.ant-tag-checkable-checked {
+  color: #fff;
+}
+.ant-tag-checkable-checked {
+  background-color: #1890ff;
+}
+.ant-tag-checkable:active {
+  background-color: #096dd9;
+}
+.ant-tag-close {
+  width: 0 !important;
+  padding: 0;
+  margin: 0;
+}
+.ant-tag-zoom-enter,
+.ant-tag-zoom-appear {
+  animation: antFadeIn 0.2s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+  animation-fill-mode: both;
+}
+.ant-tag-zoom-leave {
+  animation: antZoomOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+  animation-fill-mode: both;
+}
+.ant-tag-pink {
+  color: #eb2f96;
+  background: #fff0f6;
+  border-color: #ffadd2;
+}
+.ant-tag-pink-inverse {
+  background: #eb2f96;
+  border-color: #eb2f96;
+  color: #fff;
+}
+.ant-tag-magenta {
+  color: #eb2f96;
+  background: #fff0f6;
+  border-color: #ffadd2;
+}
+.ant-tag-magenta-inverse {
+  background: #eb2f96;
+  border-color: #eb2f96;
+  color: #fff;
+}
+.ant-tag-red {
+  color: #f5222d;
+  background: #fff1f0;
+  border-color: #ffa39e;
+}
+.ant-tag-red-inverse {
+  background: #f5222d;
+  border-color: #f5222d;
+  color: #fff;
+}
+.ant-tag-volcano {
+  color: #fa541c;
+  background: #fff2e8;
+  border-color: #ffbb96;
+}
+.ant-tag-volcano-inverse {
+  background: #fa541c;
+  border-color: #fa541c;
+  color: #fff;
+}
+.ant-tag-orange {
+  color: #fa8c16;
+  background: #fff7e6;
+  border-color: #ffd591;
+}
+.ant-tag-orange-inverse {
+  background: #fa8c16;
+  border-color: #fa8c16;
+  color: #fff;
+}
+.ant-tag-yellow {
+  color: #fadb14;
+  background: #feffe6;
+  border-color: #fffb8f;
+}
+.ant-tag-yellow-inverse {
+  background: #fadb14;
+  border-color: #fadb14;
+  color: #fff;
+}
+.ant-tag-gold {
+  color: #faad14;
+  background: #fffbe6;
+  border-color: #ffe58f;
+}
+.ant-tag-gold-inverse {
+  background: #faad14;
+  border-color: #faad14;
+  color: #fff;
+}
+.ant-tag-cyan {
+  color: #13c2c2;
+  background: #e6fffb;
+  border-color: #87e8de;
+}
+.ant-tag-cyan-inverse {
+  background: #13c2c2;
+  border-color: #13c2c2;
+  color: #fff;
+}
+.ant-tag-lime {
+  color: #a0d911;
+  background: #fcffe6;
+  border-color: #eaff8f;
+}
+.ant-tag-lime-inverse {
+  background: #a0d911;
+  border-color: #a0d911;
+  color: #fff;
+}
+.ant-tag-green {
+  color: #52c41a;
+  background: #f6ffed;
+  border-color: #b7eb8f;
+}
+.ant-tag-green-inverse {
+  background: #52c41a;
+  border-color: #52c41a;
+  color: #fff;
+}
+.ant-tag-blue {
+  color: #1890ff;
+  background: #e6f7ff;
+  border-color: #91d5ff;
+}
+.ant-tag-blue-inverse {
+  background: #1890ff;
+  border-color: #1890ff;
+  color: #fff;
+}
+.ant-tag-geekblue {
+  color: #2f54eb;
+  background: #f0f5ff;
+  border-color: #adc6ff;
+}
+.ant-tag-geekblue-inverse {
+  background: #2f54eb;
+  border-color: #2f54eb;
+  color: #fff;
+}
+.ant-tag-purple {
+  color: #722ed1;
+  background: #f9f0ff;
+  border-color: #d3adf7;
+}
+.ant-tag-purple-inverse {
+  background: #722ed1;
+  border-color: #722ed1;
+  color: #fff;
+}
+.ant-time-picker-panel {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  z-index: 1050;
+  position: absolute;
+}
+.ant-time-picker-panel-inner {
+  position: relative;
+  outline: none;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+  overflow: hidden;
+  left: -2px;
+}
+.ant-time-picker-panel-input {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  width: 100%;
+  cursor: auto;
+  outline: 0;
+}
+.ant-time-picker-panel-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-time-picker-panel-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-panel-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-panel-input-wrap {
+  box-sizing: border-box;
+  position: relative;
+  padding: 7px 2px 7px 12px;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-time-picker-panel-input-invalid {
+  border-color: red;
+}
+.ant-time-picker-panel-clear-btn {
+  position: absolute;
+  right: 8px;
+  cursor: pointer;
+  overflow: hidden;
+  width: 20px;
+  height: 20px;
+  text-align: center;
+  line-height: 20px;
+  top: 7px;
+  margin: 0;
+}
+.ant-time-picker-panel-clear-btn:after {
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.25);
+  display: inline-block;
+  line-height: 1;
+  width: 20px;
+  transition: color 0.3s ease;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e62e";
+}
+.ant-time-picker-panel-clear-btn:hover:after {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-time-picker-panel-narrow .ant-time-picker-panel-input-wrap {
+  max-width: 112px;
+}
+.ant-time-picker-panel-select {
+  float: left;
+  font-size: 14px;
+  border-left: 1px solid #e8e8e8;
+  box-sizing: border-box;
+  width: 56px;
+  overflow: hidden;
+  position: relative;
+  max-height: 192px;
+}
+.ant-time-picker-panel-select:hover {
+  overflow-y: auto;
+}
+.ant-time-picker-panel-select:first-child {
+  border-left: 0;
+  margin-left: 0;
+}
+.ant-time-picker-panel-select:last-child {
+  border-right: 0;
+}
+.ant-time-picker-panel-select:only-child {
+  width: 100%;
+}
+.ant-time-picker-panel-select ul {
+  list-style: none;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0 0 160px;
+  width: 100%;
+}
+.ant-time-picker-panel-select li {
+  list-style: none;
+  box-sizing: content-box;
+  margin: 0;
+  padding: 0 0 0 12px;
+  width: 100%;
+  height: 32px;
+  line-height: 32px;
+  text-align: left;
+  cursor: pointer;
+  user-select: none;
+  transition: background 0.3s;
+}
+.ant-time-picker-panel-select li:hover {
+  background: #e6f7ff;
+}
+li.ant-time-picker-panel-select-option-selected {
+  background: #f5f5f5;
+  font-weight: bold;
+}
+li.ant-time-picker-panel-select-option-selected:hover {
+  background: #f5f5f5;
+}
+li.ant-time-picker-panel-select-option-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-time-picker-panel-select-option-disabled:hover {
+  background: transparent;
+  cursor: not-allowed;
+}
+.ant-time-picker-panel-combobox {
+  zoom: 1;
+}
+.ant-time-picker-panel-combobox:before,
+.ant-time-picker-panel-combobox:after {
+  content: " ";
+  display: table;
+}
+.ant-time-picker-panel-combobox:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-time-picker-panel-combobox:before,
+.ant-time-picker-panel-combobox:after {
+  content: " ";
+  display: table;
+}
+.ant-time-picker-panel-combobox:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-time-picker-panel-addon {
+  padding: 8px;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topLeft,
+.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topRight,
+.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topLeft,
+.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topRight {
+  animation-name: antSlideDownIn;
+}
+.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomLeft,
+.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomRight,
+.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomLeft,
+.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomRight {
+  animation-name: antSlideUpIn;
+}
+.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topLeft,
+.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topRight {
+  animation-name: antSlideDownOut;
+}
+.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomLeft,
+.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomRight {
+  animation-name: antSlideUpOut;
+}
+.ant-time-picker {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  display: inline-block;
+  outline: none;
+  transition: opacity .3s;
+  width: 128px;
+}
+.ant-time-picker-input {
+  position: relative;
+  display: inline-block;
+  padding: 4px 11px;
+  width: 100%;
+  height: 32px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  transition: all .3s;
+}
+.ant-time-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+  opacity: 1;
+}
+.ant-time-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-input:hover {
+  border-color: #40a9ff;
+}
+.ant-time-picker-input:focus {
+  border-color: #40a9ff;
+  outline: 0;
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-time-picker-input-disabled {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-input-disabled:hover {
+  border-color: #e6d8d8;
+}
+textarea.ant-time-picker-input {
+  max-width: 100%;
+  height: auto;
+  vertical-align: bottom;
+  transition: all .3s, height 0s;
+  min-height: 32px;
+}
+.ant-time-picker-input-lg {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-time-picker-input-sm {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-time-picker-input[disabled] {
+  background-color: #f5f5f5;
+  opacity: 1;
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-input[disabled]:hover {
+  border-color: #e6d8d8;
+}
+.ant-time-picker-open {
+  opacity: 0;
+}
+.ant-time-picker-icon {
+  position: absolute;
+  user-select: none;
+  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+  width: 14px;
+  height: 14px;
+  line-height: 14px;
+  right: 11px;
+  color: rgba(0, 0, 0, 0.25);
+  top: 50%;
+  margin-top: -7px;
+}
+.ant-time-picker-icon:after {
+  content: "\e641";
+  font-family: "anticon";
+  color: rgba(0, 0, 0, 0.25);
+  display: block;
+  line-height: 1;
+}
+.ant-time-picker-large .ant-time-picker-input {
+  padding: 6px 11px;
+  height: 40px;
+  font-size: 16px;
+}
+.ant-time-picker-small .ant-time-picker-input {
+  padding: 1px 7px;
+  height: 24px;
+}
+.ant-time-picker-small .ant-time-picker-icon {
+  right: 7px;
+}
+.ant-timeline {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.ant-timeline-item {
+  position: relative;
+  padding: 0 0 20px;
+  list-style: none;
+  margin: 0;
+  font-size: 14px;
+}
+.ant-timeline-item-tail {
+  position: absolute;
+  left: 4px;
+  top: 0.75em;
+  height: 100%;
+  border-left: 2px solid #e8e8e8;
+}
+.ant-timeline-item-pending .ant-timeline-item-head {
+  font-size: 12px;
+}
+.ant-timeline-item-pending .ant-timeline-item-tail {
+  display: none;
+}
+.ant-timeline-item-head {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  background-color: #fff;
+  border-radius: 100px;
+  border: 2px solid transparent;
+}
+.ant-timeline-item-head-blue {
+  border-color: #1890ff;
+  color: #1890ff;
+}
+.ant-timeline-item-head-red {
+  border-color: #f5222d;
+  color: #f5222d;
+}
+.ant-timeline-item-head-green {
+  border-color: #52c41a;
+  color: #52c41a;
+}
+.ant-timeline-item-head-custom {
+  position: absolute;
+  text-align: center;
+  line-height: 1;
+  margin-top: 0;
+  border: 0;
+  height: auto;
+  border-radius: 0;
+  padding: 3px 1px;
+  transform: translate(-50%, -50%);
+  top: 5px;
+  left: 5px;
+  width: auto;
+}
+.ant-timeline-item-content {
+  padding: 0 0 0 18px;
+  position: relative;
+  top: -6px;
+}
+.ant-timeline-item-last .ant-timeline-item-tail {
+  border-left: 2px dotted #e8e8e8;
+  display: none;
+}
+.ant-timeline-item-last .ant-timeline-item-content {
+  min-height: 48px;
+}
+.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {
+  display: block;
+}
+.ant-tooltip {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: absolute;
+  z-index: 1060;
+  display: block;
+  visibility: visible;
+}
+.ant-tooltip-hidden {
+  display: none;
+}
+.ant-tooltip-placement-top,
+.ant-tooltip-placement-topLeft,
+.ant-tooltip-placement-topRight {
+  padding-bottom: 8px;
+}
+.ant-tooltip-placement-right,
+.ant-tooltip-placement-rightTop,
+.ant-tooltip-placement-rightBottom {
+  padding-left: 8px;
+}
+.ant-tooltip-placement-bottom,
+.ant-tooltip-placement-bottomLeft,
+.ant-tooltip-placement-bottomRight {
+  padding-top: 8px;
+}
+.ant-tooltip-placement-left,
+.ant-tooltip-placement-leftTop,
+.ant-tooltip-placement-leftBottom {
+  padding-right: 8px;
+}
+.ant-tooltip-inner {
+  max-width: 250px;
+  padding: 6px 8px;
+  color: #fff;
+  text-align: left;
+  text-decoration: none;
+  background-color: rgba(0, 0, 0, 0.75);
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  min-height: 32px;
+}
+.ant-tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.ant-tooltip-placement-top .ant-tooltip-arrow,
+.ant-tooltip-placement-topLeft .ant-tooltip-arrow,
+.ant-tooltip-placement-topRight .ant-tooltip-arrow {
+  bottom: 3px;
+  border-width: 5px 5px 0;
+  border-top-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-top .ant-tooltip-arrow {
+  left: 50%;
+  margin-left: -5px;
+}
+.ant-tooltip-placement-topLeft .ant-tooltip-arrow {
+  left: 16px;
+}
+.ant-tooltip-placement-topRight .ant-tooltip-arrow {
+  right: 16px;
+}
+.ant-tooltip-placement-right .ant-tooltip-arrow,
+.ant-tooltip-placement-rightTop .ant-tooltip-arrow,
+.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {
+  left: 3px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-right .ant-tooltip-arrow {
+  top: 50%;
+  margin-top: -5px;
+}
+.ant-tooltip-placement-rightTop .ant-tooltip-arrow {
+  top: 8px;
+}
+.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {
+  bottom: 8px;
+}
+.ant-tooltip-placement-left .ant-tooltip-arrow,
+.ant-tooltip-placement-leftTop .ant-tooltip-arrow,
+.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {
+  right: 3px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-left .ant-tooltip-arrow {
+  top: 50%;
+  margin-top: -5px;
+}
+.ant-tooltip-placement-leftTop .ant-tooltip-arrow {
+  top: 8px;
+}
+.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {
+  bottom: 8px;
+}
+.ant-tooltip-placement-bottom .ant-tooltip-arrow,
+.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,
+.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {
+  top: 3px;
+  border-width: 0 5px 5px;
+  border-bottom-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-bottom .ant-tooltip-arrow {
+  left: 50%;
+  margin-left: -5px;
+}
+.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow {
+  left: 16px;
+}
+.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {
+  right: 16px;
+}
+.ant-transfer {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+}
+.ant-transfer-list {
+  border: 1px solid #d9d9d9;
+  display: inline-block;
+  border-radius: 4px;
+  vertical-align: middle;
+  position: relative;
+  width: 180px;
+  height: 200px;
+  padding-top: 34px;
+}
+.ant-transfer-list-with-footer {
+  padding-bottom: 34px;
+}
+.ant-transfer-list-search {
+  padding: 0 8px;
+}
+.ant-transfer-list-search-action {
+  color: rgba(0, 0, 0, 0.25);
+  position: absolute;
+  top: 4px;
+  right: 4px;
+  bottom: 4px;
+  width: 28px;
+  line-height: 32px;
+  text-align: center;
+}
+.ant-transfer-list-search-action .anticon {
+  transition: all .3s;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-search-action .anticon:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+span.ant-transfer-list-search-action {
+  pointer-events: none;
+}
+.ant-transfer-list-header {
+  padding: 6px 12px;
+  border-radius: 4px 4px 0 0;
+  background: #fff;
+  color: #54657e;
+  border-bottom: 1px solid #e8e8e8;
+  overflow: hidden;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+}
+.ant-transfer-list-header-title {
+  position: absolute;
+  right: 12px;
+}
+.ant-transfer-list-body {
+  font-size: 14px;
+  position: relative;
+  height: 100%;
+}
+.ant-transfer-list-body-search-wrapper {
+  position: absolute;
+  top: 0;
+  left: 0;
+  padding: 4px;
+  width: 100%;
+}
+.ant-transfer-list-body-with-search {
+  padding-top: 40px;
+}
+.ant-transfer-list-content {
+  height: 100%;
+  overflow: auto;
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+.ant-transfer-list-content > .LazyLoad {
+  animation: transferHighlightIn 1s;
+}
+.ant-transfer-list-content-item {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  padding: 6px 12px;
+  min-height: 32px;
+  transition: all .3s;
+}
+.ant-transfer-list-content-item > span {
+  padding-right: 0;
+}
+.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {
+  cursor: pointer;
+  background-color: #e6f7ff;
+}
+.ant-transfer-list-content-item-disabled {
+  cursor: not-allowed;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-body-not-found {
+  padding-top: 0;
+  color: rgba(0, 0, 0, 0.25);
+  text-align: center;
+  display: none;
+  position: absolute;
+  top: 50%;
+  width: 100%;
+  margin-top: -10px;
+}
+.ant-transfer-list-content:empty + .ant-transfer-list-body-not-found {
+  display: block;
+}
+.ant-transfer-list-footer {
+  border-top: 1px solid #e8e8e8;
+  border-radius: 0 0 4px 4px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+}
+.ant-transfer-operation {
+  display: inline-block;
+  overflow: hidden;
+  margin: 0 8px;
+  vertical-align: middle;
+}
+.ant-transfer-operation .ant-btn {
+  display: block;
+}
+.ant-transfer-operation .ant-btn:first-child {
+  margin-bottom: 4px;
+}
+.ant-transfer-operation .ant-btn .anticon {
+  font-size: 12px;
+}
+@keyframes transferHighlightIn {
+  0% {
+    background: #bae7ff;
+  }
+  100% {
+    background: transparent;
+  }
+}
+.ant-tree-checkbox {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  display: inline-block;
+  line-height: 1;
+  position: relative;
+  vertical-align: middle;
+  top: -0.09em;
+}
+.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,
+.ant-tree-checkbox:hover .ant-tree-checkbox-inner,
+.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner {
+  border-color: #1890ff;
+}
+.ant-tree-checkbox-checked:after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 2px;
+  border: 1px solid #1890ff;
+  content: '';
+  animation: antCheckboxEffect 0.36s ease-in-out;
+  animation-fill-mode: both;
+  visibility: hidden;
+}
+.ant-tree-checkbox:hover:after,
+.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after {
+  visibility: visible;
+}
+.ant-tree-checkbox-inner {
+  position: relative;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 16px;
+  height: 16px;
+  border: 1px solid #d9d9d9;
+  border-radius: 2px;
+  background-color: #fff;
+  transition: all .3s;
+}
+.ant-tree-checkbox-inner:after {
+  transform: rotate(45deg) scale(0);
+  position: absolute;
+  left: 4.57142857px;
+  top: 1.14285714px;
+  display: table;
+  width: 5.71428571px;
+  height: 9.14285714px;
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+  content: ' ';
+  transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6);
+}
+.ant-tree-checkbox-input {
+  position: absolute;
+  left: 0;
+  z-index: 1;
+  cursor: pointer;
+  opacity: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+}
+.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after {
+  content: ' ';
+  transform: scale(1);
+  position: absolute;
+  left: 2.42857143px;
+  top: 5.92857143px;
+  width: 9.14285714px;
+  height: 1.14285714px;
+}
+.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after {
+  transform: rotate(45deg) scale(1);
+  position: absolute;
+  display: table;
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+  content: ' ';
+  transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;
+}
+.ant-tree-checkbox-checked .ant-tree-checkbox-inner,
+.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner {
+  background-color: #1890ff;
+  border-color: #1890ff;
+}
+.ant-tree-checkbox-disabled {
+  cursor: not-allowed;
+}
+.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after {
+  animation-name: none;
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree-checkbox-disabled .ant-tree-checkbox-input {
+  cursor: not-allowed;
+}
+.ant-tree-checkbox-disabled .ant-tree-checkbox-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after {
+  animation-name: none;
+  border-color: #f5f5f5;
+}
+.ant-tree-checkbox-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+.ant-tree-checkbox-wrapper {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  line-height: unset;
+  cursor: pointer;
+  display: inline-block;
+}
+.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper {
+  margin-left: 8px;
+}
+.ant-tree-checkbox-wrapper + span,
+.ant-tree-checkbox + span {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.ant-tree-checkbox-group {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  display: inline-block;
+}
+.ant-tree-checkbox-group-item {
+  display: inline-block;
+  margin-right: 8px;
+}
+.ant-tree-checkbox-group-item:last-child {
+  margin-right: 0;
+}
+.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item {
+  margin-left: 0;
+}
+.ant-tree {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  display: block;
+}
+.ant-tree ol,
+.ant-tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.ant-tree li {
+  padding: 4px 0;
+  margin: 0;
+  list-style: none;
+  white-space: nowrap;
+  outline: 0;
+}
+.ant-tree li span[draggable],
+.ant-tree li span[draggable="true"] {
+  user-select: none;
+  border-top: 2px transparent solid;
+  border-bottom: 2px transparent solid;
+  margin-top: -2px;
+  /* Required to make elements draggable in old WebKit */
+  -khtml-user-drag: element;
+  -webkit-user-drag: element;
+}
+.ant-tree li.drag-over > span[draggable] {
+  background-color: #1890ff;
+  color: white;
+  opacity: 0.8;
+}
+.ant-tree li.drag-over-gap-top > span[draggable] {
+  border-top-color: #1890ff;
+}
+.ant-tree li.drag-over-gap-bottom > span[draggable] {
+  border-bottom-color: #1890ff;
+}
+.ant-tree li.filter-node > span {
+  color: #f5222d !important;
+  font-weight: 500 !important;
+}
+.ant-tree li ul {
+  margin: 0;
+  padding: 0 0 0 18px;
+}
+.ant-tree li .ant-tree-node-content-wrapper {
+  display: inline-block;
+  padding: 0 5px;
+  border-radius: 2px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+  vertical-align: top;
+  color: #54657e;
+  transition: all .3s;
+  position: relative;
+  height: 24px;
+  line-height: 24px;
+}
+.ant-tree li .ant-tree-node-content-wrapper:hover {
+  background-color: #e6f7ff;
+}
+.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected {
+  background-color: #bae7ff;
+}
+.ant-tree li .ant-tree-node-content-wrapper .font-red {
+  color: #FF5500;
+}
+.ant-tree li span {
+  cursor: pointer;
+}
+.ant-tree li span.ant-tree-checkbox {
+  margin: 4px 4px 0 2px;
+}
+.ant-tree li span.ant-tree-switcher,
+.ant-tree li span.ant-tree-iconEle {
+  margin: 0;
+  width: 24px;
+  height: 24px;
+  line-height: 24px;
+  display: inline-block;
+  vertical-align: middle;
+  border: 0 none;
+  cursor: pointer;
+  outline: none;
+  text-align: center;
+}
+.ant-tree li span.ant-tree-icon_loading {
+  background: #fff;
+}
+.ant-tree li span.ant-tree-icon_loading:after {
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\E64D";
+  animation: loadingCircle 1s infinite linear;
+  color: #1890ff;
+}
+.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop {
+  cursor: default;
+}
+.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open:after {
+  font-size: 12px;
+  font-size: 7px \9;
+  transform: scale(0.58333333) rotate(0deg);
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e606";
+  font-weight: bold;
+  transition: transform .3s;
+}
+:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open:after {
+  font-size: 12px;
+}
+.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close:after {
+  font-size: 12px;
+  font-size: 7px \9;
+  transform: scale(0.58333333) rotate(0deg);
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e606";
+  font-weight: bold;
+  transition: transform .3s;
+}
+:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close:after {
+  font-size: 12px;
+}
+.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close:after {
+  transform: rotate(270deg) scale(0.59);
+}
+.ant-tree li:last-child > span.ant-tree-switcher:before,
+.ant-tree li:last-child > span.ant-tree-iconEle:before {
+  display: none;
+}
+.ant-tree > li:first-child {
+  padding-top: 7px;
+}
+.ant-tree > li:last-child {
+  padding-bottom: 7px;
+}
+.ant-tree-child-tree {
+  display: none;
+}
+.ant-tree-child-tree-open {
+  display: block;
+}
+li.ant-tree-treenode-disabled > span,
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper,
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span,
+li.ant-tree-treenode-disabled > span.ant-tree-switcher {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper:hover {
+  background: transparent;
+}
+.ant-tree-icon__open {
+  margin-right: 2px;
+  vertical-align: top;
+}
+.ant-tree-icon__close {
+  margin-right: 2px;
+  vertical-align: top;
+}
+.ant-tree.ant-tree-show-line li {
+  position: relative;
+}
+.ant-tree.ant-tree-show-line li span.ant-tree-switcher {
+  background: #fff;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop:after {
+  font-size: 12px;
+  font-size: 12px \9;
+  transform: scale(1) rotate(0deg);
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e664";
+  vertical-align: baseline;
+  font-weight: normal;
+  transition: transform .3s;
+}
+:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop:after {
+  font-size: 12px;
+}
+.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open:after {
+  font-size: 12px;
+  font-size: 12px \9;
+  transform: scale(1) rotate(0deg);
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e621";
+  vertical-align: baseline;
+  font-weight: normal;
+  transition: transform .3s;
+}
+:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open:after {
+  font-size: 12px;
+}
+.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close:after {
+  font-size: 12px;
+  font-size: 12px \9;
+  transform: scale(1) rotate(0deg);
+  display: inline-block;
+  font-family: 'anticon';
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  content: "\e645";
+  vertical-align: baseline;
+  font-weight: normal;
+  transition: transform .3s;
+}
+:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close:after {
+  font-size: 12px;
+}
+.ant-tree.ant-tree-show-line > nz-tree-node:not(:last-child) > li:before,
+.ant-tree.ant-tree-show-line .ant-tree-child-tree > nz-tree-node:not(:last-child) > li:before {
+  content: ' ';
+  width: 1px;
+  border-left: 1px solid #d9d9d9;
+  height: 100%;
+  position: absolute;
+  left: 12px;
+  margin: 22px 0;
+}
+.ant-tree.ant-tree-show-line .ant-tree-child-tree > nz-tree-node:last-child > li:before {
+  content: ' ';
+  width: 1px;
+  border-left: 0px solid #d9d9d9;
+  height: 100%;
+  position: absolute;
+  left: 12px;
+  margin: 22px 0;
+}
+.ant-upload {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  outline: 0;
+}
+.ant-upload p {
+  margin: 0;
+}
+.ant-upload-btn {
+  display: block;
+  width: 100%;
+  outline: none;
+}
+.ant-upload input[type="file"] {
+  cursor: pointer;
+}
+.ant-upload.ant-upload-select {
+  display: inline-block;
+}
+.ant-upload.ant-upload-select-picture-card {
+  border: 1px dashed #d9d9d9;
+  width: 104px;
+  height: 104px;
+  border-radius: 4px;
+  background-color: #fafafa;
+  text-align: center;
+  cursor: pointer;
+  transition: border-color 0.3s ease;
+  vertical-align: top;
+  margin-right: 8px;
+  margin-bottom: 8px;
+  display: table;
+}
+.ant-upload.ant-upload-select-picture-card > .ant-upload {
+  width: 100%;
+  height: 100%;
+  display: table-cell;
+  text-align: center;
+  vertical-align: middle;
+  padding: 8px;
+}
+.ant-upload.ant-upload-select-picture-card:hover {
+  border-color: #1890ff;
+}
+.ant-upload.ant-upload-drag {
+  border: 1px dashed #d9d9d9;
+  transition: border-color 0.3s;
+  cursor: pointer;
+  border-radius: 4px;
+  text-align: center;
+  width: 100%;
+  height: 100%;
+  position: relative;
+  padding: 16px 0;
+  background: #fafafa;
+}
+.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) {
+  border: 2px dashed #40a9ff;
+}
+.ant-upload.ant-upload-drag.ant-upload-disabled {
+  cursor: not-allowed;
+}
+.ant-upload.ant-upload-drag .ant-upload-btn {
+  display: table;
+  height: 100%;
+}
+.ant-upload.ant-upload-drag .ant-upload-drag-container {
+  display: table-cell;
+  vertical-align: middle;
+}
+.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover {
+  border-color: #40a9ff;
+}
+.ant-upload.ant-upload-drag p.ant-upload-drag-icon {
+  margin-bottom: 20px;
+}
+.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon {
+  font-size: 48px;
+  color: #40a9ff;
+}
+.ant-upload.ant-upload-drag p.ant-upload-text {
+  font-size: 16px;
+  margin: 0 0 4px;
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-upload.ant-upload-drag p.ant-upload-hint {
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload.ant-upload-drag .anticon-plus {
+  font-size: 30px;
+  transition: all .3s;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-upload.ant-upload-drag .anticon-plus:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload.ant-upload-drag:hover .anticon-plus {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list {
+  font-family: "Monospaced Number", "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #54657e;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  zoom: 1;
+}
+.ant-upload-list:before,
+.ant-upload-list:after {
+  content: " ";
+  display: table;
+}
+.ant-upload-list:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-upload-list:before,
+.ant-upload-list:after {
+  content: " ";
+  display: table;
+}
+.ant-upload-list:after {
+  clear: both;
+  visibility: hidden;
+  font-size: 0;
+  height: 0;
+}
+.ant-upload-list-item {
+  margin-top: 8px;
+  font-size: 14px;
+  position: relative;
+  height: 22px;
+}
+.ant-upload-list-item-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  padding-left: 22px;
+  width: 100%;
+  display: inline-block;
+}
+.ant-upload-list-item-info {
+  height: 100%;
+  padding: 0 12px 0 4px;
+  transition: background-color 0.3s;
+}
+.ant-upload-list-item-info > span {
+  display: block;
+}
+.ant-upload-list-item-info .anticon-loading,
+.ant-upload-list-item-info .anticon-paper-clip {
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.45);
+  position: absolute;
+  top: 5px;
+}
+.ant-upload-list-item .anticon-cross {
+  display: inline-block;
+  font-size: 12px;
+  font-size: 10px \9;
+  transform: scale(0.83333333) rotate(0deg);
+  transition: all .3s;
+  opacity: 0;
+  cursor: pointer;
+  position: absolute;
+  top: 0;
+  right: 4px;
+  color: rgba(0, 0, 0, 0.45);
+  line-height: 22px;
+}
+:root .ant-upload-list-item .anticon-cross {
+  font-size: 12px;
+}
+.ant-upload-list-item .anticon-cross:hover {
+  color: #54657e;
+}
+.ant-upload-list-item:hover .ant-upload-list-item-info {
+  background-color: #e6f7ff;
+}
+.ant-upload-list-item:hover .anticon-cross {
+  opacity: 1;
+}
+.ant-upload-list-item-error,
+.ant-upload-list-item-error .anticon-paper-clip,
+.ant-upload-list-item-error .ant-upload-list-item-name {
+  color: #f5222d;
+}
+.ant-upload-list-item-error .anticon-cross {
+  opacity: 1;
+  color: #f5222d !important;
+}
+.ant-upload-list-item-progress {
+  line-height: 0;
+  font-size: 14px;
+  position: absolute;
+  width: 100%;
+  bottom: -12px;
+  padding-left: 26px;
+}
+.ant-upload-list-picture .ant-upload-list-item,
+.ant-upload-list-picture-card .ant-upload-list-item {
+  padding: 8px;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  height: 66px;
+  position: relative;
+}
+.ant-upload-list-picture .ant-upload-list-item:hover,
+.ant-upload-list-picture-card .ant-upload-list-item:hover {
+  background: transparent;
+}
+.ant-upload-list-picture .ant-upload-list-item-error,
+.ant-upload-list-picture-card .ant-upload-list-item-error {
+  border-color: #f5222d;
+}
+.ant-upload-list-picture .ant-upload-list-item-info,
+.ant-upload-list-picture-card .ant-upload-list-item-info {
+  padding: 0;
+}
+.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,
+.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info {
+  background: transparent;
+}
+.ant-upload-list-picture .ant-upload-list-item-uploading,
+.ant-upload-list-picture-card .ant-upload-list-item-uploading {
+  border-style: dashed;
+}
+.ant-upload-list-picture .ant-upload-list-item-thumbnail,
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail {
+  width: 48px;
+  height: 48px;
+  position: absolute;
+  top: 8px;
+  left: 8px;
+}
+.ant-upload-list-picture .ant-upload-list-item-thumbnail img,
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {
+  width: 48px;
+  height: 48px;
+  display: block;
+  overflow: hidden;
+}
+.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before,
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before {
+  line-height: 48px;
+  font-size: 24px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list-picture .ant-upload-list-item-name,
+.ant-upload-list-picture-card .ant-upload-list-item-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin: 0 0 0 8px;
+  line-height: 44px;
+  transition: all .3s;
+  padding-left: 48px;
+  padding-right: 8px;
+  max-width: 100%;
+  display: inline-block;
+  box-sizing: border-box;
+}
+.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,
+.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name {
+  line-height: 28px;
+}
+.ant-upload-list-picture .ant-upload-list-item-progress,
+.ant-upload-list-picture-card .ant-upload-list-item-progress {
+  padding-left: 56px;
+  margin-top: 0;
+  bottom: 14px;
+  width: calc(100% - 24px);
+}
+.ant-upload-list-picture .anticon-cross,
+.ant-upload-list-picture-card .anticon-cross {
+  position: absolute;
+  right: 8px;
+  top: 8px;
+  line-height: 1;
+}
+.ant-upload-list-picture-card {
+  display: inline;
+}
+.ant-upload-list-picture-card.ant-upload-list:after {
+  display: none;
+}
+.ant-upload-list-picture-card .ant-upload-list-item {
+  float: left;
+  width: 104px;
+  height: 104px;
+  margin: 0 8px 8px 0;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-info {
+  height: 100%;
+  position: relative;
+  overflow: hidden;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-info:before {
+  content: ' ';
+  position: absolute;
+  z-index: 1;
+  background-color: rgba(0, 0, 0, 0.5);
+  transition: all .3s;
+  width: 100%;
+  height: 100%;
+  opacity: 0;
+}
+.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before {
+  opacity: 1;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-actions {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%, -50%);
+  z-index: 10;
+  white-space: nowrap;
+  opacity: 0;
+  transition: all .3s;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o,
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete {
+  z-index: 10;
+  transition: all .3s;
+  cursor: pointer;
+  font-size: 16px;
+  width: 16px;
+  color: rgba(255, 255, 255, 0.85);
+  margin: 0 4px;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover,
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover {
+  color: #fff;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-info:hover + .ant-upload-list-item-actions,
+.ant-upload-list-picture-card .ant-upload-list-item-actions:hover {
+  opacity: 1;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img {
+  display: block;
+  width: 100%;
+  height: 100%;
+  position: static;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-name {
+  margin: 8px 0 0;
+  padding: 0;
+  text-align: center;
+  line-height: 1.5;
+  display: none;
+}
+.ant-upload-list-picture-card .anticon-picture + .ant-upload-list-item-name {
+  display: block;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item {
+  background-color: #fafafa;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info {
+  height: auto;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before,
+.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye-o,
+.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete {
+  display: none;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading-text {
+  margin-top: 18px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list-picture-card .ant-upload-list-item-progress {
+  padding-left: 0;
+  bottom: 32px;
+}
+.ant-upload-list .ant-upload-success-icon {
+  color: #52c41a;
+  font-weight: bold;
+}
+.ant-upload-list .ant-upload-animate-enter,
+.ant-upload-list .ant-upload-animate-leave,
+.ant-upload-list .ant-upload-animate-inline-enter,
+.ant-upload-list .ant-upload-animate-inline-leave {
+  animation-duration: .3s;
+  animation-fill-mode: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-upload-list .ant-upload-animate-enter {
+  animation-name: uploadAnimateIn;
+}
+.ant-upload-list .ant-upload-animate-leave {
+  animation-name: uploadAnimateOut;
+}
+.ant-upload-list .ant-upload-animate-inline-enter {
+  animation-name: uploadAnimateInlineIn;
+}
+.ant-upload-list .ant-upload-animate-inline-leave {
+  animation-name: uploadAnimateInlineOut;
+}
+@keyframes uploadAnimateIn {
+  from {
+    height: 0;
+    margin: 0;
+    opacity: 0;
+    padding: 0;
+  }
+}
+@keyframes uploadAnimateOut {
+  to {
+    height: 0;
+    margin: 0;
+    padding: 0;
+    opacity: 0;
+  }
+}
+@keyframes uploadAnimateInlineIn {
+  from {
+    width: 0;
+    height: 0;
+    margin: 0;
+    opacity: 0;
+    padding: 0;
+  }
+}
+@keyframes uploadAnimateInlineOut {
+  to {
+    width: 0;
+    height: 0;
+    margin: 0;
+    padding: 0;
+    opacity: 0;
+  }
+}
diff --git a/usecaseui-portal/src/my-theme.less b/usecaseui-portal/src/my-theme.less
new file mode 100644 (file)
index 0000000..946b8af
--- /dev/null
@@ -0,0 +1,11 @@
+@import "../node_modules/ng-zorro-antd/src/ng-zorro-antd.less";
+
+@menu-inline-toplevel-item-height: 50px;
+@menu-item-height: 50px;
+@menu-highlight-color: #3fa8eb;
+@text-color: #54657e;
+@menu-dark-item-selected-bg: #3d4a59;
+@menu-dark-color: #fff;
+@menu-dark-highlight-color: #3fa8eb;
+@layout-header-background: #2a3542;
+@menu-dark-submenu-bg: #2a3542;
diff --git a/usecaseui-portal/src/polyfills.ts b/usecaseui-portal/src/polyfills.ts
new file mode 100644 (file)
index 0000000..199ac5d
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/weak-map';
+import 'core-js/es6/set';
+import 'core-js/es7/array';
+import 'core-js/es7/object';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';  // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following for the Reflect API. */
+// import 'core-js/es6/reflect';
+
+
+/** Evergreen browsers require these. **/
+// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/platform-browser/animations`.
+ * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ */
+
+ // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+
+ /*
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ */
+// (window as any).__Zone_enable_cross_context_check = true;
+
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
diff --git a/usecaseui-portal/src/styles.css b/usecaseui-portal/src/styles.css
new file mode 100644 (file)
index 0000000..2b7176e
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+    Copyright (C) 2018 CMCC, Inc. and others. All rights reserved.
+
+    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.
+*/
+/* You can add global styles to this file, and also import other style files */
+.ant-dropdown-menu .ant-dropdown-menu-item:hover,
+.ant-dropdown-menu .ant-dropdown-menu-submenu-title:hover {
+  background-color: #3fa8eb;
+}
+nz-table .ant-table-thead > tr > th {
+  color: #3fa8eb;
+}
+nz-table .ant-spin-container nz-pagination ul .ant-pagination-options .ant-pagination-options-size-changer.ant-select {
+  position: absolute;
+  left: 0;
+}
+.detailInformatioin nz-table .ant-table-small {
+  border-color: #dfdfe0;
+  border-right: 0;
+}
+.detailInformatioin nz-table .ant-table-small .ant-table-content {
+  border-color: #dfdfe0;
+}
+.detailInformatioin nz-table .ant-table-small .ant-table-content .ant-table-body > table {
+  padding: 0;
+}
+.detailInformatioin nz-table .ant-table-small .ant-table-content .ant-table-body > table .ant-table-thead > tr > th {
+  background-color: #f0f2f5;
+  font-weight: 700;
+  font-size: 14px;
+  padding: 2px 15px;
+  border-color: #dfdfe0;
+}
+.detailInformatioin nz-table .ant-table-small .ant-table-content .ant-table-body > table .ant-table-tbody > tr > td {
+  background-color: #f0f2f5;
+  font-size: 14px;
+  padding: 2px 15px;
+  color: #323437;
+  border-color: #dfdfe0;
+}
+.ant-calendar-picker .ant-input {
+  background-color: #eceff4;
+  border-color: #9fa9ab;
+}
+nz-pagination ul .ant-pagination-options .ant-pagination-options-size-changer.ant-select {
+  position: absolute;
+  left: 0;
+}
+html,
+body,
+div,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+ul,
+li,
+a,
+span {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  list-style: none;
+  text-decoration: none;
+}
+body {
+  padding: 0 !important;
+}
+.fl {
+  float: left;
+}
+.fr {
+  float: right;
+}
+.clearfix:after {
+  content: "";
+  height: 0;
+  line-height: 0;
+  display: block;
+  visibility: hidden;
+  clear: both;
+}
+.deleteModelContent {
+  color: red;
+}
+/* WAN Port */
+.wanPortModalList li {
+  height: 35px;
+}
+.wanPortModalList li > span {
+  display: inline-block;
+  width: 165px;
+  font: 700 14px "Arial";
+  color: #3fa8eb;
+  vertical-align: middle;
+}
+.wanPortModalList li input {
+  width: 165px;
+}
diff --git a/usecaseui-portal/src/styles.less b/usecaseui-portal/src/styles.less
new file mode 100644 (file)
index 0000000..5429a9c
--- /dev/null
@@ -0,0 +1,117 @@
+/* You can add global styles to this file, and also import other style files */
+// 下拉框背景hover状态颜色
+.ant-dropdown-menu {
+    .ant-dropdown-menu-item:hover, .ant-dropdown-menu-submenu-title:hover {
+        background-color: #3fa8eb;
+    }
+}
+// 表格每页条数选项单位置
+nz-table {
+    .ant-table-thead>tr>th {
+        color: #3fa8eb; //标题字体颜色
+    }
+    .ant-spin-container {
+        nz-pagination {
+            ul {
+                .ant-pagination-options {
+                    .ant-pagination-options-size-changer.ant-select{
+                        position: absolute;
+                        left: 0;
+                    }
+                }
+            }
+        }
+    }
+}
+
+// 详情页迷你表格样式
+.detailInformatioin {
+    nz-table {
+        .ant-table-small {
+            border-color: #dfdfe0;
+            border-right: 0;
+            .ant-table-content {
+                border-color:  #dfdfe0;
+                .ant-table-body > table { 
+                    padding: 0;
+                    .ant-table-thead > tr > th {
+                        background-color: #f0f2f5;
+                        font-weight: 700;
+                        font-size: 14px;
+                        padding: 2px 15px;
+                        border-color: #dfdfe0;
+                    }
+                    .ant-table-tbody > tr > td {
+                        background-color: #f0f2f5;
+                        font-size: 14px;
+                        padding: 2px 15px;
+                        color: #323437;
+                        border-color: #dfdfe0;
+                    }
+                }
+            }
+        }
+    }
+}
+
+// 日期选择插件背景颜色
+.ant-calendar-picker {
+    .ant-input {
+        background-color: #eceff4;
+        border-color: #9fa9ab;
+    }           
+}
+// 分页每页条数选项单位置
+nz-pagination {
+    ul {
+        .ant-pagination-options {
+            .ant-pagination-options-size-changer.ant-select{
+                position: absolute;
+                left: 0;
+            }
+        }
+    }
+}
+
+html,body,div,h1,h2,h3,h4,h5,h6,p,ul,li,a,span {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    list-style: none;
+    text-decoration: none;
+}
+body {
+    padding: 0 !important;
+}
+.fl {
+    float: left;
+}
+.fr {
+    float: right;
+}
+.clearfix:after{
+    content:"";
+    height:0;
+    line-height:0;
+    display:block;
+    visibility:hidden;
+    clear:both
+}
+.deleteModelContent {
+    color: red;
+}
+
+/* WAN Port */
+.wanPortModalList li {
+    height: 35px;
+    >span{
+        display: inline-block;
+        width: 165px;
+        font: 700 14px "Arial";
+        color: #3fa8eb;
+        vertical-align: middle;
+    }
+    input {
+        width: 165px;
+    }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/test.ts b/usecaseui-portal/src/test.ts
new file mode 100644 (file)
index 0000000..1631789
--- /dev/null
@@ -0,0 +1,20 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/zone-testing';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+declare const require: any;
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
diff --git a/usecaseui-portal/src/tsconfig.app.json b/usecaseui-portal/src/tsconfig.app.json
new file mode 100644 (file)
index 0000000..39ba8db
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "baseUrl": "./",
+    "module": "es2015",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}
diff --git a/usecaseui-portal/src/tsconfig.spec.json b/usecaseui-portal/src/tsconfig.spec.json
new file mode 100644 (file)
index 0000000..ac22a29
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}
diff --git a/usecaseui-portal/src/typings.d.ts b/usecaseui-portal/src/typings.d.ts
new file mode 100644 (file)
index 0000000..ef5c7bd
--- /dev/null
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+  id: string;
+}
diff --git a/usecaseui-portal/tsconfig.json b/usecaseui-portal/tsconfig.json
new file mode 100644 (file)
index 0000000..a6c016b
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2017",
+      "dom"
+    ]
+  }
+}