From 8dd2337c2d65e29034950940a239d0c73540f92a Mon Sep 17 00:00:00 2001
From: 沈斌 <bluelazysb@hotmail.com>
Date: Thu, 14 Dec 2017 22:58:52 +0800
Subject: [PATCH] updates

---
 src/app/layout/fullscreen/fullscreen.component.ts        |    9 
 src/tsconfig.spec.json                                   |    8 
 package-lock.json                                        | 3162 ++++++++++++++++++++++++++++++++++++
 src/assets/i18n/en.json                                  |   94 +
 src/app/core/core.module.ts                              |   19 
 src/app/layout/header/components/langs.component.ts      |   40 
 src/assets/i18n/zh-CN.json                               |   94 +
 src/app/layout/fullscreen/fullscreen.component.html      |    1 
 src/app/layout/header/components/search.component.ts     |   49 
 src/app/layout/header/header.component.ts                |   21 
 src/app/layout/pro/user/user.component.html              |   17 
 src/app/layout/header/components/notify.component.ts     |  163 +
 src/app/layout/layout.component.spec.ts                  |   17 
 src/app/layout/layout.module.ts                          |   56 
 src/environments/environment.prod.ts                     |    1 
 src/environments/environment.ts                          |    1 
 src/app/layout/pro/user/user.component.ts                |   23 
 src/app/layout/header/components/icon.component.ts       |   59 
 src/app/layout/header/components/fullscreen.component.ts |   22 
 src/tsconfig.app.json                                    |    8 
 src/app/routes/routes.module.ts                          |   10 
 src/app/layout/header/index.md                           |   20 
 src/app/layout/layout.component.html                     |    6 
 src/app/app.module.ts                                    |   75 
 src/app/layout/header/components/theme.component.ts      |   44 
 src/app/layout/header/components/user.component.ts       |   46 
 src/app/shared/shared.module.ts                          |  211 ++
 src/app/core/i18n/i18n.service.ts                        |   47 
 src/testing/common.spec.ts                               |   66 
 src/app/layout/header/components/task.component.ts       |   80 
 src/app/layout/header/header.component.spec.ts           |   17 
 src/app/layout/sidebar/sidebar.component.spec.ts         |   16 
 src/app/layout/pro/user/user.component.less              |   58 
 src/app/core/services/startup.service.ts                 |   48 
 /dev/null                                                |   20 
 src/app/core/module-import-guard.ts                      |    6 
 src/app/layout/sidebar/sidebar.component.html            |   17 
 src/app/core/i18n/i18n.service.spec.ts                   |   31 
 tsconfig.json                                            |    9 
 src/app/layout/sidebar/sidebar.component.ts              |   12 
 src/app/app.component.spec.ts                            |   45 
 src/app/core/net/default.interceptor.ts                  |   70 
 package.json                                             |   67 
 src/app/layout/header/header.component.html              |   74 
 src/app/layout/layout.component.ts                       |   38 
 src/app/app.component.ts                                 |   32 
 src/app/layout/header/components/storage.component.ts    |   28 
 47 files changed, 4,952 insertions(+), 105 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a6f3768..0a9a570 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,6 +54,14 @@
         "tslib": "1.8.1"
       }
     },
+    "@angular/cdk": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npm.taobao.org/@angular/cdk/download/@angular/cdk-5.0.0.tgz",
+      "integrity": "sha1-18sylMnjzDfT1Bwz5r6wROhGNsM=",
+      "requires": {
+        "tslib": "1.8.1"
+      }
+    },
     "@angular/cli": {
       "version": "1.6.0",
       "resolved": "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.6.0.tgz",
@@ -202,6 +210,92 @@
         "tslib": "1.8.1"
       }
     },
+    "@angularclass/hmr": {
+      "version": "2.1.3",
+      "resolved": "http://registry.npm.taobao.org/@angularclass/hmr/download/@angularclass/hmr-2.1.3.tgz",
+      "integrity": "sha1-NOZY7T2jfyOwogDi2lqJvpK7IJ8=",
+      "dev": true
+    },
+    "@angularclass/hmr-loader": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.taobao.org/@angularclass/hmr-loader/download/@angularclass/hmr-loader-3.0.4.tgz",
+      "integrity": "sha1-PjoHuoNWUMkBVim44Yf+jc1VJ7g=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0"
+      }
+    },
+    "@antv/data-set": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.7.0.tgz",
+      "integrity": "sha1-DhqzyIq+g61mhgDeThixY3wGIaM=",
+      "requires": {
+        "d3-array": "1.2.1",
+        "d3-composite-projections": "1.2.0",
+        "d3-dsv": "1.0.8",
+        "d3-geo": "1.9.1",
+        "d3-geo-projection": "2.3.2",
+        "d3-hierarchy": "1.1.5",
+        "d3-sankey": "0.7.1",
+        "d3-voronoi": "1.1.2",
+        "lodash": "4.17.4",
+        "point-at-length": "1.1.0",
+        "regression": "2.0.1",
+        "simple-statistics": "4.1.1",
+        "topojson-client": "3.0.0",
+        "wolfy87-eventemitter": "5.2.4"
+      }
+    },
+    "@antv/g": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.2.tgz",
+      "integrity": "sha1-z87alIq1lfZMkKUl8wp+TOSi4+I=",
+      "requires": {
+        "d3-ease": "1.0.3",
+        "d3-interpolate": "1.1.6",
+        "d3-timer": "1.0.7",
+        "gl-matrix": "2.4.0",
+        "lodash": "4.17.4",
+        "wolfy87-eventemitter": "5.2.4"
+      }
+    },
+    "@antv/g2": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.2.tgz",
+      "integrity": "sha1-LerE+l1I42g4ZlF1FmpIEr9nTl4=",
+      "requires": {
+        "@antv/g": "2.0.2",
+        "fecha": "2.3.2",
+        "gl-matrix": "2.4.0",
+        "lodash": "4.17.4",
+        "wolfy87-eventemitter": "5.2.4"
+      }
+    },
+    "@antv/g2-plugin-slider": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.0.tgz",
+      "integrity": "sha1-OY7D2LhpExBB+Hj6+EXnaoS6+VQ="
+    },
+    "@delon/abc": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.3.0.tgz",
+      "integrity": "sha1-3z61AAo9cSv1bUdGGA49vYIsYoA="
+    },
+    "@delon/acl": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.3.0.tgz",
+      "integrity": "sha1-vp2hDXRCVcA0QYeTAHbsgz6VIp8="
+    },
+    "@delon/auth": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.3.0.tgz",
+      "integrity": "sha1-x7Knv2yrueOlC/Cc98CdFjd/aYw="
+    },
+    "@delon/theme": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.3.0.tgz",
+      "integrity": "sha1-GnkzMaXe3KFyxmJ8Qu7acLV1/og="
+    },
     "@ngtools/json-schema": {
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.1.0.tgz",
@@ -223,6 +317,16 @@
         "tree-kill": "1.2.0"
       }
     },
+    "@ngx-translate/core": {
+      "version": "9.0.1",
+      "resolved": "http://registry.npm.taobao.org/@ngx-translate/core/download/@ngx-translate/core-9.0.1.tgz",
+      "integrity": "sha1-AA8thjxMlMgY4UFu9DzKLFwMWEg="
+    },
+    "@ngx-translate/http-loader": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/@ngx-translate/http-loader/download/@ngx-translate/http-loader-2.0.0.tgz",
+      "integrity": "sha1-nBbQfNBwxnraJwoulAKB64JrP0M="
+    },
     "@schematics/angular": {
       "version": "0.1.11",
       "resolved": "http://registry.npm.taobao.org/@schematics/angular/download/@schematics/angular-0.1.11.tgz",
@@ -239,9 +343,9 @@
       "dev": true
     },
     "@types/jasmine": {
-      "version": "2.5.54",
-      "resolved": "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.5.54.tgz",
-      "integrity": "sha1-prXyrir7bgMHd06MfGCOA31JHGM=",
+      "version": "2.6.3",
+      "resolved": "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.6.3.tgz",
+      "integrity": "sha1-WGljv901448koKC2OkOM9SEpLtk=",
       "dev": true
     },
     "@types/jasminewd2": {
@@ -250,7 +354,7 @@
       "integrity": "sha1-DSiGsMva5MDuulXjB5L1hL8ECpU=",
       "dev": true,
       "requires": {
-        "@types/jasmine": "2.5.54"
+        "@types/jasmine": "2.6.3"
       }
     },
     "@types/node": {
@@ -276,6 +380,11 @@
       "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz",
       "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
       "dev": true
+    },
+    "abs-svg-path": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/abs-svg-path/download/abs-svg-path-0.1.1.tgz",
+      "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78="
     },
     "accepts": {
       "version": "1.3.4",
@@ -381,6 +490,41 @@
       "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
       "dev": true
     },
+    "angular-baidu-maps": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/angular-baidu-maps/download/angular-baidu-maps-1.0.1.tgz",
+      "integrity": "sha1-AA8gaxmSM2uspCzHpK6FdXJqlrk="
+    },
+    "angular-qq-maps": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/angular-qq-maps/download/angular-qq-maps-1.0.1.tgz",
+      "integrity": "sha1-uk8xL1AbsgiDcIHtndfllbpTyBA="
+    },
+    "angular-tree-component": {
+      "version": "6.1.0",
+      "resolved": "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-6.1.0.tgz",
+      "integrity": "sha1-nZprKKaIHCByzWMGtVIpV56JQHE=",
+      "requires": {
+        "lodash": "4.17.4",
+        "mobx": "3.4.1",
+        "mobx-angular": "2.0.1"
+      }
+    },
+    "ansi-escapes": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz",
+      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+      "dev": true
+    },
+    "ansi-gray": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
     "ansi-html": {
       "version": "0.0.7",
       "resolved": "http://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz",
@@ -401,6 +545,18 @@
       "requires": {
         "color-convert": "1.9.1"
       }
+    },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
+    "any-observable": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/any-observable/download/any-observable-0.2.0.tgz",
+      "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=",
+      "dev": true
     },
     "anymatch": {
       "version": "1.3.2",
@@ -433,6 +589,37 @@
       "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
       "dev": true
     },
+    "archiver": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/archiver/download/archiver-1.3.0.tgz",
+      "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+      "dev": true,
+      "requires": {
+        "archiver-utils": "1.3.0",
+        "async": "2.6.0",
+        "buffer-crc32": "0.2.13",
+        "glob": "7.1.2",
+        "lodash": "4.17.4",
+        "readable-stream": "2.3.3",
+        "tar-stream": "1.5.5",
+        "walkdir": "0.0.11",
+        "zip-stream": "1.2.0"
+      }
+    },
+    "archiver-utils": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/archiver-utils/download/archiver-utils-1.3.0.tgz",
+      "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "lazystream": "1.0.0",
+        "lodash": "4.17.4",
+        "normalize-path": "2.1.1",
+        "readable-stream": "2.3.3"
+      }
+    },
     "are-we-there-yet": {
       "version": "1.1.4",
       "resolved": "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.4.tgz",
@@ -452,6 +639,12 @@
         "sprintf-js": "1.0.3"
       }
     },
+    "argv": {
+      "version": "0.0.2",
+      "resolved": "http://registry.npm.taobao.org/argv/download/argv-0.0.2.tgz",
+      "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=",
+      "dev": true
+    },
     "arr-diff": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz",
@@ -465,6 +658,18 @@
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
       "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true
+    },
+    "array-differ": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz",
+      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/array-filter/download/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
       "dev": true
     },
     "array-find-index": {
@@ -488,6 +693,24 @@
         "define-properties": "1.1.2",
         "es-abstract": "1.10.0"
       }
+    },
+    "array-iterate": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/array-iterate/download/array-iterate-1.1.1.tgz",
+      "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=",
+      "dev": true
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/array-map/download/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/array-reduce/download/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
     },
     "array-slice": {
       "version": "0.2.3",
@@ -588,6 +811,12 @@
       "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
       "dev": true,
       "optional": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz",
+      "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=",
+      "dev": true
     },
     "asynckit": {
       "version": "0.4.0",
@@ -756,6 +985,12 @@
       "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
       "dev": true
     },
+    "bail": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/bail/download/bail-1.0.2.tgz",
+      "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=",
+      "dev": true
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
@@ -796,6 +1031,12 @@
         "tweetnacl": "0.14.5"
       }
     },
+    "beeper": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz",
+      "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+      "dev": true
+    },
     "better-assert": {
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz",
@@ -816,6 +1057,15 @@
       "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz",
       "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
       "dev": true
+    },
+    "bl": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/bl/download/bl-1.2.1.tgz",
+      "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.3"
+      }
     },
     "blob": {
       "version": "0.0.4",
@@ -1027,6 +1277,12 @@
         "isarray": "1.0.0"
       }
     },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "http://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
     "buffer-indexof": {
       "version": "1.1.1",
       "resolved": "http://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz",
@@ -1128,10 +1384,22 @@
       "integrity": "sha1-FrMNRyZqT1FcxprgMWtnDJYDzb4=",
       "dev": true
     },
+    "caniuse-lite": {
+      "version": "1.0.30000783",
+      "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000783.tgz",
+      "integrity": "sha1-m1SZ+xtQPSNF0SqmuGEoUvQnb/0=",
+      "dev": true
+    },
     "caseless": {
       "version": "0.12.0",
       "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
       "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "ccount": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/ccount/download/ccount-1.0.2.tgz",
+      "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=",
       "dev": true
     },
     "center-align": {
@@ -1162,6 +1430,30 @@
         "escape-string-regexp": "1.0.5",
         "supports-color": "4.5.0"
       }
+    },
+    "character-entities": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/character-entities/download/character-entities-1.2.1.tgz",
+      "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=",
+      "dev": true
+    },
+    "character-entities-html4": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/character-entities-html4/download/character-entities-html4-1.1.1.tgz",
+      "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=",
+      "dev": true
+    },
+    "character-entities-legacy": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.1.tgz",
+      "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=",
+      "dev": true
+    },
+    "character-reference-invalid": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.1.tgz",
+      "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=",
+      "dev": true
     },
     "charenc": {
       "version": "0.0.2",
@@ -1225,6 +1517,12 @@
       "integrity": "sha1-KhKCTlhFRuGu6lhlt78jShHEppU=",
       "dev": true
     },
+    "circular-json": {
+      "version": "0.3.3",
+      "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz",
+      "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
+      "dev": true
+    },
     "clap": {
       "version": "1.2.3",
       "resolved": "http://registry.npm.taobao.org/clap/download/clap-1.2.3.tgz",
@@ -1270,6 +1568,31 @@
         "source-map": "0.5.7"
       }
     },
+    "cli-cursor": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz",
+      "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "1.0.1"
+      }
+    },
+    "cli-spinners": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/cli-spinners/download/cli-spinners-0.1.2.tgz",
+      "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=",
+      "dev": true
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/cli-truncate/download/cli-truncate-0.2.1.tgz",
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "1.0.2"
+      }
+    },
     "cliui": {
       "version": "3.2.0",
       "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz",
@@ -1299,6 +1622,22 @@
         "shallow-clone": "0.1.2"
       }
     },
+    "clone-regexp": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/clone-regexp/download/clone-regexp-1.0.0.tgz",
+      "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=",
+      "dev": true,
+      "requires": {
+        "is-regexp": "1.0.0",
+        "is-supported-regexp-flag": "1.0.0"
+      }
+    },
+    "clone-stats": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz",
+      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+      "dev": true
+    },
     "co": {
       "version": "4.6.0",
       "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
@@ -1320,6 +1659,17 @@
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true
     },
+    "codecov": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/codecov/download/codecov-3.0.0.tgz",
+      "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=",
+      "dev": true,
+      "requires": {
+        "argv": "0.0.2",
+        "request": "2.81.0",
+        "urlgrey": "0.4.4"
+      }
+    },
     "codelyzer": {
       "version": "4.0.2",
       "resolved": "http://registry.npm.taobao.org/codelyzer/download/codelyzer-4.0.2.tgz",
@@ -1333,6 +1683,12 @@
         "source-map": "0.5.7",
         "sprintf-js": "1.0.3"
       }
+    },
+    "collapse-white-space": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.3.tgz",
+      "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=",
+      "dev": true
     },
     "color": {
       "version": "0.11.4",
@@ -1368,6 +1724,12 @@
       "requires": {
         "color-name": "1.1.3"
       }
+    },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz",
+      "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=",
+      "dev": true
     },
     "colormin": {
       "version": "1.1.2",
@@ -1407,8 +1769,7 @@
     "commander": {
       "version": "2.12.2",
       "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz",
-      "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU=",
-      "dev": true
+      "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU="
     },
     "common-tags": {
       "version": "1.5.1",
@@ -1442,6 +1803,18 @@
       "resolved": "http://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz",
       "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
       "dev": true
+    },
+    "compress-commons": {
+      "version": "1.2.2",
+      "resolved": "http://registry.npm.taobao.org/compress-commons/download/compress-commons-1.2.2.tgz",
+      "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+      "dev": true,
+      "requires": {
+        "buffer-crc32": "0.2.13",
+        "crc32-stream": "2.0.0",
+        "normalize-path": "2.1.1",
+        "readable-stream": "2.3.3"
+      }
     },
     "compressible": {
       "version": "2.0.12",
@@ -1649,6 +2022,22 @@
         "os-homedir": "1.0.2",
         "parse-json": "2.2.0",
         "require-from-string": "1.2.1"
+      }
+    },
+    "crc": {
+      "version": "3.5.0",
+      "resolved": "http://registry.npm.taobao.org/crc/download/crc-3.5.0.tgz",
+      "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+      "dev": true
+    },
+    "crc32-stream": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/crc32-stream/download/crc32-stream-2.0.0.tgz",
+      "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+      "dev": true,
+      "requires": {
+        "crc": "3.5.0",
+        "readable-stream": "2.3.3"
       }
     },
     "create-ecdh": {
@@ -1896,6 +2285,119 @@
         "es5-ext": "0.10.37"
       }
     },
+    "d3-array": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/d3-array/download/d3-array-1.2.1.tgz",
+      "integrity": "sha1-0coz3i9qwx76244FCgIdfiOW1dw="
+    },
+    "d3-collection": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.4.tgz",
+      "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI="
+    },
+    "d3-color": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/d3-color/download/d3-color-1.0.3.tgz",
+      "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs="
+    },
+    "d3-composite-projections": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/d3-composite-projections/download/d3-composite-projections-1.2.0.tgz",
+      "integrity": "sha1-+g5vFELxfQRkOEOjqIPH2U4MJ8A=",
+      "requires": {
+        "d3-geo": "1.2.4",
+        "d3-path": "1.0.5"
+      },
+      "dependencies": {
+        "d3-geo": {
+          "version": "1.2.4",
+          "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.2.4.tgz",
+          "integrity": "sha1-0XnzuqduYj7x4Ng2k9twW3xZkAY=",
+          "requires": {
+            "d3-array": "1.2.1"
+          }
+        }
+      }
+    },
+    "d3-dsv": {
+      "version": "1.0.8",
+      "resolved": "http://registry.npm.taobao.org/d3-dsv/download/d3-dsv-1.0.8.tgz",
+      "integrity": "sha1-kH4kDVezhmGNxWRous/na/GXZK4=",
+      "requires": {
+        "commander": "2.12.2",
+        "iconv-lite": "0.4.19",
+        "rw": "1.3.3"
+      }
+    },
+    "d3-ease": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.3.tgz",
+      "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4="
+    },
+    "d3-geo": {
+      "version": "1.9.1",
+      "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.9.1.tgz",
+      "integrity": "sha1-FX47D5FzedD3O+v/875Tf0n6c1Y=",
+      "requires": {
+        "d3-array": "1.2.1"
+      }
+    },
+    "d3-geo-projection": {
+      "version": "2.3.2",
+      "resolved": "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.3.2.tgz",
+      "integrity": "sha1-cuVZ3AXZf6nyGMzJxTfTKfTPxHQ=",
+      "requires": {
+        "commander": "2.12.2",
+        "d3-array": "1.2.1",
+        "d3-geo": "1.9.1"
+      }
+    },
+    "d3-hierarchy": {
+      "version": "1.1.5",
+      "resolved": "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.5.tgz",
+      "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY="
+    },
+    "d3-interpolate": {
+      "version": "1.1.6",
+      "resolved": "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz",
+      "integrity": "sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y=",
+      "requires": {
+        "d3-color": "1.0.3"
+      }
+    },
+    "d3-path": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/d3-path/download/d3-path-1.0.5.tgz",
+      "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q="
+    },
+    "d3-sankey": {
+      "version": "0.7.1",
+      "resolved": "http://registry.npm.taobao.org/d3-sankey/download/d3-sankey-0.7.1.tgz",
+      "integrity": "sha1-0imDImj8aaf+yEgD6WwiVqYUxSE=",
+      "requires": {
+        "d3-array": "1.2.1",
+        "d3-collection": "1.0.4",
+        "d3-shape": "1.2.0"
+      }
+    },
+    "d3-shape": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/d3-shape/download/d3-shape-1.2.0.tgz",
+      "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=",
+      "requires": {
+        "d3-path": "1.0.5"
+      }
+    },
+    "d3-timer": {
+      "version": "1.0.7",
+      "resolved": "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.7.tgz",
+      "integrity": "sha1-35ZQylh/bJZgf/TmDMOCKejdhTE="
+    },
+    "d3-voronoi": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.2.tgz",
+      "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw="
+    },
     "dashdash": {
       "version": "1.14.1",
       "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
@@ -1913,11 +2415,27 @@
         }
       }
     },
+    "date-fns": {
+      "version": "1.29.0",
+      "resolved": "http://registry.npm.taobao.org/date-fns/download/date-fns-1.29.0.tgz",
+      "integrity": "sha1-EuYJzcuTUScxHQTTMzTilgoqVOY=",
+      "dev": true
+    },
     "date-now": {
       "version": "0.1.4",
       "resolved": "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz",
       "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
       "dev": true
+    },
+    "dateformat": {
+      "version": "1.0.12",
+      "resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-1.0.12.tgz",
+      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1",
+        "meow": "3.7.0"
+      }
     },
     "debug": {
       "version": "2.6.9",
@@ -1934,10 +2452,22 @@
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
       "dev": true
     },
+    "dedent": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz",
+      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+      "dev": true
+    },
     "deep-equal": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz",
       "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
       "dev": true
     },
     "default-require-extensions": {
@@ -2193,6 +2723,56 @@
         "domelementtype": "1.3.0"
       }
     },
+    "dot-prop": {
+      "version": "4.2.0",
+      "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz",
+      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
+      "dev": true,
+      "requires": {
+        "is-obj": "1.0.1"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexer2": {
+      "version": "0.0.2",
+      "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz",
+      "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "1.1.14"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "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": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
     "duplexify": {
       "version": "3.5.1",
       "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz",
@@ -2231,6 +2811,12 @@
       "version": "1.3.28",
       "resolved": "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.28.tgz",
       "integrity": "sha1-jdTmRYCGZE6fnwoc8y4qH53/2e4=",
+      "dev": true
+    },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/elegant-spinner/download/elegant-spinner-1.0.1.tgz",
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
       "dev": true
     },
     "elliptic": {
@@ -2521,6 +3107,37 @@
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true
     },
+    "escodegen": {
+      "version": "1.8.1",
+      "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.8.1.tgz",
+      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+      "dev": true,
+      "requires": {
+        "esprima": "2.7.3",
+        "estraverse": "1.9.3",
+        "esutils": "2.0.2",
+        "optionator": "0.8.2",
+        "source-map": "0.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "1.9.3",
+          "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-1.9.3.tgz",
+          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.2.0",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.2.0.tgz",
+          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
     "escope": {
       "version": "3.6.0",
       "resolved": "http://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz",
@@ -2575,6 +3192,21 @@
       "requires": {
         "d": "1.0.0",
         "es5-ext": "0.10.37"
+      }
+    },
+    "event-stream": {
+      "version": "3.3.4",
+      "resolved": "http://registry.npm.taobao.org/event-stream/download/event-stream-3.3.4.tgz",
+      "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1",
+        "from": "0.1.7",
+        "map-stream": "0.1.0",
+        "pause-stream": "0.0.11",
+        "split": "0.3.3",
+        "stream-combiner": "0.0.4",
+        "through": "2.3.8"
       }
     },
     "eventemitter3": {
@@ -2636,10 +3268,25 @@
         }
       }
     },
+    "execall": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/execall/download/execall-1.0.0.tgz",
+      "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=",
+      "dev": true,
+      "requires": {
+        "clone-regexp": "1.0.0"
+      }
+    },
     "exit": {
       "version": "0.1.2",
       "resolved": "http://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz",
       "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "exit-hook": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz",
+      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
       "dev": true
     },
     "expand-braces": {
@@ -2807,6 +3454,25 @@
       "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
       "dev": true
     },
+    "fancy-log": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.2.tgz",
+      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+      "dev": true,
+      "requires": {
+        "ansi-gray": "0.1.1",
+        "color-support": "1.1.3",
+        "time-stamp": "1.1.0"
+      },
+      "dependencies": {
+        "time-stamp": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz",
+          "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+          "dev": true
+        }
+      }
+    },
     "fast-deep-equal": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz",
@@ -2817,6 +3483,12 @@
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
       "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
     "fastparse": {
@@ -2834,6 +3506,31 @@
         "websocket-driver": "0.7.0"
       }
     },
+    "fecha": {
+      "version": "2.3.2",
+      "resolved": "http://registry.npm.taobao.org/fecha/download/fecha-2.3.2.tgz",
+      "integrity": "sha1-Ng8DXdbt2VS8lYH5XypKfyo1BcE="
+    },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz",
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5",
+        "object-assign": "4.1.1"
+      }
+    },
+    "file-entry-cache": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz",
+      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+      "dev": true,
+      "requires": {
+        "flat-cache": "1.3.0",
+        "object-assign": "4.1.1"
+      }
+    },
     "file-loader": {
       "version": "1.1.5",
       "resolved": "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.5.tgz",
@@ -2843,6 +3540,11 @@
         "loader-utils": "1.1.0",
         "schema-utils": "0.3.0"
       }
+    },
+    "file-saver": {
+      "version": "1.3.3",
+      "resolved": "http://registry.npm.taobao.org/file-saver/download/file-saver-1.3.3.tgz",
+      "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI="
     },
     "filename-regex": {
       "version": "2.0.1",
@@ -2859,6 +3561,12 @@
         "glob": "7.1.2",
         "minimatch": "3.0.4"
       }
+    },
+    "filesize": {
+      "version": "3.5.11",
+      "resolved": "http://registry.npm.taobao.org/filesize/download/filesize-3.5.11.tgz",
+      "integrity": "sha1-GRkyZ0lDO7PPdzaL0VjKq8wZ6e4=",
+      "dev": true
     },
     "fill-range": {
       "version": "2.2.3",
@@ -2910,6 +3618,12 @@
         "pkg-dir": "2.0.0"
       }
     },
+    "find-parent-dir": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/find-parent-dir/download/find-parent-dir-0.3.0.tgz",
+      "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=",
+      "dev": true
+    },
     "find-up": {
       "version": "2.1.0",
       "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
@@ -2917,6 +3631,55 @@
       "dev": true,
       "requires": {
         "locate-path": "2.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.0.tgz",
+      "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+      "dev": true,
+      "requires": {
+        "circular-json": "0.3.3",
+        "del": "2.2.2",
+        "graceful-fs": "4.1.11",
+        "write": "0.2.1"
+      },
+      "dependencies": {
+        "del": {
+          "version": "2.2.2",
+          "resolved": "http://registry.npm.taobao.org/del/download/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.0",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "rimraf": "2.6.2"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "http://registry.npm.taobao.org/globby/download/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
       }
     },
     "flatten": {
@@ -2934,6 +3697,11 @@
         "inherits": "2.0.3",
         "readable-stream": "2.3.3"
       }
+    },
+    "font-awesome": {
+      "version": "4.7.0",
+      "resolved": "http://registry.npm.taobao.org/font-awesome/download/font-awesome-4.7.0.tgz",
+      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
     },
     "for-in": {
       "version": "1.0.2",
@@ -2983,6 +3751,12 @@
       "version": "0.5.2",
       "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
       "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/from/download/from-0.1.7.tgz",
+      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
       "dev": true
     },
     "from2": {
@@ -3985,15 +4759,13 @@
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz",
       "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
-      "dev": true,
-      "optional": true
+      "dev": true
     },
     "generate-object-property": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz",
       "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
       "dev": true,
-      "optional": true,
       "requires": {
         "is-property": "1.0.2"
       }
@@ -4002,6 +4774,12 @@
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz",
       "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+      "dev": true
+    },
+    "get-own-enumerable-property-symbols": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-2.0.1.tgz",
+      "integrity": "sha1-XErYfyg0xLm06EVJ3B4GUPs4wks=",
       "dev": true
     },
     "get-stdin": {
@@ -4032,6 +4810,11 @@
           "dev": true
         }
       }
+    },
+    "gl-matrix": {
+      "version": "2.4.0",
+      "resolved": "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.4.0.tgz",
+      "integrity": "sha1-IImxMwGinuyCLZ2Z3/wfeO6aPFA="
     },
     "glob": {
       "version": "7.1.2",
@@ -4120,6 +4903,12 @@
         "slash": "1.0.0"
       }
     },
+    "globjoin": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.taobao.org/globjoin/download/globjoin-0.1.4.tgz",
+      "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
+      "dev": true
+    },
     "globule": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/globule/download/globule-1.2.0.tgz",
@@ -4132,11 +4921,97 @@
         "minimatch": "3.0.4"
       }
     },
+    "glogg": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz",
+      "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.0"
+      }
+    },
     "graceful-fs": {
       "version": "4.1.11",
       "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz",
       "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
       "dev": true
+    },
+    "gulp-util": {
+      "version": "3.0.7",
+      "resolved": "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.7.tgz",
+      "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=",
+      "dev": true,
+      "requires": {
+        "array-differ": "1.0.0",
+        "array-uniq": "1.0.3",
+        "beeper": "1.1.1",
+        "chalk": "1.1.3",
+        "dateformat": "1.0.12",
+        "fancy-log": "1.3.2",
+        "gulplog": "1.0.0",
+        "has-gulplog": "0.1.0",
+        "lodash._reescape": "3.0.0",
+        "lodash._reevaluate": "3.0.0",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.template": "3.6.2",
+        "minimist": "1.2.0",
+        "multipipe": "0.1.2",
+        "object-assign": "3.0.0",
+        "replace-ext": "0.0.1",
+        "through2": "2.0.3",
+        "vinyl": "0.5.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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"
+          }
+        },
+        "object-assign": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz",
+          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "1.0.0"
+      }
+    },
+    "gzip-size": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/gzip-size/download/gzip-size-3.0.0.tgz",
+      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1"
+      }
     },
     "handle-thing": {
       "version": "1.2.5",
@@ -4301,6 +5176,15 @@
       "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
       "dev": true
     },
+    "has-gulplog": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz",
+      "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.0"
+      }
+    },
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz",
@@ -4415,6 +5299,12 @@
         "relateurl": "0.2.7",
         "uglify-js": "3.2.2"
       }
+    },
+    "html-tags": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz",
+      "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+      "dev": true
     },
     "html-webpack-plugin": {
       "version": "2.30.1",
@@ -4587,8 +5477,7 @@
     "iconv-lite": {
       "version": "0.4.19",
       "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz",
-      "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=",
-      "dev": true
+      "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs="
     },
     "icss-replace-symbols": {
       "version": "1.1.0",
@@ -4774,6 +5663,28 @@
       "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
       "dev": true
     },
+    "is-alphabetical": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.1.tgz",
+      "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=",
+      "dev": true
+    },
+    "is-alphanumeric": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-alphanumeric/download/is-alphanumeric-1.0.0.tgz",
+      "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
+      "dev": true
+    },
+    "is-alphanumerical": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.1.tgz",
+      "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=",
+      "dev": true,
+      "requires": {
+        "is-alphabetical": "1.0.1",
+        "is-decimal": "1.0.1"
+      }
+    },
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
@@ -4814,6 +5725,12 @@
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz",
       "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-decimal": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.1.tgz",
+      "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=",
       "dev": true
     },
     "is-directory": {
@@ -4876,12 +5793,17 @@
         "is-extglob": "2.1.1"
       }
     },
+    "is-hexadecimal": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.1.tgz",
+      "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=",
+      "dev": true
+    },
     "is-my-json-valid": {
       "version": "2.16.1",
       "resolved": "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.16.1.tgz",
       "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=",
       "dev": true,
-      "optional": true,
       "requires": {
         "generate-function": "2.0.0",
         "generate-object-property": "1.2.0",
@@ -4896,6 +5818,29 @@
       "dev": true,
       "requires": {
         "kind-of": "3.2.2"
+      }
+    },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "dev": true
+    },
+    "is-observable": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/is-observable/download/is-observable-0.2.0.tgz",
+      "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=",
+      "dev": true,
+      "requires": {
+        "symbol-observable": "0.2.4"
+      },
+      "dependencies": {
+        "symbol-observable": {
+          "version": "0.2.4",
+          "resolved": "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-0.2.4.tgz",
+          "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=",
+          "dev": true
+        }
       }
     },
     "is-path-cwd": {
@@ -4949,12 +5894,17 @@
       "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
       "dev": true
     },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
     "is-property": {
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz",
       "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
-      "dev": true,
-      "optional": true
+      "dev": true
     },
     "is-regex": {
       "version": "1.0.4",
@@ -4965,10 +5915,22 @@
         "has": "1.0.1"
       }
     },
+    "is-regexp": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+      "dev": true
+    },
     "is-stream": {
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz",
       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-supported-regexp-flag": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-supported-regexp-flag/download/is-supported-regexp-flag-1.0.0.tgz",
+      "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=",
       "dev": true
     },
     "is-svg": {
@@ -4996,6 +5958,18 @@
       "version": "0.2.1",
       "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz",
       "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-whitespace-character": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.1.tgz",
+      "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=",
+      "dev": true
+    },
+    "is-word-character": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-word-character/download/is-word-character-1.0.1.tgz",
+      "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=",
       "dev": true
     },
     "is-wsl": {
@@ -5033,6 +6007,91 @@
       "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
+    },
+    "istanbul": {
+      "version": "0.4.5",
+      "resolved": "http://registry.npm.taobao.org/istanbul/download/istanbul-0.4.5.tgz",
+      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.0.9",
+        "async": "1.5.2",
+        "escodegen": "1.8.1",
+        "esprima": "2.7.3",
+        "glob": "5.0.15",
+        "handlebars": "4.0.11",
+        "js-yaml": "3.7.0",
+        "mkdirp": "0.5.1",
+        "nopt": "3.0.6",
+        "once": "1.4.0",
+        "resolve": "1.1.7",
+        "supports-color": "3.2.3",
+        "which": "1.3.0",
+        "wordwrap": "1.0.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.0.9",
+          "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.0.9.tgz",
+          "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+          "dev": true
+        },
+        "async": {
+          "version": "1.5.2",
+          "resolved": "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        },
+        "glob": {
+          "version": "5.0.15",
+          "resolved": "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz",
+          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+          "dev": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "dev": true,
+          "requires": {
+            "abbrev": "1.0.9"
+          }
+        },
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz",
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
     },
     "istanbul-api": {
       "version": "1.2.1",
@@ -5191,15 +6250,15 @@
       }
     },
     "jasmine-core": {
-      "version": "2.6.4",
-      "resolved": "http://registry.npm.taobao.org/jasmine-core/download/jasmine-core-2.6.4.tgz",
-      "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=",
+      "version": "2.8.0",
+      "resolved": "http://registry.npm.taobao.org/jasmine-core/download/jasmine-core-2.8.0.tgz",
+      "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
       "dev": true
     },
     "jasmine-spec-reporter": {
-      "version": "4.1.1",
-      "resolved": "http://registry.npm.taobao.org/jasmine-spec-reporter/download/jasmine-spec-reporter-4.1.1.tgz",
-      "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=",
+      "version": "4.2.1",
+      "resolved": "http://registry.npm.taobao.org/jasmine-spec-reporter/download/jasmine-spec-reporter-4.2.1.tgz",
+      "integrity": "sha1-HWMq7ANBZwrTJPkrqEtLMrNeniI=",
       "dev": true,
       "requires": {
         "colors": "1.1.2"
@@ -5210,6 +6269,24 @@
       "resolved": "http://registry.npm.taobao.org/jasminewd2/download/jasminewd2-2.2.0.tgz",
       "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
       "dev": true
+    },
+    "jest-get-type": {
+      "version": "21.2.0",
+      "resolved": "http://registry.npm.taobao.org/jest-get-type/download/jest-get-type-21.2.0.tgz",
+      "integrity": "sha1-9jdqudtLYNgeOfMHScbEZvQNSiM=",
+      "dev": true
+    },
+    "jest-validate": {
+      "version": "21.2.1",
+      "resolved": "http://registry.npm.taobao.org/jest-validate/download/jest-validate-21.2.1.tgz",
+      "integrity": "sha1-zAy8plPNVJN7pPKhEXlndFMN08c=",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2",
+        "jest-get-type": "21.2.0",
+        "leven": "2.1.0",
+        "pretty-format": "21.2.1"
+      }
     },
     "js-base64": {
       "version": "2.4.0",
@@ -5250,6 +6327,12 @@
       "version": "0.5.7",
       "resolved": "http://registry.npm.taobao.org/json-loader/download/json-loader-0.5.7.tgz",
       "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.1.tgz",
+      "integrity": "sha1-UBg80bLSUnXeBp6ecbRnrJ6rlzo=",
       "dev": true
     },
     "json-schema": {
@@ -5310,8 +6393,7 @@
       "version": "4.0.1",
       "resolved": "http://registry.npm.taobao.org/jsonpointer/download/jsonpointer-4.0.1.tgz",
       "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
-      "dev": true,
-      "optional": true
+      "dev": true
     },
     "jsprim": {
       "version": "1.4.1",
@@ -5377,9 +6459,9 @@
       }
     },
     "karma-chrome-launcher": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/karma-chrome-launcher/download/karma-chrome-launcher-2.1.1.tgz",
-      "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=",
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/karma-chrome-launcher/download/karma-chrome-launcher-2.2.0.tgz",
+      "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=",
       "dev": true,
       "requires": {
         "fs-access": "1.0.1",
@@ -5420,6 +6502,39 @@
         "karma-jasmine": "1.1.1"
       }
     },
+    "karma-remap-istanbul": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/karma-remap-istanbul/download/karma-remap-istanbul-0.6.0.tgz",
+      "integrity": "sha1-l/O3cAZSVPm0ck8tm+SjouG69vw=",
+      "dev": true,
+      "requires": {
+        "istanbul": "0.4.5",
+        "remap-istanbul": "0.9.5"
+      }
+    },
+    "karma-sauce-launcher": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/karma-sauce-launcher/download/karma-sauce-launcher-1.2.0.tgz",
+      "integrity": "sha1-byVY3e889Wh5+idUDIrp+L/Ra8o=",
+      "dev": true,
+      "requires": {
+        "q": "1.5.1",
+        "sauce-connect-launcher": "1.2.3",
+        "saucelabs": "1.4.0",
+        "wd": "1.5.0"
+      },
+      "dependencies": {
+        "saucelabs": {
+          "version": "1.4.0",
+          "resolved": "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.4.0.tgz",
+          "integrity": "sha1-uTSpr52ih0s/QKrh/N5QpEZvXzg=",
+          "dev": true,
+          "requires": {
+            "https-proxy-agent": "1.0.0"
+          }
+        }
+      }
+    },
     "karma-source-map-support": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/karma-source-map-support/download/karma-source-map-support-1.2.0.tgz",
@@ -5444,11 +6559,26 @@
         "is-buffer": "1.1.6"
       }
     },
+    "known-css-properties": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/known-css-properties/download/known-css-properties-0.4.1.tgz",
+      "integrity": "sha1-uqr3BOX4pfEODiISEqrj6nOOo3I=",
+      "dev": true
+    },
     "lazy-cache": {
       "version": "0.2.7",
       "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-0.2.7.tgz",
       "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
       "dev": true
+    },
+    "lazystream": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz",
+      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.3"
+      }
     },
     "lcid": {
       "version": "1.0.0",
@@ -5500,6 +6630,22 @@
         }
       }
     },
+    "leven": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/leven/download/leven-2.1.0.tgz",
+      "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+      "dev": true
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2"
+      }
+    },
     "license-webpack-plugin": {
       "version": "1.1.1",
       "resolved": "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.1.1.tgz",
@@ -5507,6 +6653,268 @@
       "dev": true,
       "requires": {
         "ejs": "2.5.7"
+      }
+    },
+    "lint-staged": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npm.taobao.org/lint-staged/download/lint-staged-5.0.0.tgz",
+      "integrity": "sha1-8cZw4D4v3z89DrgfctO89lh3DlQ=",
+      "dev": true,
+      "requires": {
+        "app-root-path": "2.0.1",
+        "chalk": "2.2.2",
+        "commander": "2.12.2",
+        "cosmiconfig": "3.1.0",
+        "dedent": "0.7.0",
+        "execa": "0.8.0",
+        "find-parent-dir": "0.3.0",
+        "is-glob": "4.0.0",
+        "jest-validate": "21.2.1",
+        "listr": "0.13.0",
+        "lodash": "4.17.4",
+        "log-symbols": "2.1.0",
+        "minimatch": "3.0.4",
+        "npm-which": "3.0.1",
+        "p-map": "1.2.0",
+        "path-is-inside": "1.0.2",
+        "pify": "3.0.0",
+        "staged-git-files": "0.0.4",
+        "stringify-object": "3.2.1"
+      },
+      "dependencies": {
+        "cosmiconfig": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-3.1.0.tgz",
+          "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=",
+          "dev": true,
+          "requires": {
+            "is-directory": "0.3.1",
+            "js-yaml": "3.10.0",
+            "parse-json": "3.0.0",
+            "require-from-string": "2.0.1"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.1",
+            "shebang-command": "1.2.0",
+            "which": "1.3.0"
+          }
+        },
+        "esprima": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz",
+          "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+          "dev": true
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "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"
+          }
+        },
+        "js-yaml": {
+          "version": "3.10.0",
+          "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz",
+          "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=",
+          "dev": true,
+          "requires": {
+            "argparse": "1.0.9",
+            "esprima": "4.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-3.0.0.tgz",
+          "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=",
+          "dev": true,
+          "requires": {
+            "error-ex": "1.3.1"
+          }
+        },
+        "require-from-string": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.1.tgz",
+          "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=",
+          "dev": true
+        }
+      }
+    },
+    "listr": {
+      "version": "0.13.0",
+      "resolved": "http://registry.npm.taobao.org/listr/download/listr-0.13.0.tgz",
+      "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-truncate": "0.2.1",
+        "figures": "1.7.0",
+        "indent-string": "2.1.0",
+        "is-observable": "0.2.0",
+        "is-promise": "2.1.0",
+        "is-stream": "1.1.0",
+        "listr-silent-renderer": "1.1.1",
+        "listr-update-renderer": "0.4.0",
+        "listr-verbose-renderer": "0.4.1",
+        "log-symbols": "1.0.2",
+        "log-update": "1.0.2",
+        "ora": "0.2.3",
+        "p-map": "1.2.0",
+        "rxjs": "5.5.5",
+        "stream-to-observable": "0.2.0",
+        "strip-ansi": "3.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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"
+          }
+        },
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz",
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/listr-silent-renderer/download/listr-silent-renderer-1.1.1.tgz",
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/listr-update-renderer/download/listr-update-renderer-0.4.0.tgz",
+      "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-truncate": "0.2.1",
+        "elegant-spinner": "1.0.1",
+        "figures": "1.7.0",
+        "indent-string": "3.2.0",
+        "log-symbols": "1.0.2",
+        "log-update": "1.0.2",
+        "strip-ansi": "3.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "http://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz",
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/listr-verbose-renderer/download/listr-verbose-renderer-0.4.1.tgz",
+      "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-cursor": "1.0.2",
+        "date-fns": "1.29.0",
+        "figures": "1.7.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "load-json-file": {
@@ -5560,7 +6968,60 @@
     "lodash": {
       "version": "4.17.4",
       "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz",
-      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+    },
+    "lodash._basecopy": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz",
+      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+      "dev": true
+    },
+    "lodash._basetostring": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz",
+      "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+      "dev": true
+    },
+    "lodash._basevalues": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz",
+      "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+      "dev": true
+    },
+    "lodash._getnative": {
+      "version": "3.9.1",
+      "resolved": "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz",
+      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+      "dev": true
+    },
+    "lodash._isiterateecall": {
+      "version": "3.0.9",
+      "resolved": "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz",
+      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+      "dev": true
+    },
+    "lodash._reescape": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz",
+      "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+      "dev": true
+    },
+    "lodash._reevaluate": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz",
+      "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+      "dev": true
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
+    "lodash._root": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz",
+      "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
       "dev": true
     },
     "lodash.assign": {
@@ -5582,6 +7043,38 @@
       "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
       "dev": true
     },
+    "lodash.escape": {
+      "version": "3.2.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz",
+      "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+      "dev": true,
+      "requires": {
+        "lodash._root": "3.0.1"
+      }
+    },
+    "lodash.isarguments": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz",
+      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+      "dev": true
+    },
+    "lodash.isarray": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz",
+      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+      "dev": true
+    },
+    "lodash.keys": {
+      "version": "3.1.2",
+      "resolved": "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz",
+      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+      "dev": true,
+      "requires": {
+        "lodash._getnative": "3.9.1",
+        "lodash.isarguments": "3.1.0",
+        "lodash.isarray": "3.0.4"
+      }
+    },
     "lodash.memoize": {
       "version": "4.1.2",
       "resolved": "http://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
@@ -5595,17 +7088,69 @@
       "dev": true,
       "optional": true
     },
+    "lodash.restparam": {
+      "version": "3.6.1",
+      "resolved": "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz",
+      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+      "dev": true
+    },
     "lodash.tail": {
       "version": "4.1.1",
       "resolved": "http://registry.npm.taobao.org/lodash.tail/download/lodash.tail-4.1.1.tgz",
       "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
       "dev": true
     },
+    "lodash.template": {
+      "version": "3.6.2",
+      "resolved": "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz",
+      "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+      "dev": true,
+      "requires": {
+        "lodash._basecopy": "3.0.1",
+        "lodash._basetostring": "3.0.1",
+        "lodash._basevalues": "3.0.0",
+        "lodash._isiterateecall": "3.0.9",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0",
+        "lodash.keys": "3.1.2",
+        "lodash.restparam": "3.6.1",
+        "lodash.templatesettings": "3.1.1"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "3.1.1",
+      "resolved": "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz",
+      "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0"
+      }
+    },
     "lodash.uniq": {
       "version": "4.5.0",
       "resolved": "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz",
       "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
       "dev": true
+    },
+    "log-symbols": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/log-symbols/download/log-symbols-2.1.0.tgz",
+      "integrity": "sha1-81+mDieIMrU43E3dy7R4pF0+O+Y=",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2"
+      }
+    },
+    "log-update": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/log-update/download/log-update-1.0.2.tgz",
+      "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "1.4.0",
+        "cli-cursor": "1.0.2"
+      }
     },
     "log4js": {
       "version": "0.6.38",
@@ -5659,6 +7204,12 @@
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz",
       "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
+    },
+    "longest-streak": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/longest-streak/download/longest-streak-2.0.2.tgz",
+      "integrity": "sha1-JCG2upOaRDu5/+v1llhaULTDji4=",
       "dev": true
     },
     "loose-envify": {
@@ -5732,10 +7283,34 @@
       "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
       "dev": true
     },
+    "map-stream": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/map-stream/download/map-stream-0.1.0.tgz",
+      "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+      "dev": true
+    },
+    "markdown-escapes": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/markdown-escapes/download/markdown-escapes-1.0.1.tgz",
+      "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=",
+      "dev": true
+    },
+    "markdown-table": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/markdown-table/download/markdown-table-1.1.1.tgz",
+      "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=",
+      "dev": true
+    },
     "math-expression-evaluator": {
       "version": "1.2.17",
       "resolved": "http://registry.npm.taobao.org/math-expression-evaluator/download/math-expression-evaluator-1.2.17.tgz",
       "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
+      "dev": true
+    },
+    "mathml-tag-names": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/mathml-tag-names/download/mathml-tag-names-2.0.1.tgz",
+      "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=",
       "dev": true
     },
     "md5": {
@@ -5771,6 +7346,16 @@
         }
       }
     },
+    "mdast-util-compact": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/mdast-util-compact/download/mdast-util-compact-1.0.1.tgz",
+      "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=",
+      "dev": true,
+      "requires": {
+        "unist-util-modify-children": "1.1.1",
+        "unist-util-visit": "1.3.0"
+      }
+    },
     "media-typer": {
       "version": "0.3.0",
       "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
@@ -5795,6 +7380,12 @@
         "errno": "0.1.6",
         "readable-stream": "2.3.3"
       }
+    },
+    "memorystream": {
+      "version": "0.3.1",
+      "resolved": "http://registry.npm.taobao.org/memorystream/download/memorystream-0.3.1.tgz",
+      "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+      "dev": true
     },
     "meow": {
       "version": "3.7.0",
@@ -5981,6 +7572,21 @@
         }
       }
     },
+    "mobx": {
+      "version": "3.4.1",
+      "resolved": "http://registry.npm.taobao.org/mobx/download/mobx-3.4.1.tgz",
+      "integrity": "sha1-N6vl7ogtQBgo2fJsbBovR2FLu+8="
+    },
+    "mobx-angular": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-2.0.1.tgz",
+      "integrity": "sha1-JjjQkWGAgGk7vtAsXfjNcUtSwWc="
+    },
+    "moment": {
+      "version": "2.19.4",
+      "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.19.4.tgz",
+      "integrity": "sha1-F+XixurYgZyOz62DoKzMsxLpRoI="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz",
@@ -6017,6 +7623,15 @@
       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
       "dev": true
     },
+    "multipipe": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz",
+      "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "0.0.2"
+      }
+    },
     "nan": {
       "version": "2.8.0",
       "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz",
@@ -6038,6 +7653,54 @@
       "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz",
       "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
       "dev": true
+    },
+    "ng-tree-antd": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.0.4.tgz",
+      "integrity": "sha1-pegPPbuRulfHnKYi8OsBA+xYhN4=",
+      "requires": {
+        "angular-tree-component": "6.1.0"
+      }
+    },
+    "ng-zorro-antd": {
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.6.tgz",
+      "integrity": "sha1-M+kqIcXkArZjibMPSexq3tyPpdQ=",
+      "requires": {
+        "@angular/cdk": "5.0.0",
+        "moment": "2.19.4",
+        "tslib": "1.8.1"
+      }
+    },
+    "ng-zorro-antd-extra": {
+      "version": "1.1.4",
+      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.4.tgz",
+      "integrity": "sha1-K3jTYVZ3tIgJD3SZiEFSl20ygu4="
+    },
+    "ng2-dnd": {
+      "version": "5.0.2",
+      "resolved": "http://registry.npm.taobao.org/ng2-dnd/download/ng2-dnd-5.0.2.tgz",
+      "integrity": "sha1-hiJ4rH3t+hT1eDu/NAFNXXPf77Q="
+    },
+    "ng2-file-upload": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/ng2-file-upload/download/ng2-file-upload-1.3.0.tgz",
+      "integrity": "sha1-2Q+PVo9iODRiF1+L36AJaxMfJ3o="
+    },
+    "ng2-img-cropper": {
+      "version": "0.9.0",
+      "resolved": "http://registry.npm.taobao.org/ng2-img-cropper/download/ng2-img-cropper-0.9.0.tgz",
+      "integrity": "sha1-MFM35mnE5a3IdtYo3K4Lyk0Q0cM="
+    },
+    "ngx-color-picker": {
+      "version": "5.2.0",
+      "resolved": "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.2.0.tgz",
+      "integrity": "sha1-hDOTPteF4OXTKFVXdLIMI+NJhgY="
+    },
+    "ngx-countdown": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.2.tgz",
+      "integrity": "sha1-+q905dlnCQYvf7A18QW1+Pdr6S0="
     },
     "no-case": {
       "version": "2.3.2",
@@ -6287,6 +7950,12 @@
       "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
       "dev": true
     },
+    "normalize-selector": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz",
+      "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
+      "dev": true
+    },
     "normalize-url": {
       "version": "1.9.1",
       "resolved": "http://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz",
@@ -6299,6 +7968,84 @@
         "sort-keys": "1.1.2"
       }
     },
+    "npm-path": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/npm-path/download/npm-path-2.0.3.tgz",
+      "integrity": "sha1-Fc/04ciaONp39W9gVbJPl137K74=",
+      "dev": true,
+      "requires": {
+        "which": "1.3.0"
+      }
+    },
+    "npm-run-all": {
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/npm-run-all/download/npm-run-all-4.1.2.tgz",
+      "integrity": "sha1-kNYtB4eS0gZpE55xhiEYZlbOoFY=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "3.2.0",
+        "chalk": "2.2.2",
+        "cross-spawn": "5.1.0",
+        "memorystream": "0.3.1",
+        "minimatch": "3.0.4",
+        "ps-tree": "1.1.0",
+        "read-pkg": "3.0.0",
+        "shell-quote": "1.6.1",
+        "string.prototype.padend": "3.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.1",
+            "shebang-command": "1.2.0",
+            "which": "1.3.0"
+          }
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "4.0.0",
+            "pify": "3.0.0",
+            "strip-bom": "3.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "1.3.1",
+            "json-parse-better-errors": "1.0.1"
+          }
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "4.0.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "3.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        }
+      }
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
@@ -6306,6 +8053,17 @@
       "dev": true,
       "requires": {
         "path-key": "2.0.1"
+      }
+    },
+    "npm-which": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/npm-which/download/npm-which-3.0.1.tgz",
+      "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=",
+      "dev": true,
+      "requires": {
+        "commander": "2.12.2",
+        "npm-path": "2.0.3",
+        "which": "1.3.0"
       }
     },
     "npmlog": {
@@ -6422,6 +8180,18 @@
         "wrappy": "1.0.2"
       }
     },
+    "onetime": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz",
+      "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+      "dev": true
+    },
+    "opener": {
+      "version": "1.4.3",
+      "resolved": "http://registry.npm.taobao.org/opener/download/opener-1.4.3.tgz",
+      "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=",
+      "dev": true
+    },
     "opn": {
       "version": "5.1.0",
       "resolved": "http://registry.npm.taobao.org/opn/download/opn-5.1.0.tgz",
@@ -6449,11 +8219,72 @@
         }
       }
     },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+      "dev": 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": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
+    },
     "options": {
       "version": "0.0.6",
       "resolved": "http://registry.npm.taobao.org/options/download/options-0.0.6.tgz",
       "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
       "dev": true
+    },
+    "ora": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npm.taobao.org/ora/download/ora-0.2.3.tgz",
+      "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-cursor": "1.0.2",
+        "cli-spinners": "0.1.2",
+        "object-assign": "4.1.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
     },
     "original": {
       "version": "1.0.0",
@@ -6579,6 +8410,20 @@
         "pbkdf2": "3.0.14"
       }
     },
+    "parse-entities": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/parse-entities/download/parse-entities-1.1.1.tgz",
+      "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=",
+      "dev": true,
+      "requires": {
+        "character-entities": "1.2.1",
+        "character-entities-legacy": "1.1.1",
+        "character-reference-invalid": "1.1.1",
+        "is-alphanumerical": "1.0.1",
+        "is-decimal": "1.0.1",
+        "is-hexadecimal": "1.0.1"
+      }
+    },
     "parse-glob": {
       "version": "3.0.4",
       "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz",
@@ -6622,6 +8467,11 @@
       "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz",
       "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
       "dev": true
+    },
+    "parse-svg-path": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/parse-svg-path/download/parse-svg-path-0.1.2.tgz",
+      "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes="
     },
     "parsejson": {
       "version": "0.0.3",
@@ -6707,6 +8557,15 @@
         "pify": "3.0.0"
       }
     },
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz",
+      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
     "pbkdf2": {
       "version": "3.0.14",
       "resolved": "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.14.tgz",
@@ -6754,6 +8613,23 @@
       "dev": true,
       "requires": {
         "find-up": "2.1.0"
+      }
+    },
+    "point-at-length": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.1.0.tgz",
+      "integrity": "sha1-CtcuvQmA1/WhqxIpbAVfnrazDlc=",
+      "requires": {
+        "abs-svg-path": "0.1.1",
+        "isarray": "0.0.1",
+        "parse-svg-path": "0.1.2"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        }
       }
     },
     "portfinder": {
@@ -6959,6 +8835,51 @@
         "uniqid": "4.1.1"
       }
     },
+    "postcss-html": {
+      "version": "0.11.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-html/download/postcss-html-0.11.0.tgz",
+      "integrity": "sha1-A6P/MRb4oP4NRjFuohiT1NtLY68=",
+      "dev": true,
+      "requires": {
+        "htmlparser2": "3.9.2",
+        "remark": "8.0.0",
+        "unist-util-find-all-after": "1.0.1"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.1.tgz",
+          "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1.3.0"
+          }
+        },
+        "htmlparser2": {
+          "version": "3.9.2",
+          "resolved": "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.9.2.tgz",
+          "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1.3.0",
+            "domhandler": "2.4.1",
+            "domutils": "1.5.1",
+            "entities": "1.1.1",
+            "inherits": "2.0.3",
+            "readable-stream": "2.3.3"
+          }
+        }
+      }
+    },
+    "postcss-less": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/postcss-less/download/postcss-less-1.1.3.tgz",
+      "integrity": "sha1-aTBSUnG/441Xk9M6wJwaVGuHu1E=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      }
+    },
     "postcss-load-config": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-1.2.0.tgz",
@@ -7032,6 +8953,12 @@
           "dev": true
         }
       }
+    },
+    "postcss-media-query-parser": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npm.taobao.org/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz",
+      "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
+      "dev": true
     },
     "postcss-merge-idents": {
       "version": "2.1.7",
@@ -7337,6 +9264,134 @@
         "postcss-value-parser": "3.3.0"
       }
     },
+    "postcss-reporter": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-reporter/download/postcss-reporter-5.0.0.tgz",
+      "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2",
+        "lodash": "4.17.4",
+        "log-symbols": "2.1.0",
+        "postcss": "6.0.14"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.14",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
+          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.0",
+            "source-map": "0.6.1",
+            "supports-color": "4.5.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "2.3.0",
+              "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
+              "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+              "dev": true,
+              "requires": {
+                "ansi-styles": "3.2.0",
+                "escape-string-regexp": "1.0.5",
+                "supports-color": "4.5.0"
+              }
+            }
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "postcss-resolve-nested-selector": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz",
+      "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
+      "dev": true
+    },
+    "postcss-safe-parser": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-safe-parser/download/postcss-safe-parser-3.0.1.tgz",
+      "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.14"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
+          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          }
+        },
+        "postcss": {
+          "version": "6.0.14",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
+          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.0",
+            "source-map": "0.6.1",
+            "supports-color": "4.5.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "postcss-scss": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-scss/download/postcss-scss-1.0.2.tgz",
+      "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.14"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
+          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          }
+        },
+        "postcss": {
+          "version": "6.0.14",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
+          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.0",
+            "source-map": "0.6.1",
+            "supports-color": "4.5.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
     "postcss-selector-parser": {
       "version": "2.2.3",
       "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-2.2.3.tgz",
@@ -7431,6 +9486,12 @@
         "uniqs": "2.0.0"
       }
     },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
     "prepend-http": {
       "version": "1.0.4",
       "resolved": "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz",
@@ -7451,6 +9512,24 @@
       "requires": {
         "renderkid": "2.0.1",
         "utila": "0.4.0"
+      }
+    },
+    "pretty-format": {
+      "version": "21.2.1",
+      "resolved": "http://registry.npm.taobao.org/pretty-format/download/pretty-format-21.2.1.tgz",
+      "integrity": "sha1-rlQH888hBmzQEaobpfzntqLt2zY=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "3.0.0",
+        "ansi-styles": "3.2.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        }
       }
     },
     "process": {
@@ -7606,6 +9685,15 @@
       "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz",
       "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
       "dev": true
+    },
+    "ps-tree": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/ps-tree/download/ps-tree-1.1.0.tgz",
+      "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
+      "dev": true,
+      "requires": {
+        "event-stream": "3.3.4"
+      }
     },
     "pseudomap": {
       "version": "1.0.2",
@@ -7970,11 +10058,118 @@
         "jsesc": "0.5.0"
       }
     },
+    "regression": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz",
+      "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc="
+    },
     "relateurl": {
       "version": "0.2.7",
       "resolved": "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz",
       "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
       "dev": true
+    },
+    "remap-istanbul": {
+      "version": "0.9.5",
+      "resolved": "http://registry.npm.taobao.org/remap-istanbul/download/remap-istanbul-0.9.5.tgz",
+      "integrity": "sha1-oYYXsfMe7Fp9vud1OCmLd1YGqqg=",
+      "dev": true,
+      "requires": {
+        "amdefine": "1.0.1",
+        "gulp-util": "3.0.7",
+        "istanbul": "0.4.5",
+        "minimatch": "3.0.4",
+        "source-map": "0.5.7",
+        "through2": "2.0.1"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "dev": 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": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        },
+        "through2": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.1.tgz",
+          "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.0.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "remark": {
+      "version": "8.0.0",
+      "resolved": "http://registry.npm.taobao.org/remark/download/remark-8.0.0.tgz",
+      "integrity": "sha1-KHtt8v4RkOJjwdFeSG0/qDVZTW0=",
+      "dev": true,
+      "requires": {
+        "remark-parse": "4.0.0",
+        "remark-stringify": "4.0.0",
+        "unified": "6.1.6"
+      }
+    },
+    "remark-parse": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/remark-parse/download/remark-parse-4.0.0.tgz",
+      "integrity": "sha1-mfHwSa+sgDgjZuLg0L1VQp3UXYs=",
+      "dev": true,
+      "requires": {
+        "collapse-white-space": "1.0.3",
+        "is-alphabetical": "1.0.1",
+        "is-decimal": "1.0.1",
+        "is-whitespace-character": "1.0.1",
+        "is-word-character": "1.0.1",
+        "markdown-escapes": "1.0.1",
+        "parse-entities": "1.1.1",
+        "repeat-string": "1.6.1",
+        "state-toggle": "1.0.0",
+        "trim": "0.0.1",
+        "trim-trailing-lines": "1.1.0",
+        "unherit": "1.1.0",
+        "unist-util-remove-position": "1.1.1",
+        "vfile-location": "2.0.2",
+        "xtend": "4.0.1"
+      }
+    },
+    "remark-stringify": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/remark-stringify/download/remark-stringify-4.0.0.tgz",
+      "integrity": "sha1-RDGITAQY8RLaRJkbTjVs/jf6zYc=",
+      "dev": true,
+      "requires": {
+        "ccount": "1.0.2",
+        "is-alphanumeric": "1.0.0",
+        "is-decimal": "1.0.1",
+        "is-whitespace-character": "1.0.1",
+        "longest-streak": "2.0.2",
+        "markdown-escapes": "1.0.1",
+        "markdown-table": "1.1.1",
+        "mdast-util-compact": "1.0.1",
+        "parse-entities": "1.1.1",
+        "repeat-string": "1.6.1",
+        "state-toggle": "1.0.0",
+        "stringify-entities": "1.3.1",
+        "unherit": "1.1.0",
+        "xtend": "4.0.1"
+      }
     },
     "remove-trailing-separator": {
       "version": "1.1.0",
@@ -8023,6 +10218,12 @@
       "requires": {
         "is-finite": "1.0.2"
       }
+    },
+    "replace-ext": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz",
+      "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+      "dev": true
     },
     "request": {
       "version": "2.81.0",
@@ -8102,6 +10303,16 @@
       "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
       "dev": true
     },
+    "restore-cursor": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz",
+      "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+      "dev": true,
+      "requires": {
+        "exit-hook": "1.1.1",
+        "onetime": "1.1.0"
+      }
+    },
     "right-align": {
       "version": "0.1.3",
       "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz",
@@ -8138,6 +10349,11 @@
       "requires": {
         "aproba": "1.2.0"
       }
+    },
+    "rw": {
+      "version": "1.3.3",
+      "resolved": "http://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz",
+      "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
     },
     "rxjs": {
       "version": "5.5.5",
@@ -8179,6 +10395,19 @@
         "pify": "3.0.0"
       }
     },
+    "sauce-connect-launcher": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/sauce-connect-launcher/download/sauce-connect-launcher-1.2.3.tgz",
+      "integrity": "sha1-0vkxrXro/avxlopEDnsgQXrKf4Y=",
+      "dev": true,
+      "requires": {
+        "adm-zip": "0.4.7",
+        "async": "2.6.0",
+        "https-proxy-agent": "1.0.0",
+        "lodash": "4.17.4",
+        "rimraf": "2.6.2"
+      }
+    },
     "saucelabs": {
       "version": "1.3.0",
       "resolved": "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.3.0.tgz",
@@ -8202,6 +10431,11 @@
       "requires": {
         "ajv": "5.5.1"
       }
+    },
+    "screenfull": {
+      "version": "3.3.2",
+      "resolved": "http://registry.npm.taobao.org/screenfull/download/screenfull-3.3.2.tgz",
+      "integrity": "sha1-pq3zs/VVbagSclOFiAYA9bOfvyU="
     },
     "scss-tokenizer": {
       "version": "0.2.3",
@@ -8413,6 +10647,18 @@
       "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
       "dev": true
     },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.taobao.org/shell-quote/download/shell-quote-1.6.1.tgz",
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "dev": true,
+      "requires": {
+        "array-filter": "0.0.1",
+        "array-map": "0.0.0",
+        "array-reduce": "0.0.0",
+        "jsonify": "0.0.0"
+      }
+    },
     "signal-exit": {
       "version": "3.0.2",
       "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz",
@@ -8428,10 +10674,26 @@
         "debug": "2.6.9"
       }
     },
+    "simple-line-icons": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.taobao.org/simple-line-icons/download/simple-line-icons-2.4.1.tgz",
+      "integrity": "sha1-t1vFoNh+UwkowszaVzUnS7JW8jQ="
+    },
+    "simple-statistics": {
+      "version": "4.1.1",
+      "resolved": "http://registry.npm.taobao.org/simple-statistics/download/simple-statistics-4.1.1.tgz",
+      "integrity": "sha1-UzxI1IM2uj01DYE18g+nE4rLDH0="
+    },
     "slash": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
       "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "0.0.4",
+      "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz",
+      "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
       "dev": true
     },
     "sntp": {
@@ -8689,6 +10951,12 @@
         "source-map": "0.5.7"
       }
     },
+    "sparkles": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz",
+      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+      "dev": true
+    },
     "spdx-correct": {
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz",
@@ -8739,6 +11007,21 @@
         "wbuf": "1.7.2"
       }
     },
+    "specificity": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/specificity/download/specificity-0.3.2.tgz",
+      "integrity": "sha1-meZRHs7vD42bV5JJN6rCyxPRPEI=",
+      "dev": true
+    },
+    "split": {
+      "version": "0.3.3",
+      "resolved": "http://registry.npm.taobao.org/split/download/split-0.3.3.tgz",
+      "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
@@ -8778,6 +11061,18 @@
         "safe-buffer": "5.1.1"
       }
     },
+    "staged-git-files": {
+      "version": "0.0.4",
+      "resolved": "http://registry.npm.taobao.org/staged-git-files/download/staged-git-files-0.0.4.tgz",
+      "integrity": "sha1-15fhtVHKemOd7AI33G60u5vhfTU=",
+      "dev": true
+    },
+    "state-toggle": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.0.tgz",
+      "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=",
+      "dev": true
+    },
     "statuses": {
       "version": "1.3.1",
       "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
@@ -8802,6 +11097,15 @@
       "requires": {
         "inherits": "2.0.3",
         "readable-stream": "2.3.3"
+      }
+    },
+    "stream-combiner": {
+      "version": "0.0.4",
+      "resolved": "http://registry.npm.taobao.org/stream-combiner/download/stream-combiner-0.0.4.tgz",
+      "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1"
       }
     },
     "stream-each": {
@@ -8833,6 +11137,15 @@
       "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
       "dev": true
     },
+    "stream-to-observable": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/stream-to-observable/download/stream-to-observable-0.2.0.tgz",
+      "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=",
+      "dev": true,
+      "requires": {
+        "any-observable": "0.2.0"
+      }
+    },
     "strict-uri-encode": {
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz",
@@ -8850,6 +11163,17 @@
         "strip-ansi": "3.0.1"
       }
     },
+    "string.prototype.padend": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/string.prototype.padend/download/string.prototype.padend-3.0.0.tgz",
+      "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
     "string_decoder": {
       "version": "1.0.3",
       "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz",
@@ -8857,6 +11181,29 @@
       "dev": true,
       "requires": {
         "safe-buffer": "5.1.1"
+      }
+    },
+    "stringify-entities": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/stringify-entities/download/stringify-entities-1.3.1.tgz",
+      "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=",
+      "dev": true,
+      "requires": {
+        "character-entities-html4": "1.1.1",
+        "character-entities-legacy": "1.1.1",
+        "is-alphanumerical": "1.0.1",
+        "is-hexadecimal": "1.0.1"
+      }
+    },
+    "stringify-object": {
+      "version": "3.2.1",
+      "resolved": "http://registry.npm.taobao.org/stringify-object/download/stringify-object-3.2.1.tgz",
+      "integrity": "sha1-JyDC7/lAhUyBn27iUqrrWB8wYk0=",
+      "dev": true,
+      "requires": {
+        "get-own-enumerable-property-symbols": "2.0.1",
+        "is-obj": "1.0.1",
+        "is-regexp": "1.0.0"
       }
     },
     "stringstream": {
@@ -8911,6 +11258,235 @@
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0"
+      }
+    },
+    "style-search": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/style-search/download/style-search-0.1.0.tgz",
+      "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
+      "dev": true
+    },
+    "stylelint": {
+      "version": "8.3.1",
+      "resolved": "http://registry.npm.taobao.org/stylelint/download/stylelint-8.3.1.tgz",
+      "integrity": "sha1-QkyCLzLIjoUCW1XXLHuYNV4/pt4=",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "7.2.3",
+        "balanced-match": "1.0.0",
+        "chalk": "2.2.2",
+        "cosmiconfig": "3.1.0",
+        "debug": "3.1.0",
+        "execall": "1.0.0",
+        "file-entry-cache": "2.0.0",
+        "get-stdin": "5.0.1",
+        "globby": "7.1.1",
+        "globjoin": "0.1.4",
+        "html-tags": "2.0.0",
+        "ignore": "3.3.7",
+        "imurmurhash": "0.1.4",
+        "known-css-properties": "0.4.1",
+        "lodash": "4.17.4",
+        "log-symbols": "2.1.0",
+        "mathml-tag-names": "2.0.1",
+        "meow": "3.7.0",
+        "micromatch": "2.3.11",
+        "normalize-selector": "0.2.0",
+        "pify": "3.0.0",
+        "postcss": "6.0.14",
+        "postcss-html": "0.11.0",
+        "postcss-less": "1.1.3",
+        "postcss-media-query-parser": "0.2.3",
+        "postcss-reporter": "5.0.0",
+        "postcss-resolve-nested-selector": "0.1.1",
+        "postcss-safe-parser": "3.0.1",
+        "postcss-scss": "1.0.2",
+        "postcss-selector-parser": "3.1.1",
+        "postcss-value-parser": "3.3.0",
+        "resolve-from": "4.0.0",
+        "specificity": "0.3.2",
+        "string-width": "2.1.1",
+        "style-search": "0.1.0",
+        "sugarss": "1.0.1",
+        "svg-tags": "1.0.0",
+        "table": "4.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "autoprefixer": {
+          "version": "7.2.3",
+          "resolved": "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.3.tgz",
+          "integrity": "sha1-woQeOLeUDC0Km7/9csdfM2N4VPg=",
+          "dev": true,
+          "requires": {
+            "browserslist": "2.10.0",
+            "caniuse-lite": "1.0.30000783",
+            "normalize-range": "0.1.2",
+            "num2fraction": "1.2.2",
+            "postcss": "6.0.14",
+            "postcss-value-parser": "3.3.0"
+          }
+        },
+        "browserslist": {
+          "version": "2.10.0",
+          "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-2.10.0.tgz",
+          "integrity": "sha1-usXuHMacqdlkA/+4o6vcW2rtY0Y=",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "1.0.30000783",
+            "electron-to-chromium": "1.3.28"
+          }
+        },
+        "cosmiconfig": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-3.1.0.tgz",
+          "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=",
+          "dev": true,
+          "requires": {
+            "is-directory": "0.3.1",
+            "js-yaml": "3.10.0",
+            "parse-json": "3.0.0",
+            "require-from-string": "2.0.1"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "esprima": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz",
+          "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+          "dev": true
+        },
+        "get-stdin": {
+          "version": "5.0.1",
+          "resolved": "http://registry.npm.taobao.org/get-stdin/download/get-stdin-5.0.1.tgz",
+          "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "3.10.0",
+          "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz",
+          "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=",
+          "dev": true,
+          "requires": {
+            "argparse": "1.0.9",
+            "esprima": "4.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-3.0.0.tgz",
+          "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=",
+          "dev": true,
+          "requires": {
+            "error-ex": "1.3.1"
+          }
+        },
+        "postcss": {
+          "version": "6.0.14",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
+          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.0",
+            "source-map": "0.6.1",
+            "supports-color": "4.5.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "2.3.0",
+              "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
+              "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+              "dev": true,
+              "requires": {
+                "ansi-styles": "3.2.0",
+                "escape-string-regexp": "1.0.5",
+                "supports-color": "4.5.0"
+              }
+            }
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.1",
+          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "4.2.0",
+            "indexes-of": "1.0.1",
+            "uniq": "1.0.1"
+          }
+        },
+        "require-from-string": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.1.tgz",
+          "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+          "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "stylelint-config-recommended": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/stylelint-config-recommended/download/stylelint-config-recommended-1.0.0.tgz",
+      "integrity": "sha1-dSwX/Gj6ZM1edYniT25G534UpzU=",
+      "dev": true
+    },
+    "stylelint-config-standard": {
+      "version": "17.0.0",
+      "resolved": "http://registry.npm.taobao.org/stylelint-config-standard/download/stylelint-config-standard-17.0.0.tgz",
+      "integrity": "sha1-QhA6CQBU7io93p7K7VXl1NnQWfw=",
+      "dev": true,
+      "requires": {
+        "stylelint-config-recommended": "1.0.0"
       }
     },
     "stylus": {
@@ -8969,6 +11545,45 @@
         "when": "3.6.4"
       }
     },
+    "sugarss": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/sugarss/download/sugarss-1.0.1.tgz",
+      "integrity": "sha1-voJtkAPg8kdzX5I2XcP9fxuunkQ=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.14"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
+          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          }
+        },
+        "postcss": {
+          "version": "6.0.14",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
+          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.0",
+            "source-map": "0.6.1",
+            "supports-color": "4.5.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
     "supports-color": {
       "version": "4.5.0",
       "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz",
@@ -8977,6 +11592,12 @@
       "requires": {
         "has-flag": "2.0.0"
       }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz",
+      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+      "dev": true
     },
     "svgo": {
       "version": "0.7.2",
@@ -8993,10 +11614,71 @@
         "whet.extend": "0.9.9"
       }
     },
+    "sweetalert2": {
+      "version": "7.0.10",
+      "resolved": "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.0.10.tgz",
+      "integrity": "sha1-FcdrgPto6YfgB6WF3Th6mwVY7Bo="
+    },
     "symbol-observable": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz",
       "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+    },
+    "table": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz",
+      "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.1",
+        "ajv-keywords": "2.1.1",
+        "chalk": "2.2.2",
+        "lodash": "4.17.4",
+        "slice-ansi": "1.0.0",
+        "string-width": "2.1.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "slice-ansi": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-1.0.0.tgz",
+          "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
     },
     "tapable": {
       "version": "0.2.8",
@@ -9014,6 +11696,18 @@
         "block-stream": "0.0.9",
         "fstream": "1.0.11",
         "inherits": "2.0.3"
+      }
+    },
+    "tar-stream": {
+      "version": "1.5.5",
+      "resolved": "http://registry.npm.taobao.org/tar-stream/download/tar-stream-1.5.5.tgz",
+      "integrity": "sha1-XK2Ed59FyDsfJQjZawnYjHIYr1U=",
+      "dev": true,
+      "requires": {
+        "bl": "1.2.1",
+        "end-of-stream": "1.4.0",
+        "readable-stream": "2.3.3",
+        "xtend": "4.0.1"
       }
     },
     "through": {
@@ -9080,6 +11774,14 @@
       "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
       "dev": true
     },
+    "topojson-client": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/topojson-client/download/topojson-client-3.0.0.tgz",
+      "integrity": "sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8=",
+      "requires": {
+        "commander": "2.12.2"
+      }
+    },
     "toposort": {
       "version": "1.0.6",
       "resolved": "http://registry.npm.taobao.org/toposort/download/toposort-1.0.6.tgz",
@@ -9101,6 +11803,12 @@
       "integrity": "sha1-WEZ4Yje0I5AU8F2xVrZDIS1MbzY=",
       "dev": true
     },
+    "trim": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/trim/download/trim-0.0.1.tgz",
+      "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
+      "dev": true
+    },
     "trim-newlines": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
@@ -9111,6 +11819,18 @@
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz",
       "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "trim-trailing-lines": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/trim-trailing-lines/download/trim-trailing-lines-1.1.0.tgz",
+      "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=",
+      "dev": true
+    },
+    "trough": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/trough/download/trough-1.0.1.tgz",
+      "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=",
       "dev": true
     },
     "true-case-path": {
@@ -9241,6 +11961,15 @@
       "dev": true,
       "optional": true
     },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2"
+      }
+    },
     "type-is": {
       "version": "1.6.15",
       "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz",
@@ -9258,9 +11987,9 @@
       "dev": true
     },
     "typescript": {
-      "version": "2.4.2",
-      "resolved": "http://registry.npm.taobao.org/typescript/download/typescript-2.4.2.tgz",
-      "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=",
+      "version": "2.5.3",
+      "resolved": "http://registry.npm.taobao.org/typescript/download/typescript-2.5.3.tgz",
+      "integrity": "sha1-3z3Nw48764ANS8MiZGsEo/bKfw0=",
       "dev": true
     },
     "uglify-js": {
@@ -9328,6 +12057,41 @@
       "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
       "dev": true
     },
+    "underscore.string": {
+      "version": "3.3.4",
+      "resolved": "http://registry.npm.taobao.org/underscore.string/download/underscore.string-3.3.4.tgz",
+      "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "unherit": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/unherit/download/unherit-1.1.0.tgz",
+      "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "xtend": "4.0.1"
+      }
+    },
+    "unified": {
+      "version": "6.1.6",
+      "resolved": "http://registry.npm.taobao.org/unified/download/unified-6.1.6.tgz",
+      "integrity": "sha1-Xqf4B6CJjx+Kze7+XyX6oBDMQrE=",
+      "dev": true,
+      "requires": {
+        "bail": "1.0.2",
+        "extend": "3.0.1",
+        "is-plain-obj": "1.1.0",
+        "trough": "1.0.1",
+        "vfile": "2.3.0",
+        "x-is-function": "1.0.4",
+        "x-is-string": "0.1.0"
+      }
+    },
     "uniq": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
@@ -9365,6 +12129,54 @@
       "dev": true,
       "requires": {
         "imurmurhash": "0.1.4"
+      }
+    },
+    "unist-util-find-all-after": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/unist-util-find-all-after/download/unist-util-find-all-after-1.0.1.tgz",
+      "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=",
+      "dev": true,
+      "requires": {
+        "unist-util-is": "2.1.1"
+      }
+    },
+    "unist-util-is": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/unist-util-is/download/unist-util-is-2.1.1.tgz",
+      "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=",
+      "dev": true
+    },
+    "unist-util-modify-children": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/unist-util-modify-children/download/unist-util-modify-children-1.1.1.tgz",
+      "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=",
+      "dev": true,
+      "requires": {
+        "array-iterate": "1.1.1"
+      }
+    },
+    "unist-util-remove-position": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/unist-util-remove-position/download/unist-util-remove-position-1.1.1.tgz",
+      "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=",
+      "dev": true,
+      "requires": {
+        "unist-util-visit": "1.3.0"
+      }
+    },
+    "unist-util-stringify-position": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-1.1.1.tgz",
+      "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=",
+      "dev": true
+    },
+    "unist-util-visit": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/unist-util-visit/download/unist-util-visit-1.3.0.tgz",
+      "integrity": "sha1-Qcp8gpgf0c5sdiqsOX/CTjVxFEQ=",
+      "dev": true,
+      "requires": {
+        "unist-util-is": "2.1.1"
       }
     },
     "universalify": {
@@ -9431,6 +12243,12 @@
           "dev": true
         }
       }
+    },
+    "urlgrey": {
+      "version": "0.4.4",
+      "resolved": "http://registry.npm.taobao.org/urlgrey/download/urlgrey-0.4.4.tgz",
+      "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=",
+      "dev": true
     },
     "useragent": {
       "version": "2.2.1",
@@ -9510,6 +12328,12 @@
         "spdx-expression-parse": "1.0.4"
       }
     },
+    "vargs": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/vargs/download/vargs-0.1.0.tgz",
+      "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+      "dev": true
+    },
     "vary": {
       "version": "1.1.2",
       "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
@@ -9541,6 +12365,52 @@
         }
       }
     },
+    "vfile": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/vfile/download/vfile-2.3.0.tgz",
+      "integrity": "sha1-5i2OcrIOg8MkvGxnJ47ickiL+Eo=",
+      "dev": true,
+      "requires": {
+        "is-buffer": "1.1.6",
+        "replace-ext": "1.0.0",
+        "unist-util-stringify-position": "1.1.1",
+        "vfile-message": "1.0.0"
+      },
+      "dependencies": {
+        "replace-ext": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz",
+          "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+          "dev": true
+        }
+      }
+    },
+    "vfile-location": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/vfile-location/download/vfile-location-2.0.2.tgz",
+      "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=",
+      "dev": true
+    },
+    "vfile-message": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/vfile-message/download/vfile-message-1.0.0.tgz",
+      "integrity": "sha1-pq2wR06kAPol2Snx1nOr6moX41k=",
+      "dev": true,
+      "requires": {
+        "unist-util-stringify-position": "1.1.1"
+      }
+    },
+    "vinyl": {
+      "version": "0.5.3",
+      "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz",
+      "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+      "dev": true,
+      "requires": {
+        "clone": "1.0.3",
+        "clone-stats": "0.0.1",
+        "replace-ext": "0.0.1"
+      }
+    },
     "vlq": {
       "version": "0.2.3",
       "resolved": "http://registry.npm.taobao.org/vlq/download/vlq-0.2.3.tgz",
@@ -9562,6 +12432,12 @@
       "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
       "dev": true
     },
+    "walkdir": {
+      "version": "0.0.11",
+      "resolved": "http://registry.npm.taobao.org/walkdir/download/walkdir-0.0.11.tgz",
+      "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=",
+      "dev": true
+    },
     "watchpack": {
       "version": "1.4.0",
       "resolved": "http://registry.npm.taobao.org/watchpack/download/watchpack-1.4.0.tgz",
@@ -9581,6 +12457,133 @@
       "requires": {
         "minimalistic-assert": "1.0.0"
       }
+    },
+    "wd": {
+      "version": "1.5.0",
+      "resolved": "http://registry.npm.taobao.org/wd/download/wd-1.5.0.tgz",
+      "integrity": "sha1-RclqFv+fjA+efKkPgGqLSL0ANNY=",
+      "dev": true,
+      "requires": {
+        "archiver": "1.3.0",
+        "async": "2.0.1",
+        "lodash": "4.16.2",
+        "mkdirp": "0.5.1",
+        "q": "1.4.1",
+        "request": "2.79.0",
+        "underscore.string": "3.3.4",
+        "vargs": "0.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "async": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/async/download/async-2.0.1.tgz",
+          "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+          "dev": true,
+          "requires": {
+            "lodash": "4.16.2"
+          }
+        },
+        "caseless": {
+          "version": "0.11.0",
+          "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.11.0.tgz",
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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"
+          }
+        },
+        "har-validator": {
+          "version": "2.0.6",
+          "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-2.0.6.tgz",
+          "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "commander": "2.12.2",
+            "is-my-json-valid": "2.16.1",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "lodash": {
+          "version": "4.16.2",
+          "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.16.2.tgz",
+          "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+          "dev": true
+        },
+        "q": {
+          "version": "1.4.1",
+          "resolved": "http://registry.npm.taobao.org/q/download/q-1.4.1.tgz",
+          "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.3.2",
+          "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.3.2.tgz",
+          "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+          "dev": true
+        },
+        "request": {
+          "version": "2.79.0",
+          "resolved": "http://registry.npm.taobao.org/request/download/request-2.79.0.tgz",
+          "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+          "dev": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "caseless": "0.11.0",
+            "combined-stream": "1.0.5",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.1.4",
+            "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.17",
+            "oauth-sign": "0.8.2",
+            "qs": "6.3.2",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.3",
+            "tunnel-agent": "0.4.3",
+            "uuid": "3.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+          "dev": true
+        }
+      }
+    },
+    "weather-icons": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.taobao.org/weather-icons/download/weather-icons-1.3.2.tgz",
+      "integrity": "sha1-isAA+ShYQnJSuAzFega/qCeQCsA="
     },
     "webdriver-js-extender": {
       "version": "1.0.0",
@@ -9894,6 +12897,69 @@
         }
       }
     },
+    "webpack-bundle-analyzer": {
+      "version": "2.9.1",
+      "resolved": "http://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-2.9.1.tgz",
+      "integrity": "sha1-wsjgPo5XaO0oizmunieouNe51HY=",
+      "dev": true,
+      "requires": {
+        "acorn": "5.2.1",
+        "chalk": "1.1.3",
+        "commander": "2.12.2",
+        "ejs": "2.5.7",
+        "express": "4.16.2",
+        "filesize": "3.5.11",
+        "gzip-size": "3.0.0",
+        "lodash": "4.17.4",
+        "mkdirp": "0.5.1",
+        "opener": "1.4.3",
+        "ws": "3.3.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/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": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "ultron": {
+          "version": "1.1.1",
+          "resolved": "http://registry.npm.taobao.org/ultron/download/ultron-1.1.1.tgz",
+          "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=",
+          "dev": true
+        },
+        "ws": {
+          "version": "3.3.2",
+          "resolved": "http://registry.npm.taobao.org/ws/download/ws-3.3.2.tgz",
+          "integrity": "sha1-lsHQiz/v2h1cHjNwDTv6qb4tVgg=",
+          "dev": true,
+          "requires": {
+            "async-limiter": "1.0.0",
+            "safe-buffer": "5.1.1",
+            "ultron": "1.1.1"
+          }
+        }
+      }
+    },
     "webpack-concat-plugin": {
       "version": "1.4.2",
       "resolved": "http://registry.npm.taobao.org/webpack-concat-plugin/download/webpack-concat-plugin-1.4.2.tgz",
@@ -10162,6 +13228,11 @@
       "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
       "dev": true
     },
+    "wolfy87-eventemitter": {
+      "version": "5.2.4",
+      "resolved": "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.4.tgz",
+      "integrity": "sha1-UCHSlS02EcvNGVFJcR2bWVzRHUg="
+    },
     "wordwrap": {
       "version": "0.0.2",
       "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz",
@@ -10194,6 +13265,15 @@
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
       "dev": true
     },
+    "write": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz",
+      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+      "dev": true,
+      "requires": {
+        "mkdirp": "0.5.1"
+      }
+    },
     "ws": {
       "version": "1.1.2",
       "resolved": "http://registry.npm.taobao.org/ws/download/ws-1.1.2.tgz",
@@ -10208,6 +13288,18 @@
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/wtf-8/download/wtf-8-1.0.0.tgz",
       "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=",
+      "dev": true
+    },
+    "x-is-function": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/x-is-function/download/x-is-function-1.0.4.tgz",
+      "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=",
+      "dev": true
+    },
+    "x-is-string": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz",
+      "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
       "dev": true
     },
     "xml-char-classes": {
@@ -10327,6 +13419,18 @@
       "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
       "dev": true
     },
+    "zip-stream": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/zip-stream/download/zip-stream-1.2.0.tgz",
+      "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+      "dev": true,
+      "requires": {
+        "archiver-utils": "1.3.0",
+        "compress-commons": "1.2.2",
+        "lodash": "4.17.4",
+        "readable-stream": "2.3.3"
+      }
+    },
     "zone.js": {
       "version": "0.8.18",
       "resolved": "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.18.tgz",
diff --git a/package.json b/package.json
index 6c7333a..bc25aac 100644
--- a/package.json
+++ b/package.json
@@ -21,29 +21,70 @@
     "@angular/platform-browser": "^5.0.0",
     "@angular/platform-browser-dynamic": "^5.0.0",
     "@angular/router": "^5.0.0",
-    "core-js": "^2.4.1",
-    "rxjs": "^5.5.2",
-    "zone.js": "^0.8.14"
+    "@antv/data-set": "^0.7.0",
+    "@antv/g2": "^3.0.1",
+    "@antv/g2-plugin-slider": "^2.0.0",
+    "@delon/abc": "^0.3.0-rc.1",
+    "@delon/acl": "^0.3.0-rc.1",
+    "@delon/theme": "^0.3.0-rc.1",
+    "@delon/auth": "^0.3.0-rc.1",
+    "@ngx-translate/core": "^9.0.0",
+    "@ngx-translate/http-loader": "^2.0.0",
+    "angular-baidu-maps": "^1.0.1",
+    "angular-qq-maps": "^1.0.1",
+    "angular-tree-component": "^6.1.0",
+    "core-js": "^2.5.1",
+    "file-saver": "^1.3.3",
+    "font-awesome": "^4.7.0",
+    "moment": "^2.19.3",
+    "ng-tree-antd": "^2.0.0",
+    "ng-zorro-antd": "^0.6.5",
+    "ng-zorro-antd-extra": "^1.1.3",
+    "ng2-dnd": "^5.0.0",
+    "ng2-file-upload": "^1.2.1",
+    "ng2-img-cropper": "^0.9.0",
+    "ngx-color-picker": "^5.0.0",
+    "ngx-countdown": "^2.0.0",
+    "rxjs": "^5.5.5",
+    "screenfull": "^3.3.1",
+    "simple-line-icons": "^2.4.1",
+    "sweetalert2": "^7.0.0",
+    "weather-icons": "^1.3.2",
+    "zone.js": "^0.8.18"
   },
   "devDependencies": {
-    "@angular/cli": "1.6.0",
+    "@angular/cli": "^1.5.2",
     "@angular/compiler-cli": "^5.0.0",
     "@angular/language-service": "^5.0.0",
-    "@types/jasmine": "~2.5.53",
-    "@types/jasminewd2": "~2.0.2",
+    "@angularclass/hmr": "^2.1.3",
+    "@angularclass/hmr-loader": "^3.0.4",
+    "@types/jasmine": "~2.6.0",
+    "@types/jasminewd2": "~2.0.3",
     "@types/node": "~6.0.60",
-    "codelyzer": "^4.0.1",
-    "jasmine-core": "~2.6.2",
-    "jasmine-spec-reporter": "~4.1.0",
-    "karma": "~1.7.0",
-    "karma-chrome-launcher": "~2.1.1",
+    "codecov": "^3.0.0",
+    "codelyzer": "~4.0.1",
+    "jasmine-core": "~2.8.0",
+    "jasmine-spec-reporter": "~4.2.1",
+    "karma": "~1.7.1",
+    "karma-chrome-launcher": "~2.2.0",
     "karma-cli": "~1.0.1",
-    "karma-coverage-istanbul-reporter": "^1.2.1",
+    "karma-coverage-istanbul-reporter": "^1.3.0",
     "karma-jasmine": "~1.1.0",
     "karma-jasmine-html-reporter": "^0.2.2",
+    "karma-remap-istanbul": "^0.6.0",
+    "karma-sauce-launcher": "^1.2.0",
+    "lint-staged": "^5.0.0",
+    "npm-run-all": "^4.1.1",
     "protractor": "~5.1.2",
+    "stylelint": "^8.2.0",
+    "stylelint-config-standard": "^17.0.0",
     "ts-node": "~3.2.0",
     "tslint": "~5.7.0",
-    "typescript": "~2.4.2"
+    "typescript": "~2.5.0",
+    "webpack-bundle-analyzer": "^2.9.0"
+  },
+  "lint-staged": {
+    "src/**/*.ts": "lint:ts",
+    "src/**/*.less": "lint:style"
   }
 }
diff --git a/src/app/app.component.css b/src/app/app.component.css
deleted file mode 100644
index e69de29..0000000
--- a/src/app/app.component.css
+++ /dev/null
diff --git a/src/app/app.component.html b/src/app/app.component.html
deleted file mode 100644
index fa2706a..0000000
--- a/src/app/app.component.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--The content below is only a placeholder and can be replaced.-->
-<div style="text-align:center">
-  <h1>
-    Welcome to {{ title }}!
-  </h1>
-  <img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
-</div>
-<h2>Here are some links to help you start: </h2>
-<ul>
-  <li>
-    <h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
-  </li>
-  <li>
-    <h2><a target="_blank" rel="noopener" href="https://github.com/angular/angular-cli/wiki">CLI Documentation</a></h2>
-  </li>
-  <li>
-    <h2><a target="_blank" rel="noopener" href="https://blog.angular.io/">Angular blog</a></h2>
-  </li>
-</ul>
-
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index bcbdf36..213e0e0 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -1,27 +1,22 @@
-import { TestBed, async } from '@angular/core/testing';
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+import { setUpTestBed } from '../testing/common.spec';
+
 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!');
-  }));
+import { APP_BASE_HREF } from '@angular/common';
+import { ThemesService, TitleService } from '@delon/theme';
+
+describe('Component: App', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [ AppComponent ],
+        providers: [
+            ThemesService, TitleService,
+            { provide: APP_BASE_HREF, useValue: '/' }
+        ]
+    });
+
+    it('should create the app', () => {
+        const fixture = TestBed.createComponent(AppComponent);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
 });
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 7b0f672..c1ba478 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,10 +1,32 @@
-import { Component } from '@angular/core';
+import { Component, HostBinding, OnInit } from '@angular/core';
+import { Router, NavigationEnd } from '@angular/router';
+import { ThemesService, SettingsService, TitleService } from '@delon/theme';
+import { filter, map } from 'rxjs/operators';
 
 @Component({
   selector: 'app-root',
-  templateUrl: './app.component.html',
-  styleUrls: ['./app.component.css']
+  template: `<router-outlet></router-outlet>`
 })
-export class AppComponent {
-  title = 'app';
+export class AppComponent implements OnInit {
+
+  @HostBinding('class.layout-fixed') get isFixed() { return this.settings.layout.fixed; }
+  @HostBinding('class.layout-boxed') get isBoxed() { return this.settings.layout.boxed; }
+  @HostBinding('class.aside-collapsed') get isCollapsed() { return this.settings.layout.collapsed; }
+
+  constructor(
+    private theme: ThemesService,
+    private settings: SettingsService,
+    private router: Router,
+    private titleSrv: TitleService) {
+  }
+
+  ngOnInit() {
+    this.router.events.pipe(
+            filter(evt => evt instanceof NavigationEnd),
+            map(() => this.router.url)
+        )
+        .subscribe(url => {
+            this.titleSrv.setTitleByUrl(url);
+        });
+  }
 }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 926975a..84691c5 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,18 +1,73 @@
 import { BrowserModule } from '@angular/platform-browser';
-import { NgModule } from '@angular/core';
+import { NgModule, LOCALE_ID, APP_INITIALIZER, Injector } from '@angular/core';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-translate/core';
+import { TranslateHttpLoader } from '@ngx-translate/http-loader';
+import { HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
 
-
+import { CoreModule } from './core/core.module';
+import { SharedModule } from './shared/shared.module';
 import { AppComponent } from './app.component';
+import { RoutesModule } from './routes/routes.module';
+import { LayoutModule } from './layout/layout.module';
+import { StartupService } from './core/services/startup.service';
+import { DefaultInterceptor } from '@core/net/default.interceptor';
+import { AlainAuthModule, SimpleInterceptor } from '@delon/auth';
 
+// i18n
+import { I18NService } from './core/i18n/i18n.service';
+import { ALAIN_I18N_TOKEN } from '@delon/theme';
+
+import { registerLocaleData } from '@angular/common';
+import localeZhHans from '@angular/common/locales/zh-Hans';
+registerLocaleData(localeZhHans);
+
+// AoT requires an exported function for factories
+export function HttpLoaderFactory(http: HttpClient) {
+    return new TranslateHttpLoader(http, `assets/i18n/`, '.json');
+}
+
+export function StartupServiceFactory(startupService: StartupService): Function {
+    return () => startupService.load();
+}
 
 @NgModule({
-  declarations: [
-    AppComponent
-  ],
-  imports: [
-    BrowserModule
-  ],
-  providers: [],
-  bootstrap: [AppComponent]
+    declarations: [
+        AppComponent
+    ],
+    imports: [
+        BrowserModule,
+        BrowserAnimationsModule,
+        SharedModule.forRoot(),
+        CoreModule,
+        LayoutModule,
+        RoutesModule,
+        // auth
+        AlainAuthModule.forRoot({
+            login_url: `/pro/user/login`
+        }),
+        // i18n
+        TranslateModule.forRoot({
+            loader: {
+                provide: TranslateLoader,
+                useFactory: HttpLoaderFactory,
+                deps: [HttpClient]
+            }
+        })
+    ],
+    providers: [
+        { provide: LOCALE_ID, useValue: 'zh-Hans' },
+        { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true},
+        { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true},
+        { provide: ALAIN_I18N_TOKEN, useClass: I18NService, multi: false },
+        StartupService,
+        {
+            provide: APP_INITIALIZER,
+            useFactory: StartupServiceFactory,
+            deps: [StartupService],
+            multi: true
+        }
+    ],
+    bootstrap: [AppComponent]
 })
 export class AppModule { }
diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts
new file mode 100644
index 0000000..80ceb6c
--- /dev/null
+++ b/src/app/core/core.module.ts
@@ -0,0 +1,19 @@
+import { NgModule, Optional, SkipSelf } from '@angular/core';
+import { throwIfAlreadyLoaded } from './module-import-guard';
+import { AlainThemeModule } from '@delon/theme';
+
+import { I18NService } from './i18n/i18n.service';
+
+@NgModule({
+    imports: [
+       AlainThemeModule.forRoot()
+    ],
+    providers: [
+        I18NService
+    ]
+})
+export class CoreModule {
+  constructor( @Optional() @SkipSelf() parentModule: CoreModule) {
+    throwIfAlreadyLoaded(parentModule, 'CoreModule');
+  }
+}
diff --git a/src/app/core/i18n/i18n.service.spec.ts b/src/app/core/i18n/i18n.service.spec.ts
new file mode 100644
index 0000000..926da94
--- /dev/null
+++ b/src/app/core/i18n/i18n.service.spec.ts
@@ -0,0 +1,31 @@
+import { SharedModule } from '@shared/shared.module';
+import { TestBed, async, inject } from '@angular/core/testing';
+import { TranslateService, TranslateModule, TranslateLoader } from '@ngx-translate/core';
+import { HttpClient, HttpClientModule } from '@angular/common/http';
+
+import { I18NService } from './i18n.service';
+import { HttpLoaderFactory } from '../../app.module';
+import { SettingsService } from '@delon/theme';
+
+describe('Service: I18n', () => {
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                HttpClientModule,
+                SharedModule.forRoot(),
+                TranslateModule.forRoot({
+                    loader: {
+                        provide: TranslateLoader,
+                        useFactory: (HttpLoaderFactory),
+                        deps: [HttpClient]
+                    }
+                })
+            ],
+            providers: [I18NService, SettingsService]
+        });
+    });
+
+    it('should create an instance', inject([I18NService], (service: I18NService) => {
+        expect(service).toBeTruthy();
+    }));
+});
diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts
new file mode 100644
index 0000000..e046d53
--- /dev/null
+++ b/src/app/core/i18n/i18n.service.ts
@@ -0,0 +1,47 @@
+import { Injectable, Inject, Injector } from '@angular/core';
+import { Router } from '@angular/router';
+import { zhCN, enUS, NzLocaleService } from 'ng-zorro-antd';
+import { TranslateService } from '@ngx-translate/core';
+import { SettingsService, AlainI18NService } from '@delon/theme';
+import { Observable } from 'rxjs/Observable';
+
+@Injectable()
+export class I18NService implements AlainI18NService {
+
+    private _default = 'en';
+
+    private _langs = [
+        { code: 'en', text: 'English' },
+        { code: 'zh-CN', text: '������' }
+    ];
+
+    constructor(settings: SettingsService,
+        private nzLocalService: NzLocaleService,
+        private translate: TranslateService,
+        private injector: Injector) {
+        this._default = settings.layout.lang || translate.getBrowserLang();
+        const lans = this._langs.map(item => item.code);
+        if (!lans.includes(this._default)) {
+            this._default = lans[0];
+        }
+        translate.addLangs(lans);
+        translate.setDefaultLang(this._default);
+    }
+
+    use(lang: string = null, firstLoad = true): Observable<any> {
+        lang = lang || this.translate.getDefaultLang();
+        this.nzLocalService.setLocale(lang === 'en' ? enUS : zhCN);
+        // need reload router because of ng-zorro-antd local system
+        if (!firstLoad) this.injector.get(Router).navigate([ '/' ]);
+        return this.translate.use(lang);
+    }
+
+    getLangs() {
+        return this._langs;
+    }
+
+    fanyi(key: string) {
+        return this.translate.instant(key);
+    }
+
+}
diff --git a/src/app/core/module-import-guard.ts b/src/app/core/module-import-guard.ts
new file mode 100644
index 0000000..62acb0c
--- /dev/null
+++ b/src/app/core/module-import-guard.ts
@@ -0,0 +1,6 @@
+// https://angular.io/guide/styleguide#style-04-12
+export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) {
+  if (parentModule) {
+    throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`);
+  }
+}
diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts
new file mode 100644
index 0000000..646fd59
--- /dev/null
+++ b/src/app/core/net/default.interceptor.ts
@@ -0,0 +1,70 @@
+import { Injectable, Injector } from '@angular/core';
+import { Router } from '@angular/router';
+import { HttpInterceptor, HttpRequest, HttpHandler,
+         HttpSentEvent, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpUserEvent,
+       } from '@angular/common/http';
+import { Observable } from 'rxjs/Observable';
+import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
+import { catchError } from 'rxjs/operators';
+import { map, mergeMap } from 'rxjs/operators';
+
+import { environment } from '../../../environments/environment';
+
+/**
+ * ������HTTP������������������������������ `app.module.ts`
+ */
+@Injectable()
+export class DefaultInterceptor implements HttpInterceptor {
+    constructor(private injector: Injector) {}
+
+    private goLogin() {
+        const router = this.injector.get(Router);
+        this.injector.get(Router).navigate([ '/login' ]);
+    }
+
+    intercept(req: HttpRequest<any>, next: HttpHandler):
+        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
+
+        // TIPS������TOKEN��������������� `@delon/auth` ������
+        // Document: http://ng-alain.com/docs/auth
+
+        // ���������������������������
+        let url = req.url;
+        if (!url.startsWith('https://') && !url.startsWith('http://')) {
+            url = environment.SERVER_URL + url;
+        }
+
+        const newReq = req.clone({
+            url: url
+        });
+
+        return next.handle(newReq).pipe(
+                    mergeMap((event: any) => {
+                        // ������������������������������������������������������������������������������������������������HTTP������������������200������������������
+                        if (event instanceof HttpResponse && event.status !== 200) {
+                            // ���������������observer.error ��������������������� `catch`
+                            // return ErrorObservable.create(event);
+                        }
+                        // ������������������������������������
+                        return Observable.create(observer => observer.next(event));
+                    }),
+                    catchError((res: HttpResponse<any>) => {
+                        // ���������������������������������
+                        switch (res.status) {
+                            case 401: // ������������������
+                                this.goLogin();
+                                break;
+                            case 200:
+                                // ������������������������
+                                console.log('������������');
+                                break;
+                            case 404:
+                                // 404
+                                break;
+                        }
+                        // ������������������������������������
+                        return ErrorObservable.create(event);
+                    })
+                );
+    }
+}
diff --git a/src/app/core/services/startup.service.ts b/src/app/core/services/startup.service.ts
new file mode 100644
index 0000000..f5e4bb7
--- /dev/null
+++ b/src/app/core/services/startup.service.ts
@@ -0,0 +1,48 @@
+import { Router } from '@angular/router';
+import { Injectable, Injector } from '@angular/core';
+import { HttpClient, HttpErrorResponse } from '@angular/common/http';
+import { MenuService, SettingsService, TitleService } from '@delon/theme';
+import { ACLService } from '@delon/acl';
+import { I18NService } from '../i18n/i18n.service';
+
+/**
+ * ���������������������
+ * ���������������������������������������������������
+ */
+@Injectable()
+export class StartupService {
+    constructor(
+        private menuService: MenuService,
+        private i18n: I18NService,
+        private settingService: SettingsService,
+        private aclService: ACLService,
+        private titleService: TitleService,
+        private httpClient: HttpClient,
+        private injector: Injector) { }
+
+    load(): Promise<any> {
+        // only works with promises
+        // https://github.com/angular/angular/issues/15088
+        return new Promise((resolve, reject) => {
+            this.httpClient.get('assets/app-data.json')
+                           .subscribe((res: any) => {
+                               // ������������������������������������������������
+                                this.settingService.setApp(res.app);
+                                // ���������������������������������������������������
+                                this.settingService.setUser(res.user);
+                                // ACL������������������������
+                                this.aclService.setFull(true);
+                                // ���������������
+                                this.menuService.add(res.menu);
+                                // i18n���������������������
+                                this.i18n.use(this.settingService.layout.lang);
+                                // ���������������������������
+                                this.titleService.suffix = res.app.name;
+
+                                resolve(res);
+                            }, (err: HttpErrorResponse) => {
+                                resolve(null);
+                            });
+        });
+    }
+}
diff --git a/src/app/layout/fullscreen/fullscreen.component.html b/src/app/layout/fullscreen/fullscreen.component.html
new file mode 100644
index 0000000..0680b43
--- /dev/null
+++ b/src/app/layout/fullscreen/fullscreen.component.html
@@ -0,0 +1 @@
+<router-outlet></router-outlet>
diff --git a/src/app/layout/fullscreen/fullscreen.component.ts b/src/app/layout/fullscreen/fullscreen.component.ts
new file mode 100644
index 0000000..bae241a
--- /dev/null
+++ b/src/app/layout/fullscreen/fullscreen.component.ts
@@ -0,0 +1,9 @@
+import { Component } from '@angular/core';
+
+@Component({
+    selector: 'app-layout-fullscreen',
+    templateUrl: './fullscreen.component.html'
+})
+export class LayoutFullScreenComponent {
+
+}
diff --git a/src/app/layout/header/components/fullscreen.component.ts b/src/app/layout/header/components/fullscreen.component.ts
new file mode 100644
index 0000000..4a0d8c4
--- /dev/null
+++ b/src/app/layout/header/components/fullscreen.component.ts
@@ -0,0 +1,22 @@
+import { Component, HostListener } from '@angular/core';
+import * as screenfull from 'screenfull';
+
+@Component({
+    selector: 'header-fullscreen',
+    template: `
+    <i class="anticon anticon-{{status ? 'shrink' : 'arrows-alt'}}"></i>
+    {{status ? 'fullscreen-exit' : 'fullscreen' | translate }}
+    `
+})
+export class HeaderFullScreenComponent {
+
+    status = false;
+
+    @HostListener('click')
+    _click() {
+        if (screenfull.enabled) {
+            screenfull.toggle();
+        }
+        this.status = !screenfull.isFullscreen;
+    }
+}
diff --git a/src/app/layout/header/components/icon.component.ts b/src/app/layout/header/components/icon.component.ts
new file mode 100644
index 0000000..e56b58a
--- /dev/null
+++ b/src/app/layout/header/components/icon.component.ts
@@ -0,0 +1,59 @@
+import { Component } from '@angular/core';
+
+@Component({
+    selector: 'header-icon',
+    template: `
+    <nz-dropdown nzTrigger="click" nzPlacement="bottomRight" (nzVisibleChange)="change()">
+        <div class="item" nz-dropdown>
+            <i class="anticon anticon-appstore-o"></i>
+        </div>
+        <div nz-menu class="wd-xl animated jello">
+            <nz-spin [nzSpinning]="loading" [nzTip]="'������������������...'">
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="app-icons">
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-calendar bg-error text-white"></i>
+                        <small>Calendar</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-file bg-teal text-white"></i>
+                        <small>Files</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-cloud bg-success text-white"></i>
+                        <small>Cloud</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-star-o bg-pink text-white"></i>
+                        <small>Star</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-team bg-purple text-white"></i>
+                        <small>Team</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-scan bg-warning text-white"></i>
+                        <small>QR</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-pay-circle-o bg-cyan text-white"></i>
+                        <small>Pay</small>
+                    </div>
+                    <div nz-col [nzSpan]="6">
+                        <i class="anticon anticon-printer bg-grey text-white"></i>
+                        <small>Print</small>
+                    </div>
+                </div>
+            </nz-spin>
+        </div>
+    </nz-dropdown>
+    `
+})
+export class HeaderIconComponent {
+
+    loading = true;
+
+    change() {
+        setTimeout(() => this.loading = false, 500);
+    }
+
+}
diff --git a/src/app/layout/header/components/langs.component.ts b/src/app/layout/header/components/langs.component.ts
new file mode 100644
index 0000000..59cd4a4
--- /dev/null
+++ b/src/app/layout/header/components/langs.component.ts
@@ -0,0 +1,40 @@
+import { Component } from '@angular/core';
+import { SettingsService, MenuService } from '@delon/theme';
+import { I18NService } from '@core/i18n/i18n.service';
+
+@Component({
+    selector: 'header-langs',
+    template: `
+    <nz-dropdown>
+        <div nz-dropdown>
+            <i class="anticon anticon-edit"></i>
+            {{ 'language' | translate}}
+            <i class="anticon anticon-down"></i>
+        </div>
+        <ul nz-menu>
+            <li nz-menu-item *ngFor="let item of langs"
+            [nzSelected]="item.code === settings.layout.lang"
+                (click)="change(item.code)">{{item.text}}</li>
+        </ul>
+    </nz-dropdown>
+    `
+})
+export class HeaderLangsComponent {
+
+    langs: any[];
+
+    constructor(
+        private menuService: MenuService,
+        public settings: SettingsService,
+        public tsServ: I18NService
+    ) {
+        this.langs = this.tsServ.getLangs();
+    }
+
+    change(lang: string) {
+        this.tsServ.use(lang, false).subscribe(() => {
+            this.menuService.resume();
+        });
+        this.settings.setLayout('lang', lang);
+    }
+}
diff --git a/src/app/layout/header/components/notify.component.ts b/src/app/layout/header/components/notify.component.ts
new file mode 100644
index 0000000..54cec04
--- /dev/null
+++ b/src/app/layout/header/components/notify.component.ts
@@ -0,0 +1,163 @@
+import { NzMessageService } from 'ng-zorro-antd';
+import { Component, OnInit, Input } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { ArrayObservable } from 'rxjs/observable/ArrayObservable';
+import { map, groupBy, concatMap, mergeMap, flatMap, delay, tap, toArray } from 'rxjs/operators';
+import * as moment from 'moment';
+import { NoticeItem } from '@delon/abc';
+import { SettingsService } from '@delon/theme';
+
+/**
+ * ������������
+ */
+@Component({
+    selector: 'header-notify',
+    template: `
+    <notice-icon
+        [data]="data"
+        [count]="count"
+        [loading]="loading"
+        (select)="select($event)"
+        (clear)="clear($event)"
+        (popupVisibleChange)="loadData($event)"></notice-icon>
+    `
+})
+export class HeaderNotifyComponent implements OnInit {
+
+    data: NoticeItem[] = [
+        { title: '������', list: [], emptyText: '������������������������', emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg' },
+        { title: '������', list: [], emptyText: '������������������������', emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg' },
+        { title: '������', list: [], emptyText: '������������������������', emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/HsIsxMZiWKrNUavQUXqx.svg' }
+    ];
+    count = 0;
+    loading = false;
+
+    constructor(private msg: NzMessageService, private settings: SettingsService) {}
+
+    ngOnInit() {
+        // mock data
+        this.count = this.settings.user.notifyCount || 12;
+    }
+
+    private parseGroup(data: Observable<any[]>) {
+        console.log('parseGroup');
+        data.pipe(
+                concatMap((i: any) => i),
+                map((i: any) => {
+                    if (i.datetime) i.datetime = moment(i.datetime).fromNow();
+                    // change to color
+                    if (i.status) {
+                        i.color = ({
+                            todo: '',
+                            processing: 'blue',
+                            urgent: 'red',
+                            doing: 'gold',
+                        })[i.status];
+                    }
+                    return i;
+                }),
+                groupBy((x: any) => x.type),
+                mergeMap(g => g.pipe(toArray())),
+                tap((ls: any) => {
+                    this.data.find(w => w.title === ls[0].type).list = ls;
+                })
+            ).subscribe(res => this.loading = false);
+    }
+
+    loadData(res) {
+        if (!res || this.loading) return;
+        this.loading = true;
+        // region: mock http request
+        this.parseGroup(ArrayObservable.of([{
+            id: '000000001',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
+            title: '������������ 14 ������������',
+            datetime: '2017-08-09',
+            type: '������',
+          }, {
+            id: '000000002',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
+            title: '������������ ��������� ������������������������',
+            datetime: '2017-08-08',
+            type: '������',
+          }, {
+            id: '000000003',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
+            title: '������������������������������������������',
+            datetime: '2017-08-07',
+            read: true,
+            type: '������',
+          }, {
+            id: '000000004',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
+            title: '���������������������������������������',
+            datetime: '2017-08-07',
+            type: '������',
+          }, {
+            id: '000000005',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
+            title: '���������������������������������������������������',
+            datetime: '2017-08-07',
+            type: '������',
+          }, {
+            id: '000000006',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
+            title: '��������� ������������',
+            description: '������������������������������������',
+            datetime: '2017-08-07',
+            type: '������',
+          }, {
+            id: '000000007',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
+            title: '��������� ������������',
+            description: '������������������������������������������������������������������������������',
+            datetime: '2017-08-07',
+            type: '������',
+          }, {
+            id: '000000008',
+            avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
+            title: '������',
+            description: '������������������������������������������������������������������������������',
+            datetime: '2017-08-07',
+            type: '������',
+          }, {
+            id: '000000009',
+            title: '������������',
+            description: '��������������� 2017-01-12 20:00 ���������',
+            extra: '���������',
+            status: 'todo',
+            type: '������',
+          }, {
+            id: '000000010',
+            title: '���������������������������',
+            description: '��������������� 2017-01-06��������� 2017-01-07 ���������������������������',
+            extra: '������������',
+            status: 'urgent',
+            type: '������',
+          }, {
+            id: '000000011',
+            title: '������������������',
+            description: '��������������� 2017-01-09 ������������������������',
+            extra: '��������� 8 ���',
+            status: 'doing',
+            type: '������',
+          }, {
+            id: '000000012',
+            title: 'ABCD ������������',
+            description: '��������������� 2017-01-06��������� 2017-01-07 ���������������������������',
+            extra: '���������',
+            status: 'processing',
+            type: '������',
+          }
+        ]).pipe(delay(1000)));
+        // endregion
+    }
+
+    clear(type: string) {
+        this.msg.success(`��������� ${type}`);
+    }
+
+    select(res: any) {
+        this.msg.success(`��������� ${res.title} ��� ${res.item.title}`);
+    }
+}
diff --git a/src/app/layout/header/components/search.component.ts b/src/app/layout/header/components/search.component.ts
new file mode 100644
index 0000000..179bb6c
--- /dev/null
+++ b/src/app/layout/header/components/search.component.ts
@@ -0,0 +1,49 @@
+import { Component, HostBinding, ViewChild, Input, OnInit, ElementRef, AfterViewInit } from '@angular/core';
+
+@Component({
+    selector: 'header-search',
+    template: `
+    <nz-input nzPlaceHolder='{{ "top-search-ph" | translate}}' [(ngModel)]="q"
+        (nzFocus)="qFocus()" (nzBlur)="qBlur()">
+        <ng-template #prefix>
+            <i class="anticon anticon-search"></i>
+        </ng-template>
+    </nz-input>
+    `
+})
+export class HeaderSearchComponent implements AfterViewInit {
+
+    q: string;
+
+    qIpt: HTMLInputElement;
+
+    @HostBinding('class.header-search__focus')
+    focus = false;
+
+    @HostBinding('class.header-search__toggled')
+    searchToggled = false;
+
+    @Input()
+    set toggleChange(value: boolean) {
+        if (typeof value === 'undefined') return;
+        console.log('toggleChange', value);
+        this.searchToggled = true;
+        this.focus = true;
+        setTimeout(() => this.qIpt.focus(), 300);
+    }
+
+    constructor(private el: ElementRef) {}
+
+    ngAfterViewInit() {
+        this.qIpt = (this.el.nativeElement as HTMLElement).querySelector('.ant-input') as HTMLInputElement;
+    }
+
+    qFocus() {
+        this.focus = true;
+    }
+
+    qBlur() {
+        this.focus = false;
+        this.searchToggled = false;
+    }
+}
diff --git a/src/app/layout/header/components/storage.component.ts b/src/app/layout/header/components/storage.component.ts
new file mode 100644
index 0000000..26dfc8f
--- /dev/null
+++ b/src/app/layout/header/components/storage.component.ts
@@ -0,0 +1,28 @@
+import { Component, HostListener } from '@angular/core';
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+
+@Component({
+    selector: 'header-storage',
+    template: `
+    <i class="anticon anticon-tool"></i>
+    {{ 'clear-local-storage' | translate}}`
+})
+export class HeaderStorageComponent {
+
+    constructor(
+        private confirmServ: NzModalService,
+        private messageServ: NzMessageService
+    ) {
+    }
+
+    @HostListener('click')
+    _click() {
+        this.confirmServ.confirm({
+            title: 'Make sure clear all local storage?',
+            onOk: () => {
+                localStorage.clear();
+                this.messageServ.success('Clear Finished!');
+            }
+        });
+    }
+}
diff --git a/src/app/layout/header/components/task.component.ts b/src/app/layout/header/components/task.component.ts
new file mode 100644
index 0000000..507c0ff
--- /dev/null
+++ b/src/app/layout/header/components/task.component.ts
@@ -0,0 +1,80 @@
+import { Component } from '@angular/core';
+
+@Component({
+    selector: 'header-task',
+    template: `
+    <nz-dropdown nzTrigger="click" nzPlacement="bottomRight" (nzVisibleChange)="change()">
+        <div class="item" nz-dropdown>
+            <nz-badge [nzDot]="true">
+                <ng-template #content>
+                    <i class="anticon anticon-bell"></i>
+                </ng-template>
+            </nz-badge>
+        </div>
+        <div nz-menu class="wd-lg">
+            <nz-card nzTitle="Notifications" [nzLoading]="loading" class="ant-card__body-nopadding">
+                <ng-template #extra><i class="anticon anticon-plus"></i></ng-template>
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point">
+                    <div nz-col [nzSpan]="4" class="text-center">
+                        <nz-avatar [nzSrc]="'./assets/img/1.png'" [nzSize]="'large'"></nz-avatar>
+                    </div>
+                    <div nz-col [nzSpan]="20">
+                        <strong>cipchk</strong>
+                        <p>Please tell me what happened in a few words, don't go into details.</p>
+                    </div>
+                </div>
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point">
+                    <div nz-col [nzSpan]="4" class="text-center">
+                        <nz-avatar [nzSrc]="'./assets/img/2.png'" [nzSize]="'large'"></nz-avatar>
+                    </div>
+                    <div nz-col [nzSpan]="20">
+                        <strong>������������</strong>
+                        <p>��������������������������������������� </p>
+                    </div>
+                </div>
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point">
+                    <div nz-col [nzSpan]="4" class="text-center">
+                        <nz-avatar [nzSrc]="'./assets/img/3.png'" [nzSize]="'large'"></nz-avatar>
+                    </div>
+                    <div nz-col [nzSpan]="20">
+                        <strong>���������</strong>
+                        <p>������������������������������������������</p>
+                    </div>
+                </div>
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point">
+                    <div nz-col [nzSpan]="4" class="text-center">
+                        <nz-avatar [nzSrc]="'./assets/img/4.png'" [nzSize]="'large'"></nz-avatar>
+                    </div>
+                    <div nz-col [nzSpan]="20">
+                        <strong>Kent</strong>
+                        <p>Please tell me what happened in a few words, don't go into details.</p>
+                    </div>
+                </div>
+                <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point">
+                    <div nz-col [nzSpan]="4" class="text-center">
+                        <nz-avatar [nzSrc]="'./assets/img/5.png'" [nzSize]="'large'"></nz-avatar>
+                    </div>
+                    <div nz-col [nzSpan]="20">
+                        <strong>Jefferson</strong>
+                        <p>Please tell me what happened in a few words, don't go into details.</p>
+                    </div>
+                </div>
+                <div nz-row class="pt-lg pb-lg">
+                    <div nz-col [nzSpan]="24" class="text-center text-grey point">
+                        See All
+                    </div>
+                </div>
+            </nz-card>
+        </div>
+    </nz-dropdown>
+    `
+})
+export class HeaderTaskComponent {
+
+    loading = true;
+
+    change() {
+        setTimeout(() => this.loading = false, 500);
+    }
+
+}
diff --git a/src/app/layout/header/components/theme.component.ts b/src/app/layout/header/components/theme.component.ts
new file mode 100644
index 0000000..e11833f
--- /dev/null
+++ b/src/app/layout/header/components/theme.component.ts
@@ -0,0 +1,44 @@
+import { Component } from '@angular/core';
+import { SettingsService, ThemesService, ThemeType } from '@delon/theme';
+
+@Component({
+    selector: 'header-theme',
+    template: `
+    <strong>{{ 'theme-switch' | translate}}</strong>
+    <div class="theme-icons">
+        <label *ngFor="let item of themes" (click)="changeTheme(item.l)" [style.background]="item.bg">
+            <i class="anticon anticon-check" *ngIf="item.l == settings.layout.theme"></i>
+            <div class="areas">
+                <span class="nav" [style.background]="item.nav"></span>
+                <span class="con" [style.background]="item.con"></span>
+            </div>
+        </label>
+    </div>
+    `
+})
+export class HeaderThemeComponent {
+
+    themes: { l: ThemeType, bg: string, nav: string, con: string }[] = [
+        { l: 'A', bg: '#108ee9', nav: '#fff', con: '#f5f7fa' },
+        { l: 'B', bg: '#00a2ae', nav: '#fff', con: '#f5f7fa' },
+        { l: 'C', bg: '#00a854', nav: '#fff', con: '#f5f7fa' },
+        { l: 'D', bg: '#f04134', nav: '#fff', con: '#f5f7fa' },
+        { l: 'E', bg: '#373d41', nav: '#fff', con: '#f5f7fa' },
+        { l: 'F', bg: '#108ee9', nav: '#404040', con: '#f5f7fa' },
+        { l: 'G', bg: '#00a2ae', nav: '#404040', con: '#f5f7fa' },
+        { l: 'H', bg: '#00a854', nav: '#404040', con: '#f5f7fa' },
+        { l: 'I', bg: '#f04134', nav: '#404040', con: '#f5f7fa' },
+        { l: 'J', bg: '#373d41', nav: '#404040', con: '#f5f7fa' }
+    ];
+
+    constructor(
+        public settings: SettingsService,
+        private themeServ: ThemesService
+    ) {
+    }
+
+    changeTheme(theme: ThemeType) {
+        this.themeServ.setTheme(theme);
+        this.settings.setLayout('theme', theme);
+    }
+}
diff --git a/src/app/layout/header/components/user.component.ts b/src/app/layout/header/components/user.component.ts
new file mode 100644
index 0000000..f8a2271
--- /dev/null
+++ b/src/app/layout/header/components/user.component.ts
@@ -0,0 +1,46 @@
+import { Component, OnInit, Inject } from '@angular/core';
+import { Router } from '@angular/router';
+import { SettingsService } from '@delon/theme';
+import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
+
+@Component({
+    selector: 'header-user',
+    template: `
+    <nz-dropdown nzPlacement="bottomRight">
+        <div class="item d-flex align-items-center px-sm" nz-dropdown>
+            <nz-avatar [nzSrc]="settings.user.avatar" nzSize="small" class="mr-sm"></nz-avatar>
+            {{settings.user.name}}
+        </div>
+        <div nz-menu class="width-sm">
+            <div nz-menu-item [nzDisable]="true"><i class="anticon anticon-user mr-sm"></i>������������</div>
+            <div nz-menu-item [nzDisable]="true"><i class="anticon anticon-setting mr-sm"></i>������</div>
+            <li nz-menu-divider></li>
+            <div nz-menu-item (click)="logout()"><i class="anticon anticon-setting mr-sm"></i>������������</div>
+        </div>
+    </nz-dropdown>
+    `
+})
+export class HeaderUserComponent implements OnInit {
+    constructor(
+        public settings: SettingsService,
+        private router: Router,
+        @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {}
+
+    ngOnInit(): void {
+        this.tokenService.change().subscribe((res: any) => {
+            this.settings.setUser(res);
+        });
+        const token = this.tokenService.get() || {
+            token: 'nothing',
+            name: 'Admin',
+            avatar: './assets/img/zorro.svg',
+            email: 'cipchk@qq.com'
+        };
+        this.tokenService.set(token);
+    }
+
+    logout() {
+        this.tokenService.clear();
+        this.router.navigateByUrl('/pro/user/login');
+    }
+}
diff --git a/src/app/layout/header/header.component.html b/src/app/layout/header/header.component.html
new file mode 100644
index 0000000..a738920
--- /dev/null
+++ b/src/app/layout/header/header.component.html
@@ -0,0 +1,74 @@
+<div class="logo">
+    <a [routerLink]="['/']">
+        <img class="expanded" src="./assets/img/logo-full.svg" alt="{{settings.app.name}}" style="max-height:40px;" />
+        <img class="collapsed" src="./assets/img/logo.svg" alt="{{settings.app.name}}" style="max-height:30px;" />
+    </a>
+</div>
+<div class="top-nav-wrap">
+    <ul class="top-nav">
+        <!-- Menu -->
+        <li>
+            <div class="item" (click)="toggleCollapsedSideabar()">
+                <i class="anticon anticon-menu-{{settings.layout.collapsed ? 'unfold' : 'fold'}}"></i>
+            </div>
+        </li>
+        <!-- Github Page -->
+        <li>
+            <a class="item" href="//github.com/cipchk/ng-alain" target="_blank">
+                <i class="anticon anticon-github"></i>
+            </a>
+        </li>
+        <!-- Lock Page -->
+        <li class="hidden-xs">
+            <div class="item" [routerLink]="['/lock']">
+                <i class="anticon anticon-lock"></i>
+            </div>
+        </li>
+        <!-- Search Button -->
+        <li class="header-search__btn" (click)="searchToggleChange()">
+            <div class="item">
+                <i class="anticon anticon-search"></i>
+            </div>
+        </li>
+    </ul>
+    <header-search class="header-search" [toggleChange]="searchToggleStatus"></header-search>
+    <ul class="top-nav">
+        <!-- Notify -->
+        <li>
+            <header-notify></header-notify>
+        </li>
+        <!-- Task -->
+        <li class="hidden-xs">
+            <header-task></header-task>
+        </li>
+        <!-- App Icons -->
+        <li class="hidden-xs">
+            <header-icon></header-icon>
+        </li>
+        <!-- Settings -->
+        <li class="hidden-xs">
+            <nz-dropdown nzTrigger="click" nzPlacement="bottomRight">
+                <div class="item" nz-dropdown>
+                    <i class="anticon anticon-setting"></i>
+                </div>
+                <div nz-menu style="width:200px">
+                    <div nz-menu-item class="theme-switch">
+                        <header-theme></header-theme>
+                    </div>
+                    <div nz-menu-item>
+                        <header-fullscreen></header-fullscreen>
+                    </div>
+                    <div nz-menu-item>
+                        <header-storage></header-storage>
+                    </div>
+                    <div nz-menu-item>
+                        <header-langs></header-langs>
+                    </div>
+                </div>
+            </nz-dropdown>
+        </li>
+        <li class="hidden-xs">
+            <header-user></header-user>
+        </li>
+    </ul>
+</div>
diff --git a/src/app/layout/header/header.component.spec.ts b/src/app/layout/header/header.component.spec.ts
new file mode 100644
index 0000000..5999222
--- /dev/null
+++ b/src/app/layout/header/header.component.spec.ts
@@ -0,0 +1,17 @@
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+
+import { setUpTestBed } from 'testing/common.spec';
+
+import { HeaderComponent } from './header.component';
+
+describe('Layout: Header', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [ HeaderComponent ]
+    });
+
+    it('should create an instance', () => {
+        const fixture = TestBed.createComponent(HeaderComponent);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
+});
diff --git a/src/app/layout/header/header.component.ts b/src/app/layout/header/header.component.ts
new file mode 100644
index 0000000..0a759e8
--- /dev/null
+++ b/src/app/layout/header/header.component.ts
@@ -0,0 +1,21 @@
+import { Component, ViewChild } from '@angular/core';
+import { SettingsService } from '@delon/theme';
+
+@Component({
+    selector: 'app-header',
+    templateUrl: './header.component.html'
+})
+export class HeaderComponent {
+    searchToggleStatus: boolean;
+
+    constructor(public settings: SettingsService) { }
+
+    toggleCollapsedSideabar() {
+        this.settings.setLayout('collapsed', !this.settings.layout.collapsed);
+    }
+
+    searchToggleChange() {
+        this.searchToggleStatus = !this.searchToggleStatus;
+    }
+
+}
diff --git a/src/app/layout/header/index.md b/src/app/layout/header/index.md
new file mode 100644
index 0000000..aead1c5
--- /dev/null
+++ b/src/app/layout/header/index.md
@@ -0,0 +1,20 @@
+---
+component: app-header
+title: ������������
+---
+
+������������������������������ `components` ���������������������������������������
+
+## ������������
+
+��������� | ������
+----|------
+`header-fullscreen` | ������������
+`header-icon` | ������������
+`header-langs` | ������������
+`header-notify` | ������������
+`header-search` | ���������
+`header-storage` | ������ LocalStorage ������
+`header-task` | ������������
+`header-theme` | ������������
+`header-user` | ������������
diff --git a/src/app/layout/layout.component.html b/src/app/layout/layout.component.html
new file mode 100644
index 0000000..796d712
--- /dev/null
+++ b/src/app/layout/layout.component.html
@@ -0,0 +1,6 @@
+<div class="wrapper">
+    <div class="router-progress-bar" *ngIf="isFetching"></div>
+    <app-header class="header"></app-header>
+    <app-sidebar class="aside"></app-sidebar>
+    <section class="content"><router-outlet></router-outlet></section>
+</div>
diff --git a/src/app/layout/layout.component.spec.ts b/src/app/layout/layout.component.spec.ts
new file mode 100644
index 0000000..03facd8
--- /dev/null
+++ b/src/app/layout/layout.component.spec.ts
@@ -0,0 +1,17 @@
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+
+import { setUpTestBed } from 'testing/common.spec';
+
+import { LayoutComponent } from './layout.component';
+
+describe('Layout', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [LayoutComponent]
+    });
+
+    it('should create an instance', () => {
+        const fixture = TestBed.createComponent(LayoutComponent);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
+});
diff --git a/src/app/layout/layout.component.ts b/src/app/layout/layout.component.ts
new file mode 100644
index 0000000..79c0624
--- /dev/null
+++ b/src/app/layout/layout.component.ts
@@ -0,0 +1,38 @@
+import { Component } from '@angular/core';
+import { Router, NavigationEnd, RouteConfigLoadStart, NavigationError } from '@angular/router';
+import { NzMessageService } from 'ng-zorro-antd';
+import { ScrollService, MenuService, SettingsService } from '@delon/theme';
+
+@Component({
+    selector: 'app-layout',
+    templateUrl: './layout.component.html'
+})
+export class LayoutComponent {
+    isFetching = false;
+
+    constructor(
+        router: Router,
+        scroll: ScrollService,
+        private _message: NzMessageService,
+        public menuSrv: MenuService,
+        public settings: SettingsService) {
+        // scroll to top in change page
+        router.events.subscribe(evt => {
+            if (!this.isFetching && evt instanceof RouteConfigLoadStart) {
+                this.isFetching = true;
+            }
+            if (evt instanceof NavigationError) {
+                this.isFetching = false;
+                _message.error(`������������${evt.url}������`, { nzDuration: 1000 * 3 });
+                return;
+            }
+            if (!(evt instanceof NavigationEnd)) {
+                return;
+            }
+            setTimeout(() => {
+                scroll.scrollToTop();
+                this.isFetching = false;
+            }, 100);
+        });
+    }
+}
diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts
new file mode 100644
index 0000000..5c6b9c6
--- /dev/null
+++ b/src/app/layout/layout.module.ts
@@ -0,0 +1,56 @@
+import { NgModule } from '@angular/core';
+
+import { SharedModule } from '@shared/shared.module';
+import { LayoutComponent } from './layout.component';
+import { LayoutFullScreenComponent } from './fullscreen/fullscreen.component';
+import { HeaderComponent } from './header/header.component';
+import { SidebarComponent } from './sidebar/sidebar.component';
+import { HeaderSearchComponent } from './header/components/search.component';
+import { HeaderThemeComponent } from './header/components/theme.component';
+import { HeaderNotifyComponent } from './header/components/notify.component';
+import { HeaderTaskComponent } from './header/components/task.component';
+import { HeaderIconComponent } from './header/components/icon.component';
+import { HeaderFullScreenComponent } from './header/components/fullscreen.component';
+import { HeaderLangsComponent } from './header/components/langs.component';
+import { HeaderStorageComponent } from './header/components/storage.component';
+import { HeaderUserComponent } from './header/components/user.component';
+
+const COMPONENTS = [
+    LayoutComponent,
+    LayoutFullScreenComponent,
+    HeaderComponent,
+    SidebarComponent
+];
+
+const HEADERCOMPONENTS = [
+    HeaderSearchComponent,
+    HeaderNotifyComponent,
+    HeaderTaskComponent,
+    HeaderIconComponent,
+    HeaderFullScreenComponent,
+    HeaderThemeComponent,
+    HeaderLangsComponent,
+    HeaderStorageComponent,
+    HeaderUserComponent
+];
+
+// pro
+import { ProUserLayoutComponent } from './pro/user/user.component';
+const PRO = [
+    ProUserLayoutComponent
+];
+
+@NgModule({
+    imports: [SharedModule],
+    providers: [],
+    declarations: [
+        ...COMPONENTS,
+        ...HEADERCOMPONENTS,
+        ...PRO
+    ],
+    exports: [
+        ...COMPONENTS,
+        ...PRO
+    ]
+})
+export class LayoutModule { }
diff --git a/src/app/layout/pro/user/user.component.html b/src/app/layout/pro/user/user.component.html
new file mode 100644
index 0000000..187cf13
--- /dev/null
+++ b/src/app/layout/pro/user/user.component.html
@@ -0,0 +1,17 @@
+<div class="container">
+    <div class="top">
+        <div class="head">
+            <a [routerLink]="['/']">
+                <img class="logo" src="./assets/img/logo-color.svg">
+                <span class="title">ng-alain</span>
+            </a>
+        </div>
+        <p class="desc">���������������������������������������������������������������������������</p>
+    </div>
+    <router-outlet></router-outlet>
+    <global-footer [links]="links">
+        <ng-template #copyright>
+            Copyright <nz-icon nzType="copyright"></nz-icon> 2017 <a href="//github.com/cipchk" target="_blank">������</a>������
+        </ng-template>
+    </global-footer>
+</div>
diff --git a/src/app/layout/pro/user/user.component.less b/src/app/layout/pro/user/user.component.less
new file mode 100644
index 0000000..b3dc2f6
--- /dev/null
+++ b/src/app/layout/pro/user/user.component.less
@@ -0,0 +1,58 @@
+@import '~@delon/theme/styles/antd/themes/default.less';
+
+:host {
+	::ng-deep {
+
+		.container {
+			background: #f0f2f5;
+			background-image: url("https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg");
+			width: 100%;
+			min-height: 100%;
+			background-repeat: no-repeat;
+			background-position: center;
+			background-size: 100%;
+			padding: 110px 0 144px;
+			position: relative;
+		}
+
+		.top {
+			text-align: center;
+		}
+
+		.head {
+			height: 44px;
+			line-height: 44px;
+			a {
+				text-decoration: none;
+			}
+		}
+
+		.logo {
+			height: 44px;
+			vertical-align: top;
+			margin-right: 16px;
+		}
+
+		.title {
+			font-size: 33px;
+			color: @heading-color;
+			font-family: "Myriad Pro", "Helvetica Neue", Arial, Helvetica, sans-serif;
+			font-weight: 600;
+			position: relative;
+			top: 2px;
+		}
+
+		.desc {
+			font-size: @font-size-base;
+			color: @text-color-secondary;
+			margin-top: 12px;
+			margin-bottom: 40px;
+		}
+
+		.footer {
+			position: absolute;
+			width: 100%;
+			bottom: 0;
+		}
+	}
+}
diff --git a/src/app/layout/pro/user/user.component.ts b/src/app/layout/pro/user/user.component.ts
new file mode 100644
index 0000000..46819db
--- /dev/null
+++ b/src/app/layout/pro/user/user.component.ts
@@ -0,0 +1,23 @@
+import { Component } from '@angular/core';
+
+@Component({
+    selector: 'pro-user-layout',
+    templateUrl: './user.component.html',
+    styleUrls: ['./user.component.less']
+})
+export class ProUserLayoutComponent {
+    links = [
+        {
+            title: '������',
+            href: ''
+        },
+        {
+            title: '������',
+            href: ''
+        },
+        {
+            title: '������',
+            href: ''
+        }
+    ];
+}
diff --git a/src/app/layout/sidebar/sidebar.component.html b/src/app/layout/sidebar/sidebar.component.html
new file mode 100644
index 0000000..f66e350
--- /dev/null
+++ b/src/app/layout/sidebar/sidebar.component.html
@@ -0,0 +1,17 @@
+<div class="aside-inner">
+    <nz-dropdown nzTrigger="click" class="user-block clearfix">
+        <div nz-dropdown class="user-block-dropdown">
+            <nz-avatar class="avatar" [nzIcon]="'user'" [nzSize]="'large'"></nz-avatar>
+            <div class="info">
+                <strong>{{settings.user.name}}</strong>
+                <p class="text-truncate">{{settings.user.email}}</p>
+            </div>
+        </div>
+        <ul nz-menu>
+            <li nz-menu-item (click)="msgSrv.success('profile')">{{ 'profile' | translate }}</li>
+            <li nz-menu-item (click)="msgSrv.success('settings')">{{ 'settings' | translate }}</li>
+            <li nz-menu-item (click)="msgSrv.success('logout')">{{ 'logout' | translate }}</li>
+        </ul>
+    </nz-dropdown>
+    <sidebar-nav class="d-block py-lg"></sidebar-nav>
+</div>
diff --git a/src/app/layout/sidebar/sidebar.component.spec.ts b/src/app/layout/sidebar/sidebar.component.spec.ts
new file mode 100644
index 0000000..0f07032
--- /dev/null
+++ b/src/app/layout/sidebar/sidebar.component.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+import { setUpTestBed } from '../../../testing/common.spec';
+
+import { SidebarComponent } from './sidebar.component';
+
+describe('Layout: Sidebar', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [ SidebarComponent ]
+    });
+
+    it('should create an instance', () => {
+        const fixture = TestBed.createComponent(SidebarComponent);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
+});
diff --git a/src/app/layout/sidebar/sidebar.component.ts b/src/app/layout/sidebar/sidebar.component.ts
new file mode 100644
index 0000000..92182e9
--- /dev/null
+++ b/src/app/layout/sidebar/sidebar.component.ts
@@ -0,0 +1,12 @@
+import { Component } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { SettingsService } from '@delon/theme';
+
+@Component({
+  selector   : 'app-sidebar',
+  templateUrl: './sidebar.component.html'
+})
+export class SidebarComponent {
+    constructor(public settings: SettingsService, public msgSrv: NzMessageService) {
+    }
+}
diff --git a/src/app/routes/routes.module.ts b/src/app/routes/routes.module.ts
new file mode 100644
index 0000000..a621ee2
--- /dev/null
+++ b/src/app/routes/routes.module.ts
@@ -0,0 +1,10 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+@NgModule({
+  imports: [
+    CommonModule
+  ],
+  declarations: []
+})
+export class RoutesModule { }
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
new file mode 100644
index 0000000..a3c06a1
--- /dev/null
+++ b/src/app/shared/shared.module.ts
@@ -0,0 +1,211 @@
+import { NgModule, ModuleWithProviders } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { ReactiveFormsModule, FormsModule } from '@angular/forms';
+import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
+import { RouterModule } from '@angular/router';
+
+import { NgZorroAntdExtraModule } from 'ng-zorro-antd-extra';
+import { AlainThemeModule } from '@delon/theme';
+import { AlainABCModule } from '@delon/abc';
+import { AlainACLModule } from '@delon/acl';
+
+// third libs
+import { CountdownModule } from 'ngx-countdown';
+
+// i18n
+import { TranslateModule } from '@ngx-translate/core';
+import { I18NService } from '@core/i18n/i18n.service';
+
+// region: zorro modules
+
+import {
+    // LoggerModule,
+    // NzLocaleModule,
+    NzButtonModule,
+    NzAlertModule,
+    NzBadgeModule,
+    // NzCalendarModule,
+    NzCascaderModule,
+    NzCheckboxModule,
+    NzDatePickerModule,
+    NzFormModule,
+    NzInputModule,
+    NzInputNumberModule,
+    NzGridModule,
+    NzMessageModule,
+    NzModalModule,
+    NzNotificationModule,
+    NzPaginationModule,
+    NzPopconfirmModule,
+    NzPopoverModule,
+    NzRadioModule,
+    NzRateModule,
+    NzSelectModule,
+    NzSpinModule,
+    NzSliderModule,
+    NzSwitchModule,
+    NzProgressModule,
+    NzTableModule,
+    NzTabsModule,
+    NzTagModule,
+    NzTimePickerModule,
+    NzUtilModule,
+    NzStepsModule,
+    NzDropDownModule,
+    NzMenuModule,
+    NzBreadCrumbModule,
+    NzLayoutModule,
+    NzRootModule,
+    NzCarouselModule,
+    // NzCardModule,
+    NzCollapseModule,
+    NzTimelineModule,
+    NzToolTipModule,
+    // NzBackTopModule,
+    // NzAffixModule,
+    // NzAnchorModule,
+    NzAvatarModule,
+    // SERVICES
+    NzNotificationService,
+    NzMessageService
+} from 'ng-zorro-antd';
+const ZORROMODULES = [
+    // LoggerModule,
+    // NzLocaleModule,
+    NzButtonModule,
+    NzAlertModule,
+    NzBadgeModule,
+    // NzCalendarModule,
+    NzCascaderModule,
+    NzCheckboxModule,
+    NzDatePickerModule,
+    NzFormModule,
+    NzInputModule,
+    NzInputNumberModule,
+    NzGridModule,
+    NzMessageModule,
+    NzModalModule,
+    NzNotificationModule,
+    NzPaginationModule,
+    NzPopconfirmModule,
+    NzPopoverModule,
+    NzRadioModule,
+    NzRateModule,
+    NzSelectModule,
+    NzSpinModule,
+    NzSliderModule,
+    NzSwitchModule,
+    NzProgressModule,
+    NzTableModule,
+    NzTabsModule,
+    NzTagModule,
+    NzTimePickerModule,
+    NzUtilModule,
+    NzStepsModule,
+    NzDropDownModule,
+    NzMenuModule,
+    NzBreadCrumbModule,
+    NzLayoutModule,
+    NzRootModule,
+    NzCarouselModule,
+    // NzCardModule,
+    NzCollapseModule,
+    NzTimelineModule,
+    NzToolTipModule,
+    // NzBackTopModule,
+    // NzAffixModule,
+    // NzAnchorModule,
+    NzAvatarModule
+];
+// endregion
+
+// region: @delon/abc modules
+import {
+    AdAvatarListModule,
+    AdChartsModule,
+    AdCountDownModule,
+    AdDescListModule,
+    AdEllipsisModule,
+    AdErrorCollectModule,
+    AdExceptionModule,
+    AdFooterToolbarModule,
+    AdGlobalFooterModule,
+    AdNoticeIconModule,
+    AdNumberInfoModule,
+    AdProHeaderModule,
+    AdResultModule,
+    AdSidebarNavModule,
+    AdStandardFormRowModule,
+    AdTagSelectModule,
+    AdTrendModule,
+    AdDownFileModule,
+    AdImageModule,
+    AdUtilsModule
+} from '@delon/abc';
+const ABCMODULES = [
+    AdAvatarListModule,
+    AdChartsModule,
+    AdCountDownModule,
+    AdDescListModule,
+    AdEllipsisModule,
+    AdErrorCollectModule,
+    AdExceptionModule,
+    AdFooterToolbarModule,
+    AdGlobalFooterModule,
+    AdNoticeIconModule,
+    AdNumberInfoModule,
+    AdProHeaderModule,
+    AdResultModule,
+    AdSidebarNavModule,
+    AdStandardFormRowModule,
+    AdTagSelectModule,
+    AdTrendModule,
+    AdDownFileModule,
+    AdImageModule,
+    AdUtilsModule
+];
+// endregion
+
+@NgModule({
+    imports: [
+        CommonModule,
+        FormsModule,
+        RouterModule,
+        ReactiveFormsModule,
+        HttpClientModule,
+        ...ZORROMODULES,
+        NgZorroAntdExtraModule.forRoot(),
+        AlainThemeModule.forChild(),
+        ...ABCMODULES,
+        AlainACLModule.forRoot(),
+        // third libs
+        CountdownModule
+    ],
+    exports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        RouterModule,
+        ...ZORROMODULES,
+        NgZorroAntdExtraModule,
+        AlainThemeModule,
+        ...ABCMODULES,
+        AlainACLModule,
+        // i18n
+        TranslateModule,
+        // third libs
+        CountdownModule
+    ]
+})
+export class SharedModule {
+    static forRoot(): ModuleWithProviders {
+        return {
+            ngModule: SharedModule,
+            providers: [
+                // ng-zorro-antd Services
+                NzNotificationService,
+                NzMessageService
+            ]
+        };
+    }
+}
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
new file mode 100644
index 0000000..262c53d
--- /dev/null
+++ b/src/assets/i18n/en.json
@@ -0,0 +1,94 @@
+{
+    "home": "Home",
+    "settings": "Settings",
+    "profile": "Profile",
+    "login": "Login",
+    "logout": "Logout",
+    "more": "More",
+    "full": "Full",
+    "top-search-ph": "Search for people, file, photos...",
+    "theme": "Theme",
+    "theme-switch": "Theme Switch",
+    "light": "Light",
+    "dark": "Dark",
+    "fullscreen": "Fullscreen",
+    "fullscreen-exit": "Exit Fullscreen",
+    "clear-local-storage": "Clear Local Storage",
+    "language": "Language",
+    "shortcut": "Shortcut",
+    "dashboard": "Dashboard",
+    "dashboard_v1": "Dashboard",
+    "dashboard_analysis": "Analysis",
+    "dashboard_monitor": "Monitor",
+    "dashboard_workplace": "Workplace",
+    "widgets": "Widgets",
+    "main_navigation": "Main Navigation",
+    "component": "Component",
+    "elements": "Elements",
+    "buttons": "Buttons",
+    "notification": "Notification",
+    "modal": "Modal",
+    "sweetalert": "SweetAlert",
+    "spin": "Loading Spin",
+    "dropdown": "Dropdown",
+    "tree-antd": "Tree",
+    "sortable": "Sortable",
+    "grid": "Grid",
+    "gridmasonry": "Grid Masonry",
+    "typography": "Typography",
+    "iconsfont": "Iconsfont",
+    "colors": "Colors",
+    "forms": "Forms",
+    "extended": "Extended",
+    "standard": "Standard",
+    "validation": "Validation",
+    "upload": "Upload",
+    "cropper": "Image Crop",
+    "charts": "Charts",
+    "tables": "Tables",
+    "maps": "Maps",
+    "qq": "QQ",
+    "baidu": "Baidu",
+    "logics": "Logics",
+    "guard": "Route Guard",
+    "acl": "ACL",
+    "downfile": "Down File",
+    "report": "Report",
+    "relation": "Relation",
+    "pages": "Pages",
+    "m-login": "Login",
+    "m-register": "Register",
+    "m-forget": "Forget",
+    "m-lock": "Lock",
+    "m-maintenance": "Maintenance",
+    "extras": "Extras",
+    "blog": "Blog",
+    "list": "List",
+    "comment": "Comment",
+    "post": "Post",
+    "website": "Web Site (external)",
+    "helpcenter": "Help Center",
+    "poi": "Poi",
+    "pro": "Ant Design Pro",
+    "form": "Form Page",
+    "step-form": "Step Form",
+    "advanced-form": "Advanced Form",
+    "pro-list": "List Page",
+    "pro-table-list": "Table List",
+    "pro-basic-list": "Basic List",
+    "pro-card-list": "Card List",
+    "pro-cover-card-list": "Cover Card List",
+    "pro-filter-card-list": "Filter Card List",
+    "pro-search": "Search���Article���",
+    "pro-profile": "Profile Page",
+    "pro-profile-basic": "Basic",
+    "pro-profile-advanced": "Advanced",
+    "pro-result": "Result Page",
+    "pro-result-success": "Success",
+    "pro-result-fail": "Fail",
+    "pro-exception": "Exception",
+    "pro-user": "Account",
+    "pro-login": "Login",
+    "pro-register": "Register",
+    "pro-register-result": "Register Result"
+}
diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json
new file mode 100644
index 0000000..2488a5e
--- /dev/null
+++ b/src/assets/i18n/zh-CN.json
@@ -0,0 +1,94 @@
+{
+    "home": "������",
+    "settings": "������",
+    "profile": "������������",
+    "login": "������",
+    "logout": "������",
+    "more": "������",
+    "full": "������",
+    "top-search-ph": "������������������������������������",
+    "theme": "������",
+    "theme-switch": "������������",
+    "light": "���",
+    "dark": "���",
+    "fullscreen": "������",
+    "fullscreen-exit": "������������",
+    "clear-local-storage": "������������������",
+    "language": "������",
+    "shortcut": "������������",
+    "dashboard": "���������",
+    "dashboard_v1": "���������",
+    "dashboard_analysis": "���������",
+    "dashboard_monitor": "���������",
+    "dashboard_workplace": "���������",
+    "widgets": "���������",
+    "main_navigation": "���������",
+    "component": "������",
+    "elements": "������������",
+    "buttons": "������",
+    "notification": "������",
+    "modal": "���������",
+    "sweetalert": "SweetAlert",
+    "spin": "���������",
+    "dropdown": "������������",
+    "tree-antd": "������������",
+    "sortable": "������",
+    "grid": "������������",
+    "gridmasonry": "���������",
+    "typography": "������������",
+    "iconsfont": "icon������",
+    "colors": "������",
+    "forms": "������",
+    "standard": "������",
+    "extended": "������",
+    "validation": "������",
+    "upload": "������",
+    "cropper": "������������",
+    "charts": "������",
+    "tables": "������",
+    "maps": "������",
+    "qq": "QQ",
+    "baidu": "������",
+    "logics": "������������",
+    "guard": "������������",
+    "acl": "������������������������",
+    "downfile": "������������",
+    "report": "������",
+    "relation": "���������������",
+    "pages": "������",
+    "m-login": "���������",
+    "m-register": "���������",
+    "m-forget": "���������������",
+    "m-lock": "���������",
+    "m-maintenance": "���������",
+    "extras": "������",
+    "blog": "������",
+    "list": "������",
+    "comment": "������",
+    "post": "������",
+    "website": "������������������",
+    "helpcenter": "������������",
+    "poi": "������",
+    "pro": "Ant Design Pro",
+    "form": "���������",
+    "step-form": "������������",
+    "advanced-form": "������������",
+    "pro-list": "���������",
+    "pro-table-list": "������������",
+    "pro-basic-list": "������������",
+    "pro-card-list": "������������",
+    "pro-cover-card-list": "������������������������",
+    "pro-filter-card-list": "������������������������",
+    "pro-search": "������������������������",
+    "pro-profile": "���������",
+    "pro-profile-basic": "���������������",
+    "pro-profile-advanced": "���������������",
+    "pro-result": "������",
+    "pro-result-success": "������",
+    "pro-result-fail": "������",
+    "pro-exception": "������",
+    "pro-user": "������",
+    "pro-login": "������",
+    "pro-register": "������",
+    "pro-register-result": "������������"
+}
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index 3612073..ab89b16 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -1,3 +1,4 @@
 export const environment = {
+  SERVER_URL: `./`,
   production: true
 };
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index b7f639a..a94cd62 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -4,5 +4,6 @@
 // The list of which env maps to which file can be found in `.angular-cli.json`.
 
 export const environment = {
+  SERVER_URL: `./`,
   production: false
 };
diff --git a/src/testing/common.spec.ts b/src/testing/common.spec.ts
new file mode 100644
index 0000000..7aed99b
--- /dev/null
+++ b/src/testing/common.spec.ts
@@ -0,0 +1,66 @@
+// from: https://github.com/angular/angular/issues/12409
+
+import { TestBed, async, TestModuleMetadata } from '@angular/core/testing';
+import { Type, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
+
+import { CoreModule } from '@core/core.module';
+import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
+import { HttpLoaderFactory } from 'app/app.module';
+import { HttpClient } from '@angular/common/http';
+import { ALAIN_I18N_TOKEN, ColorsService, SettingsService, MenuService, ScrollService, _HttpClient, ALAIN_THEME_OPTIONS } from '@delon/theme';
+import { I18NService } from '@core/i18n/i18n.service';
+import { RouterTestingModule } from '@angular/router/testing';
+import { SharedModule } from '@shared/shared.module';
+
+const resetTestingModule = TestBed.resetTestingModule,
+      preventAngularFromResetting = () => TestBed.resetTestingModule = () => TestBed;
+const allowAngularToReset = () => TestBed.resetTestingModule = resetTestingModule;
+
+export const setUpTestBed = (moduleDef: TestModuleMetadata) => {
+    beforeAll(done => (async () => {
+        resetTestingModule();
+        preventAngularFromResetting();
+
+        // region: schemas
+        if (!moduleDef.schemas) moduleDef.schemas = [];
+        moduleDef.schemas.push(CUSTOM_ELEMENTS_SCHEMA);
+        // endregion
+
+        // region: imports
+        if (!moduleDef.imports) moduleDef.imports = [];
+        moduleDef.imports.push(RouterTestingModule);
+        moduleDef.imports.push(SharedModule.forRoot());
+        moduleDef.imports.push(TranslateModule.forRoot({
+            loader: {
+                provide: TranslateLoader,
+                useFactory: (HttpLoaderFactory),
+                deps: [HttpClient]
+            }
+        }));
+        // endregion
+
+        // region: providers
+        if (!moduleDef.providers) moduleDef.providers = [];
+        moduleDef.providers.push({ provide: ALAIN_THEME_OPTIONS, useValue: {} });
+        moduleDef.providers.push({ provide: ALAIN_I18N_TOKEN, useClass: I18NService, multi: false });
+        // load full services
+        [ SettingsService, MenuService, ScrollService, ColorsService, _HttpClient ].forEach((item: any) => {
+            if (moduleDef.providers.includes(item)) return;
+            moduleDef.providers.push(item);
+        });
+        // endregion
+
+        TestBed.configureTestingModule(moduleDef);
+        await TestBed.compileComponents();
+
+        // prevent Angular from resetting testing module
+        TestBed.resetTestingModule = () => TestBed;
+    })().then(done).catch(done.fail));
+
+    afterAll(() => allowAngularToReset());
+};
+
+/**
+ * get service instance
+ */
+export const getService = <T>(type: Type<T>): T => <T>TestBed.get(type);
diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json
index 39ba8db..29f6da9 100644
--- a/src/tsconfig.app.json
+++ b/src/tsconfig.app.json
@@ -4,7 +4,13 @@
     "outDir": "../out-tsc/app",
     "baseUrl": "./",
     "module": "es2015",
-    "types": []
+    "types": [],
+    "paths": {
+      "@shared": [ "app/shared" ],
+      "@shared/*": [ "app/shared/*" ],
+      "@core": [ "app/core/" ],
+      "@core/*": [ "app/core/*" ]
+    }
   },
   "exclude": [
     "test.ts",
diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json
index 63d89ff..f460cf7 100644
--- a/src/tsconfig.spec.json
+++ b/src/tsconfig.spec.json
@@ -8,7 +8,13 @@
     "types": [
       "jasmine",
       "node"
-    ]
+    ],
+    "paths": {
+      "@shared": [ "app/shared" ],
+      "@shared/*": [ "app/shared/*" ],
+      "@core": [ "app/core/" ],
+      "@core/*": [ "app/core/*" ]
+    }
   },
   "files": [
     "test.ts"
diff --git a/tsconfig.json b/tsconfig.json
index a6c016b..0656b07 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,6 +14,13 @@
     "lib": [
       "es2017",
       "dom"
-    ]
+    ],
+    "baseUrl": "src/",
+    "paths": {
+      "@shared": [ "app/shared" ],
+      "@shared/*": [ "app/shared/*" ],
+      "@core": [ "app/core/" ],
+      "@core/*": [ "app/core/*" ]
+    }
   }
 }

--
Gitblit v1.8.0